[
  {
    "path": ".gitignore",
    "content": "#忽略的文件及文件夹\ntarget\nlogs\ntemp\n.idea\n*.iml\n\njdbc.properties\nrabbitmq.properties\nsystem.properties\nredis.properties\n\n#rebel.xml\n#不忽略的文件\n!.gitignore\n"
  },
  {
    "path": "README.md",
    "content": "# 环境部署文档（最好下载下来看，格式有点乱[没换行]）\n---\n\n## 安装JDK环境 \n\n###1.先卸载open-jdk \n\njava –version \nrpm -qa | grep java \n\nrpm -qa | grep jdk //查看安装了哪些 要逐一卸载 \n\ntzdata-java-2013g-1.el6.noarch \njava-1.6.0-openjdk-1.6.0.0-11.1.13.4.el6.x86_64 \njava-1.7.0-openjdk-1.7.0.65-2.5.1.2.el6_5.x86_64 \n\n如： \nrpm -e --nodeps tzdata-java-2014g-1.el6.noarch \nrpm -e --nodeps java-1.7.0-openjdk-1.7.0.65-2.5.1.2.el6_5.x86_64 \nrpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-11.1.13.4.el6.x86_64 \n\n###2.开始安装： \nmkdir /usr/local/java // 创建JDK目录  \n\n// FTP或SFTP上传jdk tar包 \ntar -xvf jdk-7u71-linux-i586.tar.gz \nyum install glibc.i686 \n  \n###3.配置环境变量 \n\n①vi /etc/profile \n \n②在末尾行添加 \n#set java environment \nJAVA_HOME=/usr/local/java/jdk1.7.0_45\nCLASSPATH=.:$JAVA_HOME/lib.tools.jar \nPATH=$JAVA_HOME/bin:$PATH\nexport JAVA_HOME CLASSPATH PATH\n或： \nexport JAVA_HOME=/usr/local/java/jdk1.7.0_45\nexport JRE_HOME=$JAVA_HOME/jre \nexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH \nexport PATH=$JAVA_HOME/bin:$PATH \n\n保存退出 \n③source /etc/profile  使更改的配置立即生效 \n④java -version  查看JDK版本信息，如果显示出1.7.0证明成功 \n\n---\n\n## 安装MYSQL \n\n###1.卸载掉原有mysql \n\nrpm -qa | grep mysql　　// 这个命令就会查看该操作系统上是否已经安装了mysql数据库 \n\n// 有的话，我们就通过 rpm -e 命令 或者 rpm -e --nodeps 命令来卸载掉 \nrpm -e mysql　　// 普通删除模式 \nrpm -e --nodeps mysql　　// 强力删除模式，如果使用上面命令删除时，提示有依赖的其它文件，则用该命令可以对其进行强力删除 \n// 在删除完以后我们可以通过 rpm -qa | grep mysql 命令来查看mysql是否已经卸载成功！！ \n\n###2.通过yum来进行mysql的安装 \nyum list | grep mysql \n\n// 安装mysql mysql-server mysql-devel \nyum install -y mysql-server mysql mysql-deve \n\n// 查看刚安装好的mysql-server的版本 \nrpm -qi mysql-server \n\n###3.mysql数据库的初始化及相关配置 \n\n// 启动Mysql服务 \nservice mysqld start \n\n// 查看是否开机启动 \nchkconfig --list | grep mysqld \n// 如果没启动 \nchkconfig mysqld on \n\n// 为root账号设置密码 \nmysqladmin -u root password 'new-password' \n\n// 登录MYSQL \nmysql -u root -p password \n\n允许root用户在任何地方进行远程登录，并具有所有库任何操作权限，具体操作如下：\n在本机先使用root用户登录mysql：\nmysql -u root -p\"youpassword\" \n进行授权操作：\nmysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'youpassword' WITH GRANT OPTION;\n重载授权表：\nFLUSH PRIVILEGES;\n退出mysql数据库：\nexit\n \n乱码解决 \nCentOS 6以上的版本：\nvi /etc/my.cnf \n[mysqld] 下增加 \ncharacter-set-server=utf8 \n重启\nservice mysqld restart \n\n--- \n\n##安装Redis \n\n###2.安装环境 \nyum -y install cpp binutils glibc glibc-kernheaders glibc-common glibc-devel gcc make gcc-c++ libstdc++-devel tcl \n\n###2.创建目录 \nmkdir -p /usr/local/redis \ncd /usr/local/redis \n\n###3.FTP或SFTP上传tar包&&安装 \ntar -xvf redis-2.8.17.tar.gz \ncd redis-2.8.17 \nmake \nmake test #这个就不要执行了，需要很长时间 \nmake install \n\n###4.修改配置文件 \nvi /etc/redis.conf \n// 修改如下，默认为no(后台启动) \ndaemonize yes \n\n// 添加密码 \nrequirepass passwd \n\n// 注释掉 可以远程访问\nbind127.0.0.1\n  \n// 修改端口 \nport 6677 \n\n###5.启动 \nredis-server ../redis.conf \n// 测试 \nredis-cli \nredis-cli -p 6767 -a password // 如果修改了端口或者密码 \n\n如： \nredis-server ../redis.conf  \nredis-cli -h 127.0.0.1 -p 6767 -a password \n127.0.0.1:6767> keys * \n(empty list or set) \n\n// 查看状态 \nps -ef|grep redis \nroot       854     1  0 18:56 ?        00:00:00 /usr/local/redis/redis-3.0.7/src/redis-server *:6767   \n\n// 结束 \n./redis-cli -p 6767 -a password shutdown \n\n---\n \n##安装 Zookeeper \n解压：tar -zxvf zookeeper-3.4.6.tar.gz \n配置：进入conf目录重命名 mv zoo_sample.cfg zoo.cfg \n      修改zoo.cfg文件 dataDir=/usr/local/zookeeper/zookeeper-3.4.6/data \n启动：进入bin目录 \n      ./zkServer.sh start \n      JMX enabled by default \n      Using config: /usr/local/zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfg \n      Starting zookeeper ... STARTED \n查看是否启动：进入bin目录 ./zkServer.sh status \n      [./zkServer.sh status \n      JMX enabled by default \n      Using config: /usr/local/zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfg \n      Mode: standalone \n \n停止：进入bin目录 ./zkServer.sh stop \n \n查看节点： \n./zkCli.sh \nls / \n[zookeeper] \n \n1. 启动ZK服务:       sh bin/zkServer.sh start \n2. 查看ZK服务状态:   sh bin/zkServer.sh status \n3. 停止ZK服务:       sh bin/zkServer.sh stop \n4. 重启ZK服务:       sh bin/zkServer.sh restart\n\n\n使用delete命令可以删除指定znode. 当该znode拥有子znode时, 必须先删除其所有子znode, 否则操作将失败. \nrmr命令可用于代替delete命令, rmr是一个递归删除命令, 如果发生指定节点拥有子节点时, rmr命令会首先删除子节点. \n\n\n##安装RabbitMQ \n\n###1.安装Erlang \n\ncd /usr/local/ \nmkdir rabbitmq \ncd rabbitmq \n\n或者：\n上传esl-erlang_17.3-1~centos~6_amd64.rpm \n执行yum install esl-erlang_17.3-1~centos~6_amd64.rpm \n \n上传：esl-erlang-compat-R14B-1.el6.noarch.rpm \nyum install esl-erlang-compat-R14B-1.el6.noarch.rpm \n\n###2.安装RabbitMQ \n\n上传rabbitmq-server-3.4.1-1.noarch.rpm \n安装：\nrpm -ivh rabbitmq-server-3.4.1-1.noarch.rpm \n\n###3.启动、停止 \n\nservice rabbitmq-server start \nservice rabbitmq-server stop \nservice rabbitmq-server restart \n\n###4.设置开机启动 \n\nchkconfig rabbitmq-server on \n\n###5.设置配置文件 \n\ncd /etc/rabbitmq \ncp /usr/share/doc/rabbitmq-server-3.4.1/rabbitmq.config.example /etc/rabbitmq/  \n\nmv rabbitmq.config.example rabbitmq.config \n\n###6.开启用户远程访问 \nvi /etc/rabbitmq/rabbitmq.config \n%%{loopback_users, []},修改为 {loopback_users, []} \n\n###7.开启web界面管理工具 \n\nrabbitmq-plugins enable rabbitmq_management \nservice rabbitmq-server restart \n\n###8.防火墙开放15672端口 \n\n/sbin/iptables -I INPUT -p tcp --dport 15672 -j ACCEPT \n/sbin/iptables -I INPUT -p tcp --dport 5672 -j ACCEPT \n/etc/rc.d/init.d/iptables save\n\n---\n\n##安装Tomcat \n\n###1.创建目录 \n\ncd /usr/local/ \nmkdir web \ncd web \n\n### 2.安装 \ntar -zxvf apache-tomcat-7.0.61.tar.gz // 解压压缩包 \n\n### 3.设置环境变量 \nvim /etc/profile  文件后面加入（千万不要有空格） \n\nexport CATALINA_BASE=/usr/local/cheng/web/apache-tomcat-7.0.61\nexport TOMCAT_HOME=/usr/local/cheng/web/apache-tomcat-7.0.61\n\n\n保存，退出，然后运行： \nsource /etc/profile // 使profile生效 \n\n### 4.启动 \n// 进入bin目录启动tomcat \n./startup.sh \n\n\n\nchmod u+rwx xxxx\n"
  },
  {
    "path": "Redme.md",
    "content": "### Redis命令\n打开客户端\n[root@cloud src]# redis-cli -p 6767 -a root#wx\n\n### zookeeper命令\n\n启动：$ ./zkCli.sh <br/>\n查看节点：ls /\n\n启动ZK服务: sh bin/zkServer.sh start<br/>\n查看ZK服务状态: sh bin/zkServer.sh status<br/>\n停止ZK服务: sh bin/zkServer.sh stop<br/>\n重启ZK服务: sh bin/zkServer.sh restart<br/>\n删除节点：<br/>\n使用delete命令可以删除指定znode. 当该znode拥有子znode时, 必须先删除其所有子znode, 否则操作将失败. rmr命令可用于代替delete命令, rmr是一个递归删除命令, 如果发生指定节点拥有子节点时, rmr命令会首先删除子节点.\n\n"
  },
  {
    "path": "pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.cheng</groupId>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <packaging>pom</packaging>\n    <version>1.0-SNAPSHOT</version>\n    <modules>\n      <module>weixin-common</module>\n      <module>weixin-common-config</module>\n      <module>weixin-common-service</module>\n      <module>weixin-common-entity</module>\n      <module>weixin-rabbitmq-model</module>\n      <module>weixin-rpc-admin</module>\n      <module>weixin-rpc-log</module>\n      <module>weixin-rpc-wxtools</module>\n      <module>weixin-rpc-promotion</module>\n      <module>weixin-rpc-redis</module>\n      <module>weixin-rpc-httpclient</module>\n      <module>weixin-rpc-rabbitmq</module>\n      <module>weixin-rpc-user</module>\n      <module>weixin-rpc-item</module>\n      <module>weixin-rpc-order</module>\n      <module>weixin-rpc-cart</module>\n      <module>weixin-rpc-comment</module>\n      <module>weixin-rpc-system</module>\n      <module>weixin-rpc-message</module>\n      <module>weixin-service-admin</module>\n      <module>weixin-service-cart</module>\n      <module>weixin-service-item</module>\n      <module>weixin-service-order</module>\n      <module>weixin-service-user</module>\n      <module>weixin-service-log</module>\n      <module>weixin-service-wxtools</module>\n      <module>weixin-service-redis</module>\n      <module>weixin-service-httpclient</module>\n      <module>weixin-service-timer</module>\n      <module>weixin-service-rabbitmq</module>\n      <module>weixin-service-comment</module>\n      <module>weixin-service-promotion</module>\n      <module>weixin-service-system</module>\n      <module>weixin-service-message</module>\n      <module>weixin-notify-pay</module>\n      <module>weixin-web-manage</module>\n      <module>weixin-web-mobile</module>\n\n    </modules>\n\n    <properties>\n      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n      <junit.version>4.10</junit.version>\n      <http.version>4.3.3</http.version>\n      <mysql.version>5.1.34</mysql.version>\n      <druid.version>1.0.13</druid.version>\n      <shrio.version>1.2.3</shrio.version>\n      <shiro-spring.version>1.2.3</shiro-spring.version>\n      <aspectj.version>1.8.6</aspectj.version>\n      <ehcache.version>2.9.0</ehcache.version>\n      <amqp-client.version>3.4.1</amqp-client.version>\n\n      <spring-data-redis.version>1.6.1.RELEASE</spring-data-redis.version>\n      <jedis.version>2.7.3</jedis.version>\n      <dubbo.version>2.5.3</dubbo.version>\n      <zkclient.version>0.4</zkclient.version>\n\n      <servlet.version>3.1.0</servlet.version>\n      <jstl.version>1.2</jstl.version>\n      <jsp.version>2.2</jsp.version>\n      <el.version>3.0.0</el.version>\n      <sitemesh.version>2.4.2</sitemesh.version>\n      <logging.version>1.1.3</logging.version>\n      <log4j.version>1.2.17</log4j.version>\n      <slf4j.version>1.7.7</slf4j.version>\n      <dom4j.version>1.6.1</dom4j.version>\n      <xstream.version>1.4.7</xstream.version>\n      <fastjson.version>1.1.41</fastjson.version>\n      <jackson.version>2.3.2</jackson.version>\n      <commons-lang3.version>3.3.2</commons-lang3.version>\n      <commons-codec.version>1.9</commons-codec.version>\n      <commons-io.version>2.4</commons-io.version>\n      <commons-beanutils.version>1.8.3</commons-beanutils.version>\n      <guava.version>18.0</guava.version>\n      <pagehelper.version>4.0.1</pagehelper.version>\n      <joda-time.version>2.7</joda-time.version>\n      <quartz.version>2.2.1</quartz.version>\n      <spring.version>4.2.3.RELEASE</spring.version>\n      <spring-rabbit.version>1.4.0.RELEASE</spring-rabbit.version>\n      <mybatis.version>3.2.7</mybatis.version>\n      <mybatis.spring.version>1.2.1</mybatis.spring.version>\n      <source.version>2.4</source.version>\n      <compiler.version>3.1</compiler.version>\n      <dependency.version>2.1</dependency.version>\n      <jar.version>2.4</jar.version>\n      <jetty.version>8.1.9.v20130131</jetty.version>\n      <rebel-maven-plugin.version>1.1.5</rebel-maven-plugin.version>\n    </properties>\n\n    <dependencyManagement>\n      <dependencies>\n        <!-- commons -->\n        <dependency>\n          <groupId>${project.groupId}</groupId>\n          <artifactId>weixin-common</artifactId>\n          <version>${project.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>${project.groupId}</groupId>\n          <artifactId>weixin-common-config</artifactId>\n          <version>${project.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>${project.groupId}</groupId>\n          <artifactId>weixin-common-service</artifactId>\n          <version>${project.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>${project.groupId}</groupId>\n          <artifactId>weixin-common-entity</artifactId>\n          <version>${project.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>${project.groupId}</groupId>\n          <artifactId>weixin-rabbitmq-model</artifactId>\n          <version>${project.version}</version>\n        </dependency>\n\n        <!-- RPC -->\n        <dependency>\n          <groupId>${project.groupId}</groupId>\n          <artifactId>weixin-rpc-admin</artifactId>\n          <version>${project.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>${project.groupId}</groupId>\n          <artifactId>weixin-rpc-log</artifactId>\n          <version>${project.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>${project.groupId}</groupId>\n          <artifactId>weixin-rpc-wxtools</artifactId>\n          <version>${project.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>${project.groupId}</groupId>\n          <artifactId>weixin-rpc-redis</artifactId>\n          <version>${project.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>${project.groupId}</groupId>\n          <artifactId>weixin-rpc-httpclient</artifactId>\n          <version>${project.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>${project.groupId}</groupId>\n          <artifactId>weixin-rpc-rabbitmq</artifactId>\n          <version>${project.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>${project.groupId}</groupId>\n          <artifactId>weixin-rpc-cart</artifactId>\n          <version>${project.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>${project.groupId}</groupId>\n          <artifactId>weixin-rpc-item</artifactId>\n          <version>${project.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>${project.groupId}</groupId>\n          <artifactId>weixin-rpc-system</artifactId>\n          <version>${project.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>${project.groupId}</groupId>\n          <artifactId>weixin-rpc-user</artifactId>\n          <version>${project.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>${project.groupId}</groupId>\n          <artifactId>weixin-rpc-message</artifactId>\n          <version>${project.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>${project.groupId}</groupId>\n          <artifactId>weixin-rpc-order</artifactId>\n          <version>${project.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>${project.groupId}</groupId>\n          <artifactId>weixin-rpc-comment</artifactId>\n          <version>${project.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>${project.groupId}</groupId>\n          <artifactId>weixin-rpc-promotion</artifactId>\n          <version>${project.version}</version>\n        </dependency>\n        <!-- Junit -->\n        <dependency>\n          <groupId>junit</groupId>\n          <artifactId>junit</artifactId>\n          <version>${junit.version}</version>\n          <scope>test</scope>\n        </dependency>\n        <!-- Servlet -->\n        <dependency>\n          <groupId>javax.servlet.jsp</groupId>\n          <artifactId>jsp-api</artifactId>\n          <version>${jsp.version}</version>\n          <scope>provided</scope>\n        </dependency>\n        <dependency>\n          <groupId>javax.servlet</groupId>\n          <artifactId>javax.servlet-api</artifactId>\n          <version>${servlet.version}</version>\n          <scope>provided</scope>\n        </dependency>\n        <dependency>\n          <groupId>javax.el</groupId>\n          <artifactId>javax.el-api</artifactId>\n          <version>${el.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>jstl</groupId>\n          <artifactId>jstl</artifactId>\n          <version>${jstl.version}</version>\n        </dependency>\n        <!-- Sitemesh -->\n        <dependency>\n          <groupId>opensymphony</groupId>\n          <artifactId>sitemesh</artifactId>\n          <version>${sitemesh.version}</version>\n        </dependency>\n        <!-- log4J -->\n        <dependency>\n          <groupId>log4j</groupId>\n          <artifactId>log4j</artifactId>\n          <version>${log4j.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>org.slf4j</groupId>\n          <artifactId>slf4j-api</artifactId>\n          <version>${slf4j.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>org.slf4j</groupId>\n          <artifactId>slf4j-log4j12</artifactId>\n          <version>${slf4j.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>commons-logging</groupId>\n          <artifactId>commons-logging</artifactId>\n          <version>${logging.version}</version>\n        </dependency>\n        <!-- Json && Xml-->\n        <dependency>\n          <groupId>dom4j</groupId>\n          <artifactId>dom4j</artifactId>\n          <version>${dom4j.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>com.thoughtworks.xstream</groupId>\n          <artifactId>xstream</artifactId>\n          <version>${xstream.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>com.alibaba</groupId>\n          <artifactId>fastjson</artifactId>\n          <version>${fastjson.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>com.fasterxml.jackson.core</groupId>\n          <artifactId>jackson-core</artifactId>\n          <version>${jackson.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>com.fasterxml.jackson.core</groupId>\n          <artifactId>jackson-databind</artifactId>\n          <version>${jackson.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>com.fasterxml.jackson.core</groupId>\n          <artifactId>jackson-annotations</artifactId>\n          <version>${jackson.version}</version>\n        </dependency>\n\n        <!-- Tools -->\n        <dependency>\n          <groupId>org.apache.commons</groupId>\n          <artifactId>commons-lang3</artifactId>\n          <version>${commons-lang3.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>commons-codec</groupId>\n          <artifactId>commons-codec</artifactId>\n          <version>${commons-codec.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>commons-io</groupId>\n          <artifactId>commons-io</artifactId>\n          <version>${commons-io.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>commons-beanutils</groupId>\n          <artifactId>commons-beanutils</artifactId>\n          <version>${commons-beanutils.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>joda-time</groupId>\n          <artifactId>joda-time</artifactId>\n          <version>${joda-time.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>com.google.guava</groupId>\n          <artifactId>guava</artifactId>\n          <version>${guava.version}</version>\n        </dependency>\n        <!-- Pagehelper -->\n        <dependency>\n          <groupId>com.github.pagehelper</groupId>\n          <artifactId>pagehelper</artifactId>\n          <version>${pagehelper.version}</version>\n        </dependency>\n        <!-- HttpClien -->\n        <dependency>\n          <groupId>org.apache.httpcomponents</groupId>\n          <artifactId>httpclient</artifactId>\n          <version>${http.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>org.apache.httpcomponents</groupId>\n          <artifactId>httpmime</artifactId>\n          <version>${http.version}</version>\n        </dependency>\n        <!-- scheduler -->\n        <dependency>\n          <groupId>org.quartz-scheduler</groupId>\n          <artifactId>quartz</artifactId>\n          <version>${quartz.version}</version>\n        </dependency>\n        <!-- MYSQL -->\n        <dependency>\n          <groupId>mysql</groupId>\n          <artifactId>mysql-connector-java</artifactId>\n          <version>${mysql.version}</version>\n        </dependency>\n        <!-- Druid -->\n        <dependency>\n          <groupId>com.alibaba</groupId>\n          <artifactId>druid</artifactId>\n          <version>${druid.version}</version>\n        </dependency>\n        <!-- shiro -->\n        <dependency>\n          <groupId>org.apache.shiro</groupId>\n          <artifactId>shiro-core</artifactId>\n          <version>${shrio.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>org.apache.shiro</groupId>\n          <artifactId>shiro-web</artifactId>\n          <version>${shrio.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>org.apache.shiro</groupId>\n          <artifactId>shiro-spring</artifactId>\n          <version>${shiro-spring.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>org.apache.shiro</groupId>\n          <artifactId>shiro-ehcache</artifactId>\n          <version>${shrio.version}</version>\n        </dependency>\n        <!-- ehcache -->\n        <dependency>\n          <groupId>net.sf.ehcache</groupId>\n          <artifactId>ehcache</artifactId>\n          <version>${ehcache.version}</version>\n        </dependency>\n        <!-- AspectJ -->\n        <dependency>\n          <groupId>org.aspectj</groupId>\n          <artifactId>aspectjrt</artifactId>\n          <version>${aspectj.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>org.aspectj</groupId>\n          <artifactId>aspectjweaver</artifactId>\n          <version>${aspectj.version}</version>\n        </dependency>\n        <!-- Dubbo Start -->\n        <dependency>\n          <groupId>com.alibaba</groupId>\n          <artifactId>dubbo</artifactId>\n          <version>${dubbo.version}</version>\n          <exclusions>\n            <exclusion>\n              <groupId>org.springframework</groupId>\n              <artifactId>spring</artifactId>\n            </exclusion>\n          </exclusions>\n        </dependency>\n        <dependency>\n          <groupId>com.101tec</groupId>\n          <artifactId>zkclient</artifactId>\n          <version>${zkclient.version}</version>\n        </dependency>\n        <!-- AMQP -->\n        <dependency>\n          <groupId>org.springframework.amqp</groupId>\n          <artifactId>spring-rabbit</artifactId>\n          <version>${spring-rabbit.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>com.rabbitmq</groupId>\n          <artifactId>amqp-client</artifactId>\n          <version>${amqp-client.version}</version>\n        </dependency>\n        <!-- Jedis -->\n        <dependency>\n          <groupId>org.springframework.data</groupId>\n          <artifactId>spring-data-redis</artifactId>\n          <version>${spring-data-redis.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>redis.clients</groupId>\n          <artifactId>jedis</artifactId>\n          <version>${jedis.version}</version>\n        </dependency>\n        <!-- Spring begin -->\n        <dependency>\n          <groupId>org.springframework</groupId>\n          <artifactId>spring-context</artifactId>\n          <version>${spring.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>org.springframework</groupId>\n          <artifactId>spring-context-support</artifactId>\n          <version>${spring.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>org.springframework</groupId>\n          <artifactId>spring-core</artifactId>\n          <version>${spring.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>org.springframework</groupId>\n          <artifactId>spring-beans</artifactId>\n          <version>${spring.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>org.springframework</groupId>\n          <artifactId>spring-aop</artifactId>\n          <version>${spring.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>org.springframework</groupId>\n          <artifactId>spring-orm</artifactId>\n          <version>${spring.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>org.springframework</groupId>\n          <artifactId>spring-webmvc</artifactId>\n          <version>${spring.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>org.springframework</groupId>\n          <artifactId>spring-web</artifactId>\n          <version>${spring.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>org.springframework</groupId>\n          <artifactId>spring-jdbc</artifactId>\n          <version>${spring.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>org.springframework</groupId>\n          <artifactId>spring-oxm</artifactId>\n          <version>${spring.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>org.springframework</groupId>\n          <artifactId>spring-test</artifactId>\n          <version>${spring.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>org.springframework</groupId>\n          <artifactId>spring-tx</artifactId>\n          <version>${spring.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>org.springframework</groupId>\n          <artifactId>spring-expression</artifactId>\n          <version>${spring.version}</version>\n        </dependency>\n        <!-- Spring end -->\n        <!-- MyBatis begin -->\n        <dependency>\n          <groupId>org.mybatis</groupId>\n          <artifactId>mybatis</artifactId>\n          <version>${mybatis.version}</version>\n        </dependency>\n        <dependency>\n          <groupId>org.mybatis</groupId>\n          <artifactId>mybatis-spring</artifactId>\n          <version>${mybatis.spring.version}</version>\n        </dependency>\n        <!-- MyBatis end -->\n      </dependencies>\n    </dependencyManagement>\n    <build>\n      <resources>\n        <resource>\n          <targetPath>${project.build.directory}/classes</targetPath>\n          <directory>src/main/resources</directory>\n          <filtering>true</filtering>\n          <includes>\n            <include>**/*.xml</include>\n            <include>**/*.properties</include>\n          </includes>\n        </resource>\n        <resource>\n          <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>\n          <!--<directory>src/main/resources/spring</directory>-->\n          <directory>src/main/resources</directory>\n          <filtering>true</filtering>\n          <includes>\n            <include>spring-context.xml</include>\n          </includes>\n        </resource>\n      </resources>\n\n      <pluginManagement>\n        <plugins>\n          <plugin>\n            <groupId>org.apache.maven.plugins</groupId>\n            <artifactId>maven-compiler-plugin</artifactId>\n            <version>${compiler.version}</version>\n            <configuration>\n              <source>1.7</source>\n              <target>1.7</target>\n              <encoding>${project.build.sourceEncoding}</encoding>\n            </configuration>\n          </plugin>\n          <plugin>\n            <groupId>org.apache.maven.plugins</groupId>\n            <artifactId>maven-source-plugin</artifactId>\n            <version>${source.version}</version>\n            <executions>\n              <execution>\n                <phase>package</phase>\n                <goals>\n                  <goal>jar</goal>\n                </goals>\n              </execution>\n            </executions>\n          </plugin>\n          <plugin>\n            <groupId>org.apache.maven.plugins</groupId>\n            <artifactId>maven-jar-plugin</artifactId>\n            <version>${jar.version}</version>\n            <configuration>\n              <classesDirectory>${project.build.outputDirectory}</classesDirectory>\n              <outputDirectory>${project.build.directory}</outputDirectory>\n              <archive>\n                <!--生成的jar中，不要包含pom.xml和pom.properties这两个文件 -->\n                <addMavenDescriptor>false</addMavenDescriptor>\n                <manifest>\n                  <mainClass>com.alibaba.dubbo.container.Main</mainClass>\n                  <!-- 打包时MANIFEST.MF文件不记录时间版本 -->\n                  <useUniqueVersions>false</useUniqueVersions>\n                  <addClasspath>true</addClasspath>\n                  <classpathPrefix>lib/</classpathPrefix>\n                </manifest>\n                <manifestEntries>\n                  <Class-Path>.</Class-Path>\n                </manifestEntries>\n              </archive>\n            </configuration>\n          </plugin>\n          <plugin>\n            <groupId>org.apache.maven.plugins</groupId>\n            <artifactId>maven-dependency-plugin</artifactId>\n            <version>${dependency.version}</version>\n            <executions>\n              <execution>\n                <id>copy-dependencies</id>\n                <phase>package</phase>\n                <goals>\n                  <goal>copy-dependencies</goal>\n                </goals>\n                <configuration>\n                  <type>jar</type>\n                  <includeTypes>jar</includeTypes>\n                  <!--<useUniqueVersions>false</useUniqueVersions>-->\n                  <outputDirectory>\n                    ${project.build.directory}/lib\n                  </outputDirectory>\n                </configuration>\n              </execution>\n            </executions>\n          </plugin>\n          <plugin>\n            <groupId>org.zeroturnaround</groupId>\n            <artifactId>jrebel-maven-plugin</artifactId>\n            <version>${rebel-maven-plugin.version}</version>\n            <configuration>\n              <addResourcesDirToRebelXml>true</addResourcesDirToRebelXml>\n              <alwaysGenerate>true</alwaysGenerate>\n              <showGenerated>true</showGenerated>\n            </configuration>\n            <executions>\n              <execution>\n                <id>generate-rebel-xml</id>\n                <phase>process-resources</phase>\n                <goals>\n                  <goal>generate</goal>\n                </goals>\n              </execution>\n            </executions>\n          </plugin>\n          <plugin>\n            <groupId>org.mortbay.jetty</groupId>\n            <artifactId>jetty-maven-plugin</artifactId>\n            <version>${jetty.version}</version>\n            <configuration>\n              <connectors>\n                <connector implementation=\"org.eclipse.jetty.server.nio.SelectChannelConnector\">\n                  <port>80</port>\n                  <maxIdleTime>60000</maxIdleTime>\n                </connector>\n              </connectors>\n            </configuration>\n          </plugin>\n        </plugins>\n      </pluginManagement>\n    </build>\n</project>"
  },
  {
    "path": "sql/weixin.sql",
    "content": "/*\nNavicat MySQL Data Transfer\n\nSource Server         : 120.27.53.171-wx\nSource Server Version : 50173\nSource Host           : 120.27.53.171:3306\nSource Database       : weixin\n\nTarget Server Type    : MYSQL\nTarget Server Version : 50173\nFile Encoding         : 65001\n\nDate: 2016-11-27 21:33:09\n*/\n\nSET FOREIGN_KEY_CHECKS=0;\n\n-- ----------------------------\n-- Table structure for account\n-- ----------------------------\nDROP TABLE IF EXISTS `account`;\nCREATE TABLE `account` (\n  `id` varchar(255) NOT NULL,\n  `avatar` varchar(255) DEFAULT NULL,\n  `nickname` varchar(255) DEFAULT NULL,\n  `account_level_id` varchar(255) DEFAULT NULL,\n  `credit` varchar(255) DEFAULT NULL,\n  `username` varchar(255) DEFAULT NULL,\n  `password` varchar(255) DEFAULT NULL,\n  `bonus_point_upgrade` int(11) DEFAULT NULL,\n  `bonus_point_usable` int(11) DEFAULT NULL,\n  `balance` double DEFAULT NULL,\n  `is_employee` tinyint(4) DEFAULT NULL,\n  `ip` varchar(255) DEFAULT NULL,\n  `source_from` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of account\n-- ----------------------------\nINSERT INTO `account` VALUES ('1', 'http://wx.aqd123.com/shop/images/avatar.jpg', 'Cheng', '4', 'WELL', '18600536683', '1', '1070', '3430', '451', '0', '1.95.244.24', 'NO', '--', '2016-09-20 10:03:47', '2016-11-27 12:54:18', 'NORMAL');\nINSERT INTO `account` VALUES ('9c3e4044b97140a98f8d12c34bf99efa', 'http://wx.aqd123.com/shop/images/avatar.jpg', 'chengzhx76', '1', 'WELL', '18600536689', '1', '200', '0', '0', '0', '1.95.244.24', 'NO', '--', '2016-11-26 17:21:12', '2016-11-26 17:21:12', 'NORMAL');\nINSERT INTO `account` VALUES ('b42f14ce73d24541be4152b7d09cf855', 'http://wx.aqd123.com/shop/images/avatar.jpg', null, '1', 'WELL', '18600536687', '123456', '200', '0', '0', '0', '1.95.244.24', 'NO', '--', '2016-11-26 16:57:36', '2016-11-26 20:27:59', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for account_level\n-- ----------------------------\nDROP TABLE IF EXISTS `account_level`;\nCREATE TABLE `account_level` (\n  `id` varchar(255) NOT NULL,\n  `level` int(11) DEFAULT NULL,\n  `name` varchar(255) DEFAULT NULL,\n  `need_ronus_point` int(11) DEFAULT NULL,\n  `next_level_need_point` int(11) DEFAULT NULL,\n  `reduct_percent` double(3,2) DEFAULT NULL COMMENT '折扣 如 0.02打98折',\n  `consume_scale` varchar(12) DEFAULT NULL COMMENT '积分比 如 1:100 一百个积分等于一元',\n  `free_frequency` int(11) DEFAULT NULL,\n  `is_enable` tinyint(4) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of account_level\n-- ----------------------------\nINSERT INTO `account_level` VALUES ('1', '1', '一级', '0', '200', '0.00', '1000:1', '0', '1', '初始化帐户级别；1000个积分可以换1块钱；0折扣；一月0次免运费机会', '2016-07-12 16:36:04', '2016-07-12 16:36:08', 'NORMAL');\nINSERT INTO `account_level` VALUES ('2', '2', '二级', '200', '600', '0.00', '1000:1', '1', '1', '二级账户；1000个积分可以换1块钱；0折扣；一月1次免运费机会', '2016-11-19 21:42:16', '2016-11-19 21:42:19', 'NORMAL');\nINSERT INTO `account_level` VALUES ('3', '3', '三级', '600', '1200', '0.02', '900:1', '2', '1', '三级账户；900个积分可以换1块钱；98折；一月2次免运费机会', '2016-11-20 02:01:53', '2016-11-20 02:01:56', 'NORMAL');\nINSERT INTO `account_level` VALUES ('4', '4', '四级', '1200', '2500', '0.03', '700:1', '3', '1', '四级账户；700个积分可以换1块钱；97折；一月3次免运费机会', '2016-11-21 13:00:21', '2016-11-21 13:00:27', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for ad\n-- ----------------------------\nDROP TABLE IF EXISTS `ad`;\nCREATE TABLE `ad` (\n  `id` varchar(255) NOT NULL,\n  `name` varchar(255) DEFAULT NULL,\n  `picture_url` varchar(255) DEFAULT NULL,\n  `link_url` varchar(255) DEFAULT NULL,\n  `width` int(11) DEFAULT NULL,\n  `height` int(11) DEFAULT NULL,\n  `priority` int(11) DEFAULT NULL,\n  `is_enable` tinyint(4) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of ad\n-- ----------------------------\nINSERT INTO `ad` VALUES ('1', '名字1', 'http://wx.aqd123.com/moblie/static/images/ad/swiper-1.jpg', 'http://www.baidu.com', '120', '120', '1', '1', '首页图片1', '2016-06-29 15:24:44', '2016-06-29 15:24:48', 'NORMAL');\nINSERT INTO `ad` VALUES ('2', '名字2', 'http://wx.aqd123.com/moblie/static/images/ad/swiper-2.jpg', 'http://www.baidu.com', '120', '120', '2', '1', '首页图片2', '2016-06-29 16:34:26', '2016-06-29 16:34:29', 'NORMAL');\nINSERT INTO `ad` VALUES ('3', '名字3', 'http://wx.aqd123.com/moblie/static/images/ad/swiper-3.jpg', 'http://www.baidu.com', '120', '120', '3', '1', '首页图片3', '2016-06-30 18:07:05', '2016-06-30 18:07:08', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for ad_join_position\n-- ----------------------------\nDROP TABLE IF EXISTS `ad_join_position`;\nCREATE TABLE `ad_join_position` (\n  `id` varchar(255) NOT NULL,\n  `ad_id` int(11) DEFAULT NULL,\n  `ad_position_id` int(11) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of ad_join_position\n-- ----------------------------\nINSERT INTO `ad_join_position` VALUES ('1', '1', '1', '2016-06-29 15:25:44', '2016-06-29 15:25:47', 'NORMAL');\nINSERT INTO `ad_join_position` VALUES ('2', '2', '1', '2016-06-29 16:36:11', '2016-06-29 16:36:13', 'NORMAL');\nINSERT INTO `ad_join_position` VALUES ('3', '3', '1', '2016-06-30 19:41:44', '2016-06-30 19:41:47', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for ad_position\n-- ----------------------------\nDROP TABLE IF EXISTS `ad_position`;\nCREATE TABLE `ad_position` (\n  `id` varchar(255) NOT NULL,\n  `name` varchar(255) DEFAULT NULL,\n  `type` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of ad_position\n-- ----------------------------\nINSERT INTO `ad_position` VALUES ('1', '首页', 'INDEX', '首页展示的图片', '2016-06-29 15:25:27', '2016-06-29 15:25:29', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for admin\n-- ----------------------------\nDROP TABLE IF EXISTS `admin`;\nCREATE TABLE `admin` (\n  `id` varchar(64) NOT NULL,\n  `username` varchar(128) DEFAULT NULL,\n  `password` varchar(128) DEFAULT NULL,\n  `realname` varchar(16) DEFAULT NULL,\n  `mobile` varchar(16) DEFAULT NULL,\n  `photo` varchar(64) DEFAULT NULL,\n  `login_ip` varchar(16) DEFAULT NULL,\n  `login_date` datetime DEFAULT NULL,\n  `old_login_ip` varchar(16) DEFAULT NULL,\n  `old_login_date` datetime DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(64) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of admin\n-- ----------------------------\nINSERT INTO `admin` VALUES ('1', 'cheng', '5cdefe986d7fa0d363930c4062b776bd30a33a3cec47a34291a8bd27', '程', '18600536683', '/img/logo.jpg', '1.95.97.65', '2016-11-17 23:17:55', '1.95.240.33', '2016-10-30 21:50:09', '备注', '2016-01-28 15:47:10', '2016-11-17 23:17:55', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for admin_role\n-- ----------------------------\nDROP TABLE IF EXISTS `admin_role`;\nCREATE TABLE `admin_role` (\n  `admin_id` varchar(64) CHARACTER SET utf8 NOT NULL COMMENT '用户ID',\n  `role_id` varchar(64) CHARACTER SET utf8 NOT NULL COMMENT '角色ID',\n  PRIMARY KEY (`admin_id`,`role_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1;\n\n-- ----------------------------\n-- Records of admin_role\n-- ----------------------------\nINSERT INTO `admin_role` VALUES ('1', '1');\n\n-- ----------------------------\n-- Table structure for arayacak_address\n-- ----------------------------\nDROP TABLE IF EXISTS `arayacak_address`;\nCREATE TABLE `arayacak_address` (\n  `id` varchar(255) NOT NULL,\n  `name` varchar(255) DEFAULT NULL,\n  `province` varchar(255) DEFAULT NULL,\n  `city` varchar(255) DEFAULT NULL,\n  `country` varchar(255) DEFAULT NULL,\n  `town` varchar(255) DEFAULT NULL,\n  `village` varchar(255) DEFAULT NULL,\n  `address` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of arayacak_address\n-- ----------------------------\nINSERT INTO `arayacak_address` VALUES ('1', '好吃馍店', '1', '1', '1', '1', '1', '刘楼村西头', '自提点1', '2016-11-02 16:36:19', '2016-11-02 16:36:21', 'NORMAL');\nINSERT INTO `arayacak_address` VALUES ('2', '大众馍店', '1', '1', '1', '1', '2', '黄楼村南头', '自提点2', '2016-11-02 16:37:09', '2016-11-02 16:37:13', 'NORMAL');\nINSERT INTO `arayacak_address` VALUES ('3', '城西馍店', '1', '1', '1', '2', '1', '文亭街西头', '城关自提点', '2016-11-03 14:30:00', '2016-11-03 14:30:02', 'NORMAL');\nINSERT INTO `arayacak_address` VALUES ('4', '批发街馍店', '1', '1', '1', '2', '1', '批发街中间路北', '批发街自提点', '2016-11-03 14:31:36', '2016-11-03 14:31:39', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for arayacak_delivery_time\n-- ----------------------------\nDROP TABLE IF EXISTS `arayacak_delivery_time`;\nCREATE TABLE `arayacak_delivery_time` (\n  `id` varchar(255) NOT NULL,\n  `name` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of arayacak_delivery_time\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for behavior\n-- ----------------------------\nDROP TABLE IF EXISTS `behavior`;\nCREATE TABLE `behavior` (\n  `id` varchar(255) NOT NULL,\n  `behavior_type` varchar(255) DEFAULT NULL,\n  `name` varchar(255) DEFAULT NULL,\n  `oid` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of behavior\n-- ----------------------------\nINSERT INTO `behavior` VALUES ('83f3553b85b14f89af11bfe4a9481a4f', 'CASH', '70548275', null, '--', '2016-10-12 12:07:01', '2016-10-12 12:07:01', 'NORMAL');\nINSERT INTO `behavior` VALUES ('15b305bcf7034e8782d2c79aaa0d3db6', 'CASH', '02288732', null, '--', '2016-10-12 13:54:05', '2016-10-12 13:54:05', 'NORMAL');\nINSERT INTO `behavior` VALUES ('bd8601ce9452495f91edd75f5795c6a4', 'CASH', '43473491', null, '--', '2016-10-13 10:15:34', '2016-10-13 10:15:34', 'NORMAL');\nINSERT INTO `behavior` VALUES ('8155db2240824efcae8f8a66d2e23a17', 'CASH', '28152547', null, '--', '2016-10-13 10:17:38', '2016-10-13 10:17:38', 'NORMAL');\nINSERT INTO `behavior` VALUES ('8f274eaf59e1482db64139bcf59de9cb', 'CASH', '00933862', null, '--', '2016-10-13 11:17:34', '2016-10-13 11:17:34', 'NORMAL');\nINSERT INTO `behavior` VALUES ('5198886d73a8476ea4035fbd06f29a39', 'CASH', '07753186', null, '--', '2016-10-13 11:20:04', '2016-10-13 11:20:04', 'NORMAL');\nINSERT INTO `behavior` VALUES ('dcaed9f53fed4664adfb09566806adc7', 'CASH', '85845262', null, '--', '2016-10-13 11:21:10', '2016-10-13 11:21:10', 'NORMAL');\nINSERT INTO `behavior` VALUES ('44058c8dfe8c4c078607c6c6b5f171bc', 'CASH', '04553268', null, '--', '2016-10-13 11:29:58', '2016-10-13 11:29:58', 'NORMAL');\nINSERT INTO `behavior` VALUES ('5a35c77e84144b669be34ea554a67158', 'CASH', '29522347', null, '--', '2016-10-13 11:32:08', '2016-10-13 11:32:08', 'NORMAL');\nINSERT INTO `behavior` VALUES ('710b8062bdb54844803067de1b78e7bc', 'CASH', '19902742', null, '--', '2016-10-13 11:43:06', '2016-10-13 11:43:06', 'NORMAL');\nINSERT INTO `behavior` VALUES ('061998b72cc04322b68b7dc50a6bcd29', 'CASH', '14458117', null, '--', '2016-10-17 15:34:54', '2016-10-17 15:34:54', 'NORMAL');\nINSERT INTO `behavior` VALUES ('10685ac96a1e42fb8743d3c9e0dbde85', 'CASH', '80301769', null, '--', '2016-11-06 00:27:07', '2016-11-06 00:27:07', 'NORMAL');\nINSERT INTO `behavior` VALUES ('47598bf5df534940ad1490ccb7ab118c', 'CASH', '09133902', null, '--', '2016-11-06 00:31:06', '2016-11-06 00:31:06', 'NORMAL');\nINSERT INTO `behavior` VALUES ('6e89eef7b081461da3bd25517acfcbde', 'CASH', '08292455', null, '--', '2016-11-06 00:32:32', '2016-11-06 00:32:32', 'NORMAL');\nINSERT INTO `behavior` VALUES ('d3a53a20055344bba72a87d42e8e72a1', 'CASH', '67016531', null, '--', '2016-11-06 00:35:17', '2016-11-06 00:35:17', 'NORMAL');\nINSERT INTO `behavior` VALUES ('17f2d6f34f8e448f83311735a0ef3b19', 'CASH', '81893558', null, '--', '2016-11-06 00:36:34', '2016-11-06 00:36:34', 'NORMAL');\nINSERT INTO `behavior` VALUES ('d82a8156764a4fafbe76d7a4a3bcf7cb', 'CASH', '29580650', null, '--', '2016-11-06 00:36:53', '2016-11-06 00:36:53', 'NORMAL');\nINSERT INTO `behavior` VALUES ('4a82deaac6e545559d36aec7b38c1581', 'CASH', '74041111', null, '--', '2016-11-06 00:39:08', '2016-11-06 00:39:08', 'NORMAL');\nINSERT INTO `behavior` VALUES ('3a77a4473d4c4e64a6cf9bda02c3d2fa', 'CASH', '63842497', null, '--', '2016-11-06 00:45:20', '2016-11-06 00:45:20', 'NORMAL');\nINSERT INTO `behavior` VALUES ('0dafe568daf94103ad3525219ed15a2d', 'CASH', '下单', '52488484', '--', '2016-11-06 17:47:03', '2016-11-06 17:47:03', 'NORMAL');\nINSERT INTO `behavior` VALUES ('e90a746d619844e89c61699bf21947e7', 'CASH', '下单', '05932460', '--', '2016-11-06 17:49:41', '2016-11-06 17:49:41', 'NORMAL');\nINSERT INTO `behavior` VALUES ('dd1486b0febf40da8a9e4ddbd8d21394', 'CASH', '下单', '28041969', '--', '2016-11-06 17:51:21', '2016-11-06 17:51:21', 'NORMAL');\nINSERT INTO `behavior` VALUES ('4e7dd142907a4e609a3d9c2a617373c2', 'CASH', '下单', '87269926', '--', '2016-11-06 17:56:43', '2016-11-06 17:56:43', 'NORMAL');\nINSERT INTO `behavior` VALUES ('b592d3ea560a42ed90825eb62c4ccf9a', 'CASH', '下单', '88001282', '--', '2016-11-06 17:58:11', '2016-11-06 17:58:11', 'NORMAL');\nINSERT INTO `behavior` VALUES ('30f2474268fa4e8f8cfc5b1bd07dbc93', 'CASH', '下单', '72176421', '--', '2016-11-06 17:58:37', '2016-11-06 17:58:37', 'NORMAL');\nINSERT INTO `behavior` VALUES ('c2a0f45cfd9d4749a72b3b120bbaf4f0', 'CASH', '下单', '66107843', '--', '2016-11-06 18:04:27', '2016-11-06 18:04:27', 'NORMAL');\nINSERT INTO `behavior` VALUES ('cf3a8deac4c14ae3ac60f67a227da5ec', 'CASH', '下单', '81584739', '--', '2016-11-06 18:16:30', '2016-11-06 18:16:30', 'NORMAL');\nINSERT INTO `behavior` VALUES ('da0cf6eebc414d38964aaadf7eb79d3c', 'CASH', '下单', '67440119', '--', '2016-11-06 18:16:50', '2016-11-06 18:16:50', 'NORMAL');\nINSERT INTO `behavior` VALUES ('54f43f6904634caf8503b2a1a8a27612', 'CASH', '下单', '57835249', '--', '2016-11-06 18:24:53', '2016-11-06 18:24:53', 'NORMAL');\nINSERT INTO `behavior` VALUES ('40a49efba395463eadf83bc615b6bd8b', 'CASH', '下单', '33475119', '--', '2016-11-06 18:25:11', '2016-11-06 18:25:11', 'NORMAL');\nINSERT INTO `behavior` VALUES ('89b7c9ca8fd04a2dac6561a064c6779b', 'CASH', '下单', '37709392', '--', '2016-11-06 18:25:46', '2016-11-06 18:25:46', 'NORMAL');\nINSERT INTO `behavior` VALUES ('ae216418a1624583890cd77b9f73f1c5', 'CASH', '下单', '87514247', '--', '2016-11-06 22:01:22', '2016-11-06 22:01:22', 'NORMAL');\nINSERT INTO `behavior` VALUES ('1d0e1a9f12f74a799e0f911dce0fb0f8', 'CASH', '下单', '12168331', '--', '2016-11-06 22:01:27', '2016-11-06 22:01:27', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for bonus_point_record\n-- ----------------------------\nDROP TABLE IF EXISTS `bonus_point_record`;\nCREATE TABLE `bonus_point_record` (\n  `id` varchar(255) NOT NULL,\n  `account_id` varchar(255) DEFAULT NULL,\n  `before_bonus_points` varchar(255) DEFAULT NULL,\n  `tx_bonus_points` varchar(255) DEFAULT NULL,\n  `frozen_bonus_points` varchar(255) DEFAULT NULL,\n  `after_bonus_points` varchar(255) DEFAULT NULL,\n  `tx_type` varchar(255) DEFAULT NULL,\n  `behavior_id` varchar(255) DEFAULT NULL,\n  `tx_result` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of bonus_point_record\n-- ----------------------------\nINSERT INTO `bonus_point_record` VALUES ('4b6ca8d3d5e040bdbd9ab0e3f108762f', '1', '1070', '75', '75', '1145', 'EARNING', null, '下单获取75积分', '--', '2016-11-20 22:39:33', '2016-11-20 22:39:33', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('41699d0f2024474a9d44062dae5ab2d0', '1', '1145', '65', '65', '1210', 'EARNING', null, '下单获取65积分', '--', '2016-11-20 22:45:55', '2016-11-20 22:45:55', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('08393c414c5e4877a299b65c39c55bea', '1', '1210', '50', '50', '1260', 'EARNING', null, '下单获取50积分', '--', '2016-11-20 23:07:30', '2016-11-20 23:07:30', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('f67560fb447340c89b96444abc866826', '1', '1260', '10', '10', '1270', 'EARNING', null, '下单获取10积分', '--', '2016-11-20 23:13:28', '2016-11-20 23:13:28', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('5d90c309355644baa140a87270522c46', '1', '1270', '0', '0', '1270', 'EARNING', null, '下单获取0积分', '--', '2016-11-20 23:48:16', '2016-11-20 23:48:16', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('b1eecc5cc29a440394928c1c3678c50f', '1', '1270', '5', '5', '1275', 'EARNING', null, '下单获取5积分', '--', '2016-11-20 23:57:13', '2016-11-20 23:57:13', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('953cd8f89b954e199529cc667d51d788', '1', '1275', '5', '5', '1280', 'EARNING', null, '下单获取5积分', '--', '2016-11-20 23:57:33', '2016-11-20 23:57:33', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('481407ba96bc4a1c99b204913371bc0a', '1', '1280', '15', '15', '1295', 'EARNING', null, '下单获取15积分', '--', '2016-11-21 00:03:38', '2016-11-21 00:03:38', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('f5c5e513b7b042c69b2d34dadd1b4c60', '1', '1295', '10', '10', '1305', 'EARNING', null, '下单获取10积分', '--', '2016-11-21 00:05:10', '2016-11-21 00:05:10', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('793dda954b2b45c7b0ebc1222a4cabb5', '1', '1305', '5', '5', '1310', 'EARNING', null, '下单获取5积分', '--', '2016-11-21 00:06:30', '2016-11-21 00:06:30', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('823ab97dad6141b3ab13f124646092d2', '1', '1310', '35', '35', '1345', 'EARNING', null, '下单获取35积分', '--', '2016-11-21 00:21:36', '2016-11-21 00:21:36', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('fe6df70eaaf34c609f94c8721f8ac079', '1', '1345', '5', '5', '1350', 'EARNING', null, '下单获取5积分', '--', '2016-11-21 00:23:22', '2016-11-21 00:23:22', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('9a6b25623d6f419ba34fe5729f2514f3', '1', '1350', '5', '5', '1355', 'EARNING', null, '下单获取5积分', '--', '2016-11-21 00:23:56', '2016-11-21 00:23:56', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('daeca90cc3e94fb6a7d523bad6ed845b', '1', '1355', '10', '10', '1365', 'EARNING', null, '下单获取10积分', '--', '2016-11-21 00:30:44', '2016-11-21 00:30:44', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('e9742ea50672499eaec4034375f700af', '1', '1365', '10', '10', '1375', 'EARNING', null, '下单获取10积分', '--', '2016-11-21 00:31:51', '2016-11-21 00:31:51', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('286b590b5b9f436584a4e63e87acd998', '1', '1375', '10', '10', '1385', 'EARNING', null, '下单获取10积分', '--', '2016-11-21 00:32:40', '2016-11-21 00:32:40', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('8584adfa783b4b4c8a288ec527b9fe9a', '1', '1385', '15', '15', '1400', 'EARNING', null, '下单获取15积分', '--', '2016-11-21 00:34:32', '2016-11-21 00:34:32', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('a7922246efa84ff3b77dc8cb951a367a', '1', '1400', '0', '0', '1400', 'EARNING', null, '下单获取0积分', '--', '2016-11-21 00:34:48', '2016-11-21 00:34:48', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('d83afacfbec14c4d8ac3b61581e09b99', '1', '1400', '5', '5', '1405', 'EARNING', null, '下单获取5积分', '--', '2016-11-21 00:36:28', '2016-11-21 00:36:28', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('6b5cbd44253b48218b0861e42f772af0', '1', '1405', '0', '0', '1405', 'EARNING', null, '下单获取0积分', '--', '2016-11-21 00:36:37', '2016-11-21 00:36:37', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('42b9c295dffa44aa91848d2365474815', '1', '1405', '0', '0', '1405', 'EARNING', null, '下单获取0积分', '--', '2016-11-21 00:37:23', '2016-11-21 00:37:23', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('af731be2150a4aaf99e22ff2a306b7c2', '1', '1405', '10', '10', '1415', 'EARNING', null, '下单获取10积分', '--', '2016-11-21 00:38:37', '2016-11-21 00:38:37', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('d4a9d559d77b41f7b13248cefcba5808', '1', '1415', '10', '10', '1425', 'EARNING', null, '下单获取10积分', '--', '2016-11-21 00:39:19', '2016-11-21 00:39:19', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('e23f8f7c32a343c2a63f0ade7cffc596', '1', '1425', '10', '10', '1435', 'EARNING', null, '下单获取10积分', '--', '2016-11-21 00:40:14', '2016-11-21 00:40:14', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('ef12bb53a7304ac492264151103b2575', '1', '1435', '10', '10', '1445', 'EARNING', null, '下单获取10积分', '--', '2016-11-21 00:41:10', '2016-11-21 00:41:10', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('36af3dd628cb4fa8a92d6af9a1055391', '1', '1445', '10', '10', '1455', 'EARNING', null, '下单获取10积分', '--', '2016-11-21 00:46:04', '2016-11-21 00:46:04', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('ec7c817248c249b3ba183c1342751820', '1', '1455', '10', '10', '1465', 'EARNING', null, '下单获取10积分', '--', '2016-11-21 00:46:29', '2016-11-21 00:46:29', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('b79cb350fcae402ca8ee3dfd651795ef', '1', '1465', '20', '20', '1485', 'EARNING', null, '下单获取20积分', '--', '2016-11-21 00:49:26', '2016-11-21 00:49:26', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('5b9b2f9f14da47ae8aa07a98ee33a6df', '1', '1485', '20', '20', '1505', 'EARNING', null, '下单获取20积分', '--', '2016-11-21 01:23:14', '2016-11-21 01:23:14', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('06e5197d71f34a53918910907c707908', '1', '1505', '105', '105', '1610', 'EARNING', null, '下单获取105积分', '--', '2016-11-21 01:26:53', '2016-11-21 01:26:53', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('b656306e212041a0ae5b55cca19bd8b6', '1', '1610', '50', '50', '1660', 'EARNING', null, '下单获取50积分', '--', '2016-11-21 01:27:48', '2016-11-21 01:27:48', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('b880135798c3413a82072f07f4662cbe', '1', '1660', '60', '60', '1720', 'EARNING', null, '下单获取60积分', '--', '2016-11-21 01:29:01', '2016-11-21 01:29:01', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('b5218845db644fa9b2e55c6d76089c09', '1', '1720', '45', '45', '1765', 'EARNING', null, '下单获取45积分', '--', '2016-11-21 11:57:31', '2016-11-21 11:57:31', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('41468b0b9a7741599881b10a4d2b56a6', '1', '1765', '15', '15', '1780', 'EARNING', null, '下单获取15积分', '--', '2016-11-21 11:59:19', '2016-11-21 11:59:19', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('c73064e5016343638874a7e53f37c994', '1', '1780', '10', '10', '1790', 'EARNING', null, '下单获取10积分', '--', '2016-11-21 12:02:44', '2016-11-21 12:02:44', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('e139b64d970145ae95bd22136918593f', '1', '1790', '10', '10', '1800', 'EARNING', null, '下单获取10积分', '--', '2016-11-21 12:03:05', '2016-11-21 12:03:05', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('0539dda2a17544cba94fb61f42d7c813', '1', '1800', '15', '15', '1815', 'EARNING', null, '下单获取15积分', '--', '2016-11-21 12:57:36', '2016-11-21 12:57:36', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('ffecb4e5d82249379292cc6c95317ec1', '1', '1815', '70', '70', '1885', 'EARNING', null, '下单获取70积分', '--', '2016-11-21 22:59:45', '2016-11-21 22:59:45', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('293713490c26498f9185ed8e5e720431', '1', '1885', '50', '50', '1935', 'EARNING', null, '下单获取50积分', '--', '2016-11-21 23:17:11', '2016-11-21 23:17:11', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('3251f2a9e76f45899dc50a93cb8d9893', '1', '1935', '50', '50', '1985', 'EARNING', null, '下单获取50积分', '--', '2016-11-21 23:21:47', '2016-11-21 23:21:47', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('e774ade2700f4c0397cda306fab69313', '1', '1985', '45', '45', '2030', 'EARNING', null, '下单获取45积分', '--', '2016-11-21 23:40:00', '2016-11-21 23:40:00', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('e23451f3f20944f7ac197f4d3fb8665a', '1', '2030', '50', '50', '2080', 'EARNING', null, '下单获取50积分', '--', '2016-11-21 23:45:49', '2016-11-21 23:45:49', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('6e7de97a6f1545ee9b0d90f39b9470bf', '1', '2080', '25', '25', '2105', 'EARNING', null, '下单获取25积分', '--', '2016-11-21 23:53:49', '2016-11-21 23:53:49', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('99515e6e25954cff95310f06e7349f9a', '1', '2105', '15', '15', '2120', 'EARNING', null, '下单获取15积分', '--', '2016-11-21 23:57:16', '2016-11-21 23:57:16', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('ff537a5d22684ebf8d1330b98b73c5c7', '1', '2120', '15', '15', '2135', 'EARNING', null, '下单获取15积分', '--', '2016-11-21 23:57:44', '2016-11-21 23:57:44', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('b902a1bda8c9454684e7145b8cc1290f', '1', '2135', '10', '10', '2145', 'EARNING', null, '下单获取10积分', '--', '2016-11-21 23:58:11', '2016-11-21 23:58:11', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('a9f199208c8e4437851b58c4a6ea2c45', '1', '2145', '10', '10', '2155', 'EARNING', null, '下单获取10积分', '--', '2016-11-21 23:59:03', '2016-11-21 23:59:03', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('a533b563f2944e03b34c5360bce00213', '1', '2155', '515', '515', '2670', 'EARNING', null, '下单获取515积分', '--', '2016-11-22 00:34:02', '2016-11-22 00:34:02', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('adb8772779b445ac8d24decdd826cbd3', '1', '2670', '305', '305', '2975', 'EARNING', null, '下单获取305积分', '--', '2016-11-22 00:36:34', '2016-11-22 00:36:34', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('1afabd9c13264d229ef683fe810147b3', '1', '2975', '35', '35', '3010', 'EARNING', null, '下单获取35积分', '--', '2016-11-22 13:13:42', '2016-11-22 13:13:42', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('6b4e5e40fde6441da1c29e6818e8d4c3', '1', '3010', '100', '100', '3110', 'EARNING', null, '下单获取100积分', '--', '2016-11-23 01:39:46', '2016-11-23 01:39:46', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('8e7b51c36cb946b4876bb5bc7016278f', '1', '3110', '30', '30', '3140', 'EARNING', null, '下单获取30积分', '--', '2016-11-23 23:58:33', '2016-11-23 23:58:33', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('c075dd7f938a4beea17ce1ac9b6bd264', '1', '3140', '30', '30', '3170', 'EARNING', null, '下单获取30积分', '--', '2016-11-23 23:58:33', '2016-11-23 23:58:33', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('ab6dce5dbc7d4dddb54861edf39b2f73', '1', '3140', '50', '50', '3190', 'EARNING', null, '下单获取50积分', '--', '2016-11-24 00:00:26', '2016-11-24 00:00:26', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('d240db07b68c41ab843eed3e48aeefdb', '1', '3190', '0', '0', '3190', 'EARNING', null, '下单获取0积分', '--', '2016-11-24 00:01:00', '2016-11-24 00:01:00', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('4d1dc72186fc4521bb958cef45fa7715', '1', '3190', '145', '145', '3335', 'EARNING', null, '下单获取145积分', '--', '2016-11-26 14:19:46', '2016-11-26 14:19:46', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('bb050cfac69144dd96db4a041f055ce2', '1', '3335', '55', '55', '3390', 'EARNING', null, '下单获取55积分', '--', '2016-11-27 00:20:24', '2016-11-27 00:20:24', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('19aa046994f5444281645951919bb55c', '1', '3390', '10', '10', '3400', 'EARNING', null, '下单获取10积分', '--', '2016-11-27 12:54:18', '2016-11-27 12:54:18', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('a0f16ad31bd84777a8e97171ff7bbde6', '1', '0', '30', '30', '30', 'EARNING', null, '下单获取30积分', '--', '2016-11-20 01:55:12', '2016-11-20 01:55:12', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('6dd686c97a414e86a29382a656ca8328', '1', '30', '5', '5', '35', 'EARNING', null, '下单获取5积分', '--', '2016-11-20 01:55:59', '2016-11-20 01:55:59', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('5747c264ec2c49c4b8b323f239d91881', '1', '35', '300', '300', '335', 'EARNING', null, '下单获取300积分', '--', '2016-11-20 01:59:27', '2016-11-20 01:59:27', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('4856378220a742f7b54c595d3d4d5f68', '1', '335', '10', '10', '345', 'EARNING', null, '下单获取10积分', '--', '2016-11-20 02:42:28', '2016-11-20 02:42:28', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('8e0d07ab4d104576a7a7691a8b6f14b9', '1', '345', '270', '270', '615', 'EARNING', null, '下单获取270积分', '--', '2016-11-20 16:10:20', '2016-11-20 16:10:20', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('81dbb04fb0f6495ca6da7281edbf7e89', '1', '615', '415', '415', '1030', 'EARNING', null, '下单获取415积分', '--', '2016-11-20 18:18:00', '2016-11-20 18:18:00', 'NORMAL');\nINSERT INTO `bonus_point_record` VALUES ('bc40dd38c0e647b39a51d91e74181835', '1', '1030', '40', '40', '1070', 'EARNING', null, '下单获取40积分', '--', '2016-11-20 20:31:19', '2016-11-20 20:31:19', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for cash_record\n-- ----------------------------\nDROP TABLE IF EXISTS `cash_record`;\nCREATE TABLE `cash_record` (\n  `id` varchar(255) NOT NULL,\n  `account_id` varchar(255) DEFAULT NULL,\n  `before_money` varchar(255) DEFAULT NULL,\n  `tx_money` varchar(255) DEFAULT NULL,\n  `frozen_money` varchar(255) DEFAULT NULL,\n  `after_bonus_points` varchar(255) DEFAULT NULL,\n  `tx_type` varchar(255) DEFAULT NULL,\n  `behavior_id` varchar(255) DEFAULT NULL,\n  `tx_result` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of cash_record\n-- ----------------------------\nINSERT INTO `cash_record` VALUES ('1', '1', '0', '111', '111', '20000', 'EXPENSE', '1', '1', '--', '2016-10-13 11:31:24', '2016-10-13 11:31:29', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('2766d2c54c0d4cc6bf05a5c34e244437', '1', '14904.5', '994.7', null, '13909.8', 'EXPENSE', null, '结果', '--', '2016-11-09 07:48:40', '2016-11-09 07:48:40', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('c3f30f722c0141e2b13ca147962b87ad', '1', '13909.8', '986.2', null, '12923.6', 'EXPENSE', null, '结果', '--', '2016-11-09 07:48:40', '2016-11-09 07:48:40', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('c32e7b1be4ae437d8ac0d1d472232db7', '1', '13909.8', '977.2', null, '12932.6', 'EXPENSE', null, '结果', '--', '2016-11-09 22:05:09', '2016-11-09 22:05:09', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('bfd56e9858aa4fe18d5226230e7f6c70', '1', '12932.6', '953.2', null, '11979.4', 'EXPENSE', null, '结果', '--', '2016-11-11 00:25:26', '2016-11-11 00:25:26', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('9e0d6a4080e64e428be95ee28a997fd9', '1', '11979.4', '920.2', null, '11059.2', 'EXPENSE', null, '结果', '--', '2016-11-11 01:30:22', '2016-11-11 01:30:22', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('1528868fb8d5442ebfa640a0eaac3df1', '1', '11059.2', '914.7', null, '10144.5', 'EXPENSE', null, '结果', '--', '2016-11-11 01:31:12', '2016-11-11 01:31:12', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('b09d3a7f4e2f41aaa85ea805a0da72f8', '1', '10144.5', '909.7', null, '9234.8', 'EXPENSE', null, '结果', '--', '2016-11-11 01:37:41', '2016-11-11 01:37:41', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('3351dadc0a974125a276ab84d9106a4d', '1', '9234.8', '903.2', null, '8331.6', 'EXPENSE', null, '结果', '--', '2016-11-11 10:57:27', '2016-11-11 10:57:27', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('6595bada9879424db6d898da7673462a', '1', '8331.6', '899.2', null, '7432.4', 'EXPENSE', null, '结果', '--', '2016-11-11 13:11:27', '2016-11-11 13:11:27', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('5807d4c61f804ee6aee777459f30cbd4', '1', '20000', '1034.7', null, '18965.3', 'EXPENSE', null, '结果', '--', '2016-11-06 18:16:31', '2016-11-06 18:16:31', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('db2ab49acf9c47d1b45130934b0ae84a', '1', '18965.3', '1027.2', null, '17938.1', 'EXPENSE', null, '结果', '--', '2016-11-06 18:16:51', '2016-11-06 18:16:51', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('c5a23033c9b9426abea46844e336f8e1', '1', '17938.1', '1019.2', null, '16918.9', 'EXPENSE', null, '结果', '--', '2016-11-06 18:24:53', '2016-11-06 18:24:53', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('122b22e0b2944bc59474a2d622bd67f9', '1', '16918.9', '1011.2', null, '15907.7', 'EXPENSE', null, '结果', '--', '2016-11-06 18:25:11', '2016-11-06 18:25:11', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('490124417b994882b34c7dc8585d442c', '1', '15907.7', '1003.2', null, '14904.5', 'EXPENSE', null, '结果', '--', '2016-11-06 18:25:46', '2016-11-06 18:25:46', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('0d126e8b69e244eb928eaec3f8e2ec78', '1', '7432.4', '896.2', null, '6536.2', 'EXPENSE', null, '结果', '--', '2016-11-11 13:50:54', '2016-11-11 13:50:54', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('2d87b35236774dbab24a88af9f3c2e10', '1', '6536.2', '891.2', null, '5645.0', 'EXPENSE', null, '结果', '--', '2016-11-12 14:28:40', '2016-11-12 14:28:40', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('6830a64eacc440bb891c6abe57bfdcfe', '1', '5645.0', '884.5', null, '4760.5', 'EXPENSE', null, '结果', '--', '2016-11-12 21:53:07', '2016-11-12 21:53:07', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('3815ed39162d4feea1b99bea300c993c', '1', '4760.5', '881.3', null, '3879.2', 'EXPENSE', null, '结果', '--', '2016-11-12 21:56:57', '2016-11-12 21:56:57', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('f9887dbe9ea14a2c87d09b91a8a1cc88', '1', '3879.2', '878.1', null, '3001.1', 'EXPENSE', null, '结果', '--', '2016-11-12 22:13:34', '2016-11-12 22:13:34', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('af9a5e56f54b4091a8b9014c5111e68e', '1', '3001.1', '870.6', null, '2130.5', 'EXPENSE', null, '结果', '--', '2016-11-12 22:24:11', '2016-11-12 22:24:11', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('0a64434113c84f83a60e09c03f55f9cf', '1', '2130.5', '865.6', null, '1264.9', 'EXPENSE', null, '结果', '--', '2016-11-12 22:26:24', '2016-11-12 22:26:24', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('057b9576f9864a659967c333dcfd1458', '1', '1264.9', '861.6', null, '403.3', 'EXPENSE', null, '结果', '--', '2016-11-12 23:40:15', '2016-11-12 23:40:15', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('71a7294200e445ed91e943940d437868', '1', '403.3', '5.0', null, '398.3', 'EXPENSE', null, '结果', '--', '2016-11-13 21:24:15', '2016-11-13 21:24:15', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('c8e9a5461296438d977052f076386196', '1', '398.3', '5.5', null, '392.8', 'EXPENSE', null, '结果', '--', '2016-11-14 17:24:49', '2016-11-14 17:24:49', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('cd6d80f3301946f0bf784206923dbe7b', '1', '392.8', '4.0', null, '388.8', 'EXPENSE', null, '结果', '--', '2016-11-16 17:51:50', '2016-11-16 17:51:50', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('a009df4469fc49e2bae5a66c5cd6eb0f', '1', '388.8', '4.0', null, '384.8', 'EXPENSE', null, '结果', '--', '2016-11-17 14:52:14', '2016-11-17 14:52:14', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('9b3536e6ca0f46029c602d2a5e1e8124', '1', '384.8', '4.0', null, '380.8', 'EXPENSE', null, '结果', '--', '2016-11-17 16:09:14', '2016-11-17 16:09:14', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('4c62b3a221034da3bf4c6110eae225bb', '1', '380.8', '3.5', null, '377.3', 'EXPENSE', null, '结果', '--', '2016-11-17 16:09:55', '2016-11-17 16:09:55', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('cabfd473107f41f9b60970474395c8b4', '1', '377.3', '3.0', null, '374.3', 'EXPENSE', null, '结果', '--', '2016-11-17 16:23:51', '2016-11-17 16:23:51', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('27f73a82ca2d40efb06b5c51f8a201bb', '1', '374.3', '4.5', null, '369.8', 'EXPENSE', null, '结果', '--', '2016-11-17 16:45:00', '2016-11-17 16:45:00', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('1092410df27343118c456af9bb0f3865', '1', '369.8', '8.5', null, '361.3', 'EXPENSE', null, '结果', '--', '2016-11-17 23:32:29', '2016-11-17 23:32:29', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('dcceb4f4db734715aeaa07450b422097', '1', '361.3', '3.5', null, '357.8', 'EXPENSE', null, '结果', '--', '2016-11-18 20:48:20', '2016-11-18 20:48:20', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('e85bd1de5b3741e5bdbbf3c3e4f2b581', '1', '357.8', '3.5', null, '354.3', 'EXPENSE', null, '结果', '--', '2016-11-18 20:59:17', '2016-11-18 20:59:17', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('e5a82c5c5ad84eaf866f3cddd8410b1e', '1', '354.3', '5.0', null, '349.3', 'EXPENSE', null, '结果', '--', '2016-11-18 22:40:56', '2016-11-18 22:40:56', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('8b7da8a7a707497792e5e4a1a9aaf748', '1', '349.3', '5.0', null, '344.3', 'EXPENSE', null, '结果', '--', '2016-11-18 22:43:46', '2016-11-18 22:43:46', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('e60f80f4ef394f4cb10f199254af8209', '1', '344.3', '41.0', null, '303.3', 'EXPENSE', null, '结果', '--', '2016-11-18 22:46:41', '2016-11-18 22:46:41', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('6dd0ee70f42542ab9c5f189be07e28f8', '1', '303.3', '3.0', null, '300.3', 'EXPENSE', null, '结果', '--', '2016-11-18 23:56:39', '2016-11-18 23:56:39', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('cc3eb6209c8f4f168c1ae602222aa945', '1', '300.3', '3.5', null, '296.8', 'EXPENSE', null, '结果', '--', '2016-11-19 00:02:08', '2016-11-19 00:02:08', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('1c3fc888c16a4f06a5c7ac4c33387e11', '1', '296.8', '2.5', null, '294.3', 'EXPENSE', null, '结果', '--', '2016-11-19 00:13:20', '2016-11-19 00:13:20', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('e640d2bcbfdf4ec79eceaaece92d8207', '1', '294.3', '2.5', null, '291.8', 'EXPENSE', null, '结果', '--', '2016-11-19 00:14:19', '2016-11-19 00:14:19', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('0707791360674b72bc55cec506d94fc8', '1', '291.8', '3.0', null, '288.8', 'EXPENSE', null, '结果', '--', '2016-11-19 00:31:25', '2016-11-19 00:31:25', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('65f65e26beab4e3780d2fe7d413ff55b', '1', '288.8', '4.0', null, '284.8', 'EXPENSE', null, '结果', '--', '2016-11-19 00:52:45', '2016-11-19 00:52:45', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('fb52abef72d44a61bbbd056ef10890e8', '1', '284.8', '3.0', null, '281.8', 'EXPENSE', null, '结果', '--', '2016-11-19 02:36:35', '2016-11-19 02:36:35', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('c3c69e10e1f3467fae839432e302c703', '1', '281.8', '4.0', null, '277.8', 'EXPENSE', null, '结果', '--', '2016-11-19 03:27:17', '2016-11-19 03:27:17', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('d9baf4686ad54af497b14ea9cd8e7de4', '1', '277.8', '4.0', null, '273.8', 'EXPENSE', null, '结果', '--', '2016-11-19 10:26:47', '2016-11-19 10:26:47', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('7757fe24018643efb90afb0e54724568', '1', '273.8', '5.5', null, '268.3', 'EXPENSE', null, '结果', '--', '2016-11-19 16:10:51', '2016-11-19 16:10:51', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('0b85d7d18e9c4a3ca9eebc18fb965b1c', '1', '268.3', '2', null, '266.3', 'EXPENSE', null, '下单花费2元', '--', '2016-11-19 23:29:56', '2016-11-19 23:29:56', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('6e7106570b474a1f986f477cb28328bb', '1', '266.3', '3.0', null, '263.3', 'EXPENSE', null, '下单花费3.0元', '--', '2016-11-19 23:33:13', '2016-11-19 23:33:13', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('ccdfdf1711404fc3a96caa5294c94b52', '1', '263.3', '3.0', null, '260.3', 'EXPENSE', null, '下单花费3.0元', '--', '2016-11-20 01:40:50', '2016-11-20 01:40:50', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('0657bcbde6f048a896d297218933619f', '1', '260.3', '4.0', null, '256.3', 'EXPENSE', null, '下单花费4.0元', '--', '2016-11-20 01:41:35', '2016-11-20 01:41:35', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('55c2793fad9145b9be3fc369759d6031', '1', '256.3', '3.0', null, '253.3', 'EXPENSE', null, '下单花费3.0元', '--', '2016-11-20 01:46:12', '2016-11-20 01:46:12', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('f8800901b861499d89eae6da96b433d2', '1', '253.3', '6.0', null, '247.3', 'EXPENSE', null, '下单花费6.0元', '--', '2016-11-20 01:50:07', '2016-11-20 01:50:07', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('ab7f323ebf114bc099091908db051120', '1', '247.3', '5.0', null, '242.3', 'EXPENSE', null, '下单花费5.0元', '--', '2016-11-20 01:55:12', '2016-11-20 01:55:12', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('b35453036d1e41e386a36fd4f50aa734', '1', '242.3', '2.5', null, '239.8', 'EXPENSE', null, '下单花费2.5元', '--', '2016-11-20 01:55:59', '2016-11-20 01:55:59', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('d4d382f6d62641468f606a530a94fb17', '1', '239.8', '30.0', null, '209.8', 'EXPENSE', null, '下单花费30.0元', '--', '2016-11-20 01:59:27', '2016-11-20 01:59:27', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('4074b0252f884c82a12f50091032ff09', '1', '209.8', '3.0', null, '206.8', 'EXPENSE', null, '下单花费3.0元', '--', '2016-11-20 02:42:28', '2016-11-20 02:42:28', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('c96eb8987ae5418ca816f30f332ca8b6', '1', '206.8', '27.5', null, '179.3', 'EXPENSE', null, '下单花费27.5元', '--', '2016-11-20 16:10:20', '2016-11-20 16:10:20', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('92bbdc7684ef4aef954b63efcd5b0cab', '1', '179.3', '6.0', null, '173.3', 'EXPENSE', null, '下单花费6.0元', '--', '2016-11-20 20:31:19', '2016-11-20 20:31:19', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('1011372eba2c48f0a7af58b9ab5da1de', '1', '173.3', '7.5', null, '165.8', 'EXPENSE', null, '下单花费7.5元', '--', '2016-11-20 22:39:33', '2016-11-20 22:39:33', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('1e50056d6c9744439f69b9bd852bb34d', '1', '165.8', '7.0', null, '158.8', 'EXPENSE', null, '下单花费7.0元', '--', '2016-11-20 22:45:55', '2016-11-20 22:45:55', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('ac8128ae6a694ccabb2a19f3aa27ddb4', '1', '158.8', '5.0', null, '153.8', 'EXPENSE', null, '下单花费5.0元', '--', '2016-11-20 23:07:30', '2016-11-20 23:07:30', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('3d61aa03ac74423ba8164902ccbdde42', '1', '153.8', '3.0', null, '150.8', 'EXPENSE', null, '下单花费3.0元', '--', '2016-11-21 00:39:19', '2016-11-21 00:39:19', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('58798e1ca8d24a26a4b1498858176c22', '1', '150.8', '3.0', null, '147.8', 'EXPENSE', null, '下单花费3.0元', '--', '2016-11-21 00:40:14', '2016-11-21 00:40:14', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('e48b2819d09d420d8558245cb8b1f6d4', '1', '147.8', '3.5', null, '144.3', 'EXPENSE', null, '下单花费3.5元', '--', '2016-11-21 12:57:36', '2016-11-21 12:57:36', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('7804064d91ee43f89829f227ade849c1', '1', '144.3', '3.0', null, '141.3', 'EXPENSE', null, '下单花费3.0元', '--', '2016-11-21 23:58:11', '2016-11-21 23:58:11', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('5d85e911d15b4a34941fb826e5628803', '1', '141.3', '3.0', null, '138.3', 'EXPENSE', null, '下单花费3.0元', '--', '2016-11-21 23:59:03', '2016-11-21 23:59:03', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('7d2b1864e7d24b248285565349ea19d8', '1', '138.3', '56.5', null, '81.8', 'EXPENSE', null, '下单花费56.5元', '--', '2016-11-22 00:34:02', '2016-11-22 00:34:02', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('fc885bf1fa1e4004966c4256784b06c7', '1', '81.8', '30.5', null, '51.3', 'EXPENSE', null, '下单花费30.5元', '--', '2016-11-22 00:36:34', '2016-11-22 00:36:34', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('7568b06f9f874c4ead1e592271df932c', '1', '51.3', '5.0', null, '46.3', 'EXPENSE', null, '下单花费5.0元', '--', '2016-11-23 23:58:33', '2016-11-23 23:58:33', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('5b4d0cfe2ad64f0396467203a316183a', '1', '51.3', '5.0', null, '46.3', 'EXPENSE', null, '下单花费5.0元', '--', '2016-11-23 23:58:33', '2016-11-23 23:58:33', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('68208def8edb43449d3c414384a31bc8', '1', '46.3', '5.0', null, '41.3', 'EXPENSE', null, '下单花费5.0元', '--', '2016-11-24 00:00:26', '2016-11-24 00:00:26', 'NORMAL');\nINSERT INTO `cash_record` VALUES ('bc684dc0fe094e5e86516c31543b8c01', '1', '41.3', '2', null, '39.3', 'EXPENSE', null, '下单花费2.0元', '--', '2016-11-24 00:01:00', '2016-11-24 00:01:00', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for city\n-- ----------------------------\nDROP TABLE IF EXISTS `city`;\nCREATE TABLE `city` (\n  `id` varchar(255) DEFAULT NULL,\n  `city` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of city\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for comment\n-- ----------------------------\nDROP TABLE IF EXISTS `comment`;\nCREATE TABLE `comment` (\n  `id` varchar(64) NOT NULL,\n  `order_detail_id` varchar(255) DEFAULT NULL,\n  `product_id` varchar(255) DEFAULT NULL,\n  `account_id` varchar(255) DEFAULT NULL,\n  `title` varchar(255) DEFAULT NULL,\n  `content` varchar(255) DEFAULT NULL,\n  `useful` varchar(255) DEFAULT NULL,\n  `useless` varchar(255) DEFAULT NULL,\n  `parent_id` int(11) DEFAULT NULL,\n  `product_score` varchar(255) DEFAULT NULL,\n  `delivery_score` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of comment\n-- ----------------------------\nINSERT INTO `comment` VALUES ('1', '1', '1', '1', '-', '很好吃！', '1', '0', '0', '99', '96', '备注', '2016-10-10 14:03:23', '2016-10-10 14:03:29', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for country\n-- ----------------------------\nDROP TABLE IF EXISTS `country`;\nCREATE TABLE `country` (\n  `id` varchar(255) DEFAULT NULL,\n  `name` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of country\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for coupon\n-- ----------------------------\nDROP TABLE IF EXISTS `coupon`;\nCREATE TABLE `coupon` (\n  `id` varchar(255) NOT NULL,\n  `name` varchar(255) DEFAULT NULL,\n  `type` varchar(255) DEFAULT NULL,\n  `face_value` varchar(255) DEFAULT NULL,\n  `delay_day` varchar(255) DEFAULT NULL,\n  `is_free` tinyint(4) DEFAULT NULL,\n  `is_reuse` tinyint(4) DEFAULT NULL,\n  `enough_money` varchar(255) DEFAULT NULL,\n  `discount` varchar(255) DEFAULT NULL,\n  `include_group` varchar(255) DEFAULT NULL,\n  `exclude_group` varchar(255) DEFAULT NULL,\n  `begin_time` datetime DEFAULT NULL,\n  `end_time` datetime DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of coupon\n-- ----------------------------\nINSERT INTO `coupon` VALUES ('1', '馍店代金券', 'LUCKYMONEY', '0.5', '0', '0', '0', '5', '0', '', '', '2016-11-08 13:50:28', '2016-11-30 13:50:31', '--', '2016-11-08 13:50:44', '2016-11-08 13:50:46', 'NORMAL');\nINSERT INTO `coupon` VALUES ('2', '红包', 'LUCKYMONEY', '5', '0', '0', '0', '50', '0', '', '', '2016-11-08 13:52:43', '2016-11-08 13:52:45', '--', '2016-11-08 13:52:49', '2016-11-08 13:52:52', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for coupon_code\n-- ----------------------------\nDROP TABLE IF EXISTS `coupon_code`;\nCREATE TABLE `coupon_code` (\n  `id` varchar(255) NOT NULL,\n  `coupon_id` varchar(255) DEFAULT NULL,\n  `code` varchar(255) DEFAULT NULL,\n  `account_id` varchar(255) DEFAULT NULL,\n  `is_used` tinyint(4) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of coupon_code\n-- ----------------------------\nINSERT INTO `coupon_code` VALUES ('1', '1', '123456789', '1', '1', '--', '2016-11-08 13:47:52', '2016-11-27 00:20:24', 'NORMAL');\nINSERT INTO `coupon_code` VALUES ('2', '2', 'wwwwwqwdqdwq', '1', '1', '--', '2016-11-08 13:53:32', '2016-11-22 00:34:02', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for coupon_history\n-- ----------------------------\nDROP TABLE IF EXISTS `coupon_history`;\nCREATE TABLE `coupon_history` (\n  `id` varchar(255) NOT NULL,\n  `code` varchar(255) DEFAULT NULL,\n  `tx_behavior` varchar(255) DEFAULT NULL,\n  `account_id` varchar(255) DEFAULT NULL,\n  `is_send_used` tinyint(4) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of coupon_history\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for coupon_record\n-- ----------------------------\nDROP TABLE IF EXISTS `coupon_record`;\nCREATE TABLE `coupon_record` (\n  `id` varchar(255) NOT NULL,\n  `account_id` varchar(255) DEFAULT NULL,\n  `coupon_code_id` varchar(255) DEFAULT NULL,\n  `tx_type` varchar(255) DEFAULT NULL,\n  `behavior_id` varchar(255) DEFAULT NULL,\n  `tx_result` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of coupon_record\n-- ----------------------------\nINSERT INTO `coupon_record` VALUES ('acec1e84f17040a79a3b20cfb975a598', null, '1', '支出', null, '结果', '--', '2016-10-13 11:30:22', '2016-10-13 11:30:22', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('222d133a3af94da49f0d2634f6931a82', null, '1', '支出', null, '结果', '--', '2016-10-13 11:32:55', '2016-10-13 11:32:55', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('a751b07417bb4444ba6a5387440774d0', null, '1', '支出', null, '结果', '--', '2016-10-13 11:43:15', '2016-10-13 11:43:15', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('a64e829ad3a44430a1e6e4b2975babfd', null, '1', '支出', null, '结果', '--', '2016-10-17 15:34:54', '2016-10-17 15:34:54', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('600ce6aa01584900b597cec072036537', null, '1', '支出', null, '结果', '--', '2016-11-06 00:27:08', '2016-11-06 00:27:08', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('4677536171b841fb8f4e3e3c9860206b', null, '1', '支出', null, '结果', '--', '2016-11-06 00:31:06', '2016-11-06 00:31:06', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('1ea0c3dd27ba412b8a629af2bf80d13b', null, '1', '支出', null, '结果', '--', '2016-11-06 00:32:32', '2016-11-06 00:32:32', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('865d61bdef3e4703ba6ae64a4c853b16', null, '1', '支出', null, '结果', '--', '2016-11-06 00:35:18', '2016-11-06 00:35:18', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('ea8f1b3004ff4e3884d1c712d3df036d', null, '1', '支出', null, '结果', '--', '2016-11-06 00:36:34', '2016-11-06 00:36:34', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('d6255031ddf2463db4f141044b021b8b', null, '1', '支出', null, '结果', '--', '2016-11-06 00:36:53', '2016-11-06 00:36:53', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('3b6597dbbc4347798f4b3bb021c85511', null, '1', '支出', null, '结果', '--', '2016-11-06 00:39:09', '2016-11-06 00:39:09', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('ac31ef0fa92f41049101507293dc2549', null, '1', '支出', null, '结果', '--', '2016-11-06 00:45:20', '2016-11-06 00:45:20', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('85fe7a3d8faf4516985aa0c6cc576e1d', null, '1', '支出', null, '结果', '--', '2016-11-06 17:47:03', '2016-11-06 17:47:03', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('e4ed80eec63b4ab4a4c88b4c930fa497', null, '1', '支出', null, '结果', '--', '2016-11-06 17:49:41', '2016-11-06 17:49:41', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('e469f2e5535747a99f7120ad2112a3fc', null, '1', '支出', null, '结果', '--', '2016-11-06 17:51:41', '2016-11-06 17:51:41', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('4f2f3bcc78984344868ad5edf8bdbc62', null, '1', '支出', null, '结果', '--', '2016-11-06 17:57:00', '2016-11-06 17:57:00', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('1cabad6934cf42679c278fad259773e1', null, '1', '支出', null, '结果', '--', '2016-11-06 17:58:26', '2016-11-06 17:58:26', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('cb49bf66ead34bbe856a2c833f9282fe', null, '1', '支出', null, '结果', '--', '2016-11-06 17:58:41', '2016-11-06 17:58:41', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('25f9b518c607460cba2e14567cdbb841', null, '1', '支出', null, '结果', '--', '2016-11-06 18:04:28', '2016-11-06 18:04:28', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('40777784f88049f382c21c1f1e033ecd', null, '1', '支出', null, '结果', '--', '2016-11-06 18:16:30', '2016-11-06 18:16:30', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('28b88481484a4b3c9a29df9e99d80557', null, '1', '支出', null, '结果', '--', '2016-11-06 18:16:51', '2016-11-06 18:16:51', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('2ca369e1c5f642d1a1f533c813456bb7', null, '1', '支出', null, '结果', '--', '2016-11-06 18:24:53', '2016-11-06 18:24:53', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('82396a04dd3345f9b5ac3de11b3a2f5c', null, '1', '支出', null, '结果', '--', '2016-11-06 18:25:11', '2016-11-06 18:25:11', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('f92fdd4727374aeeb1f398b432274f9f', null, '1', '支出', null, '结果', '--', '2016-11-06 18:25:46', '2016-11-06 18:25:46', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('205b1e169ca34261af743e33a0bc75b7', null, '1', '支出', null, '结果', '--', '2016-11-06 22:01:23', '2016-11-06 22:01:23', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('a1a1a2fad1084c7882eafeae77935ae0', null, '1', '支出', null, '结果', '--', '2016-11-06 22:01:27', '2016-11-06 22:01:27', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('507a74db73d842b680e08fb53b7eb52a', '1', '1', '支出', null, '结果', '--', '2016-11-09 22:05:09', '2016-11-09 22:05:09', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('9012077c63474f32beec9b08224327bd', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-10 21:17:53', '2016-11-10 21:17:53', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('6d7a4f8cb11e4172a3b66203506314bf', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-10 21:20:07', '2016-11-10 21:20:07', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('a2d7d26306294fffbfa51d7c15ac2337', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-10 21:21:41', '2016-11-10 21:21:41', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('4f5f46fdb6a44f2d96081448e5190d39', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-10 21:22:29', '2016-11-10 21:22:29', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('38b3a979c49e42c6b0ae8feca8b5b668', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-10 21:22:46', '2016-11-10 21:22:46', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('d229b577b3ac42369d1572a8f84c40c0', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-10 21:23:23', '2016-11-10 21:23:23', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('c369ba2efb3b49ee9e427d73ba6dddae', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-10 21:23:42', '2016-11-10 21:23:42', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('0cf60125c8a042bd81c6015ada0b848f', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-10 21:24:18', '2016-11-10 21:24:18', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('23e0d369e3cc4457a2f3e949970c3764', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-10 21:24:40', '2016-11-10 21:24:40', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('dd52c5719bd74a17b8085524ea031cf7', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-10 21:25:03', '2016-11-10 21:25:03', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('5c460cacc10e41b88194ffb56b5d8934', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-10 22:58:37', '2016-11-10 22:58:37', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('51342392fc0c4cfa88a3f29251cf2a77', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-11 00:25:26', '2016-11-11 00:25:26', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('134341c7e1914748960f035c6b4f7674', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-11 10:57:27', '2016-11-11 10:57:27', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('90660e6b2e434263abf874288b584c8d', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-12 14:28:40', '2016-11-12 14:28:40', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('75a46fc492f24e1ea2919e497717596f', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-12 22:24:11', '2016-11-12 22:24:11', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('3c095de2c80c4718bb6f3e75d3a6126b', '1', '2', '支出', null, '消费一张优惠券金额为5.0', '--', '2016-11-12 22:38:26', '2016-11-12 22:38:26', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('6255e19309bc4195930e269b4d40aca1', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-13 19:00:25', '2016-11-13 19:00:25', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('c945afc5274d4869b275da0cf390bcd0', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-17 23:32:29', '2016-11-17 23:32:29', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('085c2ab2b8604a3082b622c8669f3bea', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-18 22:40:56', '2016-11-18 22:40:56', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('ee451138462040638cba3102c8053672', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-18 22:46:41', '2016-11-18 22:46:41', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('a49c6a9e12124538bc22647156e009a7', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-19 22:36:07', '2016-11-19 22:36:07', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('638104e449014aa8ba66cc6ad3ecc81e', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-19 22:44:56', '2016-11-19 22:44:56', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('75acaf057d634862ad77bc0820ff0494', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-19 22:53:40', '2016-11-19 22:53:40', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('5ea1ed4e78704fe3a449d34a9d11dc79', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-19 22:56:04', '2016-11-19 22:56:04', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('cbd21b3061ad46bcbd358ae7d7119060', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-19 23:01:29', '2016-11-19 23:01:29', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('05c56d8a6a514bf1858dbb9619ed1bc1', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-20 16:10:20', '2016-11-20 16:10:20', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('7caf63430c714e479afda9d1c228fdc1', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-20 22:45:55', '2016-11-20 22:45:55', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('37b1dbd72f4540f480c5e0b9f97f3190', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-21 01:26:53', '2016-11-21 01:26:53', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('b7c71f07f7b2427ca8dc2d7e1f5f4ccf', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-21 01:27:48', '2016-11-21 01:27:48', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('45f2ae1e64d4468787291871faca1756', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-21 01:29:01', '2016-11-21 01:29:01', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('e1be988d5e6a43ddb5bc5c0adc1799d3', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-21 22:59:45', '2016-11-21 22:59:45', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('77f8e4e2e1f84807bdb9d146fde65fcb', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-21 23:17:11', '2016-11-21 23:17:11', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('491bdc9564404771bf3ee646eaf73059', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-21 23:21:47', '2016-11-21 23:21:47', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('84e6f37251ae4992afb3f7da6cc1ca97', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-21 23:40:00', '2016-11-21 23:40:00', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('ef4ae910626f439491a122607ff2218b', '1', '2', '支出', null, '消费一张优惠券金额为5.0', '--', '2016-11-22 00:34:02', '2016-11-22 00:34:02', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('530f051a5815491c93206ef13b0120cc', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-23 01:39:46', '2016-11-23 01:39:46', 'NORMAL');\nINSERT INTO `coupon_record` VALUES ('93abf1a13bf8455a905151853ce16610', '1', '1', '支出', null, '消费一张优惠券金额为0.5', '--', '2016-11-27 00:20:24', '2016-11-27 00:20:24', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for delivery_address\n-- ----------------------------\nDROP TABLE IF EXISTS `delivery_address`;\nCREATE TABLE `delivery_address` (\n  `id` varchar(255) NOT NULL,\n  `account_id` varchar(255) DEFAULT NULL,\n  `region_province_id` varchar(255) DEFAULT NULL,\n  `region_country_id` varchar(255) DEFAULT NULL,\n  `region_city_id` varchar(255) DEFAULT NULL,\n  `consignee` varchar(255) DEFAULT NULL,\n  `address` varchar(255) DEFAULT NULL,\n  `mobile` varchar(255) DEFAULT NULL,\n  `sex` varchar(6) DEFAULT NULL,\n  `tag` varchar(8) DEFAULT NULL,\n  `telephone` varchar(255) DEFAULT NULL,\n  `email` varchar(255) DEFAULT NULL,\n  `post_code` varchar(255) DEFAULT NULL,\n  `is_default` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of delivery_address\n-- ----------------------------\nINSERT INTO `delivery_address` VALUES ('1', '1', '1', '1', '1', '收货人1', '孙寺', '1860000001', 'MAN', '家', '05308911051', null, '274200', '1', '--', '2016-10-11 11:39:18', '2016-10-11 11:39:20', 'NORMAL');\nINSERT INTO `delivery_address` VALUES ('2', '1', '1', '1', '6', '收货人2', '单县', '13900000001', 'WOMAN', '公司', '05308600000', null, '274200', '0', '--', '2016-10-11 11:40:30', '2016-10-11 11:40:33', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for delivery_time\n-- ----------------------------\nDROP TABLE IF EXISTS `delivery_time`;\nCREATE TABLE `delivery_time` (\n  `id` varchar(255) NOT NULL,\n  `name` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of delivery_time\n-- ----------------------------\nINSERT INTO `delivery_time` VALUES ('1', '明天10:00-18:00', '--', '2016-10-10 14:07:01', '2016-10-10 14:06:59', 'NORMAL');\nINSERT INTO `delivery_time` VALUES ('2', '今天10:00-18:00', '--', '2016-10-10 14:10:14', '2016-10-10 14:10:16', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for delivery_type\n-- ----------------------------\nDROP TABLE IF EXISTS `delivery_type`;\nCREATE TABLE `delivery_type` (\n  `id` varchar(255) NOT NULL,\n  `name` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of delivery_type\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for email_template\n-- ----------------------------\nDROP TABLE IF EXISTS `email_template`;\nCREATE TABLE `email_template` (\n  `id` int(11) DEFAULT NULL,\n  `type` varchar(255) DEFAULT NULL,\n  `content` varchar(255) DEFAULT NULL,\n  `is_enable` tinyint(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of email_template\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for flow_status\n-- ----------------------------\nDROP TABLE IF EXISTS `flow_status`;\nCREATE TABLE `flow_status` (\n  `id` varchar(255) NOT NULL,\n  `name` varchar(255) DEFAULT NULL,\n  `pre_status_id` varchar(255) DEFAULT NULL,\n  `next_status_id` varchar(255) DEFAULT NULL,\n  `pay_way` varchar(255) DEFAULT NULL,\n  `order_by` int(11) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of flow_status\n-- ----------------------------\nINSERT INTO `flow_status` VALUES ('1', '未付款', '', '2', 'ONLINE', '1', '正常流程', '2016-11-15 23:14:02', '2016-11-15 23:14:04', 'NORMAL');\nINSERT INTO `flow_status` VALUES ('2', '已付款', '1', '3', 'ONLINE', '2', '正常流程', '2016-11-15 23:14:51', '2016-11-15 23:14:54', 'NORMAL');\nINSERT INTO `flow_status` VALUES ('3', '拣货中', '2', '4', 'ONLINE', '3', '正常流程', '2016-11-15 23:15:41', '2016-11-15 23:15:44', 'NORMAL');\nINSERT INTO `flow_status` VALUES ('4', '配送中', '3', '5', 'ONLINE', '4', '正常流程', '2016-11-15 23:16:41', '2016-11-15 23:16:44', 'NORMAL');\nINSERT INTO `flow_status` VALUES ('5', '派件中', '4', '6', 'ONLINE', '5', '正常流程', '2016-11-15 23:17:14', '2016-11-15 23:17:20', 'NORMAL');\nINSERT INTO `flow_status` VALUES ('6', '已送达', '5', '', 'ONLINE', '6', '正常流程', '2016-11-15 23:17:16', '2016-11-15 23:17:23', 'NORMAL');\nINSERT INTO `flow_status` VALUES ('7', '货到付款', '', '8', 'OFFLINE', '1', '正常流程', '2016-11-15 23:15:41', '2016-11-15 23:15:44', 'NORMAL');\nINSERT INTO `flow_status` VALUES ('8', '拣货中', '7', '9', 'OFFLINE', '2', '正常流程', '2016-11-16 22:27:47', '2016-11-16 22:27:50', 'NORMAL');\nINSERT INTO `flow_status` VALUES ('9', '配送中', '8', '10', 'OFFLINE', '3', '正常流程', '2016-11-15 23:16:41', '2016-11-15 23:16:44', 'NORMAL');\nINSERT INTO `flow_status` VALUES ('10', '派件中', '9', '11', 'OFFLINE', '4', '正常流程', '2016-11-15 23:17:14', '2016-11-15 23:17:20', 'NORMAL');\nINSERT INTO `flow_status` VALUES ('11', '已送达', '10', '', 'OFFLINE', '5', '正常流程', '2016-11-15 23:17:16', '2016-11-15 23:17:23', 'NORMAL');\nINSERT INTO `flow_status` VALUES ('12', '已失效', null, null, null, '1', '失败的流程', '2016-11-17 16:49:30', '2016-11-17 16:49:32', 'NORMAL');\nINSERT INTO `flow_status` VALUES ('13', '已退款', null, null, null, '2', '失败的流程', '2016-11-17 16:50:07', '2016-11-17 16:50:11', 'NORMAL');\nINSERT INTO `flow_status` VALUES ('14', '未送达', null, null, null, '3', '失败的流程', '2016-11-17 16:55:33', '2016-11-17 16:55:36', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for log\n-- ----------------------------\nDROP TABLE IF EXISTS `log`;\nCREATE TABLE `log` (\n  `id` varchar(64) NOT NULL,\n  `type` varchar(20) DEFAULT NULL,\n  `title` varchar(128) DEFAULT NULL,\n  `remote_addr` varchar(64) DEFAULT NULL,\n  `request_uri` varchar(128) DEFAULT NULL,\n  `method` varchar(16) DEFAULT NULL,\n  `params` varchar(128) DEFAULT NULL,\n  `user_agent` varchar(128) DEFAULT NULL,\n  `exception` varchar(256) DEFAULT NULL,\n  `username` varchar(64) DEFAULT NULL,\n  `begin_date` datetime DEFAULT NULL,\n  `end_date` datetime DEFAULT NULL,\n  `status` varchar(16) DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of log\n-- ----------------------------\nINSERT INTO `log` VALUES ('c3b65476d02a4ea2b73d963760e6f4d9', 'ACCESS', null, '0:0:0:0:0:0:0:1', null, 'GET', '', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0', '', 'cheng', null, null, 'NORMAL');\nINSERT INTO `log` VALUES ('39a1ed65627448d0a9c61291bc560da7', 'ACCESS', null, '0:0:0:0:0:0:0:1', null, 'GET', '', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0', '', 'cheng', null, null, 'NORMAL');\nINSERT INTO `log` VALUES ('c7f665813b0f4ccb9288495218167d22', 'ACCESS', null, '0:0:0:0:0:0:0:1', null, 'GET', '', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0', '', 'cheng', null, null, 'NORMAL');\nINSERT INTO `log` VALUES ('ec0b5ef6ce1f44579aaee60532bbfc23', 'ACCESS', null, '0:0:0:0:0:0:0:1', '/web/', 'GET', '', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0', '', 'cheng', null, null, 'NORMAL');\n\n-- ----------------------------\n-- Table structure for member\n-- ----------------------------\nDROP TABLE IF EXISTS `member`;\nCREATE TABLE `member` (\n  `id` varchar(255) NOT NULL,\n  `account_id` varchar(255) DEFAULT NULL,\n  `name` varchar(255) DEFAULT NULL,\n  `employer` tinyint(4) DEFAULT NULL,\n  `mobile` varchar(255) DEFAULT NULL,\n  `address` varchar(255) DEFAULT NULL,\n  `email` varchar(255) DEFAULT NULL,\n  `idcard` varchar(255) DEFAULT NULL,\n  `sex` varchar(255) DEFAULT NULL,\n  `birthday` varchar(255) DEFAULT NULL,\n  `region_province_id` int(11) DEFAULT NULL,\n  `region_city_id` int(11) DEFAULT NULL,\n  `region_country_id` int(11) DEFAULT NULL,\n  `telephone` varchar(255) DEFAULT NULL,\n  `post_code` varchar(255) DEFAULT NULL,\n  `income_month` varchar(255) DEFAULT NULL,\n  `job` varchar(255) DEFAULT NULL,\n  `hobby` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of member\n-- ----------------------------\nINSERT INTO `member` VALUES ('1', '1', '1', null, '18600536683', null, null, null, 'MAN', null, null, null, null, null, null, null, null, null, null, null, null, 'NORMAL');\nINSERT INTO `member` VALUES ('02a42a8619f3462ca9d87f871e4c7bf2', 'b42f14ce73d24541be4152b7d09cf855', null, null, '18600536687', null, null, null, 'UNKNOW', null, '0', '0', '0', null, null, null, null, null, '2016-11-26 16:57:36', '2016-11-26 16:57:36', '--', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for notice\n-- ----------------------------\nDROP TABLE IF EXISTS `notice`;\nCREATE TABLE `notice` (\n  `id` varchar(255) NOT NULL,\n  `title` varchar(255) DEFAULT NULL,\n  `content` varchar(255) DEFAULT NULL,\n  `link_url` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of notice\n-- ----------------------------\nINSERT INTO `notice` VALUES ('1', '通告1', '微信端上线了，敬请使用 ~ ~', 'http://www.zhihu.com', '备注', '2016-06-29 16:03:56', '2016-06-29 16:03:58', 'NORMAL');\nINSERT INTO `notice` VALUES ('2', '通告2', '兑换【饿了么】畅享美食红包 消耗20金币', 'http://www.baidu.com', '备注', '2016-06-29 16:32:02', '2016-06-29 16:32:08', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for order_info\n-- ----------------------------\nDROP TABLE IF EXISTS `order_info`;\nCREATE TABLE `order_info` (\n  `id` varchar(255) NOT NULL,\n  `account_id` varchar(255) DEFAULT NULL,\n  `oid` varchar(255) DEFAULT NULL,\n  `relate_oid` varchar(11) DEFAULT NULL,\n  `balance_offset` double DEFAULT NULL,\n  `amount_payable` double DEFAULT NULL,\n  `amount_paid` double DEFAULT NULL,\n  `consignee` varchar(255) DEFAULT NULL,\n  `mobile` varchar(255) DEFAULT NULL,\n  `address` varchar(255) DEFAULT NULL,\n  `delivery_time` varchar(255) DEFAULT NULL,\n  `pay` varchar(11) DEFAULT NULL,\n  `delivery_type_id` varchar(11) DEFAULT NULL,\n  `arayacak_address` varchar(255) DEFAULT NULL,\n  `arayacak_delivery_time` varchar(11) DEFAULT NULL,\n  `province` varchar(255) DEFAULT NULL,\n  `city` varchar(255) DEFAULT NULL,\n  `country` varchar(255) DEFAULT NULL,\n  `order_type` varchar(255) DEFAULT NULL,\n  `freight_reduce` varchar(255) DEFAULT NULL,\n  `freight_payable` varchar(255) DEFAULT NULL,\n  `product_total_price` decimal(10,0) DEFAULT NULL,\n  `discount` varchar(255) DEFAULT NULL,\n  `remark_customer` varchar(255) DEFAULT NULL,\n  `post_code` varchar(255) DEFAULT NULL,\n  `telephone` varchar(255) DEFAULT NULL,\n  `email` varchar(255) DEFAULT NULL,\n  `pay_time` datetime DEFAULT NULL,\n  `exchange_oid` int(11) DEFAULT NULL,\n  `custom_pice` varchar(255) DEFAULT NULL,\n  `coupon_code` varchar(255) DEFAULT NULL,\n  `coupon_reduce_price` decimal(10,0) DEFAULT NULL,\n  `flow_status` varchar(255) DEFAULT NULL,\n  `bonus_point_reduce_price` decimal(10,0) DEFAULT NULL,\n  `is_free_account_level` varchar(255) DEFAULT NULL,\n  `comment_id` varchar(255) DEFAULT NULL,\n  `since` tinyint(4) DEFAULT NULL,\n  `order_status` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL,\n  `pay_way` varchar(16) DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of order_info\n-- ----------------------------\nINSERT INTO `order_info` VALUES ('be5d8827c2354419bcf221d42fdf6553', '1', '33231469', null, null, '4.5', '0', null, '1860000001', '孙寺', '明天10:00-18:00', '货到付款', null, null, null, null, null, null, 'NORMAL', '2', '2', '5', '0', '', '274200', '05308911051', null, '2016-11-21 23:40:00', null, null, '123456789', '1', '7', '0', '0', null, '0', 'ONGOING', '--', '2016-11-21 23:40:00', '2016-11-21 23:40:00', 'NORMAL', 'OFFLINE');\nINSERT INTO `order_info` VALUES ('85d95e8ad5fd4d06908b2a86e4869635', '1', '21412883', null, '8.5', '6', '-2.5', null, '18600536683', '黄楼村南头', '今天10:00-18:00', '货到付款', null, null, null, null, null, null, 'NORMAL', '2', '0', '9', '0', '', null, null, null, '2016-11-17 23:32:29', null, null, '123456789', '1', '7', '0', '0', null, '1', 'ONGOING', '--', '2016-11-17 23:32:29', '2016-11-17 23:32:29', 'NORMAL', 'OFFLINE');\nINSERT INTO `order_info` VALUES ('e33fd89cec9c4a478061905c72a77c2a', '1', '64782083', null, '3.5', '3.5', '0', null, '1860000001', '孙寺', '明天10:00-18:00', '微信', null, null, null, null, null, null, 'NORMAL', '0', '2', '2', '0', '', '274200', '05308911051', null, '2016-11-18 20:48:20', null, null, null, '0', '1', '0', '0', null, '0', 'WAIT_PAY', '--', '2016-11-18 20:48:20', '2016-11-18 20:48:20', 'NORMAL', 'ONLINE');\nINSERT INTO `order_info` VALUES ('482cdf60d033421887776d53a3951c8a', '1', '25258853', null, '3.5', '3.5', '0', null, '1860000001', '孙寺', '今天10:00-18:00', '微信', null, null, null, null, null, null, 'NORMAL', '0', '2', '2', '0', '', '274200', '05308911051', null, '2016-11-18 20:59:17', null, null, null, '0', '1', '0', '0', null, '0', 'WAIT_PAY', '--', '2016-11-18 20:59:17', '2016-11-18 20:59:17', 'NORMAL', 'ONLINE');\nINSERT INTO `order_info` VALUES ('45a02081f5d9402f9d4ad3a6f09c3284', '1', '80995325', null, '5', '2.5', '-2.5', null, '1860000001', '孙寺', '明天10:00-18:00', '货到付款', null, null, null, null, null, null, 'NORMAL', '2', '0', '5', '0', '', '274200', '05308911051', null, '2016-11-18 22:40:56', null, null, '123456789', '1', '7', '0', '0', null, '0', 'ONGOING', '--', '2016-11-18 22:40:56', '2016-11-18 22:40:56', 'NORMAL', 'OFFLINE');\nINSERT INTO `order_info` VALUES ('4c99fe3abd04494f8c954e47699dc1c1', '1', '17337896', null, '3.5', '3.5', '0', null, '1860000001', '孙寺', '明天10:00-18:00', '货到付款', null, null, null, null, null, null, 'NORMAL', '0', '2', '2', '0', '啦啦啦啦', '274200', '05308911051', null, '2016-11-17 16:09:55', null, null, null, '0', '7-8-9-10-14', '0', '0', null, '0', 'CANCELED', '--', '2016-11-17 16:09:55', '2016-11-17 16:09:55', 'NORMAL', 'OFFLINE');\nINSERT INTO `order_info` VALUES ('7d46579c57d0416883f5d6110a379d71', '1', '16750448', null, '3', '3', '0', null, '1860000001', '孙寺', '明天10:00-18:00', '微信', null, null, null, null, null, null, 'NORMAL', '0', '2', '1', '0', '', '274200', '05308911051', null, '2016-11-17 16:22:31', null, null, null, '0', '1-2-3-4-5-6', '0', '0', null, '0', 'ONGOING', '--', '2016-11-17 16:22:35', '2016-11-17 16:22:35', 'NORMAL', 'ONLINE');\nINSERT INTO `order_info` VALUES ('871bda6c48ca4b5f88ee59338960fcf5', '1', '47402059', null, null, '5', '0', null, '1860000001', '孙寺', '明天10:00-18:00', '微信', null, null, null, null, null, null, 'NORMAL', '2', '2', '5', '0', '', '274200', '05308911051', null, '2016-11-21 23:45:49', null, null, null, '0', '1', '0', '0', null, '0', 'WAIT_PAY', '--', '2016-11-21 23:45:49', '2016-11-21 23:45:49', 'NORMAL', 'ONLINE');\nINSERT INTO `order_info` VALUES ('5a9e114f3aa64a8da090d7d224247cff', '1', '35815122', null, null, '4.5', '0', null, '1860000001', '孙寺', '明天10:00-18:00', '微信', null, null, null, null, null, null, 'NORMAL', '0', '2', '3', '0', '', '274200', '05308911051', null, '2016-11-21 23:53:49', null, null, null, '0', '1', '0', '0', null, '0', 'WAIT_PAY', '--', '2016-11-21 23:53:49', '2016-11-21 23:53:49', 'NORMAL', 'ONLINE');\nINSERT INTO `order_info` VALUES ('f3878d7c5bf145ad8082f7f95d09a6a5', '1', '06448107', null, null, '3.5', '0', null, '1860000001', '孙寺', '今天10:00-18:00', '微信', null, null, null, null, null, null, 'NORMAL', '0', '2', '2', '0', '', '274200', '05308911051', null, '2016-11-21 23:57:16', null, null, null, '0', '1', '0', '0', null, '0', 'WAIT_PAY', '--', '2016-11-21 23:57:16', '2016-11-21 23:57:16', 'NORMAL', 'ONLINE');\nINSERT INTO `order_info` VALUES ('d8f3ada21fd64333beb15ef7c7bf6f4c', '1', '41189458', null, null, '3.5', '0', null, '1860000001', '孙寺', '明天10:00-18:00', '货到付款', null, null, null, null, null, null, 'NORMAL', '0', '2', '2', '0', '', '274200', '05308911051', null, '2016-11-21 23:57:44', null, null, null, '0', '7', '0', '0', null, '0', 'ONGOING', '--', '2016-11-21 23:57:44', '2016-11-21 23:57:44', 'NORMAL', 'OFFLINE');\nINSERT INTO `order_info` VALUES ('dd730ec7772d4c8aba2525c31e08dced', '1', '50751194', null, '3', '3', '3', null, '1860000001', '孙寺', '明天10:00-18:00', '微信', null, null, null, null, null, null, 'NORMAL', '0', '2', '1', '0', '', '274200', '05308911051', null, '2016-11-21 23:58:11', null, null, null, '0', '1-2', '0', '0', null, '0', 'ONGOING', '--', '2016-11-21 23:58:11', '2016-11-21 23:58:11', 'NORMAL', 'ONLINE');\nINSERT INTO `order_info` VALUES ('a70c715169c14eac92d645de4709c516', '1', '55941406', null, '3', '3', '3', null, '1860000001', '孙寺', '明天10:00-18:00', '货到付款', null, null, null, null, null, null, 'NORMAL', '0', '2', '1', '0', '', '274200', '05308911051', null, '2016-11-21 23:59:03', null, null, null, '0', '7', '0', '0', null, '0', 'ONGOING', '--', '2016-11-21 23:59:03', '2016-11-21 23:59:03', 'NORMAL', 'OFFLINE');\nINSERT INTO `order_info` VALUES ('82f4f04dabc74037b95be0aedbe8997a', '1', '46299589', null, '56.5', '51.5', '56.5', null, '1860000001', '孙寺', '明天10:00-18:00', '支付宝', null, null, null, null, null, null, 'NORMAL', '2', '2', '57', '0', '', '274200', '05308911051', null, '2016-11-22 00:34:02', null, null, 'wwwwwqwdqdwq', '5', '1-2', '0', '0', null, '0', 'ONGOING', '--', '2016-11-22 00:34:02', '2016-11-22 00:34:02', 'NORMAL', 'ONLINE');\nINSERT INTO `order_info` VALUES ('98a735bb8a13422394551fa944b0a7c0', '1', '14528930', null, '30.5', '30.5', '30.5', null, '1860000001', '孙寺', '明天10:00-18:00', '微信', null, null, null, null, null, null, 'NORMAL', '2', '2', '31', '0', '', '274200', '05308911051', null, '2016-11-22 00:36:34', null, null, null, '0', '1-2', '0', '0', null, '0', 'ONGOING', '--', '2016-11-22 00:36:34', '2016-11-22 00:36:34', 'NORMAL', 'ONLINE');\nINSERT INTO `order_info` VALUES ('f77599f0d01c409fb9bd69c98c17df0d', '1', '05654801', null, null, '5.5', '0', null, '1860000001', '孙寺', '今天10:00-18:00', '货到付款', null, null, null, null, null, null, 'NORMAL', '0', '2', '4', '0', '', '274200', '05308911051', null, '2016-11-22 13:13:42', null, null, null, '0', '7', '0', '0', null, '0', 'ONGOING', '--', '2016-11-22 13:13:42', '2016-11-22 13:13:42', 'NORMAL', 'OFFLINE');\nINSERT INTO `order_info` VALUES ('02b7a9e577254f709fc6afb16e6ae00e', '1', '58927163', null, null, '10', '0', null, '1860000001', '孙寺', '明天10:00-18:00', '货到付款', null, null, null, null, null, null, 'NORMAL', '2', '2', '11', '0', '', '274200', '05308911051', null, '2016-11-23 01:39:46', null, null, '123456789', '1', '7', '0', '0', null, '0', 'ONGOING', '--', '2016-11-23 01:39:46', '2016-11-23 01:39:46', 'NORMAL', 'OFFLINE');\nINSERT INTO `order_info` VALUES ('03807d9304a945bfa8d82db7c0d59d86', '1', '63718652', null, '5', '5', '5', null, '13900000001', '单县', '明天10:00-18:00', '货到付款', null, null, null, null, null, null, 'NORMAL', '0', '2', '3', '0', '', '274200', '05308600000', null, '2016-11-23 23:58:33', null, null, null, '0', '7', '0', '0', null, '0', 'ONGOING', '--', '2016-11-23 23:58:33', '2016-11-23 23:58:33', 'NORMAL', 'OFFLINE');\nINSERT INTO `order_info` VALUES ('971d9d6a4258402299cffcfecdffed3c', '1', '33226048', null, '5', '5', '5', null, '13900000001', '单县', '明天10:00-18:00', '货到付款', null, null, null, null, null, null, 'NORMAL', '0', '2', '3', '0', '', '274200', '05308600000', null, '2016-11-23 23:58:33', null, null, null, '0', '7', '0', '0', null, '0', 'ONGOING', '--', '2016-11-23 23:58:33', '2016-11-23 23:58:33', 'NORMAL', 'OFFLINE');\nINSERT INTO `order_info` VALUES ('907cea6ce49443fabeafd0e366cbbb77', '1', '72580291', null, '5', '5', '5', null, '1860000001', '孙寺', '明天10:00-18:00', 'cheng', null, null, null, null, null, null, 'NORMAL', '2', '2', '5', '0', '', '274200', '05308911051', null, '2016-11-24 00:00:26', null, null, null, '0', '7', '0', '0', null, '0', 'ONGOING', '--', '2016-11-24 00:00:26', '2016-11-24 00:00:26', 'NORMAL', 'OFFLINE');\nINSERT INTO `order_info` VALUES ('cf4c9b11baf0450795e16eba88b6f9b0', '1', '87240530', null, '2', '2', '2', null, '1860000001', '孙寺', '明天10:00-18:00', '微信', null, null, null, null, null, null, 'NORMAL', '0', '2', '0', '0', '', '274200', '05308911051', null, '2016-11-24 00:01:00', null, null, null, '0', '1-2', '0', '0', null, '0', 'ONGOING', '--', '2016-11-24 00:01:00', '2016-11-24 00:01:00', 'NORMAL', 'ONLINE');\nINSERT INTO `order_info` VALUES ('fddab9948f4743149d8f6caaeb4aeace', '1', '08574631', null, null, '14.5', '0', null, '1860000001', '孙寺', '明天10:00-18:00', '微信', null, null, null, null, null, null, 'NORMAL', '2', '2', '15', '0', '', '274200', '05308911051', null, '2016-11-26 14:19:46', null, null, null, '0', '1', '0', '0', null, '0', 'WAIT_PAY', '--', '2016-11-26 14:19:46', '2016-11-26 14:19:46', 'NORMAL', 'ONLINE');\nINSERT INTO `order_info` VALUES ('82d13c36d06747888d55602e9ccb6890', '1', '50031248', null, null, '5.5', '0', null, '13900000001', '单县', '明天10:00-18:00', '货到付款', null, null, null, null, null, null, 'NORMAL', '2', '2', '6', '0', '', '274200', '05308600000', null, '2016-11-27 00:20:24', null, null, '123456789', '1', '7', '0', '0', null, '0', 'ONGOING', '--', '2016-11-27 00:20:24', '2016-11-27 00:20:24', 'NORMAL', 'OFFLINE');\nINSERT INTO `order_info` VALUES ('b228ef205bc24c7aac56fc242a60d044', '1', '39345731', null, null, '3', '0', null, '13900000001', '单县', '明天10:00-18:00', '支付宝', null, null, null, null, null, null, 'NORMAL', '0', '2', '1', '0', '', '274200', '05308600000', null, '2016-11-27 12:54:18', null, null, null, '0', '1', '0', '0', null, '0', 'WAIT_PAY', '--', '2016-11-27 12:54:18', '2016-11-27 12:54:18', 'NORMAL', 'ONLINE');\nINSERT INTO `order_info` VALUES ('84d0bf11cde446e183608a598566e281', '1', '59798007', null, null, '5', '0', null, '1860000001', '孙寺', '明天10:00-18:00', '货到付款', null, null, null, null, null, null, 'NORMAL', '2', '0', '8', '0', '', '274200', '05308911051', null, '2016-11-21 22:59:45', null, null, '123456789', '1', '7', '0', '0', null, '0', 'ONGOING', '--', '2016-11-21 22:59:45', '2016-11-21 22:59:45', 'NORMAL', 'OFFLINE');\nINSERT INTO `order_info` VALUES ('d37f2fc07f4c49099404eb91e481cb31', '1', '90994901', null, null, '3', '0', null, '13900000001', '单县', '明天10:00-18:00', '货到付款', null, null, null, null, null, null, 'NORMAL', '2', '0', '6', '0', '', '274200', '05308600000', null, '2016-11-21 23:17:11', null, null, '123456789', '1', '7', '0', '0', null, '0', 'ONGOING', '--', '2016-11-21 23:17:11', '2016-11-21 23:17:11', 'NORMAL', 'OFFLINE');\nINSERT INTO `order_info` VALUES ('db49769d66de47de80f174d39f535ce5', '1', '75238422', null, null, '3', '0', null, '1860000001', '孙寺', '明天10:00-18:00', '微信', null, null, null, null, null, null, 'NORMAL', '2', '0', '6', '0', '', '274200', '05308911051', null, '2016-11-21 23:21:47', null, null, '123456789', '1', '1', '0', '0', null, '0', 'WAIT_PAY', '--', '2016-11-21 23:21:47', '2016-11-21 23:21:47', 'NORMAL', 'ONLINE');\n\n-- ----------------------------\n-- Table structure for order_product_detail\n-- ----------------------------\nDROP TABLE IF EXISTS `order_product_detail`;\nCREATE TABLE `order_product_detail` (\n  `id` varchar(255) NOT NULL,\n  `order_info_id` varchar(255) DEFAULT NULL,\n  `oid` varchar(255) DEFAULT NULL,\n  `name` varchar(255) DEFAULT NULL,\n  `quantity` int(11) DEFAULT NULL,\n  `subtotal` decimal(10,0) DEFAULT NULL,\n  `market_price` decimal(10,0) DEFAULT NULL,\n  `sale_price` decimal(10,0) DEFAULT NULL,\n  `deal_price` decimal(10,0) DEFAULT NULL,\n  `discount_rate` double DEFAULT NULL,\n  `is_comment` tinyint(4) DEFAULT NULL,\n  `is_gift` tinyint(4) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of order_product_detail\n-- ----------------------------\nINSERT INTO `order_product_detail` VALUES ('00a6e640f54e4013afab643e76dd4857', null, '69405561', '花卷', '3', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-17 16:08:14', '2016-11-17 16:08:14', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('297e78a567834625b3dc4f9dbaaa247e', null, '69405561', '大馍', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-17 16:08:14', '2016-11-17 16:08:14', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('3891a53d59824e8885b991053667ee5a', null, '09371692', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-17 16:09:14', '2016-11-17 16:09:14', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('4c142936ad71476cafd27c35b2628e90', null, '09371692', '花卷', '3', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-17 16:09:14', '2016-11-17 16:09:14', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('278c64990a604dfd889809de9aa9f4e0', null, '17337896', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-17 16:09:55', '2016-11-17 16:09:55', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('beaea4be2f3d4e6e997bf63011bea660', null, '17337896', '花卷', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-17 16:09:55', '2016-11-17 16:09:55', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('32479169be9340a9a61e92f654033375', null, '16750448', '大馍', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-17 16:23:50', '2016-11-17 16:23:50', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('5fbc2b26ddb343f1bd841ec65a08e545', '3f5f34dd86934d3bb54526fd54797623', '49127573', '大馍', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-17 16:45:00', '2016-11-17 16:45:00', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('b92eefafcb2041b398112f5a1a044e3e', '3f5f34dd86934d3bb54526fd54797623', '49127573', '花卷', '3', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-17 16:45:00', '2016-11-17 16:45:00', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('da9363611080419f97e6d35ff2ed17e4', '85d95e8ad5fd4d06908b2a86e4869635', '21412883', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-17 23:32:29', '2016-11-17 23:32:29', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('fe6c44109bca4d31ab89469737022c5a', '85d95e8ad5fd4d06908b2a86e4869635', '21412883', '花卷', '16', '8', '1', '1', '1', '1', '0', '0', '--', '2016-11-17 23:32:29', '2016-11-17 23:32:29', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('13478b8cab2a40d286312abb63926cd0', 'e33fd89cec9c4a478061905c72a77c2a', '64782083', '大馍', '3', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-18 20:48:20', '2016-11-18 20:48:20', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('00861e411ac64cbd8da55baf54bac6e7', '482cdf60d033421887776d53a3951c8a', '25258853', '花卷', '3', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-18 20:59:17', '2016-11-18 20:59:17', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('430d51765d01492881f619abac1a3c7f', '45a02081f5d9402f9d4ad3a6f09c3284', '80995325', '大馍', '10', '5', '1', '1', '1', '1', '0', '0', '--', '2016-11-18 22:40:56', '2016-11-18 22:40:56', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('5fa2ac5903b54719b45d3856741a6e8c', 'a551579396324483a59779a5695cbf0e', '26534794', '花卷', '4', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-18 22:43:46', '2016-11-18 22:43:46', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('66e75e75d2c240d1a624a3ffe5cee345', 'a551579396324483a59779a5695cbf0e', '26534794', '大馍', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-18 22:43:46', '2016-11-18 22:43:46', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('726022ffa9574654ae5521fc5ab89282', '12d8cbc264f84030bcd87caeae629de2', '58853726', '吃的', '41', '41', '1', '1', '1', '1', '0', '0', '--', '2016-11-18 22:46:41', '2016-11-18 22:46:41', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('cd27eed67fe34402930dcba45c73c759', 'e41f285deea045fa97fc103c6a5dd891', '62168951', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-18 23:56:39', '2016-11-18 23:56:39', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('a44b0516997c497784c37b3b0058f302', 'e41f285deea045fa97fc103c6a5dd891', '62168951', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-18 23:56:39', '2016-11-18 23:56:39', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('3de2d367feb647dd8eaf065608bac489', '3eded5cf32ef420e8c52b21b11512451', '48781431', '花卷', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 00:02:08', '2016-11-19 00:02:08', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('01bb9701e25249eab6b6eb4789ce6634', '3eded5cf32ef420e8c52b21b11512451', '48781431', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 00:02:08', '2016-11-19 00:02:08', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('1dbdc19588224b14a75dfa1df76d4f79', '232209c6626a4e7099356fafc0670f89', '40130898', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 00:06:18', '2016-11-19 00:06:18', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('aec9615495a848e8a3dc624ae42a2707', 'bd9c718f941d4f0198f2d1cfa47bfe4f', '01185033', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 00:13:20', '2016-11-19 00:13:20', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('f6b6070550a74769832836398e451557', '815fa2a70eb140b78c8dadc66a9be164', '82293845', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 00:14:19', '2016-11-19 00:14:19', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('192a86c5748a4e7993947420e167eef3', '61d0b45564ab4c148d5a66f63639e02c', '97628461', '花卷', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 00:23:25', '2016-11-19 00:23:25', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('5328626f5a634b0fabd09117d4d5b05e', '3073752bb03d4355b4e8476268b8b514', '36820844', '花卷', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 00:30:46', '2016-11-19 00:30:46', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('289ca303edf3477883981126559f28f6', '68371cc47ff54986a39f7ae7f06370f2', '46867928', '大馍', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 00:31:25', '2016-11-19 00:31:25', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('3a61e8136d6245eb9ccce345fb73f931', '84debacf2a1645c49f15387f20e5741b', '81688512', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 00:50:26', '2016-11-19 00:50:26', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('6c47a533530a40c5a472a73a85578ed2', '84debacf2a1645c49f15387f20e5741b', '81688512', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 00:50:26', '2016-11-19 00:50:26', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('c38846bd1fbb4b81a2c6b636bba09b08', '9c92748255d443958be2362e2f3c2870', '20315397', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 00:52:45', '2016-11-19 00:52:45', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('54bd4cfa00224bac8936650d49183c1d', '9c92748255d443958be2362e2f3c2870', '20315397', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 00:52:45', '2016-11-19 00:52:45', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('ef2f4f42dbf442669d0aa7edb4b22b70', '9c92748255d443958be2362e2f3c2870', '20315397', '吃的', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 00:52:45', '2016-11-19 00:52:45', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('6954bde2912444ae89a00edddf9f01e0', 'd98a386254174cda916b1bb1a3d1482a', '83842084', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 02:36:35', '2016-11-19 02:36:35', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('1cf0b5af792f4eacbb5ba5500c227a10', 'd98a386254174cda916b1bb1a3d1482a', '83842084', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 02:36:35', '2016-11-19 02:36:35', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('d2c5e05b908b4463994d3ef96d250921', 'b9b80453330d47de9e46d6d4b214bb8c', '11138972', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 03:27:17', '2016-11-19 03:27:17', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('7bdc5e1eda444aa893a9921d7aeb7cf1', 'b9b80453330d47de9e46d6d4b214bb8c', '11138972', '花卷', '3', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 03:27:17', '2016-11-19 03:27:17', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('8031cfed0619416ea98d567fb75600b3', 'd4425781b0ca4c6e9346dafc393680b2', '85170198', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 10:26:47', '2016-11-19 10:26:47', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('09188439b0c045aeac8e5aa6b164f496', 'd4425781b0ca4c6e9346dafc393680b2', '85170198', '大馍', '3', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 10:26:47', '2016-11-19 10:26:47', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('940842765e5d46fa86f0efe57b084ca3', 'a206e56d221e48f9ac2dfa3962bc205c', '12160075', '大馍', '3', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 16:10:50', '2016-11-19 16:10:50', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('b5af110aad6c46159aa3d9fba234dafa', 'a206e56d221e48f9ac2dfa3962bc205c', '12160075', '花卷', '4', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 16:10:50', '2016-11-19 16:10:50', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('e20ea1ae05d142818d738c00cf1ebd86', '1291b2839a6a497e94712898096735aa', '64069245', '花卷', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 22:44:56', '2016-11-19 22:44:56', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('e185012372cf4dbdb0a7a99a8cd7767f', '1291b2839a6a497e94712898096735aa', '64069245', '吃的', '8', '8', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 22:44:56', '2016-11-19 22:44:56', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('e030c7aef71a4ecfb32b78c790d5330a', '1291b2839a6a497e94712898096735aa', '64069245', '大馍', '6', '3', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 22:44:56', '2016-11-19 22:44:56', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('e0cda93d8e404ebe90c6d48af452c7e1', 'c6a9c149ec44451db9f996fcc9e4a94b', '61227246', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 23:27:59', '2016-11-19 23:27:59', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('8e5e30c904144e59a014ef86123a31f9', 'c6a9c149ec44451db9f996fcc9e4a94b', '61227246', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 23:27:59', '2016-11-19 23:27:59', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('bb132b8b30404788a2f84560339bafbe', 'd094a069c7ac4e49abb6c4c73a5bc930', '23566398', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 23:32:00', '2016-11-19 23:32:00', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('eb25002a85e14cb39ba9db21428882d8', 'd094a069c7ac4e49abb6c4c73a5bc930', '23566398', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 23:32:00', '2016-11-19 23:32:00', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('b735930d79914dbab0332a82003c6557', '3bec7ca539424dfc8caf9657836b8986', '64618776', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 23:33:13', '2016-11-19 23:33:13', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('846e863986794202a0087be4da5211fa', '3bec7ca539424dfc8caf9657836b8986', '64618776', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-19 23:33:13', '2016-11-19 23:33:13', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('0141b89437a447ff9166f763bbda2d6f', '623aaba6a86b4c7bbd86aa85b913652f', '19080203', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 01:25:39', '2016-11-20 01:25:39', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('8b05ce84cfe04e0ebb710d5fed160a3b', '623aaba6a86b4c7bbd86aa85b913652f', '19080203', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 01:25:39', '2016-11-20 01:25:39', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('808c7f74fc9e4546b31d9febc405399b', '178e6c112ecd496cacbe32026caaa55c', '34822068', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 01:40:49', '2016-11-20 01:40:49', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('3fe7ae003502484e8680de7f678a762c', '178e6c112ecd496cacbe32026caaa55c', '34822068', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 01:40:49', '2016-11-20 01:40:49', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('7a36faded4454050a3f37d09c52ed51d', 'a8174dcb61294624b3acfdfbaca92c87', '01202488', '大馍', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 01:41:35', '2016-11-20 01:41:35', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('c46fb9558fc04afba262ca6f3bef6840', 'a8174dcb61294624b3acfdfbaca92c87', '01202488', '花卷', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 01:41:35', '2016-11-20 01:41:35', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('f583ba584ffd4cf8b2ce99ca92048ab0', 'a1db15212e904057b6e6de3aeddefd62', '03597319', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 01:46:12', '2016-11-20 01:46:12', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('00e2940bf0bb4da69c40ea95bcf42d8d', 'a1db15212e904057b6e6de3aeddefd62', '03597319', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 01:46:12', '2016-11-20 01:46:12', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('8ef382d336304bb8ac55ee869a07858c', 'e8171363dfa64af4b4ad55c7da387da3', '26838468', '吃的', '4', '4', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 01:50:07', '2016-11-20 01:50:07', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('9d87e7014bd64e11abb8b504a37b2d30', 'e8171363dfa64af4b4ad55c7da387da3', '26838468', '大馍', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 01:50:07', '2016-11-20 01:50:07', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('cc5108e4ad2842c2a7c3fa4ab17652b4', 'e8171363dfa64af4b4ad55c7da387da3', '26838468', '花卷', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 01:50:07', '2016-11-20 01:50:07', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('28b557135983463f8602c15544e14373', '01e3573a1b304e91a758482a7561eea7', '57824378', '大馍', '3', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 01:55:12', '2016-11-20 01:55:12', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('307fc1aa44fb4302aecb3bcc1c034a7c', '01e3573a1b304e91a758482a7561eea7', '57824378', '花卷', '3', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 01:55:12', '2016-11-20 01:55:12', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('586065dd8d1e4019ae1ecb1320ff3b2d', 'a7db5d010d68444d84847d12f561062a', '21789281', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 01:55:59', '2016-11-20 01:55:59', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('3d034299bbfc47a79cd06f37df0884fa', '755365a52d2144c2964bfe3c495e3df9', '53964179', '吃的', '30', '30', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 01:59:27', '2016-11-20 01:59:27', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('849e8f711bea42c1806ff5ae56b089d8', '4e4189785d134b3fb8aa91cac4fc3eee', '22441979', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 02:42:28', '2016-11-20 02:42:28', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('b807adb89caf47b29bf585fdee3d4462', '4e4189785d134b3fb8aa91cac4fc3eee', '22441979', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 02:42:28', '2016-11-20 02:42:28', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('0dc4de6d8a7c4243a04038e359a22cb7', 'cc13ced9cf6145ba9824661b9a4783fa', '67011262', '大馍', '21', '11', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 16:10:20', '2016-11-20 16:10:20', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('130c18520deb4a668fd9cdf220795201', 'cc13ced9cf6145ba9824661b9a4783fa', '67011262', '花卷', '26', '13', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 16:10:20', '2016-11-20 16:10:20', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('878eb33a47894a25b9550d50cc7ae670', 'cc13ced9cf6145ba9824661b9a4783fa', '67011262', '吃的', '4', '4', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 16:10:20', '2016-11-20 16:10:20', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('c557615281c449ecaa595aa345e1f219', 'fc1f95d4f07042d38970f6fb2a7c18d5', '09787843', '花卷', '48', '24', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 18:18:00', '2016-11-20 18:18:00', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('189c0617c90348fbb9df5fdf49704106', 'fc1f95d4f07042d38970f6fb2a7c18d5', '09787843', '大馍', '35', '18', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 18:18:00', '2016-11-20 18:18:00', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('1544bd3fc15a4ccda3cf5852341df75f', '0e9b36493a0a48fea9346a029ed04db0', '94781590', '花卷', '3', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 20:31:19', '2016-11-20 20:31:19', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('961dc13efa944b0ba0f9df3de48a4777', '0e9b36493a0a48fea9346a029ed04db0', '94781590', '大馍', '5', '3', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 20:31:19', '2016-11-20 20:31:19', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('c68a066b383c4588ac0c2b5265ec4fb0', 'a026563c7e36458eb338992f7674d994', '92080001', '大馍', '7', '4', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 22:39:33', '2016-11-20 22:39:33', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('9853073f1dda462284e3fa891ed38c72', 'a026563c7e36458eb338992f7674d994', '92080001', '花卷', '8', '4', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 22:39:33', '2016-11-20 22:39:33', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('e1d0d55e3a16440a8bcd695661d9e528', '11be5c34c7fd42cca7de78b7ca1d10fd', '13155766', '吃的', '7', '7', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 22:45:55', '2016-11-20 22:45:55', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('3a598977d3a24889bb50a98eddbfbc6d', '63764307f9374ca28e8521c66a4babbb', '39049775', '花卷', '7', '4', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 23:07:30', '2016-11-20 23:07:30', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('0b219c61e5514ebaa38be6034fdc4b9a', '63764307f9374ca28e8521c66a4babbb', '39049775', '大馍', '3', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 23:07:30', '2016-11-20 23:07:30', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('e12f8cfcba3c4b00ab184e778a542884', '0b3593550c8144ed8d808b5248ea593c', '94396186', '花卷', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 23:13:28', '2016-11-20 23:13:28', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('f137ec8b1c0740de8ead7824eb5963be', 'e94e307300e64ab395187f9d1a09a4de', '75600846', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 23:57:12', '2016-11-20 23:57:12', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('6f93a649bc2446e48994c25c3796d967', 'ca97327f3d1e4a4abcc00446dbd80bcc', '62475690', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-20 23:57:33', '2016-11-20 23:57:33', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('776b8b5aaa4645ea91b7d379d51c21b6', '34b71341fad64ce99f98099ae47b7917', '71564772', '大馍', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 00:03:38', '2016-11-21 00:03:38', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('f013b7adface4d958f5060d938b0e0d6', '34b71341fad64ce99f98099ae47b7917', '71564772', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 00:03:38', '2016-11-21 00:03:38', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('ef9502d2a8f245c5a005673d0ee953fa', '5797a2a3c0b842fb9b020f49b367599e', '02151998', '花卷', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 00:05:10', '2016-11-21 00:05:10', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('f041aa3f51f94186b077328a0fdee1bd', 'f296dd04534141ef9b8b72f9d9c53183', '54443832', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 00:06:30', '2016-11-21 00:06:30', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('166568b7e24b4bfebdd48e6f26029775', '5c650f17afe74e67a2d0b60a9019c6b3', '19348049', '花卷', '3', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 00:21:36', '2016-11-21 00:21:36', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('0e68ffe0a6a246dbb06b9e3a7a704712', '5c650f17afe74e67a2d0b60a9019c6b3', '19348049', '大馍', '4', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 00:21:36', '2016-11-21 00:21:36', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('8f9f4cbd55dc48b4bb3be22eba267cbf', '9a086c7e627b4d1196d1886eefc30c4c', '94337238', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 00:23:22', '2016-11-21 00:23:22', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('0e72841dc64742f9aee1afa8fbc49fa2', '91ab3c68925f40f4803a9ac339ab28cf', '35089701', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 00:23:56', '2016-11-21 00:23:56', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('90d62ccd457147c3a0c16c033b7ad3b7', 'b415fbd58bf94b619b4649cfe0d9280d', '44445520', '花卷', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 00:30:44', '2016-11-21 00:30:44', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('63fdcee463404498a0aaba41be388848', '21956076370b452eba596416d250b2b1', '56549090', '花卷', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 00:31:51', '2016-11-21 00:31:51', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('47ab061775f140b29baa2338b9f1e1f8', '506a978553de417fb1a26d3655125135', '63331256', '大馍', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 00:32:40', '2016-11-21 00:32:40', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('94247c8dfd1b465e9c70f3a66073c4b8', '4ce1ecaaafc44e618ecb42e7d63ad8cf', '32076413', '花卷', '3', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 00:34:32', '2016-11-21 00:34:32', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('239698b09a5c4303a4b97a6f9a811444', 'a32836907004405492067fed2df10d74', '24496896', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 00:36:28', '2016-11-21 00:36:28', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('84c6142929a947a19170d978d20212ec', 'd1df871ce8114d5ba8709d50d1cd3386', '46954093', '花卷', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 00:38:37', '2016-11-21 00:38:37', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('f505fd8c4bdb4cbb9ec2d28eef5b5433', 'f79065a88f0546d4bdef87d25a366d00', '43966855', '花卷', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 00:39:19', '2016-11-21 00:39:19', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('03067a135f124244bf47fbe690cc52c4', '0c65a0377bea4b579f9f50661cb62944', '77521665', '花卷', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 00:40:14', '2016-11-21 00:40:14', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('9fc02f9c9e9c4f09b2a0a4913676ae24', 'baa8692c79d34fb680ae8c6e02d80556', '05551276', '花卷', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 00:41:10', '2016-11-21 00:41:10', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('c0b47382b0614678adc9399244c38045', '0b1b1d58b85641fd8a6cbb15e5aeb284', '89763655', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 00:46:04', '2016-11-21 00:46:04', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('6cdb8f25c1a747018e75d1e337f98dfe', '0b1b1d58b85641fd8a6cbb15e5aeb284', '89763655', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 00:46:04', '2016-11-21 00:46:04', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('7c7893e444eb496a8c1652e948ac5c8a', '988c110df3734a88bad8e0d1f8432eeb', '60787235', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 00:46:29', '2016-11-21 00:46:29', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('4a8c228192554616acdceec40409a0dd', '988c110df3734a88bad8e0d1f8432eeb', '60787235', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 00:46:29', '2016-11-21 00:46:29', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('3d39079b4e974e9a9eb2ee6a974eb875', 'ad59864810c643b5a30d77fb65326ccd', '00615828', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 00:49:26', '2016-11-21 00:49:26', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('5de0b3cf584c4fe7808af384e081ed43', 'ad59864810c643b5a30d77fb65326ccd', '00615828', '大馍', '3', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 00:49:26', '2016-11-21 00:49:26', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('6c6d9976a55743499aa6f506ba1d3372', 'c46860db83ff485abe8883cded2d4648', '37664380', '大馍', '4', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 01:23:14', '2016-11-21 01:23:14', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('71ccf4cb81a74d1bb3a6f3839b943183', '238f7c9f9e78489f8e9d01355378b748', '78075424', '吃的', '4', '4', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 01:26:53', '2016-11-21 01:26:53', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('1db59a4aedea427ca7d44b4ae80b0c61', '238f7c9f9e78489f8e9d01355378b748', '78075424', '花卷', '11', '6', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 01:26:53', '2016-11-21 01:26:53', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('09743603c91b4e2685dfd2bc352faff0', '238f7c9f9e78489f8e9d01355378b748', '78075424', '大馍', '3', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 01:26:53', '2016-11-21 01:26:53', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('8a568b79f083477596d36e3db239e462', 'bf2b708bf2cc4ea390d93c109bc40ad9', '78603807', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 01:27:48', '2016-11-21 01:27:48', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('5928e266984d455f8818c7b7fb1e716a', 'bf2b708bf2cc4ea390d93c109bc40ad9', '78603807', '吃的', '3', '3', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 01:27:48', '2016-11-21 01:27:48', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('d0daa93f642e426b9fb46f3586b18178', 'bf2b708bf2cc4ea390d93c109bc40ad9', '78603807', '花卷', '4', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 01:27:48', '2016-11-21 01:27:48', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('8c48997fce254f7c8c555ee7aa1abe78', '8046fdd6a46f419eb3e56a5520658f5e', '75207954', '吃的', '6', '6', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 01:29:01', '2016-11-21 01:29:01', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('08265dcbbb9b43b6beb343de70fc5c34', '8046fdd6a46f419eb3e56a5520658f5e', '75207954', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 01:29:01', '2016-11-21 01:29:01', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('e9053cfbcd8242d3a4935cb67d6b79a3', '5ef282e949f9451486ef488c6b22e4b6', '89305950', '大馍', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 11:57:31', '2016-11-21 11:57:31', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('9218eada09b54cc2ac6b1c8cb96eb6ec', '5ef282e949f9451486ef488c6b22e4b6', '89305950', '花卷', '3', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 11:57:31', '2016-11-21 11:57:31', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('bd1c96bb8ab247cca4cad76f3776e92d', '5ef282e949f9451486ef488c6b22e4b6', '89305950', '吃的', '2', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 11:57:31', '2016-11-21 11:57:31', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('db7740554fb14c1784055c2e44314d0c', 'b584e5fdc62349a3afb13c090b0b34cc', '24359081', '花卷', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 11:59:19', '2016-11-21 11:59:19', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('fdeb365a7a4942fa80ed40931f268b7a', 'b584e5fdc62349a3afb13c090b0b34cc', '24359081', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 11:59:19', '2016-11-21 11:59:19', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('28764b72d6814536a74998ae3c7b746c', '5ba0edd31e9e47f98feb6080813dd0bf', '81741166', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 12:02:44', '2016-11-21 12:02:44', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('f3757539b7fe4bbaa555d77d559a1316', '5ba0edd31e9e47f98feb6080813dd0bf', '81741166', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 12:02:44', '2016-11-21 12:02:44', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('be42cf4297b347508cb8b0a3f102fbf8', 'f6f72630fa814498b4a7a263eccf0c7b', '81158995', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 12:03:05', '2016-11-21 12:03:05', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('6d9e8ce58dd34eb29b59c1306de021c4', 'f6f72630fa814498b4a7a263eccf0c7b', '81158995', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 12:03:05', '2016-11-21 12:03:05', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('0555d55459ea4c33a410ef6f2fea9021', 'ad8f5ef00d034c14939eccf56b46d899', '22990924', '大馍', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 12:57:36', '2016-11-21 12:57:36', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('55c323c1658d47f2ad94f2f662fda239', 'ad8f5ef00d034c14939eccf56b46d899', '22990924', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 12:57:36', '2016-11-21 12:57:36', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('a9a21493727a45918914d6e212c157ae', '84d0bf11cde446e183608a598566e281', '59798007', '大馍', '5', '3', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 22:59:45', '2016-11-21 22:59:45', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('106c93bc94a84d8393102ab414985acb', '84d0bf11cde446e183608a598566e281', '59798007', '花卷', '10', '5', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 22:59:45', '2016-11-21 22:59:45', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('f0fed99fa894497592c99d684c88db1f', 'd37f2fc07f4c49099404eb91e481cb31', '90994901', '大馍', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 23:17:11', '2016-11-21 23:17:11', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('818ef47417ec4106bc16f09099c6f5d2', 'd37f2fc07f4c49099404eb91e481cb31', '90994901', '花卷', '9', '5', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 23:17:11', '2016-11-21 23:17:11', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('493ef9abf2334c61ac32f45e7bff6a4d', 'db49769d66de47de80f174d39f535ce5', '75238422', '花卷', '4', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 23:21:47', '2016-11-21 23:21:47', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('cc3bdab7b56e4fedaf70fe9dddf27590', 'db49769d66de47de80f174d39f535ce5', '75238422', '大馍', '7', '4', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 23:21:47', '2016-11-21 23:21:47', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('878a790ab4b44fcf8b1903b2ff8e607c', 'be5d8827c2354419bcf221d42fdf6553', '33231469', '花卷', '5', '3', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 23:40:00', '2016-11-21 23:40:00', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('1c828f42d4234463bd3b5c6c9794e7ff', 'be5d8827c2354419bcf221d42fdf6553', '33231469', '大馍', '5', '3', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 23:40:00', '2016-11-21 23:40:00', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('3d8dc340ad50469897677c41587b5469', '871bda6c48ca4b5f88ee59338960fcf5', '47402059', '大馍', '4', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 23:45:49', '2016-11-21 23:45:49', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('adad6e3279144c3bb0008cedd299a503', '871bda6c48ca4b5f88ee59338960fcf5', '47402059', '花卷', '6', '3', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 23:45:49', '2016-11-21 23:45:49', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('75cc504985c44ee4a49e23f7a4067838', '5a9e114f3aa64a8da090d7d224247cff', '35815122', '花卷', '4', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 23:53:49', '2016-11-21 23:53:49', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('80822db96c344ccfb08de6de62b777a7', '5a9e114f3aa64a8da090d7d224247cff', '35815122', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 23:53:49', '2016-11-21 23:53:49', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('95c1baca293142cba7ff31f5df960865', 'f3878d7c5bf145ad8082f7f95d09a6a5', '06448107', '大馍', '3', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 23:57:16', '2016-11-21 23:57:16', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('76caff76f1894df7ace633fd0c69aa95', 'd8f3ada21fd64333beb15ef7c7bf6f4c', '41189458', '大馍', '3', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 23:57:44', '2016-11-21 23:57:44', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('077e742cc1a446778de25d7fb042b799', 'dd730ec7772d4c8aba2525c31e08dced', '50751194', '大馍', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 23:58:11', '2016-11-21 23:58:11', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('b36c0922795c4921bbf03a35a07d0a47', 'a70c715169c14eac92d645de4709c516', '55941406', '大馍', '2', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-21 23:59:03', '2016-11-21 23:59:03', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('134bf1b5a56a4f00a99ef417509823df', '82f4f04dabc74037b95be0aedbe8997a', '46299589', '大馍', '101', '51', '1', '1', '1', '1', '0', '0', '--', '2016-11-22 00:34:02', '2016-11-22 00:34:02', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('eb122daf1b0243b6b24907e169b4bc4e', '82f4f04dabc74037b95be0aedbe8997a', '46299589', '花卷', '8', '4', '1', '1', '1', '1', '0', '0', '--', '2016-11-22 00:34:02', '2016-11-22 00:34:02', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('c5a64f78c06941589521304dcad4f015', '82f4f04dabc74037b95be0aedbe8997a', '46299589', '吃的', '2', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-22 00:34:02', '2016-11-22 00:34:02', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('fd5e8c139ec342548cd61b9f991779d7', '98a735bb8a13422394551fa944b0a7c0', '14528930', '花卷', '5', '3', '1', '1', '1', '1', '0', '0', '--', '2016-11-22 00:36:34', '2016-11-22 00:36:34', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('042bb6aa52be4cb6b3c6b7f98d0e3e0a', '98a735bb8a13422394551fa944b0a7c0', '14528930', '大馍', '56', '28', '1', '1', '1', '1', '0', '0', '--', '2016-11-22 00:36:34', '2016-11-22 00:36:34', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('71c481266010476fa0ade5be674d4334', 'f77599f0d01c409fb9bd69c98c17df0d', '05654801', '花卷', '3', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-22 13:13:42', '2016-11-22 13:13:42', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('c255d9c382044fb68fb353817ae4ee3f', 'f77599f0d01c409fb9bd69c98c17df0d', '05654801', '大馍', '4', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-22 13:13:42', '2016-11-22 13:13:42', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('0338c1101443465a9181ca0550a34564', '02b7a9e577254f709fc6afb16e6ae00e', '58927163', '花卷', '12', '6', '1', '1', '1', '1', '0', '0', '--', '2016-11-23 01:39:46', '2016-11-23 01:39:46', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('869778217fc0463194438b74549a2556', '02b7a9e577254f709fc6afb16e6ae00e', '58927163', '大馍', '9', '5', '1', '1', '1', '1', '0', '0', '--', '2016-11-23 01:39:46', '2016-11-23 01:39:46', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('916b76bed8a346db9f10b05970eae185', '03807d9304a945bfa8d82db7c0d59d86', '63718652', '大馍', '3', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-23 23:58:33', '2016-11-23 23:58:33', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('46014141c2df482a92b191bf6472242f', '03807d9304a945bfa8d82db7c0d59d86', '63718652', '花卷', '3', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-23 23:58:33', '2016-11-23 23:58:33', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('183d08d91e15419c9af38e35d7aed207', '971d9d6a4258402299cffcfecdffed3c', '33226048', '花卷', '3', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-23 23:58:33', '2016-11-23 23:58:33', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('4c39ab0ce2a6451088b841f86e334b5a', '971d9d6a4258402299cffcfecdffed3c', '33226048', '大馍', '3', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-23 23:58:33', '2016-11-23 23:58:33', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('764d166496e9410fa1fca805e29fa47a', '907cea6ce49443fabeafd0e366cbbb77', '72580291', '花卷', '9', '5', '1', '1', '1', '1', '0', '0', '--', '2016-11-24 00:00:26', '2016-11-24 00:00:26', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('b3b8393897de49118aa46d6d4c3a86d3', '907cea6ce49443fabeafd0e366cbbb77', '72580291', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-24 00:00:26', '2016-11-24 00:00:26', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('9c8f16b3cd744e43b72a3345d1856642', 'fddab9948f4743149d8f6caaeb4aeace', '08574631', '大馍', '11', '6', '1', '1', '1', '1', '0', '0', '--', '2016-11-26 14:19:46', '2016-11-26 14:19:46', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('6b829c10f36c401493bcf2fe9cc997f7', 'fddab9948f4743149d8f6caaeb4aeace', '08574631', '花卷', '18', '9', '1', '1', '1', '1', '0', '0', '--', '2016-11-26 14:19:46', '2016-11-26 14:19:46', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('ba34172677974898b8ae1c41369e7683', '82d13c36d06747888d55602e9ccb6890', '50031248', '吃的', '4', '4', '1', '1', '1', '1', '0', '0', '--', '2016-11-27 00:20:24', '2016-11-27 00:20:24', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('cd371b970d0947b0875bf9bcfeb747d6', '82d13c36d06747888d55602e9ccb6890', '50031248', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-27 00:20:24', '2016-11-27 00:20:24', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('2ca951626fbc41f6b68ada2be79780b2', '82d13c36d06747888d55602e9ccb6890', '50031248', '花卷', '3', '2', '1', '1', '1', '1', '0', '0', '--', '2016-11-27 00:20:24', '2016-11-27 00:20:24', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('4a57272b31db414f857d6666791a1ffd', 'b228ef205bc24c7aac56fc242a60d044', '39345731', '花卷', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-27 12:54:18', '2016-11-27 12:54:18', 'NORMAL');\nINSERT INTO `order_product_detail` VALUES ('25f253619caf4a73b79863f8740ebca9', 'b228ef205bc24c7aac56fc242a60d044', '39345731', '大馍', '1', '1', '1', '1', '1', '1', '0', '0', '--', '2016-11-27 12:54:18', '2016-11-27 12:54:18', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for order_return\n-- ----------------------------\nDROP TABLE IF EXISTS `order_return`;\nCREATE TABLE `order_return` (\n  `id` varchar(255) NOT NULL,\n  `access_id` int(11) DEFAULT NULL,\n  `return_id` int(11) DEFAULT NULL,\n  `order_info_oid` int(11) DEFAULT NULL,\n  `order_info_id` int(11) DEFAULT NULL,\n  `refund_payable` varchar(255) DEFAULT NULL,\n  `refund_paid` int(11) DEFAULT NULL,\n  `sale_price_tatal` varchar(255) DEFAULT NULL,\n  `consignee` varchar(255) DEFAULT NULL,\n  `mobile` varchar(255) DEFAULT NULL,\n  `address` varchar(255) DEFAULT NULL,\n  `province` varchar(255) DEFAULT NULL,\n  `city` varchar(255) DEFAULT NULL,\n  `country` varchar(255) DEFAULT NULL,\n  `return_status_id` int(11) DEFAULT NULL,\n  `freight` varchar(255) DEFAULT NULL,\n  `product_total_price` decimal(10,0) DEFAULT NULL,\n  `remark_system` varchar(255) DEFAULT NULL,\n  `ip` varchar(255) DEFAULT NULL,\n  `post_code` varchar(255) DEFAULT NULL,\n  `telephone` varchar(255) DEFAULT NULL,\n  `email` varchar(255) DEFAULT NULL,\n  `return_reason_id` int(11) DEFAULT NULL,\n  `custom_return_reason` varchar(255) DEFAULT NULL,\n  `refund_type_id` int(11) DEFAULT NULL,\n  `custom_price` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of order_return\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for order_return_detail\n-- ----------------------------\nDROP TABLE IF EXISTS `order_return_detail`;\nCREATE TABLE `order_return_detail` (\n  `id` varchar(255) NOT NULL,\n  `return_oid` varchar(255) DEFAULT NULL,\n  `no` int(11) DEFAULT NULL,\n  `name` varchar(255) DEFAULT NULL,\n  `quantity` varchar(255) DEFAULT NULL,\n  `subtatal` varchar(255) DEFAULT NULL,\n  `market_price` decimal(10,0) DEFAULT NULL,\n  `sale_price` decimal(10,0) DEFAULT NULL,\n  `deal_price` decimal(10,0) DEFAULT NULL,\n  `discount_rate` varchar(255) DEFAULT NULL,\n  `is_gift` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of order_return_detail\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for pay\n-- ----------------------------\nDROP TABLE IF EXISTS `pay`;\nCREATE TABLE `pay` (\n  `id` varchar(255) NOT NULL,\n  `name` varchar(255) DEFAULT NULL,\n  `pay_way` varchar(255) DEFAULT NULL,\n  `icon` varchar(255) DEFAULT NULL,\n  `order_by` int(11) DEFAULT NULL,\n  `recommend` tinyint(4) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of pay\n-- ----------------------------\nINSERT INTO `pay` VALUES ('1', '支付宝', 'ONLINE', 'icon-11', '2', '0', '--', '2016-10-10 14:35:24', '2016-10-10 14:35:27', 'NORMAL');\nINSERT INTO `pay` VALUES ('2', '微信', 'ONLINE', 'icon-14', '1', '1', '--', '2016-10-10 14:36:05', '2016-10-10 14:36:07', 'NORMAL');\nINSERT INTO `pay` VALUES ('3', '货到付款', 'OFFLINE', 'icon-5', '3', '0', '--', '2016-10-10 14:36:35', '2016-10-10 14:36:37', 'NORMAL');\nINSERT INTO `pay` VALUES ('c8d230d02ea44c7db9103ab8976262e1', 'cheng', 'OFFLINE', 'icon-5', '4', '0', '--', '2016-10-18 16:16:33', '2016-10-18 16:16:33', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for permission\n-- ----------------------------\nDROP TABLE IF EXISTS `permission`;\nCREATE TABLE `permission` (\n  `id` varchar(64) CHARACTER SET utf8 NOT NULL,\n  `name` varchar(64) CHARACTER SET utf8 DEFAULT NULL,\n  `precode` varchar(32) CHARACTER SET utf8 NOT NULL,\n  `remarks` varchar(255) CHARACTER SET utf8 DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(16) CHARACTER SET utf8 NOT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1;\n\n-- ----------------------------\n-- Records of permission\n-- ----------------------------\nINSERT INTO `permission` VALUES ('1', '用户查看', 'sys:user:view', '查看用户列表', '2016-05-19 16:41:40', '2016-05-19 16:41:42', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for picture\n-- ----------------------------\nDROP TABLE IF EXISTS `picture`;\nCREATE TABLE `picture` (\n  `id` varchar(255) NOT NULL,\n  `product_id` varchar(255) DEFAULT NULL,\n  `picture_url` varchar(255) DEFAULT NULL,\n  `width` int(11) DEFAULT NULL,\n  `height` int(11) DEFAULT NULL,\n  `is_default` tinyint(4) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of picture\n-- ----------------------------\nINSERT INTO `picture` VALUES ('', '2', 'http://wx.aqd123.com/moblie/static/images/product/d-1.jpg', '-1', '-1', '0', '商品大图', '2016-10-31 13:34:50', '2016-10-31 13:34:53', 'NORMAL');\nINSERT INTO `picture` VALUES ('1', '1', 'http://wx.aqd123.com/moblie/static/images/product/zm.jpg', '120', '120', '1', '首页商品图片', '2016-06-29 10:10:09', '2016-06-29 10:10:12', 'NORMAL');\nINSERT INTO `picture` VALUES ('10', '4', 'http://wx.aqd123.com/moblie/static/images/product/d-1.jpg', '-1', '-1', '0', '商品大图', '2016-10-31 13:34:50', '2016-10-31 13:34:53', 'NORMAL');\nINSERT INTO `picture` VALUES ('2', '2', 'http://wx.aqd123.com/moblie/static/images/product/hj.jpg', '120', '120', '1', '首页商品图片', '2016-06-29 16:40:31', '2016-06-29 16:40:33', 'NORMAL');\nINSERT INTO `picture` VALUES ('3', '3', 'http://wx.aqd123.com/moblie/static/images/product/tb.jpg', '120', '120', '1', '首页商品图片', '2016-06-29 16:46:38', '2016-06-29 16:46:40', 'NORMAL');\nINSERT INTO `picture` VALUES ('4', '4', 'http://wx.aqd123.com/moblie/static/images/product/tb.jpg', '120', '120', '1', '精品', '2016-10-30 17:56:46', '2016-10-30 17:56:49', 'NORMAL');\nINSERT INTO `picture` VALUES ('5', '1', 'http://wx.aqd123.com/moblie/static/images/product/d-1.jpg', '-1', '-1', '0', '商品大图', '2016-10-31 13:34:50', '2016-10-31 13:34:53', 'NORMAL');\nINSERT INTO `picture` VALUES ('6', '1', 'http://wx.aqd123.com/moblie/static/images/product/d-2.jpg', '-1', '-1', '0', '大图', '2016-10-31 13:35:29', '2016-10-31 13:35:33', 'NORMAL');\nINSERT INTO `picture` VALUES ('7', '1', 'http://wx.aqd123.com/moblie/static/images/product/d-3.jpg', '-1', '-1', '0', '大图', '2016-10-31 13:35:29', '2016-10-31 13:35:33', 'NORMAL');\nINSERT INTO `picture` VALUES ('8', '2', 'http://wx.aqd123.com/moblie/static/images/product/d-1.jpg', '-1', '-1', '0', '商品大图', '2016-10-31 13:34:50', '2016-10-31 13:34:53', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for product\n-- ----------------------------\nDROP TABLE IF EXISTS `product`;\nCREATE TABLE `product` (\n  `id` varchar(255) NOT NULL,\n  `name` varchar(255) DEFAULT NULL,\n  `market_price` decimal(10,1) DEFAULT NULL,\n  `sale_price` decimal(10,1) DEFAULT NULL,\n  `no` varchar(255) DEFAULT '',\n  `key_words` varchar(255) DEFAULT NULL,\n  `type_id` varchar(255) DEFAULT NULL,\n  `is_alive` tinyint(4) DEFAULT NULL,\n  `is_index` tinyint(4) DEFAULT NULL,\n  `modify_admin_id` varchar(255) DEFAULT NULL,\n  `units_in_stock` int(11) DEFAULT NULL,\n  `tag` varchar(255) DEFAULT NULL,\n  `give_away` int(11) DEFAULT NULL,\n  `unit_desc` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of product\n-- ----------------------------\nINSERT INTO `product` VALUES ('1', '大馍', '0.5', '0.5', '001', '馍', '1', '1', '1', '1', '99518', '推荐', '5', '0.25g/个', '好吃的', '2016-06-29 10:11:16', '2016-11-13 19:00:25', 'NORMAL');\nINSERT INTO `product` VALUES ('2', '花卷', '0.5', '0.5', '002', '卷子', '1', '1', '1', '1', '99596', '推荐', '5', '0.25g/个', '好吃的', '2016-06-29 16:38:03', '2016-11-13 19:00:25', 'NORMAL');\nINSERT INTO `product` VALUES ('3', '糖包', '0.6', '0.6', '003', '糖包', '1', '1', '1', '1', '0', '推荐', '5', '0.25g/个', '好吃的', '2016-06-29 16:38:57', '2016-11-13 18:58:39', 'NORMAL');\nINSERT INTO `product` VALUES ('4', '吃的', '1.0', '1.0', '004', '好吃的', '2', '1', '0', '1', '-3', '特别', '5', '0.25g/个', '好', '2016-10-30 17:54:17', '2016-11-13 19:00:25', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for product_focus\n-- ----------------------------\nDROP TABLE IF EXISTS `product_focus`;\nCREATE TABLE `product_focus` (\n  `id` varchar(255) DEFAULT NULL,\n  `account_id` varchar(255) DEFAULT NULL,\n  `product_id` int(11) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of product_focus\n-- ----------------------------\nINSERT INTO `product_focus` VALUES ('66f98567291c4e27bb78ee2389e5d8c8', '1', '1', '--', '2016-10-17 16:35:01', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('aaacfb2b0c9e4728b8b91bc6d4e3d16a', '1', '1', '--', '2016-10-17 18:47:48', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('dd80daf896354be1b57f761be5b700ef', '1', '1', '--', '2016-11-01 09:36:20', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('4612cb7a5d9f4789a28ef05bccec0df8', '1', '1', '--', '2016-11-01 09:40:17', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('07a94da9a0dc4a158096b5a027073a11', '1', '1', '--', '2016-11-01 09:40:24', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('9524251991594936ab8a2a5702e92522', '1', '1', '--', '2016-11-01 09:40:41', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('2fe700d1505242abb99c882673edeab8', '1', '1', '--', '2016-11-01 09:43:00', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('532d211672c2404aa658f061f796dde9', '1', '1', '--', '2016-11-01 09:43:54', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('dd2690cbe3c145728c0308fb53617167', '1', '1', '--', '2016-11-01 09:44:21', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('7183dff335ff4e24ab2526c95f2b5fae', '1', '1', '--', '2016-11-01 09:44:25', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('c70c042e18974ce39637a76dee79b59b', '1', '1', '--', '2016-11-01 09:44:26', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('ef2fea1132354711a38f724e7f893e01', '1', '1', '--', '2016-11-01 09:44:28', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('1b7bcb09b3b94bb0b277bf0d9f8f084e', '1', '1', '--', '2016-11-01 09:44:28', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('735d8c987f3e4195aec91797f115c614', '1', '1', '--', '2016-11-01 09:44:29', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('32f0473eb9974a83a69e1c51bd2fbff1', '1', '1', '--', '2016-11-01 09:44:29', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('c013bfcad1aa4d968f0706a5ea40d197', '1', '1', '--', '2016-11-01 09:44:29', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('b725ace4a9744ea1b80ef693bd13495d', '1', '1', '--', '2016-11-01 09:44:30', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('f4a990e68aa54286b5fa5c72d21bc8ca', '1', '1', '--', '2016-11-01 09:44:30', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('da210f27180740ea917a314112584978', '1', '1', '--', '2016-11-01 09:44:31', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('effe9fe176da40c5b4b95fc49dfbfa2d', '1', '1', '--', '2016-11-01 09:44:31', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('d0e601904dae4d76b0dc04710812ee24', '1', '1', '--', '2016-11-01 10:02:12', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('b5de20a5bcf848b29970858d0759ba5a', '1', '1', '--', '2016-11-01 10:18:18', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('a54cf40171bc4e93a864854dc7a671c7', '1', '1', '--', '2016-11-01 10:18:29', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('a33ef6a6de814928a86ea95a4729adba', '1', '1', '--', '2016-11-01 10:19:27', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('1906b7184c9340038c0ae2c5751a4cf1', '1', '1', '--', '2016-11-01 10:22:51', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('b6124bab1e694b16a24812bc71abbf21', '1', '1', '--', '2016-11-01 10:22:53', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('7328c884c82f4b23ad13847bdb4e10b7', '1', '1', '--', '2016-11-01 10:22:56', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('783381a3bb6b40bd9d5ba760449ac043', '1', '1', '--', '2016-11-01 10:22:58', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('64a89c8c9ced4800a9cf219d43741dfa', '1', '1', '--', '2016-11-01 11:08:33', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('e1e790b7fbae489ba1e9c99cb72c05d9', '1', '1', '--', '2016-11-01 11:08:35', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('317a0f81fa014417ab63479e480c8100', '1', '1', '--', '2016-11-01 11:08:37', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('f46f63b8393b4c9084e11f356679b775', '1', '1', '--', '2016-11-01 11:37:51', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('0c10611d098146d5869b5afc9990c6ec', '1', '1', '--', '2016-11-01 19:17:12', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('bd459bf996e748ac8bd474bedda824cc', '1', '1', '--', '2016-11-01 21:27:49', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('783c061f2f9645edab283d03572bc844', '1', '1', '--', '2016-11-01 21:27:51', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('803aa3b0592746c9b443ce9b7d9b5da0', '1', '1', '--', '2016-11-01 21:27:53', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('3c3fc9aea9e641348f35c56b963c7e67', '1', '1', '--', '2016-11-02 16:03:59', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('de5dd489a6384014a3db5c4efb2f0f75', '1', '1', '--', '2016-11-02 16:04:02', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('17d6c0a2343a4432a7aa323dac08f0cf', '1', '1', '--', '2016-11-02 20:40:10', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('972900d9f2a64056837c77491043b425', '1', '1', '--', '2016-11-02 20:40:13', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('9320ce1074484907afd8d240414a7de8', '1', '1', '--', '2016-11-02 20:40:14', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('99f60c4c1c8c4da59fe7f68e99e37a8b', '1', '1', '--', '2016-11-02 20:40:17', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('baab596f5f3b403ba39e3140f8005309', '1', '1', '--', '2016-11-02 20:40:20', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('759388e28b924a9ba0b2b062138c2d81', '1', '1', '--', '2016-11-02 20:40:22', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('5afcd8ea611d437690cc8d972c9030fa', '1', '1', '--', '2016-11-03 22:18:47', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('e9e86261b29840d58914c58914fc7921', '1', '1', '--', '2016-11-05 01:51:50', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('4c73a23ed9104ea68ee59ca6235269ac', '1', '1', '--', '2016-11-05 01:51:53', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('91cdb07b52564723945cc36d34ae59c4', '1', '1', '--', '2016-11-13 18:55:16', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('25277e1ce5da4356906e79b5a6324700', '1', '1', '--', '2016-11-20 03:01:23', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('f351a48ee330473fb8aa7ca604bd44c4', '1', '1', '--', '2016-11-20 15:11:11', '2016-11-26 13:03:06', 'DELETE');\nINSERT INTO `product_focus` VALUES ('20f76424ffe24561a880c309cf098a22', '1', '1', '--', '2016-11-26 13:03:08', '2016-11-26 13:03:08', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for product_type\n-- ----------------------------\nDROP TABLE IF EXISTS `product_type`;\nCREATE TABLE `product_type` (\n  `id` varchar(255) NOT NULL,\n  `name` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of product_type\n-- ----------------------------\nINSERT INTO `product_type` VALUES ('1', '主营食品', '--', '2016-06-29 10:11:40', '2016-06-29 10:11:42', 'NORMAL');\nINSERT INTO `product_type` VALUES ('2', '粮油调味', '--', '2016-10-29 21:31:01', '2016-10-29 21:31:04', 'NORMAL');\nINSERT INTO `product_type` VALUES ('3', '日用清洁', '--', '2016-10-29 21:31:27', '2016-10-29 21:31:30', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for province\n-- ----------------------------\nDROP TABLE IF EXISTS `province`;\nCREATE TABLE `province` (\n  `id` varchar(255) NOT NULL,\n  `name` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of province\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for refund_type\n-- ----------------------------\nDROP TABLE IF EXISTS `refund_type`;\nCREATE TABLE `refund_type` (\n  `id` varchar(255) NOT NULL,\n  `name` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of refund_type\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for return_reason\n-- ----------------------------\nDROP TABLE IF EXISTS `return_reason`;\nCREATE TABLE `return_reason` (\n  `id` varchar(255) NOT NULL,\n  `name` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of return_reason\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for return_status\n-- ----------------------------\nDROP TABLE IF EXISTS `return_status`;\nCREATE TABLE `return_status` (\n  `id` varchar(255) NOT NULL,\n  `name` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of return_status\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for role\n-- ----------------------------\nDROP TABLE IF EXISTS `role`;\nCREATE TABLE `role` (\n  `id` varchar(64) NOT NULL,\n  `name` varchar(32) DEFAULT NULL,\n  `enname` varchar(32) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of role\n-- ----------------------------\nINSERT INTO `role` VALUES ('1', 'Super Administrator', null, '超级管理员:超级管理员拥有系统全部的权限', '2016-05-19 16:37:15', '2016-05-19 16:37:18', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for role_permission\n-- ----------------------------\nDROP TABLE IF EXISTS `role_permission`;\nCREATE TABLE `role_permission` (\n  `role_id` varchar(64) NOT NULL,\n  `permission_id` varchar(64) NOT NULL,\n  PRIMARY KEY (`role_id`,`permission_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of role_permission\n-- ----------------------------\nINSERT INTO `role_permission` VALUES ('1', '1');\n\n-- ----------------------------\n-- Table structure for sms_history\n-- ----------------------------\nDROP TABLE IF EXISTS `sms_history`;\nCREATE TABLE `sms_history` (\n  `id` varchar(64) DEFAULT NULL,\n  `phone` varchar(255) DEFAULT NULL,\n  `content` varchar(255) DEFAULT NULL,\n  `timeout` int(11) DEFAULT NULL,\n  `type` varchar(255) DEFAULT NULL,\n  `sender` varchar(255) DEFAULT NULL,\n  `receiver_id` int(11) DEFAULT NULL,\n  `user_ip` varchar(255) DEFAULT NULL,\n  `validate` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of sms_history\n-- ----------------------------\nINSERT INTO `sms_history` VALUES ('54bdd170993e46e5a18ba00a3fcc5fc5', '18600536683', '尊敬的用户，您的验证码为7367，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', '0', '127.0.0.1', '7367', '--', '2016-07-11 19:48:13', '2016-07-11 19:48:13', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('adfada563b524959a877dd88d1ffe3f8', '18600536683', '尊敬的用户，您的验证码为5298，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '127.0.0.1', '5298', '--', '2016-07-11 19:49:33', '2016-07-11 19:49:33', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('1d3c318b06624686a29a5fa2cc6ed33e', '18600536683', '尊敬的用户，您的验证码为2878，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '127.0.0.1', '2878', '--', '2016-07-11 19:51:21', '2016-07-11 19:51:21', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('b28e214a87c94a2d9e3d6caca2ea6d51', '18600536683', '尊敬的用户，您的验证码为2877，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '127.0.0.1', '2877', '--', '2016-07-11 20:30:40', '2016-07-11 20:30:40', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('24381a51fb8a491daf61a323468aa8ee', '18600536683', '尊敬的用户，您的验证码为9158，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '127.0.0.1', '9158', '--', '2016-07-12 10:21:08', '2016-07-12 10:21:08', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('74763c7ffdcf400eae9424b31aff6dd1', '18600536683', '尊敬的用户，您的验证码为1287，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '127.0.0.1', '1287', '--', '2016-07-12 10:34:10', '2016-07-12 10:34:10', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('3140775641c6475882ed1ca9393dfb17', '18600536683', '尊敬的用户，您的验证码为1276，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '127.0.0.1', '1276', '--', '2016-07-12 10:37:48', '2016-07-12 10:37:48', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('f034b9585e4e41baabf86c9d57b19606', '18600536683', '尊敬的用户，您的验证码为5384，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '127.0.0.1', '5384', '--', '2016-07-12 11:04:48', '2016-07-12 11:04:48', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('e86149af290648108f5d4fdb4d0285c8', '18600536683', '尊敬的用户，您的验证码为5138，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '127.0.0.1', '5138', '--', '2016-07-12 11:11:05', '2016-07-12 11:11:05', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('e01665a042584448a0259b718c7d06a6', '18600536683', '????????????9502?????????10?????????', '10', 'VALIDATE', 'system', null, '127.0.0.2', '9502', '--', '2016-09-20 11:05:09', '2016-09-20 11:05:09', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('4b1ca7e9443043d18313df99f7a968a3', '18600536683', '尊敬的用户，您的验证码为0393，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '127.0.0.2', '0393', '--', '2016-09-20 11:08:28', '2016-09-20 11:08:28', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('0c55a56bd7db433998cb18950839ca3e', '18600536691', '尊敬的用户，您的验证码为0826，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '1.95.89.148', '0826', '--', '2016-11-14 22:38:27', '2016-11-14 22:38:27', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('e659e3e0c85740298d301067e365b593', '18600536691', '尊敬的用户，您的验证码为3342，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '1.95.89.148', '3342', '--', '2016-11-14 22:38:27', '2016-11-14 22:38:27', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('cb373c4b35c94b10b917b505245ca310', '18600536691', '尊敬的用户，您的验证码为3230，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '1.95.89.148', '3230', '--', '2016-11-14 22:38:27', '2016-11-14 22:38:27', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('37d923fc675442469abd5957e1d8e8d9', '18600536691', '尊敬的用户，您的验证码为8449，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '1.95.89.148', '8449', '--', '2016-11-14 22:39:08', '2016-11-14 22:39:08', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('b41eab67dda84711ae15de9623651e8b', '18600536684', '尊敬的用户，您的验证码为3851，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '61.148.243.49', '3851', '--', '2016-11-20 20:04:00', '2016-11-20 20:04:00', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('83a6af54e79942e8b828d6c761e351d6', '18600536684', '尊敬的用户，您的验证码为4174，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '61.148.243.49', '4174', '--', '2016-11-20 20:04:00', '2016-11-20 20:04:00', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('6229a90aea134aef9a54b8accf29bb08', '18600536683', '尊敬的用户，您的验证码为4831，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '1.95.244.184', '4831', '--', '2016-11-20 22:39:33', '2016-11-20 22:39:33', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('55f842d5d1cd42589c1a8670aea1f1c5', '18600536683', '您于11月20日10时48分余额消费7.0元，如有疑问请致电18600536683', '0', 'NOTICE_CASH_COMSUME', 'system', null, '1.95.244.184', null, '--', '2016-11-20 22:48:54', '2016-11-20 22:48:54', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('f867dfbf295e42399c40fe02fdb1bc09', '18600536683', '您于11月20日11时07分使用余额消费5.0元，如有疑问请致电18600536683', '0', 'NOTICE_CASH_COMSUME', 'system', null, '1.95.244.184', null, '--', '2016-11-20 23:07:30', '2016-11-20 23:07:30', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('451e0929d1da43c0bfe9cc878a7050c2', '18600536683', '您于11月21日12时39分使用余额消费3.0元，如有疑问请致电18600536683', '0', 'NOTICE_CASH_COMSUME', 'system', null, '1.95.244.184', null, '--', '2016-11-21 00:39:19', '2016-11-21 00:39:19', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('5aac6ffdddca4aa18e11705213b2208a', '18600536683', '您于11月21日12时40分使用余额消费3.0元，如有疑问请致电18600536683', '0', 'NOTICE_CASH_COMSUME', 'system', null, '1.95.244.184', null, '--', '2016-11-21 00:40:14', '2016-11-21 00:40:14', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('dd083bb5bc8f4f9188a9a5f9f94fb7a7', '18600536681', '尊敬的用户，您的验证码为0649，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '1.95.244.184', '0649', '--', '2016-11-21 01:24:39', '2016-11-21 01:24:39', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('8530b0ab3b5d413ba58a8e6bacf2951a', '18600536683', '您于11月21日12时57分使用余额消费3.5元，如有疑问请致电18600536683', '0', 'NOTICE_CASH_COMSUME', 'system', null, '210.74.5.16', null, '--', '2016-11-21 12:57:36', '2016-11-21 12:57:36', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('91086a24d533462a8a6291a11c00e5b9', '18600536683', '您于11月21日11时58分使用余额消费3.0元，如有疑问请致电18600536683', '0', 'NOTICE_CASH_COMSUME', 'system', null, '1.95.244.184', null, '--', '2016-11-21 23:58:11', '2016-11-21 23:58:11', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('dc046cfafd7b45e4b3ca4f4903bd7be6', '18600536683', '您于11月21日11时59分使用余额消费3.0元，如有疑问请致电18600536683', '0', 'NOTICE_CASH_COMSUME', 'system', null, '1.95.244.184', null, '--', '2016-11-21 23:59:03', '2016-11-21 23:59:03', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('ee44dd19167f48b09eaeadf5c2c71b3f', '18600536681', '尊敬的用户，您的验证码为9455，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '1.95.244.184', '9455', '--', '2016-11-22 00:11:53', '2016-11-22 00:11:53', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('7fd2a542135b48d1ba2b4d127c657697', '18600536681', '尊敬的用户，您的验证码为5488，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '1.95.244.184', '5488', '--', '2016-11-22 00:27:16', '2016-11-22 00:27:16', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('3b0b568ce04b4b07886d44e98fba26e9', '18600536681', '尊敬的用户，您的验证码为6752，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '1.95.244.183', '6752', '--', '2016-11-22 00:27:16', '2016-11-22 00:27:16', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('a0e4b842fe2e4f99968d1f7693ace9e7', '18600536681', '尊敬的用户，您的验证码为5660，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '1.95.244.184', '5660', '--', '2016-11-22 00:27:28', '2016-11-22 00:27:28', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('084f9823d47b425c941a932ffcccc8f2', '18600536682', '尊敬的用户，您的验证码为8664，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '1.95.244.184', '8664', '--', '2016-11-22 00:27:53', '2016-11-22 00:27:53', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('0d71b4b3bb8b46058d4a3f46c47d1893', '18600536683', '您于11月22日12时34分使用余额消费56.5元，如有疑问请致电18600536683', '0', 'NOTICE_CASH_COMSUME', 'system', null, '1.95.244.184', null, '--', '2016-11-22 00:34:02', '2016-11-22 00:34:02', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('cf36b42d8ee044caaf20fa05509e1183', '18600536683', '您于11月22日12时36分使用余额消费30.5元，如有疑问请致电18600536683', '0', 'NOTICE_CASH_COMSUME', 'system', null, '1.95.244.184', null, '--', '2016-11-22 00:36:34', '2016-11-22 00:36:34', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('c91ebff39a3f4f04815a82fb14b853ea', '18600536683', '您于11月23日11时58分使用余额消费5.0元，如有疑问请致电18600536683', '0', 'NOTICE_CASH_COMSUME', 'system', null, '1.95.78.51', null, '--', '2016-11-23 23:58:33', '2016-11-23 23:58:33', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('f7f066adcc1b46d295ad01b6760a04f0', '18600536683', '您于11月23日11时58分使用余额消费5.0元，如有疑问请致电18600536683', '0', 'NOTICE_CASH_COMSUME', 'system', null, '1.95.78.51', null, '--', '2016-11-23 23:58:33', '2016-11-23 23:58:33', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('ff7dbb56b14a4c69a782d63ed7d81bf2', '18600536683', '您于11月24日12时00分使用余额消费5.0元，如有疑问请致电18600536683', '0', 'NOTICE_CASH_COMSUME', 'system', null, '1.95.78.51', null, '--', '2016-11-24 00:00:26', '2016-11-24 00:00:26', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('266429719d3c4ffa8498d21390c51f66', '18600536683', '您于11月24日12时01分使用余额消费2.0元，如有疑问请致电18600536683', '0', 'NOTICE_CASH_COMSUME', 'system', null, '1.95.78.51', null, '--', '2016-11-24 00:01:00', '2016-11-24 00:01:00', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('8ffb0ca54f724fcca45c3af8be8615b1', '18600536686', '尊敬的用户，您的验证码为9633，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '1.95.244.24', '9633', '--', '2016-11-26 16:52:41', '2016-11-26 16:52:41', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('98a47985ecf6414f8070871513f6b2b8', '18600536686', '尊敬的用户，您的验证码为0090，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '1.95.244.24', '0090', '--', '2016-11-26 16:53:16', '2016-11-26 16:53:16', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('c9629955308f4b349f6b0e4925063de2', '18600536687', '尊敬的用户，您的验证码为8096，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '1.95.244.24', '8096', '--', '2016-11-26 16:54:41', '2016-11-26 16:54:41', 'NORMAL');\nINSERT INTO `sms_history` VALUES ('7af5d90f245747779a2338e22cd413f7', '18600536689', '尊敬的用户，您的验证码为7093，本验证码有效时间10分钟，请勿告知他人', '10', 'VALIDATE', 'system', null, '1.95.244.24', '7093', '--', '2016-11-26 17:17:00', '2016-11-26 17:17:00', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for sms_template\n-- ----------------------------\nDROP TABLE IF EXISTS `sms_template`;\nCREATE TABLE `sms_template` (\n  `id` varchar(64) DEFAULT NULL,\n  `type` varchar(255) DEFAULT NULL,\n  `content` varchar(255) DEFAULT NULL,\n  `timeout` int(11) DEFAULT NULL,\n  `is_enable` tinyint(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of sms_template\n-- ----------------------------\nINSERT INTO `sms_template` VALUES ('1', 'VALIDATE', '尊敬的用户，您的验证码为[MSGCODE]，本验证码有效时间[TIMEOUT]分钟，请勿告知他人', '10', '1', '验证码短信', '2016-07-11 18:22:28', '2016-07-11 18:22:31', 'NORMAL');\nINSERT INTO `sms_template` VALUES ('2', 'NOTICE_CASH_COMSUME', '您于[DATE]使用余额消费[AMOUNT]元，如有疑问请致电18600536683', null, '1', '资金消费', '2016-11-20 21:51:56', '2016-11-20 21:51:59', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for system_param\n-- ----------------------------\nDROP TABLE IF EXISTS `system_param`;\nCREATE TABLE `system_param` (\n  `id` varchar(255) NOT NULL,\n  `name` varchar(255) DEFAULT NULL,\n  `title` varchar(255) DEFAULT NULL,\n  `logo` varchar(255) DEFAULT NULL,\n  `description` varchar(255) DEFAULT NULL,\n  `copyright` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of system_param\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for town\n-- ----------------------------\nDROP TABLE IF EXISTS `town`;\nCREATE TABLE `town` (\n  `id` varchar(255) DEFAULT NULL,\n  `name` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of town\n-- ----------------------------\nINSERT INTO `town` VALUES ('1', '孙寺', '--', '2016-11-03 14:25:47', '2016-11-03 14:25:49', 'NORMAL');\nINSERT INTO `town` VALUES ('2', '成武镇', '--', '2016-11-03 14:32:27', '2016-11-03 14:32:29', 'NORMAL');\n\n-- ----------------------------\n-- Table structure for village\n-- ----------------------------\nDROP TABLE IF EXISTS `village`;\nCREATE TABLE `village` (\n  `id` varchar(255) DEFAULT NULL,\n  `name` varchar(255) DEFAULT NULL,\n  `remarks` varchar(255) DEFAULT NULL,\n  `create_date` datetime DEFAULT NULL,\n  `update_date` datetime DEFAULT NULL,\n  `status` varchar(255) DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of village\n-- ----------------------------\n"
  },
  {
    "path": "weixin-common/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-common</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>junit</groupId>\n      <artifactId>junit</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>javax.servlet</groupId>\n      <artifactId>javax.servlet-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>net.sf.ehcache</groupId>\n      <artifactId>ehcache</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.apache.commons</groupId>\n      <artifactId>commons-lang3</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-codec</groupId>\n      <artifactId>commons-codec</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-io</groupId>\n      <artifactId>commons-io</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.google.guava</groupId>\n      <artifactId>guava</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>joda-time</groupId>\n      <artifactId>joda-time</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.fasterxml.jackson.core</groupId>\n      <artifactId>jackson-core</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.fasterxml.jackson.core</groupId>\n      <artifactId>jackson-databind</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.fasterxml.jackson.core</groupId>\n      <artifactId>jackson-annotations</artifactId>\n    </dependency>\n    <!-- Spring begin -->\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context-support</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-core</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-beans</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-web</artifactId>\n    </dependency>\n  </dependencies>\n\n</project>"
  },
  {
    "path": "weixin-common/src/main/java/com/cheng/weixin/common/constant/Constant.java",
    "content": "package com.cheng.weixin.common.constant;\n\n/**\n * Desc: 常量\n * Author: 光灿\n * Date: 2016/9/15\n */\npublic interface Constant {\n\n    String CART = \"CART_\";\n    String CHOOSE = \"TRUE_\";\n    String NO_CHOOSE = \"FALSE_\";\n}\n"
  },
  {
    "path": "weixin-common/src/main/java/com/cheng/weixin/common/constant/weixin/WeixinFinalValue.java",
    "content": "package com.cheng.weixin.common.constant.weixin;\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class WeixinFinalValue {\n\n\t@Value(\"${weixin.token}\")\n\tpublic String WX_TOKEN;\n\t@Value(\"${weixin.appid}\")\n\tpublic String APPID;\n\t@Value(\"${weixin.appsecret}\")\n\tpublic String APPSECRET;\n\t\n}\n"
  },
  {
    "path": "weixin-common/src/main/java/com/cheng/weixin/common/constant/weixin/WeixinUrl.java",
    "content": "package com.cheng.weixin.common.constant.weixin;\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class WeixinUrl {\n\n\t/** 获取Access_Token **/\n\t@Value(\"${weixin.url.access.token}\")\n\tpublic String ACCESS_TOKEN_URL;\n\t/** 增加自定义菜单 **/\n\t@Value(\"${weixin.url.menu.add}\")\n\tpublic String ADDMENU_URL;\n\t/** 新增临时素材 **/\n\t@Value(\"${weixin.url.tempmedia.add}\")\n\tpublic String ADD_TEMPMEDIA_URL;\n\t/** 获取媒体素材  **/\n\t@Value(\"${weixin.url.media.get}\")\n\tpublic String GET_MEDIA_URL;\n\t/** 发送模板消息 **/\n\t@Value(\"${weixin.url.templatemsg.sned}\")\n\tpublic String SEND_TEMPLATEMSG_URL;\n\n\t/** 创建分组 **/\n\t@Value(\"${weixin.url.group.add}\")\n\tpublic String ADD_GROUP;\n\t/** 查询所有分组**/\n\t@Value(\"${weixin.url.group.qurey.all}\")\n\tpublic String QUERY_ALL_GROUP;\n\t/** 查询用户所在分组 **/\n\t@Value(\"${weixin.url.group.query.user}\")\n\tpublic String QUERY_USER_GROUP;\n\t/** 修改分组名 **/\n\t@Value(\"${weixin.url.group.modify.name}\")\n\tpublic String MODIFY_GROUP_NAME;\n\t/** 移动用户分组 **/\n\t@Value(\"${weixin.url.group.move.user}\")\n\tpublic String MOVE_USER_GROUP;\n\t/** 批量移动用户分组 **/\n\t@Value(\"${weixin.url.group.batch.move.user}\")\n\tpublic String BATCH_MOVE_USER_GROUP;\n\t/** 删除分组 **/\n\t@Value(\"${weixin.url.group.delete}\")\n\tpublic String DELETE_GROUP;\n\t\n}\n"
  },
  {
    "path": "weixin-common/src/main/java/com/cheng/weixin/common/exception/BusinessException.java",
    "content": "package com.cheng.weixin.common.exception;\n\npublic class BusinessException extends RuntimeException {\n\n\tprivate static final long serialVersionUID = -9213841740412778182L;\n\t\n\tprivate int code;\n\tprivate String errorMsg;\n\t\n\tpublic BusinessException(int code, String errorMsg) {\n\t\tthis.code = code;\n\t\tthis.errorMsg = errorMsg;\n\t}\n\tpublic int getCode() {\n\t\treturn code;\n\t}\n\tpublic void setCode(int code) {\n\t\tthis.code = code;\n\t}\n\tpublic String getErrorMsg() {\n\t\treturn errorMsg;\n\t}\n\tpublic void setErrorMsg(String errorMsg) {\n\t\tthis.errorMsg = errorMsg;\n\t}\n}\n"
  },
  {
    "path": "weixin-common/src/main/java/com/cheng/weixin/common/exception/ErrorEntity.java",
    "content": "package com.cheng.weixin.common.exception;\n\n/**\n * 错误消息 包装类\n * @author Cheng\n */\npublic class ErrorEntity {\n\n\tprivate String errcode;\n\tprivate String errmsg;\n\t\n\tpublic String getErrcode() {\n\t\treturn errcode;\n\t}\n\tpublic void setErrcode(String errcode) {\n\t\tthis.errcode = errcode;\n\t}\n\tpublic String getErrmsg() {\n\t\treturn errmsg;\n\t}\n\tpublic void setErrmsg(String errmsg) {\n\t\tthis.errmsg = errmsg;\n\t}\n}\n"
  },
  {
    "path": "weixin-common/src/main/java/com/cheng/weixin/common/exception/MassageException.java",
    "content": "package com.cheng.weixin.common.exception;\n\npublic class MassageException extends RuntimeException {\n\n\tprivate static final long serialVersionUID = 1L;\n\tprivate int code;\n\tprivate String errorMsg;\n\t\n\tpublic MassageException() {\n\t}\n\tpublic MassageException(int code, String errorMsg) {\n\t\tthis.code = code;\n\t\tthis.errorMsg = errorMsg;\n\t}\n\tpublic int getCode() {\n\t\treturn code;\n\t}\n\tpublic void setCode(int code) {\n\t\tthis.code = code;\n\t}\n\tpublic String getErrorMsg() {\n\t\treturn errorMsg;\n\t}\n\tpublic void setErrorMsg(String errorMsg) {\n\t\tthis.errorMsg = errorMsg;\n\t}\n}\n"
  },
  {
    "path": "weixin-common/src/main/java/com/cheng/weixin/common/exception/WeixinException.java",
    "content": "package com.cheng.weixin.common.exception;\n\npublic class WeixinException extends RuntimeException {\n\tprivate static final long serialVersionUID = 1L;\n\tprivate int code;\n\tprivate String errorMsg;\n\t\n\tpublic WeixinException() {\n\t}\n\tpublic WeixinException(int code, String errorMsg) {\n\t\tthis.code = code;\n\t\tthis.errorMsg = errorMsg;\n\t}\n\tpublic int getCode() {\n\t\treturn code;\n\t}\n\tpublic void setCode(int code) {\n\t\tthis.code = code;\n\t}\n\tpublic String getErrorMsg() {\n\t\treturn errorMsg;\n\t}\n\tpublic void setErrorMsg(String errorMsg) {\n\t\tthis.errorMsg = errorMsg;\n\t}\n\t\n}\n"
  },
  {
    "path": "weixin-common/src/main/java/com/cheng/weixin/common/model/Page.java",
    "content": "package com.cheng.weixin.common.model;\n\nimport java.util.List;\n\n/**\n * Desc: 分页对象\n * Author: cheng\n * Date: 2016/5/27\n */\npublic class Page<T> {\n    //当前页\n    private int pageNum;\n    //每页的数量\n    private int pageSize;\n    //当前页的数量\n    private int size;\n    //总记录数\n    private long total;\n    //总页数\n    private int pages;\n    //结果集\n    private List<T> list;\n\n    //第一页\n    private int firstPage;\n    //前一页\n    private int prePage;\n    //下一页\n    private int nextPage;\n    //最后一页\n    private int lastPage;\n\n    //是否为第一页\n    private boolean isFirstPage = false;\n    //是否为最后一页\n    private boolean isLastPage = false;\n    //是否有前一页\n    private boolean hasPreviousPage = false;\n    //是否有下一页\n    private boolean hasNextPage = false;\n\n    public int getPrePage() {\n        return prePage;\n    }\n\n    public void setPrePage(int prePage) {\n        this.prePage = prePage;\n    }\n\n    public int getPageNum() {\n        return pageNum;\n    }\n\n    public void setPageNum(int pageNum) {\n        this.pageNum = pageNum;\n    }\n\n    public int getPageSize() {\n        return pageSize;\n    }\n\n    public void setPageSize(int pageSize) {\n        this.pageSize = pageSize;\n    }\n\n    public int getSize() {\n        return size;\n    }\n\n    public void setSize(int size) {\n        this.size = size;\n    }\n\n    public long getTotal() {\n        return total;\n    }\n\n    public void setTotal(long total) {\n        this.total = total;\n    }\n\n    public int getPages() {\n        return pages;\n    }\n\n    public void setPages(int pages) {\n        this.pages = pages;\n    }\n\n    public List<T> getList() {\n        return list;\n    }\n\n    public void setList(List<T> list) {\n        this.list = list;\n    }\n\n    public int getFirstPage() {\n        return firstPage;\n    }\n\n    public void setFirstPage(int firstPage) {\n        this.firstPage = firstPage;\n    }\n\n    public int getNextPage() {\n        return nextPage;\n    }\n\n    public void setNextPage(int nextPage) {\n        this.nextPage = nextPage;\n    }\n\n    public int getLastPage() {\n        return lastPage;\n    }\n\n    public void setLastPage(int lastPage) {\n        this.lastPage = lastPage;\n    }\n\n    public boolean isFirstPage() {\n        return isFirstPage;\n    }\n\n    public void setFirstPage(boolean firstPage) {\n        isFirstPage = firstPage;\n    }\n\n    public boolean isLastPage() {\n        return isLastPage;\n    }\n\n    public void setLastPage(boolean lastPage) {\n        isLastPage = lastPage;\n    }\n\n    public boolean isHasPreviousPage() {\n        return hasPreviousPage;\n    }\n\n    public void setHasPreviousPage(boolean hasPreviousPage) {\n        this.hasPreviousPage = hasPreviousPage;\n    }\n\n    public boolean isHasNextPage() {\n        return hasNextPage;\n    }\n\n    public void setHasNextPage(boolean hasNextPage) {\n        this.hasNextPage = hasNextPage;\n    }\n}\n"
  },
  {
    "path": "weixin-common/src/main/java/com/cheng/weixin/common/security/CodecUtil.java",
    "content": "package com.cheng.weixin.common.security;\n\nimport org.apache.commons.lang3.RandomStringUtils;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport java.util.UUID;\n\n/**\n * Desc: 编码与解码操作工具类\n * Author: cheng\n * Date: 2016/6/22\n */\npublic class CodecUtil {\n\n    private static Logger logger = LoggerFactory.getLogger(CodecUtil.class);\n\n    /**\n     * 创建随机数\n     */\n    public static String createRandomNum(int count) {\n        return RandomStringUtils.randomNumeric(count);\n    }\n\n    /**\n     * 获取 UUID（32位）\n     */\n    public static String createUUID() {\n        return UUID.randomUUID().toString().replaceAll(\"-\", \"\").toUpperCase();\n    }\n}\n"
  },
  {
    "path": "weixin-common/src/main/java/com/cheng/weixin/common/security/Digests.java",
    "content": "package com.cheng.weixin.common.security;\n\n\nimport com.cheng.weixin.common.utils.Exceptions;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.UnsupportedEncodingException;\nimport java.security.GeneralSecurityException;\nimport java.security.MessageDigest;\nimport java.security.NoSuchAlgorithmException;\nimport java.security.SecureRandom;\n\n/**\n * Desc: 支持SHA-1/MD5消息摘要的工具类\n *       返回ByteSource，可进一步被编码为Hex, Base64或UrlSafeBase64\n * Author: Cheng\n * Date: 2016/1/30 0030\n */\npublic class Digests {\n\n    private static final String SHA1 = \"SHA-1\";\n    private static final String MD5 = \"MD5\";\n\n    public static final String CHARSET = \"UTF-8\";\n\n    private static SecureRandom random = new SecureRandom();\n\n    /**\n     * 生成随机的Byte[]作为盐值\n     * @param numBatys 盐值的大小\n     * @return\n     */\n    public static byte[] generateSalt(int numBatys) {\n        byte[] bytes = new byte[numBatys];\n        random.nextBytes(bytes);\n        return bytes;\n    }\n    /**\n     * 对输入字符串进行md5散列，基于MD5算法的单向加密\n     */\n    public static String md5(String strSrc) throws UnsupportedEncodingException {\n        return  Encodes.encodeHex(md5(strSrc.getBytes(CHARSET)));\n    }\n    public static byte[] md5(byte[] input) {\n        return digest(input, MD5, null, 1);\n    }\n    public static byte[] md5(byte[] input, int iterations) {\n        return digest(input, MD5, null, iterations);\n    }\n    /**\n     * 对输入字符串进行sha1散列.\n     */\n    /**\n     * 将字符串 SHA 加密\n     */\n    public static String sha1(String str) throws UnsupportedEncodingException {\n        return Encodes.encodeHex(md5(str.getBytes(CHARSET)));\n    }\n    public static byte[] sha1(byte[] input) {\n        return digest(input, SHA1, null, 1);\n    }\n\n    public static byte[] sha1(byte[] input, byte[] salt) {\n        return digest(input, SHA1, salt, 1);\n    }\n\n    public static byte[] sha1(byte[] input, byte[] salt, int iterations) {\n        return digest(input, SHA1, salt, iterations);\n    }\n\n    /**\n     * 对字符串进行散列，支持MD5/SHA-1算法\n     * @param input 需要散列的数据\n     * @param algorithm 算法MD5/SHA-1\n     * @param salt 盐值\n     * @param iterations 迭代次数\n     * @return\n     */\n    private static byte[] digest(byte[] input, String algorithm, byte[] salt, int iterations) {\n        try {\n            MessageDigest digest = MessageDigest.getInstance(algorithm);\n            if(salt!=null) {\n                digest.update(salt);\n            }\n            byte[] result = digest.digest(input);\n            for (int i=1; i<iterations; i++) {\n                digest.reset();\n                result = digest.digest(result);\n            }\n            return result;\n        } catch (NoSuchAlgorithmException e) {\n            throw Exceptions.unchecked(e);\n        }\n    }\n\n    /**\n     * 对文件进行md5散列.\n     */\n    public static byte[] md5(InputStream input) throws IOException {\n        return digest(input, MD5);\n    }\n\n    /**\n     * 对文件进行sha1散列.\n     */\n    public static byte[] sha1(InputStream input) throws IOException {\n        return digest(input, SHA1);\n    }\n\n    private static byte[] digest(InputStream input, String algorithm) throws IOException {\n        try {\n            MessageDigest messageDigest = MessageDigest.getInstance(algorithm);\n            int bufferLength = 8 * 1024;\n            byte[] buffer = new byte[bufferLength];\n            int read = input.read(buffer, 0, bufferLength);\n\n            while (read > -1) {\n                messageDigest.update(buffer, 0, read);\n                read = input.read(buffer, 0, bufferLength);\n            }\n\n            return messageDigest.digest();\n        } catch (GeneralSecurityException e) {\n            throw Exceptions.unchecked(e);\n        }\n    }\n}\n"
  },
  {
    "path": "weixin-common/src/main/java/com/cheng/weixin/common/security/Encodes.java",
    "content": "package com.cheng.weixin.common.security;\n\nimport com.cheng.weixin.common.utils.Exceptions;\nimport org.apache.commons.codec.DecoderException;\nimport org.apache.commons.codec.binary.Base64;\nimport org.apache.commons.codec.binary.Hex;\nimport org.apache.commons.lang3.StringEscapeUtils;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLDecoder;\nimport java.net.URLEncoder;\n\n/**\n * Desc: 封装的各种编码/解码工具类\n * 1.Commons-Codec的 hex/base64 编码\n * 2.Commons-Lang的xml/html escape\n * Author: Cheng\n * Date: 2016/1/29 0029\n */\npublic class Encodes {\n\n    private static Logger logger = LoggerFactory.getLogger(Encodes.class);\n    /**\n     * Hex编码\n     * @param input\n     * @return\n     */\n    public static String encodeHex(byte[] input) {\n        return Hex.encodeHexString(input);\n    }\n\n    /**\n     * Hex解码\n     * @param input\n     * @return\n     */\n    public static byte[] decodeHex(String input) {\n        try {\n            return Hex.decodeHex(input.toCharArray());\n        } catch (DecoderException e) {\n            throw Exceptions.unchecked(e);\n        }\n    }\n\n    /**\n     * Html 解码\n     * @param htmlEscaped\n     * @return\n     */\n    public static String unescapeHtml(String htmlEscaped) {\n        return StringEscapeUtils.unescapeHtml4(htmlEscaped);\n    }\n\n    /**\n     * Html 转码.\n     */\n    public static String escapeHtml(String html) {\n        return StringEscapeUtils.escapeHtml4(html);\n    }\n\n    /**\n     * 将 URL 编码\n     */\n    public static String encodeURL(String str) {\n        String target;\n        try {\n            target = URLEncoder.encode(str, \"UTF-8\");\n        } catch (Exception e) {\n            logger.error(\"编码出错！\", e);\n            throw new RuntimeException(e);\n        }\n        return target;\n    }\n\n    /**\n     * 将 URL 解码\n     */\n    public static String decodeURL(String str) {\n        String target;\n        try {\n            target = URLDecoder.decode(str, \"UTF-8\");\n        } catch (Exception e) {\n            logger.error(\"解码出错！\", e);\n            throw new RuntimeException(e);\n        }\n        return target;\n    }\n\n    /**\n     * 将字符串 Base64 编码\n     */\n    public static String encodeBASE64(String str) {\n        String target;\n        try {\n            target = Base64.encodeBase64URLSafeString(str.getBytes(\"UTF-8\"));\n        } catch (UnsupportedEncodingException e) {\n            logger.error(\"编码出错！\", e);\n            throw new RuntimeException(e);\n        }\n        return target;\n    }\n\n    /**\n     * 将字符串 Base64 解码\n     */\n    public static String decodeBASE64(String str) {\n        String target;\n        try {\n            target = new String(Base64.decodeBase64(str), \"UTF-8\");\n        } catch (UnsupportedEncodingException e) {\n            logger.error(\"解码出错！\", e);\n            throw new RuntimeException(e);\n        }\n        return target;\n    }\n}\n"
  },
  {
    "path": "weixin-common/src/main/java/com/cheng/weixin/common/security/SecretUtils.java",
    "content": "package com.cheng.weixin.common.security;\n\n/**\n * Desc: 封装一些加密工具 密码的加密、验证\n * Author: 光灿\n * Date: 2016/7/9\n */\npublic class SecretUtils {\n    /** Shiro 算法 **/\n    public static final String HASH_ALGORITHM = \"SHA-1\";\n    /** 盐值的大小 **/\n    public static final int SALT_SIZE = 8;\n    /** 迭代的次数 **/\n    public static final int HASH_INTERATIONS = 1024;\n\n    /**\n     * 生成密码，生成随机数的16为盐值并且经过1024次 SHA-1 Hash\n     * @param plainPassword\n     * @return\n     */\n    public static String entryptPassword(String plainPassword) {\n        String plain = Encodes.unescapeHtml(plainPassword);\n        byte[] salt = Digests.generateSalt(SALT_SIZE);\n        byte[] hashPassword = Digests.sha1(plain.getBytes(), salt, HASH_INTERATIONS);\n        return Encodes.encodeHex(salt)+Encodes.encodeHex(hashPassword);\n    }\n\n    /**\n     * @param planinPassword 明文密码\n     * @param password 加密的密码\n     * @return 验证结果\n     */\n    public static boolean validatePassword(String planinPassword, String password) {\n        String plain = Encodes.unescapeHtml(planinPassword);\n        byte[] salt = Encodes.decodeHex(password.substring(0, 16));\n        byte[] hashPassword = Digests.sha1(plain.getBytes(), salt, HASH_INTERATIONS);\n        return password.equals(Encodes.encodeHex(salt)+Encodes.encodeHex(hashPassword));\n    }\n}\n"
  },
  {
    "path": "weixin-common/src/main/java/com/cheng/weixin/common/utils/CacheUtils.java",
    "content": "package com.cheng.weixin.common.utils;\n\nimport net.sf.ehcache.Cache;\nimport net.sf.ehcache.CacheManager;\nimport net.sf.ehcache.Element;\n\n/**\n * Desc: 缓存工具类\n * Author: Cheng\n * Date: 2016/2/1 0001\n */\npublic class CacheUtils {\n\n    private static CacheManager cacheManager = SpringContextHolder.getBean(\"cacheManagerFactory\");\n\n    /** 系统缓存 **/\n    private static final String SYS_CACHE=\"sysCache\";\n\n    /**\n     * 获取系统缓存\n     * @param key\n     * @return\n     */\n    public static Object getSysCache(String key) {\n        return get(SYS_CACHE, key);\n    }\n\n    /**\n     * 写入系统缓存\n     * @param key\n     * @param value\n     */\n    public static void putSysCache(String key, Object value) {\n        put(SYS_CACHE, key, value);\n    }\n\n    /**\n     * 移除系统缓存\n     * @param key\n     */\n    public static void removeSysCache(String key) {\n        remove(SYS_CACHE, key);\n    }\n    /**\n     * 获取缓存\n     * @param cacheName\n     * @param key\n     * @return\n     */\n    public static Object get(String cacheName, String key) {\n        Cache cache = getCache(cacheName);\n        if (cache != null) {\n            Element element = cache.get(key);\n            return element == null ? null : element.getObjectValue();\n        }\n        return cache;\n\n    }\n\n    /**\n     * 写入缓存\n     * @param cacheName\n     * @param key\n     * @param value\n     */\n    public static void put(String cacheName, String key, Object value) {\n        Element element = new Element(key, value);\n        getCache(cacheName).put(element);\n    }\n\n    /**\n     * 移除缓存\n     * @param cacheName\n     * @param key\n     */\n    public static void remove(String cacheName, String key) {\n        getCache(cacheName).remove(key);\n    }\n    /**\n     * 获取一个Cache如果没有则创建一个\n     * @param cacheName\n     * @return\n     */\n    private static Cache getCache(String cacheName) {\n        Cache cache = cacheManager.getCache(cacheName);\n        if (null==cache) {\n            cacheManager.addCache(cacheName);\n        }\n        return cache;\n    }\n}\n"
  },
  {
    "path": "weixin-common/src/main/java/com/cheng/weixin/common/utils/Captcha.java",
    "content": "package com.cheng.weixin.common.utils;\n\n\nimport java.awt.*;\nimport java.awt.image.BufferedImage;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Random;\n\n/**\n * Author: 光灿\n * Date: 2016/1/24\n */\npublic class Captcha {\n\n    public static final String CAPTCHA = \"captcha\";\n\n    private int width;\n    private int height;\n    private int num;\n    private String code;\n    private static final Random ran = new Random();\n    private static Captcha captcha;\n\n    private Captcha(){\n        code = \"0123456789abcdefghrjklmn\";\n        num = 4;\n    }\n\n    public static Captcha getInstance() {\n        if(captcha==null) captcha = new Captcha();\n        return captcha;\n    }\n\n    public void set(int width,int height,int num,String code) {\n        this.width = width;\n        this.height = height;\n        this.setNum(num);\n        this.setCode(code);\n    }\n\n    public void set(int width,int height) {\n        this.width = width;\n        this.height = height;\n    }\n\n    public int getWidth() {\n        return width;\n    }\n    public void setWidth(int width) {\n        this.width = width;\n    }\n    public int getHeight() {\n        return height;\n    }\n    public void setHeight(int height) {\n        this.height = height;\n    }\n    public int getNum() {\n        return num;\n    }\n    public void setNum(int num) {\n        this.num = num;\n    }\n    public String getCode() {\n        return code;\n    }\n    public void setCode(String code) {\n        this.code = code;\n    }\n    //生成验证码\n    public String generateCheckcode() {\n        StringBuffer cc = new StringBuffer();\n        for(int i=0;i<num;i++) {\n            cc.append(code.charAt(ran.nextInt(code.length())));\n        }\n        return cc.toString();\n    }\n    //生成验证图片\n    public BufferedImage generateCheckImg(String checkcode) {\n        //创建一个图片对象\n        BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);\n        //获取图片对象的画笔\n        Graphics2D graphic = img.createGraphics();\n        //设置背景\n        graphic.setColor(Color.WHITE);\n        graphic.fillRect(0, 0, width, height);\n        //加边框\n        graphic.setColor(Color.BLACK);\n        graphic.drawRect(0, 0, width-1, height-1);\n        Font font = new Font(\"宋体\",Font.BOLD+Font.ITALIC,(int)(height*0.8));\n        graphic.setFont(font);\n        for(int i=0;i<num;i++) {\n            graphic.setColor(new Color(ran.nextInt(180),ran.nextInt(180),ran.nextInt(180)));\n            graphic.drawString(String.valueOf(checkcode.charAt(i)), i*(width/num)+4, (int)(height*0.8));\n        }\n\n        //加一些点\n        for(int i=0;i<(width+height);i++) {\n            graphic.setColor(new Color(ran.nextInt(255),ran.nextInt(255),ran.nextInt(255)));\n            graphic.drawOval(ran.nextInt(width), ran.nextInt(height), 1, 1);\n        }\n\n        //加一些线\n        for(int i=0;i<4;i++) {\n            graphic.setColor(new Color(ran.nextInt(255),ran.nextInt(255),ran.nextInt(255)));\n            graphic.drawLine(0, ran.nextInt(height), width, ran.nextInt(height));\n        }\n        return img;\n    }\n\n    /**\n     * 是否启用验证码登录\n     * @param username 用户名\n     * @param isFail 这次登录是否失败\n     * @param clean 登录成功后记数清零\n     * @return\n     */\n    public static boolean isValidateCodeLogin(String username, boolean isFail, boolean clean) {\n        Map<String, Integer> loginFailMap = (Map<String, Integer>) CacheUtils.getSysCache(\"loginFailMap\");\n        if (null == loginFailMap) {\n            loginFailMap = new HashMap<>();\n            CacheUtils.putSysCache(\"loginFailMap\", loginFailMap);\n        }\n        Integer loginFailNum = loginFailMap.get(username);\n        if (null == loginFailNum) {\n            loginFailNum = 0;\n        }\n        if (isFail) {\n            loginFailNum++;\n            loginFailMap.put(username, loginFailNum);\n        }\n        if (clean) {\n            loginFailMap.remove(username);\n        }\n        return loginFailNum >= 3;\n    }\n\n}\n"
  },
  {
    "path": "weixin-common/src/main/java/com/cheng/weixin/common/utils/DateUtils.java",
    "content": "package com.cheng.weixin.common.utils;\n\nimport java.sql.Timestamp;\nimport java.text.DateFormat;\nimport java.text.ParseException;\nimport java.text.SimpleDateFormat;\nimport java.util.Calendar;\nimport java.util.Date;\n\n/**\n * Desc: 时间工具\n * Author: Cheng\n * Date: 2016/3/23 0023\n */\npublic class DateUtils {\n    public static final String YYYY_YEAR_MM_MONTH_DD_DATE = \"yyyy年MM月dd日\";\n    public static final String YYYY_MM_DD = \"yyyy-MM-dd\";\n    public static final String YYYY_BIAS_MM_BIAS_DD = \"yyyy/MM/dd\";\n    public static final String YYYY_MM_DD_HH_MM_SS = \"yyyy-MM-dd HH:mm:ss\";\n    public static final String YYYY_MM_DD_HH_MM_SS_SSS = \"yyyy-MM-dd HH:mm:ss.SSS\";\n    public static final String HH_MM_SS = \"HH:mm:ss\";\n    public static final String YYYY_MM_DD_HH_MM = \"yyyy-MM-dd HH:mm\";\n    public static final String YYYY = \"yyyy\";\n    public static final String MM = \"MM\";\n    public static final String DD = \"dd\";\n    public static final String HH = \"HH\";\n    public static final String MI = \"mm\";\n    public static final String SS = \"ss\";\n    public static final String SIMPLE_YYYY_MM_DD = \"yyyyMMdd\";\n    /**\n     * 转换为时间（天,时:分:秒.毫秒）\n     * @param timeMillis\n     * @return\n     */\n    public static String formatDateTime(long timeMillis){\n        long day = timeMillis/(24*60*60*1000);\n        long hour = (timeMillis/(60*60*1000)-day*24);\n        long min = ((timeMillis/(60*1000))-day*24*60-hour*60);\n        long s = (timeMillis/1000-day*24*60*60-hour*60*60-min*60);\n        long sss = (timeMillis-day*24*60*60*1000-hour*60*60*1000-min*60*1000-s*1000);\n        return (day>0?day+\",\":\"\")+hour+\":\"+min+\":\"+s+\".\"+sss;\n    }\n\n    public static Date toDate(String date, String format) throws ParseException {\n        if(date == null || date == \"\") throw new NullPointerException(\"input date is null or empty!\");\n        SimpleDateFormat sdf = new SimpleDateFormat(format);\n        return sdf.parse(date);\n    }\n\n    public static String toStr(Date date, String format) {\n        DateFormat dateFormat = new SimpleDateFormat(format);\n        return dateFormat.format(date);\n    }\n\n    public static Timestamp toTimestamp(Date date){\n        return new Timestamp(date.getTime());\n    }\n\n    /**\n     * 将String类型的日期转换成TimeStamp</br>\n     * Tip：日期参数的格式类型，必须和format参数的格式一致，否则抛出ParseException\n     * @param date - 日期\n     * @param format - 格式化类型\n     * @return Timestamp\n     * @throws ParseException\n     */\n    public static Timestamp toTimestamp(String date,String format) throws ParseException{\n        return toTimestamp(toDate(date, format));\n    }\n\n    public static String toStr(String date, String original_format,String transform_format) throws ParseException{\n        return toStr(toDate(date, original_format), transform_format);\n    }\n\n    /**\n     * 将Timestamp类型的日期根据输入的format的格式转换成Sting类型\n     * @param timestamp  日期\n     * @param format format格式\n     * @return String\n     */\n    public static String toStr(Timestamp timestamp,String format){\n        SimpleDateFormat sdf = new SimpleDateFormat(format);\n        return sdf.format(timestamp);\n    }\n\n    public static String dateToStr(Date date,String format){\n        SimpleDateFormat sdf = new SimpleDateFormat(format);\n        return sdf.format(date);\n    }\n\n    public static Timestamp getBeginTimeOfDay(Date calBeginDate) throws ParseException {\n        String date = dateToStr(calBeginDate, YYYY_MM_DD);\n        date = date + \" 00:00:00.000\";\n        return toTimestamp(date,YYYY_MM_DD_HH_MM_SS_SSS);\n    }\n\n    public static Timestamp getEndTimeOfDay(Date calBeginDate) throws ParseException {\n        String date = dateToStr(calBeginDate, YYYY_MM_DD);\n        date = date + \" 23:59:59.999\";\n        return toTimestamp(date,YYYY_MM_DD_HH_MM_SS_SSS);\n    }\n\n    public static Date getFirstDayOfMonth(String date,String format){\n        Date d = null;\n        try {\n            d = toDate(date, format);\n            return calFirstDayOfMonth(d);\n        } catch (ParseException e) {\n            e.printStackTrace();\n        }\n        return null;\n    }\n\n    public static Date getFirstDayOfMonth(Date date){\n        return calFirstDayOfMonth(date);\n    }\n\n    private static Date calFirstDayOfMonth(Date date) {\n        Calendar firstDate = null;\n        try {\n            firstDate = Calendar.getInstance();\n            firstDate.setTime(date);\n            firstDate.set(Calendar.DATE,1);\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return firstDate.getTime();\n    }\n\n    public static Date getLastDayOfMonth(String date, String format) {\n        Date d = null;\n        try {\n            d = toDate(date, format);\n            return calLastDayOfMonth(d);\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return null;\n    }\n\n    public static Date getLastDayOfMonth(Date date){\n        return calLastDayOfMonth(date);\n    }\n\n    private static Date calLastDayOfMonth(Date date) {\n        Calendar lastDate = null;\n        try {\n            lastDate = Calendar.getInstance();\n            lastDate.setTime(date);\n            lastDate.set(Calendar.DATE, 1);// 设为当前月的1号\n            lastDate.add(Calendar.MONTH, 1);// 加一个月，变为下月的1号\n            lastDate.add(Calendar.DATE, -1);// 减去一天，变为当月最后一天\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return lastDate.getTime();\n    }\n\n    public static int getDaysOfMonth(Date date){\n        Calendar c= Calendar.getInstance();\n        c.set(Calendar.YEAR, Integer.valueOf(toStr(date,YYYY )));\n        c.set(Calendar.MONTH, Integer.valueOf(toStr(date,MM ))-1);\n        return c.getActualMaximum(Calendar.DAY_OF_MONTH);\n    }\n\n    public static void main(String[] args) throws ParseException{\n        String date = \"2014-09-02 00:00:00\";\n        String date2 = \"2014-12-02 23:59:59\";\n        Date begin = DateUtils.getFirstDayOfMonth(date,DateUtils.YYYY_MM_DD_HH_MM_SS );\n        Date end = DateUtils.getLastDayOfMonth(date2,DateUtils.YYYY_MM_DD_HH_MM_SS );\n        System.out.println(begin);\n        System.out.println(end);\n        System.out.println(getDaysOfMonth(begin)+\"\");\n    }\n}\n"
  },
  {
    "path": "weixin-common/src/main/java/com/cheng/weixin/common/utils/Exceptions.java",
    "content": "package com.cheng.weixin.common.utils;\n\nimport java.io.PrintWriter;\nimport java.io.StringWriter;\n\n/**\n * Desc: 异常工具类\n * Author: Cheng\n * Date: 2016/1/29 0029\n */\npublic class Exceptions {\n    /**\n     * 将CheckedException转换成UncheckedException.\n     * @param e\n     * @return\n     */\n    public static RuntimeException unchecked(Exception e) {\n        if(e instanceof RuntimeException) {\n            return (RuntimeException) e;\n        }else {\n            return new RuntimeException(e);\n        }\n    }\n\n    /**\n     * 将错误的堆栈转化为String\n     * @param e\n     * @return\n     */\n    public static String getStackTraceToString(Throwable e) {\n        if (e == null) {\n            return \"\";\n        }\n        StringWriter stringWriter = new StringWriter();\n        e.printStackTrace(new PrintWriter(stringWriter));\n        return stringWriter.toString();\n    }\n}\n"
  },
  {
    "path": "weixin-common/src/main/java/com/cheng/weixin/common/utils/JSONUtils.java",
    "content": "package com.cheng.weixin.common.utils;\n\nimport com.fasterxml.jackson.core.type.TypeReference;\nimport com.fasterxml.jackson.databind.ObjectMapper;\n\nimport java.text.SimpleDateFormat;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * Desc: JSON工具\n * Author: 光灿\n * Date: 2016/7/10\n */\npublic class JSONUtils {\n\n    private final static ObjectMapper objectMapper = new ObjectMapper();\n\n    private JSONUtils() {\n        // 设置默认日期格式\n        objectMapper.setDateFormat(new SimpleDateFormat(\"yyyy-MM-dd\"));\n        //提供其它默认设置\n        //objectMapper.setFilters(new SimpleFilterProvider().setFailOnUnknownId(false));\n    }\n\n\n    public static ObjectMapper getInstance() {\n        return objectMapper;\n    }\n\n    /**\n     * javaBean,list,array convert to json string\n     */\n    public static String obj2json(Object obj) throws Exception {\n        return objectMapper.writeValueAsString(obj);\n    }\n\n    /**\n     * json string convert to javaBean\n     */\n    public static <T> T json2pojo(String jsonStr, Class<T> clazz) throws Exception {\n        return objectMapper.readValue(jsonStr, clazz);\n    }\n\n    /**\n     * json string convert to map\n     */\n    public static <T> Map<String, Object> json2map(String jsonStr) throws Exception {\n        return objectMapper.readValue(jsonStr, Map.class);\n    }\n\n    /**\n     * json string convert to map with javaBean\n     */\n    public static <T> Map<String, T> json2map(String jsonStr, Class<T> clazz) throws Exception {\n        Map<String, Map<String, Object>> map = objectMapper.readValue(jsonStr, new TypeReference<Map<String, T>>() {});\n        Map<String, T> result = new HashMap<String, T>();\n        for (Map.Entry<String, Map<String, Object>> entry : map.entrySet()) {\n            result.put(entry.getKey(), map2pojo(entry.getValue(), clazz));\n        }\n        return result;\n    }\n\n    /**\n     * json array string convert to list with javaBean\n     */\n    public static <T> List<T> json2list(String jsonArrayStr, Class<T> clazz)\n            throws Exception {\n        List<Map<String, Object>> list = objectMapper.readValue(jsonArrayStr,new TypeReference<List<T>>() {});\n        List<T> result = new ArrayList<T>();\n        for (Map<String, Object> map : list) {\n            result.add(map2pojo(map, clazz));\n        }\n        return result;\n    }\n\n    /**\n     * map convert to javaBean\n     */\n    public static <T> T map2pojo(Map map, Class<T> clazz) {\n        return objectMapper.convertValue(map, clazz);\n    }\n}\n"
  },
  {
    "path": "weixin-common/src/main/java/com/cheng/weixin/common/utils/ServletUtils.java",
    "content": "package com.cheng.weixin.common.utils;\n\nimport org.springframework.web.context.request.RequestAttributes;\nimport org.springframework.web.context.request.RequestContextHolder;\nimport org.springframework.web.context.request.ServletRequestAttributes;\n\nimport javax.servlet.http.HttpServletRequest;\n\n/**\n * Desc: Http和Servlet工具类\n * Author: Cheng\n * Date: 2016/3/29 0029\n */\npublic class ServletUtils {\n    /**\n     * 获取当期请求对象\n     * @return\n     */\n    public static HttpServletRequest getRequest() {\n\n        RequestAttributes requestAttributes1 = RequestContextHolder.currentRequestAttributes();\n        RequestAttributes requestAttributes2 = RequestContextHolder.getRequestAttributes();\n\n\n        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();\n    }\n}\n"
  },
  {
    "path": "weixin-common/src/main/java/com/cheng/weixin/common/utils/SpringContextHolder.java",
    "content": "package com.cheng.weixin.common.utils;\n\nimport org.apache.commons.lang3.Validate;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.BeansException;\nimport org.springframework.beans.factory.DisposableBean;\nimport org.springframework.context.ApplicationContext;\nimport org.springframework.context.ApplicationContextAware;\nimport org.springframework.context.annotation.Lazy;\nimport org.springframework.stereotype.Service;\n\n/**\n * Desc: 获取Spring ApplicationContext, 可在任何代码任何地方任何时候取出ApplicaitonContext.\n * Author: Cheng\n * Date: 2016/2/16 0016\n */\n@Service\n@Lazy(false)\npublic class SpringContextHolder implements ApplicationContextAware, DisposableBean {\n\n    private static Logger logger = LoggerFactory.getLogger(SpringContextHolder.class);\n\n    private static ApplicationContext applicationContext = null;\n\n    /**\n     * 取得静态变量中的ApplicationContext.\n     * @return\n     */\n    public static ApplicationContext getApplicationContext() {\n        assertContextInjected();\n        return applicationContext;\n    }\n    /**\n     * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.\n     */\n    public static <T> T getBean(String beanName) {\n        return (T) getApplicationContext().getBean(beanName);\n    }\n\n    /**\n     * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.\n     */\n    public static <T> T getBean(Class<T> requiredType) {\n        return (T) getApplicationContext().getBean(requiredType);\n    }\n\n    /**\n     * 清除SpringContextHolder中的ApplicationContext\n     */\n    public static void clearHolder() {\n        if (logger.isDebugEnabled()) {\n            logger.debug(\"清除SpringContextHolder中的ApplicationContext：{}\", applicationContext);\n        }\n        SpringContextHolder.applicationContext = null;\n    }\n\n    @Override\n    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {\n        SpringContextHolder.applicationContext = applicationContext;\n    }\n\n    @Override\n    public void destroy() throws Exception {\n        clearHolder();\n    }\n\n    /**\n     * 检查ApplicationContext不能为空\n     */\n    private static void assertContextInjected() {\n        Validate.validState(applicationContext != null, \"applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder.\");\n    }\n\n}\n"
  },
  {
    "path": "weixin-common/src/main/java/com/cheng/weixin/common/utils/StringFormat.java",
    "content": "package com.cheng.weixin.common.utils;\n\nimport java.math.BigDecimal;\nimport java.text.DecimalFormat;\n\n/**\n * Desc: BigDecimal格式化\n * Author: 光灿\n * Date: 2016/6/28\n */\npublic class StringFormat {\n    /**\n     * 保留一位小数\n     * @param value\n     * @return\n     */\n    public static String format(BigDecimal value) {\n        DecimalFormat format=new DecimalFormat(\"0.0\");\n        return format.format(value);\n    }\n\n    //product.getSalePrice().setScale(2, BigDecimal.ROUND_HALF_UP).toString()\n}\n"
  },
  {
    "path": "weixin-common/src/main/java/com/cheng/weixin/common/utils/StringUtils.java",
    "content": "package com.cheng.weixin.common.utils;\n\n/**\n * Author: Cheng\n * Date: 2016/1/27 0027\n */\npublic class StringUtils extends org.apache.commons.lang3.StringUtils {\n    /**\n     * 隐藏手机号 中间六位\n     * @param phone\n     * @return\n     */\n    public static String hidePhone(String phone) {\n        return substring(phone, 0, 3) + \"******\" + substring(phone, phone.length()-2, phone.length());\n    }\n}\n"
  },
  {
    "path": "weixin-common/src/main/java/com/cheng/weixin/common/utils/SystemUtils.java",
    "content": "package com.cheng.weixin.common.utils;\n\nimport javax.servlet.http.HttpServletRequest;\n\n/**\n * Desc: 系统工具 获取验证码\n * Author: 光灿\n * Date: 2016/7/9\n */\npublic class SystemUtils {\n    /**\n     * 获取远程用户的地址\n     */\n    public static String getRemoteAddr(HttpServletRequest request) {\n        String remoteAddr = request.getHeader(\"X-Real-IP\");\n        if(StringUtils.isBlank(remoteAddr)) {\n            remoteAddr = request.getHeader(\"X-Forwarded-For\");\n        }else if (StringUtils.isBlank(remoteAddr)) {\n            remoteAddr = request.getHeader(\"Proxy-Client-IP\");\n        }else if (StringUtils.isBlank(remoteAddr)) {\n            remoteAddr = request.getHeader(\"WL-Proxy-Client-IP\");\n        }\n        return remoteAddr != null ? remoteAddr : request.getRemoteAddr();\n    }\n}\n"
  },
  {
    "path": "weixin-common/src/main/resources/weixinconfig.properties",
    "content": "#\\u5FAE\\u4FE1\\u57FA\\u672C\\u914D\\u7F6E\nweixin.token=chengzhx76\nweixin.appid=wxcabea2c14e5861ec\nweixin.appsecret=d4624c36b6795d1d99dcf0547af5443d\n\n#\\u5FAE\\u4FE1\\u4E1A\\u52A1URL\n\n#\\u83B7\\u53D6Access_Token\nweixin.url.access.token=https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET\n#\\u589E\\u52A0\\u81EA\\u5B9A\\u4E49\\u83DC\\u5355\nweixin.url.menu.add=https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN\n#\\u65B0\\u589E\\u4E34\\u65F6\\u7D20\\u6750\nweixin.url.tempmedia.add=https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE\n#\\u83B7\\u53D6\\u5A92\\u4F53\\u7D20\\u6750\nweixin.url.media.get=https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID\n#\\u53D1\\u9001\\u6A21\\u677F\\u6D88\\u606F\nweixin.url.templatemsg.sned=https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN\n\n#\\u521B\\u5EFA\\u5206\\u7EC4\nweixin.url.group.add=https://api.weixin.qq.com/cgi-bin/groups/create?access_token=ACCESS_TOKEN\n#\\u67E5\\u8BE2\\u6240\\u6709\\u5206\\u7EC4\nweixin.url.group.qurey.all=https://api.weixin.qq.com/cgi-bin/groups/get?access_token=ACCESS_TOKEN\n#\\u67E5\\u8BE2\\u7528\\u6237\\u6240\\u5728\\u5206\\u7EC4\nweixin.url.group.query.user=https://api.weixin.qq.com/cgi-bin/groups/getid?access_token=ACCESS_TOKEN\n#\\u4FEE\\u6539\\u5206\\u7EC4\\u540D\nweixin.url.group.modify.name=https://api.weixin.qq.com/cgi-bin/groups/update?access_token=ACCESS_TOKEN\n#\\u79FB\\u52A8\\u7528\\u6237\\u5206\\u7EC4\nweixin.url.group.move.user=https://api.weixin.qq.com/cgi-bin/groups/members/update?access_token=ACCESS_TOKEN\n#\\u6279\\u91CF\\u79FB\\u52A8\\u7528\\u6237\\u5206\\u7EC4\nweixin.url.group.batch.move.user=https://api.weixin.qq.com/cgi-bin/groups/members/batchupdate?access_token=ACCESS_TOKEN\n#\\u5220\\u9664\\u5206\\u7EC4\nweixin.url.group.delete=https://api.weixin.qq.com/cgi-bin/groups/delete?access_token=ACCESS_TOKEN\n"
  },
  {
    "path": "weixin-common-config/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-common-config</artifactId>\n\n\n</project>"
  },
  {
    "path": "weixin-common-entity/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-common-entity</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common</artifactId>\n    </dependency>\n  </dependencies>\n\n</project>"
  },
  {
    "path": "weixin-common-entity/src/main/java/com/cheng/common/entity/BaseEntity.java",
    "content": "package com.cheng.common.entity;\n\n\nimport com.cheng.weixin.common.utils.StringUtils;\nimport org.apache.commons.lang3.builder.EqualsBuilder;\nimport org.apache.commons.lang3.builder.HashCodeBuilder;\nimport org.apache.commons.lang3.builder.ReflectionToStringBuilder;\n\nimport java.io.Serializable;\n\n/**\n * Desc: Entity 支持类\n * Author: Cheng\n * Date: 2016/1/28 0028\n */\npublic abstract class BaseEntity<T> implements Serializable {\n\n    private static final long serialVersionUID = 8560136559317259918L;\n    /** 实体编号（唯一标识） **/\n    protected String id;\n\n    /** 是否是新记录（默认：true）， 调用setIsNewRecord()设置新记录，使用自定义ID。\n     * 设置为false后强制执行插入语句，ID不会自动生成，需从手动传入。**/\n    protected boolean isNewRecord = true;\n\n    /**\n     * 更新时是否要要执行preUpdate()方法\n     */\n    protected boolean isUpdate = true;\n\n    /**\n     * 插入前执行方法，子类实现\n     */\n    public abstract void preInsert();\n\n    /**\n     * 更新前执行方法，子类实现\n     */\n    public abstract void preUpdate();\n\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n    /**\n     * 是否是新记录（默认：true），调用setIsNewRecord()设置新记录，使用自定义ID。\n     * 设置为false后强制执行插入语句，ID不会自动生成，需从手动传入。\n     * @return\n     */\n    public boolean getIsNewRecord() {\n        return isNewRecord || StringUtils.isBlank(getId());\n    }\n\n    /**\n     * 是否是新记录（默认：true），调用setIsNewRecord()设置新记录，使用自定义ID。\n     * 设置为false后强制执行插入语句，ID不会自动生成，需从手动传入。\n     */\n    public void setIsNewRecord(boolean isNewRecord) {\n        this.isNewRecord = isNewRecord;\n    }\n\n    /**\n     * 更新时是否要要执行preUpdate()方法\n     */\n    public boolean isUpdate() {\n        return isUpdate;\n    }\n\n    public void setUpdate(boolean update) {\n        isUpdate = update;\n    }\n\n    @Override\n    public int hashCode() {\n        return HashCodeBuilder.reflectionHashCode(this);\n    }\n    @Override\n    public boolean equals(Object obj) {\n        //if (null == obj) {\n        //    return false;\n        //}\n        //if (this == obj) {\n        //    return true;\n        //}\n        //if (getClass().equals(obj.getClass())) {\n        //    return false;\n        //}\n        //BaseEntity<T> that = (BaseEntity<T>) obj;\n        //return null == this.getId() ? false : this.getId().equals(that.getId());\n        return EqualsBuilder.reflectionEquals(this, obj);\n    }\n\n\n    @Override\n    public String toString() {\n        return ReflectionToStringBuilder.toString(this);\n        //return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);\n    }\n}\n"
  },
  {
    "path": "weixin-common-entity/src/main/java/com/cheng/common/entity/DataEntity.java",
    "content": "package com.cheng.common.entity;\n\n\nimport com.cheng.common.entity.id.IdGen;\nimport com.cheng.common.entity.enums.Status;\nimport com.cheng.weixin.common.utils.StringUtils;\n\nimport java.util.Date;\n\n/**\n * Desc: 数据Entity类\n * Author: 光灿\n * Date: 2016/2/27\n */\npublic abstract class DataEntity<T> extends BaseEntity<T> {\n\n    /** 备注 **/\n    protected String remarks;\n    /** 创建时间 **/\n    protected Date createDate;\n    /** 更新时间 **/\n    protected Date updateDate;\n    /** 状态 **/\n    protected Status status;\n\n    public DataEntity() {\n        super();\n        this.status = Status.NORMAL;\n    }\n\n    /**\n     * 更新之前需要手动调用\n     */\n    @Override\n    public void preUpdate() {\n        if (super.isUpdate) {\n            this.updateDate = new Date();\n        }\n    }\n\n    /**\n     * 插入之前执行 需要手动调用\n     */\n    @Override\n    public void preInsert() {\n        if (isNewRecord) {\n            setId(IdGen.uuid());\n        }\n        if (StringUtils.isBlank(getRemarks())) {\n            setRemarks(\"--\");\n        }\n        this.createDate = new Date();\n        this.updateDate = new Date();\n    }\n\n    public String getRemarks() {\n        return remarks;\n    }\n\n    public void setRemarks(String remarks) {\n        this.remarks = remarks;\n    }\n\n    public Date getCreateDate() {\n        return createDate;\n    }\n\n    public void setCreateDate(Date createDate) {\n        this.createDate = createDate;\n    }\n\n    public Date getUpdateDate() {\n        return updateDate;\n    }\n\n    public void setUpdateDate(Date updateDate) {\n        this.updateDate = updateDate;\n    }\n\n    public Status getStatus() {\n        return status;\n    }\n\n    public void setStatus(Status status) {\n        this.status = status;\n    }\n}\n"
  },
  {
    "path": "weixin-common-entity/src/main/java/com/cheng/common/entity/enums/Sex.java",
    "content": "package com.cheng.common.entity.enums;\n\n/**\n * Desc: 性别\n * Author: hp\n * Date: 2016/11/2\n */\npublic enum Sex {\n\n    MAN(\"男士\"),\n    WOMAN(\"女士\"),\n    UNKNOW(\"未知\");\n\n    private String name;\n\n    Sex(String name) {\n        this.name = name;\n    }\n    public String getName() {\n        return name;\n    }\n}\n"
  },
  {
    "path": "weixin-common-entity/src/main/java/com/cheng/common/entity/enums/Status.java",
    "content": "package com.cheng.common.entity.enums;\n\n/**\n * Author: Cheng\n * Date: 2016/1/28 0028\n */\npublic enum Status {\n    NORMAL(1, \"正常\"),\n    AUDIT(2, \"审核\"),\n    LOCKED(3, \"锁定\"),\n    DELETE(4, \"删除\"),\n    ENABLE(5, \"激活\"),\n    UNENABLE(5, \"未激活\");\n\n    public int code;\n    public String name;\n    Status(int code, String name) {\n        this.code = code;\n        this.name = name;\n    }\n}\n"
  },
  {
    "path": "weixin-common-entity/src/main/java/com/cheng/common/entity/id/IdGen.java",
    "content": "package com.cheng.common.entity.id;\n\nimport java.util.UUID;\n\n/**\n * Desc: 封装各种生成唯一性ID算法的工具类\n * Author: 光灿\n * Date: 2016/2/27\n */\npublic class IdGen {\n\n    //private static SecureRandom random = new SecureRandom();\n\n    /**\n     * 封装JDK自带的UUID，中间无-分割\n     * @return\n     */\n    public static String uuid() {\n        return UUID.randomUUID().toString().replaceAll(\"-\", \"\");\n    }\n\n}\n"
  },
  {
    "path": "weixin-common-entity/src/main/java/com/cheng/common/entity/id/IdGenerator.java",
    "content": "package com.cheng.common.entity.id;\n\n/**\n * Desc: http://cloudate.net/?p=575\n * Author: cheng\n * Date: 2016/6/22\n */\npublic class IdGenerator {\n    // 机器ID\n    private final long workerId;\n\n    // 纪元开始时间\n    private final static long twepoch = 1361753741828L;\n\n    // Sequence从0开始\n    private long sequence = 0L;\n\n    // 机器ID所占的位数\n    private final static long workerIdBits = 4L;\n\n    // 机器ID的最大值\n    public final static long maxWorkerId = -1L ^ -1L << workerIdBits;\n\n    // Sequence所占的位数\n    private final static long sequenceBits = 10L;\n\n    // 机器ID的偏移量\n    private final static long workerIdShift = sequenceBits;\n\n    // 时间戳的偏移量\n    private final static long timestampLeftShift = sequenceBits + workerIdBits;\n\n    // Sequence的屏蔽位\n    public final static long sequenceMask = -1L ^ -1L << sequenceBits;\n\n    // 上一个毫秒数\n    private long lastTimestamp = -1L;\n\n    public IdGenerator(final long workerId) {\n        super();\n        // 最大16个节点\n        if (workerId > maxWorkerId || workerId < 0) {\n            throw new IllegalArgumentException(String.format(\"worker Id can't be greater than %d or less than 0\", maxWorkerId));\n        }\n        this.workerId = workerId;\n    }\n\n    public synchronized long nextId() {\n        long timestamp = this.timeGen();\n        if (this.lastTimestamp == timestamp) {\n            // 在统一毫秒内产生\n            this.sequence = (this.sequence + 1) & this.sequenceMask;\n            if (this.sequence == 0) {\n                // 同一毫秒内的ID已经用光了，等到下一毫秒才能继续产生\n                System.out.println(\"###########\" + sequenceMask);\n                timestamp = this.tilNextMillis(this.lastTimestamp);\n            }\n        } else {\n            // 上一次的毫秒已经过去了，现在进入下一个毫秒，重置Sequence\n            this.sequence = 0;\n        }\n\n        // 如果系统时间发生了更改，而且更改到了一个过去的时间\n        if (timestamp < this.lastTimestamp) {\n            try {\n                throw new Exception(String.format(\"Clock moved backwards.  Refusing to generate id for %d milliseconds\", this.lastTimestamp\n                        - timestamp));\n            } catch (Exception e) {\n                e.printStackTrace();\n            }\n        }\n\n        // 保存上次的毫秒\n        this.lastTimestamp = timestamp;\n\n        // 毫秒数 ------> 机器ID ------> 毫秒内的Sequence\n        long nextId = ((timestamp - twepoch << timestampLeftShift)) | (workerId << workerIdShift) | (this.sequence);\n        return nextId;\n    }\n\n    private long tilNextMillis(final long lastTimestamp) {\n        // 等待到下一个毫秒\n        long timestamp = this.timeGen();\n        while (timestamp <= lastTimestamp) {\n            timestamp = this.timeGen();\n        }\n        return timestamp;\n    }\n\n    private long timeGen() {\n        return System.currentTimeMillis();\n    }\n\n\n    public static void main(String[] args) {\n        IdGenerator worker2 = new IdGenerator(2);\n        System.out.println(worker2.nextId());\n    }\n}\n"
  },
  {
    "path": "weixin-common-entity/src/main/java/com/cheng/common/entity/id/package-info.java",
    "content": "/**\n * Desc: id生成器\n * Author: cheng\n * Date: 2016/6/22\n */\npackage com.cheng.common.entity.id;\n/**\n * http://www.cnblogs.com/littlehb/p/3946097.html\n *http://www.blogjava.net/bolo/archive/2015/07/13/426200.html\n */"
  },
  {
    "path": "weixin-common-service/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-common-service</artifactId>\n\n\n</project>"
  },
  {
    "path": "weixin-common-service/src/main/java/com/cheng/weixin/common/core/dao/BaseDaoMapper.java",
    "content": "package com.cheng.weixin.common.core.dao;\n\nimport java.util.List;\n\n/**\n * Desc: Dao基类\n * Author: Cheng\n * Date: 2016/1/28 0028\n */\npublic interface BaseDaoMapper<T> {\n    /**\n     * 获取单条数据\n     * @param entity\n     * @return\n     */\n    T load(T entity);\n    /**\n     * 获取所有的数据\n     * @return\n     */\n    List<T> loadAll();\n    /**\n     * 根据条件获取List的数据\n     * @return\n     */\n    List<T> loadAll(T entity);\n    /**\n     * 保存实体\n     * @param entity\n     * @return\n     */\n    int save(T entity);\n    /**\n     * 保存实体\n     * @param entities\n     * @return\n     */\n    int saves(List<T> entities);\n    /**\n     * 更新数据\n     * @param entity\n     * @return\n     */\n    int update(T entity);\n\n    /**\n     * 删除数据（一般为逻辑删除）\n     * @param entity\n     * @return\n     */\n    int delete(T entity);\n}\n"
  },
  {
    "path": "weixin-notify-pay/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n  <artifactId>weixin-notify-pay</artifactId>\n  <packaging>war</packaging>\n  <name>weixin-notify-pay</name>\n  <url>http://maven.apache.org</url>\n\n  <dependencies>\n    <dependency>\n      <groupId>junit</groupId>\n      <artifactId>junit</artifactId>\n    </dependency>\n  </dependencies>\n  <build>\n    <finalName>notifyPay</finalName>\n  </build>\n</project>\n"
  },
  {
    "path": "weixin-notify-pay/src/main/webapp/WEB-INF/web.xml",
    "content": "<!DOCTYPE web-app PUBLIC\n \"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN\"\n \"http://java.sun.com/dtd/web-app_2_3.dtd\" >\n\n<web-app>\n  <display-name>Archetype Created Web Application</display-name>\n</web-app>\n"
  },
  {
    "path": "weixin-notify-pay/src/main/webapp/index.jsp",
    "content": "<html>\n<body>\n<h2>Hello World!</h2>\n</body>\n</html>\n"
  },
  {
    "path": "weixin-rabbitmq-model/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-rabbitmq-model</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common</artifactId>\n    </dependency>\n  </dependencies>\n\n</project>"
  },
  {
    "path": "weixin-rabbitmq-model/src/main/java/com/cheng/weixin/rabbitmq/enums/MsgType.java",
    "content": "package com.cheng.weixin.rabbitmq.enums;\n\n/**\n * Desc:\n * Author: 光灿\n * Date: 2016/11/20\n */\npublic enum MsgType {\n    VALIDATE(\"验证码\"),\n    NOTICE_CASH_COMSUME(\"现金消费\"),\n    ACTIVITY(\"活动\");\n\n    private String name;\n    MsgType(String name) {\n        this.name = name;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n}\n"
  },
  {
    "path": "weixin-rabbitmq-model/src/main/java/com/cheng/weixin/rabbitmq/model/SmsModel.java",
    "content": "package com.cheng.weixin.rabbitmq.model;\n\nimport com.cheng.weixin.rabbitmq.enums.MsgType;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * Desc: 短消息\n * Author: 光灿\n * Date: 2016/7/9\n */\npublic class SmsModel implements Serializable {\n    private static final long serialVersionUID = -888661824696905703L;\n    private String phone;       // 手机号\n    private String userIp;      // IP地址\n    private MsgType type;\n    private Date date;\n    private String content;\n\n    public String getPhone() {\n        return phone;\n    }\n\n    public void setPhone(String phone) {\n        this.phone = phone;\n    }\n\n    public String getUserIp() {\n        return userIp;\n    }\n\n    public void setUserIp(String userIp) {\n        this.userIp = userIp;\n    }\n\n    public static long getSerialVersionUID() {\n        return serialVersionUID;\n    }\n\n    public MsgType getType() {\n        return type;\n    }\n\n    public void setType(MsgType type) {\n        this.type = type;\n    }\n\n    public Date getDate() {\n        return date;\n    }\n\n    public void setDate(Date date) {\n        this.date = date;\n    }\n\n    public String getContent() {\n        return content;\n    }\n\n    public void setContent(String content) {\n        this.content = content;\n    }\n\n    @Override\n    public String toString() {\n        return new org.apache.commons.lang3.builder.ToStringBuilder(this)\n                .append(\"phone\", phone)\n                .append(\"userIp\", userIp)\n                .append(\"type\", type)\n                .append(\"date\", date)\n                .append(\"content\", content)\n                .toString();\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-admin/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-rpc-admin</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>com.cheng</groupId>\n      <artifactId>weixin-common-entity</artifactId>\n    </dependency>\n  </dependencies>\n\n</project>"
  },
  {
    "path": "weixin-rpc-admin/src/main/java/com/cheng/weixin/rpc/admin/entity/Admin.java",
    "content": "package com.cheng.weixin.rpc.admin.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * 用户实体\n * Author: Cheng\n * Date: 2016/1/28 0028\n */\npublic class Admin extends DataEntity<Admin> {\n    /** 用户名 **/\n    private String username;\n    /** 密码（盐值和密匙） **/\n    private String password;\n    /** 真实姓名 **/\n    private String realname;\n\n    private String mobile;      // 手机\n    private String photo;       // 头像URI\n    private String loginIp;     // 登录IP\n    private Date loginDate;     // 登录时间\n    private String oldLoginIp;  // 上次登录IP\n    private Date oldLoginDate;  // 上次登录时间\n\n    private List<Role> roles;   // 角色\n\n    /** 冗余字段 **/\n    private String newLoginIp;  // 新登录的IP\n\n\n    public Admin() {}\n\n    public Admin(String id, String username) {\n        super.id = id;\n        this.username = username;\n    }\n\n    public String getUsername() {\n        return username;\n    }\n\n    public void setUsername(String username) {\n        this.username = username;\n    }\n\n    public String getPassword() {\n        return password;\n    }\n\n    public void setPassword(String password) {\n        this.password = password;\n    }\n\n    public String getRealname() {\n        return realname;\n    }\n\n    public void setRealname(String realname) {\n        this.realname = realname;\n    }\n\n    public String getMobile() {\n        return mobile;\n    }\n\n    public void setMobile(String mobile) {\n        this.mobile = mobile;\n    }\n\n    public String getPhoto() {\n        return photo;\n    }\n\n    public void setPhoto(String photo) {\n        this.photo = photo;\n    }\n\n    public String getLoginIp() {\n        return loginIp;\n    }\n\n    public void setLoginIp(String loginIp) {\n        this.loginIp = loginIp;\n    }\n\n    public Date getLoginDate() {\n        return loginDate;\n    }\n\n    public void setLoginDate(Date loginDate) {\n        this.loginDate = loginDate;\n    }\n\n    public String getOldLoginIp() {\n        return oldLoginIp;\n    }\n\n    public void setOldLoginIp(String oldLoginIp) {\n        this.oldLoginIp = oldLoginIp;\n    }\n\n    public Date getOldLoginDate() {\n        return oldLoginDate;\n    }\n\n    public void setOldLoginDate(Date oldLoginDate) {\n        this.oldLoginDate = oldLoginDate;\n    }\n\n    public List<Role> getRoles() {\n        return roles;\n    }\n\n    public Admin setRoles(List<Role> roles) {\n        this.roles = roles;\n        return this;\n    }\n\n    public String getNewLoginIp() {\n        return newLoginIp;\n    }\n\n    public void setNewLoginIp(String newLoginIp) {\n        this.newLoginIp = newLoginIp;\n    }\n\n    /** 判断是否是超级管理员 **/\n    public boolean isSuperAdmin() {\n        return isSuperAdmin(this.getId());\n    }\n\n    public static boolean isSuperAdmin(String id) {\n        return id != null && \"1\".equals(id);\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-admin/src/main/java/com/cheng/weixin/rpc/admin/entity/AdminRole.java",
    "content": "package com.cheng.weixin.rpc.admin.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 用户与角色对应关系\n * Author: Cheng\n * Date: 2016/1/28 0028\n */\npublic class AdminRole extends DataEntity<AdminRole> {\n    /** 用户ID **/\n    private String adminId;\n    /** 角色ID **/\n    private String roleId;\n\n    public AdminRole() {\n    }\n\n    public AdminRole(String adminId, String roleId) {\n        this.adminId = adminId;\n        this.roleId = roleId;\n    }\n\n    public String getAdminId() {\n        return adminId;\n    }\n\n    public void setAdminId(String adminId) {\n        this.adminId = adminId;\n    }\n\n    public String getRoleId() {\n        return roleId;\n    }\n\n    public void setRoleId(String roleId) {\n        this.roleId = roleId;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-admin/src/main/java/com/cheng/weixin/rpc/admin/entity/Permission.java",
    "content": "package com.cheng.weixin.rpc.admin.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 权限实体类\n * Author: Cheng\n * Date: 2016/1/28 0028\n */\npublic class Permission extends DataEntity<Permission> {\n    private String name;         // 资源名\n    private String precode;      // 权限代码\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getPrecode() {\n        return precode;\n    }\n\n    public void setPrecode(String precode) {\n        this.precode = precode;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-admin/src/main/java/com/cheng/weixin/rpc/admin/entity/Role.java",
    "content": "package com.cheng.weixin.rpc.admin.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Author: Cheng\n * Date: 2016/1/28 0028\n */\npublic class Role extends DataEntity<Role> {\n    /** 角色名字 **/\n    private String name;\n\n    private String enname; // 英文名字，也是角色\n\n    private Admin admin;   // 当前用户的角色\n\n    public Role() {\n    }\n\n    public Role(String id) {\n        this.id = id;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getEnname() {\n        return enname;\n    }\n\n    public Role setEnname(String enname) {\n        this.enname = enname;\n        return this;\n    }\n\n    public Admin getAdmin() {\n        return admin;\n    }\n\n    public Role setAdmin(Admin admin) {\n        this.admin = admin;\n        return this;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-admin/src/main/java/com/cheng/weixin/rpc/admin/entity/RolePermission.java",
    "content": "package com.cheng.weixin.rpc.admin.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 角色和权限对应关系\n * Author: Cheng\n * Date: 2016/1/28 0028\n */\npublic class RolePermission extends DataEntity<RolePermission> {\n    /** 角色ID **/\n    private String roleId;\n    /** 权限ID **/\n    private String permissionId;\n\n    public String getRoleId() {\n        return roleId;\n    }\n\n    public void setRoleId(String roleId) {\n        this.roleId = roleId;\n    }\n\n    public String getPermissionId() {\n        return permissionId;\n    }\n\n    public void setPermissionId(String permissionId) {\n        this.permissionId = permissionId;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-admin/src/main/java/com/cheng/weixin/rpc/admin/service/RpcAdminService.java",
    "content": "package com.cheng.weixin.rpc.admin.service;\n\n\nimport com.cheng.weixin.rpc.admin.entity.Admin;\nimport com.cheng.weixin.rpc.admin.entity.Permission;\nimport com.cheng.weixin.rpc.admin.entity.Role;\nimport com.cheng.weixin.common.model.Page;\n\nimport java.util.List;\n\n/**\n * Desc: 用户业务处理\n * Author: Cheng\n * Date: 2016/1/28 0028\n */\npublic interface RpcAdminService {\n    /**\n     * 增加管理员\n     * @param admin\n     */\n    void add(Admin admin);\n\n    /**\n     * 根据ID获取用户\n     * @param id\n     * @return\n     */\n    Admin getAdminById(String id);\n    /**\n     * 根据用户名获取用户\n     * @param username\n     * @return\n     */\n    Admin getAdminByUsername(String username);\n\n    /**\n     * 获取所有的用户\n     * @return\n     */\n    List<Admin> getAdminAll();\n\n    /**\n     * 分页获取所有管理员\n     * @param pageNum 当前页\n     * @param pageSize 每页显示多少\n     * @return\n     */\n    Page<Admin> findAdminAll(int pageNum, int pageSize);\n\n    /**\n     * 更新管理员登录信息\n     * @param admin\n     */\n    void updateAdminLoginInfo(Admin admin);\n\n    /**\n     * 更新管理员信息\n     * @param admin\n     */\n    void updateAdminInfo(Admin admin);\n\n    /**\n     * 根据管理员ID更新密码\n     * @param id\n     */\n    void updatePasswdById(String id, String newPasswd);\n\n    /**\n     * 获取全部的角色\n     * @return\n     */\n    List<Role> getAllRoles();\n\n    /**\n     * 根据管理员ID获取所有的角色\n     * @param aid\n     * @return\n     */\n    List<Role> getRolesByAdminId(String aid);\n\n    /**\n     * 获取全部的权限\n     * @return\n     */\n    List<Permission> getAllPermissions();\n\n    /**\n     * 根据管理员ID获取当前管理员的所有权限\n     * @param aid\n     * @return\n     */\n    List<Permission> getPermissionByAdminId(String aid);\n\n}\n"
  },
  {
    "path": "weixin-rpc-cart/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-rpc-cart</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>com.cheng</groupId>\n      <artifactId>weixin-common-entity</artifactId>\n    </dependency>\n  </dependencies>\n\n</project>"
  },
  {
    "path": "weixin-rpc-cart/src/main/java/com/cheng/weixin/rpc/cart/entity/CartInfo.java",
    "content": "package com.cheng.weixin.rpc.cart.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 购物车子\n * Author: cheng\n * Date: 2016/6/6\n */\npublic class CartInfo extends DataEntity<CartInfo>  {\n    private String accessId;\n    private String productId;\n    private int quantity;\n    private boolean isChoose;\n\n    public CartInfo() {\n    }\n\n    public CartInfo(String accessId, String productId, int quantity) {\n        this.accessId = accessId;\n        this.productId = productId;\n        this.quantity = quantity;\n    }\n\n    public String getAccessId() {\n        return accessId;\n    }\n\n    public CartInfo setAccessId(String accessId) {\n        this.accessId = accessId;\n        return this;\n    }\n\n    public String getProductId() {\n        return productId;\n    }\n\n    public CartInfo setProductId(String productId) {\n        this.productId = productId;\n        return this;\n    }\n\n    public int getQuantity() {\n        return quantity;\n    }\n\n    public void setQuantity(int quantity) {\n        this.quantity = quantity;\n    }\n\n    public boolean isChoose() {\n        return isChoose;\n    }\n\n    public void setChoose(boolean choose) {\n        isChoose = choose;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-cart/src/main/java/com/cheng/weixin/rpc/cart/entity/ShoppingCart.java",
    "content": "package com.cheng.weixin.rpc.cart.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\nimport java.util.List;\n\n/**\n * Desc: 购物车\n * Author: cheng\n * Date: 2016/6/6\n */\npublic class ShoppingCart extends DataEntity<ShoppingCart> {\n    private String accessId;\n    private int totalQuantity;\n\n    private List<CartInfo> cartInfos;\n\n    public String getAccessId() {\n        return accessId;\n    }\n\n    public ShoppingCart setAccessId(String accessId) {\n        this.accessId = accessId;\n        return this;\n    }\n\n    public int getTotalQuantity() {\n        return totalQuantity;\n    }\n\n    public void setTotalQuantity(int totalQuantity) {\n        this.totalQuantity = totalQuantity;\n    }\n\n    public List<CartInfo> getCartInfos() {\n        return cartInfos;\n    }\n\n    public void setCartInfos(List<CartInfo> cartInfos) {\n        this.cartInfos = cartInfos;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-cart/src/main/java/com/cheng/weixin/rpc/cart/model/ProductModel.java",
    "content": "package com.cheng.weixin.rpc.cart.model;\n\nimport java.io.Serializable;\n\n/**\n * Desc:\n * Author: 光灿\n * Date: 2016/9/15\n */\npublic class ProductModel implements Serializable {\n    private String id;\n    private int count;\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public int getCount() {\n        return count;\n    }\n\n    public void setCount(int count) {\n        this.count = count;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-cart/src/main/java/com/cheng/weixin/rpc/cart/service/RpcCartService.java",
    "content": "package com.cheng.weixin.rpc.cart.service;\n\nimport com.cheng.weixin.rpc.cart.entity.ShoppingCart;\nimport com.cheng.weixin.rpc.cart.model.ProductModel;\n\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * Desc: 购物车\n * Author: cheng\n * Date: 2016/6/28\n */\npublic interface RpcCartService {\n\n    /**\n     * 递增商品的数量\n     * @param userId 用户ID\n     * @param productId 商品ID\n     * @return 增加后的商品数量\n     */\n    Long addProductCount(String userId, String productId);\n\n    /**\n     * 减少商品数量\n     * @param userId 用户ID\n     * @param productId 商品ID\n     * @return 减少后的商品数量\n     */\n    Long subProductCount(String userId, String productId);\n\n    /**\n     * 获取购物车中所有已选择商品的ID\n     * @param userId 用户ID\n     * @return 该用户购物车中所有商品的ID\n     */\n    Set<String> getChooseProductIds(String userId);\n\n    /**\n     * 获取购物车中所有商品的ID\n      * @param userId\n     * @return\n     */\n    Set<String> getAllProductIds(String userId);\n\n    /**\n     * 根据用户id获取和商品ID获取商品个数\n     * @param userId 用户ID\n     * @param productId 商品ID\n     * @return\n     */\n    Long getCounts(String userId, String productId);\n\n    /**\n     * 删除购物车中的商品\n     * @param userId 用户ID\n     * @param productId 商品ID\n     */\n    void deleteProduct(String userId, String productId);\n\n    /**\n     * 获取购物车的信息\n     * @param accessId 用户ID\n     * @return 购物车的商品\n     */\n    ShoppingCart getShoppingCart(String accessId);\n\n    /**\n     * 添加商品\n     * @param userId 用户ID\n     * @param productId 商品ID\n     * @param count 商品数量\n     */\n    void addProduct(String userId, String productId, Long count);\n\n    /**\n     * 改变选择状态\n     * @param userId\n     * @param productId\n     * @return\n     */\n    boolean changeStatus(String userId, String productId);\n\n    /**\n     * 获取已选择的商品信息\n     * @param userId\n     * @return\n     */\n    List<ProductModel> getChooseProductInfo(String userId);\n\n    /**\n     * 删除已选择的商品（已购买的商品删除）\n     * @param userId\n     */\n    void deletedChooseProduct(String userId);\n\n    /**\n     * 选择所有的商品\n      * @param userId\n     */\n    void chooseAllProduct(String userId);\n\n    /**\n     * 取消选择所有的商品\n      * @param userId\n     */\n    void unchooseAllProduct(String userId);\n\n    /**\n     * 购物车中是否存在该商品\n     * @param userId\n     * @param productId\n     * @return\n     */\n    boolean exists(String userId, String productId);\n\n    /**\n     * 改变为选择状态\n     * @param userId\n     * @param productId\n     */\n    void changeChooseStatus(String userId, String productId);\n    /**\n     * 改变为不选择状态\n     * @param userId\n     * @param productId\n     */\n    void changeUnchooseStatus(String userId, String productId);\n}\n"
  },
  {
    "path": "weixin-rpc-comment/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-rpc-comment</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>com.cheng</groupId>\n      <artifactId>weixin-common-entity</artifactId>\n    </dependency>\n  </dependencies>\n\n</project>"
  },
  {
    "path": "weixin-rpc-comment/src/main/java/com/cheng/weixin/rpc/comment/entity/Comment.java",
    "content": "package com.cheng.weixin.rpc.comment.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\nimport java.util.Date;\n\n/**\n * Desc: 评论\n * Author: cheng\n * Date: 2016/6/17\n */\npublic class Comment extends DataEntity<Comment> {\n    private String orderDetailId;\n    private String productId;\n    private String accountId;\n    private String title;\n    private String content;\n    private int useful;\n    private int useless;\n    private String parentId;\n    private double productScore;\n    private double deliveryScore;\n    private Date reviewTime;\n    private int reviewStatus;\n    private String reviewResult;\n\n    public Comment() {\n    }\n\n    public Comment(String productId) {\n        this.productId = productId;\n    }\n\n    public double getProductScore() {\n        return productScore;\n    }\n\n    public Comment setProductScore(double productScore) {\n        this.productScore = productScore;\n        return this;\n    }\n\n    public double getDeliveryScore() {\n        return deliveryScore;\n    }\n\n    public Comment setDeliveryScore(double deliveryScore) {\n        this.deliveryScore = deliveryScore;\n        return this;\n    }\n\n    public String getOrderDetailId() {\n        return orderDetailId;\n    }\n\n    public void setOrderDetailId(String orderDetailId) {\n        this.orderDetailId = orderDetailId;\n    }\n\n    public String getProductId() {\n        return productId;\n    }\n\n    public void setProductId(String productId) {\n        this.productId = productId;\n    }\n\n    public String getAccountId() {\n        return accountId;\n    }\n\n    public void setAccountId(String accountId) {\n        this.accountId = accountId;\n    }\n\n    public String getTitle() {\n        return title;\n    }\n\n    public void setTitle(String title) {\n        this.title = title;\n    }\n\n    public String getContent() {\n        return content;\n    }\n\n    public void setContent(String content) {\n        this.content = content;\n    }\n\n    public int getUseful() {\n        return useful;\n    }\n\n    public void setUseful(int useful) {\n        this.useful = useful;\n    }\n\n    public int getUseless() {\n        return useless;\n    }\n\n    public void setUseless(int useless) {\n        this.useless = useless;\n    }\n\n    public String getParentId() {\n        return parentId;\n    }\n\n    public void setParentId(String parentId) {\n        this.parentId = parentId;\n    }\n\n    public Date getReviewTime() {\n        return reviewTime;\n    }\n\n    public void setReviewTime(Date reviewTime) {\n        this.reviewTime = reviewTime;\n    }\n\n    public int getReviewStatus() {\n        return reviewStatus;\n    }\n\n    public void setReviewStatus(int reviewStatus) {\n        this.reviewStatus = reviewStatus;\n    }\n\n    public String getReviewResult() {\n        return reviewResult;\n    }\n\n    public void setReviewResult(String reviewResult) {\n        this.reviewResult = reviewResult;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-comment/src/main/java/com/cheng/weixin/rpc/comment/service/RpcCommentService.java",
    "content": "package com.cheng.weixin.rpc.comment.service;\n\nimport com.cheng.weixin.rpc.comment.entity.Comment;\n\nimport java.util.List;\n\n/**\n * Desc: 评论\n * Author: hp\n * Date: 2016/10/8\n */\npublic interface RpcCommentService {\n    /**\n     * 获取该商品的评论\n     * @param productId\n     * @return\n     */\n    List<Comment> getByProductId(String productId);\n}\n"
  },
  {
    "path": "weixin-rpc-httpclient/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-rpc-httpclient</artifactId>\n\n\n</project>"
  },
  {
    "path": "weixin-rpc-httpclient/src/main/java/com/cheng/weixin/rpc/httpclient/service/RpcHttpClientService.java",
    "content": "package com.cheng.weixin.rpc.httpclient.service;\n\n/**\n * Desc:\n * Author: Cheng\n * Date: 2016/4/21 0021\n */\npublic interface RpcHttpClientService {\n    /**\n     * GET请求\n     * @param url\n     * @return\n     */\n    String doGet(String url);\n\n    /**\n     * POST 请求\n     * @param url 传入的微信地址\n     * @param data 需要发送的JSON参数\n     * @return 微信回复的消息\n     */\n    String doPost(String url, String data);\n    /**\n     * 发送媒体消息\n     * @param url 传入的微信地址\n     * @param path 需要传入的媒体文件\n     * @return 返回的结果\n     */\n    String postMedia(String url, String path);\n    /**\n     * 根据媒体ID下载媒体资源\n     * @param url\n     * @param path\n     */\n    void getMidie(String url, String path);\n}\n"
  },
  {
    "path": "weixin-rpc-item/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-rpc-item</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>com.cheng</groupId>\n      <artifactId>weixin-common-entity</artifactId>\n    </dependency>\n  </dependencies>\n\n</project>"
  },
  {
    "path": "weixin-rpc-item/src/main/java/com/cheng/weixin/rpc/item/entity/Picture.java",
    "content": "package com.cheng.weixin.rpc.item.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 图片\n * Author: cheng\n * Date: 2016/6/6\n */\npublic class Picture extends DataEntity<Picture> {\n    private String productId;\n    private String pictureUrl;\n    private int width;\n    private int height;\n    private Boolean isDefault;\n\n    public Picture() {}\n\n    public Picture(Boolean isDefault) {\n        this.isDefault = isDefault;\n    }\n    public Picture(String productId, Boolean isDefault) {\n        this.productId = productId;\n        this.isDefault = isDefault;\n    }\n\n    public int getWidth() {\n        return width;\n    }\n\n    public void setWidth(int width) {\n        this.width = width;\n    }\n\n    public int getHeight() {\n        return height;\n    }\n\n    public void setHeight(int height) {\n        this.height = height;\n    }\n\n    public String getProductId() {\n        return productId;\n    }\n\n    public void setProductId(String productId) {\n        this.productId = productId;\n    }\n\n    public String getPictureUrl() {\n        return pictureUrl;\n    }\n\n    public void setPictureUrl(String pictureUrl) {\n        this.pictureUrl = pictureUrl;\n    }\n\n    public Boolean isDefault() {\n        return isDefault;\n    }\n\n    public void setDefault(Boolean aDefault) {\n        isDefault = aDefault;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-item/src/main/java/com/cheng/weixin/rpc/item/entity/Product.java",
    "content": "package com.cheng.weixin.rpc.item.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\nimport java.math.BigDecimal;\nimport java.util.List;\n\n/**\n * Desc: 商品\n * Author: cheng\n * Date: 2016/6/6\n */\npublic class Product extends DataEntity<Product> {\n    private String name;\n    private BigDecimal marketPrice;\n    private BigDecimal salePrice;\n    private String no;\n    private String keywords;\n    private String typeId;\n    private int unitsInStock;\n    private boolean isAlive;\n    private String modifyAdminId;\n    private boolean isIndex;\n    private String tag;\n    private String unitDesc;\n    private int giveAway;\n\n    private List<Picture> pictures;\n\n    /** 冗余字段 **/\n    private Picture defaultPicture;\n\n    public Product() {}\n\n    public Product(String id) {\n        super();\n        this.id = id;\n    }\n    public Product(boolean isIndex) {\n        super();\n        this.isIndex = isIndex;\n    }\n\n    public String getTag() {\n        return tag;\n    }\n\n    public void setTag(String tag) {\n        this.tag = tag;\n    }\n\n    public String getUnitDesc() {\n        return unitDesc;\n    }\n\n    public void setUnitDesc(String unitDesc) {\n        this.unitDesc = unitDesc;\n    }\n\n    public Picture getDefaultPicture() {\n        return defaultPicture;\n    }\n\n    public void setDefaultPicture(Picture defaultPicture) {\n        this.defaultPicture = defaultPicture;\n    }\n\n    public List<Picture> getPictures() {\n        return pictures;\n    }\n\n    public void setPictures(List<Picture> pictures) {\n        this.pictures = pictures;\n    }\n\n    public boolean isIndex() {\n        return isIndex;\n    }\n\n    public void setIndex(boolean index) {\n        isIndex = index;\n    }\n\n    public int getUnitsInStock() {\n        return unitsInStock;\n    }\n\n    public void setUnitsInStock(int unitsInStock) {\n        this.unitsInStock = unitsInStock;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getNo() {\n        return no;\n    }\n\n    public void setNo(String no) {\n        this.no = no;\n    }\n\n    public String getTypeId() {\n        return typeId;\n    }\n\n    public void setTypeId(String typeId) {\n        this.typeId = typeId;\n    }\n\n    public String getKeywords() {\n        return keywords;\n    }\n\n    public void setKeywords(String keywords) {\n        this.keywords = keywords;\n    }\n\n    public boolean isAlive() {\n        return isAlive;\n    }\n\n    public void setAlive(boolean alive) {\n        isAlive = alive;\n    }\n\n    public String getModifyAdminId() {\n        return modifyAdminId;\n    }\n\n    public void setModifyAdminId(String modifyAdminId) {\n        this.modifyAdminId = modifyAdminId;\n    }\n\n    public BigDecimal getMarketPrice() {\n        return marketPrice;\n    }\n\n    public void setMarketPrice(BigDecimal marketPrice) {\n        this.marketPrice = marketPrice;\n    }\n\n    public BigDecimal getSalePrice() {\n        return salePrice;\n    }\n\n    public void setSalePrice(BigDecimal salePrice) {\n        this.salePrice = salePrice;\n    }\n\n    public int getGiveAway() {\n        return giveAway;\n    }\n\n    public void setGiveAway(int giveAway) {\n        this.giveAway = giveAway;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-item/src/main/java/com/cheng/weixin/rpc/item/entity/ProductType.java",
    "content": "package com.cheng.weixin.rpc.item.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 商品类型\n * Author: cheng\n * Date: 2016/6/6\n */\npublic class ProductType extends DataEntity<ProductType> {\n    private String name;\n\n    public ProductType() {}\n\n    public ProductType(String id) {\n        this.id = id;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-item/src/main/java/com/cheng/weixin/rpc/item/service/RpcProductService.java",
    "content": "package com.cheng.weixin.rpc.item.service;\n\nimport com.cheng.weixin.rpc.item.entity.Picture;\nimport com.cheng.weixin.rpc.item.entity.Product;\nimport com.cheng.weixin.rpc.item.entity.ProductType;\n\nimport java.util.List;\n\n/**\n * Desc: 商品\n * Author: cheng\n * Date: 2016/6/28\n */\npublic interface RpcProductService {\n\n    /**\n     * 根据ID获取商品\n     * @param id\n     * @return\n     */\n    Product getById(String id);\n\n    /**\n     * 更新商品库存信息\n     * @param id\n     * @param stock\n     * @param isBack 是否是后端\n     */\n    void updateStockById(String id, int stock, boolean isBack);\n\n    /**\n     * 根据类型ID获取图片\n     * @param typeId\n     * @return\n     */\n    List<Product> getByTypeId(String typeId);\n\n    /**\n     * 根据ID获取商品和默认图片\n     * @param id\n     * @return\n     */\n    Product getDefaultPictureById(String id);\n\n    /**\n     * 获取首页的商品\n     * @return\n     */\n    List<Product> getIndex();\n\n    /**\n     * 获取全部的商品类型\n     * @return\n     */\n    List<ProductType> getProductType();\n\n    /**\n     * 获取该商品全部图片\n     * @param productId\n     * @return\n     */\n    List<Picture> getAllPicture(String productId);\n\n    /**\n     * 获取商品默认的图片\n     * @param productId\n     * @return\n     */\n    Picture getDefaultPictureByProductId(String productId);\n\n    /**\n     * 获取该商品的所有的轮播图\n     * @param productId\n     * @return\n     */\n    List<Picture> getShowPictureByProductId(String productId);\n\n}\n"
  },
  {
    "path": "weixin-rpc-log/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-rpc-log</artifactId>\n  <dependencies>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.cheng</groupId>\n      <artifactId>weixin-common-entity</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>javax.servlet</groupId>\n      <artifactId>javax.servlet-api</artifactId>\n      <scope>provided</scope>\n    </dependency>\n  </dependencies>\n\n</project>"
  },
  {
    "path": "weixin-rpc-log/src/main/java/com/cheng/weixin/rpc/log/entity/Log.java",
    "content": "package com.cheng.weixin.rpc.log.entity;\n\nimport com.cheng.common.entity.DataEntity;\nimport com.cheng.weixin.common.utils.StringUtils;\nimport com.cheng.weixin.rpc.log.enums.LogType;\n\nimport java.util.Date;\nimport java.util.Map;\n\n/**\n * Desc: 日志\n * Author: Cheng\n * Date: 2016/3/23 0023\n */\npublic class Log extends DataEntity<Log> {\n    /** 类型 **/\n    private LogType type;\n    /** 标题 **/\n    private String title;\n    /** 操作用户的IP地址 **/\n    private String remoteAddr;\n    /** 操作的URI **/\n    private String requestUri;\n    /** 操作的方式 **/\n    private String method;\n    /** 操作提交的数据 **/\n    private String params;\n    /** 操作用户的代理信息 **/\n    private String userAgent;\n    /** 异常信息 **/\n    private String exception;\n    /** 操作人 **/\n    private String username;\n    /** 开始时间 **/\n    private Date beginDate;\n    /** 结束时间 **/\n    private Date endDate;\n\n    public LogType getType() {\n        return type;\n    }\n\n    public void setType(LogType type) {\n        this.type = type;\n    }\n\n    public String getTitle() {\n        return title;\n    }\n\n    public void setTitle(String title) {\n        this.title = title;\n    }\n\n    public String getRemoteAddr() {\n        return remoteAddr;\n    }\n\n    public void setRemoteAddr(String remoteAddr) {\n        this.remoteAddr = remoteAddr;\n    }\n\n    public String getRequestUri() {\n        return requestUri;\n    }\n\n    public void setRequestUri(String requestUri) {\n        this.requestUri = requestUri;\n    }\n\n    public String getMethod() {\n        return method;\n    }\n\n    public void setMethod(String method) {\n        this.method = method;\n    }\n\n    public String getParams() {\n        return params;\n    }\n\n    public String getUserAgent() {\n        return userAgent;\n    }\n\n    public void setUserAgent(String userAgent) {\n        this.userAgent = userAgent;\n    }\n\n    public String getException() {\n        return exception;\n    }\n\n    public void setException(String exception) {\n        this.exception = exception;\n    }\n\n    public String getUsername() {\n        return username;\n    }\n\n    public void setUsername(String username) {\n        this.username = username;\n    }\n\n    public Date getBeginDate() {\n        return beginDate;\n    }\n\n    public void setBeginDate(Date beginDate) {\n        this.beginDate = beginDate;\n    }\n\n    public Date getEndDate() {\n        return endDate;\n    }\n\n    public void setEndDate(Date endDate) {\n        this.endDate = endDate;\n    }\n\n    /**\n     * 设置请求参数\n     * @param paramMap\n     */\n    public void setParams(Map<String, String[]> paramMap) {\n        if (paramMap == null) {\n            return;\n        }\n        StringBuilder params = new StringBuilder();\n        for (Map.Entry<String, String[]> param : paramMap.entrySet()) {\n            params.append((\"\".equals(params.toString()) ? \"\" : \"&\") + param.getKey() + \"=\");\n            String paramValue = param.getValue() != null && param.getValue().length > 0 ? param.getValue()[0] : \"\";\n            params.append(StringUtils.endsWithIgnoreCase(param.getKey(), \"password\") ? \"\" : paramValue);\n        }\n        this.params = params.toString();\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-log/src/main/java/com/cheng/weixin/rpc/log/enums/LogType.java",
    "content": "package com.cheng.weixin.rpc.log.enums;\n\n/**\n * Desc: 日志类型\n * Author: Cheng\n * Date: 2016/3/23 0023\n */\npublic enum LogType {\n    /** 接入日志 **/\n    ACCESS,\n    /** 异常日志 **/\n    EXCEPTION;\n}\n"
  },
  {
    "path": "weixin-rpc-log/src/main/java/com/cheng/weixin/rpc/log/model/RequestModel.java",
    "content": "package com.cheng.weixin.rpc.log.model;\n\nimport java.io.Serializable;\n\n/**\n * Desc: 由于Dubbo不能传request，这里主要封装request里的参数 ！暂时没用到\n * Author: Cheng\n * Date: 2016/4/13 0013\n */\npublic class RequestModel implements Serializable {\n\n    private static final long serialVersionUID = 28202096490589558L;\n    private String remoteAddr; // 操作用户的IP地址\n    private String userAgent;  // 操作用户的代理信息\n    private String requestUri; // 操作的URI\n    private String params;     // 操作提交的数据\n    private String method;     // 操作的方式\n\n    public RequestModel() {}\n\n    public RequestModel(String remoteAddr, String userAgent, String requestUri, String params, String method) {\n        this.remoteAddr = remoteAddr;\n        this.userAgent = userAgent;\n        this.requestUri = requestUri;\n        this.params = params;\n        this.method = method;\n    }\n\n    public String getRemoteAddr() {\n        return remoteAddr;\n    }\n\n    public void setRemoteAddr(String remoteAddr) {\n        this.remoteAddr = remoteAddr;\n    }\n\n    public String getUserAgent() {\n        return userAgent;\n    }\n\n    public void setUserAgent(String userAgent) {\n        this.userAgent = userAgent;\n    }\n\n    public String getRequestUri() {\n        return requestUri;\n    }\n\n    public void setRequestUri(String requestUri) {\n        this.requestUri = requestUri;\n    }\n\n    public String getParams() {\n        return params;\n    }\n\n    public void setParams(String params) {\n        this.params = params;\n    }\n\n    public String getMethod() {\n        return method;\n    }\n\n    public void setMethod(String method) {\n        this.method = method;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-log/src/main/java/com/cheng/weixin/rpc/log/service/RpcLogService.java",
    "content": "package com.cheng.weixin.rpc.log.service;\n\nimport java.util.Map;\n\n/**\n * Desc: 日志\n * Author: Cheng\n * Date: 2016/4/7 0007\n */\npublic interface RpcLogService {\n    /**\n     * 保存日志\n     * @param remoteAddr 操作用户的IP地址\n     * @param userAgent 操作用户的代理信息\n     * @param requestUri 操作的URI\n     * @param params 操作提交的数据\n     * @param method 操作的方式 GET或POST\n//     * @param handler // 里面有内容不支持序列化；需要在前端把值取出来 传过来 TODO 以后实现\n     * @param ex 异常信息\n     * @param title 标题\n     * @param username 操作人用户名\n     */\n    void saveLog(String remoteAddr, String userAgent, String requestUri, Map<String, String[]> params, String method,\n                 /*Object handler,*/ Exception ex, String title, String username);\n\n}\n"
  },
  {
    "path": "weixin-rpc-message/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-rpc-message</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>com.cheng</groupId>\n      <artifactId>weixin-common-entity</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-rabbitmq-model</artifactId>\n    </dependency>\n  </dependencies>\n\n</project>"
  },
  {
    "path": "weixin-rpc-message/src/main/java/com/cheng/weixin/rpc/message/entity/EmailTemplate.java",
    "content": "package com.cheng.weixin.rpc.message.entity;\n\nimport com.cheng.common.entity.DataEntity;\nimport com.cheng.weixin.rabbitmq.enums.MsgType;\n\n/**\n * Desc: 邮件模板\n * Author: 光灿\n * Date: 2016/6/17\n */\npublic class EmailTemplate extends DataEntity<EmailTemplate> {\n    private MsgType type;\n    private String content;\n    private boolean isEnable;\n\n    public MsgType getType() {\n        return type;\n    }\n\n    public void setType(MsgType type) {\n        this.type = type;\n    }\n\n    public String getContent() {\n        return content;\n    }\n\n    public void setContent(String content) {\n        this.content = content;\n    }\n\n    public boolean isEnable() {\n        return isEnable;\n    }\n\n    public void setEnable(boolean enable) {\n        isEnable = enable;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-message/src/main/java/com/cheng/weixin/rpc/message/entity/SmsHistory.java",
    "content": "package com.cheng.weixin.rpc.message.entity;\n\nimport com.cheng.common.entity.DataEntity;\nimport com.cheng.weixin.rabbitmq.enums.MsgType;\n\nimport java.util.Date;\n\n/**\n * Desc: 短信历史\n * Author: cheng\n * Date: 2016/7/8\n */\npublic class SmsHistory extends DataEntity<SmsHistory> {\n    private String phone;       // 手机号\n    private String content;     // 发送的内容\n    private int timeout;        // 超时时间\n    private MsgType type;       // 类型\n    private String sender;      // 发送者 默认：system\n    private String receiverId;  // 接受者\n    private String userIp;      // IP地址\n    private String validate;    // 验证码\n\n    // 当天的开始时间\n    private Date startOfDay;\n\n    public Date getStartOfDay() {\n        return startOfDay;\n    }\n\n    public void setStartOfDay(Date startOfDay) {\n        this.startOfDay = startOfDay;\n    }\n\n    public String getPhone() {\n        return phone;\n    }\n\n    public void setPhone(String phone) {\n        this.phone = phone;\n    }\n\n    public String getContent() {\n        return content;\n    }\n\n    public void setContent(String content) {\n        this.content = content;\n    }\n\n    public int getTimeout() {\n        return timeout;\n    }\n\n    public void setTimeout(int timeout) {\n        this.timeout = timeout;\n    }\n\n    public MsgType getType() {\n        return type;\n    }\n\n    public void setType(MsgType type) {\n        this.type = type;\n    }\n\n    public String getSender() {\n        return sender;\n    }\n\n    public void setSender(String sender) {\n        this.sender = sender;\n    }\n\n    public String getReceiverId() {\n        return receiverId;\n    }\n\n    public void setReceiverId(String receiverId) {\n        this.receiverId = receiverId;\n    }\n\n    public String getUserIp() {\n        return userIp;\n    }\n\n    public void setUserIp(String userIp) {\n        this.userIp = userIp;\n    }\n\n    public String getValidate() {\n        return validate;\n    }\n\n    public void setValidate(String validate) {\n        this.validate = validate;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-message/src/main/java/com/cheng/weixin/rpc/message/entity/SmsTemplate.java",
    "content": "package com.cheng.weixin.rpc.message.entity;\n\nimport com.cheng.common.entity.DataEntity;\nimport com.cheng.weixin.rabbitmq.enums.MsgType;\n\n/**\n * Desc: 短信模版\n * Author: cheng\n * Date: 2016/6/21\n */\npublic class SmsTemplate extends DataEntity<SmsTemplate> {\n    private MsgType type;\n    private String content;\n    private int timeout;\n    private boolean isEnable;\n\n    public SmsTemplate() {\n    }\n\n    public SmsTemplate(MsgType type) {\n        this.type = type;\n        this.isEnable = true;\n    }\n\n    public int getTimeout() {\n        return timeout;\n    }\n\n    public void setTimeout(int timeout) {\n        this.timeout = timeout;\n    }\n\n    public MsgType getType() {\n        return type;\n    }\n\n    public void setType(MsgType type) {\n        this.type = type;\n    }\n\n    public String getContent() {\n        return content;\n    }\n\n    public void setContent(String content) {\n        this.content = content;\n    }\n\n    public boolean isEnable() {\n        return isEnable;\n    }\n\n    public void setEnable(boolean enable) {\n        isEnable = enable;\n    }\n}"
  },
  {
    "path": "weixin-rpc-message/src/main/java/com/cheng/weixin/rpc/message/service/RpcSmsService.java",
    "content": "package com.cheng.weixin.rpc.message.service;\n\n\nimport com.cheng.weixin.rabbitmq.enums.MsgType;\nimport com.cheng.weixin.rabbitmq.model.SmsModel;\nimport com.cheng.weixin.rpc.message.entity.SmsHistory;\n\n/**\n * Desc: 短信服务\n * Author: 光灿\n * Date: 2016/7/10\n */\npublic interface RpcSmsService {\n    /**\n     * 获取当天发送短信的个数\n     * @param phone\n     * @return\n     */\n    int getCountByDay(String phone);\n\n    /**\n     * 获取当前IP发送短信的个数\n     * @param ip\n     * @return\n     */\n    int getCountByIp(String ip);\n\n    /**\n     * 发送注册短信\n     */\n    void sendValidate(SmsModel smsModel);\n\n    /**\n     * 获取记录根据手机号和类型\n     * @param phone\n     * @param type\n     * @return\n     */\n    SmsHistory getInfoByPhoneAndType(String phone, MsgType type);\n\n    /**\n     * 发送通知短信\n     * @param smsModel\n     */\n    void sendNotice(SmsModel smsModel);\n\n    /**\n     * 发送活动短信\n     * @param msgData\n     */\n    void sendActivity(String msgData);\n\n}\n"
  },
  {
    "path": "weixin-rpc-order/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-rpc-order</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>com.cheng</groupId>\n      <artifactId>weixin-common-entity</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.github.pagehelper</groupId>\n      <artifactId>pagehelper</artifactId>\n    </dependency>\n  </dependencies>\n\n</project>"
  },
  {
    "path": "weixin-rpc-order/src/main/java/com/cheng/weixin/rpc/order/entity/ArayacakAddress.java",
    "content": "package com.cheng.weixin.rpc.order.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc:自提地点\n * Author: 光灿\n * Date: 2016/6/18\n */\npublic class ArayacakAddress extends DataEntity<ArayacakAddress> {\n    private String name;\n    private String province;\n    private String city;\n    private String country;\n    private String town;\n    private String village;\n    private String address;\n\n    public ArayacakAddress() {\n    }\n    public ArayacakAddress(String id) {\n        super.id = id;\n    }\n    public ArayacakAddress(String countryId, String townId) {\n        this.country = countryId;\n        this.town = townId;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getProvince() {\n        return province;\n    }\n\n    public void setProvince(String province) {\n        this.province = province;\n    }\n\n    public String getCity() {\n        return city;\n    }\n\n    public void setCity(String city) {\n        this.city = city;\n    }\n\n    public String getCountry() {\n        return country;\n    }\n\n    public void setCountry(String country) {\n        this.country = country;\n    }\n\n    public String getVillage() {\n        return village;\n    }\n\n    public void setVillage(String village) {\n        this.village = village;\n    }\n\n    public String getTown() {\n        return town;\n    }\n\n    public void setTown(String town) {\n        this.town = town;\n    }\n\n    public String getAddress() {\n        return address;\n    }\n\n    public void setAddress(String address) {\n        this.address = address;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-order/src/main/java/com/cheng/weixin/rpc/order/entity/ArayacakDeliveryTime.java",
    "content": "package com.cheng.weixin.rpc.order.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc:自提配送时间\n * Author: 光灿\n * Date: 2016/6/18\n */\npublic class ArayacakDeliveryTime extends DataEntity<ArayacakDeliveryTime> {\n    private String name;\n\n    public String getName() {\n        return name;\n    }\n\n    public ArayacakDeliveryTime setName(String name) {\n        this.name = name;\n        return this;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-order/src/main/java/com/cheng/weixin/rpc/order/entity/City.java",
    "content": "package com.cheng.weixin.rpc.order.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 市\n * Author: hp\n * Date: 2016/11/3\n */\npublic class City extends DataEntity<City> {\n    private String name;\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-order/src/main/java/com/cheng/weixin/rpc/order/entity/Country.java",
    "content": "package com.cheng.weixin.rpc.order.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 市区县\n * Author: hp\n * Date: 2016/11/3\n */\npublic class Country extends DataEntity<Country> {\n    private String name;\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-order/src/main/java/com/cheng/weixin/rpc/order/entity/DeliveryTime.java",
    "content": "package com.cheng.weixin.rpc.order.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 配送时间\n * Author: cheng\n * Date: 2016/6/6\n */\npublic class DeliveryTime extends DataEntity<DeliveryTime> {\n    private String name;\n\n    public DeliveryTime() {\n    }\n\n    public DeliveryTime(String id) {\n        super.id = id;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n}"
  },
  {
    "path": "weixin-rpc-order/src/main/java/com/cheng/weixin/rpc/order/entity/DeliveryType.java",
    "content": "package com.cheng.weixin.rpc.order.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 配送方式：上门自提；第三方运输\n * Author: cheng\n * Date: 2016/6/6\n */\n@Deprecated\npublic class DeliveryType extends DataEntity<DeliveryType> {\n    private String name;\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-order/src/main/java/com/cheng/weixin/rpc/order/entity/FlowStatus.java",
    "content": "package com.cheng.weixin.rpc.order.entity;\n\nimport com.cheng.common.entity.DataEntity;\nimport com.cheng.weixin.rpc.order.enumType.PayWay;\n\n/**\n * Desc:\n * Author: 光灿\n * Date: 2016/11/15\n */\npublic class FlowStatus extends DataEntity<FlowStatus> {\n    private String name;\n    private String preStatusId;\n    private String nextStatusId;\n    private PayWay payWay;\n    private int orderBy;\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getPreStatusId() {\n        return preStatusId;\n    }\n\n    public void setPreStatusId(String preStatusId) {\n        this.preStatusId = preStatusId;\n    }\n\n    public String getNextStatusId() {\n        return nextStatusId;\n    }\n\n    public void setNextStatusId(String nextStatusId) {\n        this.nextStatusId = nextStatusId;\n    }\n\n    public PayWay getPayWay() {\n        return payWay;\n    }\n\n    public void setPayWay(PayWay payWay) {\n        this.payWay = payWay;\n    }\n\n    public int getOrderBy() {\n        return orderBy;\n    }\n\n    public void setOrderBy(int orderBy) {\n        this.orderBy = orderBy;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-order/src/main/java/com/cheng/weixin/rpc/order/entity/OrderInfo.java",
    "content": "package com.cheng.weixin.rpc.order.entity;\n\nimport com.cheng.common.entity.DataEntity;\nimport com.cheng.weixin.rpc.order.enumType.OrderStatus;\nimport com.cheng.weixin.rpc.order.enumType.OrderType;\nimport com.cheng.weixin.rpc.order.enumType.PayWay;\n\nimport java.math.BigDecimal;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * Desc: 订单\n * Author: cheng\n * Date: 2016/6/6\n */\npublic class OrderInfo extends DataEntity<OrderInfo> {\n    private String accountId;\n    private String oid;\n    private String relateOid;\n    private BigDecimal amountPayable;\n    private BigDecimal amountPaid;\n    private String consignee;\n    private String mobile;\n    private String address;\n    private String deliveryTime;\n    private String pay;\n    private String arayacakAddress;\n    private String arayacakDeliveryTime;\n    private String province;\n    private String city;\n    private String country;\n    private String village;\n    private String ip;\n\n    private PayWay payWay;\n    private String flowStatus;\n    private OrderType orderType;\n    private BigDecimal freightReduce;\n    private BigDecimal freightPayable;\n    private BigDecimal productTotalPrice;\n    private BigDecimal balanceOffset; // 余额抵扣\n    private BigDecimal discount;\n    private String remarkCustomer;\n    private String postCode;\n    private String telephone;\n    private String email;\n    private Date payTime;\n    private String exchangeOid;\n    private String customPrice;\n    private String couponCode;\n    private BigDecimal couponReducePrice;\n    //private BigDecimal cashReducePrice;\n    private BigDecimal bonusPointReducePrice;\n    private boolean isFreeAccountLevel;\n    private String commentId;\n    private Boolean since; // 是否是自提\n\n    private OrderStatus orderStatus;\n\n\n    public OrderInfo() {\n    }\n\n    public OrderInfo(String accountId) {\n        this.accountId = accountId;\n    }\n\n    public String getVillage() {\n        return village;\n    }\n\n    public void setVillage(String village) {\n        this.village = village;\n    }\n\n    public String getIp() {\n        return ip;\n    }\n\n    public void setIp(String ip) {\n        this.ip = ip;\n    }\n\n\n    public String getOid() {\n        return oid;\n    }\n\n    public void setOid(String oid) {\n        this.oid = oid;\n    }\n\n    public String getCommentId() {\n        return commentId;\n    }\n\n    public void setCommentId(String commentId) {\n        this.commentId = commentId;\n    }\n\n    public String getFlowStatus() {\n        return flowStatus;\n    }\n\n    public void setFlowStatus(String flowStatus) {\n        this.flowStatus = flowStatus;\n    }\n\n    private List<OrderProductDetail> orderDetails;\n\n    public String getAccountId() {\n        return accountId;\n    }\n\n    public void setAccountId(String accountId) {\n        this.accountId = accountId;\n    }\n\n    public String getRelateOid() {\n        return relateOid;\n    }\n\n    public void setRelateOid(String relateOid) {\n        this.relateOid = relateOid;\n    }\n\n    public BigDecimal getAmountPayable() {\n        return amountPayable;\n    }\n\n    public void setAmountPayable(BigDecimal amountPayable) {\n        this.amountPayable = amountPayable;\n    }\n\n    public BigDecimal getAmountPaid() {\n        return amountPaid;\n    }\n\n    public void setAmountPaid(BigDecimal amountPaid) {\n        this.amountPaid = amountPaid;\n    }\n\n    public String getConsignee() {\n        return consignee;\n    }\n\n    public void setConsignee(String consignee) {\n        this.consignee = consignee;\n    }\n\n    public String getMobile() {\n        return mobile;\n    }\n\n    public void setMobile(String mobile) {\n        this.mobile = mobile;\n    }\n\n    public String getAddress() {\n        return address;\n    }\n\n    public void setAddress(String address) {\n        this.address = address;\n    }\n\n    public String getDeliveryTime() {\n        return deliveryTime;\n    }\n\n    public void setDeliveryTime(String deliveryTime) {\n        this.deliveryTime = deliveryTime;\n    }\n\n    public String getPay() {\n        return pay;\n    }\n\n    public void setPay(String pay) {\n        this.pay = pay;\n    }\n\n    public String getArayacakAddress() {\n        return arayacakAddress;\n    }\n\n    public void setArayacakAddress(String arayacakAddress) {\n        this.arayacakAddress = arayacakAddress;\n    }\n\n    public String getArayacakDeliveryTime() {\n        return arayacakDeliveryTime;\n    }\n\n    public void setArayacakDeliveryTime(String arayacakDeliveryTime) {\n        this.arayacakDeliveryTime = arayacakDeliveryTime;\n    }\n\n    public String getProvince() {\n        return province;\n    }\n\n    public void setProvince(String province) {\n        this.province = province;\n    }\n\n    public String getCity() {\n        return city;\n    }\n\n    public void setCity(String city) {\n        this.city = city;\n    }\n\n    public String getCountry() {\n        return country;\n    }\n\n    public void setCountry(String country) {\n        this.country = country;\n    }\n\n    public PayWay getPayWay() {\n        return payWay;\n    }\n\n    public void setPayWay(PayWay payWay) {\n        this.payWay = payWay;\n    }\n\n    public BigDecimal getBalanceOffset() {\n        return balanceOffset;\n    }\n\n    public void setBalanceOffset(BigDecimal balanceOffset) {\n        this.balanceOffset = balanceOffset;\n    }\n\n    public OrderType getOrderType() {\n        return orderType;\n    }\n\n    public void setOrderType(OrderType orderType) {\n        this.orderType = orderType;\n    }\n\n    public BigDecimal getFreightReduce() {\n        return freightReduce;\n    }\n\n    public void setFreightReduce(BigDecimal freightReduce) {\n        this.freightReduce = freightReduce;\n    }\n\n    public BigDecimal getFreightPayable() {\n        return freightPayable;\n    }\n\n    public void setFreightPayable(BigDecimal freightPayable) {\n        this.freightPayable = freightPayable;\n    }\n\n    public BigDecimal getProductTotalPrice() {\n        return productTotalPrice;\n    }\n\n    public void setProductTotalPrice(BigDecimal productTotalPrice) {\n        this.productTotalPrice = productTotalPrice;\n    }\n\n    public BigDecimal getDiscount() {\n        return discount;\n    }\n\n    public void setDiscount(BigDecimal discount) {\n        this.discount = discount;\n    }\n\n    public String getRemarkCustomer() {\n        return remarkCustomer;\n    }\n\n    public void setRemarkCustomer(String remarkCustomer) {\n        this.remarkCustomer = remarkCustomer;\n    }\n\n    public String getPostCode() {\n        return postCode;\n    }\n\n    public void setPostCode(String postCode) {\n        this.postCode = postCode;\n    }\n\n    public String getTelephone() {\n        return telephone;\n    }\n\n    public void setTelephone(String telephone) {\n        this.telephone = telephone;\n    }\n\n    public String getEmail() {\n        return email;\n    }\n\n    public void setEmail(String email) {\n        this.email = email;\n    }\n\n    public Date getPayTime() {\n        return payTime;\n    }\n\n    public void setPayTime(Date payTime) {\n        this.payTime = payTime;\n    }\n\n    public String getExchangeOid() {\n        return exchangeOid;\n    }\n\n    public void setExchangeOid(String exchangeOid) {\n        this.exchangeOid = exchangeOid;\n    }\n\n    public String getCustomPrice() {\n        return customPrice;\n    }\n\n    public void setCustomPrice(String customPrice) {\n        this.customPrice = customPrice;\n    }\n\n    public String getCouponCode() {\n        return couponCode;\n    }\n\n    public void setCouponCode(String couponCode) {\n        this.couponCode = couponCode;\n    }\n\n    public BigDecimal getCouponReducePrice() {\n        return couponReducePrice;\n    }\n\n    public void setCouponReducePrice(BigDecimal couponReducePrice) {\n        this.couponReducePrice = couponReducePrice;\n    }\n\n    //public BigDecimal getCashReducePrice() {\n    //    return cashReducePrice;\n    //}\n    //\n    //public void setCashReducePrice(BigDecimal cashReducePrice) {\n    //    this.cashReducePrice = cashReducePrice;\n    //}\n\n    public BigDecimal getBonusPointReducePrice() {\n        return bonusPointReducePrice;\n    }\n\n    public void setBonusPointReducePrice(BigDecimal bonusPointReducePrice) {\n        this.bonusPointReducePrice = bonusPointReducePrice;\n    }\n\n    public boolean isFreeAccountLevel() {\n        return isFreeAccountLevel;\n    }\n\n    public void setFreeAccountLevel(boolean freeAccountLevel) {\n        isFreeAccountLevel = freeAccountLevel;\n    }\n\n    public List<OrderProductDetail> getOrderDetails() {\n        return orderDetails;\n    }\n\n    public void setOrderDetails(List<OrderProductDetail> orderDetails) {\n        this.orderDetails = orderDetails;\n    }\n\n    public Boolean getSince() {\n        return since;\n    }\n\n    public void setSince(Boolean since) {\n        this.since = since;\n    }\n\n    public OrderStatus getOrderStatus() {\n        return orderStatus;\n    }\n\n    public void setOrderStatus(OrderStatus orderStatus) {\n        this.orderStatus = orderStatus;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-order/src/main/java/com/cheng/weixin/rpc/order/entity/OrderProductDetail.java",
    "content": "package com.cheng.weixin.rpc.order.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\nimport java.math.BigDecimal;\n\n/**\n * Desc: 订单子项表-客服\n * Author: cheng\n * Date: 2016/6/6\n */\npublic class OrderProductDetail extends DataEntity<OrderProductDetail> {\n    private String orderInfoId;\n    private String oid;\n    private String name;\n    private int quantity;\n    private BigDecimal subtotal;\n    private BigDecimal marketPrice;\n    private BigDecimal salePrice;\n    private BigDecimal dealPrice;\n    private double discountRate;\n    private boolean isComment;\n    private boolean isGift;\n\n    public OrderProductDetail() {\n    }\n    public OrderProductDetail(String orderInfoId) {\n        this.orderInfoId = orderInfoId;\n    }\n    public String getOrderInfoId() {\n        return orderInfoId;\n    }\n\n    public void setOrderInfoId(String orderInfoId) {\n        this.orderInfoId = orderInfoId;\n    }\n\n    public String getOid() {\n        return oid;\n    }\n\n    public void setOid(String oid) {\n        this.oid = oid;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public int getQuantity() {\n        return quantity;\n    }\n\n    public void setQuantity(int quantity) {\n        this.quantity = quantity;\n    }\n\n    public BigDecimal getSubtotal() {\n        return subtotal;\n    }\n\n    public void setSubtotal(BigDecimal subtotal) {\n        this.subtotal = subtotal;\n    }\n\n    public BigDecimal getMarketPrice() {\n        return marketPrice;\n    }\n\n    public void setMarketPrice(BigDecimal marketPrice) {\n        this.marketPrice = marketPrice;\n    }\n\n    public BigDecimal getSalePrice() {\n        return salePrice;\n    }\n\n    public void setSalePrice(BigDecimal salePrice) {\n        this.salePrice = salePrice;\n    }\n\n    public BigDecimal getDealPrice() {\n        return dealPrice;\n    }\n\n    public void setDealPrice(BigDecimal dealPrice) {\n        this.dealPrice = dealPrice;\n    }\n\n    public double getDiscountRate() {\n        return discountRate;\n    }\n\n    public void setDiscountRate(double discountRate) {\n        this.discountRate = discountRate;\n    }\n\n    public boolean isComment() {\n        return isComment;\n    }\n\n    public void setComment(boolean comment) {\n        isComment = comment;\n    }\n\n    public boolean isGift() {\n        return isGift;\n    }\n\n    public void setGift(boolean gift) {\n        isGift = gift;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-order/src/main/java/com/cheng/weixin/rpc/order/entity/OrderReturn.java",
    "content": "package com.cheng.weixin.rpc.order.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\nimport java.math.BigDecimal;\n\n/**\n * Desc: 退单主\n * Author: cheng\n * Date: 2016/6/6\n */\npublic class OrderReturn extends DataEntity<OrderReturn> {\n    private String accessId;\n    private String returnId;\n    private String orderInfoOid;\n    private String orderInfoId;\n    private BigDecimal refundPayable;\n    private BigDecimal refundPaid;\n    private BigDecimal salePriceTatal;\n    private String consignee;\n    private String mobile;\n    private String address;\n    private String province;\n    private String city;\n    private String country;\n    private String returnStatusId;\n    private BigDecimal freight;\n    private BigDecimal productTotalPrice;\n    private String remarkSystem;\n    private String ip;\n    private String postCode;\n    private String telephone;\n    private String email;\n    private String returnReasonId;\n    private String customReturnReason;\n    private String refundTypeId;\n    private BigDecimal customPrice;\n\n    public String getAccessId() {\n        return accessId;\n    }\n\n    public void setAccessId(String accessId) {\n        this.accessId = accessId;\n    }\n\n    public String getReturnId() {\n        return returnId;\n    }\n\n    public void setReturnId(String returnId) {\n        this.returnId = returnId;\n    }\n\n    public String getOrderInfoOid() {\n        return orderInfoOid;\n    }\n\n    public void setOrderInfoOid(String orderInfoOid) {\n        this.orderInfoOid = orderInfoOid;\n    }\n\n    public String getOrderInfoId() {\n        return orderInfoId;\n    }\n\n    public void setOrderInfoId(String orderInfoId) {\n        this.orderInfoId = orderInfoId;\n    }\n\n    public BigDecimal getRefundPayable() {\n        return refundPayable;\n    }\n\n    public void setRefundPayable(BigDecimal refundPayable) {\n        this.refundPayable = refundPayable;\n    }\n\n    public BigDecimal getRefundPaid() {\n        return refundPaid;\n    }\n\n    public void setRefundPaid(BigDecimal refundPaid) {\n        this.refundPaid = refundPaid;\n    }\n\n    public BigDecimal getSalePriceTatal() {\n        return salePriceTatal;\n    }\n\n    public void setSalePriceTatal(BigDecimal salePriceTatal) {\n        this.salePriceTatal = salePriceTatal;\n    }\n\n    public String getConsignee() {\n        return consignee;\n    }\n\n    public void setConsignee(String consignee) {\n        this.consignee = consignee;\n    }\n\n    public String getMobile() {\n        return mobile;\n    }\n\n    public void setMobile(String mobile) {\n        this.mobile = mobile;\n    }\n\n    public String getAddress() {\n        return address;\n    }\n\n    public void setAddress(String address) {\n        this.address = address;\n    }\n\n    public String getProvince() {\n        return province;\n    }\n\n    public void setProvince(String province) {\n        this.province = province;\n    }\n\n    public String getCity() {\n        return city;\n    }\n\n    public void setCity(String city) {\n        this.city = city;\n    }\n\n    public String getCountry() {\n        return country;\n    }\n\n    public void setCountry(String country) {\n        this.country = country;\n    }\n\n    public String getReturnStatusId() {\n        return returnStatusId;\n    }\n\n    public void setReturnStatusId(String returnStatusId) {\n        this.returnStatusId = returnStatusId;\n    }\n\n    public BigDecimal getFreight() {\n        return freight;\n    }\n\n    public void setFreight(BigDecimal freight) {\n        this.freight = freight;\n    }\n\n    public BigDecimal getProductTotalPrice() {\n        return productTotalPrice;\n    }\n\n    public void setProductTotalPrice(BigDecimal productTotalPrice) {\n        this.productTotalPrice = productTotalPrice;\n    }\n\n    public String getRemarkSystem() {\n        return remarkSystem;\n    }\n\n    public void setRemarkSystem(String remarkSystem) {\n        this.remarkSystem = remarkSystem;\n    }\n\n    public String getIp() {\n        return ip;\n    }\n\n    public void setIp(String ip) {\n        this.ip = ip;\n    }\n\n    public String getPostCode() {\n        return postCode;\n    }\n\n    public void setPostCode(String postCode) {\n        this.postCode = postCode;\n    }\n\n    public String getTelephone() {\n        return telephone;\n    }\n\n    public void setTelephone(String telephone) {\n        this.telephone = telephone;\n    }\n\n    public String getEmail() {\n        return email;\n    }\n\n    public void setEmail(String email) {\n        this.email = email;\n    }\n\n    public String getReturnReasonId() {\n        return returnReasonId;\n    }\n\n    public void setReturnReasonId(String returnReasonId) {\n        this.returnReasonId = returnReasonId;\n    }\n\n    public String getCustomReturnReason() {\n        return customReturnReason;\n    }\n\n    public void setCustomReturnReason(String customReturnReason) {\n        this.customReturnReason = customReturnReason;\n    }\n\n    public String getRefundTypeId() {\n        return refundTypeId;\n    }\n\n    public void setRefundTypeId(String refundTypeId) {\n        this.refundTypeId = refundTypeId;\n    }\n\n    public BigDecimal getCustomPrice() {\n        return customPrice;\n    }\n\n    public void setCustomPrice(BigDecimal customPrice) {\n        this.customPrice = customPrice;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-order/src/main/java/com/cheng/weixin/rpc/order/entity/OrderReturnDetail.java",
    "content": "package com.cheng.weixin.rpc.order.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\nimport java.math.BigDecimal;\n\n/**\n * Desc: 退单子项\n * Author: cheng\n * Date: 2016/6/6\n */\npublic class OrderReturnDetail extends DataEntity<OrderReturnDetail> {\n    private String returnOid;\n    private String no;\n    private String name;\n    private int quantity;\n    private BigDecimal subtatal;\n    private BigDecimal marketPrice;\n    private BigDecimal salePrice;\n    private BigDecimal dealPrice;\n    private double discountRate;\n    private boolean isGift;\n\n    public String getReturnOid() {\n        return returnOid;\n    }\n\n    public OrderReturnDetail setReturnOid(String returnOid) {\n        this.returnOid = returnOid;\n        return this;\n    }\n\n    public String getNo() {\n        return no;\n    }\n\n    public OrderReturnDetail setNo(String no) {\n        this.no = no;\n        return this;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public OrderReturnDetail setName(String name) {\n        this.name = name;\n        return this;\n    }\n\n    public int getQuantity() {\n        return quantity;\n    }\n\n    public OrderReturnDetail setQuantity(int quantity) {\n        this.quantity = quantity;\n        return this;\n    }\n\n    public BigDecimal getSubtatal() {\n        return subtatal;\n    }\n\n    public OrderReturnDetail setSubtatal(BigDecimal subtatal) {\n        this.subtatal = subtatal;\n        return this;\n    }\n\n    public BigDecimal getMarketPrice() {\n        return marketPrice;\n    }\n\n    public OrderReturnDetail setMarketPrice(BigDecimal marketPrice) {\n        this.marketPrice = marketPrice;\n        return this;\n    }\n\n    public BigDecimal getSalePrice() {\n        return salePrice;\n    }\n\n    public OrderReturnDetail setSalePrice(BigDecimal salePrice) {\n        this.salePrice = salePrice;\n        return this;\n    }\n\n    public BigDecimal getDealPrice() {\n        return dealPrice;\n    }\n\n    public OrderReturnDetail setDealPrice(BigDecimal dealPrice) {\n        this.dealPrice = dealPrice;\n        return this;\n    }\n\n    public double getDiscountRate() {\n        return discountRate;\n    }\n\n    public OrderReturnDetail setDiscountRate(double discountRate) {\n        this.discountRate = discountRate;\n        return this;\n    }\n\n    public boolean isGift() {\n        return isGift;\n    }\n\n    public OrderReturnDetail setGift(boolean gift) {\n        isGift = gift;\n        return this;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-order/src/main/java/com/cheng/weixin/rpc/order/entity/Pay.java",
    "content": "package com.cheng.weixin.rpc.order.entity;\n\nimport com.cheng.common.entity.DataEntity;\nimport com.cheng.weixin.rpc.order.enumType.PayWay;\n\n/**\n * Desc: 支付方式：微信支付，支付宝支付，货到付款\n * Author: cheng\n * Date: 2016/6/6\n */\npublic class Pay extends DataEntity<Pay> {\n    private String name;\n    private PayWay payWay;\n    private String icon;\n    private int orderBy;\n    private Boolean recommend;\n\n    public Pay() {\n    }\n\n    public Pay(String id) {\n        super.id = id;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public PayWay getPayWay() {\n        return payWay;\n    }\n\n    public void setPayWay(PayWay payWay) {\n        this.payWay = payWay;\n    }\n\n    public String getIcon() {\n        return icon;\n    }\n\n    public void setIcon(String icon) {\n        this.icon = icon;\n    }\n\n    public int getOrderBy() {\n        return orderBy;\n    }\n\n    public void setOrderBy(int orderBy) {\n        this.orderBy = orderBy;\n    }\n\n    public Boolean getRecommend() {\n        return recommend;\n    }\n\n    public void setRecommend(Boolean recommend) {\n        this.recommend = recommend;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-order/src/main/java/com/cheng/weixin/rpc/order/entity/Province.java",
    "content": "package com.cheng.weixin.rpc.order.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 省\n * Author: hp\n * Date: 2016/11/3\n */\npublic class Province extends DataEntity<Province> {\n    private String name;\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-order/src/main/java/com/cheng/weixin/rpc/order/entity/RefundType.java",
    "content": "package com.cheng.weixin.rpc.order.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 退款方式：微信零钱\n * Author: cheng\n * Date: 2016/6/6\n */\npublic class RefundType extends DataEntity<RefundType> {\n    private String name;\n\n    public String getName() {\n        return name;\n    }\n\n    public RefundType setName(String name) {\n        this.name = name;\n        return this;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-order/src/main/java/com/cheng/weixin/rpc/order/entity/ReturnReason.java",
    "content": "package com.cheng.weixin.rpc.order.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 退货原因\n * Author: cheng\n * Date: 2016/6/6\n */\npublic class ReturnReason extends DataEntity<ReturnReason> {\n    private String name;\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-order/src/main/java/com/cheng/weixin/rpc/order/entity/ReturnStatus.java",
    "content": "package com.cheng.weixin.rpc.order.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 退单状态\n * Author: cheng\n * Date: 2016/6/6\n */\npublic class ReturnStatus extends DataEntity<ReturnStatus> {\n    private String name;\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-order/src/main/java/com/cheng/weixin/rpc/order/entity/Town.java",
    "content": "package com.cheng.weixin.rpc.order.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 镇\n * Author: hp\n * Date: 2016/11/3\n */\npublic class Town extends DataEntity<Town> {\n    private String name;\n\n    public Town() {\n    }\n    public Town(String id) {\n        super.id = id;\n    }\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-order/src/main/java/com/cheng/weixin/rpc/order/entity/Village.java",
    "content": "package com.cheng.weixin.rpc.order.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 村庄\n * Author: hp\n * Date: 2016/11/3\n */\npublic class Village extends DataEntity<Village> {\n    private String name;\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-order/src/main/java/com/cheng/weixin/rpc/order/enumType/FlowStatus.java",
    "content": "package com.cheng.weixin.rpc.order.enumType;\n\n/**\n * Desc: 派送状态\n * Author: hp\n * Date: 2016/11/10\n */\n@Deprecated\npublic enum FlowStatus {\n    COD(\"货到付款\"),\n    UNPAID(\"未付款\"),\n    PAID(\"已付款\"),\n    PICKING(\"拣货中\"),\n    DISTRIBUTION(\"配送中\"),\n    DELIVER(\"派件中\"),\n    DELIVERED(\"已送达\");\n\n    private String name;\n    FlowStatus(String name) {\n        this.name = name;\n    }\n\n    public String getName() {\n        return name;\n    }\n}\n\n"
  },
  {
    "path": "weixin-rpc-order/src/main/java/com/cheng/weixin/rpc/order/enumType/OrderStatus.java",
    "content": "package com.cheng.weixin.rpc.order.enumType;\n\n/**\n * Desc:\n * Author: 光灿\n * Date: 2016/11/16\n */\npublic enum OrderStatus {\n    INVALID(\"无效的订单\"), // 前端用的\n\n\n    WAIT_PAY(\"等待付款\"), // 倒计时15分钟内付款 进入下一个流程，否则进入付款超时（已失效）\n    ONGOING(\"进行中\"),\n    COMMENT(\"等待评论\"), // 用户确认收货后\n    FINISHED(\"完成\"),\n\n    PAY_OUT_TIME(\"付款超时\"),\n    WAIT_REFUND(\"等待退款\"),\n    REFUNDED(\"已退款\"),\n    CANCELED(\"已取消\"),\n    UNFINISHED(\"未完成\");\n\n\n    private String name;\n    OrderStatus(String name) {\n        this.name = name;\n    }\n\n    public String getName() {\n        return name;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-order/src/main/java/com/cheng/weixin/rpc/order/enumType/OrderType.java",
    "content": "package com.cheng.weixin.rpc.order.enumType;\n\n/**\n * Desc: 订单类型 正常-退货-返回换货\n * Author: cheng\n * Date: 2016/6/6\n */\npublic enum OrderType {\n    NORMAL(\"正常\"),\n    RETURN(\"退货\"),\n    RETURN_EXCHANGE(\"返回换货\");\n\n    private String name;\n\n    OrderType(String name) {\n        this.name = name;\n    }\n\n    public String getName() {\n        return name;\n    }\n}"
  },
  {
    "path": "weixin-rpc-order/src/main/java/com/cheng/weixin/rpc/order/enumType/PayStatus.java",
    "content": "package com.cheng.weixin.rpc.order.enumType;\n\n/**\n * Desc: 到付 未付款 已付款\n * Author: cheng\n * Date: 2016/6/6\n */\n@Deprecated\npublic enum PayStatus {\n    FREIGHT_COLLECT(\"到付\"),\n    NONPAYMENT(\"未付款\"),\n    PAID(\"已付款\");\n\n    private String name;\n\n    PayStatus(String name) {\n        this.name = name;\n    }\n\n    public String getName() {\n        return name;\n    }\n}"
  },
  {
    "path": "weixin-rpc-order/src/main/java/com/cheng/weixin/rpc/order/enumType/PayWay.java",
    "content": "package com.cheng.weixin.rpc.order.enumType;\n\n/**\n * Desc: 支付类型：在线，到付\n * Author: hp\n * Date: 2016/9/12\n */\npublic enum PayWay {\n    ONLINE(\"在线\"),\n    OFFLINE(\"线下\");\n\n    private String name;\n\n    PayWay(String name) {\n        this.name = name;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-order/src/main/java/com/cheng/weixin/rpc/order/service/RpcOrderService.java",
    "content": "package com.cheng.weixin.rpc.order.service;\n\nimport com.cheng.weixin.rpc.order.entity.*;\nimport com.cheng.weixin.rpc.order.enumType.PayWay;\nimport com.github.pagehelper.PageInfo;\n\nimport java.lang.reflect.InvocationTargetException;\nimport java.util.List;\n\n/**\n * Desc:\n * Author: 光灿\n * Date: 2016/9/14\n */\npublic interface RpcOrderService {\n    /**\n     * 获取配送时间\n     * @return\n     */\n    List<DeliveryTime> getAllDeliveryTimes();\n\n    /**\n     * 根据ID获取配送的时间\n     * @param id\n     * @return\n     */\n    DeliveryTime getDeliveryTime(String id);\n    /**\n     * 获取所有的支付\n     * @return\n     */\n    List<Pay> getAllPay();\n    /**\n     * 获取支付\n     * @return\n     */\n    Pay getPay(String id);\n\n    /**\n     * 获取推荐的支付\n     * @return\n     */\n    Pay getRecommendPay();\n\n    /**\n     * 获取所有的订单\n     * @param userId\n     * @return\n     */\n    PageInfo<OrderInfo> getOrderInfos(String userId, int pageNum, int pageSize) throws InvocationTargetException, IllegalAccessException;\n\n    /**\n     * 获取订单详情\n     * @param userId\n     * @return\n     */\n    OrderInfo getOrderDetail(String userId);\n\n    /**\n     * 保存订单\n     * @param orderInfo\n     */\n    OrderInfo addOrder(OrderInfo orderInfo);\n\n    /**\n     * 获取全部镇自提地址 // 根据GPS获取自提地点->根据自提地点搜索地点的ID\n     * @return\n     */\n    List<ArayacakAddress> getArayacakAddr(String countyId, String townId);\n\n    /**\n     * 根据ID获取镇\n     * @param townId\n     * @return\n     */\n    Town getTownById(String townId);\n\n    /**\n     * 根据ID获取自提地点\n     * @param id\n     * @return\n     */\n    ArayacakAddress getArayacakAddressById(String id);\n\n    /**\n     * 根据支付方式获取不同的订单流程\n     * @param payWay\n     * @return\n     */\n    List<FlowStatus> getFlowStatusesByPayWay(PayWay payWay);\n\n    /**\n     * 根据ID获取订单流程名字\n     * @param id\n     * @return\n     */\n    FlowStatus getFlowStatusesById(String id);\n\n    /**\n     * 保存商品详情\n     * @param detail\n     * @return\n     */\n    OrderProductDetail addOrderDetail(OrderProductDetail detail);\n}\n"
  },
  {
    "path": "weixin-rpc-promotion/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-rpc-promotion</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>com.cheng</groupId>\n      <artifactId>weixin-common-entity</artifactId>\n    </dependency>\n  </dependencies>\n\n</project>"
  },
  {
    "path": "weixin-rpc-promotion/src/main/java/com/cheng/weixin/rpc/promotion/entity/Coupon.java",
    "content": "package com.cheng.weixin.rpc.promotion.entity;\n\nimport com.cheng.common.entity.DataEntity;\nimport com.cheng.weixin.rpc.promotion.enums.CouponType;\n\nimport java.math.BigDecimal;\nimport java.util.Date;\n\n/**\n * Desc: 优惠券\n * Author: cheng\n * Date: 2016/6/17\n */\npublic class Coupon extends DataEntity<Coupon> {\n    private String name;\n    private CouponType type;\n    private BigDecimal faceValue;\n    private int delayDay;\n    private boolean isFree;\n    private boolean isReuse;\n    private BigDecimal enoughMoney;\n    private BigDecimal discount;\n    private String includeGroup;\n    private String excludeGroup;\n    private Date beginTime;\n    private Date endTime;\n\n    public Coupon() {\n    }\n\n    public Coupon(String id) {\n        super.id = id;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public CouponType getType() {\n        return type;\n    }\n\n    public void setType(CouponType type) {\n        this.type = type;\n    }\n\n    public BigDecimal getFaceValue() {\n        return faceValue;\n    }\n\n    public void setFaceValue(BigDecimal faceValue) {\n        this.faceValue = faceValue;\n    }\n\n    public int getDelayDay() {\n        return delayDay;\n    }\n\n    public void setDelayDay(int delayDay) {\n        this.delayDay = delayDay;\n    }\n\n    public boolean isFree() {\n        return isFree;\n    }\n\n    public void setFree(boolean free) {\n        isFree = free;\n    }\n\n    public boolean isReuse() {\n        return isReuse;\n    }\n\n    public void setReuse(boolean reuse) {\n        isReuse = reuse;\n    }\n\n    public BigDecimal getEnoughMoney() {\n        return enoughMoney;\n    }\n\n    public void setEnoughMoney(BigDecimal enoughMoney) {\n        this.enoughMoney = enoughMoney;\n    }\n\n    public BigDecimal getDiscount() {\n        return discount;\n    }\n\n    public void setDiscount(BigDecimal discount) {\n        this.discount = discount;\n    }\n\n    public String getIncludeGroup() {\n        return includeGroup;\n    }\n\n    public void setIncludeGroup(String includeGroup) {\n        this.includeGroup = includeGroup;\n    }\n\n    public String getExcludeGroup() {\n        return excludeGroup;\n    }\n\n    public void setExcludeGroup(String excludeGroup) {\n        this.excludeGroup = excludeGroup;\n    }\n\n    public Date getBeginTime() {\n        return beginTime;\n    }\n\n    public void setBeginTime(Date beginTime) {\n        this.beginTime = beginTime;\n    }\n\n    public Date getEndTime() {\n        return endTime;\n    }\n\n    public void setEndTime(Date endTime) {\n        this.endTime = endTime;\n    }\n\n}\n\n"
  },
  {
    "path": "weixin-rpc-promotion/src/main/java/com/cheng/weixin/rpc/promotion/entity/CouponCode.java",
    "content": "package com.cheng.weixin.rpc.promotion.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 券明细---这个才是到用户手中的\n * Author: cheng\n * Date: 2016/6/17\n */\npublic class CouponCode extends DataEntity<CouponCode> {\n    private String couponId;\n    private String code;\n    private String accountId;\n    private boolean isUsed;\n\n    private Coupon coupon;\n\n    public CouponCode() {\n    }\n\n    public CouponCode(String id, String accountId) {\n        super.id = id;\n        this.accountId = accountId;\n    }\n\n    public String getCouponId() {\n        return couponId;\n    }\n\n    public void setCouponId(String couponId) {\n        this.couponId = couponId;\n    }\n\n    public String getCode() {\n        return code;\n    }\n\n    public void setCode(String code) {\n        this.code = code;\n    }\n\n    public String getAccountId() {\n        return accountId;\n    }\n\n    public void setAccountId(String accountId) {\n        this.accountId = accountId;\n    }\n\n    public boolean isUsed() {\n        return isUsed;\n    }\n\n    public void setUsed(boolean used) {\n        isUsed = used;\n    }\n\n    public Coupon getCoupon() {\n        return coupon;\n    }\n\n    public void setCoupon(Coupon coupon) {\n        this.coupon = coupon;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-promotion/src/main/java/com/cheng/weixin/rpc/promotion/entity/CouponHistory.java",
    "content": "package com.cheng.weixin.rpc.promotion.entity;\n\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 券记录\n * 含发券和用券两种记录\n   行为或结果：存储发券时候的渠道和用券时候的单号\n * Date: 2016/6/17\n */\npublic class CouponHistory extends DataEntity<CouponHistory> {\n    private String code;\n    private String txBehavior;\n    private String accountId;\n    private String isSendUsed;\n\n    public String getCode() {\n        return code;\n    }\n\n    public void setCode(String code) {\n        this.code = code;\n    }\n\n    public String getTxBehavior() {\n        return txBehavior;\n    }\n\n    public void setTxBehavior(String txBehavior) {\n        this.txBehavior = txBehavior;\n    }\n\n    public String getAccountId() {\n        return accountId;\n    }\n\n    public void setAccountId(String accountId) {\n        this.accountId = accountId;\n    }\n\n    public String getIsSendUsed() {\n        return isSendUsed;\n    }\n\n    public void setIsSendUsed(String isSendUsed) {\n        this.isSendUsed = isSendUsed;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-promotion/src/main/java/com/cheng/weixin/rpc/promotion/enums/CouponType.java",
    "content": "package com.cheng.weixin.rpc.promotion.enums;\n\n/**\n * Desc: 券类型\n * 红包、现金券、免运费券、折扣券\n * Author: cheng\n * Date: 2016/6/17\n */\npublic enum CouponType {\n\n\n    LUCKYMONEY(\"红包券\"),      // 只有红包券才是满减券-- 红包券不需要指定商品ID || 现在只完成了一个\n    FREE_SHIPPING(\"免运费券\"),\n    CASH(\"现金券\"),\n    DISCOUNT(\"折扣券\");\n    private String name;\n    CouponType(String name) {\n        this.name = name;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-promotion/src/main/java/com/cheng/weixin/rpc/promotion/service/RpcCouponService.java",
    "content": "package com.cheng.weixin.rpc.promotion.service;\n\nimport com.cheng.weixin.rpc.promotion.entity.CouponCode;\n\nimport java.util.List;\n\n/**\n * Desc:\n * Author: hp\n * Date: 2016/11/7\n */\npublic interface RpcCouponService {\n    /**\n     * 获取用户的优惠券\n     * @param userId\n     * @return\n     */\n    List<CouponCode> getCouponCodeByUser(String userId);\n\n    /**\n     * 获取优惠券信息\n     * @param id\n     * @return\n     */\n    CouponCode getCouponById(String id);\n\n    /**\n     * 更新优惠券信息\n     * @param id\n     */\n    void updateCouponUsedById(String id);\n}\n"
  },
  {
    "path": "weixin-rpc-rabbitmq/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-rpc-rabbitmq</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-rabbitmq-model</artifactId>\n    </dependency>\n  </dependencies>\n\n\n</project>"
  },
  {
    "path": "weixin-rpc-rabbitmq/src/main/java/com/cheng/weixin/rpc/rabbitmq/service/RpcRabbitLogService.java",
    "content": "package com.cheng.weixin.rpc.rabbitmq.service;\n\n/**\n * Desc: Rabbit接口\n * Author: Cheng\n * Date: 2016/4/25 0025\n */\npublic interface RpcRabbitLogService {\n    String LOG = \"WEIXIN-LOG\";\n    /**\n     * 保存日志\n     *\n     * @param obj\n     */\n    void saveLogs(Object obj);\n}\n"
  },
  {
    "path": "weixin-rpc-rabbitmq/src/main/java/com/cheng/weixin/rpc/rabbitmq/service/RpcRabbitSmsService.java",
    "content": "package com.cheng.weixin.rpc.rabbitmq.service;\n\n/**\n * Desc: Rabbit接口\n * Author: Cheng\n * Date: 2016/4/25 0025\n */\npublic interface RpcRabbitSmsService {\n\n    String VALIDATE = \"SMS-VALIDATE\";\n    String NOTICE = \"SMS-NOTICE\";\n    String ACTIVITY = \"SMS-ACTIVITY\";\n\n    /**\n     * 发送注册短消息\n     * @param msgData\n     */\n    void sendValidate(Object msgData);\n\n    /**\n     * 现金通知\n     * @param msgData\n     */\n    void sendCashNotify(Object msgData);\n}\n"
  },
  {
    "path": "weixin-rpc-redis/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-rpc-redis</artifactId>\n\n\n</project>"
  },
  {
    "path": "weixin-rpc-redis/src/main/java/com/cheng/weixin/rpc/redis/service/RpcRedisService.java",
    "content": "package com.cheng.weixin.rpc.redis.service;\n\nimport java.io.Serializable;\nimport java.util.Map;\nimport java.util.Set;\n\n/**\n * Desc: redis接口服务\n * Author: Cheng\n * Date: 2016/4/21 0021\n */\npublic interface RpcRedisService {\n\n    /**\n     * 批量删除对应的value\n     *\n     * @param keys\n     */\n    void remove(final String... keys);\n\n    /**\n     * 批量删除key\n     *\n     * @param pattern\n     */\n    void removePattern(final String pattern);\n\n    /**\n     * 删除对应的value\n     *\n     * @param key\n     */\n    void remove(final String key);\n\n    /**\n     * 判断缓存中是否有对应的value\n     *\n     * @param key\n     * @return\n     */\n    boolean exists(final String key);\n\n    /**\n     * 读取缓存\n     *\n     * @param key\n     * @return\n     */\n    Object get(final String key);\n\n    /**\n     * 写入缓存\n     *\n     * @param key\n     * @param value\n     * @return\n     */\n    boolean set(final String key, Object value);\n\n    /**\n     * 写入缓存 并设置过期时间\n     * @param key\n     * @param value\n     * @param expireTime\n     * @return\n     */\n    boolean set(final String key, Object value, Long expireTime);\n    /**\n     * 根据Key刷新超时时间\n     * @param key\n     * @param expireTime\n     * @return\n     */\n    boolean flushExpireTime(final String key, Long expireTime);\n\n    // ================================Hash 操作=================================\n    /**\n     * 数量递增\n     * @param key\n     * @param field\n     */\n    Long increase(String key, String field);\n    /**\n     * 数量递减\n     * @param key\n     * @param field\n     */\n    Long decrease(String key, String field);\n\n    /**\n     * 删除一个Field\n     * @param key\n     * @param field\n     */\n    void deleteField(String key, String field);\n\n    /**\n     * 批量删除\n     * @param key\n     * @param field\n     */\n    void batchDeleteField(String key, String... field);\n\n    /**\n     * 根据key获取所有的Field\n     * @param key\n     * @return\n     */\n    Set getFields(String key);\n\n    /**\n     * 查看该字段是否已有\n     * @param key\n     * @param field\n     * @return\n     */\n    boolean exists(String key, String field);\n\n    /**\n     * 获取值根据key和Field\n     * @param key\n     * @param field\n     * @return value\n     */\n    Object getValueByKeyANdField(String key, String field);\n\n    /**\n     * 获取Field和Value\n     * @param key\n     * @return\n     */\n    Map<Serializable, Object>  getEntries(String key);\n\n    /**\n     * 加入\n     * @param key\n     * @param field\n     * @param value\n     */\n    void put(String key, String field, Long value);\n\n}\n"
  },
  {
    "path": "weixin-rpc-system/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-rpc-system</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-entity</artifactId>\n    </dependency>\n  </dependencies>\n</project>"
  },
  {
    "path": "weixin-rpc-system/src/main/java/com/cheng/weixin/rpc/system/entity/Ad.java",
    "content": "package com.cheng.weixin.rpc.system.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 广告资源\n * Author: 光灿\n * Date: 2016/6/18\n */\npublic class Ad extends DataEntity<Ad> {\n    private String name;\n    private String pictureUrl;\n    private String linkUrl;\n    private int width;\n    private int height;\n    private int priority;\n    private boolean isEnable;\n\n    public String getName() {\n        return name;\n    }\n\n    public Ad setName(String name) {\n        this.name = name;\n        return this;\n    }\n\n    public String getPictureUrl() {\n        return pictureUrl;\n    }\n\n    public Ad setPictureUrl(String pictureUrl) {\n        this.pictureUrl = pictureUrl;\n        return this;\n    }\n\n    public String getLinkUrl() {\n        return linkUrl;\n    }\n\n    public Ad setLinkUrl(String linkUrl) {\n        this.linkUrl = linkUrl;\n        return this;\n    }\n\n    public int getWidth() {\n        return width;\n    }\n\n    public Ad setWidth(int width) {\n        this.width = width;\n        return this;\n    }\n\n    public int getHeight() {\n        return height;\n    }\n\n    public Ad setHeight(int height) {\n        this.height = height;\n        return this;\n    }\n\n    public int getPriority() {\n        return priority;\n    }\n\n    public Ad setPriority(int priority) {\n        this.priority = priority;\n        return this;\n    }\n\n    public boolean isEnable() {\n        return isEnable;\n    }\n\n    public Ad setEnable(boolean enable) {\n        isEnable = enable;\n        return this;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-system/src/main/java/com/cheng/weixin/rpc/system/entity/AdJoinPosition.java",
    "content": "package com.cheng.weixin.rpc.system.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 广告与位置关联\n * Author: 光灿\n * Date: 2016/6/18\n */\npublic class AdJoinPosition extends DataEntity<AdJoinPosition> {\n    private String adId;\n    private String adPositionId;\n\n    public String getAdId() {\n        return adId;\n    }\n\n    public AdJoinPosition setAdId(String adId) {\n        this.adId = adId;\n        return this;\n    }\n\n    public String getAdPositionId() {\n        return adPositionId;\n    }\n\n    public AdJoinPosition setAdPositionId(String adPositionId) {\n        this.adPositionId = adPositionId;\n        return this;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-system/src/main/java/com/cheng/weixin/rpc/system/entity/AdPosition.java",
    "content": "package com.cheng.weixin.rpc.system.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 广告位置\n * Author: 光灿\n * Date: 2016/6/18\n */\npublic class AdPosition extends DataEntity<AdPosition> {\n    private String name;\n    private String type;\n\n    public String getName() {\n        return name;\n    }\n\n    public AdPosition setName(String name) {\n        this.name = name;\n        return this;\n    }\n\n    public String getType() {\n        return type;\n    }\n\n    public AdPosition setType(String type) {\n        this.type = type;\n        return this;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-system/src/main/java/com/cheng/weixin/rpc/system/entity/Notice.java",
    "content": "package com.cheng.weixin.rpc.system.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 通知\n * Author: 光灿\n * Date: 2016/6/18\n */\npublic class Notice extends DataEntity<Notice> {\n    private String title;\n    private String content;\n    private String linkUrl;\n    //private String noticeTypeId;\n\n    public String getTitle() {\n        return title;\n    }\n\n    public Notice setTitle(String title) {\n        this.title = title;\n        return this;\n    }\n\n    public String getContent() {\n        return content;\n    }\n\n    public Notice setContent(String content) {\n        this.content = content;\n        return this;\n    }\n\n    public String getLinkUrl() {\n        return linkUrl;\n    }\n\n    public void setLinkUrl(String linkUrl) {\n        this.linkUrl = linkUrl;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-system/src/main/java/com/cheng/weixin/rpc/system/entity/NoticeType.java",
    "content": "package com.cheng.weixin.rpc.system.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc:公告资源类型\n * Author: 光灿\n * Date: 2016/6/18\n */\n@Deprecated\npublic class NoticeType extends DataEntity<NoticeType> {\n    private String name;\n    private String type;\n}\n"
  },
  {
    "path": "weixin-rpc-system/src/main/java/com/cheng/weixin/rpc/system/entity/PictureResource.java",
    "content": "package com.cheng.weixin.rpc.system.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 图片资源\n * Author: 光灿\n * Date:2016/6/17\n */\n@Deprecated\npublic class PictureResource extends DataEntity<PictureResource> {\n    private String pictureResourceType;\n    private String name;\n    private String picture_url;\n    private String href;\n    private String description;\n\n    public String getPictureResourceType() {\n        return pictureResourceType;\n    }\n\n    public PictureResource setPictureResourceType(String pictureResourceType) {\n        this.pictureResourceType = pictureResourceType;\n        return this;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public PictureResource setName(String name) {\n        this.name = name;\n        return this;\n    }\n\n    public String getPicture_url() {\n        return picture_url;\n    }\n\n    public PictureResource setPicture_url(String picture_url) {\n        this.picture_url = picture_url;\n        return this;\n    }\n\n    public String getHref() {\n        return href;\n    }\n\n    public PictureResource setHref(String href) {\n        this.href = href;\n        return this;\n    }\n\n    public String getDescription() {\n        return description;\n    }\n\n    public PictureResource setDescription(String description) {\n        this.description = description;\n        return this;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-system/src/main/java/com/cheng/weixin/rpc/system/entity/PictureResourceType.java",
    "content": "package com.cheng.weixin.rpc.system.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 图片资源类型：现在就首页的图片\n * Author: 光灿\n * Date: 2016/6/17\n */\n@Deprecated\npublic class PictureResourceType extends DataEntity<PictureResourceType> {\n    private String name;\n\n    public String getName() {\n        return name;\n    }\n\n    public PictureResourceType setName(String name) {\n        this.name = name;\n        return this;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-system/src/main/java/com/cheng/weixin/rpc/system/entity/SystemParam.java",
    "content": "package com.cheng.weixin.rpc.system.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc:系统参数\n * Author: 光灿\n * Date: 2016/6/17\n */\npublic class SystemParam extends DataEntity<SystemParam> {\n    private String name;\n    private String title;\n    private String logo;\n    private String description;\n    private String copyright;\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getTitle() {\n        return title;\n    }\n\n    public void setTitle(String title) {\n        this.title = title;\n    }\n\n    public String getLogo() {\n        return logo;\n    }\n\n    public void setLogo(String logo) {\n        this.logo = logo;\n    }\n\n    public String getDescription() {\n        return description;\n    }\n\n    public void setDescription(String description) {\n        this.description = description;\n    }\n\n    public String getCopyright() {\n        return copyright;\n    }\n\n    public void setCopyright(String copyright) {\n        this.copyright = copyright;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-system/src/main/java/com/cheng/weixin/rpc/system/service/RpcSystemService.java",
    "content": "package com.cheng.weixin.rpc.system.service;\n\nimport com.cheng.weixin.rpc.system.entity.Ad;\nimport com.cheng.weixin.rpc.system.entity.Notice;\n\nimport java.util.List;\n\n/**\n * Desc: 广告\n * Author: cheng\n * Date: 2016/6/29\n */\npublic interface RpcSystemService {\n    /**\n     * 获取首页的图片\n     * @return\n     */\n    List<Ad> getIndexAds();\n\n    /**\n     * 获取首页的公告\n     * @return\n     */\n    List<Notice> getIndexNotices();\n\n}\n"
  },
  {
    "path": "weixin-rpc-user/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-rpc-user</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>com.cheng</groupId>\n      <artifactId>weixin-common-entity</artifactId>\n    </dependency>\n  </dependencies>\n\n</project>"
  },
  {
    "path": "weixin-rpc-user/src/main/java/com/cheng/weixin/rpc/user/entity/Account.java",
    "content": "package com.cheng.weixin.rpc.user.entity;\n\nimport com.cheng.common.entity.DataEntity;\nimport com.cheng.weixin.rpc.user.enumType.Credit;\nimport com.cheng.weixin.rpc.user.enumType.SourceFrom;\n\nimport java.math.BigDecimal;\n\n/**\n * Desc: 账户表\n * Author: cheng\n * Date: 2016/6/3\n */\npublic class Account extends DataEntity<Account> {\n    private String avatar;\n    private String nickname;\n    private String accountLevelId;\n    private Credit credit;\n    private String username;\n    private String password;\n    private int bonusPointUsable;\n    private int bonusPointUpgrade;\n    private BigDecimal balance;\n    private boolean isEmployee;\n    private String ip;\n    private SourceFrom sourceFrom;\n\n    public Account() {\n    }\n\n    public Account(String id, String username) {\n        this.id = id;\n        this.username = username;\n    }\n\n    public Account(BigDecimal balance) {\n        this.balance = balance;\n    }\n\n    public String getAvatar() {\n        return avatar;\n    }\n\n    public void setAvatar(String avatar) {\n        this.avatar = avatar;\n    }\n\n    public String getNickname() {\n        return nickname;\n    }\n\n    public void setNickname(String nickname) {\n        this.nickname = nickname;\n    }\n\n    public String getUsername() {\n        return username;\n    }\n\n    public void setUsername(String username) {\n        this.username = username;\n    }\n\n    public String getPassword() {\n        return password;\n    }\n\n    public void setPassword(String password) {\n        this.password = password;\n    }\n\n    public String getAccountLevelId() {\n        return accountLevelId;\n    }\n\n    public void setAccountLevelId(String accountLevelId) {\n        this.accountLevelId = accountLevelId;\n    }\n\n    public Credit getCredit() {\n        return credit;\n    }\n\n    public void setCredit(Credit credit) {\n        this.credit = credit;\n    }\n\n    public int getBonusPointUsable() {\n        return bonusPointUsable;\n    }\n\n    public void setBonusPointUsable(int bonusPointUsable) {\n        this.bonusPointUsable = bonusPointUsable;\n    }\n\n    public int getBonusPointUpgrade() {\n        return bonusPointUpgrade;\n    }\n\n    public void setBonusPointUpgrade(int bonusPointUpgrade) {\n        this.bonusPointUpgrade = bonusPointUpgrade;\n    }\n\n    public BigDecimal getBalance() {\n        return balance;\n    }\n\n    public void setBalance(BigDecimal balance) {\n        this.balance = balance;\n    }\n\n    public boolean isEmployee() {\n        return isEmployee;\n    }\n\n    public void setEmployee(boolean employee) {\n        isEmployee = employee;\n    }\n\n    public String getIp() {\n        return ip;\n    }\n\n    public void setIp(String ip) {\n        this.ip = ip;\n    }\n\n    public SourceFrom getSourceFrom() {\n        return sourceFrom;\n    }\n\n    public void setSourceFrom(SourceFrom sourceFrom) {\n        this.sourceFrom = sourceFrom;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-user/src/main/java/com/cheng/weixin/rpc/user/entity/AccountLevel.java",
    "content": "package com.cheng.weixin.rpc.user.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 记录积分等级的规则\n *       积分等级与QQ上的星星月亮太阳升级规则一样，四个红蜜蜂可升级成一个黄蜜蜂，四个黄蜜蜂可升级成一个蓝蜜蜂\n * Author: cheng\n * Date: 2016/6/3\n */\npublic class AccountLevel extends DataEntity<AccountLevel> {\n    private int accountId;\n    private int level;\n    private String name;\n    private int needRonusPoint;\n    private int nextLevelNeedPoint;\n    @Deprecated\n    private double reductPercent;\n    private String consumeScale;\n    private int freeFrequency;\n    private Boolean isEnable;\n\n    public AccountLevel() {\n    }\n\n    public AccountLevel(boolean isEnable) {\n        this.isEnable = isEnable;\n    }\n\n    public int getLevel() {\n        return level;\n    }\n\n    public void setLevel(int level) {\n        this.level = level;\n    }\n\n    public int getAccountId() {\n        return accountId;\n    }\n\n    public void setAccountId(int accountId) {\n        this.accountId = accountId;\n    }\n\n    public int getNeedRonusPoint() {\n        return needRonusPoint;\n    }\n\n    public void setNeedRonusPoint(int needRonusPoint) {\n        this.needRonusPoint = needRonusPoint;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public int getNextLevelNeedPoint() {\n        return nextLevelNeedPoint;\n    }\n\n    public void setNextLevelNeedPoint(int nextLevelNeedPoint) {\n        this.nextLevelNeedPoint = nextLevelNeedPoint;\n    }\n\n    public int getFreeFrequency() {\n        return freeFrequency;\n    }\n\n    public void setFreeFrequency(int freeFrequency) {\n        this.freeFrequency = freeFrequency;\n    }\n\n    public Boolean getEnable() {\n        return isEnable;\n    }\n\n    public void setEnable(Boolean enable) {\n        isEnable = enable;\n    }\n\n    public String getConsumeScale() {\n        return consumeScale;\n    }\n\n    public void setConsumeScale(String consumeScale) {\n        this.consumeScale = consumeScale;\n    }\n\n    public double getReductPercent() {\n        return reductPercent;\n    }\n\n    public void setReductPercent(double reductPercent) {\n        this.reductPercent = reductPercent;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-user/src/main/java/com/cheng/weixin/rpc/user/entity/AccountUpgradeHistory.java",
    "content": "package com.cheng.weixin.rpc.user.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 账户升级历史\n * Author: cheng\n * Date: 2016/6/3\n */\npublic class AccountUpgradeHistory extends DataEntity<AccountUpgradeHistory> {\n    private int accountId;\n    private int previousLevels;\n    private int currentLevels;\n    private int previousBonusPoint;\n    private int currentBonusPoint;\n\n    public int getAccountId() {\n        return accountId;\n    }\n\n    public void setAccountId(int accountId) {\n        this.accountId = accountId;\n    }\n\n    public int getPreviousLevels() {\n        return previousLevels;\n    }\n\n    public void setPreviousLevels(int previousLevels) {\n        this.previousLevels = previousLevels;\n    }\n\n    public int getCurrentLevels() {\n        return currentLevels;\n    }\n\n    public void setCurrentLevels(int currentLevels) {\n        this.currentLevels = currentLevels;\n    }\n\n    public int getPreviousBonusPoint() {\n        return previousBonusPoint;\n    }\n\n    public void setPreviousBonusPoint(int previousBonusPoint) {\n        this.previousBonusPoint = previousBonusPoint;\n    }\n\n    public int getCurrentBonusPoint() {\n        return currentBonusPoint;\n    }\n\n    public void setCurrentBonusPoint(int currentBonusPoint) {\n        this.currentBonusPoint = currentBonusPoint;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-user/src/main/java/com/cheng/weixin/rpc/user/entity/Behavior.java",
    "content": "package com.cheng.weixin.rpc.user.entity;\n\nimport com.cheng.common.entity.DataEntity;\nimport com.cheng.weixin.rpc.user.enumType.BehaviorType;\n\n/**\n * Desc: 该表主要为：积分记录、现金账户记录、券记录中的收入和支出服务。\n *      比如：原因录入：下订单    其附属信息为该动作产生的结果为：单号 200898983094\n * Author: cheng\n * Date: 2016/6/3\n */\n@Deprecated\npublic class Behavior extends DataEntity<Behavior> {\n    private BehaviorType behaviorType;\n    private String name;\n    private String oid;\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getOid() {\n        return oid;\n    }\n\n    public void setOid(String oid) {\n        this.oid = oid;\n    }\n\n    public BehaviorType getBehaviorType() {\n        return behaviorType;\n    }\n\n    public void setBehaviorType(BehaviorType behaviorType) {\n        this.behaviorType = behaviorType;\n    }\n\n}\n"
  },
  {
    "path": "weixin-rpc-user/src/main/java/com/cheng/weixin/rpc/user/entity/BonusPointRecord.java",
    "content": "package com.cheng.weixin.rpc.user.entity;\n\nimport com.cheng.common.entity.DataEntity;\nimport com.cheng.weixin.rpc.user.enumType.TXType;\n\n/**\n * Desc: 积分记录  记录积分的收支情况\n * Author: cheng\n * Date: 2016/6/3\n */\npublic class BonusPointRecord extends DataEntity<BonusPointRecord> {\n    private String accountId;\n    private int beforeBonusPoints;\n    private int txBonusPoints;\n    private int frozenBonusPoints;\n    private int afterBonusPoints;\n    private TXType txType;\n    private String behaviorId;\n    private String txResult;\n\n    public BonusPointRecord() {\n    }\n\n    public BonusPointRecord(String accountId) {\n        this.accountId = accountId;\n    }\n\n    public String getAccountId() {\n        return accountId;\n    }\n\n    public void setAccountId(String accountId) {\n        this.accountId = accountId;\n    }\n\n    public int getBeforeBonusPoints() {\n        return beforeBonusPoints;\n    }\n\n    public void setBeforeBonusPoints(int beforeBonusPoints) {\n        this.beforeBonusPoints = beforeBonusPoints;\n    }\n\n    public int getTxBonusPoints() {\n        return txBonusPoints;\n    }\n\n    public void setTxBonusPoints(int txBonusPoints) {\n        this.txBonusPoints = txBonusPoints;\n    }\n\n    public int getFrozenBonusPoints() {\n        return frozenBonusPoints;\n    }\n\n    public void setFrozenBonusPoints(int frozenBonusPoints) {\n        this.frozenBonusPoints = frozenBonusPoints;\n    }\n\n    public int getAfterBonusPoints() {\n        return afterBonusPoints;\n    }\n\n    public void setAfterBonusPoints(int afterBonusPoints) {\n        this.afterBonusPoints = afterBonusPoints;\n    }\n\n    public TXType getTxType() {\n        return txType;\n    }\n\n    public void setTxType(TXType txType) {\n        this.txType = txType;\n    }\n\n    public String getBehaviorId() {\n        return behaviorId;\n    }\n\n    public void setBehaviorId(String behaviorId) {\n        this.behaviorId = behaviorId;\n    }\n\n    public String getTxResult() {\n        return txResult;\n    }\n\n    public void setTxResult(String txResult) {\n        this.txResult = txResult;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-user/src/main/java/com/cheng/weixin/rpc/user/entity/CashRecord.java",
    "content": "package com.cheng.weixin.rpc.user.entity;\n\nimport com.cheng.common.entity.DataEntity;\nimport com.cheng.weixin.rpc.user.enumType.TXType;\n\nimport java.math.BigDecimal;\n\n/**\n * Desc: 记录现金账户的收支情况\n * Author: cheng\n * Date: 2016/6/3\n */\npublic class CashRecord extends DataEntity<CashRecord> {\n    private String accountId;\n    private BigDecimal beforeMoney;\n    private BigDecimal txMoney;\n    private BigDecimal frozenMoney;\n    private BigDecimal afterBonusPoints;\n    private TXType txType;\n    private String behaviorId;\n    private String txResult;\n\n    public CashRecord() {\n    }\n\n    public CashRecord(String accountId) {\n        this.accountId = accountId;\n    }\n\n    public String getAccountId() {\n        return accountId;\n    }\n\n    public void setAccountId(String accountId) {\n        this.accountId = accountId;\n    }\n\n    public BigDecimal getBeforeMoney() {\n        return beforeMoney;\n    }\n\n    public void setBeforeMoney(BigDecimal beforeMoney) {\n        this.beforeMoney = beforeMoney;\n    }\n\n    public BigDecimal getTxMoney() {\n        return txMoney;\n    }\n\n    public void setTxMoney(BigDecimal txMoney) {\n        this.txMoney = txMoney;\n    }\n\n    public BigDecimal getFrozenMoney() {\n        return frozenMoney;\n    }\n\n    public void setFrozenMoney(BigDecimal frozenMoney) {\n        this.frozenMoney = frozenMoney;\n    }\n\n    public BigDecimal getAfterBonusPoints() {\n        return afterBonusPoints;\n    }\n\n    public void setAfterBonusPoints(BigDecimal afterBonusPoints) {\n        this.afterBonusPoints = afterBonusPoints;\n    }\n\n    public TXType getTxType() {\n        return txType;\n    }\n\n    public void setTxType(TXType txType) {\n        this.txType = txType;\n    }\n\n    public String getBehaviorId() {\n        return behaviorId;\n    }\n\n    public void setBehaviorId(String behaviorId) {\n        this.behaviorId = behaviorId;\n    }\n\n    public String getTxResult() {\n        return txResult;\n    }\n\n    public void setTxResult(String txResult) {\n        this.txResult = txResult;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-user/src/main/java/com/cheng/weixin/rpc/user/entity/City.java",
    "content": "package com.cheng.weixin.rpc.user.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 城市\n * Author: cheng\n * Date: 2016/6/3\n */\npublic class City extends DataEntity<City> {\n    private String name;\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-user/src/main/java/com/cheng/weixin/rpc/user/entity/Country.java",
    "content": "package com.cheng.weixin.rpc.user.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 区县\n * Author: cheng\n * Date: 2016/6/3\n */\npublic class Country extends DataEntity<Country> {\n    private String name;\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-user/src/main/java/com/cheng/weixin/rpc/user/entity/CouponRecord.java",
    "content": "package com.cheng.weixin.rpc.user.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 记录券的收支情况\n * Author: cheng\n * Date: 2016/6/3\n */\npublic class CouponRecord extends DataEntity<CouponRecord> {\n    private String accountId;\n    private String couponCodeId;\n    private String txType;\n    private String behaviorId;\n    private String txResult;\n\n    public CouponRecord() {\n    }\n\n    public CouponRecord(String accountId) {\n        this.accountId = accountId;\n    }\n\n    public String getAccountId() {\n        return accountId;\n    }\n\n    public void setAccountId(String accountId) {\n        this.accountId = accountId;\n    }\n\n    public String getCouponCodeId() {\n        return couponCodeId;\n    }\n\n    public void setCouponCodeId(String couponCodeId) {\n        this.couponCodeId = couponCodeId;\n    }\n\n    public String getTxType() {\n        return txType;\n    }\n\n    public void setTxType(String txType) {\n        this.txType = txType;\n    }\n\n    public String getBehaviorId() {\n        return behaviorId;\n    }\n\n    public void setBehaviorId(String behaviorId) {\n        this.behaviorId = behaviorId;\n    }\n\n    public String getTxResult() {\n        return txResult;\n    }\n\n    public void setTxResult(String txResult) {\n        this.txResult = txResult;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-user/src/main/java/com/cheng/weixin/rpc/user/entity/DeliveryAddress.java",
    "content": "package com.cheng.weixin.rpc.user.entity;\n\nimport com.cheng.common.entity.DataEntity;\nimport com.cheng.common.entity.enums.Sex;\n\n/**\n * Desc: 配送地址\n * Author: cheng\n * Date: 2016/6/3\n */\npublic class DeliveryAddress extends DataEntity<DeliveryAddress> {\n    private String accountId;\n    private String regionProvinceId;\n    private String regionCityId;\n    private String regionCountryId;\n    private String villageId;\n    private String consignee;\n    private String address;\n    private String mobile;\n    private Sex sex;\n    private String tag;\n    private String telephone;\n    private String email;\n    private String postCode;\n    private Boolean isDefault;\n\n    public DeliveryAddress() {\n    }\n\n    public DeliveryAddress(String accountId, Boolean isDefault) {\n        this.accountId = accountId;\n        this.isDefault = isDefault;\n    }\n\n    public Sex getSex() {\n        return sex;\n    }\n\n    public void setSex(Sex sex) {\n        this.sex = sex;\n    }\n\n    public String getTag() {\n        return tag;\n    }\n\n    public void setTag(String tag) {\n        this.tag = tag;\n    }\n\n    public String getAccountId() {\n        return accountId;\n    }\n\n    public void setAccountId(String accountId) {\n        this.accountId = accountId;\n    }\n\n    public String getRegionProvinceId() {\n        return regionProvinceId;\n    }\n\n    public void setRegionProvinceId(String regionProvinceId) {\n        this.regionProvinceId = regionProvinceId;\n    }\n\n    public String getRegionCityId() {\n        return regionCityId;\n    }\n\n    public void setRegionCityId(String regionCityId) {\n        this.regionCityId = regionCityId;\n    }\n\n    public String getRegionCountryId() {\n        return regionCountryId;\n    }\n\n    public void setRegionCountryId(String regionCountryId) {\n        this.regionCountryId = regionCountryId;\n    }\n\n    public String getVillageId() {\n        return villageId;\n    }\n\n    public void setVillageId(String villageId) {\n        this.villageId = villageId;\n    }\n\n    public String getConsignee() {\n        return consignee;\n    }\n\n    public void setConsignee(String consignee) {\n        this.consignee = consignee;\n    }\n\n    public String getAddress() {\n        return address;\n    }\n\n    public void setAddress(String address) {\n        this.address = address;\n    }\n\n    public String getMobile() {\n        return mobile;\n    }\n\n    public void setMobile(String mobile) {\n        this.mobile = mobile;\n    }\n\n    public String getTelephone() {\n        return telephone;\n    }\n\n    public void setTelephone(String telephone) {\n        this.telephone = telephone;\n    }\n\n    public String getEmail() {\n        return email;\n    }\n\n    public void setEmail(String email) {\n        this.email = email;\n    }\n\n    public String getPostCode() {\n        return postCode;\n    }\n\n    public void setPostCode(String postCode) {\n        this.postCode = postCode;\n    }\n\n    public Boolean getDefault() {\n        return isDefault;\n    }\n\n    public void setDefault(Boolean aDefault) {\n        isDefault = aDefault;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-user/src/main/java/com/cheng/weixin/rpc/user/entity/Member.java",
    "content": "package com.cheng.weixin.rpc.user.entity;\n\nimport com.cheng.common.entity.DataEntity;\nimport com.cheng.weixin.rpc.user.enumType.Sex;\n\nimport java.util.Date;\n\n/**\n * Desc: 用户基础信息\n * Author: cheng\n * Date: 2016/6/3\n */\npublic class Member extends DataEntity<Member> {\n    private String accountId;\n    private String name;\n    private String employer;\n    private String mobile;\n    private String address;\n    private String email;\n    private String idcard;\n    private Sex sex;\n    private Date birthday;\n    private int regionProvinceId;\n    private int regionCityId;\n    private int regionCountryId;\n    private String telephone;\n    private String postCode;\n    private String incomeMonth;\n    private String job;\n    private String hobby;\n\n    public Member() {\n    }\n    public Member(String id) {\n        super.id = id;\n    }\n    public String getAccountId() {\n        return accountId;\n    }\n\n    public void setAccountId(String accountId) {\n        this.accountId = accountId;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getEmployer() {\n        return employer;\n    }\n\n    public void setEmployer(String employer) {\n        this.employer = employer;\n    }\n\n    public String getMobile() {\n        return mobile;\n    }\n\n    public void setMobile(String mobile) {\n        this.mobile = mobile;\n    }\n\n    public String getAddress() {\n        return address;\n    }\n\n    public void setAddress(String address) {\n        this.address = address;\n    }\n\n    public String getEmail() {\n        return email;\n    }\n\n    public void setEmail(String email) {\n        this.email = email;\n    }\n\n    public String getIdcard() {\n        return idcard;\n    }\n\n    public void setIdcard(String idcard) {\n        this.idcard = idcard;\n    }\n\n    public Sex getSex() {\n        return sex;\n    }\n\n    public void setSex(Sex sex) {\n        this.sex = sex;\n    }\n\n    public Date getBirthday() {\n        return birthday;\n    }\n\n    public void setBirthday(Date birthday) {\n        this.birthday = birthday;\n    }\n\n    public int getRegionProvinceId() {\n        return regionProvinceId;\n    }\n\n    public void setRegionProvinceId(int regionProvinceId) {\n        this.regionProvinceId = regionProvinceId;\n    }\n\n    public int getRegionCityId() {\n        return regionCityId;\n    }\n\n    public void setRegionCityId(int regionCityId) {\n        this.regionCityId = regionCityId;\n    }\n\n    public int getRegionCountryId() {\n        return regionCountryId;\n    }\n\n    public void setRegionCountryId(int regionCountryId) {\n        this.regionCountryId = regionCountryId;\n    }\n\n    public String getTelephone() {\n        return telephone;\n    }\n\n    public void setTelephone(String telephone) {\n        this.telephone = telephone;\n    }\n\n    public String getPostCode() {\n        return postCode;\n    }\n\n    public void setPostCode(String postCode) {\n        this.postCode = postCode;\n    }\n\n    public String getIncomeMonth() {\n        return incomeMonth;\n    }\n\n    public void setIncomeMonth(String incomeMonth) {\n        this.incomeMonth = incomeMonth;\n    }\n\n    public String getJob() {\n        return job;\n    }\n\n    public void setJob(String job) {\n        this.job = job;\n    }\n\n    public String getHobby() {\n        return hobby;\n    }\n\n    public void setHobby(String hobby) {\n        this.hobby = hobby;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-user/src/main/java/com/cheng/weixin/rpc/user/entity/ProductFocus.java",
    "content": "package com.cheng.weixin.rpc.user.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 关注商品\n * Author: cheng\n * Date: 2016/6/3\n */\npublic class ProductFocus extends DataEntity<ProductFocus> {\n    private String accountId;\n    private String productId;\n\n    public ProductFocus() {\n    }\n\n    public ProductFocus(String accountId, String productId) {\n        this.accountId = accountId;\n        this.productId = productId;\n    }\n\n    //public ProductFocus(String accountId, String productId, Status status) {\n    //    this.accountId = accountId;\n    //    this.productId = productId;\n    //    super.status = status;\n    //}\n\n    public String getAccountId() {\n        return accountId;\n    }\n\n    public void setAccountId(String accountId) {\n        this.accountId = accountId;\n    }\n\n    public String getProductId() {\n        return productId;\n    }\n\n    public void setProductId(String productId) {\n        this.productId = productId;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-user/src/main/java/com/cheng/weixin/rpc/user/entity/Province.java",
    "content": "package com.cheng.weixin.rpc.user.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 省份\n * Author: cheng\n * Date: 2016/6/3\n */\npublic class Province extends DataEntity<Province> {\n    private String name;\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-user/src/main/java/com/cheng/weixin/rpc/user/enumType/BehaviorType.java",
    "content": "package com.cheng.weixin.rpc.user.enumType;\n\n/**\n * Desc: 操作类型 积分 现金 券\n * Author: cheng\n * Date: 2016/6/3\n */\npublic enum BehaviorType {\n    BONUSPOINT,\n    CASH,\n    TICKET;\n}\n"
  },
  {
    "path": "weixin-rpc-user/src/main/java/com/cheng/weixin/rpc/user/enumType/Credit.java",
    "content": "package com.cheng.weixin.rpc.user.enumType;\n\n/**\n * Desc: 信用等级 划分为五个等级：良好、较好、一般、较差、差\n * Author: cheng\n * Date: 2016/6/3\n */\npublic enum Credit {\n    WELL,\n    GOOD,\n    GENERAL,\n    WORSE,\n    POOR;\n}\n"
  },
  {
    "path": "weixin-rpc-user/src/main/java/com/cheng/weixin/rpc/user/enumType/Sex.java",
    "content": "package com.cheng.weixin.rpc.user.enumType;\n\n/**\n * Desc: 性别\n * Author: hp\n * Date: 2016/11/2\n */\npublic enum Sex {\n\n    MAN(\"男士\"),\n    WOMAN(\"女士\"),\n    UNKNOW(\"未知\");\n\n    private String name;\n\n    Sex(String name) {\n        this.name = name;\n    }\n    public String getName() {\n        return name;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-user/src/main/java/com/cheng/weixin/rpc/user/enumType/SourceFrom.java",
    "content": "package com.cheng.weixin.rpc.user.enumType;\n\n/**\n * Desc: 来源\n * Author: cheng\n * Date: 2016/7/12\n */\npublic enum SourceFrom {\n    NO,\n    QQ,\n    WEIXIN,\n    SINAWEIBO;\n}\n"
  },
  {
    "path": "weixin-rpc-user/src/main/java/com/cheng/weixin/rpc/user/enumType/TXType.java",
    "content": "package com.cheng.weixin.rpc.user.enumType;\n\n/**\n * Desc:\n * Author: 光灿\n * Date: 2016/11/19\n */\npublic enum TXType {\n\n    EARNING(\"收入\"),\n    EXPENSE(\"支出\");\n\n    private String name;\n    TXType(String name) {\n        this.name = name;\n    }\n\n    public String getName() {\n        return name;\n    }\n}\n"
  },
  {
    "path": "weixin-rpc-user/src/main/java/com/cheng/weixin/rpc/user/service/RpcUserService.java",
    "content": "package com.cheng.weixin.rpc.user.service;\n\nimport com.cheng.weixin.rpc.user.entity.*;\n\nimport java.util.List;\n\n/**\n * Desc: 用户\n * Author: cheng\n * Date: 2016/7/7\n */\npublic interface RpcUserService {\n    /**\n     * 根据登陆账号获取该账号信息\n     * @param loginName\n     * @return\n     */\n    Account getAccountByLoginName(String loginName);\n\n    /**\n     * 根据ID获取帐户信息\n     * @param id\n     * @return\n     */\n    Account getAccountById(String id);\n\n    /**\n     * 保存帐号信息\n     * @param phone\n     * @param password\n     * @param nickname\n     */\n    void saveAccess(String phone, String password, String nickname, String ip);\n\n    /**\n     * 登陆验证\n     * @param username\n     * @param password\n     * @param loginIp\n     * @return\n     */\n    String validateLogin(String username, String password, String loginIp);\n\n    /**\n     * 获取默认的配送地址\n     * @return\n     */\n    DeliveryAddress getDefaultAddress(String userId);\n    /**\n     * 获取默认的配送地址\n     * @param id\n     * @param userId\n     * @return\n     */\n    DeliveryAddress getDeliveryAddress(String id, String userId);\n\n    /**\n     * 获取全部的配送信息\n     * @param userId\n     * @return\n     */\n    List<DeliveryAddress> getAllDeliveryAddr(String userId);\n\n    /**\n     * 获取用户账户信息\n     * @param userId\n     * @return\n     */\n    Account getAccount(String userId);\n\n    /**\n     * 获取账户信息根据登录名\n     * @param username\n     * @return\n     */\n    Account getAccountByUsername(String username);\n\n    /**\n     * 更新帐户\n     * @param account\n     */\n    void updateAccount(Account account);\n\n    /**\n     * 保存动作\n     * @param behavior\n     */\n    void addBehavior(Behavior behavior);\n\n    /**\n     * 积分记录\n     * @param userId\n     */\n    BonusPointRecord getBonusPointRecord(String userId);\n\n    /**\n     * 获取当前月获取的积分记录\n     * @param userId\n     * @return\n     */\n    List<BonusPointRecord> getByUSerIdAndCurrentMonth(String userId);\n\n    /**\n     * 保存积分\n     * @param bonusPointRecord\n     */\n    void addBonusPointRecord(BonusPointRecord bonusPointRecord);\n\n    /**\n     * 获取用户券记录\n     * @param userId\n     * @return\n     */\n    CouponRecord getCouponRecordByUser(String userId);\n\n    /**\n     * 保存券记录\n     * @param couponRecor\n     */\n    void addCouponRecord(CouponRecord couponRecor);\n\n    /**\n     * 根据用户获取最新的一条现金记录\n     * @param userId\n     * @return\n     */\n    CashRecord getNewCashRecord(String userId);\n\n    /**\n     * 保存现金记录\n     * @param cashRecord\n     */\n    void addCashRecord(CashRecord cashRecord);\n\n    /**\n     * 商品收藏\n     * @param userId\n     * @param productId\n     */\n    void addProductFocus(String userId, String productId);\n    /**\n     * 删除商品收藏\n     * @param userId\n     * @param productId\n     */\n    void deleteProductFocus(String userId, String productId);\n    /**\n     * 该商品是否收藏\n     * @param userId\n     * @param productId\n     * @return\n     */\n    boolean isProductFocus(String userId, String productId);\n\n    /**\n     * 获取会员信息\n     * @param userId\n     * @return\n     */\n    Member getMemberById(String userId);\n    /**\n     * 获取会员信息\n     * @param userId\n     * @return\n     */\n    Member getMemberByAccountId(String userId);\n    /**\n     * 根据ID获取级别信息\n     * @param id\n     * @return\n     */\n    AccountLevel getAccountLevelById(String id);\n\n    /**\n     * 根据级别获取级别信息\n     * @param level\n     * @return\n     */\n    AccountLevel getAccountLevelByLevel(int level);\n\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-rpc-wxtools</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>com.cheng</groupId>\n      <artifactId>weixin-common-entity</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>javax.servlet</groupId>\n      <artifactId>javax.servlet-api</artifactId>\n      <scope>provided</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.fasterxml.jackson.core</groupId>\n      <artifactId>jackson-annotations</artifactId>\n    </dependency>\n\n  </dependencies>\n</project>"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/content/WeixinContent.java",
    "content": "package com.cheng.weixin.rpc.wxtools.content;\n\npublic class WeixinContent {\n\t\n\tprivate WeixinContent(){}\n\t\n\tprivate static class SingletonHolder {\n\t\tpublic static final WeixinContent instance = new WeixinContent();\n\t}\n\t\n\tpublic static WeixinContent getInstance() {\n\t\treturn SingletonHolder.instance;\n\t}\n\t\n//\tprivate String accessToken;\n\tprivate static String accessToken = \"YwQ1YAO9kVLY-OM6A4Cn5IIt4QC25ixcNV00y_vYS4jFhtTUFMs1OK9HUdQKFsgTkjPPzjhIcClkoz2804GtkjJD-tXfF-x4aHcxdQO-yH4GRIgAEANYP\";\n\tpublic String getAccessToken() {\n\t\treturn accessToken;\n\t}\n\tpublic void setAccessToken(String accessToken) {\n\t\tthis.accessToken = accessToken;\n\t}\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/entity/WxGroup.java",
    "content": "package com.cheng.weixin.rpc.wxtools.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 群组实体类\n * Author: Cheng\n * Date: 2016/1/29 0029\n */\npublic class WxGroup extends DataEntity<WxGroup> {\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/entity/WxMenu.java",
    "content": "package com.cheng.weixin.rpc.wxtools.entity;\n\nimport com.cheng.common.entity.DataEntity;\n\n/**\n * Desc: 菜单实体\n * Author: Cheng\n * Date: 2016/1/29 0029\n */\npublic class WxMenu extends DataEntity<WxMenu> {\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/enums/ActionType.java",
    "content": "package com.cheng.weixin.rpc.wxtools.enums;\n/**\n * 自定义菜单接口多种活动类型按钮\n * @author Cheng\n */\npublic enum ActionType {\n\tclick(\"点击推事件\"),\n\tview(\"跳转URL\"),\n\tscancode_push(\"扫码推事件\"),\n\tscancode_waitmsg(\"扫码推事件且弹出“消息接收中”提示框\"),\n\tpic_sysphoto(\"弹出系统拍照发图\"),\n\tpic_photo_or_album(\"弹出拍照或者相册发图\"),\n\tpic_weixin(\"弹出微信相册发图器\"),\n\tlocation_select(\"弹出地理位置选择器\"),\n\tmedia_id(\"下发消息（除文本消息）\"),\n\tview_limited(\"跳转图文消息URL\");\n\t\n\tprivate String name;\n\n\tprivate ActionType(String name) {\n\t\tthis.name = name;\n\t}\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\t\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/enums/Event.java",
    "content": "package com.cheng.weixin.rpc.wxtools.enums;\n/**\n * 事件类型\n * @author Cheng\n *\n */\npublic enum Event {\n\tCLICK,\n\tVIEW,\n\tsubscribe,\n\tunsubscribe,\n\tSCAN,\n\tLOCATION,\n\t\n\tclick,\n\tview,\n\tscancode_push,\n\tscancode_waitmsg,\n\tpic_sysphoto,\n\tpic_photo_or_album,\n\tpic_weixin,\n\tlocation_select,\n\tmedia_id,\n\tview_limited,\n\t\n\tTEMPLATESENDJOBFINISH;\n\t\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/enums/MidiaType.java",
    "content": "package com.cheng.weixin.rpc.wxtools.enums;\n/**\n * 媒体类型\n * @author Cheng\n *\n */\npublic enum MidiaType {\n\timage,\n\tvoice,\n\tvideo,\n\tthumb;\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/enums/MsgType.java",
    "content": "package com.cheng.weixin.rpc.wxtools.enums;\n/**\n * 消息类型\n * @author Cheng\n *\n */\npublic enum MsgType {\n\tevent,\n\tvoice,\n\timage,\n\tshortvideo,\n\tlocation,\n\tlink,\n\ttext;\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/enums/Status.java",
    "content": "package com.cheng.weixin.rpc.wxtools.enums;\n\npublic enum Status {\n\t/** 成功 **/\n\tSUCCESS(\"success\"),\n\t/** 用户拒收 **/\n\tUSER_BLOCK(\"failed:user block\"),\n\t/** 系统错误 **/\n\tSYSTEM_FAILED(\"failed: system failed\");\n\t\n\tprivate String name;\n\t\n\tprivate Status() {\n\t}\n\tprivate Status(String name) {\n\t\tthis.name = name;\n\t}\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\t\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/request/model/BaseMessage.java",
    "content": "package com.cheng.weixin.rpc.wxtools.request.model;\n\nimport com.cheng.weixin.rpc.wxtools.enums.MsgType;\n\nimport java.io.Serializable;\n\n/**\n * 被动回复基类消息\n * @author Cheng\n *\n */\npublic abstract class BaseMessage implements Serializable {\n\tprivate static final long serialVersionUID = 1L;\n\tprivate String ToUserName;\n\tprivate String FromUserName;\n\tprivate long CreateTime;\n\tprivate com.cheng.weixin.rpc.wxtools.enums.MsgType MsgType;\n\t\n\tpublic String getToUserName() {\n\t\treturn ToUserName;\n\t}\n\tpublic void setToUserName(String toUserName) {\n\t\tToUserName = toUserName;\n\t}\n\tpublic String getFromUserName() {\n\t\treturn FromUserName;\n\t}\n\tpublic void setFromUserName(String fromUserName) {\n\t\tFromUserName = fromUserName;\n\t}\n\tpublic long getCreateTime() {\n\t\treturn CreateTime;\n\t}\n\tpublic void setCreateTime(long createTime) {\n\t\tCreateTime = createTime;\n\t}\n\tpublic MsgType getMsgType() {\n\t\treturn MsgType;\n\t}\n\tpublic void setMsgType(MsgType msgType) {\n\t\tMsgType = msgType;\n\t}\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/request/model/ImageMessage.java",
    "content": "package com.cheng.weixin.rpc.wxtools.request.model;\n\n/**\n * 图片消息\n * @author Cheng\n */\npublic class ImageMessage extends BaseMessage {\n\t\n\tprivate static final long serialVersionUID = 1L;\n\tprivate WxImage Image;\n\t\n\tpublic WxImage getImage() {\n\t\treturn Image;\n\t}\n\tpublic void setImage(WxImage image) {\n\t\tthis.Image = image;\n\t}\n\t\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/request/model/MediaMessage.java",
    "content": "package com.cheng.weixin.rpc.wxtools.request.model;\n\n/**\n * 语音消息\n * @author Cheng\n */\npublic class MediaMessage extends BaseMessage {\n\t\n\tprivate static final long serialVersionUID = 1L;\n\tprivate com.cheng.weixin.rpc.wxtools.response.model.WxMedia Media;\n\t\n\tpublic com.cheng.weixin.rpc.wxtools.response.model.WxMedia getMedia() {\n\t\treturn Media;\n\t}\n\tpublic void setMedia(com.cheng.weixin.rpc.wxtools.response.model.WxMedia media) {\n\t\tthis.Media = media;\n\t}\n\t\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/request/model/ModelMsgData.java",
    "content": "package com.cheng.weixin.rpc.wxtools.request.model;\n\nimport java.io.Serializable;\n\npublic class ModelMsgData implements Serializable {\n\t\n\tprivate static final long serialVersionUID = 1L;\n\n\tprivate String value;\n\tprivate String color;\n\t\n\tpublic ModelMsgData(String value, String color) {\n\t\tthis.value = value;\n\t\tthis.color = color;\n\t}\n\tpublic String getValue() {\n\t\treturn value;\n\t}\n\tpublic void setValue(String value) {\n\t\tthis.value = value;\n\t}\n\tpublic String getColor() {\n\t\treturn color;\n\t}\n\tpublic void setColor(String color) {\n\t\tthis.color = color;\n\t}\n\t\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/request/model/MusicMessage.java",
    "content": "package com.cheng.weixin.rpc.wxtools.request.model;\n\n/**\n * 音乐消息\n * @author Cheng\n */\npublic class MusicMessage extends BaseMessage {\n\t\n\tprivate static final long serialVersionUID = 1L;\n\tprivate WxMusic Music;\n\t\n\tpublic WxMusic getMusic() {\n\t\treturn Music;\n\t}\n\tpublic void setMusic(WxMusic music) {\n\t\tthis.Music = music;\n\t}\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/request/model/NewsMessage.java",
    "content": "package com.cheng.weixin.rpc.wxtools.request.model;\n\nimport java.util.List;\n\n/**\n * 图文消息\n * @author Cheng\n */\npublic class NewsMessage extends BaseMessage {\n\t\n\tprivate static final long serialVersionUID = 1L;\n\tprivate List<WxNews> Articles;\n\t\n\tpublic List<WxNews> getArticles() {\n\t\treturn Articles;\n\t}\n\tpublic void setArticles(List<WxNews> articles) {\n\t\tthis.Articles = articles;\n\t}\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/request/model/TemplateMessage.java",
    "content": "package com.cheng.weixin.rpc.wxtools.request.model;\n\nimport java.io.Serializable;\nimport java.util.Map;\n\n/**\n * 模版消息\n * @author Cheng\n *\n */\npublic class TemplateMessage implements Serializable {\n\t\n\tprivate static final long serialVersionUID = 1L;\n\tprivate String touser;\n\tprivate String template_id;\n\tprivate String url;\n\tprivate Map<String,Serializable> data;\n\tpublic String getTouser() {\n\t\treturn touser;\n\t}\n\tpublic void setTouser(String touser) {\n\t\tthis.touser = touser;\n\t}\n\tpublic String getTemplate_id() {\n\t\treturn template_id;\n\t}\n\tpublic void setTemplate_id(String template_id) {\n\t\tthis.template_id = template_id;\n\t}\n\tpublic String getUrl() {\n\t\treturn url;\n\t}\n\tpublic void setUrl(String url) {\n\t\tthis.url = url;\n\t}\n\tpublic Map<String, Serializable> getData() {\n\t\treturn data;\n\t}\n\tpublic void setData(Map<String, Serializable> data) {\n\t\tthis.data = data;\n\t}\n\t\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/request/model/TextMessage.java",
    "content": "package com.cheng.weixin.rpc.wxtools.request.model;\n/**\n * 文本消息\n * @author Cheng\n */\npublic class TextMessage extends BaseMessage {\n\tprivate static final long serialVersionUID = 1L;\n\tprivate String Content;\n\n\tpublic String getContent() {\n\t\treturn Content;\n\t}\n\tpublic void setContent(String content) {\n\t\tContent = content;\n\t}\n\t\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/request/model/VoiceMessage.java",
    "content": "package com.cheng.weixin.rpc.wxtools.request.model;\n\n/**\n * 语音消息\n * @author Cheng\n */\npublic class VoiceMessage extends BaseMessage {\n\t\n\tprivate static final long serialVersionUID = 1L;\n\tprivate WxVoice Voice;\n\t\n\tpublic WxVoice getVoice() {\n\t\treturn Voice;\n\t}\n\tpublic void setVoice(WxVoice voice) {\n\t\tthis.Voice = voice;\n\t}\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/request/model/WxImage.java",
    "content": "package com.cheng.weixin.rpc.wxtools.request.model;\n\nimport java.io.Serializable;\n\npublic class WxImage implements Serializable {\n\tprivate static final long serialVersionUID = 1L;\n\tprivate String MediaId;\n\n\tpublic String getMediaId() {\n\t\treturn MediaId;\n\t}\n\n\tpublic void setMediaId(String mediaId) {\n\t\tMediaId = mediaId;\n\t}\n}"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/request/model/WxMenu.java",
    "content": "package com.cheng.weixin.rpc.wxtools.request.model;\n\nimport com.cheng.weixin.rpc.wxtools.enums.ActionType;\nimport com.fasterxml.jackson.annotation.JsonInclude;\nimport com.fasterxml.jackson.annotation.JsonInclude.Include;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * 自定义菜单\n * @author Cheng\n *\n */\n@JsonInclude(Include.NON_NULL)\npublic class WxMenu implements Serializable {\n\tprivate static final long serialVersionUID = 1L;\n\tprivate String name;\n\tprivate ActionType type;\n\tprivate String key;\n\tprivate String url;\n\t/** 子菜单 **/\n\tprivate List<WxMenu> sub_button;\n\t\n\tpublic String getUrl() {\n\t\treturn url;\n\t}\n\tpublic void setUrl(String url) {\n\t\tthis.url = url;\n\t}\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\tpublic ActionType getType() {\n\t\treturn type;\n\t}\n\tpublic void setType(ActionType type) {\n\t\tthis.type = type;\n\t}\n\tpublic String getKey() {\n\t\treturn key;\n\t}\n\tpublic void setKey(String key) {\n\t\tthis.key = key;\n\t}\n\tpublic List<WxMenu> getSub_button() {\n\t\treturn sub_button;\n\t}\n\tpublic void setSub_button(List<WxMenu> sub_button) {\n\t\tthis.sub_button = sub_button;\n\t}\n\t\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/request/model/WxMusic.java",
    "content": "package com.cheng.weixin.rpc.wxtools.request.model;\n\nimport java.io.Serializable;\n\npublic class WxMusic implements Serializable {\n\tprivate static final long serialVersionUID = 1L;\n\tprivate String MediaId;\n\tprivate String Title;// 非必须\n\tprivate String Description;// 非必须\n\tprivate String MusicUrl;// 非必须\n\tprivate String HQMusicUrl;// 非必须\n\tprivate String ThumbMediaId;// 非必须\n\n\tpublic String getMediaId() {\n\t\treturn MediaId;\n\t}\n\tpublic void setMediaId(String mediaId) {\n\t\tMediaId = mediaId;\n\t}\n\tpublic String getTitle() {\n\t\treturn Title;\n\t}\n\tpublic void setTitle(String title) {\n\t\tTitle = title;\n\t}\n\tpublic String getDescription() {\n\t\treturn Description;\n\t}\n\tpublic void setDescription(String description) {\n\t\tDescription = description;\n\t}\n\tpublic String getMusicUrl() {\n\t\treturn MusicUrl;\n\t}\n\tpublic void setMusicUrl(String musicUrl) {\n\t\tMusicUrl = musicUrl;\n\t}\n\tpublic String getHQMusicUrl() {\n\t\treturn HQMusicUrl;\n\t}\n\tpublic void setHQMusicUrl(String hQMusicUrl) {\n\t\tHQMusicUrl = hQMusicUrl;\n\t}\n\tpublic String getThumbMediaId() {\n\t\treturn ThumbMediaId;\n\t}\n\tpublic void setThumbMediaId(String thumbMediaId) {\n\t\tThumbMediaId = thumbMediaId;\n\t}\n\t\t\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/request/model/WxNews.java",
    "content": "package com.cheng.weixin.rpc.wxtools.request.model;\n\nimport java.io.Serializable;\n\npublic class WxNews implements Serializable {\n\tprivate static final long serialVersionUID = 1L;\n\tprivate String Title;\n\tprivate String Description;\n\tprivate String PicUrl;\n\tprivate String Url;\n\t\n\tpublic String getTitle() {\n\t\treturn Title;\n\t}\n\tpublic void setTitle(String title) {\n\t\tTitle = title;\n\t}\n\tpublic String getDescription() {\n\t\treturn Description;\n\t}\n\tpublic void setDescription(String description) {\n\t\tDescription = description;\n\t}\n\tpublic String getPicUrl() {\n\t\treturn PicUrl;\n\t}\n\tpublic void setPicUrl(String picUrl) {\n\t\tPicUrl = picUrl;\n\t}\n\tpublic String getUrl() {\n\t\treturn Url;\n\t}\n\tpublic void setUrl(String url) {\n\t\tUrl = url;\n\t}\n}"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/request/model/WxVoice.java",
    "content": "package com.cheng.weixin.rpc.wxtools.request.model;\n\nimport java.io.Serializable;\n\npublic class WxVoice implements Serializable {\n\tprivate static final long serialVersionUID = 1L;\n\tprivate String MediaId;\n\n\tpublic String getMediaId() {\n\t\treturn MediaId;\n\t}\n\n\tpublic void setMediaId(String mediaId) {\n\t\tMediaId = mediaId;\n\t}\n}"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/response/model/AccessToken.java",
    "content": "package com.cheng.weixin.rpc.wxtools.response.model;\n/**\n * 动态Token\n * @author Cheng\n */\npublic class AccessToken {\n\tprivate String access_token;\n\tprivate String expires_in;\n\t\n\tpublic String getAccess_token() {\n\t\treturn access_token;\n\t}\n\tpublic void setAccess_token(String access_token) {\n\t\tthis.access_token = access_token;\n\t}\n\tpublic String getExpires_in() {\n\t\treturn expires_in;\n\t}\n\tpublic void setExpires_in(String expires_in) {\n\t\tthis.expires_in = expires_in;\n\t}\n\t\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/response/model/SendTemplateMassage.java",
    "content": "package com.cheng.weixin.rpc.wxtools.response.model;\n\nimport java.io.Serializable;\n\n/**\n * 发送模版消息的回复\n * @author Cheng\n *\n */\npublic class SendTemplateMassage implements Serializable {\n\t\n\tprivate static final long serialVersionUID = 1L;\n\tprivate String errcode;\n\tprivate String errmsg;\n\tprivate long msgid;\n\tpublic String getErrcode() {\n\t\treturn errcode;\n\t}\n\tpublic void setErrcode(String errcode) {\n\t\tthis.errcode = errcode;\n\t}\n\tpublic String getErrmsg() {\n\t\treturn errmsg;\n\t}\n\tpublic void setErrmsg(String errmsg) {\n\t\tthis.errmsg = errmsg;\n\t}\n\tpublic long getMsgid() {\n\t\treturn msgid;\n\t}\n\tpublic void setMsgid(long msgid) {\n\t\tthis.msgid = msgid;\n\t}\n\t\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/response/model/WxGroup.java",
    "content": "package com.cheng.weixin.rpc.wxtools.response.model;\n\nimport com.fasterxml.jackson.annotation.JsonInclude;\nimport com.fasterxml.jackson.annotation.JsonInclude.Include;\n\n/**\n * 群组\n * @author Cheng\n *\n */\n@JsonInclude(Include.NON_NULL)\npublic class WxGroup {\n\tprivate Integer id;\n\tprivate String name;\n\tprivate Integer count;\n\t\n\tpublic WxGroup() {}\n\tpublic WxGroup(Integer id) {\n\t\tthis.id = id;\n\t}\n\t\n\tpublic WxGroup(Integer id, String name) {\n\t\tthis.id = id;\n\t\tthis.name = name;\n\t}\n\tpublic Integer getId() {\n\t\treturn id;\n\t}\n\tpublic void setId(Integer id) {\n\t\tthis.id = id;\n\t}\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\tpublic Integer getCount() {\n\t\treturn count;\n\t}\n\tpublic void setCount(Integer count) {\n\t\tthis.count = count;\n\t}\n\t@Override\n\tpublic String toString() {\n\t\treturn \"Group [id=\" + id + \", name=\" + name + \", count=\" + count + \"]\";\n\t}\n\t\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/response/model/WxMedia.java",
    "content": "package com.cheng.weixin.rpc.wxtools.response.model;\n\npublic class WxMedia {\n\n\tprivate String type;\n\tprivate String media_id;\n\tprivate long created_at;\n\t\n\tpublic String getType() {\n\t\treturn type;\n\t}\n\tpublic void setType(String type) {\n\t\tthis.type = type;\n\t}\n\tpublic String getMedia_id() {\n\t\treturn media_id;\n\t}\n\tpublic void setMedia_id(String media_id) {\n\t\tthis.media_id = media_id;\n\t}\n\tpublic long getCreated_at() {\n\t\treturn created_at;\n\t}\n\tpublic void setCreated_at(long created_at) {\n\t\tthis.created_at = created_at;\n\t}\n\t@Override\n\tpublic String toString() {\n\t\treturn \"Media [type=\" + type + \", media_id=\" + media_id + \", created_at=\" + created_at + \"]\";\n\t}\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/service/RpcMessageHandleService.java",
    "content": "package com.cheng.weixin.rpc.wxtools.service;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.Map;\n\n/**\n * Desc: 消息处理\n * Author: Cheng\n * Date: 2016/4/7 0007\n */\npublic interface RpcMessageHandleService {\n    /**\n     * 把XML转换程Map对象\n     * @param request\n     * @return\n     */\n    Map<String, String> reqMsg2Map(HttpServletRequest request);\n    /**\n     * 微信消息处理入口\n     * @param msgMap\n     * @return\n     */\n    String handleResp(Map<String, String> msgMap);\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/service/RpcWxGroupService.java",
    "content": "package com.cheng.weixin.rpc.wxtools.service;\n\n\nimport com.cheng.weixin.rpc.wxtools.response.model.WxGroup;\n\nimport java.util.List;\n\n\n/**\n * 微信分组管理\n * @author Cheng\n */\npublic interface RpcWxGroupService {\n\t/**\n\t * 增加分组\n\t * @param name\n\t */\n\tWxGroup addGroup(String name);\n\t/**\n\t * 查询所有分组\n\t * @return\n\t */\n\tList<WxGroup> getAllGroup();\n\t/**\n\t * 查询用户所在分组\n\t * @param openid\n\t * @return\n\t */\n\tInteger getUserGroup(String openid);\n\t/**\n\t * 修改分组名\n\t * @param id\n\t * @param name\n\t */\n\tvoid updateGroupName(int id, String name);\n\t/**\n\t * 移动用户分组\n\t * @param openid\n\t * @param groupid\n\t */\n\tvoid updateUserGroup(String openid, int groupid);\n\t/**\n\t * 批量移动用户分组\n\t * @param openids\n\t * @param groupid\n\t */\n\tvoid updateBatchMoveUserGroup(List<String> openids, int groupid);\n\t/**\n\t * 删除分组\n\t * @return \n\t */\n\tvoid deleteGroup(int id);\n\t\n}\n"
  },
  {
    "path": "weixin-rpc-wxtools/src/main/java/com/cheng/weixin/rpc/wxtools/service/RpcWxMenuService.java",
    "content": "package com.cheng.weixin.rpc.wxtools.service;\n\n\n/** 用户业务处理\n * Desc:\n * Author: Cheng\n * Date: 2016/1/28 0028\n */\npublic interface RpcWxMenuService {\n}\n"
  },
  {
    "path": "weixin-service-admin/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-service-admin</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-config</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-service</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-rpc-admin</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>junit</groupId>\n      <artifactId>junit</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>log4j</groupId>\n      <artifactId>log4j</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-log4j12</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-logging</groupId>\n      <artifactId>commons-logging</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-beanutils</groupId>\n      <artifactId>commons-beanutils</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.github.pagehelper</groupId>\n      <artifactId>pagehelper</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>javax.servlet</groupId>\n      <artifactId>javax.servlet-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>mysql</groupId>\n      <artifactId>mysql-connector-java</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>druid</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjrt</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjweaver</artifactId>\n    </dependency>\n    <!-- Dubbo Start -->\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>dubbo</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.101tec</groupId>\n      <artifactId>zkclient</artifactId>\n    </dependency>\n    <!-- Dubbo End -->\n    <!-- Spring begin -->\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context-support</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-core</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-beans</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-aop</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-orm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-web</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-jdbc</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-oxm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-test</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-tx</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-expression</artifactId>\n    </dependency>\n    <!-- Spring end -->\n    <!-- MyBatis begin -->\n    <dependency>\n      <groupId>org.mybatis</groupId>\n      <artifactId>mybatis</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.mybatis</groupId>\n      <artifactId>mybatis-spring</artifactId>\n    </dependency>\n    <!-- MyBatis end -->\n  </dependencies>\n\n  <build>\n    <resources>\n      <resource>\n        <targetPath>${project.build.directory}/classes</targetPath>\n        <directory>src/main/resources</directory>\n        <filtering>true</filtering>\n        <includes>\n          <include>**/*.xml</include>\n          <include>**/*.properties</include>\n        </includes>\n        <excludes>\n          <exclude>rebel.xml</exclude>\n        </excludes>\n      </resource>\n      <resource>\n        <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>\n        <directory>src/main/resources/spring</directory>\n        <!--<directory>src/main/resources</directory>-->\n        <filtering>true</filtering>\n        <includes>\n          <include>spring-context.xml</include>\n        </includes>\n      </resource>\n    </resources>\n    <plugins>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-compiler-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-source-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-jar-plugin</artifactId>\n        <configuration>\n          <classesDirectory>target/classes/</classesDirectory>\n          <archive>\n            <!--生成的jar中，不要包含pom.xml和pom.properties这两个文件 -->\n            <addMavenDescriptor>false</addMavenDescriptor>\n            <manifest>\n              <mainClass>com.alibaba.dubbo.container.Main</mainClass>\n              <!-- 打包时MANIFEST.MF文件不记录时间版本 -->\n              <useUniqueVersions>false</useUniqueVersions>\n              <addClasspath>true</addClasspath>\n              <classpathPrefix>lib/</classpathPrefix>\n            </manifest>\n            <manifestEntries>\n              <Class-Path>.</Class-Path>\n            </manifestEntries>\n          </archive>\n        </configuration>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-dependency-plugin</artifactId>\n        <executions>\n          <execution>\n            <id>copy-dependencies</id>\n            <phase>package</phase>\n            <goals>\n              <goal>copy-dependencies</goal>\n            </goals>\n            <configuration>\n              <type>jar</type>\n              <includeTypes>jar</includeTypes>\n              <!--<useUniqueVersions>false</useUniqueVersions>-->\n              <outputDirectory>\n                ${project.build.directory}/lib\n              </outputDirectory>\n            </configuration>\n          </execution>\n        </executions>\n      </plugin>\n      <plugin>\n        <groupId>org.zeroturnaround</groupId>\n        <artifactId>jrebel-maven-plugin</artifactId>\n      </plugin>\n    </plugins>\n  </build>\n</project>"
  },
  {
    "path": "weixin-service-admin/shell/service-admin.sh",
    "content": "#!/bin/sh\n\n## java env\nexport JAVA_HOME=/usr/local/jdk1.7.0_45\nexport JRE_HOME=$JAVA_HOME/jre\n\n## service name\nAPP_NAME=admin\n\nSERVICE_DIR=/home/wusc/edu/service/$APP_NAME\nSERVICE_NAME=weixin-service-$APP_NAME\nJAR_NAME=$SERVICE_NAME\\.jar\nPID=$SERVICE_NAME\\.pid\n\ncd $SERVICE_DIR\n\ncase \"$1\" in\n\n    start)\n        nohup $JRE_HOME/bin/java -Xms256m -Xmx512m -jar $JAR_NAME >/dev/null 2>&1 &\n        echo $! > $SERVICE_DIR/$PID\n        echo \"=== start $SERVICE_NAME\"\n        ;;\n\n    stop)\n        kill `cat $SERVICE_DIR/$PID`\n        rm -rf $SERVICE_DIR/$PID\n        echo \"=== stop $SERVICE_NAME\"\n\n        sleep 5\n\n        P_ID=`ps -ef | grep -w \"$SERVICE_NAME\" | grep -v \"grep\" | awk '{print $2}'`\n        if [ \"$P_ID\" == \"\" ]; then\n            echo \"=== $SERVICE_NAME process not exists or stop success\"\n        else\n            echo \"=== $SERVICE_NAME process pid is:$P_ID\"\n            echo \"=== begin kill $SERVICE_NAME process, pid is:$P_ID\"\n            kill -9 $P_ID\n        fi\n        ;;\n\n    restart)\n        $0 stop\n        sleep 2\n        $0 start\n        echo \"=== restart $SERVICE_NAME\"\n        ;;\n\n    *)\n        ## restart\n        $0 stop\n        sleep 2\n        $0 start\n        ;;\n\nesac\nexit 0\n\n"
  },
  {
    "path": "weixin-service-admin/src/main/java/com/cheng/weixin/service/admin/dao/AdminDaoMapper.java",
    "content": "package com.cheng.weixin.service.admin.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.admin.entity.Admin;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 管理员mapper\n * Author: Cheng\n * Date: 2016/1/28 0028\n */\n@Repository\npublic interface AdminDaoMapper extends BaseDaoMapper<Admin> {\n    /**\n     * 根据用户名获取用户信息\n     * @param username\n     * @return\n     */\n//    Admin loadUserByUsername(String username);\n\n}\n"
  },
  {
    "path": "weixin-service-admin/src/main/java/com/cheng/weixin/service/admin/dao/AdminRoleDaoMapper.java",
    "content": "package com.cheng.weixin.service.admin.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.admin.entity.AdminRole;\n\n/**\n * Desc: 管理员对应权限\n * Author: cheng\n * Date: 2016/5/25\n */\npublic interface AdminRoleDaoMapper extends BaseDaoMapper<AdminRole> {\n}\n"
  },
  {
    "path": "weixin-service-admin/src/main/java/com/cheng/weixin/service/admin/dao/PermissionDaoMapper.java",
    "content": "package com.cheng.weixin.service.admin.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.admin.entity.Permission;\nimport org.springframework.stereotype.Repository;\n\nimport java.util.List;\n\n/**\n * Desc: 资源权限mapper\n * Author: Cheng\n * Date: 2016/1/28 0028\n */\n@Repository\npublic interface PermissionDaoMapper extends BaseDaoMapper<Permission> {\n    /**\n     * 根据管理员ID获取所属权限\n     * @param adminId\n     * @return\n     */\n    List<Permission> loadByAdminId(String adminId);\n}\n"
  },
  {
    "path": "weixin-service-admin/src/main/java/com/cheng/weixin/service/admin/dao/RoleDaoMapper.java",
    "content": "package com.cheng.weixin.service.admin.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.admin.entity.Role;\nimport org.springframework.stereotype.Repository;\n\nimport java.util.List;\n\n/**\n * Desc: 角色mapper\n * Author: Cheng\n * Date: 2016/1/28 0028\n */\n@Repository\npublic interface RoleDaoMapper extends BaseDaoMapper<Role> {\n    /**\n     * 根据管理员ID获取角色\n     * @param adminId\n     * @return\n     */\n    List<Role> loadByAdminId(String adminId);\n}\n"
  },
  {
    "path": "weixin-service-admin/src/main/java/com/cheng/weixin/service/admin/service/AdminService.java",
    "content": "package com.cheng.weixin.service.admin.service;\n\nimport com.cheng.weixin.rpc.admin.entity.Admin;\nimport com.cheng.weixin.rpc.admin.entity.AdminRole;\nimport com.cheng.weixin.rpc.admin.entity.Permission;\nimport com.cheng.weixin.rpc.admin.entity.Role;\nimport com.cheng.weixin.common.model.Page;\nimport com.cheng.weixin.rpc.admin.service.RpcAdminService;\nimport com.cheng.weixin.service.admin.dao.AdminDaoMapper;\nimport com.cheng.weixin.service.admin.dao.AdminRoleDaoMapper;\nimport com.cheng.weixin.service.admin.dao.PermissionDaoMapper;\nimport com.cheng.weixin.service.admin.dao.RoleDaoMapper;\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport org.apache.commons.beanutils.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.lang.reflect.InvocationTargetException;\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * Desc: 用户业务类\n * Author: Cheng\n * Date: 2016/1/28 0028\n */\n@Service(\"adminService\")\npublic class AdminService implements RpcAdminService {\n\n    @Autowired\n    private AdminDaoMapper adminDao;\n    @Autowired\n    private PermissionDaoMapper permissionDao;\n    @Autowired\n    private RoleDaoMapper roleDao;\n    @Autowired\n    private AdminRoleDaoMapper adminRoleDao;\n\n    @Override\n    public void add(Admin admin) {\n        adminDao.save(admin);\n        List<Role> roles = admin.getRoles();\n        List<AdminRole> adminRoles = new ArrayList<>();\n        for (Role role : roles) {\n            if (roleDao.load(new Role(role.getId())) == null) {\n                throw new IllegalArgumentException(\"没有该角色！\"+role.getId());\n            }\n            adminRoles.add(new AdminRole(admin.getId(), role.getId()));\n        }\n        adminRoleDao.saves(adminRoles);\n    }\n\n    @Override\n    public Admin getAdminByUsername(String username) {\n        Admin admin = adminDao.load(new Admin(null, username));\n        return admin;\n    }\n\n    @Override\n    public List<Admin> getAdminAll() {\n        return adminDao.loadAll();\n    }\n\n    @Override\n    public Page<Admin> findAdminAll(int pageNum, int pageSize) {\n        PageHelper.startPage(pageNum, pageSize);\n        List<Admin> admins = adminDao.loadAll();\n\n        try {\n            PageInfo<Admin> adminPageInfo = new PageInfo<>(admins);\n            Page<Admin> adminPage = new Page<>();\n            BeanUtils.copyProperties(adminPage, adminPageInfo);\n            adminPage.setList(admins);\n            return adminPage;\n        } catch (IllegalAccessException | InvocationTargetException e) {\n            e.printStackTrace();\n        }\n        return null;\n    }\n\n    @Override\n    public Admin getAdminById(String id) {\n        return adminDao.load(new Admin(id, null));\n    }\n\n    @Override\n    public void updateAdminLoginInfo(Admin admin) {\n        Admin update = new Admin();\n        update.setId(admin.getId());\n        // 更新上次登录信息\n\n        if(admin.getLoginIp() != null) update.setOldLoginIp(admin.getLoginIp());\n        if(admin.getLoginDate() != null) update.setOldLoginDate(admin.getLoginDate());\n        // 更新这次登录信息\n        update.setLoginIp(admin.getNewLoginIp());\n        update.setLoginDate(new Date());\n        update.preUpdate();\n        adminDao.update(update);\n    }\n\n    @Override\n    public void updateAdminInfo(Admin admin) {\n        admin.preUpdate();\n        adminDao.update(admin);\n    }\n\n    @Override\n    public void updatePasswdById(String id, String newPasswd) {\n        Admin updatePwd = new Admin();\n        updatePwd.setId(id);\n        updatePwd.setPassword(newPasswd);\n        updatePwd.preUpdate();\n        adminDao.update(updatePwd);\n    }\n\n    @Override\n    public List<Role> getAllRoles() {\n        return roleDao.loadAll();\n    }\n\n    @Override\n    public List<Role> getRolesByAdminId(String aid) {\n        return roleDao.loadByAdminId(aid);\n    }\n\n    @Override\n    public List<Permission> getAllPermissions() {\n        return permissionDao.loadAll();\n    }\n    @Override\n    public List<Permission> getPermissionByAdminId(String aid) {\n        return permissionDao.loadByAdminId(aid);\n    }\n\n\n}\n"
  },
  {
    "path": "weixin-service-admin/src/main/resources/log4j.properties",
    "content": "#log4j.rootLogger=DEBUG,CONSOLE,FILE\nlog4j.rootLogger=DEBUG,FILE\nlog4j.appender.Threshold=ERROR\n\n#log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender\n#log4j.appender.CONSOLE.Encoding=UTF-8\n#log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout\n#log4j.appender.CONSOLE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [service-admin] %p [%t] %c-<%L> %m%n\n\nlog4j.appender.FILE=org.apache.log4j.RollingFileAppender\nlog4j.appender.FILE.Encoding=UTF-8\nlog4j.appender.FILE.File=logs/service-admin.log\nlog4j.appender.FILE.MaxFileSize=4000KB\nlog4j.appender.FILE.MaxBackupIndex=10\nlog4j.appender.FILE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [service-admin] %p [%t] %c-<%L> %m%n"
  },
  {
    "path": "weixin-service-admin/src/main/resources/mybatis/mapper/AdminMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.admin.dao.AdminDaoMapper\">\n  <sql id=\"tableName\">admin</sql>\n  <sql id=\"columns\">\n    a.id,a.username,a.password,a.realname,a.mobile,a.photo,a.login_ip,a.login_date,\n    a.old_login_ip,a.old_login_date,a.remarks,a.create_date,a.update_date,a.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,username,password,realname,mobile,photo,login_ip,login_date,\n    old_login_ip,old_login_date,remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"adminIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"username != null and username != ''\">username=#{username},</if>\n    <if test=\"password != null and password != ''\">password=#{password},</if>\n    <if test=\"realname != null and realname != ''\">realname=#{realname},</if>\n    <if test=\"mobile != null and mobile != ''\">mobile=#{mobile},</if>\n    <if test=\"photo != null and photo != ''\">photo=#{photo},</if>\n    <if test=\"loginIp != null and loginIp != ''\">login_ip=#{loginIp},</if>\n    <if test=\"loginDate != null and loginDate != ''\">login_date=#{loginDate},</if>\n    <if test=\"oldLoginIp != null and oldLoginIp != ''\">old_login_ip=#{oldLoginIp},</if>\n    <if test=\"oldLoginDate != null and oldLoginDate != ''\">old_login_date=#{oldLoginDate},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"adminSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS a\n  </sql>\n\n  <sql id=\"adminWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <if test=\"username != null and username != ''\">\n        username = #{username}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"adminUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"adminIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <!-- 根据用户ID或用户名 -->\n  <select id=\"load\" parameterType=\"String\" resultType=\"Admin\">\n    <include refid=\"adminSelector\"/>\n    <include refid=\"adminWhere\"/>\n  </select>\n  <!-- 获取全部用户信息 -->\n  <select id=\"loadAll\" resultType=\"Admin\">\n    <include refid=\"adminSelector\"/>\n    <include refid=\"adminWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"Admin\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"adminUpdate\"/>\n    <include refid=\"adminWhere\"/>\n  </update>\n  <!-- 插入新管理员 -->\n  <insert id=\"save\" parameterType=\"Admin\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    <include refid=\"adminIf\"/>\n  </insert>\n\n  <!--&lt;!&ndash; 根据用户名获取用户 &ndash;&gt;-->\n  <!--<select id=\"loadUserByUsername\" parameterType=\"String\" resultType=\"Admin\">-->\n  <!--select-->\n  <!--<include refid=\"adminColumns\"/>-->\n  <!--from-->\n  <!--<include refid=\"tableName\"/> AS a-->\n  <!--WHERE-->\n  <!--a.username=#{username}-->\n  <!--</select>-->\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-admin/src/main/resources/mybatis/mapper/AdminRoleMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.admin.dao.AdminRoleDaoMapper\">\n  <sql id=\"tableName\">admin_role</sql>\n  <sql id=\"insertColumns\">\n    admin_id,role_id\n  </sql>\n  <sql id=\"ifCondition\">\n    <if test=\"admin_id != null and admin_id != ''\">admin_id=#{admin_id},</if>\n    <if test=\"role_id != null and role_id != ''\">role_id=#{role_id},</if>\n  </sql>\n\n  <sql id=\"whereCondition\">\n    <where>\n      <if test=\"admin_id != null and admin_id != ''\">\n        admin_id = #{admin_id}\n      </if>\n      <if test=\"role_id != null and role_id != ''\">\n        role_id = #{role_id}\n      </if>\n    </where>\n  </sql>\n\n  <sql id=\"updateCondition\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"ifCondition\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"AdminRole\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"updateCondition\"/>\n    <include refid=\"whereCondition\"/>\n  </update>\n\n  <!-- 插入新数据 -->\n  <insert id=\"save\" parameterType=\"AdminRole\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    <include refid=\"ifCondition\"/>\n  </insert>\n\n  <!-- 批量插入 -->\n  <insert id=\"saves\" parameterType=\"list\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    <foreach collection=\"roles\" item=\"role\" index=\"index\" open=\"(\" separator=\",\" close=\")\">\n      #{role.adminId},#{role.roleId}\n    </foreach>\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-admin/src/main/resources/mybatis/mapper/PermissionMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.admin.dao.PermissionDaoMapper\">\n  <sql id=\"tableName\">permission</sql>\n  <sql id=\"columns\">\n    p.id,p.name,p.precode,p.remarks,p.create_date,p.update_date,p.status\n  </sql>\n  <sql id=\"ifCondition\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"precode != null and precode != ''\">precode=#{precode},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate}</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"selector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS p\n  </sql>\n\n  <sql id=\"whereCondition\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status = 'NORMAL'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"updateCondition\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"ifCondition\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n  <select id=\"load\" parameterType=\"String\" resultType=\"Permission\">\n    <include refid=\"selector\"/>\n    <include refid=\"whereCondition\"/>\n  </select>\n\n  <select id=\"loadAll\" resultType=\"Permission\">\n    <include refid=\"selector\"/>\n    <include refid=\"whereCondition\"/>\n  </select>\n\n  <update id=\"update\" parameterType=\"Permission\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"updateCondition\"/>\n    <include refid=\"whereCondition\"/>\n  </update>\n\n  <!-- 根据管理员ID获取该管理员的权限 -->\n  <select id=\"loadByAdminId\" parameterType=\"String\" resultType=\"Permission\">\n    <include refid=\"selector\"/>\n    JOIN role_permission rp ON rp.permission_id = p.id\n    JOIN role r ON r.id = rp.role_id\n    JOIN admin_role ar ON ar.role_id = r.id\n    JOIN admin a ON a.id = ar.user_id\n    WHERE a.id = #{adminId} AND p.status = 'NORMAL' AND r.status = 'NORMAL' AND a.status = 'NORMAL'\n  </select>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-admin/src/main/resources/mybatis/mapper/RoleMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.admin.dao.RoleDaoMapper\">\n  <sql id=\"tableName\">role</sql>\n  <sql id=\"columns\">\n    r.id,r.name,r.enname,r.remarks,r.create_date,r.update_date,r.status\n  </sql>\n  <sql id=\"ifCondition\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"enname != null and enname != ''\">enname=#{enname},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate}</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"selector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/>\n    AS r\n  </sql>\n\n  <sql id=\"whereCondition\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status = 'NORMAL'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"updateCondition\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"ifCondition\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n  <select id=\"load\" parameterType=\"String\" resultType=\"Role\">\n    <include refid=\"selector\"/>\n    <include refid=\"whereCondition\"/>\n  </select>\n\n  <select id=\"loadAll\" resultType=\"Role\">\n    <include refid=\"selector\"/>\n    <include refid=\"whereCondition\"/>\n  </select>\n\n  <update id=\"update\" parameterType=\"Role\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"updateCondition\"/>\n    <include refid=\"whereCondition\"/>\n  </update>\n\n  <!-- 根据管理员ID获取该管理员的角色 -->\n  <select id=\"loadByAdminId\" parameterType=\"String\" resultType=\"Role\">\n    <include refid=\"selector\"/>\n    JOIN admin_role ar ON ar.role_id = r.id\n    JOIN admin a ON a.id = ar.admin_id\n    WHERE a.id = #{adminId}\n    AND r.status = 'NORMAL'\n    AND a.status = 'NORMAL'\n  </select>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-admin/src/main/resources/mybatis/mybatis-config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE configuration\n        PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-config.dtd\">\n\n<configuration>\n  <settings>\n    <!-- 开启字段名和属性名驼峰匹配 -->\n    <setting name=\"mapUnderscoreToCamelCase\" value=\"true\"/>\n    <!-- 全局启用或禁用延迟加载。当禁用时，所有关联对象都会即时加载。 -->\n    <setting name=\"lazyLoadingEnabled\" value=\"true\"/>\n    <!-- 当启用时，有延迟加载属性的对象在被调用时将会完全加载任意属性。否则，每种属性将会按需要加载。 -->\n    <setting name=\"aggressiveLazyLoading\" value=\"true\"/>\n  </settings>\n  <plugins>\n    <plugin interceptor=\"com.github.pagehelper.PageHelper\">\n\n      <property name=\"dialect\" value=\"mysql\"/>\n\n    </plugin>\n  </plugins>\n</configuration>"
  },
  {
    "path": "weixin-service-admin/src/main/resources/spring/spring-context.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:p=\"http://www.springframework.org/schema/p\"\n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/context\n    http://www.springframework.org/schema/context/spring-context-3.2.xsd\">\n\n\t<!-- 引入配置文件 -->\n\t<context:property-placeholder location=\"classpath:system.properties,classpath:jdbc.properties\" />\n\n\t<!-- 打开Spring的Annotation支持 -->\n\t<context:annotation-config />\n\n\n\t<!-- 扫描注入  -->\n\t<context:component-scan base-package=\"com.cheng.weixin.service.admin\" />\n\n\t<import resource=\"classpath:spring/spring-dubbo-provider.xml\"/>\n\t<import resource=\"classpath:spring/spring-mybatis.xml\"/>\n\n</beans>"
  },
  {
    "path": "weixin-service-admin/src/main/resources/spring/spring-dubbo-provider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd\n          http://code.alibabatech.com/schema/dubbo\n          http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n  <dubbo:application name=\"weixin-service-admin\"/>\n  <dubbo:registry id=\"zk1\" address=\"${weixin.dubbo.reistry.address}\" protocol=\"${weixin.dubbo.reistry.protocol}\"/> <!-- 注意要关闭防火墙 -->\n  <dubbo:protocol id=\"mydubbo\" name=\"dubbo\" host=\"${weixin.dubbo.host.address}\" port=\"${weixin.dubbo.admin.service.port}\"/>\n  <dubbo:provider registry=\"zk1\" protocol=\"mydubbo\"/>\n\n  <dubbo:service interface=\"com.cheng.weixin.rpc.admin.service.RpcAdminService\" ref=\"adminService\" version=\"1.0\"/>\n\n</beans>\n"
  },
  {
    "path": "weixin-service-admin/src/main/resources/spring/spring-mybatis.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\t\t\t xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t\t xmlns:p=\"http://www.springframework.org/schema/p\"\n\t\t\t xmlns:aop=\"http://www.springframework.org/schema/aop\"\n\t\t\t xmlns:tx=\"http://www.springframework.org/schema/tx\"\n\t\t\t xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans.xsd\n    http://www.springframework.org/schema/tx\n    http://www.springframework.org/schema/tx/spring-tx.xsd\n    http://www.springframework.org/schema/aop\n    http://www.springframework.org/schema/aop/spring-aop.xsd\">\n\n\t<bean id=\"dataSource\" class=\"com.alibaba.druid.pool.DruidDataSource\" init-method=\"init\" destroy-method=\"close\">\n\t  <property name=\"driverClassName\" value=\"${jdbc.driverClassName}\"/>\n\t  <property name=\"url\" value=\"${jdbc.url}\"/>\n\t  <property name=\"username\" value=\"${jdbc.username}\"/>\n\t  <property name=\"password\" value=\"${jdbc.password}\"/>\n\t  <!-- 连接池最大使用连接数 -->\n\t  <property name=\"maxActive\" value=\"${jdbc.maxActive}\"/>\n\t  <!-- 初始化连接大小 -->\n\t  <property name=\"initialSize\" value=\"${jdbc.initialSize}\"/>\n\t  <!-- 获取连接最大等待时间 -->\n\t  <property name=\"maxWait\" value=\"${jdbc.maxWait}\"/>\n\t  <!-- 连接池最大空闲 -->\n\t  <!--  property name=\"maxIdle\" value=\"${jdbc.maxIdle}\"/>-->\n\t  <!-- 连接池最小空闲 -->\n\t  <property name=\"minIdle\" value=\"${jdbc.minIdle}\"/>\n\t  <!-- 自动清除无用连接 -->\n\t  <property name=\"removeAbandoned\" value=\"${jdbc.removeAbandoned}\"/>\n\t  <!-- 清除无用连接的等待时间 -->\n\t  <property name=\"removeAbandonedTimeout\" value=\"${jdbc.removeAbandonedTimeout}\"/>\n\t  <!-- 连接属性 -->\n\t  <property name=\"connectionProperties\" value=\"${jdbc.connectionProperties}\"/>\n\t</bean>\n\n  <!-- 注入SQLSession -->\n  <bean id=\"sqlSession\" class=\"org.mybatis.spring.SqlSessionTemplate\" scope=\"prototype\">\n    <constructor-arg index=\"0\" ref=\"sqlSessionFactory\"/>\n  </bean>\n\n\t<!-- mybatis配置 -->\n\t<bean id=\"sqlSessionFactory\" class=\"org.mybatis.spring.SqlSessionFactoryBean\"\n\t\tp:dataSource-ref=\"dataSource\"\n    p:configLocation=\"classpath:/mybatis/mybatis-config.xml\"\n\t\tp:typeAliasesPackage=\"com.cheng.weixin.rpc.admin.entity\"\n\t\tp:mapperLocations=\"classpath:/mybatis/mapper/*.xml\" />\n\n\t<!-- spring与mybatis整合配置，扫描所有dao -->\n\t<bean class=\"org.mybatis.spring.mapper.MapperScannerConfigurer\"\n\t\tp:basePackage=\"com.cheng.weixin.service.admin.dao\"\n\t\tp:sqlSessionFactoryBeanName=\"sqlSessionFactory\" />\n\n\t<!-- 对数据源进行事务管理 -->\n\t<bean id=\"transactionManager\" class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\"\n\t\tp:dataSource-ref=\"dataSource\" />\n\t<!-- 通知 -->\n\t<tx:advice id=\"txAdvice\" transaction-manager=\"transactionManager\">\n\t  <!-- 传播行为 -->\n\t  <tx:attributes>\n\t  \t<tx:method name=\"add*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"update*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"delete*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"get*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  \t<tx:method name=\"find*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  </tx:attributes>\n\t</tx:advice>\t\n\t<!-- 哪些类的哪些方法使用事务 -->\n\t<aop:config>\n\t  <aop:advisor advice-ref=\"txAdvice\" pointcut=\"execution(* com.cheng.weixin.service.admin.service.*.*(..))\"/>\n\t</aop:config>\n\t\t\n\t<!-- 开启事务注解驱动 \n    <tx:annotation-driven />\n    -->\n</beans>"
  },
  {
    "path": "weixin-service-admin/src/test/java/com/cheng/shrio/passwd/TestPssWd.java",
    "content": "package com.cheng.shrio.passwd;\n\n\n/**\n * Desc:\n * Author: Cheng\n * Date: 2016/1/29 0029\n */\npublic class TestPssWd {\n\n    //public static void main(String[] args) {\n    //    System.out.println(new Md5Hash(\"cheng123\",\"123\").toHex());\n    //}\n\n    public static void main(String[] args) {\n//\t\tentryptPassword(\"cheng123\");\n//        System.out.println(SystemUtils.validatePassword(\"cheng123\", \"5cdefe986d7fa0d363930c4062b776bd30a33a3cec47a34291a8bd27\"));\n    }\n}\n"
  },
  {
    "path": "weixin-service-cart/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-service-cart</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>${parent.groupId}</groupId>\n      <artifactId>weixin-common</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${parent.groupId}</groupId>\n      <artifactId>weixin-common-config</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-rpc-cart</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${parent.groupId}</groupId>\n      <artifactId>weixin-rpc-redis</artifactId>\n    </dependency>\n\n    <dependency>\n      <groupId>junit</groupId>\n      <artifactId>junit</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>log4j</groupId>\n      <artifactId>log4j</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-log4j12</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-logging</groupId>\n      <artifactId>commons-logging</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-beanutils</groupId>\n      <artifactId>commons-beanutils</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.github.pagehelper</groupId>\n      <artifactId>pagehelper</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>javax.servlet</groupId>\n      <artifactId>javax.servlet-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>mysql</groupId>\n      <artifactId>mysql-connector-java</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>druid</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjrt</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjweaver</artifactId>\n    </dependency>\n    <!-- Dubbo Start -->\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>dubbo</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.101tec</groupId>\n      <artifactId>zkclient</artifactId>\n    </dependency>\n    <!-- Dubbo End -->\n    <!-- Spring begin -->\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context-support</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-core</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-beans</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-aop</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-orm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-web</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-jdbc</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-oxm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-test</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-tx</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-expression</artifactId>\n    </dependency>\n    <!-- Spring end -->\n    <!-- MyBatis begin -->\n    <dependency>\n      <groupId>org.mybatis</groupId>\n      <artifactId>mybatis</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.mybatis</groupId>\n      <artifactId>mybatis-spring</artifactId>\n    </dependency>\n    <!-- MyBatis end -->\n  </dependencies>\n\n  <build>\n    <resources>\n      <resource>\n        <targetPath>${project.build.directory}/classes</targetPath>\n        <directory>src/main/resources</directory>\n        <filtering>true</filtering>\n        <includes>\n          <include>**/*.xml</include>\n          <include>**/*.properties</include>\n        </includes>\n        <excludes>\n          <exclude>rebel.xml</exclude>\n        </excludes>\n      </resource>\n      <resource>\n        <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>\n        <directory>src/main/resources/spring</directory>\n        <!--<directory>src/main/resources</directory>-->\n        <filtering>true</filtering>\n        <includes>\n          <include>spring-context.xml</include>\n        </includes>\n      </resource>\n    </resources>\n    <plugins>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-compiler-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-source-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-jar-plugin</artifactId>\n        <configuration>\n          <classesDirectory>target/classes/</classesDirectory>\n          <archive>\n            <!--生成的jar中，不要包含pom.xml和pom.properties这两个文件 -->\n            <addMavenDescriptor>false</addMavenDescriptor>\n            <manifest>\n              <mainClass>com.alibaba.dubbo.container.Main</mainClass>\n              <!-- 打包时MANIFEST.MF文件不记录时间版本 -->\n              <useUniqueVersions>false</useUniqueVersions>\n              <addClasspath>true</addClasspath>\n              <classpathPrefix>lib/</classpathPrefix>\n            </manifest>\n            <manifestEntries>\n              <Class-Path>.</Class-Path>\n            </manifestEntries>\n          </archive>\n        </configuration>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-dependency-plugin</artifactId>\n        <executions>\n          <execution>\n            <id>copy-dependencies</id>\n            <phase>package</phase>\n            <goals>\n              <goal>copy-dependencies</goal>\n            </goals>\n            <configuration>\n              <type>jar</type>\n              <includeTypes>jar</includeTypes>\n              <!--<useUniqueVersions>false</useUniqueVersions>-->\n              <outputDirectory>\n                ${project.build.directory}/lib\n              </outputDirectory>\n            </configuration>\n          </execution>\n        </executions>\n      </plugin>\n      <plugin>\n        <groupId>org.zeroturnaround</groupId>\n        <artifactId>jrebel-maven-plugin</artifactId>\n      </plugin>\n    </plugins>\n  </build>\n</project>"
  },
  {
    "path": "weixin-service-cart/shell/service-cart.sh",
    "content": "#!/bin/sh\n\n## java env\nexport JAVA_HOME=/usr/local/java/jdk1.7.0_45\nexport JRE_HOME=$JAVA_HOME/jre\n\n## service name\nAPP_NAME=cart\n\nSERVICE_DIR=/usr/local/cheng/service/$APP_NAME\nSERVICE_NAME=weixin-service-$APP_NAME-1.0-SNAPSHOT\nJAR_NAME=$SERVICE_NAME\\.jar\nPID=$SERVICE_NAME\\.pid\n\ncd $SERVICE_DIR\n\ncase \"$1\" in\n\n    start)\n        nohup $JRE_HOME/bin/java -Xms256m -Xmx512m -jar $JAR_NAME >/dev/null 2>&1 &\n        echo $! > $SERVICE_DIR/$PID\n        echo \"=== start $SERVICE_NAME\"\n        ;;\n\n    stop)\n        kill `cat $SERVICE_DIR/$PID`\n        rm -rf $SERVICE_DIR/$PID\n        echo \"=== stop $SERVICE_NAME\"\n\n        sleep 5\n\n        P_ID=`ps -ef | grep -w \"$SERVICE_NAME\" | grep -v \"grep\" | awk '{print $2}'`\n        if [ \"$P_ID\" == \"\" ]; then\n            echo \"=== $SERVICE_NAME process not exists or stop success\"\n        else\n            echo \"=== $SERVICE_NAME process pid is:$P_ID\"\n            echo \"=== begin kill $SERVICE_NAME process, pid is:$P_ID\"\n            kill -9 $P_ID\n        fi\n        ;;\n\n    restart)\n        $0 stop\n        sleep 2\n        $0 start\n        echo \"=== restart $SERVICE_NAME\"\n        ;;\n\n    *)\n        ## restart\n        $0 stop\n        sleep 2\n        $0 start\n        ;;\n\nesac\nexit 0\n\n"
  },
  {
    "path": "weixin-service-cart/src/main/java/com/cheng/weixin/service/cart/service/CartService.java",
    "content": "package com.cheng.weixin.service.cart.service;\n\nimport com.cheng.weixin.common.constant.Constant;\nimport com.cheng.weixin.common.utils.StringUtils;\nimport com.cheng.weixin.rpc.cart.entity.CartInfo;\nimport com.cheng.weixin.rpc.cart.entity.ShoppingCart;\nimport com.cheng.weixin.rpc.cart.model.ProductModel;\nimport com.cheng.weixin.rpc.cart.service.RpcCartService;\nimport com.cheng.weixin.rpc.redis.service.RpcRedisService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.io.Serializable;\nimport java.util.*;\n\n/**\n * Desc: 购物车\n * Author: cheng\n * Date: 2016/6/28\n */\n@Service(\"cartService\")\npublic class CartService implements RpcCartService {\n\n    @Autowired\n    private RpcRedisService redisService;\n\n    @Override\n    public Long addProductCount(String userId, String productId) {\n        changeChooseStatus(userId, productId);\n        return redisService.increase(getCart(userId), getProductFlag(userId, productId));\n    }\n\n    @Override\n    public Long subProductCount(String userId, String productId) {\n        changeChooseStatus(userId, productId);\n        return redisService.decrease(getCart(userId), getProductFlag(userId, productId));\n    }\n\n\n    @Override\n    public Set<String> getAllProductIds(String userId) {\n        Set<String> allStatusProductIds = redisService.getFields(getCart(userId));\n        Set<String> allProductIds = new HashSet<>();\n        for (String productId : allStatusProductIds) {\n            if (productId.startsWith(Constant.CHOOSE)) {\n                allProductIds.add(StringUtils.replace(productId, Constant.CHOOSE, \"\"));\n            }else if (productId.startsWith(Constant.NO_CHOOSE)) {\n                allProductIds.add(StringUtils.replace(productId, Constant.NO_CHOOSE, \"\"));\n            }\n        }\n        return allProductIds;\n    }\n\n    @Override\n    public Set<String> getChooseProductIds(String userId) {\n        Set<String> allProductIds = getAllProductIds(userId);\n        Set<String> productIds = new HashSet<>();\n        for (String productId : allProductIds) {\n            if (redisService.exists(getCart(userId), chooseProduct(productId))) {\n                productIds.add(productId);\n            }\n        }\n        return productIds;\n    }\n\n    @Override\n    public Long getCounts(String userId, String productId) {\n        Object counts = redisService.getValueByKeyANdField(getCart(userId), getProductFlag(userId, productId));\n        return (Long) counts;\n    }\n\n    @Override\n    public void deleteProduct(String userId, String productId) {\n        redisService.deleteField(getCart(userId), getProductFlag(userId, productId));\n    }\n\n    @Override\n    public ShoppingCart getShoppingCart(String accessId) {\n        Map<Serializable, Object> allProduct = redisService.getEntries(getCart(accessId));\n        ShoppingCart shoppingCart = new ShoppingCart();\n        if (!allProduct.isEmpty()) {\n            List<CartInfo> cartInfos = new ArrayList<>();\n            Set<Serializable> fields = allProduct.keySet();\n            for (Serializable itemName : fields) {\n                CartInfo cart = new CartInfo();\n                cart.setAccessId(accessId);\n                cart.setProductId(itemName.toString().split(\"_\")[1]);\n                cart.setQuantity(Integer.parseInt(allProduct.get(itemName).toString()));\n                String isChoose = itemName.toString().split(\"_\")[0];\n                cart.setChoose(\"TRUE\".equals(isChoose));\n                cartInfos.add(cart);\n            }\n            shoppingCart.setCartInfos(cartInfos);\n            shoppingCart.setAccessId(accessId);\n            shoppingCart.setTotalQuantity(cartInfos.size());\n        }\n        return shoppingCart;\n    }\n\n    @Override\n    public void addProduct(String userId, String productId, Long count) {\n        deleteProduct(userId, productId);\n        redisService.put(getCart(userId), getProductFlag(userId, productId), count);\n    }\n\n    @Override\n    public boolean changeStatus(String userId, String productId) {\n        if (redisService.exists(getCart(userId), chooseProduct(productId))) {\n            Long counts = (Long) redisService.getValueByKeyANdField(getCart(userId), chooseProduct(productId));\n            redisService.deleteField(getCart(userId), chooseProduct(productId));\n            redisService.put(getCart(userId), noChooseProduct(productId), counts);\n            return false;\n        }else if (redisService.exists(getCart(userId), noChooseProduct(productId))) {\n            Long counts = (Long) redisService.getValueByKeyANdField(getCart(userId), noChooseProduct(productId));\n            redisService.deleteField(getCart(userId),noChooseProduct(productId));\n            redisService.put(getCart(userId), chooseProduct(productId), counts);\n            return true;\n        }\n        return false;\n    }\n\n    @Override\n    public List<ProductModel> getChooseProductInfo(String userId) {\n        Map<Serializable, Object> map = redisService.getEntries(getCart(userId));\n\n        List<ProductModel> products = new ArrayList<>();\n        Set<Serializable> fields = map.keySet();\n        for (Serializable item : fields) {\n            if (item.toString().startsWith(Constant.CHOOSE)) {\n                ProductModel product = new ProductModel();\n                product.setId(StringUtils.remove(item.toString(), Constant.CHOOSE));\n                product.setCount(Integer.parseInt(map.get(item).toString()));\n                products.add(product);\n            }\n        }\n        return products;\n    }\n\n    @Override\n    public void deletedChooseProduct(String userId) {\n        Map<Serializable, Object> map = redisService.getEntries(getCart(userId));\n        Set<Serializable> fields = map.keySet();\n        for (Serializable item : fields) {\n            if (item.toString().startsWith(Constant.CHOOSE)) {\n                redisService.deleteField(getCart(userId), item.toString());\n            }\n        }\n    }\n\n    @Override\n    public void chooseAllProduct(String userId) {\n        Set<String> allProductIds = getAllProductIds(userId);\n        for (String productId : allProductIds) {\n            changeChooseStatus(userId, productId);\n        }\n    }\n\n    @Override\n    public void unchooseAllProduct(String userId) {\n        Set<String> allProductIds = getAllProductIds(userId);\n        for (String productId : allProductIds) {\n            changeUnchooseStatus(userId, productId);\n        }\n    }\n\n    @Override\n    public boolean exists(String userId, String productId) {\n        if (redisService.exists(getCart(userId), chooseProduct(productId))\n                || redisService.exists(getCart(userId), noChooseProduct(productId))) {\n            return true;\n        }\n        return false;\n    }\n\n    @Override\n    public void changeChooseStatus(String userId, String productId) {\n        if (redisService.exists(getCart(userId), noChooseProduct(productId))) {\n            Long counts = (Long) redisService.getValueByKeyANdField(getCart(userId), noChooseProduct(productId));\n            redisService.deleteField(getCart(userId),noChooseProduct(productId));\n            redisService.put(getCart(userId), chooseProduct(productId), counts);\n        }\n    }\n\n    @Override\n    public void changeUnchooseStatus(String userId, String productId) {\n        if (redisService.exists(getCart(userId), chooseProduct(productId))) {\n            Long counts = (Long) redisService.getValueByKeyANdField(getCart(userId), chooseProduct(productId));\n            redisService.deleteField(getCart(userId),chooseProduct(productId));\n            redisService.put(getCart(userId), noChooseProduct(productId), counts);\n        }\n    }\n\n    /**\n     * 获取当前用户购物车的标识\n     * @param userId\n     * @return\n     */\n    private String getCart(String userId) {\n        return Constant.CART+userId;\n    }\n\n    private String chooseProduct(String productId) {\n        return Constant.CHOOSE+productId;\n    }\n    private String noChooseProduct(String productId) {\n        return Constant.NO_CHOOSE+productId;\n    }\n\n    private String getProductFlag(String userId, String productId) {\n        if (redisService.exists(getCart(userId), chooseProduct(productId))) {\n            return chooseProduct(productId);\n        }else if (redisService.exists(getCart(userId), noChooseProduct(productId))) {\n            return noChooseProduct(productId);\n        } else {\n            return chooseProduct(productId);\n        }\n    }\n}\n"
  },
  {
    "path": "weixin-service-cart/src/main/resources/log4j.properties",
    "content": "log4j.rootLogger=DEBUG,CONSOLE,FILE\nlog4j.appender.Threshold=ERROR\n\n#log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender\n#log4j.appender.CONSOLE.Encoding=UTF-8\n#log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout\n#log4j.appender.CONSOLE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [service-cart] %p [%t] %c-<%L> %m%n\n\nlog4j.appender.FILE=org.apache.log4j.RollingFileAppender\nlog4j.appender.FILE.Encoding=UTF-8\nlog4j.appender.FILE.File=logs/service-cart.log\nlog4j.appender.FILE.MaxFileSize=4000KB\nlog4j.appender.FILE.MaxBackupIndex=10\nlog4j.appender.FILE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [service-cart] %p [%t] %c-<%L> %m%n\n\nlog4j.logger.org.apache.zookeeper.ClientCnxn=INFO"
  },
  {
    "path": "weixin-service-cart/src/main/resources/spring/spring-context.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/context\n    http://www.springframework.org/schema/context/spring-context-3.2.xsd\">\n\n\t<!-- 引入配置文件 -->\n\t<context:property-placeholder location=\"classpath:system.properties\" />\n\n\t<!-- 打开Spring的Annotation支持 -->\n\t<context:annotation-config />\n\n\t<!-- 扫描注入  -->\n\t<context:component-scan base-package=\"com.cheng.weixin.service.cart.service\" />\n\n\t<import resource=\"classpath:spring/spring-dubbo-provider.xml\"/>\n\t<import resource=\"classpath:spring/spring-dubbo-consumer.xml\"/>\n\n</beans>"
  },
  {
    "path": "weixin-service-cart/src/main/resources/spring/spring-dubbo-consumer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd\n          http://code.alibabatech.com/schema/dubbo\n          http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n  <dubbo:consumer registry=\"zk1\"/>\n\n  <dubbo:reference id=\"redisService\" interface=\"com.cheng.weixin.rpc.redis.service.RpcRedisService\"\n                   check=\"false\" timeout=\"5000\" version=\"1.0\"/>\n</beans>\n"
  },
  {
    "path": "weixin-service-cart/src/main/resources/spring/spring-dubbo-provider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd\n          http://code.alibabatech.com/schema/dubbo\n          http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n  <dubbo:application name=\"weixin-service-cart\"/>\n  <dubbo:registry id=\"zk1\" address=\"${weixin.dubbo.reistry.address}\" protocol=\"${weixin.dubbo.reistry.protocol}\"/> <!-- 注意要关闭防火墙 -->\n  <dubbo:protocol id=\"mydubbo\" name=\"dubbo\" host=\"${weixin.dubbo.host.address}\" port=\"${weixin.dubbo.cart.service.port}\"/>\n  <dubbo:provider registry=\"zk1\" protocol=\"mydubbo\"/>\n\n  <dubbo:service interface=\"com.cheng.weixin.rpc.cart.service.RpcCartService\" ref=\"cartService\" version=\"1.0\"/>\n\n</beans>\n"
  },
  {
    "path": "weixin-service-cart/src/test/java/com/cheng/weixin/cart/TestAll.java",
    "content": "package com.cheng.weixin.cart;\n\nimport org.junit.Test;\n\n/**\n * Desc:\n * Author: hp\n * Date: 2016/9/20\n */\npublic class TestAll {\n    @Test\n    public void test01() {\n        System.out.println(\"TRUE_1\".split(\"_\")[0]);\n    }\n\n}\n"
  },
  {
    "path": "weixin-service-cart/src/test/java/com/cheng/weixin/cart/TestCart.java",
    "content": "package com.cheng.weixin.cart;\n\nimport com.cheng.weixin.rpc.cart.entity.ShoppingCart;\nimport com.cheng.weixin.rpc.cart.model.ProductModel;\nimport com.cheng.weixin.rpc.cart.service.RpcCartService;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.test.context.ContextConfiguration;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\n\nimport java.util.List;\n\n/**\n * Desc:\n * Author: 光灿\n * Date: 2016/7/2\n */\n@RunWith(SpringJUnit4ClassRunner.class)\n@ContextConfiguration(locations = {\"classpath*:spring-context.xml\"})\npublic class TestCart {\n    @Autowired\n    private RpcCartService cartService;\n\n    @Test\n    public void testAdd() {\n        Long data = cartService.addProductCount(\"1\", \"1\");\n        System.out.println(\"testAdd======> \"+data);\n    }\n\n    @Test\n    public void testGet() {\n        Long data = cartService.getCounts(\"1\", \"1\");\n        System.out.println(\"testGet======> \"+data);\n    }\n\n    @Test\n    public void testGetAll() {\n        ShoppingCart shoppingCart = cartService.getShoppingCart(\"1\");\n        System.out.println(shoppingCart);\n    }\n\n    @Test\n    public void testDelete() {\n        cartService.deleteProduct(\"1\", \"1\");\n    }\n    @Test\n    public void testGetChooseProductInfo() {\n        List<ProductModel> productModels = cartService.getChooseProductInfo(\"1\");\n        System.out.println(productModels);\n    }\n\n    @Test\n    public void testchangeStatus() {\n        boolean falg = cartService.changeStatus(\"1\", \"1\");\n        System.out.println(\"=====> \"+falg);\n    }\n\n\n\n    @Test\n    public void testUnChooseAllProduct() {\n        cartService.unchooseAllProduct(\"1\");\n    }\n\n    @Test\n    public void testChooseAllProduct() {\n        cartService.chooseAllProduct(\"1\");\n    }\n}\n"
  },
  {
    "path": "weixin-service-cart/src/test/resources/log4j.properties",
    "content": "log4j.rootLogger=DEBUG,CONSOLE\nlog4j.appender.Threshold=ERROR\n\nlog4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender\nlog4j.appender.CONSOLE.Encoding=UTF-8\nlog4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.CONSOLE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [service-cart] %p [%t] %c-<%L> %m%n\n"
  },
  {
    "path": "weixin-service-cart/src/test/resources/spring-context.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/context\n    http://www.springframework.org/schema/context/spring-context-3.2.xsd\">\n\n\t<!-- 打开Spring的Annotation支持 -->\n\t<context:annotation-config />\n\n\t<!-- 扫描注入  -->\n\t<context:component-scan base-package=\"com.cheng.weixin.service.cart.service\" />\n\n\t<import resource=\"classpath:spring-dubbo-consumer.xml\"/>\n\n</beans>"
  },
  {
    "path": "weixin-service-cart/src/test/resources/spring-dubbo-consumer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd\n          http://code.alibabatech.com/schema/dubbo\n          http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n  <dubbo:application name=\"cheng-cart-consumer-test\"/>\n\n  <dubbo:registry id=\"zk1\" address=\"120.27.53.171:2181\" protocol=\"zookeeper\"/> <!-- 注意要关闭防火墙 -->\n\n  <dubbo:consumer registry=\"zk1\"/>\n\n  <dubbo:reference id=\"redisService\" interface=\"com.cheng.weixin.rpc.redis.service.RpcRedisService\"\n                   check=\"false\" timeout=\"5000\" version=\"1.0\"/>\n</beans>\n"
  },
  {
    "path": "weixin-service-comment/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-service-comment</artifactId>\n  <dependencies>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-config</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-service</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-rpc-comment</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>junit</groupId>\n      <artifactId>junit</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>log4j</groupId>\n      <artifactId>log4j</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-log4j12</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-logging</groupId>\n      <artifactId>commons-logging</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-beanutils</groupId>\n      <artifactId>commons-beanutils</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>fastjson</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.github.pagehelper</groupId>\n      <artifactId>pagehelper</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>javax.servlet</groupId>\n      <artifactId>javax.servlet-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>mysql</groupId>\n      <artifactId>mysql-connector-java</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>druid</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjrt</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjweaver</artifactId>\n    </dependency>\n    <!-- Dubbo Start -->\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>dubbo</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.101tec</groupId>\n      <artifactId>zkclient</artifactId>\n    </dependency>\n    <!-- Dubbo End -->\n    <!-- Spring begin -->\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context-support</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-core</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-beans</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-aop</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-orm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-web</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-jdbc</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-oxm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-test</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-tx</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-expression</artifactId>\n    </dependency>\n    <!-- Spring end -->\n    <!-- MyBatis begin -->\n    <dependency>\n      <groupId>org.mybatis</groupId>\n      <artifactId>mybatis</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.mybatis</groupId>\n      <artifactId>mybatis-spring</artifactId>\n    </dependency>\n    <!-- MyBatis end -->\n  </dependencies>\n\n  <build>\n    <resources>\n      <resource>\n        <targetPath>${project.build.directory}/classes</targetPath>\n        <directory>src/main/resources</directory>\n        <filtering>true</filtering>\n        <includes>\n          <include>**/*.xml</include>\n          <include>**/*.properties</include>\n        </includes>\n        <excludes>\n          <exclude>rebel.xml</exclude>\n        </excludes>\n      </resource>\n      <resource>\n        <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>\n        <directory>src/main/resources/spring</directory>\n        <!--<directory>src/main/resources</directory>-->\n        <filtering>true</filtering>\n        <includes>\n          <include>spring-context.xml</include>\n        </includes>\n      </resource>\n    </resources>\n    <plugins>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-compiler-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-source-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-jar-plugin</artifactId>\n        <configuration>\n          <classesDirectory>target/classes/</classesDirectory>\n          <archive>\n            <!--生成的jar中，不要包含pom.xml和pom.properties这两个文件 -->\n            <addMavenDescriptor>false</addMavenDescriptor>\n            <manifest>\n              <mainClass>com.alibaba.dubbo.container.Main</mainClass>\n              <!-- 打包时MANIFEST.MF文件不记录时间版本 -->\n              <useUniqueVersions>false</useUniqueVersions>\n              <addClasspath>true</addClasspath>\n              <classpathPrefix>lib/</classpathPrefix>\n            </manifest>\n            <manifestEntries>\n              <Class-Path>.</Class-Path>\n            </manifestEntries>\n          </archive>\n        </configuration>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-dependency-plugin</artifactId>\n        <executions>\n          <execution>\n            <id>copy-dependencies</id>\n            <phase>package</phase>\n            <goals>\n              <goal>copy-dependencies</goal>\n            </goals>\n            <configuration>\n              <type>jar</type>\n              <includeTypes>jar</includeTypes>\n              <!--<useUniqueVersions>false</useUniqueVersions>-->\n              <outputDirectory>\n                ${project.build.directory}/lib\n              </outputDirectory>\n            </configuration>\n          </execution>\n        </executions>\n      </plugin>\n      <plugin>\n        <groupId>org.zeroturnaround</groupId>\n        <artifactId>jrebel-maven-plugin</artifactId>\n      </plugin>\n    </plugins>\n  </build>\n\n</project>"
  },
  {
    "path": "weixin-service-comment/src/main/java/com/cheng/weixin/service/comment/dao/CommentDaoMapper.java",
    "content": "package com.cheng.weixin.service.comment.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.comment.entity.Comment;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 评论\n * Author: hp\n * Date: 2016/10/8\n */\n@Repository\npublic interface CommentDaoMapper extends BaseDaoMapper<Comment> {\n    /**\n     * 获取商品的评论\n     * @param comment\n     * @return\n     */\n    //List<Comment> getByProductId(Comment comment);\n}\n"
  },
  {
    "path": "weixin-service-comment/src/main/java/com/cheng/weixin/service/comment/service/CommentService.java",
    "content": "package com.cheng.weixin.service.comment.service;\n\nimport com.cheng.weixin.rpc.comment.entity.Comment;\nimport com.cheng.weixin.rpc.comment.service.RpcCommentService;\nimport com.cheng.weixin.service.comment.dao.CommentDaoMapper;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\n\n/**\n * Desc: 评论\n * Author: hp\n * Date: 2016/10/8\n */\n@Service(\"commentService\")\npublic class CommentService implements RpcCommentService {\n    @Autowired\n    private CommentDaoMapper commentDao;\n\n    @Override\n    public List<Comment> getByProductId(String productId) {\n        return commentDao.loadAll(new Comment(productId));\n    }\n}\n"
  },
  {
    "path": "weixin-service-comment/src/main/resources/log4j.properties",
    "content": "#log4j.rootLogger=DEBUG,CONSOLE,FILE\nlog4j.rootLogger=DEBUG,FILE\nlog4j.appender.Threshold=ERROR\n\n#log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender\n#log4j.appender.CONSOLE.Encoding=UTF-8\n#log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout\n#log4j.appender.CONSOLE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [service-item] %p [%t] %c-<%L> %m%n\n\nlog4j.appender.FILE=org.apache.log4j.RollingFileAppender\nlog4j.appender.FILE.Encoding=UTF-8\nlog4j.appender.FILE.File=logs/service-comment.log\nlog4j.appender.FILE.MaxFileSize=4000KB\nlog4j.appender.FILE.MaxBackupIndex=10\nlog4j.appender.FILE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [service-comment] %p [%t] %c-<%L> %m%n\n\n#log4j.logger.org.apache.zookeeper.ClientCnxn=ERROR"
  },
  {
    "path": "weixin-service-comment/src/main/resources/mybatis/mapper/CommentMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.comment.dao.CommentDaoMapper\">\n  <sql id=\"tableName\">comment</sql>\n  <sql id=\"columns\">\n    c.id,order_detail_id,c.product_id,c.account_id,c.title,c.content,c.useful,c.useless,c.parent_id,c.product_score,\n    c.delivery_score,c.remarks,c.create_date,c.update_date,c.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,order_detail_id,product_id,account_id,title,content,useful,useless,parent_id,product_score,\n    delivery_score,remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"commentIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"orderDetailId != null and orderDetailId != ''\">order_detail_id=#{orderDetailId},</if>\n    <if test=\"productId != null and productId != ''\">product_id=#{productId},</if>\n    <if test=\"accountId != null and accountId != ''\">account_id=#{accountId},</if>\n    <if test=\"title != null and title != ''\">title=#{title},</if>\n    <if test=\"content != null and content != ''\">content=#{content},</if>\n    <if test=\"useful != null and useful != ''\">useful=#{useful},</if>\n    <if test=\"useless != null and useless != ''\">useless=#{useless},</if>\n    <if test=\"parentId != null and parentId != ''\">parent_id=#{parentId},</if>\n    <if test=\"productScore != null and productScore != ''\">product_score=#{productScore},</if>\n    <if test=\"deliveryScore != null and deliveryScore != ''\">delivery_score=#{deliveryScore},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"commentSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS c\n  </sql>\n\n  <sql id=\"commentWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <if test=\"productId != null and productId != ''\">\n        product_id = #{productId}\n      </if>\n      <choose>\n        <when test=\"status != null\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"commentUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"commentIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <!-- 根据ID -->\n  <select id=\"load\" parameterType=\"comment\" resultType=\"comment\">\n    <include refid=\"commentSelector\"/>\n    <include refid=\"commentWhere\"/>\n  </select>\n\n  <!-- 获取全部信息 -->\n  <select id=\"loadAll\" parameterType=\"comment\" resultType=\"comment\">\n    <include refid=\"commentSelector\"/>\n    <include refid=\"commentWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"comment\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"commentUpdate\"/>\n    <include refid=\"commentWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"comment\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{order_detail_id},#{product_id},#{account_id},#{title},#{content},#{useful},#{useless},\n    #{parent_id},#{product_score},#{delivery_score},#{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-comment/src/main/resources/mybatis/mybatis-config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE configuration\n        PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-config.dtd\">\n\n<configuration>\n  <settings>\n    <!-- 开启字段名和属性名驼峰匹配 -->\n    <setting name=\"mapUnderscoreToCamelCase\" value=\"true\"/>\n    <!-- 全局启用或禁用延迟加载。当禁用时，所有关联对象都会即时加载。 -->\n    <setting name=\"lazyLoadingEnabled\" value=\"true\"/>\n    <!-- 当启用时，有延迟加载属性的对象在被调用时将会完全加载任意属性。否则，每种属性将会按需要加载。 -->\n    <setting name=\"aggressiveLazyLoading\" value=\"true\"/>\n  </settings>\n  <plugins>\n    <plugin interceptor=\"com.github.pagehelper.PageHelper\">\n\n      <property name=\"dialect\" value=\"mysql\"/>\n\n    </plugin>\n  </plugins>\n</configuration>"
  },
  {
    "path": "weixin-service-comment/src/main/resources/spring/spring-context.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/context\n    http://www.springframework.org/schema/context/spring-context-3.2.xsd\">\n\n\t<!-- 引入配置文件 -->\n\t<context:property-placeholder location=\"classpath:system.properties,classpath:jdbc.properties\" />\n\n\t<!-- 打开Spring的Annotation支持 -->\n\t<context:annotation-config />\n\n\t<!-- 扫描注入  -->\n\t<context:component-scan base-package=\"com.cheng.weixin.service.comment\" />\n\n\t<import resource=\"classpath:spring/spring-dubbo-provider.xml\"/>\n\t<import resource=\"classpath:spring/spring-mybatis.xml\"/>\n\n</beans>"
  },
  {
    "path": "weixin-service-comment/src/main/resources/spring/spring-dubbo-provider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd\n          http://code.alibabatech.com/schema/dubbo\n          http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n  <dubbo:application name=\"weixin-service-comment\"/>\n  <dubbo:registry id=\"zk1\" address=\"${weixin.dubbo.reistry.address}\" protocol=\"${weixin.dubbo.reistry.protocol}\"/> <!-- 注意要关闭防火墙 -->\n  <dubbo:protocol id=\"mydubbo\" name=\"dubbo\" host=\"${weixin.dubbo.host.address}\" port=\"${weixin.dubbo.comment.service.port}\"/>\n  <dubbo:provider registry=\"zk1\" protocol=\"mydubbo\"/>\n  <dubbo:service interface=\"com.cheng.weixin.rpc.comment.service.RpcCommentService\" ref=\"commentService\" version=\"1.0\"/>\n</beans>\n"
  },
  {
    "path": "weixin-service-comment/src/main/resources/spring/spring-mybatis.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:p=\"http://www.springframework.org/schema/p\"\n\txmlns:aop=\"http://www.springframework.org/schema/aop\"\n\txmlns:tx=\"http://www.springframework.org/schema/tx\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/tx\n    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd\n    http://www.springframework.org/schema/aop\n    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd\">\n\n\t<bean id=\"dataSource\" class=\"com.alibaba.druid.pool.DruidDataSource\" init-method=\"init\" destroy-method=\"close\">\n\t  <property name=\"driverClassName\" value=\"${jdbc.driverClassName}\"/>\n\t  <property name=\"url\" value=\"${jdbc.url}\"/>\n\t  <property name=\"username\" value=\"${jdbc.username}\"/>\n\t  <property name=\"password\" value=\"${jdbc.password}\"/>\n\t  <!-- 连接池最大使用连接数 -->\n\t  <property name=\"maxActive\" value=\"${jdbc.maxActive}\"/>\n\t  <!-- 初始化连接大小 -->\n\t  <property name=\"initialSize\" value=\"${jdbc.initialSize}\"/>\n\t  <!-- 获取连接最大等待时间 -->\n\t  <property name=\"maxWait\" value=\"${jdbc.maxWait}\"/>\n\t  <!-- 连接池最大空闲 -->\n\t  <!--  property name=\"maxIdle\" value=\"${jdbc.maxIdle}\"/>-->\n\t  <!-- 连接池最小空闲 -->\n\t  <property name=\"minIdle\" value=\"${jdbc.minIdle}\"/>\n\t  <!-- 自动清除无用连接 -->\n\t  <property name=\"removeAbandoned\" value=\"${jdbc.removeAbandoned}\"/>\n\t  <!-- 清除无用连接的等待时间 -->\n\t  <property name=\"removeAbandonedTimeout\" value=\"${jdbc.removeAbandonedTimeout}\"/>\n\t  <!-- 连接属性 -->\n\t  <property name=\"connectionProperties\" value=\"${jdbc.connectionProperties}\"/>\n\t</bean>\n\n  <!-- 注入SQLSession -->\n  <bean id=\"sqlSession\" class=\"org.mybatis.spring.SqlSessionTemplate\" scope=\"prototype\">\n    <constructor-arg index=\"0\" ref=\"sqlSessionFactory\"/>\n  </bean>\n\n\t<!-- mybatis配置 -->\n\t<bean id=\"sqlSessionFactory\" class=\"org.mybatis.spring.SqlSessionFactoryBean\"\n\t\tp:dataSource-ref=\"dataSource\"\n    p:configLocation=\"classpath:/mybatis/mybatis-config.xml\"\n\t\tp:typeAliasesPackage=\"com.cheng.weixin.rpc.comment.entity\"\n\t\tp:mapperLocations=\"classpath:/mybatis/mapper/*.xml\" />\n\n\t<!-- spring与mybatis整合配置，扫描所有dao -->\n\t<bean class=\"org.mybatis.spring.mapper.MapperScannerConfigurer\"\n\t\tp:basePackage=\"com.cheng.weixin.service.comment.dao\"\n\t\tp:sqlSessionFactoryBeanName=\"sqlSessionFactory\" />\n\n\t<!-- 对数据源进行事务管理 -->\n\t<bean id=\"transactionManager\" class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\"\n\t\tp:dataSource-ref=\"dataSource\" />\n\t<!-- 通知 -->\n\t<tx:advice id=\"txAdvice\" transaction-manager=\"transactionManager\">\n\t  <!-- 传播行为 -->\n\t  <tx:attributes>\n\t  \t<tx:method name=\"add*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"update*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"delete*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"get*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  \t<tx:method name=\"find*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  </tx:attributes>\n\t</tx:advice>\t\n\t<!-- 哪些类的哪些方法使用事务 -->\n\t<aop:config>\n\t  <aop:advisor advice-ref=\"txAdvice\" pointcut=\"execution(* com.cheng.weixin.service.comment.service.*.*(..))\"/>\n\t</aop:config>\n\t\t\n\t<!-- 开启事务注解驱动 \n    <tx:annotation-driven />\n    -->\n</beans>"
  },
  {
    "path": "weixin-service-comment/src/test/java/com/cheng/comment/test/TestMain.java",
    "content": "package com.cheng.comment.test;\n\nimport com.alibaba.fastjson.JSON;\nimport com.cheng.weixin.rpc.comment.entity.Comment;\nimport com.cheng.weixin.rpc.comment.service.RpcCommentService;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.test.context.ContextConfiguration;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\n\nimport java.util.List;\n\n/**\n * Desc:\n * Author: cheng\n * Date: 2016/7/11\n */\n@RunWith(SpringJUnit4ClassRunner.class)\n@ContextConfiguration(locations = {\"classpath*:spring/spring-context.xml\"})\npublic class TestMain {\n    @Autowired\n    private RpcCommentService commentService;\n\n    @Test\n    public void test01() {\n        List<Comment> comments = commentService.getByProductId(\"1\");\n        System.out.println(JSON.toJSONString(comments));\n    }\n\n}\n"
  },
  {
    "path": "weixin-service-httpclient/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-service-httpclient</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-config</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-rpc-httpclient</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>junit</groupId>\n      <artifactId>junit</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>javax.servlet</groupId>\n      <artifactId>javax.servlet-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>log4j</groupId>\n      <artifactId>log4j</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-log4j12</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>dom4j</groupId>\n      <artifactId>dom4j</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-logging</groupId>\n      <artifactId>commons-logging</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.apache.httpcomponents</groupId>\n      <artifactId>httpclient</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.apache.httpcomponents</groupId>\n      <artifactId>httpmime</artifactId>\n    </dependency>\n    <!-- Dubbo Start -->\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>dubbo</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.101tec</groupId>\n      <artifactId>zkclient</artifactId>\n    </dependency>\n    <!-- Dubbo End -->\n    <!-- Spring begin -->\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context-support</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-core</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-beans</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-aop</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-orm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-test</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-tx</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-expression</artifactId>\n    </dependency>\n    <!-- Spring end -->\n  </dependencies>\n  <build>\n    <resources>\n      <resource>\n        <targetPath>${project.build.directory}/classes</targetPath>\n        <directory>src/main/resources</directory>\n        <filtering>true</filtering>\n        <includes>\n          <include>**/*.xml</include>\n          <include>**/*.properties</include>\n        </includes>\n        <excludes>\n          <exclude>rebel.xml</exclude>\n        </excludes>\n      </resource>\n      <resource>\n        <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>\n        <directory>src/main/resources/spring</directory>\n        <filtering>true</filtering>\n        <includes>\n          <include>spring-context.xml</include>\n        </includes>\n      </resource>\n    </resources>\n    <plugins>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-compiler-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-source-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-jar-plugin</artifactId>\n        <configuration>\n          <classesDirectory>target/classes/</classesDirectory>\n          <archive>\n            <!--生成的jar中，不要包含pom.xml和pom.properties这两个文件 -->\n            <addMavenDescriptor>false</addMavenDescriptor>\n            <manifest>\n              <mainClass>com.alibaba.dubbo.container.Main</mainClass>\n              <!-- 打包时MANIFEST.MF文件不记录时间版本 -->\n              <useUniqueVersions>false</useUniqueVersions>\n              <addClasspath>true</addClasspath>\n              <classpathPrefix>lib/</classpathPrefix>\n            </manifest>\n            <manifestEntries>\n              <Class-Path>.</Class-Path>\n            </manifestEntries>\n          </archive>\n        </configuration>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-dependency-plugin</artifactId>\n        <executions>\n          <execution>\n            <id>copy-dependencies</id>\n            <phase>package</phase>\n            <goals>\n              <goal>copy-dependencies</goal>\n            </goals>\n            <configuration>\n              <type>jar</type>\n              <includeTypes>jar</includeTypes>\n              <!--<useUniqueVersions>false</useUniqueVersions>-->\n              <outputDirectory>\n                ${project.build.directory}/lib\n              </outputDirectory>\n            </configuration>\n          </execution>\n        </executions>\n      </plugin>\n      <plugin>\n        <groupId>org.zeroturnaround</groupId>\n        <artifactId>jrebel-maven-plugin</artifactId>\n      </plugin>\n    </plugins>\n  </build>\n</project>"
  },
  {
    "path": "weixin-service-httpclient/shell/service-httpclient.sh",
    "content": "#!/bin/sh\n\n## java env\nexport JAVA_HOME=/usr/local/jdk1.7.0_45\nexport JRE_HOME=$JAVA_HOME/jre\n\n## service name\nAPP_NAME=httpclient\n\nSERVICE_DIR=/home/wusc/edu/service/$APP_NAME\nSERVICE_NAME=weixin-service-$APP_NAME\nJAR_NAME=$SERVICE_NAME\\.jar\nPID=$SERVICE_NAME\\.pid\n\ncd $SERVICE_DIR\n\ncase \"$1\" in\n\n    start)\n        nohup $JRE_HOME/bin/java -Xms256m -Xmx512m -jar $JAR_NAME >/dev/null 2>&1 &\n        echo $! > $SERVICE_DIR/$PID\n        echo \"=== start $SERVICE_NAME\"\n        ;;\n\n    stop)\n        kill `cat $SERVICE_DIR/$PID`\n        rm -rf $SERVICE_DIR/$PID\n        echo \"=== stop $SERVICE_NAME\"\n\n        sleep 5\n\n        P_ID=`ps -ef | grep -w \"$SERVICE_NAME\" | grep -v \"grep\" | awk '{print $2}'`\n        if [ \"$P_ID\" == \"\" ]; then\n            echo \"=== $SERVICE_NAME process not exists or stop success\"\n        else\n            echo \"=== $SERVICE_NAME process pid is:$P_ID\"\n            echo \"=== begin kill $SERVICE_NAME process, pid is:$P_ID\"\n            kill -9 $P_ID\n        fi\n        ;;\n\n    restart)\n        $0 stop\n        sleep 2\n        $0 start\n        echo \"=== restart $SERVICE_NAME\"\n        ;;\n\n    *)\n        ## restart\n        $0 stop\n        sleep 2\n        $0 start\n        ;;\n\nesac\nexit 0\n\n"
  },
  {
    "path": "weixin-service-httpclient/src/main/java/com/cheng/weixin/service/httpclient/service/HttpClientService.java",
    "content": "package com.cheng.weixin.service.httpclient.service;\n\nimport com.cheng.weixin.rpc.httpclient.service.RpcHttpClientService;\nimport org.apache.commons.io.FileUtils;\nimport org.apache.http.HttpEntity;\nimport org.apache.http.HttpStatus;\nimport org.apache.http.ParseException;\nimport org.apache.http.client.config.RequestConfig;\nimport org.apache.http.client.methods.CloseableHttpResponse;\nimport org.apache.http.client.methods.HttpGet;\nimport org.apache.http.client.methods.HttpPost;\nimport org.apache.http.client.methods.HttpRequestBase;\nimport org.apache.http.entity.StringEntity;\nimport org.apache.http.entity.mime.MultipartEntityBuilder;\nimport org.apache.http.entity.mime.content.FileBody;\nimport org.apache.http.impl.client.CloseableHttpClient;\nimport org.apache.http.util.EntityUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.nio.charset.UnsupportedCharsetException;\n\n/**\n * Desc: HttpClien 请求封装\n * Author: Cheng\n * Date: 2016/4/13 0013\n */\n@Service(\"httpClientService\")\npublic class HttpClientService implements RpcHttpClientService {\n\n    @Autowired\n    private CloseableHttpClient httpClient;\n    @Autowired\n    private RequestConfig requestConfig;\n\n    /**\n     * GET请求\n     * @param url\n     * @return\n     */\n    public String doGet(String url) {\n        CloseableHttpResponse response = null;\n        HttpGet httpGet = new HttpGet(url);\n        httpGet.setConfig(requestConfig);\n        try {\n            response = httpClient.execute(httpGet);\n            int statusCode = response.getStatusLine().getStatusCode();\n            if(statusCode>= HttpStatus.SC_OK&&statusCode<HttpStatus.SC_MULTIPLE_CHOICES) {\n                return getResponseContent(response, httpGet);\n            }\n            return null;\n        } catch (ParseException | IOException e) {\n            e.printStackTrace();\n        }finally {\n            closeResponse(response);\n        }\n        return null;\n    }\n\n    /**\n\t * POST 请求\n\t * @param url 传入的微信地址\n\t * @param data 需要发送的JSON参数\n\t * @return 微信回复的消息\n\t */\n\tpublic String doPost(String url, String data) {\n        CloseableHttpResponse response = null;\n        HttpPost httpPost = new HttpPost(url);\n        httpPost.setConfig(requestConfig);\n        try {\n            httpPost.setHeader(\"Content-Type\", \"application/json\");\n            StringEntity params = new StringEntity(data,\"UTF-8\");\n            httpPost.setEntity(params);\n            response = httpClient.execute(httpPost);\n            int statusCode = response.getStatusLine().getStatusCode();\n            if(statusCode>= HttpStatus.SC_OK&&statusCode<HttpStatus.SC_MULTIPLE_CHOICES) {\n                return getResponseContent(response, httpPost);\n            }\n            return null;\n        } catch (UnsupportedCharsetException| IOException e) {\n            e.printStackTrace();\n        }finally {\n            closeResponse(response);\n        }\n        return null;\n    }\n\t/**\n\t * 发送媒体消息\n\t * @param url 传入的微信地址\n\t * @param path 需要传入的媒体文件\n\t * @return 返回的结果\n\t */\n\tpublic String postMedia(String url, String path) {\n\t\tCloseableHttpResponse response = null;\n        HttpPost httpPost = new HttpPost(url);\n        httpPost.setConfig(requestConfig);\n\t\ttry {\n\t\t\tFileBody fb = new FileBody(new File(path));\n\t\t\tHttpEntity entity = MultipartEntityBuilder.create().addPart(\"media\", fb).build();\n            httpPost.setEntity(entity);\n\t\t\tresponse = httpClient.execute(httpPost);\n\t\t\tint statusCode = response.getStatusLine().getStatusCode();\n            if(statusCode>= HttpStatus.SC_OK&&statusCode<HttpStatus.SC_MULTIPLE_CHOICES) {\n                return getResponseContent(response, httpPost);\n            }\n            return null;\n\t\t} catch (ParseException | IOException e) {\n\t\t\te.printStackTrace();\n\t\t}finally {\n            closeResponse(response);\n\t\t}\n\t\treturn null;\n\t}\n\t/**\n\t * 根据媒体ID下载媒体资源\n\t * @param url\n\t * @param path\n\t */\n\tpublic void getMidie(String url, String path) {\n\t\tCloseableHttpResponse response = null;\n\t\tInputStream is = null;\n\t\ttry {\n\t\t\tHttpGet httpGet = new HttpGet(url);\n\t\t\tresponse = httpClient.execute(httpGet);\n\t\t\tint statusCode = response.getStatusLine().getStatusCode();\n\t\t\tif(statusCode>=HttpStatus.SC_OK&&statusCode<HttpStatus.SC_MULTIPLE_CHOICES) {\n\t\t\t\tHttpEntity entity = response.getEntity();\n\t\t\t\tif(!entity.getContentType().getValue().equals(\"text/plain\")) {\n\t\t\t\t\tis = entity.getContent();\n\t\t\t\t\tFileUtils.copyInputStreamToFile(is, new File(path));\n                    httpGet.releaseConnection();\n\t\t\t\t}else {\n                    getResponseContent(response, httpGet);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (ParseException | IOException e) {\n\t\t\te.printStackTrace();\n\t\t}finally {\n            closeResponse(response);\n            closeInputStream(is);\n        }\n\t}\n\n    // 获取响应结果\n    private String getResponseContent(CloseableHttpResponse response, HttpRequestBase httpRequest) throws IOException {\n        HttpEntity entity = response.getEntity();\n        String content = EntityUtils.toString(entity,\"UTF-8\");\n        httpRequest.releaseConnection();\n//        ErrorEntity err = JSON.parseObject(content, ErrorEntity.class);\n//        if(err.getErrcode()!=null && !err.getErrcode().equals(\"0\") &&\n//                err.getErrmsg()!=null && !err.getErrmsg().equals(\"ok\")) {\n//            throw new WeixinException(Integer.parseInt(err.getErrcode()), err.getErrmsg());\n//        }\n        return content;\n    }\n    // 关闭响应\n    private void closeResponse(CloseableHttpResponse response) {\n        try {\n            if(response!=null) response.close();\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n    }\n    // 关闭流\n    private void closeInputStream(InputStream is) {\n        try {\n            if(is!=null) is.close();\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n    }\n}\n"
  },
  {
    "path": "weixin-service-httpclient/src/main/java/com/cheng/weixin/service/httpclient/utils/ClientEvictExpiredConnections.java",
    "content": "package com.cheng.weixin.service.httpclient.utils;\n\nimport org.apache.http.conn.HttpClientConnectionManager;\n\n/**\n * Desc: 关闭无效的连接\n * Author: Cheng\n * Date: 2016/4/13 0013\n */\npublic class ClientEvictExpiredConnections extends Thread {\n    private final HttpClientConnectionManager connMgr;\n\n    private volatile boolean shutdown;\n\n    public ClientEvictExpiredConnections(HttpClientConnectionManager connMgr) {\n        this.connMgr = connMgr;\n    }\n    @Override\n    public void run() {\n        try {\n            while (!shutdown) {\n                synchronized (this) {\n                    wait(5000);\n                    // 关闭失效的连接\n                    connMgr.closeExpiredConnections();\n                }\n            }\n        } catch (InterruptedException ex) {\n            // 结束\n        }\n    }\n\n    public void shutdown() {\n        shutdown = true;\n        synchronized (this) {\n            notifyAll();\n        }\n    }\n\n}\n"
  },
  {
    "path": "weixin-service-httpclient/src/main/resources/httpClient.properties",
    "content": "#\\u8BBE\\u7F6E\\u6700\\u5927\\u8FDE\\u63A5\\u6570\nhttpClient.maxTotal=200\n#\\u8BBE\\u7F6E\\u6BCF\\u4E2A\\u4E3B\\u673A\\u5730\\u5740\\u7684\\u5E76\\u53D1\\u6570\nhttpClient.defaultMaxPerRoute=20\n\n#\\u521B\\u5EFA\\u8FDE\\u63A5\\u7684\\u6700\\u957F\\u65F6\\u95F4\nhttp.connectTimeout=1000\n#\\u4ECE\\u8FDE\\u63A5\\u6C60\\u4E2D\\u83B7\\u53D6\\u5230\\u8FDE\\u63A5\\u7684\\u6700\\u957F\\u65F6\\u95F4\nhttp.connectionRequestTimeout=500\n#\\u6570\\u636E\\u4F20\\u8F93\\u7684\\u6700\\u957F\\u65F6\\u95F4\\uFF08\\u6BEB\\u79D2\\uFF09\nhttp.socketTimeout=10000\n#\\u63D0\\u4EA4\\u8BF7\\u6C42\\u524D\\u6D4B\\u8BD5\\u8FDE\\u63A5\\u662F\\u5426\\u53EF\\u7528\nhttp.staleConnectionCheckEnabled=true"
  },
  {
    "path": "weixin-service-httpclient/src/main/resources/log4j.properties",
    "content": "log4j.rootLogger=DEBUG,CONSOLE,FILE\nlog4j.appender.Threshold=ERROR\n\nlog4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender\nlog4j.appender.CONSOLE.Encoding=UTF-8\nlog4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.CONSOLE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [service-httpclient] %p [%t] %c-<%L> %m%n\n\nlog4j.appender.FILE=org.apache.log4j.RollingFileAppender\nlog4j.appender.FILE.Encoding=UTF-8\nlog4j.appender.FILE.File=logs/weixin-service-httpclient.log\nlog4j.appender.FILE.MaxFileSize=4000KB\nlog4j.appender.FILE.MaxBackupIndex=10\nlog4j.appender.FILE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [service-httpclient] %p [%t] %c-<%L> %m%n"
  },
  {
    "path": "weixin-service-httpclient/src/main/resources/spring/spring-context.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/context\n    http://www.springframework.org/schema/context/spring-context-3.2.xsd\">\n\n\t<!-- 引入配置文件 -->\n\t<context:property-placeholder location=\"classpath:system.properties,classpath:httpClient.properties\"/>\n\n\t<!-- 打开Spring的Annotation支持 -->\n\t<context:annotation-config />\n\n\t<!-- 扫描注入  -->\n\t<context:component-scan base-package=\"com.cheng.weixin.service.httpclient\" />\n\n\t<import resource=\"classpath:spring/spring-dubbo-provider.xml\"/>\n\t<import resource=\"classpath:spring/spring-httpclient.xml\"/>\n\n</beans>"
  },
  {
    "path": "weixin-service-httpclient/src/main/resources/spring/spring-dubbo-provider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd\n          http://code.alibabatech.com/schema/dubbo\n          http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n  <dubbo:application name=\"weixin-service-httpclient\"/>\n\n  <dubbo:registry id=\"zk1\" address=\"${weixin.dubbo.reistry.address}\" protocol=\"zookeeper\"/> <!-- 注意要关闭防火墙 -->\n\n  <dubbo:protocol id=\"mydubbo\" name=\"dubbo\" host=\"192.168.1.103\" port=\"20883\"/>\n\n  <dubbo:provider registry=\"zk1\" protocol=\"mydubbo\"/>\n\n  <dubbo:service interface=\"com.cheng.weixin.rpc.httpclient.service.RpcHttpClientService\" ref=\"httpClientService\"/>\n\n</beans>\n"
  },
  {
    "path": "weixin-service-httpclient/src/main/resources/spring/spring-httpclient.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\">\n\n\t<!-- 连接管理器 -->\n\t<bean id=\"httpClientConnectionManager\" class=\"org.apache.http.impl.conn.PoolingHttpClientConnectionManager\">\n\t\t<property name=\"maxTotal\" value=\"${httpClient.maxTotal}\"/>\n\t\t<property name=\"defaultMaxPerRoute\" value=\"${httpClient.defaultMaxPerRoute}\"/>\n\t</bean>\n\n\t<!-- httpclient对象构建器 -->\n\t<bean id=\"httpClientBuilder\" class=\"org.apache.http.impl.client.HttpClientBuilder\">\n\t\t<property name=\"connectionManager\" ref=\"httpClientConnectionManager\"/>\n\t</bean>\n\n\t<!-- 定义Httpclient对象 -->\n\t<bean id=\"httpClient\" class=\"org.apache.http.impl.client.CloseableHttpClient\" factory-bean=\"httpClientBuilder\" factory-method=\"build\"\n\t\t\t\tscope=\"prototype\"/>\n\n\t<!-- 清除无效的连接 -->\n\t<bean class=\"com.cheng.weixin.service.httpclient.utils.ClientEvictExpiredConnections\">\n\t\t<constructor-arg index=\"0\" ref=\"httpClientConnectionManager\"/>\n\t</bean>\n\n\t<!-- 请求配置参数 -->\n\t<bean id=\"requestConfigBuilder\" class=\"org.apache.http.client.config.RequestConfig.Builder\">\n\t\t<!-- 创建连接的最长时间 -->\n\t\t<property name=\"connectTimeout\" value=\"${http.connectTimeout}\"/>\n\t\t<!-- 从连接池中获取到连接的最长时间 -->\n\t\t<property name=\"connectionRequestTimeout\" value=\"${http.connectionRequestTimeout}\"/>\n\t\t<!-- 数据传输的最长时间 -->\n\t\t<property name=\"socketTimeout\" value=\"${http.socketTimeout}\"/>\n\t\t<!-- 提交请求前测试连接是否可用 -->\n\t\t<property name=\"staleConnectionCheckEnabled\" value=\"${http.staleConnectionCheckEnabled}\"/>\n\t</bean>\n\t<!-- 定义请求参数 -->\n\t<bean id=\"requestConfig\" class=\"org.apache.http.client.config.RequestConfig\" factory-bean=\"requestConfigBuilder\"\n\t\t\t\tfactory-method=\"build\"/>\n</beans>"
  },
  {
    "path": "weixin-service-item/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-service-item</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-config</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-service</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-rpc-item</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>junit</groupId>\n      <artifactId>junit</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>log4j</groupId>\n      <artifactId>log4j</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-log4j12</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-logging</groupId>\n      <artifactId>commons-logging</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-beanutils</groupId>\n      <artifactId>commons-beanutils</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.github.pagehelper</groupId>\n      <artifactId>pagehelper</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>javax.servlet</groupId>\n      <artifactId>javax.servlet-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>mysql</groupId>\n      <artifactId>mysql-connector-java</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>druid</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjrt</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjweaver</artifactId>\n    </dependency>\n    <!-- Dubbo Start -->\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>dubbo</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.101tec</groupId>\n      <artifactId>zkclient</artifactId>\n    </dependency>\n    <!-- Dubbo End -->\n    <!-- Spring begin -->\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context-support</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-core</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-beans</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-aop</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-orm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-web</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-jdbc</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-oxm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-test</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-tx</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-expression</artifactId>\n    </dependency>\n    <!-- Spring end -->\n    <!-- MyBatis begin -->\n    <dependency>\n      <groupId>org.mybatis</groupId>\n      <artifactId>mybatis</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.mybatis</groupId>\n      <artifactId>mybatis-spring</artifactId>\n    </dependency>\n    <!-- MyBatis end -->\n  </dependencies>\n\n  <build>\n    <resources>\n      <resource>\n        <targetPath>${project.build.directory}/classes</targetPath>\n        <directory>src/main/resources</directory>\n        <filtering>true</filtering>\n        <includes>\n          <include>**/*.xml</include>\n          <include>**/*.properties</include>\n        </includes>\n        <excludes>\n          <exclude>rebel.xml</exclude>\n        </excludes>\n      </resource>\n      <resource>\n        <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>\n        <directory>src/main/resources/spring</directory>\n        <!--<directory>src/main/resources</directory>-->\n        <filtering>true</filtering>\n        <includes>\n          <include>spring-context.xml</include>\n        </includes>\n      </resource>\n    </resources>\n    <plugins>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-compiler-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-source-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-jar-plugin</artifactId>\n        <configuration>\n          <classesDirectory>target/classes/</classesDirectory>\n          <archive>\n            <!--生成的jar中，不要包含pom.xml和pom.properties这两个文件 -->\n            <addMavenDescriptor>false</addMavenDescriptor>\n            <manifest>\n              <mainClass>com.alibaba.dubbo.container.Main</mainClass>\n              <!-- 打包时MANIFEST.MF文件不记录时间版本 -->\n              <useUniqueVersions>false</useUniqueVersions>\n              <addClasspath>true</addClasspath>\n              <classpathPrefix>lib/</classpathPrefix>\n            </manifest>\n            <manifestEntries>\n              <Class-Path>.</Class-Path>\n            </manifestEntries>\n          </archive>\n        </configuration>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-dependency-plugin</artifactId>\n        <executions>\n          <execution>\n            <id>copy-dependencies</id>\n            <phase>package</phase>\n            <goals>\n              <goal>copy-dependencies</goal>\n            </goals>\n            <configuration>\n              <type>jar</type>\n              <includeTypes>jar</includeTypes>\n              <!--<useUniqueVersions>false</useUniqueVersions>-->\n              <outputDirectory>\n                ${project.build.directory}/lib\n              </outputDirectory>\n            </configuration>\n          </execution>\n        </executions>\n      </plugin>\n      <plugin>\n        <groupId>org.zeroturnaround</groupId>\n        <artifactId>jrebel-maven-plugin</artifactId>\n      </plugin>\n    </plugins>\n  </build>\n\n</project>"
  },
  {
    "path": "weixin-service-item/shell/service-item.sh",
    "content": "#!/bin/sh\n\n## java env\nexport JAVA_HOME=/usr/jdk/jdk1.7.0_45\nexport JRE_HOME=$JAVA_HOME/jre\n\n## service name\nAPP_NAME=item\n\nSERVICE_DIR=/usr/cheng/service/$APP_NAME\nSERVICE_NAME=weixin-service-$APP_NAME\nJAR_NAME=$SERVICE_NAME\\.jar\nPID=$SERVICE_NAME\\.pid\n\ncd $SERVICE_DIR\n\ncase \"$1\" in\n\n    start)\n        nohup $JRE_HOME/bin/java -Xms256m -Xmx512m -jar $JAR_NAME >/dev/null 2>&1 &\n        echo $! > $SERVICE_DIR/$PID\n        echo \"=== start $SERVICE_NAME\"\n        ;;\n\n    stop)\n        kill `cat $SERVICE_DIR/$PID`\n        rm -rf $SERVICE_DIR/$PID\n        echo \"=== stop $SERVICE_NAME\"\n\n        sleep 5\n\n        P_ID=`ps -ef | grep -w \"$SERVICE_NAME\" | grep -v \"grep\" | awk '{print $2}'`\n        if [ \"$P_ID\" == \"\" ]; then\n            echo \"=== $SERVICE_NAME process not exists or stop success\"\n        else\n            echo \"=== $SERVICE_NAME process pid is:$P_ID\"\n            echo \"=== begin kill $SERVICE_NAME process, pid is:$P_ID\"\n            kill -9 $P_ID\n        fi\n        ;;\n\n    restart)\n        $0 stop\n        sleep 2\n        $0 start\n        echo \"=== restart $SERVICE_NAME\"\n        ;;\n\n    *)\n        ## restart\n        $0 stop\n        sleep 2\n        $0 start\n        ;;\n\nesac\nexit 0\n\n"
  },
  {
    "path": "weixin-service-item/src/main/java/com/cheng/weixin/service/item/dao/PictureDaoMapper.java",
    "content": "package com.cheng.weixin.service.item.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.item.entity.Picture;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 商品\n * Author: cheng\n * Date: 2016/6/28\n */\n@Repository\npublic interface PictureDaoMapper extends BaseDaoMapper<Picture> {\n    /**\n     * 根据商品ID获取该商品所有图片\n     * @param picture\n     * @return\n     */\n    //List<Picture> loadAllPicture(Picture picture);\n\n    /**\n     * 根据商品ID获取默认的图片\n     * @param picture\n     * @return\n     */\n    //Picture loadDefaultPicture(Picture picture);\n\n}\n"
  },
  {
    "path": "weixin-service-item/src/main/java/com/cheng/weixin/service/item/dao/ProductDaoMapper.java",
    "content": "package com.cheng.weixin.service.item.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.item.entity.Product;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 商品\n * Author: cheng\n * Date: 2016/6/28\n */\n@Repository\npublic interface ProductDaoMapper extends BaseDaoMapper<Product> {\n    /**\n     * 获取首页的商品\n     * @return\n     */\n    //List<Product> loadIndex();\n\n    /**\n     * 获取商品 根据类型ID\n     * @param product\n     * @return\n     */\n    //List<Product> loadMallByTypeId(Product product);\n}\n"
  },
  {
    "path": "weixin-service-item/src/main/java/com/cheng/weixin/service/item/dao/ProductTypeDaoMapper.java",
    "content": "package com.cheng.weixin.service.item.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.item.entity.ProductType;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 商品类型\n * Author: cheng\n * Date: 2016/6/28\n */\n@Repository\npublic interface ProductTypeDaoMapper extends BaseDaoMapper<ProductType> {\n}\n"
  },
  {
    "path": "weixin-service-item/src/main/java/com/cheng/weixin/service/item/service/ProductService.java",
    "content": "package com.cheng.weixin.service.item.service;\n\nimport com.cheng.weixin.rpc.item.entity.Picture;\nimport com.cheng.weixin.rpc.item.entity.Product;\nimport com.cheng.weixin.rpc.item.entity.ProductType;\nimport com.cheng.weixin.rpc.item.service.RpcProductService;\nimport com.cheng.weixin.service.item.dao.PictureDaoMapper;\nimport com.cheng.weixin.service.item.dao.ProductDaoMapper;\nimport com.cheng.weixin.service.item.dao.ProductTypeDaoMapper;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\n\n/**\n * Desc:\n * Author: cheng\n * Date: 2016/6/28\n */\n@Service(\"productService\")\npublic class ProductService implements RpcProductService {\n    @Autowired\n    private ProductDaoMapper productDao;\n    @Autowired\n    private PictureDaoMapper pictureDao;\n    @Autowired\n    private ProductTypeDaoMapper productTypeDao;\n\n    @Override\n    public Product getById(String id) {\n        return productDao.load(new Product(id));\n    }\n\n    @Override\n    public void updateStockById(String id, int stock, boolean isBack) {\n        Product product = new Product();\n        product.setId(id);\n        product.setUnitsInStock(stock);\n        product.setUpdate(isBack);\n        product.preUpdate();\n        productDao.update(product);\n    }\n\n    @Override\n    public List<Product> getByTypeId(String typeId) {\n        Product product = new Product();\n        product.setTypeId(typeId);\n        return productDao.loadAll(product);\n    }\n\n    @Override\n    public Product getDefaultPictureById(String id) {\n        Product product = productDao.load(new Product(id));\n        Picture pictures = getDefaultPictureByProductId(id);\n        product.setDefaultPicture(pictures);\n        return product;\n    }\n\n    @Override\n    public List<Product> getIndex() {\n        List<Product> products = productDao.loadAll(new Product(true));\n        for (Product product : products) {\n            Picture pictures = pictureDao.load(new Picture(product.getId(), true));\n            product.setDefaultPicture(pictures);\n        }\n        return products;\n    }\n\n    @Override\n    public List<ProductType> getProductType() {\n        return productTypeDao.loadAll();\n    }\n\n    @Override\n    public List<Picture> getAllPicture(String productId) {\n        return pictureDao.loadAll(new Picture(productId, null));\n    }\n\n    @Override\n    public Picture getDefaultPictureByProductId(String productId) {\n        Picture picture = pictureDao.load(new Picture(productId, true));\n        return picture;\n    }\n\n    @Override\n    public List<Picture> getShowPictureByProductId(String productId) {\n        return pictureDao.loadAll(new Picture(productId, false));\n    }\n}\n"
  },
  {
    "path": "weixin-service-item/src/main/resources/log4j.properties",
    "content": "log4j.rootLogger=DEBUG,CONSOLE,FILE\nlog4j.appender.Threshold=ERROR\n\n#log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender\n#log4j.appender.CONSOLE.Encoding=UTF-8\n#log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout\n#log4j.appender.CONSOLE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [service-item] %p [%t] %c-<%L> %m%n\n\nlog4j.appender.FILE=org.apache.log4j.RollingFileAppender\nlog4j.appender.FILE.Encoding=UTF-8\nlog4j.appender.FILE.File=logs/service-item.log\nlog4j.appender.FILE.MaxFileSize=4000KB\nlog4j.appender.FILE.MaxBackupIndex=10\nlog4j.appender.FILE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [service-item] %p [%t] %c-<%L> %m%n\n\nlog4j.logger.org.apache.zookeeper.ClientCnxn=INFO"
  },
  {
    "path": "weixin-service-item/src/main/resources/mybatis/mapper/PictureMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.item.dao.PictureDaoMapper\">\n  <sql id=\"tableName\">picture</sql>\n  <sql id=\"columns\">\n    p.id,p.product_id,p.picture_url,p.width,p.height,p.is_default,\n    p.remarks,p.create_date,p.update_date,p.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,product_id,picture_url,width,height,is_default,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"pictureIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"productId != null and productId != ''\">product_id=#{productId},</if>\n    <if test=\"pictureUrl != null and pictureUrl != ''\">picture_url=#{pictureUrl},</if>\n    <if test=\"isDefault != null and isDefault != ''\">is_default=#{isDefault},</if>\n    <if test=\"width != null and width != ''\">width=#{width},</if>\n    <if test=\"height != null and height != ''\">height=#{height},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"pictureSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS p\n  </sql>\n\n  <sql id=\"pictureWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <if test=\"productId != null and productId != ''\">\n        AND product_id = #{productId}\n      </if>\n      <if test=\"isDefault != null\">\n        AND is_default = #{isDefault}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"pictureUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"pictureIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <!-- 根据ID获取图片 -->\n  <select id=\"load\" parameterType=\"Picture\" resultType=\"Picture\">\n    <include refid=\"pictureSelector\"/>\n    <include refid=\"pictureWhere\"/>\n  </select>\n  <!-- 获取全部图片信息 -->\n  <select id=\"loadAll\" parameterType=\"Picture\" resultType=\"Picture\">\n    <include refid=\"pictureSelector\"/>\n    <include refid=\"pictureWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"Picture\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"pictureUpdate\"/>\n    <include refid=\"pictureWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"Picture\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    <include refid=\"pictureIf\"/>\n  </insert>\n\n  <!-- =================================================================== -->\n  <!-- 根据商品ID获取所有的图片 -->\n<!--  <select id=\"loadAllPicture\" parameterType=\"Picture\" resultType=\"Picture\">\n    <include refid=\"pictureSelector\"/>\n    <include refid=\"pictureWhere\"/>\n  </select>\n  &lt;!&ndash; 根据商品ID获取默认的图片 &ndash;&gt;\n  <select id=\"loadDefaultPicture\" parameterType=\"Picture\" resultType=\"Picture\">\n    <include refid=\"pictureSelector\"/>\n    <include refid=\"pictureWhere\"/>\n    AND is_default = 1\n  </select>-->\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-item/src/main/resources/mybatis/mapper/ProductMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.item.dao.ProductDaoMapper\">\n  <sql id=\"tableName\">product</sql>\n  <sql id=\"columns\">\n    p.id,p.name,p.market_price,p.sale_price,p.no,p.key_words,p.type_id,p.is_alive,p.is_index,\n    p.tag,p.unit_desc,p.units_in_stock,p.modify_admin_id,p.give_away,p.remarks,p.create_date,p.update_date,p.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,name,market_price,sale_price,no,key_words,type_id,is_alive,is_index,\n    tag,unit_desc,units_in_stock,modify_admin_id,give_away,remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"productIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"marketPrice != null and marketPrice != ''\">market_price=#{marketPrice},</if>\n    <if test=\"salePrice != null and salePrice != ''\">sale_price=#{salePrice},</if>\n    <if test=\"no != null and no != ''\">no=#{no},</if>\n    <if test=\"keywords != null and keywords != ''\">key_words=#{keywords},</if>\n    <if test=\"typeId != null and typeId != ''\">type_id=#{typeId},</if>\n    <if test=\"isAlive != null and isAlive != ''\">is_alive=#{isAlive},</if>\n    <if test=\"isIndex != null and isIndex != ''\">is_index=#{isIndex},</if>\n    <if test=\"tag != null and tag != ''\">tag=#{tag},</if>\n    <if test=\"unitDesc != null and unitDesc != ''\">unit_desc=#{unitDesc},</if>\n    <if test=\"unitsInStock != null\">units_in_stock=#{unitsInStock},</if>\n    <if test=\"modifyAdminId != null and modifyAdminId != ''\">modify_admin_id=#{modifyAdminId},</if>\n    <if test=\"giveAway != null and giveAway != ''\">give_away=#{giveAway},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"productSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS p\n  </sql>\n\n  <sql id=\"productWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <if test=\"isIndex != null and isIndex != ''\">\n        is_index = #{isIndex}\n      </if>\n      <if test=\"typeId != null and typeId != ''\">\n        type_id = #{typeId}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"productWhereUpdate\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n    </where>\n  </sql>\n\n  <sql id=\"productUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"productIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <!-- 根据商品ID -->\n  <select id=\"load\" parameterType=\"Product\" resultType=\"Product\">\n    <include refid=\"productSelector\"/>\n    <include refid=\"productWhere\"/>\n  </select>\n  <!-- 获取全部信息 -->\n  <select id=\"loadAll\" parameterType=\"Product\" resultType=\"Product\">\n    <include refid=\"productSelector\"/>\n    <include refid=\"productWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"Product\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"productUpdate\"/>\n    <include refid=\"productWhereUpdate\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"Product\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    <include refid=\"productIf\"/>\n  </insert>\n\n  <!-- ======================================== -->\n<!--  &lt;!&ndash; 获取首页的商品 &ndash;&gt;\n  <select id=\"loadIndex\" parameterType=\"Product\" resultType=\"Product\">\n    <include refid=\"productSelector\"/>\n    <include refid=\"productWhere\"/>\n  </select>\n  &lt;!&ndash; 根据ID获取商品 &ndash;&gt;\n  <select id=\"loadMallByTypeId\" parameterType=\"Product\" resultType=\"Product\">\n    <include refid=\"productSelector\"/>\n    <include refid=\"productWhere\"/>\n  </select>-->\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-item/src/main/resources/mybatis/mapper/ProductTypeMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.item.dao.ProductTypeDaoMapper\">\n  <sql id=\"tableName\">product_type</sql>\n  <sql id=\"columns\">\n    p.id,p.name,p.remarks,p.create_date,p.update_date,p.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,name,remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"productTypeIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"productTypeSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS p\n  </sql>\n\n  <sql id=\"productTypeWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"productTypeUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"productTypeIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <!-- 根据商品ID -->\n  <select id=\"load\" parameterType=\"ProductType\" resultType=\"ProductType\">\n    <include refid=\"productTypeSelector\"/>\n    <include refid=\"productTypeWhere\"/>\n  </select>\n  <!-- 获取全部信息 -->\n  <select id=\"loadAll\" resultType=\"ProductType\">\n    <include refid=\"productTypeSelector\"/>\n    <include refid=\"productTypeWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"ProductType\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"productTypeUpdate\"/>\n    <include refid=\"productTypeWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"ProductType\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    <include refid=\"productTypeIf\"/>\n  </insert>\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-item/src/main/resources/mybatis/mybatis-config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE configuration\n        PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-config.dtd\">\n\n<configuration>\n  <settings>\n    <!-- 开启字段名和属性名驼峰匹配 -->\n    <setting name=\"mapUnderscoreToCamelCase\" value=\"true\"/>\n    <!-- 全局启用或禁用延迟加载。当禁用时，所有关联对象都会即时加载。 -->\n    <setting name=\"lazyLoadingEnabled\" value=\"true\"/>\n    <!-- 当启用时，有延迟加载属性的对象在被调用时将会完全加载任意属性。否则，每种属性将会按需要加载。 -->\n    <setting name=\"aggressiveLazyLoading\" value=\"true\"/>\n  </settings>\n  <plugins>\n    <plugin interceptor=\"com.github.pagehelper.PageHelper\">\n\n      <property name=\"dialect\" value=\"mysql\"/>\n\n    </plugin>\n  </plugins>\n</configuration>"
  },
  {
    "path": "weixin-service-item/src/main/resources/spring/spring-context.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/context\n    http://www.springframework.org/schema/context/spring-context-3.2.xsd\">\n\n\t<!-- 引入配置文件 -->\n\t<context:property-placeholder location=\"classpath:system.properties,classpath:jdbc.properties\" />\n\n\t<!-- 打开Spring的Annotation支持 -->\n\t<context:annotation-config />\n\n\n\t<!-- 扫描注入  -->\n\t<context:component-scan base-package=\"com.cheng.weixin.service.item\" />\n\n\t<import resource=\"classpath:spring/spring-dubbo-provider.xml\"/>\n\t<import resource=\"classpath:spring/spring-mybatis.xml\"/>\n\n</beans>"
  },
  {
    "path": "weixin-service-item/src/main/resources/spring/spring-dubbo-provider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd\n          http://code.alibabatech.com/schema/dubbo\n          http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n  <dubbo:application name=\"weixin-service-item\"/>\n\n  <dubbo:registry id=\"zk1\" address=\"${weixin.dubbo.reistry.address}\" protocol=\"${weixin.dubbo.reistry.protocol}\"/> <!-- 注意要关闭防火墙 -->\n\n  <dubbo:protocol id=\"mydubbo\" name=\"dubbo\" host=\"${weixin.dubbo.host.address}\" port=\"${weixin.dubbo.item.service.port}\"/>\n\n  <dubbo:provider registry=\"zk1\" protocol=\"mydubbo\"/>\n\n  <dubbo:service interface=\"com.cheng.weixin.rpc.item.service.RpcProductService\" ref=\"productService\" version=\"1.0\"/>\n\n</beans>\n"
  },
  {
    "path": "weixin-service-item/src/main/resources/spring/spring-mybatis.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:p=\"http://www.springframework.org/schema/p\"\n\txmlns:aop=\"http://www.springframework.org/schema/aop\"\n\txmlns:tx=\"http://www.springframework.org/schema/tx\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/tx\n    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd\n    http://www.springframework.org/schema/aop\n    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd\">\n\n\t<bean id=\"dataSource\" class=\"com.alibaba.druid.pool.DruidDataSource\" init-method=\"init\" destroy-method=\"close\">\n\t  <property name=\"driverClassName\" value=\"${jdbc.driverClassName}\"/>\n\t  <property name=\"url\" value=\"${jdbc.url}\"/>\n\t  <property name=\"username\" value=\"${jdbc.username}\"/>\n\t  <property name=\"password\" value=\"${jdbc.password}\"/>\n\t  <!-- 连接池最大使用连接数 -->\n\t  <property name=\"maxActive\" value=\"${jdbc.maxActive}\"/>\n\t  <!-- 初始化连接大小 -->\n\t  <property name=\"initialSize\" value=\"${jdbc.initialSize}\"/>\n\t  <!-- 获取连接最大等待时间 -->\n\t  <property name=\"maxWait\" value=\"${jdbc.maxWait}\"/>\n\t  <!-- 连接池最大空闲 -->\n\t  <!--  property name=\"maxIdle\" value=\"${jdbc.maxIdle}\"/>-->\n\t  <!-- 连接池最小空闲 -->\n\t  <property name=\"minIdle\" value=\"${jdbc.minIdle}\"/>\n\t  <!-- 自动清除无用连接 -->\n\t  <property name=\"removeAbandoned\" value=\"${jdbc.removeAbandoned}\"/>\n\t  <!-- 清除无用连接的等待时间 -->\n\t  <property name=\"removeAbandonedTimeout\" value=\"${jdbc.removeAbandonedTimeout}\"/>\n\t  <!-- 连接属性 -->\n\t  <property name=\"connectionProperties\" value=\"${jdbc.connectionProperties}\"/>\n\t</bean>\n\n  <!-- 注入SQLSession -->\n  <bean id=\"sqlSession\" class=\"org.mybatis.spring.SqlSessionTemplate\" scope=\"prototype\">\n    <constructor-arg index=\"0\" ref=\"sqlSessionFactory\"/>\n  </bean>\n\n\t<!-- mybatis配置 -->\n\t<bean id=\"sqlSessionFactory\" class=\"org.mybatis.spring.SqlSessionFactoryBean\"\n\t\tp:dataSource-ref=\"dataSource\"\n    p:configLocation=\"classpath:/mybatis/mybatis-config.xml\"\n\t\tp:typeAliasesPackage=\"com.cheng.weixin.rpc.item.entity\"\n\t\tp:mapperLocations=\"classpath:/mybatis/mapper/*.xml\" />\n\n\t<!-- spring与mybatis整合配置，扫描所有dao -->\n\t<bean class=\"org.mybatis.spring.mapper.MapperScannerConfigurer\"\n\t\tp:basePackage=\"com.cheng.weixin.service.item.dao\"\n\t\tp:sqlSessionFactoryBeanName=\"sqlSessionFactory\" />\n\n\t<!-- 对数据源进行事务管理 -->\n\t<bean id=\"transactionManager\" class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\"\n\t\tp:dataSource-ref=\"dataSource\" />\n\t<!-- 通知 -->\n\t<tx:advice id=\"txAdvice\" transaction-manager=\"transactionManager\">\n\t  <!-- 传播行为 -->\n\t  <tx:attributes>\n\t  \t<tx:method name=\"add*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"update*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"delete*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"get*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  \t<tx:method name=\"find*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  </tx:attributes>\n\t</tx:advice>\t\n\t<!-- 哪些类的哪些方法使用事务 -->\n\t<aop:config>\n\t  <aop:advisor advice-ref=\"txAdvice\" pointcut=\"execution(* com.cheng.weixin.service.item.service.*.*(..))\"/>\n\t</aop:config>\n\t\t\n\t<!-- 开启事务注解驱动 \n    <tx:annotation-driven />\n    -->\n</beans>"
  },
  {
    "path": "weixin-service-item/src/test/java/com/cheng/item/test/TestAll.java",
    "content": "package com.cheng.item.test;\n\n/**\n * Desc:\n * Author: hp\n * Date: 2016/10/31\n */\n//@RunWith(SpringJUnit4ClassRunner.class)\n//@ContextConfiguration(locations = {\"classpath*:spring-context.xml\"})\npublic class TestAll {\n    //@Autowired\n    //private ProductService productService;\n    //\n    //@Test\n    //public void test01() {\n    //    productService.getShowPictureByProductId(\"1\");\n    //}\n\n}\n"
  },
  {
    "path": "weixin-service-item/src/test/resources/log4j.properties",
    "content": "log4j.rootLogger=DEBUG,CONSOLE\nlog4j.appender.Threshold=ERROR\n\nlog4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender\nlog4j.appender.CONSOLE.Encoding=UTF-8\nlog4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.CONSOLE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [service-cart] %p [%t] %c-<%L> %m%n\n"
  },
  {
    "path": "weixin-service-item/src/test/resources/spring-context.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/context\n    http://www.springframework.org/schema/context/spring-context-3.2.xsd\">\n\n\t<!-- 引入配置文件 -->\n\t<context:property-placeholder location=\"jdbc.properties\" />\n\n\t<!-- 打开Spring的Annotation支持 -->\n\t<context:annotation-config />\n\n\t<!-- 扫描注入  -->\n\t<context:component-scan base-package=\"com.cheng.weixin.service.item\" />\n\n\t<import resource=\"classpath:spring-mybatis.xml\"/>\n\n</beans>"
  },
  {
    "path": "weixin-service-item/src/test/resources/spring-mybatis.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:p=\"http://www.springframework.org/schema/p\"\n\txmlns:aop=\"http://www.springframework.org/schema/aop\"\n\txmlns:tx=\"http://www.springframework.org/schema/tx\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/tx\n    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd\n    http://www.springframework.org/schema/aop\n    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd\">\n\n\t<bean id=\"dataSource\" class=\"com.alibaba.druid.pool.DruidDataSource\" init-method=\"init\" destroy-method=\"close\">\n\t  <property name=\"driverClassName\" value=\"${jdbc.driverClassName}\"/>\n\t  <property name=\"url\" value=\"${jdbc.url}\"/>\n\t  <property name=\"username\" value=\"${jdbc.username}\"/>\n\t  <property name=\"password\" value=\"${jdbc.password}\"/>\n\t  <!-- 连接池最大使用连接数 -->\n\t  <property name=\"maxActive\" value=\"${jdbc.maxActive}\"/>\n\t  <!-- 初始化连接大小 -->\n\t  <property name=\"initialSize\" value=\"${jdbc.initialSize}\"/>\n\t  <!-- 获取连接最大等待时间 -->\n\t  <property name=\"maxWait\" value=\"${jdbc.maxWait}\"/>\n\t  <!-- 连接池最大空闲 -->\n\t  <!--  property name=\"maxIdle\" value=\"${jdbc.maxIdle}\"/>-->\n\t  <!-- 连接池最小空闲 -->\n\t  <property name=\"minIdle\" value=\"${jdbc.minIdle}\"/>\n\t  <!-- 自动清除无用连接 -->\n\t  <property name=\"removeAbandoned\" value=\"${jdbc.removeAbandoned}\"/>\n\t  <!-- 清除无用连接的等待时间 -->\n\t  <property name=\"removeAbandonedTimeout\" value=\"${jdbc.removeAbandonedTimeout}\"/>\n\t  <!-- 连接属性 -->\n\t  <property name=\"connectionProperties\" value=\"${jdbc.connectionProperties}\"/>\n\t</bean>\n\n  <!-- 注入SQLSession -->\n  <bean id=\"sqlSession\" class=\"org.mybatis.spring.SqlSessionTemplate\" scope=\"prototype\">\n    <constructor-arg index=\"0\" ref=\"sqlSessionFactory\"/>\n  </bean>\n\n\t<!-- mybatis配置 -->\n\t<bean id=\"sqlSessionFactory\" class=\"org.mybatis.spring.SqlSessionFactoryBean\"\n\t\tp:dataSource-ref=\"dataSource\"\n    p:configLocation=\"classpath:/mybatis/mybatis-config.xml\"\n\t\tp:typeAliasesPackage=\"com.cheng.weixin.rpc.item.entity\"\n\t\tp:mapperLocations=\"classpath:/mybatis/mapper/*.xml\" />\n\n\t<!-- spring与mybatis整合配置，扫描所有dao -->\n\t<bean class=\"org.mybatis.spring.mapper.MapperScannerConfigurer\"\n\t\tp:basePackage=\"com.cheng.weixin.service.item.dao\"\n\t\tp:sqlSessionFactoryBeanName=\"sqlSessionFactory\" />\n\n\t<!-- 对数据源进行事务管理 -->\n\t<bean id=\"transactionManager\" class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\"\n\t\tp:dataSource-ref=\"dataSource\" />\n\t<!-- 通知 -->\n\t<tx:advice id=\"txAdvice\" transaction-manager=\"transactionManager\">\n\t  <!-- 传播行为 -->\n\t  <tx:attributes>\n\t  \t<tx:method name=\"add*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"update*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"delete*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"get*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  \t<tx:method name=\"find*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  </tx:attributes>\n\t</tx:advice>\t\n\t<!-- 哪些类的哪些方法使用事务 -->\n\t<aop:config>\n\t  <aop:advisor advice-ref=\"txAdvice\" pointcut=\"execution(* com.cheng.weixin.service.item.service.*.*(..))\"/>\n\t</aop:config>\n\t\t\n\t<!-- 开启事务注解驱动 \n    <tx:annotation-driven />\n    -->\n</beans>"
  },
  {
    "path": "weixin-service-log/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-service-log</artifactId>\n  <dependencies>\n    <dependency>\n      <groupId>com.baomidou</groupId>\n      <artifactId>mybatis-plus</artifactId>\n      <version>1.4.9</version>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-config</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-service</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-rpc-log</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-rpc-log</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>junit</groupId>\n      <artifactId>junit</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>log4j</groupId>\n      <artifactId>log4j</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-log4j12</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-logging</groupId>\n      <artifactId>commons-logging</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-beanutils</groupId>\n      <artifactId>commons-beanutils</artifactId>\n    </dependency>\n\n    <dependency>\n      <groupId>com.github.pagehelper</groupId>\n      <artifactId>pagehelper</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>javax.servlet</groupId>\n      <artifactId>javax.servlet-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>mysql</groupId>\n      <artifactId>mysql-connector-java</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>druid</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjrt</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjweaver</artifactId>\n    </dependency>\n    <!-- Dubbo Start -->\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>dubbo</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.101tec</groupId>\n      <artifactId>zkclient</artifactId>\n    </dependency>\n    <!-- Dubbo End -->\n    <!-- Spring begin -->\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context-support</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-core</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-beans</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-aop</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-orm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-web</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-jdbc</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-oxm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-test</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-tx</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-expression</artifactId>\n    </dependency>\n    <!-- Spring end -->\n    <!-- rabbitmq start -->\n    <dependency>\n      <groupId>org.springframework.amqp</groupId>\n      <artifactId>spring-rabbit</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.rabbitmq</groupId>\n      <artifactId>amqp-client</artifactId>\n    </dependency>\n    <!-- rabbitmq end -->\n    <!-- MyBatis begin -->\n    <dependency>\n      <groupId>org.mybatis</groupId>\n      <artifactId>mybatis</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.mybatis</groupId>\n      <artifactId>mybatis-spring</artifactId>\n    </dependency>\n    <!-- MyBatis end -->\n  </dependencies>\n  <build>\n    <resources>\n      <resource>\n        <targetPath>${project.build.directory}/classes</targetPath>\n        <directory>src/main/resources</directory>\n        <filtering>true</filtering>\n        <includes>\n          <include>**/*.xml</include>\n          <include>**/*.properties</include>\n        </includes>\n        <excludes>\n          <exclude>rebel.xml</exclude>\n        </excludes>\n      </resource>\n      <resource>\n        <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>\n        <directory>src/main/resources/spring</directory>\n        <!--<directory>src/main/resources</directory>-->\n        <filtering>true</filtering>\n        <includes>\n          <include>spring-context.xml</include>\n        </includes>\n      </resource>\n    </resources>\n    <plugins>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-compiler-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-source-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-jar-plugin</artifactId>\n        <configuration>\n          <classesDirectory>target/classes/</classesDirectory>\n          <archive>\n            <!--生成的jar中，不要包含pom.xml和pom.properties这两个文件 -->\n            <addMavenDescriptor>false</addMavenDescriptor>\n            <manifest>\n              <mainClass>com.alibaba.dubbo.container.Main</mainClass>\n              <!-- 打包时MANIFEST.MF文件不记录时间版本 -->\n              <useUniqueVersions>false</useUniqueVersions>\n              <addClasspath>true</addClasspath>\n              <classpathPrefix>lib/</classpathPrefix>\n            </manifest>\n            <manifestEntries>\n              <Class-Path>.</Class-Path>\n            </manifestEntries>\n          </archive>\n        </configuration>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-dependency-plugin</artifactId>\n        <executions>\n          <execution>\n            <id>copy-dependencies</id>\n            <phase>package</phase>\n            <goals>\n              <goal>copy-dependencies</goal>\n            </goals>\n            <configuration>\n              <type>jar</type>\n              <includeTypes>jar</includeTypes>\n              <!--<useUniqueVersions>false</useUniqueVersions>-->\n              <outputDirectory>\n                ${project.build.directory}/lib\n              </outputDirectory>\n            </configuration>\n          </execution>\n        </executions>\n      </plugin>\n      <plugin>\n        <groupId>org.zeroturnaround</groupId>\n        <artifactId>jrebel-maven-plugin</artifactId>\n      </plugin>\n    </plugins>\n  </build>\n\n</project>"
  },
  {
    "path": "weixin-service-log/src/main/java/com/cheng/weixin/service/log/dao/LogDaoMapper.java",
    "content": "package com.cheng.weixin.service.log.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.log.entity.Log;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 日志\n * Author: hp\n * Date: 2016/10/18\n */\n@Repository\npublic interface LogDaoMapper  extends BaseDaoMapper<Log> {\n\n\n}\n"
  },
  {
    "path": "weixin-service-log/src/main/java/com/cheng/weixin/service/log/service/LogMQService.java",
    "content": "package com.cheng.weixin.service.log.service;\n\nimport com.cheng.weixin.service.log.dao.LogDaoMapper;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\n\n/**\n * Desc: MQ实现保存日志\n * Author: Cheng\n * Date: 2016/4/25 0025\n */\n\npublic class LogMQService {\n\n    private static final Logger LOGGER = LoggerFactory.getLogger(LogMQService.class);\n    @Autowired\n    private LogDaoMapper logDao;\n\n    public void saveLogs() {\n\n    }\n}\n"
  },
  {
    "path": "weixin-service-log/src/main/java/com/cheng/weixin/service/log/service/LogService.java",
    "content": "package com.cheng.weixin.service.log.service;\n\nimport com.cheng.weixin.common.utils.Exceptions;\nimport com.cheng.weixin.common.utils.StringUtils;\nimport com.cheng.weixin.rpc.log.entity.Log;\nimport com.cheng.weixin.rpc.log.enums.LogType;\nimport com.cheng.weixin.rpc.log.service.RpcLogService;\nimport com.cheng.weixin.service.log.dao.LogDaoMapper;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.Map;\n\n/**\n * Desc:\n * Author: hp\n * Date: 2016/10/18\n */\n@Service(\"logService\")\npublic class LogService implements RpcLogService {\n\n    @Autowired\n    private LogDaoMapper logDao;\n\n    @Override\n    public void saveLog(String remoteAddr, String userAgent, String requestUri, Map<String, String[]> params,\n        String method, /*Object handler,*/ Exception ex, String title, String username) {\n            Log log = new Log();\n            log.setTitle(title);\n            log.setType(ex == null ? LogType.ACCESS : LogType.EXCEPTION);\n            log.setRemoteAddr(remoteAddr);\n            log.setUserAgent(userAgent);\n            log.setRequestUri(requestUri);\n            log.setParams(params);\n            log.setMethod(method);\n            log.setUsername(username);\n            // 异步保存日志\n            new Thread(new SaveLogThread(log, /*handler,*/ ex)).start();\n        }\n\n        public class SaveLogThread implements Runnable {\n            private Log log;\n            //private Object handler;\n            private Exception ex;\n            public SaveLogThread(Log log, /*Object handler,*/ Exception ex) {\n                this.log = log;\n                //this.handler = handler;\n                this.ex = ex;\n            }\n            @Override\n            public void run() {\n                // 如果有异常，则保存异常信息\n                log.setException(Exceptions.getStackTraceToString(ex));\n                // 如果无标的并无异常日志，则不保存信息\n                if (StringUtils.isBlank(log.getTitle()) && StringUtils.isBlank(log.getException())) {\n                    return;\n                }\n                // 保存日志信息\n                log.preInsert();\n                logDao.save(log);\n            }\n    }\n\n\n\n}\n"
  },
  {
    "path": "weixin-service-log/src/main/resources/log4j.properties",
    "content": "#log4j.rootLogger=DEBUG,CONSOLE\nlog4j.rootLogger=DEBUG,FILE\nlog4j.appender.Threshold=ERROR\n\n#log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender\n#log4j.appender.CONSOLE.Encoding=UTF-8\n#log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout\n#log4j.appender.CONSOLE.layout.ConversionPattern=[service-log] %p [%t] %c-<%L> %m%n\n\nlog4j.appender.FILE=org.apache.log4j.RollingFileAppender\nlog4j.appender.FILE.Encoding=UTF-8\nlog4j.appender.FILE.File=logs/service-log.log\nlog4j.appender.FILE.MaxFileSize=4000KB\nlog4j.appender.FILE.MaxBackupIndex=10\nlog4j.appender.FILE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [service-log] %p [%t] %c-<%L> %m%n\n\n#log4j.logger.org.apache.zookeeper.ClientCnxn=ERROR"
  },
  {
    "path": "weixin-service-log/src/main/resources/mybatis/mapper/LogMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.log.dao.LogDaoMapper\">\n  <sql id=\"tableName\">log</sql>\n  <sql id=\"columns\">\n    l.id,l.type,l.title,l.remote_addr,l.request_uri,l.method,l.params,\n    l.user_agent,l.exception,l.username,l.begin_date,l.end_date,l.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,type,title,remote_addr,request_uri,method,params,user_agent,exception,username,\n    begin_date,end_date,status\n  </sql>\n  <sql id=\"logIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"type != null and type != ''\">type=#{type},</if>\n    <if test=\"title != null and title != ''\">title=#{title},</if>\n    <if test=\"remoteAddr != null and remoteAddr != ''\">remote_addr=#{remoteAddr},</if>\n    <if test=\"requestUri != null and requestUri != ''\">request_uri=#{requestUri},</if>\n    <if test=\"method != null and method != ''\">method=#{method},</if>\n    <if test=\"params != null and params != ''\">params=#{params},</if>\n    <if test=\"userAgent != null and userAgent != ''\">user_agent=#{userAgent},</if>\n    <if test=\"exception != null and exception != ''\">exception=#{exception},</if>\n    <if test=\"username != null and username != ''\">username=#{username},</if>\n    <if test=\"beginDate != null and beginDate != ''\">begin_date=#{beginDate},</if>\n    <if test=\"endDate != null and endDate != ''\">end_date=#{endDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"logSelector\">\n    select\n    <include refid=\"columns\"/>\n    from\n    <include refid=\"tableName\"/>\n    AS l\n  </sql>\n\n  <sql id=\"logWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"logUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"logIf\"/>\n    </trim>\n  </sql>\n\n  <!-- =================================================================== -->\n  <select id=\"load\" parameterType=\"log\" resultType=\"log\">\n    <include refid=\"logSelector\"/>\n    <include refid=\"logWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"log\">\n    <include refid=\"logSelector\"/>\n    <include refid=\"logWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"log\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"logUpdate\"/>\n    <include refid=\"logWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"log\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{type},#{title},#{remoteAddr},#{requestUri},#{method},#{params},\n    #{userAgent},#{exception},#{username},#{beginDate},#{endDate},#{status}\n    )\n  </insert>\n\n</mapper>\n"
  },
  {
    "path": "weixin-service-log/src/main/resources/mybatis/mybatis-config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE configuration\n        PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-config.dtd\">\n\n<configuration>\n  <settings>\n    <!-- 开启字段名和属性名驼峰匹配 -->\n    <setting name=\"mapUnderscoreToCamelCase\" value=\"true\"/>\n    <!-- 全局启用或禁用延迟加载。当禁用时，所有关联对象都会即时加载。 -->\n    <setting name=\"lazyLoadingEnabled\" value=\"true\"/>\n    <!-- 当启用时，有延迟加载属性的对象在被调用时将会完全加载任意属性。否则，每种属性将会按需要加载。 -->\n    <setting name=\"aggressiveLazyLoading\" value=\"true\"/>\n  </settings>\n  <plugins>\n    <plugin interceptor=\"com.github.pagehelper.PageHelper\">\n      <property name=\"dialect\" value=\"mysql\"/>\n    </plugin>\n  </plugins>\n</configuration>"
  },
  {
    "path": "weixin-service-log/src/main/resources/spring/spring-context.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans.xsd\n    http://www.springframework.org/schema/context\n    http://www.springframework.org/schema/context/spring-context.xsd\">\n\n\t<!-- 引入配置文件 -->\n\t<context:property-placeholder location=\"classpath:system.properties,classpath:jdbc.properties,classpath:rabbitmq.properties\"/>\n\n\t<!-- 打开Spring的Annotation支持 -->\n\t<context:annotation-config />\n\n\t<!-- 扫描注入  -->\n\t<context:component-scan base-package=\"com.cheng.weixin.service.log\" />\n\n\t<import resource=\"classpath:spring/spring-dubbo-provider.xml\"/>\n\t<import resource=\"classpath:spring/spring-mybatis.xml\"/>\n\t<import resource=\"classpath:spring/spring-rabbitmq-listen.xml\"/>\n\n</beans>"
  },
  {
    "path": "weixin-service-log/src/main/resources/spring/spring-dubbo-provider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n          http://www.springframework.org/schema/beans/spring-beans.xsd\n          http://code.alibabatech.com/schema/dubbo\n          http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n  <dubbo:application name=\"weixin-service-log\"/>\n  <dubbo:registry id=\"zk1\" address=\"${weixin.dubbo.reistry.address}\" protocol=\"${weixin.dubbo.reistry.protocol}\"/> <!-- 注意要关闭防火墙 -->\n  <dubbo:protocol id=\"mydubbo\" name=\"dubbo\" host=\"${weixin.dubbo.host.address}\" port=\"${weixin.dubbo.log.service.port}\"/>\n  <dubbo:provider registry=\"zk1\" protocol=\"mydubbo\"/>\n\n  <dubbo:service interface=\"com.cheng.weixin.rpc.log.service.RpcLogService\" ref=\"logService\" version=\"1.0\"/>\n</beans>\n"
  },
  {
    "path": "weixin-service-log/src/main/resources/spring/spring-mybatis.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:p=\"http://www.springframework.org/schema/p\"\n\txmlns:aop=\"http://www.springframework.org/schema/aop\"\n\txmlns:tx=\"http://www.springframework.org/schema/tx\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans.xsd\n    http://www.springframework.org/schema/tx\n    http://www.springframework.org/schema/tx/spring-tx.xsd\n    http://www.springframework.org/schema/aop\n    http://www.springframework.org/schema/aop/spring-aop.xsd\">\n\n\t<bean id=\"dataSource\" class=\"com.alibaba.druid.pool.DruidDataSource\" init-method=\"init\" destroy-method=\"close\">\n\t  <property name=\"driverClassName\" value=\"${jdbc.driverClassName}\"/>\n\t  <property name=\"url\" value=\"${jdbc.url}\"/>\n\t  <property name=\"username\" value=\"${jdbc.username}\"/>\n\t  <property name=\"password\" value=\"${jdbc.password}\"/>\n\t  <!-- 连接池最大使用连接数 -->\n\t  <property name=\"maxActive\" value=\"${jdbc.maxActive}\"/>\n\t  <!-- 初始化连接大小 -->\n\t  <property name=\"initialSize\" value=\"${jdbc.initialSize}\"/>\n\t  <!-- 获取连接最大等待时间 -->\n\t  <property name=\"maxWait\" value=\"${jdbc.maxWait}\"/>\n\t  <!-- 连接池最大空闲 -->\n\t  <!--  property name=\"maxIdle\" value=\"${jdbc.maxIdle}\"/>-->\n\t  <!-- 连接池最小空闲 -->\n\t  <property name=\"minIdle\" value=\"${jdbc.minIdle}\"/>\n\t  <!-- 自动清除无用连接 -->\n\t  <property name=\"removeAbandoned\" value=\"${jdbc.removeAbandoned}\"/>\n\t  <!-- 清除无用连接的等待时间 -->\n\t  <property name=\"removeAbandonedTimeout\" value=\"${jdbc.removeAbandonedTimeout}\"/>\n\t  <!-- 连接属性 -->\n\t  <property name=\"connectionProperties\" value=\"${jdbc.connectionProperties}\"/>\n\t</bean>\n\n  <!-- 注入SQLSession -->\n  <bean id=\"sqlSession\" class=\"org.mybatis.spring.SqlSessionTemplate\" scope=\"prototype\">\n    <constructor-arg index=\"0\" ref=\"sqlSessionFactory\"/>\n  </bean>\n\n\t<!-- mybatis配置 -->\n\t<bean id=\"sqlSessionFactory\" class=\"org.mybatis.spring.SqlSessionFactoryBean\"\n\t\tp:dataSource-ref=\"dataSource\"\n    p:configLocation=\"classpath:/mybatis/mybatis-config.xml\"\n\t\tp:typeAliasesPackage=\"com.cheng.weixin.rpc.log.entity\"\n\t\tp:mapperLocations=\"classpath:/mybatis/mapper/*.xml\" />\n\n\t<!-- spring与mybatis整合配置，扫描所有dao -->\n\t<bean class=\"org.mybatis.spring.mapper.MapperScannerConfigurer\"\n\t\tp:basePackage=\"com.cheng.weixin.service.log.dao\"\n\t\tp:sqlSessionFactoryBeanName=\"sqlSessionFactory\" />\n\n\t<!-- 对数据源进行事务管理 -->\n\t<bean id=\"transactionManager\" class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\"\n\t\tp:dataSource-ref=\"dataSource\" />\n\t<!-- 通知 -->\n\t<tx:advice id=\"txAdvice\" transaction-manager=\"transactionManager\">\n\t  <!-- 传播行为 -->\n\t  <tx:attributes>\n\t  \t<tx:method name=\"add*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"update*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"delete*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"get*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  \t<tx:method name=\"find*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  </tx:attributes>\n\t</tx:advice>\t\n\t<!-- 哪些类的哪些方法使用事务 -->\n\t<aop:config>\n\t  <aop:advisor advice-ref=\"txAdvice\" pointcut=\"execution(* com.cheng.weixin.service.log.service.*.*(..))\"/>\n\t</aop:config>\n\t\t\n\t<!-- 开启事务注解驱动 \n    <tx:annotation-driven />\n    -->\n</beans>"
  },
  {
    "path": "weixin-service-log/src/main/resources/spring/spring-rabbitmq-listen.xml",
    "content": "<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xmlns:rabbit=\"http://www.springframework.org/schema/rabbit\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/rabbit\n\thttp://www.springframework.org/schema/rabbit/spring-rabbit.xsd\n\thttp://www.springframework.org/schema/beans\n\thttp://www.springframework.org/schema/beans/spring-beans.xsd\">\n\n  <!-- 定义RabbitMQ的连接工厂 -->\n  <rabbit:connection-factory id=\"connectionFactory\"\n                             host=\"${rabbitmq.host}\"\n                             port=\"${rabbitmq.port}\"\n                             username=\"${rabbitmq.username}\"\n                             password=\"${rabbitmq.password}\"\n                             virtual-host=\"${rabbitmq.vhost}\"/>\n  <!-- MQ的管理，包括队列、交换器等 -->\n  <rabbit:admin connection-factory=\"connectionFactory\" />\n\n  <!-- MQ的管理，包括队列、交换器等 -->\n  <rabbit:admin connection-factory=\"connectionFactory\" />\n\n  <!-- queue 队列声明-->\n  <rabbit:queue name=\"WEIXIN-QUEUE-LOG\" auto-declare=\"true\"/>\n\n  <rabbit:listener-container connection-factory=\"connectionFactory\">\n    <rabbit:listener ref=\"consumer\" method=\"saveLogs\" queue-names=\"WEIXIN-QUEUE-LOG\" />\n  </rabbit:listener-container>\n\n  <bean id=\"consumer\" class=\"com.cheng.weixin.service.log.service.LogMQService\"/>\n</beans>"
  },
  {
    "path": "weixin-service-log/src/test/java/com/cheng/log/test/TestMain.java",
    "content": "package com.cheng.log.test;\n\nimport com.cheng.weixin.rpc.log.service.RpcLogService;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.test.context.ContextConfiguration;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\n\n/**\n * Desc:\n * Author: hp\n * Date: 2016/10/10\n */\n@RunWith(SpringJUnit4ClassRunner.class)\n@ContextConfiguration(locations = {\"classpath*:spring-context.xml\"})\npublic class TestMain {\n    @Autowired\n    private RpcLogService logService;\n\n    /**\n     * <dependency>\n     *   <groupId>com.baomidou</groupId>\n     *   <artifactId>mybatis-plus</artifactId>\n     *   <version>1.4.9</version>\n     * </dependency>\n     *\n     * DAO\n     * List<Log> selectLogList(Pagination page, Log log);\n     *\n     * Service\n     * Page<Log> selectLogPage(Page<Log> page, Log log);\n     *\n     * @Override\n     * public Page<Log> selectLogPage(Page<Log> page, Log log) {\n     *     List<Log> logs = logDao.selectLogList(page, log);\n     *     page.setRecords(logs);\n     *     return page;\n     * }\n     *\n     * <select id=\"selectLogList\" parameterType=\"log\" resultType=\"log\">\n     *   <include refid=\"logSelector\"/>\n     *   <include refid=\"logWhere\"/>\n     * </select>\n     */\n\n    @Test\n    public void test01() {\n\n        //Log log = new Log();\n        //log.setStatus(Status.LOCKED);\n        //Page<Log> logs = logService.selectLogPage(new Page<Log>(0, 5), log);\n        //System.out.println(JSON.toJSONString(logs));\n\n    }\n\n}\n"
  },
  {
    "path": "weixin-service-log/src/test/resources/LogMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.log.dao.LogDaoMapper\">\n  <sql id=\"tableName\">log</sql>\n  <sql id=\"columns\">\n    l.id,l.type,l.title,l.remote_addr,l.request_uri,l.method,l.params,\n    l.user_agent,l.exception,l.username,l.begin_date,l.end_date,l.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,type,title,remote_addr,request_uri,method,params,user_agent,exception,username,\n    begin_date,end_date,status\n  </sql>\n  <sql id=\"logIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"type != null and type != ''\">type=#{type},</if>\n    <if test=\"title != null and title != ''\">title=#{title},</if>\n    <if test=\"remoteAddr != null and remoteAddr != ''\">remote_addr=#{remoteAddr},</if>\n    <if test=\"requestUri != null and requestUri != ''\">request_uri=#{requestUri},</if>\n    <if test=\"method != null and method != ''\">method=#{method},</if>\n    <if test=\"params != null and params != ''\">params=#{params},</if>\n    <if test=\"userAgent != null and userAgent != ''\">user_agent=#{userAgent},</if>\n    <if test=\"exception != null and exception != ''\">exception=#{exception},</if>\n    <if test=\"username != null and username != ''\">username=#{username},</if>\n    <if test=\"beginDate != null and beginDate != ''\">begin_date=#{beginDate},</if>\n    <if test=\"endDate != null and endDate != ''\">end_date=#{endDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"logSelector\">\n    select\n    <include refid=\"columns\"/>\n    from\n    <include refid=\"tableName\"/>\n    AS l\n  </sql>\n\n  <sql id=\"logWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"logUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"logIf\"/>\n    </trim>\n  </sql>\n\n  <!-- =================================================================== -->\n  <select id=\"load\" parameterType=\"log\" resultType=\"log\">\n    <include refid=\"logSelector\"/>\n    <include refid=\"logWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"log\">\n    <include refid=\"logSelector\"/>\n    <include refid=\"logWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"log\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"logUpdate\"/>\n    <include refid=\"logWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"log\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{type},#{title},#{remoteAddr},#{requestUri},#{method},#{params},\n    #{userAgent},#{exception},#{username},#{beginDate},#{endDate},#{status}\n    )\n  </insert>\n\n  <!-- 测试 -->\n  <select id=\"selectLogList\" parameterType=\"log\" resultType=\"log\">\n    <include refid=\"logSelector\"/>\n    <include refid=\"logWhere\"/>\n  </select>\n\n</mapper>\n"
  },
  {
    "path": "weixin-service-log/src/test/resources/log4j.properties",
    "content": "log4j.rootLogger=DEBUG,CONSOLE\nlog4j.appender.Threshold=ERROR\n\nlog4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender\nlog4j.appender.CONSOLE.Encoding=UTF-8\nlog4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.CONSOLE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [service-cart] %p [%t] %c-<%L> %m%n\n"
  },
  {
    "path": "weixin-service-log/src/test/resources/mybatis-config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE configuration\n        PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-config.dtd\">\n\n<configuration>\n  <settings>\n    <!-- 开启字段名和属性名驼峰匹配 -->\n    <setting name=\"mapUnderscoreToCamelCase\" value=\"true\"/>\n    <!-- 全局启用或禁用延迟加载。当禁用时，所有关联对象都会即时加载。 -->\n    <setting name=\"lazyLoadingEnabled\" value=\"true\"/>\n    <!-- 当启用时，有延迟加载属性的对象在被调用时将会完全加载任意属性。否则，每种属性将会按需要加载。 -->\n    <setting name=\"aggressiveLazyLoading\" value=\"true\"/>\n  </settings>\n  <plugins>\n    <plugin interceptor=\"com.baomidou.mybatisplus.plugins.PaginationInterceptor\">\n      <property name=\"dialectType\" value=\"mysql\" />\n    </plugin>\n  </plugins>\n</configuration>"
  },
  {
    "path": "weixin-service-log/src/test/resources/spring-context.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\t\t\t xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t\t xmlns:context=\"http://www.springframework.org/schema/context\"\n\t\t\t xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans.xsd\n    http://www.springframework.org/schema/context\n    http://www.springframework.org/schema/context/spring-context.xsd\">\n\n\t<!-- 引入配置文件 -->\n\t<context:property-placeholder location=\"classpath:jdbc.properties\"/>\n\n\t<!-- 打开Spring的Annotation支持 -->\n\t<context:annotation-config />\n\n\t<!-- 扫描注入  -->\n\t<context:component-scan base-package=\"com.cheng.weixin.service.log\" />\n\n\t<import resource=\"classpath:spring-mybatis.xml\"/>\n\n</beans>"
  },
  {
    "path": "weixin-service-log/src/test/resources/spring-mybatis.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:p=\"http://www.springframework.org/schema/p\"\n\txmlns:aop=\"http://www.springframework.org/schema/aop\"\n\txmlns:tx=\"http://www.springframework.org/schema/tx\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/tx\n    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd\n    http://www.springframework.org/schema/aop\n    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd\">\n\n\t<!--<bean id=\"dataSource\" class=\"com.alibaba.druid.pool.DruidDataSource\" init-method=\"init\" destroy-method=\"close\">-->\n\t<bean name=\"dataSource\" class=\"com.alibaba.druid.pool.DruidDataSource\" init-method=\"init\" destroy-method=\"close\">\n\t  <property name=\"driverClassName\" value=\"${jdbc.driverClassName}\"/>\n\t  <property name=\"url\" value=\"${jdbc.url}\"/>\n\t  <property name=\"username\" value=\"${jdbc.username}\"/>\n\t  <property name=\"password\" value=\"${jdbc.password}\"/>\n\t  <!-- 连接池最大使用连接数 -->\n\t  <property name=\"maxActive\" value=\"${jdbc.maxActive}\"/>\n\t  <!-- 初始化连接大小 -->\n\t  <property name=\"initialSize\" value=\"${jdbc.initialSize}\"/>\n\t  <!-- 获取连接最大等待时间 -->\n\t  <property name=\"maxWait\" value=\"${jdbc.maxWait}\"/>\n\t  <!-- 连接池最大空闲 -->\n\t  <!--  property name=\"maxIdle\" value=\"${jdbc.maxIdle}\"/>-->\n\t  <!-- 连接池最小空闲 -->\n\t  <property name=\"minIdle\" value=\"${jdbc.minIdle}\"/>\n\t  <!-- 自动清除无用连接 -->\n\t  <property name=\"removeAbandoned\" value=\"${jdbc.removeAbandoned}\"/>\n\t  <!-- 清除无用连接的等待时间 -->\n\t  <property name=\"removeAbandonedTimeout\" value=\"${jdbc.removeAbandonedTimeout}\"/>\n\t  <!-- 连接属性 -->\n\t  <property name=\"connectionProperties\" value=\"${jdbc.connectionProperties}\"/>\n\t</bean>\n\n  <!-- 注入SQLSession -->\n  <bean id=\"sqlSession\" class=\"org.mybatis.spring.SqlSessionTemplate\" scope=\"prototype\">\n    <constructor-arg index=\"0\" ref=\"sqlSessionFactory\"/>\n  </bean>\n\n\t<!-- mybatis配置 -->\n\t<bean id=\"sqlSessionFactory\" class=\"com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean\"\n\t\t\t\tp:dataSource-ref=\"dataSource\"\n\t\t\t\tp:configLocation=\"classpath:mybatis-config.xml\"\n\t\t\t\tp:typeAliasesPackage=\"com.cheng.weixin.rpc.log.entity\"\n\t\t\t\tp:mapperLocations=\"classpath:LogMapper.xml\"/>\n\n\t<!-- spring与mybatis整合配置，扫描所有dao -->\n\t<bean class=\"org.mybatis.spring.mapper.MapperScannerConfigurer\"\n\t\t\t\tp:basePackage=\"com.cheng.weixin.service.log.dao\"\n\t\t\t\tp:sqlSessionFactoryBeanName=\"sqlSessionFactory\" />\n\n\t<!-- 对数据源进行事务管理 -->\n\t<bean id=\"transactionManager\" class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\"\n\t\tp:dataSource-ref=\"dataSource\" />\n\t<!-- 通知 -->\n\t<tx:advice id=\"txAdvice\" transaction-manager=\"transactionManager\">\n\t  <!-- 传播行为 -->\n\t  <tx:attributes>\n\t  \t<tx:method name=\"add*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"update*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"delete*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"get*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  \t<tx:method name=\"find*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  </tx:attributes>\n\t</tx:advice>\t\n\t<!-- 哪些类的哪些方法使用事务 -->\n\t<aop:config>\n\t  <aop:advisor advice-ref=\"txAdvice\" pointcut=\"execution(* com.cheng.weixin.service.log.service.*.*(..))\"/>\n\t</aop:config>\n\t\t\n\t<!-- 开启事务注解驱动 \n    <tx:annotation-driven />\n    -->\n</beans>"
  },
  {
    "path": "weixin-service-message/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-service-message</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-config</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-service</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-rabbitmq-model</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-rpc-message</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>junit</groupId>\n      <artifactId>junit</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>log4j</groupId>\n      <artifactId>log4j</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-log4j12</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-logging</groupId>\n      <artifactId>commons-logging</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.github.pagehelper</groupId>\n      <artifactId>pagehelper</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>javax.servlet</groupId>\n      <artifactId>javax.servlet-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>mysql</groupId>\n      <artifactId>mysql-connector-java</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>druid</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjrt</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjweaver</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.amqp</groupId>\n      <artifactId>spring-rabbit</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.rabbitmq</groupId>\n      <artifactId>amqp-client</artifactId>\n    </dependency>\n    <!-- Dubbo Start -->\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>dubbo</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.101tec</groupId>\n      <artifactId>zkclient</artifactId>\n    </dependency>\n    <!-- Dubbo End -->\n    <!-- Spring begin -->\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context-support</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-core</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-beans</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-aop</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-orm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-web</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-jdbc</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-oxm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-test</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-tx</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-expression</artifactId>\n    </dependency>\n    <!-- Spring end -->\n    <!-- MyBatis begin -->\n    <dependency>\n      <groupId>org.mybatis</groupId>\n      <artifactId>mybatis</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.mybatis</groupId>\n      <artifactId>mybatis-spring</artifactId>\n    </dependency>\n    <!-- MyBatis end -->\n  </dependencies>\n  <build>\n    <resources>\n      <resource>\n        <targetPath>${project.build.directory}/classes</targetPath>\n        <directory>src/main/resources</directory>\n        <filtering>true</filtering>\n        <includes>\n          <include>**/*.xml</include>\n          <include>**/*.properties</include>\n        </includes>\n        <excludes>\n          <exclude>rebel.xml</exclude>\n        </excludes>\n      </resource>\n      <resource>\n        <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>\n        <directory>src/main/resources/spring</directory>\n        <filtering>true</filtering>\n        <includes>\n          <include>spring-context.xml</include>\n        </includes>\n      </resource>\n    </resources>\n    <plugins>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-compiler-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-source-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-jar-plugin</artifactId>\n        <configuration>\n          <classesDirectory>target/classes/</classesDirectory>\n          <archive>\n            <!--生成的jar中，不要包含pom.xml和pom.properties这两个文件 -->\n            <addMavenDescriptor>false</addMavenDescriptor>\n            <manifest>\n              <mainClass>com.alibaba.dubbo.container.Main</mainClass>\n              <!-- 打包时MANIFEST.MF文件不记录时间版本 -->\n              <useUniqueVersions>false</useUniqueVersions>\n              <addClasspath>true</addClasspath>\n              <classpathPrefix>lib/</classpathPrefix>\n            </manifest>\n            <manifestEntries>\n              <Class-Path>.</Class-Path>\n            </manifestEntries>\n          </archive>\n        </configuration>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-dependency-plugin</artifactId>\n        <executions>\n          <execution>\n            <id>copy-dependencies</id>\n            <phase>package</phase>\n            <goals>\n              <goal>copy-dependencies</goal>\n            </goals>\n            <configuration>\n              <type>jar</type>\n              <includeTypes>jar</includeTypes>\n              <!--<useUniqueVersions>false</useUniqueVersions>-->\n              <outputDirectory>\n                ${project.build.directory}/lib\n              </outputDirectory>\n            </configuration>\n          </execution>\n        </executions>\n      </plugin>\n      <plugin>\n        <groupId>org.zeroturnaround</groupId>\n        <artifactId>jrebel-maven-plugin</artifactId>\n      </plugin>\n    </plugins>\n  </build>\n</project>"
  },
  {
    "path": "weixin-service-message/shell/service-message.sh",
    "content": "#!/bin/sh\n\n## java env\nexport JAVA_HOME=/usr/jdk/jdk1.7.0_45\nexport JRE_HOME=$JAVA_HOME/jre\n\n## service name\nAPP_NAME=message\n\nSERVICE_DIR=/usr/cheng/service/$APP_NAME\nSERVICE_NAME=weixin-service-$APP_NAME\nJAR_NAME=$SERVICE_NAME\\.jar\nPID=$SERVICE_NAME\\.pid\n\ncd $SERVICE_DIR\n\ncase \"$1\" in\n\n    start)\n        nohup $JRE_HOME/bin/java -Xms256m -Xmx512m -jar $JAR_NAME >/dev/null 2>&1 &\n        echo $! > $SERVICE_DIR/$PID\n        echo \"=== start $SERVICE_NAME\"\n        ;;\n\n    stop)\n        kill `cat $SERVICE_DIR/$PID`\n        rm -rf $SERVICE_DIR/$PID\n        echo \"=== stop $SERVICE_NAME\"\n\n        sleep 5\n\n        P_ID=`ps -ef | grep -w \"$SERVICE_NAME\" | grep -v \"grep\" | awk '{print $2}'`\n        if [ \"$P_ID\" == \"\" ]; then\n            echo \"=== $SERVICE_NAME process not exists or stop success\"\n        else\n            echo \"=== $SERVICE_NAME process pid is:$P_ID\"\n            echo \"=== begin kill $SERVICE_NAME process, pid is:$P_ID\"\n            kill -9 $P_ID\n        fi\n        ;;\n\n    restart)\n        $0 stop\n        sleep 2\n        $0 start\n        echo \"=== restart $SERVICE_NAME\"\n        ;;\n\n    *)\n        ## restart\n        $0 stop\n        sleep 2\n        $0 start\n        ;;\n\nesac\nexit 0\n\n"
  },
  {
    "path": "weixin-service-message/src/main/java/com/cheng/weixin/service/message/dao/EmailTemplateDaoMapper.java",
    "content": "package com.cheng.weixin.service.message.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.message.entity.EmailTemplate;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 邮箱模板\n * Author: 光灿\n * Date: 2016/7/10\n */\n@Repository\npublic interface EmailTemplateDaoMapper extends BaseDaoMapper<EmailTemplate> {\n}\n"
  },
  {
    "path": "weixin-service-message/src/main/java/com/cheng/weixin/service/message/dao/SmsHistoryDaoMapper.java",
    "content": "package com.cheng.weixin.service.message.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.message.entity.SmsHistory;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 短信\n * Author: 光灿\n * Date: 2016/7/10\n */\n@Repository\npublic interface SmsHistoryDaoMapper extends BaseDaoMapper<SmsHistory> {\n    /**\n     * 当天发送的短信个数\n     * @param smsHistory\n     * @return\n     */\n    int loadOneDayCount(SmsHistory smsHistory);\n    /**\n     * 当前IP发送的短信个数\n     * @param smsHistory\n     * @return\n     */\n    int loadCurrentIpCount(SmsHistory smsHistory);\n\n    /**\n     * 获取最近的一条记录\n     * @param smsHistory\n     * @return\n     */\n    SmsHistory loadNewByPhoneAndType(SmsHistory smsHistory);\n}\n"
  },
  {
    "path": "weixin-service-message/src/main/java/com/cheng/weixin/service/message/dao/SmsTemplateDaoMapper.java",
    "content": "package com.cheng.weixin.service.message.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.message.entity.SmsTemplate;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 短信模板\n * Author: 光灿\n * Date: 2016/7/10\n */\n@Repository\npublic interface SmsTemplateDaoMapper extends BaseDaoMapper<SmsTemplate> {\n    /**\n     * 获取正在使用的模板\n     * @return\n     */\n    SmsTemplate loadRegTemp();\n\n}\n"
  },
  {
    "path": "weixin-service-message/src/main/java/com/cheng/weixin/service/message/service/SmsService.java",
    "content": "package com.cheng.weixin.service.message.service;\n\nimport com.cheng.weixin.common.security.CodecUtil;\nimport com.cheng.weixin.common.utils.StringUtils;\nimport com.cheng.weixin.rabbitmq.enums.MsgType;\nimport com.cheng.weixin.rabbitmq.model.SmsModel;\nimport com.cheng.weixin.rpc.message.entity.SmsHistory;\nimport com.cheng.weixin.rpc.message.entity.SmsTemplate;\nimport com.cheng.weixin.rpc.message.service.RpcSmsService;\nimport com.cheng.weixin.service.message.dao.SmsHistoryDaoMapper;\nimport com.cheng.weixin.service.message.dao.SmsTemplateDaoMapper;\nimport org.joda.time.DateTime;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.Date;\n\n/**\n * Desc: 短信服务\n * Author: 光灿\n * Date: 2016/7/10\n */\n@Service(\"smsService\")\npublic class SmsService implements RpcSmsService {\n    private final Logger logger = LoggerFactory.getLogger(getClass());\n\n    @Autowired\n    private SmsTemplateDaoMapper smsTemplateDao;\n    @Autowired\n    private SmsHistoryDaoMapper smsHistoryDao;\n\n    @Override\n    public int getCountByDay(String phone) {\n        SmsHistory smsHistory = new SmsHistory();\n        smsHistory.setPhone(phone);\n        DateTime startOfDay = new DateTime().withTimeAtStartOfDay();\n        smsHistory.setStartOfDay(new Date(startOfDay.getMillis()));\n        return smsHistoryDao.loadOneDayCount(smsHistory);\n    }\n    @Override\n    public int getCountByIp(String ip) {\n        SmsHistory smsHistory = new SmsHistory();\n        smsHistory.setUserIp(ip);\n        DateTime startOfDay = new DateTime().withTimeAtStartOfDay();\n        smsHistory.setStartOfDay(new Date(startOfDay.getMillis()));\n        return smsHistoryDao.loadCurrentIpCount(smsHistory);\n    }\n    @Override\n    public void sendValidate(SmsModel smsModel) {\n\n        int countByDay = getCountByDay(smsModel.getPhone());\n        if (countByDay >= 4) {\n            logger.warn(\"当前手机号\"+smsModel.getPhone()+\"发送次数太多\");\n            return;\n        }\n        int countByIp = getCountByIp(smsModel.getUserIp());\n        if (countByIp >= 4) {\n            logger.warn(\"当前IP\"+smsModel.getUserIp()+\"发送次数太多\");\n            return;\n        }\n\n        SmsTemplate validateTemplate = smsTemplateDao.load(new SmsTemplate(MsgType.VALIDATE));\n        String code = CodecUtil.createRandomNum(4);\n        String content = StringUtils.replace(StringUtils.replace(validateTemplate.getContent(), \"[MSGCODE]\", code),\n                \"[TIMEOUT]\", validateTemplate.getTimeout()+\"\");\n\n        // 发送短信 开始\n        logger.info(\"开始发送短信===> \"+content);\n\n        // 保存短息历史纪录\n        SmsHistory history = new SmsHistory();\n        history.setPhone(smsModel.getPhone());\n        history.setUserIp(smsModel.getUserIp());\n        history.setContent(content);\n        history.setSender(\"system\");\n        history.setTimeout(validateTemplate.getTimeout());\n        history.setType(MsgType.VALIDATE);\n        history.setValidate(code);\n        history.preInsert();\n        smsHistoryDao.save(history);\n    }\n\n    @Override\n    public SmsHistory getInfoByPhoneAndType(String phone, MsgType type) {\n        SmsHistory history = new SmsHistory();\n        history.setPhone(phone);\n        history.setType(MsgType.VALIDATE);\n        return smsHistoryDao.loadNewByPhoneAndType(history);\n    }\n\n    @Override\n    public void sendNotice(SmsModel smsModel) {\n        logger.info(\"==================> \"+smsModel);\n\n        SmsTemplate cashConsumeTemplate = smsTemplateDao.load(new SmsTemplate(MsgType.NOTICE_CASH_COMSUME));\n        String content = StringUtils.replace(StringUtils.replace(cashConsumeTemplate.getContent(), \"[DATE]\",\n                DateTime.now().toString(\"MM月dd日HH时mm分\")), \"[AMOUNT]\", smsModel.getContent());\n\n        // 发送短信 开始\n        logger.info(\"开始发送短信===> \"+content);\n\n        // 保存短息历史纪录\n        SmsHistory history = new SmsHistory();\n        history.setPhone(smsModel.getPhone());\n        history.setUserIp(smsModel.getUserIp());\n        history.setContent(content);\n        history.setSender(\"system\");\n        history.setType(MsgType.NOTICE_CASH_COMSUME);\n        history.preInsert();\n        smsHistoryDao.save(history);\n    }\n\n    @Override\n    public void sendActivity(String msgData) {\n        logger.info(\"==================> \"+msgData);\n    }\n}\n"
  },
  {
    "path": "weixin-service-message/src/main/resources/log4j.properties",
    "content": "#log4j.rootLogger=DEBUG,CONSOLE\nlog4j.rootLogger=DEBUG,FILE\nlog4j.appender.Threshold=ERROR\n\n#log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender\n#log4j.appender.CONSOLE.Encoding=UTF-8\n#log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout\n#log4j.appender.CONSOLE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [service-system] %p [%t] %c-<%L> %m%n\n\nlog4j.appender.FILE=org.apache.log4j.RollingFileAppender\nlog4j.appender.FILE.Encoding=UTF-8\nlog4j.appender.FILE.File=logs/service-message.log\nlog4j.appender.FILE.MaxFileSize=4000KB\nlog4j.appender.FILE.MaxBackupIndex=10\nlog4j.appender.FILE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [service-message] %p [%t] %c-<%L> %m%n\n\nlog4j.logger.org.springframework.amqp.rabbit.listener.BlockingQueueConsumer=INFO\nlog4j.logger.org.apache.zookeeper.ClientCnxn=INFO"
  },
  {
    "path": "weixin-service-message/src/main/resources/mybatis/mapper/EmailTemplateMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.message.dao.EmailTemplateDaoMapper\">\n  <sql id=\"tableName\">email_template</sql>\n  <sql id=\"columns\">\n    e.id,e.type,e.content,e.is_enable,\n    e.remarks,e.create_date,e.update_date,e.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,type,content,is_enable,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"emailTemplateIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"type != null and type != ''\">type=#{type},</if>\n    <if test=\"content != null and content != ''\">content=#{content},</if>\n    <if test=\"isEnable != null and isEnable != ''\">is_enable=#{isEnable},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"emailTemplateSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS e\n  </sql>\n\n  <sql id=\"emailTemplateWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"emailTemplateUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"emailTemplateIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <!-- 根据ID获取 -->\n  <select id=\"load\" parameterType=\"EmailTemplate\" resultType=\"EmailTemplate\">\n    <include refid=\"emailTemplateSelector\"/>\n    <include refid=\"emailTemplateWhere\"/>\n  </select>\n  <!-- 获取全部信息 -->\n  <select id=\"loadAll\" resultType=\"EmailTemplate\">\n    <include refid=\"emailTemplateSelector\"/>\n    <include refid=\"emailTemplateWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"EmailTemplate\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"emailTemplateUpdate\"/>\n    <include refid=\"emailTemplateWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"EmailTemplate\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    <include refid=\"emailTemplateIf\"/>\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-message/src/main/resources/mybatis/mapper/SmsHistoryMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.message.dao.SmsHistoryDaoMapper\">\n  <sql id=\"tableName\">sms_history</sql>\n  <sql id=\"columns\">\n    s.id,s.phone,s.content,s.timeout,s.type,s.sender,s.receiver_id,s.user_ip,s.validate,\n    s.remarks,s.create_date,s.update_date,s.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,phone,content,timeout,type,sender,receiver_id,user_ip,validate,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"smsHistoryIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"phone != null and phone != ''\">phone=#{phone},</if>\n    <if test=\"content != null and content != ''\">content=#{content},</if>\n    <if test=\"timeout != null and timeout != ''\">timeout=#{timeout},</if>\n    <if test=\"type != null and type != ''\">type=#{type},</if>\n    <if test=\"sender != null and sender != ''\">sender=#{sender},</if>\n    <if test=\"receiverId != null and receiverId != ''\">receiver_id=#{receiverId},</if>\n    <if test=\"userIp != null and userIp != ''\">user_ip=#{userIp},</if>\n    <if test=\"validate != null and validate != ''\">validate=#{validate},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"smsHistorySelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS s\n  </sql>\n\n  <sql id=\"smsHistoryWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <if test=\"phone != null and phone != ''\">\n        AND phone = #{phone}\n      </if>\n      <if test=\"type != null and type != ''\">\n        AND type = #{type}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"smsHistoryUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"smsHistoryIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <!-- 根据ID获取图片 -->\n  <select id=\"load\" parameterType=\"SmsHistory\" resultType=\"SmsHistory\">\n    <include refid=\"smsHistorySelector\"/>\n    <include refid=\"smsHistoryWhere\"/>\n  </select>\n  <!-- 获取全部图片信息 -->\n  <select id=\"loadAll\" resultType=\"SmsHistory\">\n    <include refid=\"smsHistorySelector\"/>\n    <include refid=\"smsHistoryWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"SmsHistory\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"smsHistoryUpdate\"/>\n    <include refid=\"smsHistoryWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"SmsHistory\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{phone},#{content},#{timeout},#{type},#{sender},#{receiverId},#{userIp},#{validate},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n  <!-- ======================================= -->\n  <!-- 今天发送短信的个数 -->\n  <select id=\"loadOneDayCount\" parameterType=\"SmsHistory\" resultType=\"int\">\n    SELECT COUNT(id) FROM\n    <include refid=\"tableName\"/>\n    <include refid=\"smsHistoryWhere\"/>\n    AND create_date &gt; #{startOfDay}\n  </select>\n\n  <!-- 当前IP发送短信的个数 -->\n  <select id=\"loadCurrentIpCount\" parameterType=\"SmsHistory\" resultType=\"int\">\n    SELECT COUNT(id) FROM\n    <include refid=\"tableName\"/>\n    <include refid=\"smsHistoryWhere\"/>\n    AND user_ip = #{userIp}\n    AND create_date &gt; #{startOfDay}\n  </select>\n  <!-- 获取最新的一条记录 -->\n  <select id=\"loadNewByPhoneAndType\" parameterType=\"SmsHistory\" resultType=\"SmsHistory\">\n    <include refid=\"smsHistorySelector\"/>\n    <include refid=\"smsHistoryWhere\"/>\n    ORDER BY create_date DESC\n    LIMIT 1\n  </select>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-message/src/main/resources/mybatis/mapper/SmsTemplateMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.message.dao.SmsTemplateDaoMapper\">\n  <sql id=\"tableName\">sms_template</sql>\n  <sql id=\"columns\">\n    s.id,s.type,s.content,timeout,s.is_enable,\n    s.remarks,s.create_date,s.update_date,s.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,type,content,timeout,is_enable,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"smsTemplateIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"type != null and type != ''\">type=#{type},</if>\n    <if test=\"content != null and content != ''\">content=#{content},</if>\n    <if test=\"timeout != null and timeout != ''\">timeout=#{timeout},</if>\n    <if test=\"isEnable != null and isEnable != ''\">is_enable=#{isEnable},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"smsTemplateSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/>\n    AS s\n  </sql>\n\n  <sql id=\"smsTemplateWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <if test=\"type != null\">\n        AND type = #{type}\n      </if>\n      <if test=\"isEnable != null\">\n        AND is_enable = #{isEnable}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"smsTemplateUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"smsTemplateIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <!-- 根据ID获取 -->\n  <select id=\"load\" parameterType=\"SmsTemplate\" resultType=\"SmsTemplate\">\n    <include refid=\"smsTemplateSelector\"/>\n    <include refid=\"smsTemplateWhere\"/>\n  </select>\n  <!-- 获取全部信息 -->\n  <select id=\"loadAll\" resultType=\"SmsTemplate\" parameterType=\"SmsTemplate\">\n    <include refid=\"smsTemplateSelector\"/>\n    <include refid=\"smsTemplateWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"SmsTemplate\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"smsTemplateUpdate\"/>\n    <include refid=\"smsTemplateWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"SmsTemplate\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{type},#{content},#{timeout},#{isEnable},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n  <!-- ============================================================ -->\n    <!-- 获取激活的注册模板 -->\n<!--    <select id=\"loadRegTemp\" resultType=\"SmsTemplate\">\n    <include refid=\"smsTemplateSelector\"/>\n    <include refid=\"smsTemplateWhere\"/>\n    AND type = 'VALIDATE'\n    AND is_enable = 1\n  </select>-->\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-message/src/main/resources/mybatis/mybatis-config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE configuration\n        PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-config.dtd\">\n\n<configuration>\n  <settings>\n    <!-- 开启字段名和属性名驼峰匹配 -->\n    <setting name=\"mapUnderscoreToCamelCase\" value=\"true\"/>\n    <!-- 全局启用或禁用延迟加载。当禁用时，所有关联对象都会即时加载。 -->\n    <setting name=\"lazyLoadingEnabled\" value=\"true\"/>\n    <!-- 当启用时，有延迟加载属性的对象在被调用时将会完全加载任意属性。否则，每种属性将会按需要加载。 -->\n    <setting name=\"aggressiveLazyLoading\" value=\"true\"/>\n  </settings>\n  <plugins>\n    <plugin interceptor=\"com.github.pagehelper.PageHelper\">\n\n      <property name=\"dialect\" value=\"mysql\"/>\n\n    </plugin>\n  </plugins>\n</configuration>"
  },
  {
    "path": "weixin-service-message/src/main/resources/spring/spring-context.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/context\n    http://www.springframework.org/schema/context/spring-context-3.2.xsd\">\n\n\t<!-- 引入配置文件 -->\n\t<context:property-placeholder location=\"classpath:system.properties,classpath:jdbc.properties,classpath:rabbitmq.properties\" />\n\n\t<!-- 打开Spring的Annotation支持 -->\n\t<context:annotation-config />\n\n\t<!-- 扫描注入  -->\n\t<context:component-scan base-package=\"com.cheng.weixin.service.message\" />\n\n\t<import resource=\"classpath:spring/spring-dubbo-provider.xml\"/>\n\t<import resource=\"classpath:spring/spring-mybatis.xml\"/>\n\t<import resource=\"classpath:spring/spring-rabbitmq-listen.xml\"/>\n\n</beans>"
  },
  {
    "path": "weixin-service-message/src/main/resources/spring/spring-dubbo-provider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd\n          http://code.alibabatech.com/schema/dubbo\n          http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n  <dubbo:application name=\"weixin-service-message\"/>\n\n  <dubbo:registry id=\"zk1\" address=\"${weixin.dubbo.reistry.address}\" protocol=\"${weixin.dubbo.reistry.protocol}\"/> <!-- 注意要关闭防火墙 -->\n\n  <dubbo:protocol id=\"mydubbo\" name=\"dubbo\" host=\"${weixin.dubbo.host.address}\" port=\"${weixin.dubbo.message.service.port}\"/>\n\n  <dubbo:provider registry=\"zk1\" protocol=\"mydubbo\"/>\n\n  <dubbo:service interface=\"com.cheng.weixin.rpc.message.service.RpcSmsService\" ref=\"smsService\" version=\"1.0\"/>\n\n</beans>\n"
  },
  {
    "path": "weixin-service-message/src/main/resources/spring/spring-mybatis.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:p=\"http://www.springframework.org/schema/p\"\n\txmlns:aop=\"http://www.springframework.org/schema/aop\"\n\txmlns:tx=\"http://www.springframework.org/schema/tx\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/tx\n    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd\n    http://www.springframework.org/schema/aop\n    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd\">\n\n\t<bean id=\"dataSource\" class=\"com.alibaba.druid.pool.DruidDataSource\" init-method=\"init\" destroy-method=\"close\">\n\t  <property name=\"driverClassName\" value=\"${jdbc.driverClassName}\"/>\n\t  <property name=\"url\" value=\"${jdbc.url}\"/>\n\t  <property name=\"username\" value=\"${jdbc.username}\"/>\n\t  <property name=\"password\" value=\"${jdbc.password}\"/>\n\t  <!-- 连接池最大使用连接数 -->\n\t  <property name=\"maxActive\" value=\"${jdbc.maxActive}\"/>\n\t  <!-- 初始化连接大小 -->\n\t  <property name=\"initialSize\" value=\"${jdbc.initialSize}\"/>\n\t  <!-- 获取连接最大等待时间 -->\n\t  <property name=\"maxWait\" value=\"${jdbc.maxWait}\"/>\n\t  <!-- 连接池最大空闲 -->\n\t  <!--  property name=\"maxIdle\" value=\"${jdbc.maxIdle}\"/>-->\n\t  <!-- 连接池最小空闲 -->\n\t  <property name=\"minIdle\" value=\"${jdbc.minIdle}\"/>\n\t  <!-- 自动清除无用连接 -->\n\t  <property name=\"removeAbandoned\" value=\"${jdbc.removeAbandoned}\"/>\n\t  <!-- 清除无用连接的等待时间 -->\n\t  <property name=\"removeAbandonedTimeout\" value=\"${jdbc.removeAbandonedTimeout}\"/>\n\t  <!-- 连接属性 -->\n\t  <property name=\"connectionProperties\" value=\"${jdbc.connectionProperties}\"/>\n\t</bean>\n\n  <!-- 注入SQLSession -->\n  <bean id=\"sqlSession\" class=\"org.mybatis.spring.SqlSessionTemplate\" scope=\"prototype\">\n    <constructor-arg index=\"0\" ref=\"sqlSessionFactory\"/>\n  </bean>\n\n\t<!-- mybatis配置 -->\n\t<bean id=\"sqlSessionFactory\" class=\"org.mybatis.spring.SqlSessionFactoryBean\"\n\t\tp:dataSource-ref=\"dataSource\"\n    p:configLocation=\"classpath:/mybatis/mybatis-config.xml\"\n\t\tp:typeAliasesPackage=\"com.cheng.weixin.rpc.message.entity\"\n\t\tp:mapperLocations=\"classpath:/mybatis/mapper/*.xml\" />\n\n\t<!-- spring与mybatis整合配置，扫描所有dao -->\n\t<bean class=\"org.mybatis.spring.mapper.MapperScannerConfigurer\"\n\t\tp:basePackage=\"com.cheng.weixin.service.message.dao\"\n\t\tp:sqlSessionFactoryBeanName=\"sqlSessionFactory\" />\n\n\t<!-- 对数据源进行事务管理 -->\n\t<bean id=\"transactionManager\" class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\"\n\t\tp:dataSource-ref=\"dataSource\" />\n\t<!-- 通知 -->\n\t<tx:advice id=\"txAdvice\" transaction-manager=\"transactionManager\">\n\t  <!-- 传播行为 -->\n\t  <tx:attributes>\n\t  \t<tx:method name=\"add*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"update*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"delete*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"get*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  \t<tx:method name=\"find*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  </tx:attributes>\n\t</tx:advice>\t\n\t<!-- 哪些类的哪些方法使用事务 -->\n\t<aop:config>\n\t  <aop:advisor advice-ref=\"txAdvice\" pointcut=\"execution(* com.cheng.weixin.service.message.service.*.*(..))\"/>\n\t</aop:config>\n\t\t\n\t<!-- 开启事务注解驱动 \n    <tx:annotation-driven />\n    -->\n</beans>"
  },
  {
    "path": "weixin-service-message/src/main/resources/spring/spring-rabbitmq-listen.xml",
    "content": "<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xmlns:rabbit=\"http://www.springframework.org/schema/rabbit\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/rabbit\n\thttp://www.springframework.org/schema/rabbit/spring-rabbit-1.4.xsd\n\thttp://www.springframework.org/schema/beans\n\thttp://www.springframework.org/schema/beans/spring-beans-4.1.xsd\">\n\n  <!-- 定义RabbitMQ的连接工厂 -->\n  <rabbit:connection-factory id=\"connectionFactory\"\n                             host=\"${rabbitmq.host}\"\n                             port=\"${rabbitmq.port}\"\n                             username=\"${rabbitmq.username}\"\n                             password=\"${rabbitmq.password}\"\n                             virtual-host=\"${rabbitmq.vhost}\"/>\n  <!-- MQ的管理，包括队列、交换器等 -->\n  <rabbit:admin connection-factory=\"connectionFactory\" />\n\n  <!-- queue 队列声明-->\n  <rabbit:queue name=\"WEIXIN-QUEUE-SMS-VALIDATE\" auto-declare=\"true\"/> <!-- 注册 -->\n  <rabbit:queue name=\"WEIXIN-QUEUE-SMS-NOTICE\" auto-declare=\"true\"/> <!-- 通知 -->\n  <rabbit:queue name=\"WEIXIN-QUEUE-SMS-ACTIVITY\" auto-declare=\"true\"/> <!-- 活动 -->\n\n  <rabbit:listener-container connection-factory=\"connectionFactory\" message-converter=\"jackson2JsonMessageConverter\">\n    <rabbit:listener ref=\"consumer\" method=\"sendValidate\" queue-names=\"WEIXIN-QUEUE-SMS-VALIDATE\"/>\n    <rabbit:listener ref=\"consumer\" method=\"sendNotice\" queue-names=\"WEIXIN-QUEUE-SMS-NOTICE\"/>\n    <rabbit:listener ref=\"consumer\" method=\"sendActivity\" queue-names=\"WEIXIN-QUEUE-SMS-ACTIVITY\"/>\n  </rabbit:listener-container>\n\n  <bean id=\"consumer\" class=\"com.cheng.weixin.service.message.service.SmsService\"/>\n\n  <bean id=\"jackson2JsonMessageConverter\" class=\"org.springframework.amqp.support.converter.Jackson2JsonMessageConverter\"/>\n</beans>"
  },
  {
    "path": "weixin-service-message/src/test/java/com/cheng/test/TestMain.java",
    "content": "package com.cheng.test;\n\nimport com.cheng.weixin.rabbitmq.model.SmsModel;\nimport com.cheng.weixin.rpc.message.entity.SmsHistory;\nimport com.cheng.weixin.rabbitmq.enums.MsgType;\nimport com.cheng.weixin.rpc.message.service.RpcSmsService;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.test.context.ContextConfiguration;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\n\n/**\n * Desc:\n * Author: cheng\n * Date: 2016/7/11\n */\n@RunWith(SpringJUnit4ClassRunner.class)\n@ContextConfiguration(locations = {\"classpath*:spring/spring-context.xml\"})\npublic class TestMain {\n    @Autowired\n    private RpcSmsService smsService;\n\n    @Test\n    public void testSendMsgCode() {\n        SmsModel smsModel = new SmsModel();\n        smsModel.setUserIp(\"127.0.0.1\");\n        smsModel.setPhone(\"18600536683\");\n\n        smsService.sendValidate(smsModel);\n    }\n\n    @Test\n    public void testGetCountByDay() {\n        int count = smsService.getCountByDay(\"18600536683\");\n        System.out.println(count);\n    }\n    @Test\n    public void testGetCountByIP() {\n        int count = smsService.getCountByIp(\"127.0.0.1\");\n        System.out.println(count);\n    }\n    @Test\n    public void checkMsgCode() {\n        SmsHistory smsHistory = smsService.getInfoByPhoneAndType(\"18600536683\", MsgType.VALIDATE);\n        System.out.println(smsHistory);\n    }\n\n}\n"
  },
  {
    "path": "weixin-service-order/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-service-order</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-config</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-service</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-rpc-order</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>junit</groupId>\n      <artifactId>junit</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>log4j</groupId>\n      <artifactId>log4j</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-log4j12</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-logging</groupId>\n      <artifactId>commons-logging</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-beanutils</groupId>\n      <artifactId>commons-beanutils</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.github.pagehelper</groupId>\n      <artifactId>pagehelper</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>javax.servlet</groupId>\n      <artifactId>javax.servlet-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>mysql</groupId>\n      <artifactId>mysql-connector-java</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>druid</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjrt</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjweaver</artifactId>\n    </dependency>\n    <!-- Dubbo Start -->\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>dubbo</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.101tec</groupId>\n      <artifactId>zkclient</artifactId>\n    </dependency>\n    <!-- Dubbo End -->\n    <!-- Spring begin -->\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context-support</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-core</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-beans</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-aop</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-orm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-web</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-jdbc</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-oxm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-test</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-tx</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-expression</artifactId>\n    </dependency>\n    <!-- Spring end -->\n    <!-- MyBatis begin -->\n    <dependency>\n      <groupId>org.mybatis</groupId>\n      <artifactId>mybatis</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.mybatis</groupId>\n      <artifactId>mybatis-spring</artifactId>\n    </dependency>\n    <!-- MyBatis end -->\n  </dependencies>\n\n  <build>\n    <resources>\n      <resource>\n        <targetPath>${project.build.directory}/classes</targetPath>\n        <directory>src/main/resources</directory>\n        <filtering>true</filtering>\n        <includes>\n          <include>**/*.xml</include>\n          <include>**/*.properties</include>\n        </includes>\n        <excludes>\n          <exclude>rebel.xml</exclude>\n        </excludes>\n      </resource>\n      <resource>\n        <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>\n        <directory>src/main/resources/spring</directory>\n        <!--<directory>src/main/resources</directory>-->\n        <filtering>true</filtering>\n        <includes>\n          <include>spring-context.xml</include>\n        </includes>\n      </resource>\n    </resources>\n    <plugins>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-compiler-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-source-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-jar-plugin</artifactId>\n        <configuration>\n          <classesDirectory>target/classes/</classesDirectory>\n          <archive>\n            <!--生成的jar中，不要包含pom.xml和pom.properties这两个文件 -->\n            <addMavenDescriptor>false</addMavenDescriptor>\n            <manifest>\n              <mainClass>com.alibaba.dubbo.container.Main</mainClass>\n              <!-- 打包时MANIFEST.MF文件不记录时间版本 -->\n              <useUniqueVersions>false</useUniqueVersions>\n              <addClasspath>true</addClasspath>\n              <classpathPrefix>lib/</classpathPrefix>\n            </manifest>\n            <manifestEntries>\n              <Class-Path>.</Class-Path>\n            </manifestEntries>\n          </archive>\n        </configuration>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-dependency-plugin</artifactId>\n        <executions>\n          <execution>\n            <id>copy-dependencies</id>\n            <phase>package</phase>\n            <goals>\n              <goal>copy-dependencies</goal>\n            </goals>\n            <configuration>\n              <type>jar</type>\n              <includeTypes>jar</includeTypes>\n              <!--<useUniqueVersions>false</useUniqueVersions>-->\n              <outputDirectory>\n                ${project.build.directory}/lib\n              </outputDirectory>\n            </configuration>\n          </execution>\n        </executions>\n      </plugin>\n      <plugin>\n        <groupId>org.zeroturnaround</groupId>\n        <artifactId>jrebel-maven-plugin</artifactId>\n      </plugin>\n    </plugins>\n  </build>\n</project>"
  },
  {
    "path": "weixin-service-order/src/main/java/com/cheng/weixin/service/order/dao/ArayacakAddressDaoMapper.java",
    "content": "package com.cheng.weixin.service.order.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.order.entity.ArayacakAddress;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 自提地点\n * Author: hp\n * Date: 2016/9/9\n */\n@Repository\npublic interface ArayacakAddressDaoMapper extends BaseDaoMapper<ArayacakAddress> {\n}\n"
  },
  {
    "path": "weixin-service-order/src/main/java/com/cheng/weixin/service/order/dao/ArayacakDeliveryTimeDaoMapper.java",
    "content": "package com.cheng.weixin.service.order.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.order.entity.ArayacakDeliveryTime;\n\n/**\n * Desc: 自提时间\n * Author: hp\n * Date: 2016/9/9\n */\npublic interface ArayacakDeliveryTimeDaoMapper extends BaseDaoMapper<ArayacakDeliveryTime> {\n}\n"
  },
  {
    "path": "weixin-service-order/src/main/java/com/cheng/weixin/service/order/dao/CityDaoMapper.java",
    "content": "package com.cheng.weixin.service.order.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.order.entity.City;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 支付方式：城市\n * Author: hp\n * Date: 2016/9/9\n */\n@Repository\npublic interface CityDaoMapper extends BaseDaoMapper<City> {\n}\n"
  },
  {
    "path": "weixin-service-order/src/main/java/com/cheng/weixin/service/order/dao/CountryDaoMapper.java",
    "content": "package com.cheng.weixin.service.order.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.order.entity.Country;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 支付方式：区县\n * Author: hp\n * Date: 2016/9/9\n */\n@Repository\npublic interface CountryDaoMapper extends BaseDaoMapper<Country> {\n}\n"
  },
  {
    "path": "weixin-service-order/src/main/java/com/cheng/weixin/service/order/dao/DeliveryTimeDaoMapper.java",
    "content": "package com.cheng.weixin.service.order.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.order.entity.DeliveryTime;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 配送时间\n * Author: hp\n * Date: 2016/9/9\n */\n@Repository\npublic interface DeliveryTimeDaoMapper extends BaseDaoMapper<DeliveryTime> {\n}\n"
  },
  {
    "path": "weixin-service-order/src/main/java/com/cheng/weixin/service/order/dao/DeliveryTypeDaoMapper.java",
    "content": "package com.cheng.weixin.service.order.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.order.entity.DeliveryType;\n\n/**\n * Desc: 配送方式\n * Author: hp\n * Date: 2016/9/9\n */\n@Deprecated\npublic interface DeliveryTypeDaoMapper extends BaseDaoMapper<DeliveryType> {\n}\n"
  },
  {
    "path": "weixin-service-order/src/main/java/com/cheng/weixin/service/order/dao/FlowStatusDaoMapper.java",
    "content": "package com.cheng.weixin.service.order.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.order.entity.FlowStatus;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 流程状态\n * Author: hp\n * Date: 2016/9/9\n */\n@Repository\npublic interface FlowStatusDaoMapper extends BaseDaoMapper<FlowStatus> {\n\n}\n"
  },
  {
    "path": "weixin-service-order/src/main/java/com/cheng/weixin/service/order/dao/OrderInfoDaoMapper.java",
    "content": "package com.cheng.weixin.service.order.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.order.entity.OrderInfo;\nimport org.springframework.stereotype.Repository;\n\nimport java.util.List;\n\n/**\n * Desc: 订单\n * Author: hp\n * Date: 2016/9/9\n */\n@Repository\npublic interface OrderInfoDaoMapper extends BaseDaoMapper<OrderInfo> {\n    /**\n     * 获取该用户订单\n     * @param orderInfo\n     * @return\n     */\n    List<OrderInfo> loadByUserIdOrderByCreateDate(OrderInfo orderInfo);\n\n}\n"
  },
  {
    "path": "weixin-service-order/src/main/java/com/cheng/weixin/service/order/dao/OrderProductDetailDaoMapper.java",
    "content": "package com.cheng.weixin.service.order.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.order.entity.OrderProductDetail;\nimport org.springframework.stereotype.Repository;\n\nimport java.util.List;\n\n/**\n * Desc: 订单子项表-客服\n * Author: hp\n * Date: 2016/9/9\n */\n@Repository\npublic interface OrderProductDetailDaoMapper extends BaseDaoMapper<OrderProductDetail> {\n    /**\n     * 获取该订单下的详情\n     * @param orderDetail\n     * @return\n     */\n    List<OrderProductDetail> loadByOrder(OrderProductDetail orderDetail);\n}\n"
  },
  {
    "path": "weixin-service-order/src/main/java/com/cheng/weixin/service/order/dao/OrderReturnDaoMapper.java",
    "content": "package com.cheng.weixin.service.order.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.order.entity.OrderReturn;\n\n/**\n * Desc: 退单主\n * Author: hp\n * Date: 2016/9/9\n */\npublic interface OrderReturnDaoMapper extends BaseDaoMapper<OrderReturn> {\n}\n"
  },
  {
    "path": "weixin-service-order/src/main/java/com/cheng/weixin/service/order/dao/OrderReturnDetailDaoMapper.java",
    "content": "package com.cheng.weixin.service.order.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.order.entity.OrderReturnDetail;\n\n/**\n * Desc: 退单子项\n * Author: hp\n * Date: 2016/9/9\n */\npublic interface OrderReturnDetailDaoMapper extends BaseDaoMapper<OrderReturnDetail> {\n}\n"
  },
  {
    "path": "weixin-service-order/src/main/java/com/cheng/weixin/service/order/dao/PayDaoMapper.java",
    "content": "package com.cheng.weixin.service.order.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.order.entity.Pay;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 支付方式：微信支付，支付宝支付，货到付款\n * Author: hp\n * Date: 2016/9/9\n */\n@Repository\npublic interface PayDaoMapper extends BaseDaoMapper<Pay> {\n}\n"
  },
  {
    "path": "weixin-service-order/src/main/java/com/cheng/weixin/service/order/dao/ProvinceDaoMapper.java",
    "content": "package com.cheng.weixin.service.order.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.order.entity.Province;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 支付方式：省\n * Author: hp\n * Date: 2016/9/9\n */\n@Repository\npublic interface ProvinceDaoMapper extends BaseDaoMapper<Province> {\n}\n"
  },
  {
    "path": "weixin-service-order/src/main/java/com/cheng/weixin/service/order/dao/RefundTypeDaoMapper.java",
    "content": "package com.cheng.weixin.service.order.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.order.entity.RefundType;\n\n/**\n * Desc: 退款方式：微信零钱\n * Author: hp\n * Date: 2016/9/9\n */\npublic interface RefundTypeDaoMapper extends BaseDaoMapper<RefundType> {\n}\n"
  },
  {
    "path": "weixin-service-order/src/main/java/com/cheng/weixin/service/order/dao/ReturnReasonDaoMapper.java",
    "content": "package com.cheng.weixin.service.order.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.order.entity.ReturnReason;\n\n/**\n * Desc: 退货原因\n * Author: hp\n * Date: 2016/9/9\n */\npublic interface ReturnReasonDaoMapper extends BaseDaoMapper<ReturnReason> {\n}\n"
  },
  {
    "path": "weixin-service-order/src/main/java/com/cheng/weixin/service/order/dao/ReturnStatusDaoMapper.java",
    "content": "package com.cheng.weixin.service.order.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.order.entity.ReturnStatus;\n\n/**\n * Desc: 退单状态\n * Author: hp\n * Date: 2016/9/9\n */\npublic interface ReturnStatusDaoMapper extends BaseDaoMapper<ReturnStatus> {\n}\n"
  },
  {
    "path": "weixin-service-order/src/main/java/com/cheng/weixin/service/order/dao/TownDaoMapper.java",
    "content": "package com.cheng.weixin.service.order.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.order.entity.Town;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 支付方式：镇\n * Author: hp\n * Date: 2016/9/9\n */\n@Repository\npublic interface TownDaoMapper extends BaseDaoMapper<Town> {\n}\n"
  },
  {
    "path": "weixin-service-order/src/main/java/com/cheng/weixin/service/order/dao/VillageDaoMapper.java",
    "content": "package com.cheng.weixin.service.order.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.order.entity.Village;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 支付方式：村庄\n * Author: hp\n * Date: 2016/9/9\n */\n@Repository\npublic interface VillageDaoMapper extends BaseDaoMapper<Village> {\n}\n"
  },
  {
    "path": "weixin-service-order/src/main/java/com/cheng/weixin/service/order/service/OrderService.java",
    "content": "package com.cheng.weixin.service.order.service;\n\nimport com.cheng.weixin.rpc.order.entity.*;\nimport com.cheng.weixin.rpc.order.enumType.PayWay;\nimport com.cheng.weixin.rpc.order.service.RpcOrderService;\nimport com.cheng.weixin.service.order.dao.*;\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\n\n/**\n * Desc: 订单\n * Author: 光灿\n * Date: 2016/9/14\n */\n@Service(\"orderService\")\npublic class OrderService implements RpcOrderService {\n    @Autowired\n    private OrderInfoDaoMapper orderInfoDao;\n    @Autowired\n    private OrderProductDetailDaoMapper orderProductDetailDao;\n    @Autowired\n    private DeliveryTimeDaoMapper deliveryTimeDao;\n    @Autowired\n    private PayDaoMapper payDao;\n    @Autowired\n    private TownDaoMapper townDao;\n    @Autowired\n    private ArayacakAddressDaoMapper arayacakAddressDao;\n    @Autowired\n    private FlowStatusDaoMapper flowStatusDao;\n\n\n    @Override\n    public List<DeliveryTime> getAllDeliveryTimes() {\n        return deliveryTimeDao.loadAll();\n    }\n\n    @Override\n    public DeliveryTime getDeliveryTime(String id) {\n        return deliveryTimeDao.load(new DeliveryTime(id));\n    }\n\n    @Override\n    public List<Pay> getAllPay() {\n        return payDao.loadAll();\n    }\n\n    @Override\n    public PageInfo<OrderInfo> getOrderInfos(String userId, int pageNum, int pageSize) {\n        PageHelper.startPage(pageNum, pageSize);\n        List<OrderInfo> orderInfos = orderInfoDao.loadByUserIdOrderByCreateDate(new OrderInfo(userId));\n        for (OrderInfo order : orderInfos) {\n            List<OrderProductDetail> orderProductDetails = orderProductDetailDao.loadByOrder(new OrderProductDetail(order.getId()));\n            order.setOrderDetails(orderProductDetails);\n        }\n        PageInfo<OrderInfo> orderInfoPageInfo = new PageInfo<>(orderInfos);\n        //Page<OrderInfo> orderInfoPage = new Page<>();\n        //BeanUtils.copyProperties(orderInfoPage, orderInfoPageInfo);\n        //orderInfoPage.setList(orderInfos);\n        return orderInfoPageInfo;\n    }\n\n    @Override\n    public OrderInfo getOrderDetail(String id) {\n        OrderInfo orderInfo = new OrderInfo();\n        orderInfo.setId(id);\n        return orderInfoDao.load(orderInfo);\n    }\n\n    @Override\n    public OrderInfo addOrder(OrderInfo orderInfo) {\n        orderInfo.preInsert();\n        orderInfoDao.save(orderInfo);\n        return orderInfo;\n    }\n\n    @Override\n    public Pay getPay(String id) {\n        return payDao.load(new Pay(id));\n    }\n\n    @Override\n    public Pay getRecommendPay() {\n        Pay pay = new Pay();\n        pay.setRecommend(true);\n        return payDao.load(pay);\n    }\n\n    @Override\n    public List<ArayacakAddress> getArayacakAddr(String countyId, String townId) {\n        return arayacakAddressDao.loadAll(new ArayacakAddress(countyId, townId));\n    }\n\n    @Override\n    public Town getTownById(String townId) {\n        return townDao.load(new Town(townId));\n    }\n\n    @Override\n    public ArayacakAddress getArayacakAddressById(String id) {\n        return arayacakAddressDao.load(new ArayacakAddress(id));\n    }\n\n    @Override\n    public List<FlowStatus> getFlowStatusesByPayWay(PayWay payWay) {\n        FlowStatus status = new FlowStatus();\n        status.setPayWay(payWay);\n        return flowStatusDao.loadAll(status);\n    }\n\n    @Override\n    public FlowStatus getFlowStatusesById(String id) {\n        FlowStatus status = new FlowStatus();\n        status.setId(id);\n        return flowStatusDao.load(status);\n    }\n\n    @Override\n    public OrderProductDetail addOrderDetail(OrderProductDetail detail) {\n        detail.preInsert();\n        orderProductDetailDao.save(detail);\n        return detail;\n    }\n}\n"
  },
  {
    "path": "weixin-service-order/src/main/resources/log4j.properties",
    "content": "#log4j.rootLogger=DEBUG,CONSOLE\nlog4j.rootLogger=DEBUG,FILE\nlog4j.appender.Threshold=ERROR\n\n#log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender\n#log4j.appender.CONSOLE.Encoding=UTF-8\n#log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout\n#log4j.appender.CONSOLE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [service-order] %p [%t] %c-<%L> %m%n\n\nlog4j.appender.FILE=org.apache.log4j.RollingFileAppender\nlog4j.appender.FILE.Encoding=UTF-8\nlog4j.appender.FILE.File=logs/service-order.log\nlog4j.appender.FILE.MaxFileSize=4000KB\nlog4j.appender.FILE.MaxBackupIndex=10\nlog4j.appender.FILE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [service-order] %p [%t] %c-<%L> %m%n\n\nlog4j.logger.org.apache.zookeeper.ClientCnxn=INFO"
  },
  {
    "path": "weixin-service-order/src/main/resources/mybatis/mapper/ArayacakAddressMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.order.dao.ArayacakAddressDaoMapper\">\n  <sql id=\"tableName\">arayacak_address</sql>\n  <sql id=\"columns\">\n    a.id,a.name,a.province,a.city,a.country,a.town,a.village,a.address,\n    a.remarks,a.create_date,a.update_date,a.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,name,province,city,country,town,village,address,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"arayacakAddressIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"province != null and province != ''\">province=#{province},</if>\n    <if test=\"city != null and city != ''\">city=#{city},</if>\n    <if test=\"country != null and country != ''\">country=#{country},</if>\n    <if test=\"town != null and town != ''\">town=#{town},</if>\n    <if test=\"village != null and village != ''\">village=#{village},</if>\n    <if test=\"address != null and address != ''\">address=#{address},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"arayacakAddressSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS a\n  </sql>\n\n  <sql id=\"arayacakAddressWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <if test=\"country != null and country != ''\">\n        AND country = #{country}\n      </if>\n      <if test=\"town != null and town != ''\">\n        AND town = #{town}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"arayacakAddressUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"arayacakAddressIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"ArayacakAddress\" resultType=\"ArayacakAddress\">\n    <include refid=\"arayacakAddressSelector\"/>\n    <include refid=\"arayacakAddressWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"ArayacakAddress\">\n    <include refid=\"arayacakAddressSelector\"/>\n    <include refid=\"arayacakAddressWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"ArayacakAddress\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"arayacakAddressUpdate\"/>\n    <include refid=\"arayacakAddressWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"ArayacakAddress\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{name},#{province},#{city},#{country},#{town},#{village},#{address},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-order/src/main/resources/mybatis/mapper/ArayacakDeliveryTimeMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.order.dao.ArayacakDeliveryTimeDaoMapper\">\n  <sql id=\"tableName\">arayacak_delivery_time</sql>\n  <sql id=\"columns\">\n    a.id,a.name,\n    a.remarks,a.create_date,a.update_date,a.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,name,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"arayacakDeliveryTimeIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"arayacakDeliveryTimeSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS a\n  </sql>\n\n  <sql id=\"arayacakDeliveryTimeWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"arayacakDeliveryTimeUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"arayacakDeliveryTimeIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"ArayacakDeliveryTime\" resultType=\"ArayacakDeliveryTime\">\n    <include refid=\"arayacakDeliveryTimeSelector\"/>\n    <include refid=\"arayacakDeliveryTimeWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"ArayacakDeliveryTime\">\n    <include refid=\"arayacakDeliveryTimeSelector\"/>\n    <include refid=\"arayacakDeliveryTimeWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"ArayacakDeliveryTime\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"arayacakDeliveryTimeUpdate\"/>\n    <include refid=\"arayacakDeliveryTimeWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"ArayacakDeliveryTime\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{name},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-order/src/main/resources/mybatis/mapper/CityMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.order.dao.CityDaoMapper\">\n  <sql id=\"tableName\">city</sql>\n  <sql id=\"columns\">\n    c.id,c.name,\n    c.remarks,c.create_date,c.update_date,c.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,name,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"cityIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null\">update_date=#{updateDate},</if>\n    <if test=\"status != null\">status=#{status}</if>\n  </sql>\n  <sql id=\"citySelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/>\n    AS c\n  </sql>\n\n  <sql id=\"cityWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"cityUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"cityIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"city\" resultType=\"city\">\n    <include refid=\"citySelector\"/>\n    <include refid=\"cityWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"city\">\n    <include refid=\"citySelector\"/>\n    <include refid=\"cityWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"city\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"cityUpdate\"/>\n    <include refid=\"cityWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"city\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{name},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-order/src/main/resources/mybatis/mapper/CountryMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.order.dao.CountryDaoMapper\">\n  <sql id=\"tableName\">country</sql>\n  <sql id=\"columns\">\n    c.id,c.name,\n    c.remarks,c.create_date,c.update_date,c.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,name,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"countryIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null\">update_date=#{updateDate},</if>\n    <if test=\"status != null\">status=#{status}</if>\n  </sql>\n  <sql id=\"countrySelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/>\n    AS c\n  </sql>\n\n  <sql id=\"countryWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"countryUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"countryIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"country\" resultType=\"country\">\n    <include refid=\"countrySelector\"/>\n    <include refid=\"countryWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"country\">\n    <include refid=\"countrySelector\"/>\n    <include refid=\"countryWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"country\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"countryUpdate\"/>\n    <include refid=\"countryWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"country\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{name},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-order/src/main/resources/mybatis/mapper/DeliveryTimeMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.order.dao.DeliveryTimeDaoMapper\">\n  <sql id=\"tableName\">delivery_time</sql>\n  <sql id=\"columns\">\n    a.id,a.name,\n    a.remarks,a.create_date,a.update_date,a.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,name,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"deliveryTimeIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"deliveryTimeSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS a\n  </sql>\n\n  <sql id=\"deliveryTimeWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"deliveryTimeUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"deliveryTimeIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"DeliveryTime\" resultType=\"DeliveryTime\">\n    <include refid=\"deliveryTimeSelector\"/>\n    <include refid=\"deliveryTimeWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"DeliveryTime\">\n    <include refid=\"deliveryTimeSelector\"/>\n    <include refid=\"deliveryTimeWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"DeliveryTime\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"deliveryTimeUpdate\"/>\n    <include refid=\"deliveryTimeWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"DeliveryTime\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{name},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-order/src/main/resources/mybatis/mapper/DeliveryTypeMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.order.dao.DeliveryTypeDaoMapper\">\n  <sql id=\"tableName\">delivery_type</sql>\n  <sql id=\"columns\">\n    a.id,a.name,\n    a.remarks,a.create_date,a.update_date,a.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,name,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"deliveryTypeIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"deliveryTypeSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS a\n  </sql>\n\n  <sql id=\"deliveryTypeWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"deliveryTypeUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"deliveryTypeIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"deliveryType\" resultType=\"deliveryType\">\n    <include refid=\"deliveryTypeSelector\"/>\n    <include refid=\"deliveryTypeWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"deliveryType\">\n    <include refid=\"deliveryTypeSelector\"/>\n    <include refid=\"deliveryTypeWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"deliveryType\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"deliveryTypeUpdate\"/>\n    <include refid=\"deliveryTypeWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"deliveryType\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{name},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-order/src/main/resources/mybatis/mapper/FlowStatusMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.order.dao.FlowStatusDaoMapper\">\n  <sql id=\"tableName\">flow_status</sql>\n  <sql id=\"columns\">\n    f.id,f.name,f.pre_status_id,f.next_status_id,f.pay_way,f.order_by,\n    f.remarks,f.create_date,f.update_date,f.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,name,pre_status_id,next_status_id,pay_way,order_by,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"flowStatusIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"preStatusId != null and preStatusId != ''\">pre_status_id=#{preStatusId},</if>\n    <if test=\"nextStatusId != null and nextStatusId != ''\">next_status_id=#{nextStatusId},</if>\n    <if test=\"payWay != null\">pay_way=#{payWay},</if>\n    <if test=\"orderBy != null\">order_by=#{orderBy},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null\">update_date=#{updateDate},</if>\n    <if test=\"status != null\">status=#{status}</if>\n  </sql>\n  <sql id=\"flowStatusSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/>\n    AS f\n  </sql>\n\n  <sql id=\"flowStatusWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <if test=\"payWay != null\">\n        pay_way = #{payWay}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n    ORDER BY order_by\n  </sql>\n\n  <sql id=\"flowStatusUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"flowStatusIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"FlowStatus\" resultType=\"FlowStatus\">\n    <include refid=\"flowStatusSelector\"/>\n    <include refid=\"flowStatusWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"FlowStatus\">\n    <include refid=\"flowStatusSelector\"/>\n    <include refid=\"flowStatusWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"FlowStatus\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"flowStatusUpdate\"/>\n    <include refid=\"flowStatusWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"FlowStatus\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{name},#{preStatusId},#{nextStatusId},#{payWay},#{orderBy},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-order/src/main/resources/mybatis/mapper/OrderInfoMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.order.dao.OrderInfoDaoMapper\">\n  <sql id=\"tableName\">order_info</sql>\n  <sql id=\"columns\">\n    o.id,o.account_id,o.oid,o.relate_oid,o.amount_payable,o.amount_paid,o.consignee,o.mobile,o.address,o.delivery_time,o.pay,o.arayacak_address,\n    o.arayacak_delivery_time,o.province,o.city,o.country,o.village,o.order_type,o.freight_reduce,o.freight_payable,o.bonus_point_reduce_price,o.product_total_price,o.discount,\n    o.balance_offset,o.remark_customer,o.post_code,o.telephone,o.email,o.pay_time,o.pay_way,o.exchange_oid,o.coupon_code,o.coupon_reduce_price,o.flow_status,o.is_free_account_level,o.comment_id,o.since,o.order_status,\n    o.remarks,o.create_date,o.update_date,o.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,account_id,oid,relate_oid,amount_payable,amount_paid,consignee,mobile,address,delivery_time,pay,arayacak_address,arayacak_delivery_time,\n    province,city,country,village,order_type,freight_reduce,freight_payable,product_total_price,discount,remark_customer,balance_offset,post_code,\n    telephone,email,pay_time,pay_way,exchange_oid,coupon_code,coupon_reduce_price,flow_status,bonus_point_reduce_price,is_free_account_level,comment_id,since,order_status,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"orderInfoIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"accountId != null and accountId != ''\">account_id=#{accountId},</if>\n    <if test=\"oid != null and oid != ''\">oid=#{oid},</if>\n    <if test=\"relateOid != null and relateOid != ''\">relate_oid=#{relateOid},</if>\n    <if test=\"amountPayable != null and amountPayable != ''\">amount_payable=#{amountPayable},</if>\n    <if test=\"amountPaid != null and amountPaid != ''\">amount_paid=#{amountPaid},</if>\n    <if test=\"consignee != null and consignee != ''\">consignee=#{consignee},</if>\n    <if test=\"mobile != null and mobile != ''\">mobile=#{mobile},</if>\n    <if test=\"address != null and address != ''\">address=#{address},</if>\n    <if test=\"deliveryTime != null and deliveryTime != ''\">delivery_time=#{deliveryTime},</if>\n    <if test=\"pay != null and pay != ''\">pay=#{pay},</if>\n    <if test=\"arayacakAddress != null and arayacakAddress != ''\">arayacak_address=#{arayacakAddress},</if>\n    <if test=\"arayacakDeliveryTime != null and arayacakDeliveryTime != ''\">arayacak_delivery_time=#{arayacakDeliveryTime},</if>\n    <if test=\"province != null and province != ''\">province=#{province},</if>\n    <if test=\"city != null and city != ''\">city=#{city},</if>\n    <if test=\"country != null and country != ''\">country=#{country},</if>\n    <if test=\"village != null and village != ''\">village=#{village},</if>\n    <if test=\"orderType != null and orderType != ''\">order_type=#{orderType},</if>\n    <if test=\"freightReduce != null and freightReduce != ''\">freight_reduce=#{freightReduce},</if>\n    <if test=\"freightPayable != null and freightPayable != ''\">freight_payable=#{freightPayable},</if>\n    <if test=\"productTotalPrice != null and productTotalPrice != ''\">product_total_price=#{productTotalPrice},</if>\n    <if test=\"discount != null and discount != ''\">discount=#{discount},</if>\n    <if test=\"balanceOffset != null and balanceOffset != ''\">balance_offset=#{balanceOffset},</if>\n    <if test=\"remarkCustomer != null and remarkCustomer != ''\">remark_customer=#{remarkCustomer},</if>\n    <if test=\"postCode != null and postCode != ''\">post_code=#{postCode},</if>\n    <if test=\"telephone != null and telephone != ''\">telephone=#{telephone},</if>\n    <if test=\"email != null and email != ''\">email=#{email},</if>\n    <if test=\"payTime != null and payTime != ''\">pay_time=#{payTime},</if>\n    <if test=\"payWay != null and payWay != ''\">pay_way=#{payWay},</if>\n    <if test=\"exchangeOid != null and exchangeOid != ''\">exchange_oid=#{exchangeOid},</if>\n    <if test=\"couponCode != null and couponCode != ''\">coupon_code=#{couponCode},</if>\n    <if test=\"couponReducePrice != null and couponReducePrice != ''\">coupon_reduce_price=#{couponReducePrice},</if>\n    <if test=\"flowStatus != null and flowStatus != ''\">flow_status=#{flowStatus},</if>\n    <if test=\"bonusPointReducePrice != null and bonusPointReducePrice != ''\">bonus_point_reduce_price=#{bonusPointReducePrice},</if>\n    <if test=\"isFreeAccountLevel != null and isFreeAccountLevel != ''\">is_free_account_level=#{isFreeAccountLevel},</if>\n    <if test=\"commentId != null and commentId != ''\">comment_Id=#{commentId},</if>\n    <if test=\"since != null and since != ''\">since=#{since},</if>\n    <if test=\"orderStatus != null\">order_status=#{orderStatus},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null\">update_date=#{updateDate},</if>\n    <if test=\"status != null\">status=#{status}</if>\n  </sql>\n  <sql id=\"orderInfoSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS o\n  </sql>\n\n  <sql id=\"orderInfoWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <if test=\"accountId != null and accountId != ''\">\n        account_id = #{accountId}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"orderInfoUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"orderInfoIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"OrderInfo\" resultType=\"OrderInfo\">\n    <include refid=\"orderInfoSelector\"/>\n    <include refid=\"orderInfoWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"OrderInfo\">\n    <include refid=\"orderInfoSelector\"/>\n    <include refid=\"orderInfoWhere\"/>\n  </select>\n  <!-- 获取全部 -->\n  <select id=\"loadByUserIdOrderByCreateDate\" resultType=\"OrderInfo\">\n    <include refid=\"orderInfoSelector\"/>\n    <include refid=\"orderInfoWhere\"/>\n    ORDER BY create_date DESC\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"OrderInfo\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"orderInfoUpdate\"/>\n    <include refid=\"orderInfoWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"OrderInfo\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{accountId},#{oid},#{relateOid},#{amountPayable},#{amountPaid},#{consignee},#{mobile},#{address},#{deliveryTime},#{pay},#{arayacakAddress},#{arayacakDeliveryTime},\n    #{province},#{city},#{country},#{village},#{orderType},#{freightReduce},#{freightPayable},#{productTotalPrice},#{discount},#{remarkCustomer},#{balanceOffset},#{postCode},\n    #{telephone},#{email},#{payTime},#{payWay},#{exchangeOid},#{couponCode},#{couponReducePrice},#{flowStatus},#{bonusPointReducePrice},#{isFreeAccountLevel},#{commentId},#{since},#{orderStatus},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-order/src/main/resources/mybatis/mapper/OrderProductDetailMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.order.dao.OrderProductDetailDaoMapper\">\n  <sql id=\"tableName\">order_product_detail</sql>\n  <sql id=\"columns\">\n    o.id,order_info_id,o.oid,o.name,o.quantity,o.subtotal,o.market_price,\n    o.sale_price,o.deal_price,o.discount_rate,o.is_comment,o.is_gift,\n    o.remarks,o.create_date,o.update_date,o.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,order_info_id,oid,name,quantity,subtotal,market_price,\n    sale_price,deal_price,discount_rate,is_comment,is_gift,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"orderProductDetailIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"orderInfoId != null and orderInfoId != ''\">order_info_id=#{orderInfoId},</if>\n    <if test=\"oid != null and oid != ''\">oid=#{oid},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"quantity != null and quantity != ''\">quantity=#{quantity},</if>\n    <if test=\"subtotal != null and subtotal != ''\">subtotal=#{subtotal},</if>\n    <if test=\"marketPrice != null and marketPrice != ''\">market_price=#{marketPrice},</if>\n    <if test=\"salePrice != null and salePrice != ''\">sale_price=#{salePrice},</if>\n    <if test=\"dealPrice != null and dealPrice != ''\">deal_price=#{dealPrice},</if>\n    <if test=\"discountRate != null and discountRate != ''\">discount_rate=#{discountRate},</if>\n    <if test=\"isComment != null and isComment != ''\">is_comment=#{isComment},</if>\n    <if test=\"isGift != null and isGift != ''\">is_gift=#{isGift},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"orderProductDetailSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS o\n  </sql>\n\n  <sql id=\"orderProductDetailWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <if test=\"orderInfoId != null and orderInfoId != ''\">\n        order_info_id = #{orderInfoId}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"orderProductDetailUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"orderProductDetailIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"orderProductDetail\" resultType=\"orderProductDetail\">\n    <include refid=\"orderProductDetailSelector\"/>\n    <include refid=\"orderProductDetailWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"orderProductDetail\">\n    <include refid=\"orderProductDetailSelector\"/>\n    <include refid=\"orderProductDetailWhere\"/>\n  </select>\n\n  <!-- 获取该订单下的商品详情 -->\n  <select id=\"loadByOrder\" resultType=\"orderProductDetail\">\n    <include refid=\"orderProductDetailSelector\"/>\n    <include refid=\"orderProductDetailWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"orderProductDetail\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"orderProductDetailUpdate\"/>\n    <include refid=\"orderProductDetailWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"orderProductDetail\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{orderInfoId},#{oid},#{name},#{quantity},#{subtotal},#{marketPrice},\n    #{salePrice},#{dealPrice},#{discountRate},#{isComment},#{isGift},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-order/src/main/resources/mybatis/mapper/OrderReturnDetailMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.order.dao.orderReturnDetailDetailDaoMapper\">\n  <sql id=\"tableName\">order_return_detail</sql>\n  <sql id=\"columns\">\n    o.id,o.return_oid,o.no,o.name,o.quantity,o.subtatal,o.market_price,o.sale_price,o.deal_price,o.discount_rate,o.is_gift,\n    o.remorks,o.creote_dote,o.updote_dote,o.stotus\n  </sql>\n  <sql id=\"insertColumns\">\n    id,return_oid,no,name,quantity,subtatal,market_price,sale_price,deal_price,discount_rate,is_gift,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"orderReturnDetailIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"returnOid != null and returnOid != ''\">return_oid=#{returnOid},</if>\n    <if test=\"no != null and no != ''\">no=#{no},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"quantity != null and quantity != ''\">quantity=#{quantity},</if>\n    <if test=\"subtatal != null and subtatal != ''\">subtatal=#{subtatal},</if>\n    <if test=\"marketPrice != null and marketPrice != ''\">market_price=#{marketPrice},</if>\n    <if test=\"salePrice != null and salePrice != ''\">sale_price=#{salePrice},</if>\n    <if test=\"dealPrice != null and dealPrice != ''\">deal_price=#{dealPrice},</if>\n    <if test=\"discountRate != null and discountRate != ''\">discount_rate=#{discountRate},</if>\n    <if test=\"isGift != null and isGift != ''\">is_gift=#{isGift},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"orderReturnDetailSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS a\n  </sql>\n\n  <sql id=\"orderReturnDetailWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"orderReturnDetailUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"orderReturnDetailIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"orderReturnDetail\" resultType=\"orderReturnDetail\">\n    <include refid=\"orderReturnDetailSelector\"/>\n    <include refid=\"orderReturnDetailWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"orderReturnDetail\">\n    <include refid=\"orderReturnDetailSelector\"/>\n    <include refid=\"orderReturnDetailWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"orderReturnDetail\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"orderReturnDetailUpdate\"/>\n    <include refid=\"orderReturnDetailWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"orderReturnDetail\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{return_oid},#{no},#{name},#{quantity},#{subtatal},#{market_price},#{sale_price},#{deal_price},#{discount_rate},#{is_gift},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-order/src/main/resources/mybatis/mapper/OrderReturnMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.order.dao.OrderReturnDaoMapper\">\n  <sql id=\"tableName\">order_return</sql>\n  <sql id=\"columns\">\n    o.id,o.access_id,o.return_id,o.order_info_oid,o.order_info_id,o.refund_payable,o.refund_paid,o.sale_price_tatal,o.consignee,o.mobile,\n    o.address,o.province,o.city,o.country,o.return_status_id,o.freight,o.product_total_price,o.remark_system,o.ip,o.post_code,o.telephone,\n    o.email,o.return_reason_id,o.custom_return_reason,o.refund_type_id,o.custom_price\n    o.remorks,o.creote_dote,o.updote_dote,o.stotus\n  </sql>\n  <sql id=\"insertColumns\">\n    id,access_id,return_id,order_info_oid,order_info_id,refund_payable,refund_paid,sale_price_tatal,consignee,mobile,address,\n    province,city,country,return_status_id,freight,product_total_price,remark_system,ip,post_code,telephone,email,return_reason_id,\n    custom_return_reason,refund_type_id,custom_price\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"orderReturnIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"accountId != null and accountId != ''\">account_id=#{accountId},</if>\n    <if test=\"returnId != null and returnId != ''\">relate_oid=#{returnId},</if>\n    <if test=\"orderReturnOid != null and orderReturnOid != ''\">order_info_oid=#{orderReturnOid},</if>\n    <if test=\"orderReturnId != null and orderReturnId != ''\">order_info_id=#{orderReturnId},</if>\n    <if test=\"refundPayable != null and refundPayable != ''\">refund_payable=#{refundPayable},</if>\n    <if test=\"refundPaid != null and refundPaid != ''\">refund_paid=#{refundPaid},</if>\n    <if test=\"salePriceTatal != null and salePriceTatal != ''\">sale_price_tatal=#{salePriceTatal},</if>\n    <if test=\"consignee != null and consignee != ''\">consignee=#{consignee},</if>\n    <if test=\"mobile != null and mobile != ''\">mobile=#{mobile},</if>\n    <if test=\"address != null and address != ''\">address=#{address},</if>\n    <if test=\"province != null and province != ''\">province=#{province},</if>\n    <if test=\"city != null and city != ''\">city=#{city},</if>\n    <if test=\"country != null and country != ''\">country=#{country},</if>\n    <if test=\"returnStatusId != null and returnStatusId != ''\">return_status_id=#{returnStatusId},</if>\n    <if test=\"freight != null and freight != ''\">freight=#{freight},</if>\n    <if test=\"productTotalPrice != null and productTotalPrice != ''\">product_total_price=#{productTotalPrice},</if>\n    <if test=\"remarkSystem != null and remarkSystem != ''\">remark_system=#{remarkSystem},</if>\n    <if test=\"ip != null and ip != ''\">ip=#{ip},</if>\n    <if test=\"postCode != null and postCode != ''\">post_code=#{postCode},</if>\n    <if test=\"telephone != null and telephone != ''\">telephone=#{telephone},</if>\n    <if test=\"email != null and email != ''\">email=#{email},</if>\n    <if test=\"returnReasonId != null and returnReasonId != ''\">return_reason_id=#{returnReasonId},</if>\n    <if test=\"customReturnReason != null and customReturnReason != ''\">custom_return_reason=#{customReturnReason},</if>\n    <if test=\"refundTypeId != null and refundTypeId != ''\">refund_type_id=#{refundTypeId},</if>\n    <if test=\"customPrice != null and customPrice != ''\">custom_price=#{customPrice},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"orderReturnSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS a\n  </sql>\n\n  <sql id=\"orderReturnWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"orderReturnUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"orderReturnIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"orderReturn\" resultType=\"orderReturn\">\n    <include refid=\"orderReturnSelector\"/>\n    <include refid=\"orderReturnWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"orderReturn\">\n    <include refid=\"orderReturnSelector\"/>\n    <include refid=\"orderReturnWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"orderReturn\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"orderReturnUpdate\"/>\n    <include refid=\"orderReturnWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"orderReturn\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{access_id},#{return_id},#{order_info_oid},#{order_info_id},#{refund_payable},#{refund_paid},#{sale_price_tatal},\n    #{consignee},#{mobile},#{address},#{province},#{city},#{country},#{return_status_id},#{freight},#{product_total_price},\n    #{remark_system},#{ip},#{post_code},#{telephone},#{email},#{return_reason_id},#{custom_return_reason},#{refund_type_id},#{custom_price},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-order/src/main/resources/mybatis/mapper/PayMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.order.dao.PayDaoMapper\">\n  <sql id=\"tableName\">pay</sql>\n  <sql id=\"columns\">\n    p.id,p.name,p.pay_way,p.icon,p.order_by,p.recommend,\n    p.remarks,p.create_date,p.update_date,p.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,name,pay_way,icon,order_by,recommend,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"payIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"payWay != null and payWay != ''\">pay_way=#{payWay},</if>\n    <if test=\"icon != null and icon != ''\">icon=#{icon},</if>\n    <if test=\"orderBy != null and orderBy != ''\">order_by=#{orderBy},</if>\n    <if test=\"recommend != null and recommend != ''\">recommend=#{recommend},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null\">update_date=#{updateDate},</if>\n    <if test=\"status != null\">status=#{status}</if>\n  </sql>\n  <sql id=\"paySelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/>\n    AS p\n  </sql>\n\n  <sql id=\"payWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <if test=\"recommend != null\">\n        AND recommend = #{recommend}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n    ORDER BY order_by\n  </sql>\n\n  <sql id=\"payUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"payIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"pay\" resultType=\"pay\">\n    <include refid=\"paySelector\"/>\n    <include refid=\"payWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"pay\">\n    <include refid=\"paySelector\"/>\n    <include refid=\"payWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"pay\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"payUpdate\"/>\n    <include refid=\"payWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"pay\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{name},#{payWay},#{icon},#{orderBy},#{recommend},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-order/src/main/resources/mybatis/mapper/ProvinceMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.order.dao.ProvinceDaoMapper\">\n  <sql id=\"tableName\">province</sql>\n  <sql id=\"columns\">\n    p.id,p.name,\n    p.remarks,p.create_date,p.update_date,p.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,name,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"provinceIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null\">update_date=#{updateDate},</if>\n    <if test=\"status != null\">status=#{status}</if>\n  </sql>\n  <sql id=\"provinceSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/>\n    AS p\n  </sql>\n\n  <sql id=\"provinceWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"provinceUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"provinceIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"province\" resultType=\"province\">\n    <include refid=\"provinceSelector\"/>\n    <include refid=\"provinceWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"province\">\n    <include refid=\"provinceSelector\"/>\n    <include refid=\"provinceWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"province\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"provinceUpdate\"/>\n    <include refid=\"provinceWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"province\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{name},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-order/src/main/resources/mybatis/mapper/RefundTypeMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.order.dao.RefundTypeDaoMapper\">\n  <sql id=\"tableName\">refund_type</sql>\n  <sql id=\"columns\">\n    a.id,a.name,\n    a.remarks,a.create_date,a.update_date,a.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,name,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"refundTypeIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"refundTypeSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS a\n  </sql>\n\n  <sql id=\"refundTypeWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"refundTypeUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"refundTypeIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"RefundType\" resultType=\"RefundType\">\n    <include refid=\"refundTypeSelector\"/>\n    <include refid=\"refundTypeWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"RefundType\">\n    <include refid=\"refundTypeSelector\"/>\n    <include refid=\"refundTypeWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"RefundType\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"refundTypeUpdate\"/>\n    <include refid=\"refundTypeWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"RefundType\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{name},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-order/src/main/resources/mybatis/mapper/ReturnReasonMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.order.dao.ReturnReasonDaoMapper\">\n  <sql id=\"tableName\">return_reason</sql>\n  <sql id=\"columns\">\n    a.id,a.name,\n    a.remarks,a.create_date,a.update_date,a.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,name,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"returnReasonIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"returnReasonSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS a\n  </sql>\n\n  <sql id=\"returnReasonWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"returnReasonUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"returnReasonIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"ReturnReason\" resultType=\"ReturnReason\">\n    <include refid=\"returnReasonSelector\"/>\n    <include refid=\"returnReasonWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"ReturnReason\">\n    <include refid=\"returnReasonSelector\"/>\n    <include refid=\"returnReasonWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"ReturnReason\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"returnReasonUpdate\"/>\n    <include refid=\"returnReasonWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"ReturnReason\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{name},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-order/src/main/resources/mybatis/mapper/ReturnStatusMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.order.dao.ReturnStatusDaoMapper\">\n  <sql id=\"tableName\">return_status</sql>\n  <sql id=\"columns\">\n    a.id,a.name,\n    a.remarks,a.create_date,a.update_date,a.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,name,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"returnStatusIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"returnStatusSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS a\n  </sql>\n\n  <sql id=\"returnStatusWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"returnStatusUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"returnStatusIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"returnStatus\" resultType=\"returnStatus\">\n    <include refid=\"returnStatusSelector\"/>\n    <include refid=\"returnStatusWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"returnStatus\">\n    <include refid=\"returnStatusSelector\"/>\n    <include refid=\"returnStatusWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"returnStatus\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"returnStatusUpdate\"/>\n    <include refid=\"returnStatusWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"returnStatus\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{name},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-order/src/main/resources/mybatis/mapper/TownMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.order.dao.TownDaoMapper\">\n  <sql id=\"tableName\">town</sql>\n  <sql id=\"columns\">\n    t.id,t.name,\n    t.remarks,t.create_date,t.update_date,t.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,name,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"townIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null\">update_date=#{updateDate},</if>\n    <if test=\"status != null\">status=#{status}</if>\n  </sql>\n  <sql id=\"townSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/>\n    AS t\n  </sql>\n\n  <sql id=\"townWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"townUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"townIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"town\" resultType=\"town\">\n    <include refid=\"townSelector\"/>\n    <include refid=\"townWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"town\">\n    <include refid=\"townSelector\"/>\n    <include refid=\"townWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"town\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"townUpdate\"/>\n    <include refid=\"townWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"town\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{name},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-order/src/main/resources/mybatis/mapper/VillageMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.order.dao.VillageDaoMapper\">\n  <sql id=\"tableName\">village</sql>\n  <sql id=\"columns\">\n    v.id,v.name,\n    v.remarks,v.create_date,v.update_date,v.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,name,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"villageIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null\">update_date=#{updateDate},</if>\n    <if test=\"status != null\">status=#{status}</if>\n  </sql>\n  <sql id=\"villageSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/>\n    AS p\n  </sql>\n\n  <sql id=\"villageWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"villageUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"villageIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"village\" resultType=\"village\">\n    <include refid=\"villageSelector\"/>\n    <include refid=\"villageWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" parameterType=\"village\" resultType=\"village\">\n    <include refid=\"villageSelector\"/>\n    <include refid=\"villageWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"village\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"villageUpdate\"/>\n    <include refid=\"villageWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"village\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{name},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-order/src/main/resources/mybatis/mybatis-config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE configuration\n        PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-config.dtd\">\n\n<configuration>\n  <settings>\n    <!-- 开启字段名和属性名驼峰匹配 -->\n    <setting name=\"mapUnderscoreToCamelCase\" value=\"true\"/>\n    <!-- 全局启用或禁用延迟加载。当禁用时，所有关联对象都会即时加载。 -->\n    <setting name=\"lazyLoadingEnabled\" value=\"true\"/>\n    <!-- 当启用时，有延迟加载属性的对象在被调用时将会完全加载任意属性。否则，每种属性将会按需要加载。 -->\n    <setting name=\"aggressiveLazyLoading\" value=\"true\"/>\n  </settings>\n  <plugins>\n    <plugin interceptor=\"com.github.pagehelper.PageHelper\">\n      <property name=\"dialect\" value=\"mysql\"/>\n    </plugin>\n  </plugins>\n</configuration>"
  },
  {
    "path": "weixin-service-order/src/main/resources/spring/spring-context.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans.xsd\n    http://www.springframework.org/schema/context\n    http://www.springframework.org/schema/context/spring-context.xsd\">\n\n\t<!-- 引入配置文件 -->\n\t<context:property-placeholder location=\"classpath:system.properties,classpath:jdbc.properties\" />\n\n\t<!-- 打开Spring的Annotation支持 -->\n\t<context:annotation-config />\n\n\t<!-- 扫描注入  -->\n\t<context:component-scan base-package=\"com.cheng.weixin.service.order\" />\n\n\t<import resource=\"classpath:spring/spring-dubbo-provider.xml\"/>\n\t<import resource=\"classpath:spring/spring-mybatis.xml\"/>\n\n</beans>"
  },
  {
    "path": "weixin-service-order/src/main/resources/spring/spring-dubbo-provider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n          http://www.springframework.org/schema/beans/spring-beans.xsd\n          http://code.alibabatech.com/schema/dubbo\n          http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n  <dubbo:application name=\"weixin-service-order\"/>\n  <dubbo:registry id=\"zk1\" address=\"${weixin.dubbo.reistry.address}\" protocol=\"${weixin.dubbo.reistry.protocol}\"/> <!-- 注意要关闭防火墙 -->\n  <dubbo:protocol id=\"mydubbo\" name=\"dubbo\" host=\"${weixin.dubbo.host.address}\" port=\"${weixin.dubbo.order.service.port}\"/>\n  <dubbo:provider registry=\"zk1\" protocol=\"mydubbo\"/>\n\n  <dubbo:service interface=\"com.cheng.weixin.rpc.order.service.RpcOrderService\" ref=\"orderService\" version=\"1.0\"/>\n</beans>\n"
  },
  {
    "path": "weixin-service-order/src/main/resources/spring/spring-mybatis.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:p=\"http://www.springframework.org/schema/p\"\n\txmlns:aop=\"http://www.springframework.org/schema/aop\"\n\txmlns:tx=\"http://www.springframework.org/schema/tx\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans.xsd\n    http://www.springframework.org/schema/tx\n    http://www.springframework.org/schema/tx/spring-tx.xsd\n    http://www.springframework.org/schema/aop\n    http://www.springframework.org/schema/aop/spring-aop.xsd\">\n\n\t<bean id=\"dataSource\" class=\"com.alibaba.druid.pool.DruidDataSource\" init-method=\"init\" destroy-method=\"close\">\n\t  <property name=\"driverClassName\" value=\"${jdbc.driverClassName}\"/>\n\t  <property name=\"url\" value=\"${jdbc.url}\"/>\n\t  <property name=\"username\" value=\"${jdbc.username}\"/>\n\t  <property name=\"password\" value=\"${jdbc.password}\"/>\n\t  <!-- 连接池最大使用连接数 -->\n\t  <property name=\"maxActive\" value=\"${jdbc.maxActive}\"/>\n\t  <!-- 初始化连接大小 -->\n\t  <property name=\"initialSize\" value=\"${jdbc.initialSize}\"/>\n\t  <!-- 获取连接最大等待时间 -->\n\t  <property name=\"maxWait\" value=\"${jdbc.maxWait}\"/>\n\t  <!-- 连接池最大空闲 -->\n\t  <!--  property name=\"maxIdle\" value=\"${jdbc.maxIdle}\"/>-->\n\t  <!-- 连接池最小空闲 -->\n\t  <property name=\"minIdle\" value=\"${jdbc.minIdle}\"/>\n\t  <!-- 自动清除无用连接 -->\n\t  <property name=\"removeAbandoned\" value=\"${jdbc.removeAbandoned}\"/>\n\t  <!-- 清除无用连接的等待时间 -->\n\t  <property name=\"removeAbandonedTimeout\" value=\"${jdbc.removeAbandonedTimeout}\"/>\n\t  <!-- 连接属性 -->\n\t  <property name=\"connectionProperties\" value=\"${jdbc.connectionProperties}\"/>\n\t</bean>\n\n  <!-- 注入SQLSession -->\n  <bean id=\"sqlSession\" class=\"org.mybatis.spring.SqlSessionTemplate\" scope=\"prototype\">\n    <constructor-arg index=\"0\" ref=\"sqlSessionFactory\"/>\n  </bean>\n\n\t<!-- mybatis配置 -->\n\t<bean id=\"sqlSessionFactory\" class=\"org.mybatis.spring.SqlSessionFactoryBean\"\n\t\tp:dataSource-ref=\"dataSource\"\n    p:configLocation=\"classpath:/mybatis/mybatis-config.xml\"\n\t\tp:typeAliasesPackage=\"com.cheng.weixin.rpc.order.entity\"\n\t\tp:mapperLocations=\"classpath:/mybatis/mapper/*.xml\" />\n\n\t<!-- spring与mybatis整合配置，扫描所有dao -->\n\t<bean class=\"org.mybatis.spring.mapper.MapperScannerConfigurer\"\n\t\tp:basePackage=\"com.cheng.weixin.service.order.dao\"\n\t\tp:sqlSessionFactoryBeanName=\"sqlSessionFactory\" />\n\n\t<!-- 对数据源进行事务管理 -->\n\t<bean id=\"transactionManager\" class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\"\n\t\tp:dataSource-ref=\"dataSource\" />\n\t<!-- 通知 -->\n\t<tx:advice id=\"txAdvice\" transaction-manager=\"transactionManager\">\n\t  <!-- 传播行为 -->\n\t  <tx:attributes>\n\t  \t<tx:method name=\"add*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"update*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"delete*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"get*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  \t<tx:method name=\"find*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  </tx:attributes>\n\t</tx:advice>\t\n\t<!-- 哪些类的哪些方法使用事务 -->\n\t<aop:config>\n\t  <aop:advisor advice-ref=\"txAdvice\" pointcut=\"execution(* com.cheng.weixin.service.order.service.*.*(..))\"/>\n\t</aop:config>\n\t\t\n\t<!-- 开启事务注解驱动 \n    <tx:annotation-driven />\n    -->\n</beans>"
  },
  {
    "path": "weixin-service-order/src/test/java/com/cheng/order/test/TestMain.java",
    "content": "package com.cheng.order.test;\n\nimport com.cheng.weixin.rpc.order.entity.OrderInfo;\nimport com.cheng.weixin.rpc.order.entity.Pay;\nimport com.cheng.weixin.rpc.order.service.RpcOrderService;\nimport com.github.pagehelper.PageInfo;\nimport org.apache.commons.lang3.RandomStringUtils;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.test.context.ContextConfiguration;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\n\nimport java.lang.reflect.InvocationTargetException;\nimport java.util.List;\n\n/**\n * Desc:\n * Author: hp\n * Date: 2016/10/10\n */\n@RunWith(SpringJUnit4ClassRunner.class)\n@ContextConfiguration(locations = {\"classpath*:spring/spring-context.xml\"})\npublic class TestMain {\n    @Autowired\n    private RpcOrderService orderService;\n\n    @Test\n    public void test01() {\n        //List<DeliveryTime> deliveryTimes = orderService.getAllDeliveryTime();\n        //System.out.println(deliveryTimes);\n    }\n\n    @Test\n    public void test02() {\n        List<Pay> pays = orderService.getAllPay();\n        System.out.println(pays);\n    }\n\n    @Test\n    public void test03() throws InvocationTargetException, IllegalAccessException {\n        PageInfo<OrderInfo> data = orderService.getOrderInfos(\"1\", 1, 10);\n        System.out.println(data);\n    }\n\n    @Test\n    public void test04() {\n        OrderInfo order = new OrderInfo();\n        String oid = RandomStringUtils.randomNumeric(8);\n        order.setOid(oid);\n        order.setAccountId(\"1\");\n        orderService.addOrder(order);\n    }\n\n}\n"
  },
  {
    "path": "weixin-service-promotion/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-service-promotion</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-config</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-service</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-rpc-promotion</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>junit</groupId>\n      <artifactId>junit</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>log4j</groupId>\n      <artifactId>log4j</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-log4j12</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-logging</groupId>\n      <artifactId>commons-logging</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-beanutils</groupId>\n      <artifactId>commons-beanutils</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.github.pagehelper</groupId>\n      <artifactId>pagehelper</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>javax.servlet</groupId>\n      <artifactId>javax.servlet-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>mysql</groupId>\n      <artifactId>mysql-connector-java</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>druid</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjrt</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjweaver</artifactId>\n    </dependency>\n    <!-- Dubbo Start -->\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>dubbo</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.101tec</groupId>\n      <artifactId>zkclient</artifactId>\n    </dependency>\n    <!-- Dubbo End -->\n    <!-- Spring begin -->\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context-support</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-core</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-beans</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-aop</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-orm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-web</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-jdbc</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-oxm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-test</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-tx</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-expression</artifactId>\n    </dependency>\n    <!-- Spring end -->\n    <!-- MyBatis begin -->\n    <dependency>\n      <groupId>org.mybatis</groupId>\n      <artifactId>mybatis</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.mybatis</groupId>\n      <artifactId>mybatis-spring</artifactId>\n    </dependency>\n    <!-- MyBatis end -->\n  </dependencies>\n\n  <build>\n    <resources>\n      <resource>\n        <targetPath>${project.build.directory}/classes</targetPath>\n        <directory>src/main/resources</directory>\n        <filtering>true</filtering>\n        <includes>\n          <include>**/*.xml</include>\n          <include>**/*.properties</include>\n        </includes>\n        <excludes>\n          <exclude>rebel.xml</exclude>\n        </excludes>\n      </resource>\n      <resource>\n        <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>\n        <directory>src/main/resources/spring</directory>\n        <!--<directory>src/main/resources</directory>-->\n        <filtering>true</filtering>\n        <includes>\n          <include>spring-context.xml</include>\n        </includes>\n      </resource>\n    </resources>\n    <plugins>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-compiler-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-source-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-jar-plugin</artifactId>\n        <configuration>\n          <classesDirectory>target/classes/</classesDirectory>\n          <archive>\n            <!--生成的jar中，不要包含pom.xml和pom.properties这两个文件 -->\n            <addMavenDescriptor>false</addMavenDescriptor>\n            <manifest>\n              <mainClass>com.alibaba.dubbo.container.Main</mainClass>\n              <!-- 打包时MANIFEST.MF文件不记录时间版本 -->\n              <useUniqueVersions>false</useUniqueVersions>\n              <addClasspath>true</addClasspath>\n              <classpathPrefix>lib/</classpathPrefix>\n            </manifest>\n            <manifestEntries>\n              <Class-Path>.</Class-Path>\n            </manifestEntries>\n          </archive>\n        </configuration>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-dependency-plugin</artifactId>\n        <executions>\n          <execution>\n            <id>copy-dependencies</id>\n            <phase>package</phase>\n            <goals>\n              <goal>copy-dependencies</goal>\n            </goals>\n            <configuration>\n              <type>jar</type>\n              <includeTypes>jar</includeTypes>\n              <!--<useUniqueVersions>false</useUniqueVersions>-->\n              <outputDirectory>\n                ${project.build.directory}/lib\n              </outputDirectory>\n            </configuration>\n          </execution>\n        </executions>\n      </plugin>\n      <plugin>\n        <groupId>org.zeroturnaround</groupId>\n        <artifactId>jrebel-maven-plugin</artifactId>\n      </plugin>\n    </plugins>\n  </build>\n</project>"
  },
  {
    "path": "weixin-service-promotion/src/main/java/com/cheng/weixin/service/promotion/dao/CouponCodeDaoMapper.java",
    "content": "package com.cheng.weixin.service.promotion.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.promotion.entity.CouponCode;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 优惠券\n * Author: hp\n * Date: 2016/9/9\n */\n@Repository\npublic interface CouponCodeDaoMapper extends BaseDaoMapper<CouponCode> {\n}\n"
  },
  {
    "path": "weixin-service-promotion/src/main/java/com/cheng/weixin/service/promotion/dao/CouponDaoMapper.java",
    "content": "package com.cheng.weixin.service.promotion.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.promotion.entity.Coupon;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 优惠券\n * Author: hp\n * Date: 2016/9/9\n */\n@Repository\npublic interface CouponDaoMapper extends BaseDaoMapper<Coupon> {\n}\n"
  },
  {
    "path": "weixin-service-promotion/src/main/java/com/cheng/weixin/service/promotion/dao/CouponHistoryDaoMapper.java",
    "content": "package com.cheng.weixin.service.promotion.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.promotion.entity.CouponHistory;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 优惠券\n * Author: hp\n * Date: 2016/9/9\n */\n@Repository\npublic interface CouponHistoryDaoMapper extends BaseDaoMapper<CouponHistory> {\n}\n"
  },
  {
    "path": "weixin-service-promotion/src/main/java/com/cheng/weixin/service/promotion/service/CouponService.java",
    "content": "package com.cheng.weixin.service.promotion.service;\n\nimport com.cheng.weixin.rpc.promotion.entity.Coupon;\nimport com.cheng.weixin.rpc.promotion.entity.CouponCode;\nimport com.cheng.weixin.rpc.promotion.service.RpcCouponService;\nimport com.cheng.weixin.service.promotion.dao.CouponCodeDaoMapper;\nimport com.cheng.weixin.service.promotion.dao.CouponDaoMapper;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\n\n/**\n * Desc:\n * Author: hp\n * Date: 2016/11/7\n */\n@Service(\"couponService\")\npublic class CouponService implements RpcCouponService {\n    @Autowired\n    private CouponCodeDaoMapper couponCodeDao;\n    @Autowired\n    private CouponDaoMapper couponDao;\n\n    @Override\n    public List<CouponCode> getCouponCodeByUser(String userId) {\n        List<CouponCode> couponCodes = couponCodeDao.loadAll(new CouponCode(null, userId));\n        for (CouponCode couponCode : couponCodes) {\n            Coupon coupon = couponDao.load(new Coupon(couponCode.getId()));\n            couponCode.setCoupon(coupon);\n        }\n        return couponCodes;\n    }\n\n    @Override\n    public CouponCode getCouponById(String id) {\n        CouponCode couponCode = couponCodeDao.load(new CouponCode(id, null));\n        Coupon coupon = couponDao.load(new Coupon(couponCode.getId()));\n        couponCode.setCoupon(coupon);\n        return couponCode;\n    }\n\n    @Override\n    public void updateCouponUsedById(String id) {\n        CouponCode couponCode = new CouponCode();\n        couponCode.setId(id);\n        couponCode.setUsed(true);\n        couponCode.preUpdate();\n        couponCodeDao.update(couponCode);\n    }\n}\n"
  },
  {
    "path": "weixin-service-promotion/src/main/resources/log4j.properties",
    "content": "#log4j.rootLogger=DEBUG,CONSOLE,FILE\nlog4j.rootLogger=DEBUG,FILE\nlog4j.appender.Threshold=ERROR\n\n#log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender\n#log4j.appender.CONSOLE.Encoding=UTF-8\n#log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout\n#log4j.appender.CONSOLE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [service-order] %p [%t] %c-<%L> %m%n\n\nlog4j.appender.FILE=org.apache.log4j.RollingFileAppender\nlog4j.appender.FILE.Encoding=UTF-8\nlog4j.appender.FILE.File=logs/service-promotion.log\nlog4j.appender.FILE.MaxFileSize=4000KB\nlog4j.appender.FILE.MaxBackupIndex=10\nlog4j.appender.FILE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [service-promotion] %p [%t] %c-<%L> %m%n\n\nlog4j.logger.org.apache.zookeeper.ClientCnxn=INFO"
  },
  {
    "path": "weixin-service-promotion/src/main/resources/mybatis/mapper/CouponCodeMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.promotion.dao.CouponCodeDaoMapper\">\n  <sql id=\"tableName\">coupon_code</sql>\n  <sql id=\"columns\">\n    c.id,c.coupon_id,c.code,c.account_id,c.is_used,\n    c.remarks,c.create_date,c.update_date,c.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,coupon_id,code,account_id,is_used,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"couponCodeIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"couponId != null and name != ''\">name=#{name},</if>\n    <if test=\"code != null and couponTypeId != ''\">coupon_type_id=#{couponTypeId},</if>\n    <if test=\"accountId != null and accountId != ''\">face_value=#{faceValue},</if>\n    <if test=\"isUsed != null and isUsed != ''\">is_used=#{isUsed},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null\">update_date=#{updateDate},</if>\n    <if test=\"status != null\">status=#{status}</if>\n  </sql>\n  <sql id=\"couponCodeSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/>\n    AS c\n  </sql>\n\n  <sql id=\"couponCodeWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <if test=\"accountId != null and accountId != ''\">\n        AND  account_id = #{accountId}\n      </if>\n      <choose>\n        <when test=\"status != null\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"couponCodeUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"couponCodeIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"couponCode\" resultType=\"couponCode\">\n    <include refid=\"couponCodeSelector\"/>\n    <include refid=\"couponCodeWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"couponCode\">\n    <include refid=\"couponCodeSelector\"/>\n    <include refid=\"couponCodeWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"couponCode\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"couponCodeUpdate\"/>\n    <include refid=\"couponCodeWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"couponCode\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{couponId},#{code},#{accountId},#{isUsed},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-promotion/src/main/resources/mybatis/mapper/CouponHistoryMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.promotion.dao.CouponHistoryDaoMapper\">\n  <sql id=\"tableName\">coupon_history</sql>\n  <sql id=\"columns\">\n    c.id,code,c.tx_behavior,c.account_id,c.is_send_used,\n    c.remarks,c.create_date,c.update_date,c.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,code,tx_behavior,account_id,is_send_used,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"couponHistoryIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"code != null and code != ''\">code=#{code},</if>\n    <if test=\"txBehavior != null and txBehavior != ''\">tx_behavior=#{txBehavior},</if>\n    <if test=\"accountId != null and accountId != ''\">account_id=#{accountId},</if>\n    <if test=\"isSendUsed != null and isSendUsed != ''\">is_send_used=#{isSendUsed},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null\">update_date=#{updateDate},</if>\n    <if test=\"status != null\">status=#{status}</if>\n  </sql>\n  <sql id=\"couponHistorySelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/>\n    AS c\n  </sql>\n\n  <sql id=\"couponHistoryWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"couponHistoryUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"couponHistoryIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"couponHistory\" resultType=\"couponHistory\">\n    <include refid=\"couponHistorySelector\"/>\n    <include refid=\"couponHistoryWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"couponHistory\">\n    <include refid=\"couponHistorySelector\"/>\n    <include refid=\"couponHistoryWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"couponHistory\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"couponHistoryUpdate\"/>\n    <include refid=\"couponHistoryWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"couponHistory\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{code},#{txBehavior},#{accountId},#{isSendUsed},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-promotion/src/main/resources/mybatis/mapper/CouponMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.promotion.dao.CouponDaoMapper\">\n  <sql id=\"tableName\">coupon</sql>\n  <sql id=\"columns\">\n    c.id,name,c.type,c.face_value,c.delay_day,c.is_free,c.is_reuse,\n    c.enough_money,c.discount,c.include_group,c.exclude_group,c.begin_time,c.end_time,\n    c.remarks,c.create_date,c.update_date,c.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,name,type,face_value,delay_day,is_free,is_reuse,\n    enough_money,discount,include_group,exclude_group,begin_time,end_time\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"couponIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"type != null\">type=#{type},</if>\n    <if test=\"faceValue != null and faceValue != ''\">face_value=#{faceValue},</if>\n    <if test=\"delayDay != null and delayDay != ''\">delay_day=#{delayDay},</if>\n    <if test=\"isFree != null and isFree != ''\">is_free=#{isFree},</if>\n    <if test=\"isReuse != null and isReuse != ''\">is_reuse=#{isReuse},</if>\n    <if test=\"enoughMoney != null and enoughMoney != ''\">enough_money=#{enoughMoney},</if>\n    <if test=\"discount != null and discount != ''\">discount=#{discount},</if>\n    <if test=\"includeGroup != null and includeGroup != ''\">include_group=#{includeGroup},</if>\n    <if test=\"excludeGroup != null and excludeGroup != ''\">exclude_group=#{excludeGroup},</if>\n    <if test=\"beginTime != null and beginTime != ''\">begin_time=#{beginTime},</if>\n    <if test=\"endTime != null and endTime != ''\">end_time=#{endTime},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null\">update_date=#{updateDate},</if>\n    <if test=\"status != null\">status=#{status}</if>\n  </sql>\n  <sql id=\"couponSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/>\n    AS c\n  </sql>\n\n  <sql id=\"couponWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"couponUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"couponIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"coupon\" resultType=\"coupon\">\n    <include refid=\"couponSelector\"/>\n    <include refid=\"couponWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"coupon\">\n    <include refid=\"couponSelector\"/>\n    <include refid=\"couponWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"coupon\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"couponUpdate\"/>\n    <include refid=\"couponWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"coupon\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{name},#{type},#{faceValue},#{delayDay},#{isFree},#{isReuse},\n    #{enoughMoney},#{discount},#{includeGroup},#{excludeGroup},#{beginTime},#{endTime},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-promotion/src/main/resources/mybatis/mybatis-config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE configuration\n        PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-config.dtd\">\n\n<configuration>\n  <settings>\n    <!-- 开启字段名和属性名驼峰匹配 -->\n    <setting name=\"mapUnderscoreToCamelCase\" value=\"true\"/>\n    <!-- 全局启用或禁用延迟加载。当禁用时，所有关联对象都会即时加载。 -->\n    <setting name=\"lazyLoadingEnabled\" value=\"true\"/>\n    <!-- 当启用时，有延迟加载属性的对象在被调用时将会完全加载任意属性。否则，每种属性将会按需要加载。 -->\n    <setting name=\"aggressiveLazyLoading\" value=\"true\"/>\n  </settings>\n  <plugins>\n    <plugin interceptor=\"com.github.pagehelper.PageHelper\">\n      <property name=\"dialect\" value=\"mysql\"/>\n    </plugin>\n  </plugins>\n</configuration>"
  },
  {
    "path": "weixin-service-promotion/src/main/resources/spring/spring-context.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans.xsd\n    http://www.springframework.org/schema/context\n    http://www.springframework.org/schema/context/spring-context.xsd\">\n\n\t<!-- 引入配置文件 -->\n\t<context:property-placeholder location=\"classpath:system.properties,classpath:jdbc.properties\" />\n\n\t<!-- 打开Spring的Annotation支持 -->\n\t<context:annotation-config />\n\n\t<!-- 扫描注入  -->\n\t<context:component-scan base-package=\"com.cheng.weixin.service.promotion\" />\n\n\t<import resource=\"classpath:spring/spring-dubbo-provider.xml\"/>\n\t<import resource=\"classpath:spring/spring-mybatis.xml\"/>\n\n</beans>"
  },
  {
    "path": "weixin-service-promotion/src/main/resources/spring/spring-dubbo-provider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n          http://www.springframework.org/schema/beans/spring-beans.xsd\n          http://code.alibabatech.com/schema/dubbo\n          http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n  <dubbo:application name=\"weixin-service-promotion\"/>\n  <dubbo:registry id=\"zk1\" address=\"${weixin.dubbo.reistry.address}\" protocol=\"${weixin.dubbo.reistry.protocol}\"/> <!-- 注意要关闭防火墙 -->\n  <dubbo:protocol id=\"mydubbo\" name=\"dubbo\" host=\"${weixin.dubbo.host.address}\" port=\"${weixin.dubbo.promotion.service.port}\"/>\n  <dubbo:provider registry=\"zk1\" protocol=\"mydubbo\"/>\n\n  <dubbo:service interface=\"com.cheng.weixin.rpc.promotion.service.RpcCouponService\" ref=\"couponService\" version=\"1.0\"/>\n</beans>\n"
  },
  {
    "path": "weixin-service-promotion/src/main/resources/spring/spring-mybatis.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:p=\"http://www.springframework.org/schema/p\"\n\txmlns:aop=\"http://www.springframework.org/schema/aop\"\n\txmlns:tx=\"http://www.springframework.org/schema/tx\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans.xsd\n    http://www.springframework.org/schema/tx\n    http://www.springframework.org/schema/tx/spring-tx.xsd\n    http://www.springframework.org/schema/aop\n    http://www.springframework.org/schema/aop/spring-aop.xsd\">\n\n\t<bean id=\"dataSource\" class=\"com.alibaba.druid.pool.DruidDataSource\" init-method=\"init\" destroy-method=\"close\">\n\t  <property name=\"driverClassName\" value=\"${jdbc.driverClassName}\"/>\n\t  <property name=\"url\" value=\"${jdbc.url}\"/>\n\t  <property name=\"username\" value=\"${jdbc.username}\"/>\n\t  <property name=\"password\" value=\"${jdbc.password}\"/>\n\t  <!-- 连接池最大使用连接数 -->\n\t  <property name=\"maxActive\" value=\"${jdbc.maxActive}\"/>\n\t  <!-- 初始化连接大小 -->\n\t  <property name=\"initialSize\" value=\"${jdbc.initialSize}\"/>\n\t  <!-- 获取连接最大等待时间 -->\n\t  <property name=\"maxWait\" value=\"${jdbc.maxWait}\"/>\n\t  <!-- 连接池最大空闲 -->\n\t  <!--  property name=\"maxIdle\" value=\"${jdbc.maxIdle}\"/>-->\n\t  <!-- 连接池最小空闲 -->\n\t  <property name=\"minIdle\" value=\"${jdbc.minIdle}\"/>\n\t  <!-- 自动清除无用连接 -->\n\t  <property name=\"removeAbandoned\" value=\"${jdbc.removeAbandoned}\"/>\n\t  <!-- 清除无用连接的等待时间 -->\n\t  <property name=\"removeAbandonedTimeout\" value=\"${jdbc.removeAbandonedTimeout}\"/>\n\t  <!-- 连接属性 -->\n\t  <property name=\"connectionProperties\" value=\"${jdbc.connectionProperties}\"/>\n\t</bean>\n\n  <!-- 注入SQLSession -->\n  <bean id=\"sqlSession\" class=\"org.mybatis.spring.SqlSessionTemplate\" scope=\"prototype\">\n    <constructor-arg index=\"0\" ref=\"sqlSessionFactory\"/>\n  </bean>\n\n\t<!-- mybatis配置 -->\n\t<bean id=\"sqlSessionFactory\" class=\"org.mybatis.spring.SqlSessionFactoryBean\"\n\t\tp:dataSource-ref=\"dataSource\"\n    p:configLocation=\"classpath:/mybatis/mybatis-config.xml\"\n\t\tp:typeAliasesPackage=\"com.cheng.weixin.rpc.promotion.entity\"\n\t\tp:mapperLocations=\"classpath:/mybatis/mapper/*.xml\" />\n\n\t<!-- spring与mybatis整合配置，扫描所有dao -->\n\t<bean class=\"org.mybatis.spring.mapper.MapperScannerConfigurer\"\n\t\tp:basePackage=\"com.cheng.weixin.service.promotion.dao\"\n\t\tp:sqlSessionFactoryBeanName=\"sqlSessionFactory\" />\n\n\t<!-- 对数据源进行事务管理 -->\n\t<bean id=\"transactionManager\" class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\"\n\t\tp:dataSource-ref=\"dataSource\" />\n\t<!-- 通知 -->\n\t<tx:advice id=\"txAdvice\" transaction-manager=\"transactionManager\">\n\t  <!-- 传播行为 -->\n\t  <tx:attributes>\n\t  \t<tx:method name=\"add*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"update*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"delete*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"get*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  \t<tx:method name=\"find*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  </tx:attributes>\n\t</tx:advice>\t\n\t<!-- 哪些类的哪些方法使用事务 -->\n\t<aop:config>\n\t  <aop:advisor advice-ref=\"txAdvice\" pointcut=\"execution(* com.cheng.weixin.service.promotion.service.*.*(..))\"/>\n\t</aop:config>\n\t\t\n\t<!-- 开启事务注解驱动 \n    <tx:annotation-driven />\n    -->\n</beans>"
  },
  {
    "path": "weixin-service-rabbitmq/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-service-rabbitmq</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-config</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-rabbitmq-model</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-rpc-rabbitmq</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>junit</groupId>\n      <artifactId>junit</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <!-- Dubbo Start -->\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>dubbo</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.101tec</groupId>\n      <artifactId>zkclient</artifactId>\n    </dependency>\n    <!-- Dubbo End -->\n    <!-- Spring begin -->\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context-support</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-core</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-beans</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-aop</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-orm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-web</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-jdbc</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-oxm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-test</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-tx</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-expression</artifactId>\n    </dependency>\n    <!-- Spring end -->\n    <dependency>\n      <groupId>org.springframework.amqp</groupId>\n      <artifactId>spring-rabbit</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.rabbitmq</groupId>\n      <artifactId>amqp-client</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjrt</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjweaver</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>log4j</groupId>\n      <artifactId>log4j</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-log4j12</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>dom4j</groupId>\n      <artifactId>dom4j</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-logging</groupId>\n      <artifactId>commons-logging</artifactId>\n    </dependency>\n  </dependencies>\n  <build>\n    <resources>\n      <resource>\n        <targetPath>${project.build.directory}/classes</targetPath>\n        <directory>src/main/resources</directory>\n        <filtering>true</filtering>\n        <includes>\n          <include>**/*.xml</include>\n          <include>**/*.properties</include>\n        </includes>\n        <excludes>\n          <exclude>rebel.xml</exclude>\n        </excludes>\n      </resource>\n      <resource>\n        <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>\n        <directory>src/main/resources/spring</directory>\n        <filtering>true</filtering>\n        <includes>\n          <include>spring-context.xml</include>\n        </includes>\n      </resource>\n    </resources>\n    <plugins>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-compiler-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-source-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-jar-plugin</artifactId>\n        <configuration>\n          <classesDirectory>target/classes/</classesDirectory>\n          <archive>\n            <!--生成的jar中，不要包含pom.xml和pom.properties这两个文件 -->\n            <addMavenDescriptor>false</addMavenDescriptor>\n            <manifest>\n              <mainClass>com.alibaba.dubbo.container.Main</mainClass>\n              <!-- 打包时MANIFEST.MF文件不记录时间版本 -->\n              <useUniqueVersions>false</useUniqueVersions>\n              <addClasspath>true</addClasspath>\n              <classpathPrefix>lib/</classpathPrefix>\n            </manifest>\n            <manifestEntries>\n              <Class-Path>.</Class-Path>\n            </manifestEntries>\n          </archive>\n        </configuration>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-dependency-plugin</artifactId>\n        <executions>\n          <execution>\n            <id>copy-dependencies</id>\n            <phase>package</phase>\n            <goals>\n              <goal>copy-dependencies</goal>\n            </goals>\n            <configuration>\n              <type>jar</type>\n              <includeTypes>jar</includeTypes>\n              <!--<useUniqueVersions>false</useUniqueVersions>-->\n              <outputDirectory>\n                ${project.build.directory}/lib\n              </outputDirectory>\n            </configuration>\n          </execution>\n        </executions>\n      </plugin>\n      <plugin>\n        <groupId>org.zeroturnaround</groupId>\n        <artifactId>jrebel-maven-plugin</artifactId>\n      </plugin>\n    </plugins>\n  </build>\n</project>"
  },
  {
    "path": "weixin-service-rabbitmq/shell/service-rabbitmq.sh",
    "content": "#!/bin/sh\n\n## java env\nexport JAVA_HOME=/usr/jdk/jdk1.7.0_45\nexport JRE_HOME=$JAVA_HOME/jre\n\n## service name\nAPP_NAME=rabbitmq\n\nSERVICE_DIR=/usr/cheng/service/$APP_NAME\nSERVICE_NAME=weixin-service-$APP_NAME\nJAR_NAME=$SERVICE_NAME\\.jar\nPID=$SERVICE_NAME\\.pid\n\ncd $SERVICE_DIR\n\ncase \"$1\" in\n\n    start)\n        nohup $JRE_HOME/bin/java -Xms256m -Xmx512m -jar $JAR_NAME >/dev/null 2>&1 &\n        echo $! > $SERVICE_DIR/$PID\n        echo \"=== start $SERVICE_NAME\"\n        ;;\n\n    stop)\n        kill `cat $SERVICE_DIR/$PID`\n        rm -rf $SERVICE_DIR/$PID\n        echo \"=== stop $SERVICE_NAME\"\n\n        sleep 5\n\n        P_ID=`ps -ef | grep -w \"$SERVICE_NAME\" | grep -v \"grep\" | awk '{print $2}'`\n        if [ \"$P_ID\" == \"\" ]; then\n            echo \"=== $SERVICE_NAME process not exists or stop success\"\n        else\n            echo \"=== $SERVICE_NAME process pid is:$P_ID\"\n            echo \"=== begin kill $SERVICE_NAME process, pid is:$P_ID\"\n            kill -9 $P_ID\n        fi\n        ;;\n\n    restart)\n        $0 stop\n        sleep 2\n        $0 start\n        echo \"=== restart $SERVICE_NAME\"\n        ;;\n\n    *)\n        ## restart\n        $0 stop\n        sleep 2\n        $0 start\n        ;;\n\nesac\nexit 0\n\n"
  },
  {
    "path": "weixin-service-rabbitmq/src/main/java/com/cheng/weixin/service/rabbitmq/RabbitLogService.java",
    "content": "package com.cheng.weixin.service.rabbitmq;\n\nimport com.cheng.weixin.rpc.rabbitmq.service.RpcRabbitLogService;\nimport org.springframework.amqp.rabbit.core.RabbitTemplate;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\n/**\n * Desc: 消息列队\n * Author: Cheng\n * Date: 2016/4/25 0025\n */\n@Service(\"rabbitLogService\")\npublic class RabbitLogService implements RpcRabbitLogService {\n    @Autowired\n    private RabbitTemplate rabbitLogTemplate;\n\n    @Override\n    public void saveLogs(Object obj) {\n        rabbitLogTemplate.convertAndSend(LOG, obj);\n    }\n\n}\n"
  },
  {
    "path": "weixin-service-rabbitmq/src/main/java/com/cheng/weixin/service/rabbitmq/RabbitSmsService.java",
    "content": "package com.cheng.weixin.service.rabbitmq;\n\nimport com.cheng.weixin.rpc.rabbitmq.service.RpcRabbitSmsService;\nimport org.springframework.amqp.rabbit.core.RabbitTemplate;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\n/**\n * Desc: 消息列队\n * Author: Cheng\n * Date: 2016/4/25 0025\n */\n@Service(\"rabbitSmsService\")\npublic class RabbitSmsService implements RpcRabbitSmsService {\n    @Autowired\n    private RabbitTemplate rabbitSmsTemplate;\n\n    @Override\n    public void sendValidate(Object data) {\n        rabbitSmsTemplate.convertAndSend(VALIDATE, data);\n    }\n\n    @Override\n    public void sendCashNotify(Object data) {\n        rabbitSmsTemplate.convertAndSend(NOTICE, data);\n    }\n}\n"
  },
  {
    "path": "weixin-service-rabbitmq/src/main/resources/log4j.properties",
    "content": "#log4j.rootLogger=DEBUG,CONSOLE\nlog4j.rootLogger=DEBUG,FILE\nlog4j.appender.Threshold=ERROR\n\n#log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender\n#log4j.appender.CONSOLE.Encoding=UTF-8\n#log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout\n#log4j.appender.CONSOLE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [service-rabbitmq] %p [%t] %c-<%L> %m%n\n\nlog4j.appender.FILE=org.apache.log4j.RollingFileAppender\nlog4j.appender.FILE.Encoding=UTF-8\nlog4j.appender.FILE.File=logs/service-rabbitmq.log\nlog4j.appender.FILE.MaxFileSize=4000KB\nlog4j.appender.FILE.MaxBackupIndex=10\nlog4j.appender.FILE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [service-rabbitmq] %p [%t] %c-<%L> %m%n\n\nlog4j.logger.org.apache.zookeeper.ClientCnxn=INFO"
  },
  {
    "path": "weixin-service-rabbitmq/src/main/resources/spring/spring-context.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/context\n    http://www.springframework.org/schema/context/spring-context-3.2.xsd\">\n\n\t<!-- 引入配置文件 -->\n\t<context:property-placeholder location=\"classpath:system.properties,classpath:rabbitmq.properties\" />\n\n\t<!-- 打开Spring的Annotation支持 -->\n\t<context:annotation-config />\n\n\t<!-- 扫描注入  -->\n\t<context:component-scan base-package=\"com.cheng.weixin.service.rabbitmq\" />\n\n\t<import resource=\"classpath:spring/spring-dubbo-provider.xml\"/>\n\t<import resource=\"classpath:spring/spring-rabbitmq.xml\"/>\n\n</beans>"
  },
  {
    "path": "weixin-service-rabbitmq/src/main/resources/spring/spring-dubbo-provider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd\n          http://code.alibabatech.com/schema/dubbo\n          http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n  <dubbo:application name=\"weixin-service-rabbitmq\"/>\n\n  <dubbo:registry id=\"zk1\" address=\"${weixin.dubbo.reistry.address}\" protocol=\"${weixin.dubbo.reistry.protocol}\"/> <!-- 注意要关闭防火墙 -->\n\n  <dubbo:protocol id=\"mydubbo\" name=\"dubbo\" host=\"${weixin.dubbo.host.address}\" port=\"${weixin.dubbo.rabbitmq.service.port}\"/>\n\n  <dubbo:provider registry=\"zk1\" protocol=\"mydubbo\"/>\n\n  <dubbo:service interface=\"com.cheng.weixin.rpc.rabbitmq.service.RpcRabbitLogService\"\n                 ref=\"rabbitLogService\" version=\"1.0\"/>\n  <dubbo:service interface=\"com.cheng.weixin.rpc.rabbitmq.service.RpcRabbitSmsService\"\n                 ref=\"rabbitSmsService\" version=\"1.0\"/>\n\n</beans>\n"
  },
  {
    "path": "weixin-service-rabbitmq/src/main/resources/spring/spring-rabbitmq.xml",
    "content": "<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xmlns:rabbit=\"http://www.springframework.org/schema/rabbit\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/rabbit\n\thttp://www.springframework.org/schema/rabbit/spring-rabbit-1.4.xsd\n\thttp://www.springframework.org/schema/beans\n\thttp://www.springframework.org/schema/beans/spring-beans-4.1.xsd\">\n\n  <!-- 定义RabbitMQ的连接工厂 -->\n  <rabbit:connection-factory id=\"connectionFactory\"\n                             host=\"${rabbitmq.host}\"\n                             port=\"${rabbitmq.port}\"\n                             username=\"${rabbitmq.username}\"\n                             password=\"${rabbitmq.password}\"\n                             virtual-host=\"${rabbitmq.vhost}\"/>\n  <!-- MQ的管理，包括队列、交换器等 -->\n  <rabbit:admin connection-factory=\"connectionFactory\" />\n\n  <!-- 日志服务 -->\n  <!-- queue 队列声明-->\n  <!--<rabbit:queue name=\"WEIXIN-QUEUE-LOG\" auto-declare=\"true\"/>-->\n\n  <!--&lt;!&ndash; exchange queue binging key 绑定 &ndash;&gt;-->\n  <!--<rabbit:direct-exchange name=\"WEIXIN-EXCHANGE-LOG\" auto-declare=\"true\" durable=\"true\">-->\n    <!--<rabbit:bindings>-->\n      <!--<rabbit:binding queue=\"WEIXIN-QUEUE-LOG\" key=\"WEIXIN-LOG\"/>-->\n    <!--</rabbit:bindings>-->\n  <!--</rabbit:direct-exchange>-->\n  <!--<rabbit:template id=\"amqpLogTemplate\" connection-factory=\"connectionFactory\" exchange=\"WEIXIN-EXCHANGE-LOG\" queue=\"WEIXIN-QUEUE-LOG\" />-->\n\n\n  <!-- 短消息服务 -->\n  <!-- queue 队列声明-->\n  <rabbit:queue name=\"WEIXIN-QUEUE-SMS-VALIDATE\" auto-declare=\"true\"/> <!-- 验证码 -->\n  <rabbit:queue name=\"WEIXIN-QUEUE-SMS-NOTICE\" auto-declare=\"true\"/> <!-- 通知 -->\n  <rabbit:queue name=\"WEIXIN-QUEUE-SMS-ACTIVITY\" auto-declare=\"true\"/> <!-- 活动 -->\n  <!-- exchange queue binging key 绑定 -->\n  <rabbit:direct-exchange name=\"WEIXIN-EXCHANGE-SMS\" auto-declare=\"true\" durable=\"true\">\n    <rabbit:bindings>\n      <rabbit:binding queue=\"WEIXIN-QUEUE-SMS-VALIDATE\" key=\"SMS-VALIDATE\"/>\n      <rabbit:binding queue=\"WEIXIN-QUEUE-SMS-NOTICE\" key=\"SMS-NOTICE\"/>\n      <rabbit:binding queue=\"WEIXIN-QUEUE-SMS-ACTIVITY\" key=\"SMS-ACTIVITY\"/>\n    </rabbit:bindings>\n  </rabbit:direct-exchange>\n\n  <rabbit:template id=\"amqpSmsTemplate\" connection-factory=\"connectionFactory\" exchange=\"WEIXIN-EXCHANGE-SMS\" message-converter=\"jackson2JsonMessageConverter\"/>\n\n  <bean id=\"jackson2JsonMessageConverter\" class=\"org.springframework.amqp.support.converter.Jackson2JsonMessageConverter\"/>\n</beans>"
  },
  {
    "path": "weixin-service-rabbitmq/src/test/java/com/cheng/test/Foo.java",
    "content": "package com.cheng.test;\n\nimport org.springframework.amqp.core.Message;\nimport org.springframework.amqp.core.MessageListener;\n\n/**\n * Desc: 消费者\n * Author: Cheng\n * Date: 2016/4/22 0022\n */\npublic class Foo  implements MessageListener {\n    // 具体的执行业务\n    public void listen(Object foo) {\n        System.out.println(\"消费者===> \"+foo);\n    }\n\n    @Override\n    public void onMessage(Message message) {\n        System.out.println(\"data ==> \"+new String(message.getBody()));\n    }\n}\n"
  },
  {
    "path": "weixin-service-rabbitmq/src/test/java/com/cheng/test/SpringMain.java",
    "content": "package com.cheng.test;\n\nimport org.springframework.amqp.rabbit.core.RabbitTemplate;\nimport org.springframework.context.support.AbstractApplicationContext;\nimport org.springframework.context.support.ClassPathXmlApplicationContext;\n\n/**\n * Desc:\n * Author: Cheng\n * Date: 2016/4/22 0022\n */\npublic class SpringMain {\n\n    public static void main(String args[]) throws Exception {\n\n        AbstractApplicationContext ctx =\n                new ClassPathXmlApplicationContext(\"context-direct.xml\");\n        RabbitTemplate template = ctx.getBean(RabbitTemplate.class);\n\n\n        UserModel user = new UserModel();\n        user.setUsername(\"张三\");\n        user.setPassword(\"12300\");\n        user.setSex(\"nan\");\n\n        template.convertAndSend(\"mq-test\", \"sss\");\n        Thread.sleep(1000);\n        ctx.destroy();\n    }\n}\n"
  },
  {
    "path": "weixin-service-rabbitmq/src/test/java/com/cheng/test/TestMain.java",
    "content": "package com.cheng.test;\n\nimport com.cheng.weixin.rabbitmq.model.SmsModel;\nimport com.cheng.weixin.rpc.rabbitmq.service.RpcRabbitSmsService;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.amqp.rabbit.core.RabbitTemplate;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.test.context.ContextConfiguration;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\n\n/**\n * Desc:\n * Author: cheng\n * Date: 2016/7/11\n */\n@RunWith(SpringJUnit4ClassRunner.class)\n@ContextConfiguration(locations = {\"classpath*:spring-context.xml\"})\npublic class TestMain {\n    @Autowired\n    private RabbitTemplate smsTemplate;\n    @Autowired\n    private RpcRabbitSmsService rabbitSmsService;\n\n    @Test\n    public void testSendReg() {\n        smsTemplate.convertAndSend(\"SMS-REGISTER\", \"生产者发送SMS-REGISTER\");\n    }\n    @Test\n    public void testSendNotice() {\n        smsTemplate.convertAndSend(\"SMS-NOTICE\", \"生产者发送SMS-NOTICE\");\n    }\n    @Test\n    public void testSendActive() {\n        smsTemplate.convertAndSend(\"SMS-ACTIVITY\", \"生产者发送SMS-ACTIVITY\");\n    }\n\n    @Test\n    public void testSendMsgCode() throws Exception {\n        SmsModel smsModel = new SmsModel();\n        smsModel.setUserIp(\"127.0.0.1\");\n        smsModel.setPhone(\"18600536683\");\n\n        rabbitSmsService.sendValidate(smsModel);\n    }\n}\n"
  },
  {
    "path": "weixin-service-rabbitmq/src/test/java/com/cheng/test/UserModel.java",
    "content": "package com.cheng.test;\n\n/**\n * Desc:\n * Author: Cheng\n * Date: 2016/4/25 0025\n */\npublic class UserModel {\n    private String username;\n    private String password;\n    private String sex;\n\n    public String getUsername() {\n        return username;\n    }\n\n    public void setUsername(String username) {\n        this.username = username;\n    }\n\n    public String getPassword() {\n        return password;\n    }\n\n    public void setPassword(String password) {\n        this.password = password;\n    }\n\n    public String getSex() {\n        return sex;\n    }\n\n    public void setSex(String sex) {\n        this.sex = sex;\n    }\n}\n"
  },
  {
    "path": "weixin-service-rabbitmq/src/test/resources/context-direct.xml",
    "content": "<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xmlns:rabbit=\"http://www.springframework.org/schema/rabbit\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/rabbit\n\thttp://www.springframework.org/schema/rabbit/spring-rabbit-1.4.xsd\n\thttp://www.springframework.org/schema/beans\n\thttp://www.springframework.org/schema/beans/spring-beans-4.1.xsd\">\n\n  <!-- 定义RabbitMQ的连接工厂 -->\n  <rabbit:connection-factory id=\"connectionFactory\"\n                             host=\"192.168.1.115\"\n                             port=\"5672\"\n                             username=\"weixin\"\n                             password=\"weixin\"\n                             virtual-host=\"/weixin-service-log\"/>\n  <!-- MQ的管理，包括队列、交换器等 -->\n  <rabbit:admin connection-factory=\"connectionFactory\" />\n\n  <!-- queue 队列声明-->\n  <rabbit:queue name=\"my-direct-queue\" durable=\"true\" auto-declare=\"true\"/>\n\n  <!-- exchange queue binging key 绑定 -->\n  <rabbit:direct-exchange name=\"my-direct-exchange\" auto-declare=\"true\">\n    <rabbit:bindings>\n      <rabbit:binding queue=\"my-direct-queue\" key=\"mq-test\"/>\n    </rabbit:bindings>\n  </rabbit:direct-exchange>\n\n  <rabbit:template id=\"amqpTemplate\" connection-factory=\"connectionFactory\" exchange=\"my-direct-exchange\" queue=\"my-direct-queue\" />\n\n  <rabbit:listener-container connection-factory=\"connectionFactory\">\n    <rabbit:listener ref=\"consumer\" queue-names=\"my-direct-queue\" />\n  </rabbit:listener-container>\n\n  <bean id=\"consumer\" class=\"com.cheng.test.Foo\"/>\n\n</beans>"
  },
  {
    "path": "weixin-service-rabbitmq/src/test/resources/context.xml",
    "content": "<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xmlns:rabbit=\"http://www.springframework.org/schema/rabbit\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/rabbit\n\thttp://www.springframework.org/schema/rabbit/spring-rabbit-1.4.xsd\n\thttp://www.springframework.org/schema/beans\n\thttp://www.springframework.org/schema/beans/spring-beans-4.1.xsd\">\n\n  <!-- 定义RabbitMQ的连接工厂 -->\n  <rabbit:connection-factory id=\"connectionFactory\"\n                             host=\"192.168.1.110\"\n                             port=\"5672\"\n                             username=\"weixin\"\n                             password=\"weixin\"\n                             virtual-host=\"/weixin-service-log\"/>\n\n  <!-- 定义Rabbit模板，指定连接工厂以及定义exchange -->\n  <rabbit:template id=\"amqpTemplate\" connection-factory=\"connectionFactory\" exchange=\"fanoutExchange\" />\n  <!-- 定义队列 -->\n  <!--<rabbit:template id=\"amqpTemplate\" connection-factory=\"connectionFactory\" queue=\"test_queue\" />-->\n\n  <!--<rabbit:template id=\"amqpTemplate\" connection-factory=\"connectionFactory\"-->\n                   <!--exchange=\"myExchange\" routing-key=\"foo.bar\"/>-->\n\n  <!-- MQ的管理，包括队列、交换器等 -->\n  <rabbit:admin connection-factory=\"connectionFactory\" />\n\n  <!-- 定义队列，自动声明 -->\n  <rabbit:queue name=\"myQueue\" auto-declare=\"true\"/>\n  <!-- 定义交换器，自动声明 -->\n  <rabbit:fanout-exchange name=\"fanoutExchange\" auto-declare=\"true\">\n    <rabbit:bindings>\n      <rabbit:binding queue=\"myQueue\"/>\n    </rabbit:bindings>\n  </rabbit:fanout-exchange>\n\n <!-- <rabbit:topic-exchange name=\"myExchange\">\n    <rabbit:bindings>\n      <rabbit:binding queue=\"myQueue\" pattern=\"foo.*\" />\n    </rabbit:bindings>\n  </rabbit:topic-exchange>-->\n\n  <!-- 队列监听 -->\n  <rabbit:listener-container connection-factory=\"connectionFactory\">\n    <rabbit:listener ref=\"foo\" method=\"listen\" queue-names=\"myQueue\" />\n  </rabbit:listener-container>\n\n  <bean id=\"foo\" class=\"com.cheng.test.Foo\"/>\n</beans>"
  },
  {
    "path": "weixin-service-rabbitmq/src/test/resources/log4j.properties",
    "content": "log4j.rootLogger=DEBUG,CONSOLE,FILE\nlog4j.appender.Threshold=ERROR\n\nlog4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender\nlog4j.appender.CONSOLE.Encoding=UTF-8\nlog4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.CONSOLE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [service-RabbitMQ] %p [%t] %c-<%L> %m%n\n\nlog4j.appender.FILE=org.apache.log4j.RollingFileAppender\nlog4j.appender.FILE.Encoding=UTF-8\nlog4j.appender.FILE.File=log/weixin-service-RabbitMQ.log\nlog4j.appender.FILE.MaxFileSize=4000KB\nlog4j.appender.FILE.MaxBackupIndex=10\nlog4j.appender.FILE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [service-RabbitMQ] %p [%t] %c-<%L> %m%n"
  },
  {
    "path": "weixin-service-rabbitmq/src/test/resources/spring-context.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/context\n    http://www.springframework.org/schema/context/spring-context-3.2.xsd\">\n\n\t<!-- 引入配置文件 -->\n\t<context:property-placeholder location=\"classpath:system.properties,classpath:rabbitmq.properties\" />\n\n\t<!-- 打开Spring的Annotation支持 -->\n\t<context:annotation-config />\n\n\t<!-- 扫描注入  -->\n\t<context:component-scan base-package=\"com.cheng.weixin.service.rabbitmq\" />\n\n\t<import resource=\"classpath:spring/spring-rabbitmq.xml\"/>\n\n</beans>"
  },
  {
    "path": "weixin-service-rabbitmq/src/test/resources/spring-rabbitmq.xml",
    "content": "<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xmlns:rabbit=\"http://www.springframework.org/schema/rabbit\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/rabbit\n\thttp://www.springframework.org/schema/rabbit/spring-rabbit-1.4.xsd\n\thttp://www.springframework.org/schema/beans\n\thttp://www.springframework.org/schema/beans/spring-beans-4.1.xsd\">\n\n  <!-- 定义RabbitMQ的连接工厂 -->\n  <rabbit:connection-factory id=\"connectionFactory\"\n                             host=\"${rabbitmq.host}\"\n                             port=\"${rabbitmq.port}\"\n                             username=\"${rabbitmq.username}\"\n                             password=\"${rabbitmq.password}\"\n                             virtual-host=\"${rabbitmq.vhost}\"/>\n  <!-- MQ的管理，包括队列、交换器等 -->\n  <rabbit:admin connection-factory=\"connectionFactory\" />\n\n  <!-- 日志服务 -->\n  <!-- queue 队列声明-->\n  <!--<rabbit:queue name=\"WEIXIN-QUEUE-LOG\" auto-declare=\"true\"/>-->\n\n  <!--&lt;!&ndash; exchange queue binging key 绑定 &ndash;&gt;-->\n  <!--<rabbit:direct-exchange name=\"WEIXIN-EXCHANGE-LOG\" auto-declare=\"true\" durable=\"true\">-->\n    <!--<rabbit:bindings>-->\n      <!--<rabbit:binding queue=\"WEIXIN-QUEUE-LOG\" key=\"WEIXIN-LOG\"/>-->\n    <!--</rabbit:bindings>-->\n  <!--</rabbit:direct-exchange>-->\n  <!--<rabbit:template id=\"amqpLogTemplate\" connection-factory=\"connectionFactory\" exchange=\"WEIXIN-EXCHANGE-LOG\" queue=\"WEIXIN-QUEUE-LOG\" />-->\n\n\n  <!-- 短消息服务 -->\n  <!-- queue 队列声明-->\n  <!--<rabbit:queue name=\"WEIXIN-QUEUE-SMS\" auto-declare=\"true\"/>-->\n  <!--&lt;!&ndash; exchange queue binging key 绑定 &ndash;&gt;-->\n  <!--<rabbit:direct-exchange name=\"WEIXIN-EXCHANGE-SMS\" auto-declare=\"true\" durable=\"true\">-->\n    <!--<rabbit:bindings>-->\n      <!--<rabbit:binding queue=\"WEIXIN-QUEUE-SMS\" key=\"WEIXIN-SMS-REG\"/>-->\n    <!--</rabbit:bindings>-->\n  <!--</rabbit:direct-exchange>-->\n\n  <!--<rabbit:template id=\"amqpSmsTemplate\" connection-factory=\"connectionFactory\" exchange=\"WEIXIN-EXCHANGE-SMS\" queue=\"WEIXIN-QUEUE-SMS\" />-->\n\n\n  <rabbit:queue name=\"WEIXIN-QUEUE-SMS-REGISTER\" auto-declare=\"true\"/> <!-- 注册 -->\n  <rabbit:queue name=\"WEIXIN-QUEUE-SMS-NOTICE\" auto-declare=\"true\"/> <!-- 通知 -->\n  <rabbit:queue name=\"WEIXIN-QUEUE-SMS-ACTIVITY\" auto-declare=\"true\"/> <!-- 活动 -->\n  <!-- exchange queue binging key 绑定 -->\n  <rabbit:direct-exchange name=\"WEIXIN-EXCHANGE-SMS\" auto-declare=\"true\" durable=\"true\">\n    <rabbit:bindings>\n      <rabbit:binding queue=\"WEIXIN-QUEUE-SMS-REGISTER\" key=\"SMS-REGISTER\"/>\n      <rabbit:binding queue=\"WEIXIN-QUEUE-SMS-NOTICE\" key=\"SMS-NOTICE\"/>\n      <rabbit:binding queue=\"WEIXIN-QUEUE-SMS-ACTIVITY\" key=\"SMS-ACTIVITY\"/>\n    </rabbit:bindings>\n  </rabbit:direct-exchange>\n\n  <rabbit:template id=\"amqpSmsTemplate\" connection-factory=\"connectionFactory\" exchange=\"WEIXIN-EXCHANGE-SMS\" queue=\"WEIXIN-QUEUE-SMS\" />\n\n</beans>"
  },
  {
    "path": "weixin-service-redis/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-service-redis</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-config</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-rpc-redis</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>log4j</groupId>\n      <artifactId>log4j</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-log4j12</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-logging</groupId>\n      <artifactId>commons-logging</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>redis.clients</groupId>\n      <artifactId>jedis</artifactId>\n    </dependency>\n    <!-- Dubbo Start -->\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>dubbo</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.101tec</groupId>\n      <artifactId>zkclient</artifactId>\n    </dependency>\n    <!-- Dubbo End -->\n    <!-- Spring begin -->\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context-support</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-core</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-beans</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-web</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-aop</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-orm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-test</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-tx</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-expression</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.data</groupId>\n      <artifactId>spring-data-redis</artifactId>\n    </dependency>\n  </dependencies>\n\n  <build>\n    <resources>\n      <resource>\n        <targetPath>${project.build.directory}/classes</targetPath>\n        <directory>src/main/resources</directory>\n        <filtering>true</filtering>\n        <includes>\n          <include>**/*.xml</include>\n          <include>**/*.properties</include>\n        </includes>\n        <excludes>\n          <exclude>rebel.xml</exclude>\n        </excludes>\n      </resource>\n      <resource>\n        <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>\n        <directory>src/main/resources/spring</directory>\n        <filtering>true</filtering>\n        <includes>\n          <include>spring-context.xml</include>\n        </includes>\n      </resource>\n    </resources>\n    <plugins>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-compiler-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-source-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-jar-plugin</artifactId>\n        <configuration>\n          <classesDirectory>target/classes/</classesDirectory>\n          <archive>\n            <!--生成的jar中，不要包含pom.xml和pom.properties这两个文件 -->\n            <addMavenDescriptor>false</addMavenDescriptor>\n            <manifest>\n              <mainClass>com.alibaba.dubbo.container.Main</mainClass>\n              <!-- 打包时MANIFEST.MF文件不记录时间版本 -->\n              <useUniqueVersions>false</useUniqueVersions>\n              <addClasspath>true</addClasspath>\n              <classpathPrefix>lib/</classpathPrefix>\n            </manifest>\n            <manifestEntries>\n              <Class-Path>.</Class-Path>\n            </manifestEntries>\n          </archive>\n        </configuration>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-dependency-plugin</artifactId>\n        <executions>\n          <execution>\n            <id>copy-dependencies</id>\n            <phase>package</phase>\n            <goals>\n              <goal>copy-dependencies</goal>\n            </goals>\n            <configuration>\n              <type>jar</type>\n              <includeTypes>jar</includeTypes>\n              <!--<useUniqueVersions>false</useUniqueVersions>-->\n              <outputDirectory>\n                ${project.build.directory}/lib\n              </outputDirectory>\n            </configuration>\n          </execution>\n        </executions>\n      </plugin>\n      <plugin>\n        <groupId>org.zeroturnaround</groupId>\n        <artifactId>jrebel-maven-plugin</artifactId>\n      </plugin>\n    </plugins>\n  </build>\n</project>"
  },
  {
    "path": "weixin-service-redis/shell/service-redis.sh",
    "content": "#!/bin/sh\n\n## java env\nexport JAVA_HOME=/usr/local/java/jdk1.7.0_45\nexport JRE_HOME=$JAVA_HOME/jre\n\n## service name\nAPP_NAME=redis\n\nSERVICE_DIR=/usr/local/cheng/service/$APP_NAME\nSERVICE_NAME=weixin-service-$APP_NAME-1.0-SNAPSHOT\nJAR_NAME=$SERVICE_NAME\\.jar\nPID=$SERVICE_NAME\\.pid\n\ncd $SERVICE_DIR\n\ncase \"$1\" in\n\n    start)\n        nohup $JRE_HOME/bin/java -Xms256m -Xmx512m -jar $JAR_NAME >/dev/null 2>&1 &\n        echo $! > $SERVICE_DIR/$PID\n        echo \"=== start $SERVICE_NAME\"\n        ;;\n\n    stop)\n        kill `cat $SERVICE_DIR/$PID`\n        rm -rf $SERVICE_DIR/$PID\n        echo \"=== stop $SERVICE_NAME\"\n\n        sleep 5\n\n        P_ID=`ps -ef | grep -w \"$SERVICE_NAME\" | grep -v \"grep\" | awk '{print $2}'`\n        if [ \"$P_ID\" == \"\" ]; then\n            echo \"=== $SERVICE_NAME process not exists or stop success\"\n        else\n            echo \"=== $SERVICE_NAME process pid is:$P_ID\"\n            echo \"=== begin kill $SERVICE_NAME process, pid is:$P_ID\"\n            kill -9 $P_ID\n        fi\n        ;;\n\n    restart)\n        $0 stop\n        sleep 2\n        $0 start\n        echo \"=== restart $SERVICE_NAME\"\n        ;;\n\n    *)\n        ## restart\n        $0 stop\n        sleep 2\n        $0 start\n        ;;\n\nesac\nexit 0\n\n"
  },
  {
    "path": "weixin-service-redis/src/main/java/com/cheng/weixin/service/redis/service/RedisService.java",
    "content": "package com.cheng.weixin.service.redis.service;\n\nimport com.cheng.weixin.rpc.redis.service.RpcRedisService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.redis.core.BoundHashOperations;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.data.redis.core.ValueOperations;\nimport org.springframework.data.redis.serializer.GenericToStringSerializer;\nimport org.springframework.stereotype.Service;\n\nimport java.io.Serializable;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Desc: Redis 服务封装\n * Author: Cheng\n * Date: 2016/4/14 0014\n */\n@Service(\"redisService\")\npublic class RedisService implements RpcRedisService {\n\n    @Autowired\n    private RedisTemplate<Serializable, Object> redisTemplate;\n\n    /**\n     * 批量删除对应的value\n     * @param keys\n     */\n    @Override\n    public void remove(final String... keys) {\n        for (String key : keys) {\n            remove(key);\n        }\n    }\n\n    /**\n     * 批量删除key\n     * @param pattern\n     */\n    @Override\n    public void removePattern(final String pattern) {\n        Set<Serializable> keys = redisTemplate.keys(pattern);\n        if (keys.size() > 0) {\n            redisTemplate.delete(keys);\n        }\n    }\n\n    /**\n     * 删除对应的value\n     * @param key\n     */\n    @Override\n    public void remove(final String key) {\n        if (exists(key)) {\n            redisTemplate.delete(key);\n        }\n    }\n\n    /**\n     * 判断缓存中是否有对应的value\n     * @param key\n     * @return\n     */\n    @Override\n    public boolean exists(final String key) {\n        return redisTemplate.hasKey(key);\n    }\n\n    /**\n     * 读取缓存\n     * @param key\n     * @return\n     */\n    @Override\n    public Object get(final String key) {\n        ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();\n        return operations.get(key);\n    }\n\n    /**\n     * 写入缓存\n     * @param key\n     * @param value\n     * @return\n     */\n    @Override\n    public boolean set(final String key, Object value) {\n        boolean result = false;\n        try {\n            ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();\n            operations.set(key, value);\n            result = true;\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return result;\n    }\n\n    /**\n     * 写入缓存\n     * @param key\n     * @param value\n     * @param expireTime\n     * @return\n     */\n    @Override\n    public boolean set(final String key, Object value, Long expireTime) {\n        boolean result = false;\n        try {\n            ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();\n            operations.set(key, value);\n            redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);\n            result = true;\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return result;\n    }\n\n    /**\n     * 根据Key刷新超时时间\n     * @param key\n     * @param expireTime\n     * @return\n     */\n    @Override\n    public boolean flushExpireTime(final String key, Long expireTime) {\n        boolean result = false;\n        try {\n            redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);\n            result = true;\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return result;\n    }\n\n\n    @Override\n    public Long increase(String key, String field) {\n        BoundHashOperations hashOps = redisTemplate.boundHashOps(key);\n        //redisTemplate.setKeySerializer(new StringRedisSerializer(StandardCharsets.UTF_8));\n        //redisTemplate.setValueSerializer(new StringRedisSerializer());\n        //redisTemplate.setHashKeySerializer(new StringRedisSerializer(StandardCharsets.UTF_8));\n        redisTemplate.setHashValueSerializer(new GenericToStringSerializer(Long.class));\n        if (exists(key, field)) {\n            return hashOps.increment(field, 1L);\n        } else {\n            hashOps.putIfAbsent(field, 1);\n            return 1L;\n        }\n    }\n\n    @Override\n    public Long decrease(String key, String field) {\n        BoundHashOperations hashOps = redisTemplate.boundHashOps(key);\n        redisTemplate.setHashValueSerializer(new GenericToStringSerializer(Long.class));\n        if (exists(key, field)) {\n            long count = hashOps.increment(field, -1L);\n            if (count == 0) {\n                deleteField(key, field);\n                return 0L;\n            } else {\n                return count;\n            }\n        }\n        return 0L;\n    }\n\n    @Override\n    public void deleteField(String key, String field) {\n        BoundHashOperations hashOps = redisTemplate.boundHashOps(key);\n        hashOps.delete(field);\n    }\n\n    @Override\n    public void batchDeleteField(String key, String... field) {\n        BoundHashOperations hashOps = redisTemplate.boundHashOps(key);\n        hashOps.delete(field);\n    }\n\n    @Override\n    public Set<String> getFields(String key) {\n        BoundHashOperations hashOps = redisTemplate.boundHashOps(key);\n        return hashOps.keys();\n    }\n\n    @Override\n    public boolean exists(String key, String field) {\n        BoundHashOperations hashOps = redisTemplate.boundHashOps(key);\n        return hashOps.hasKey(field);\n    }\n\n    @Override\n    public Object getValueByKeyANdField(String key, String field) {\n        BoundHashOperations hashOps = redisTemplate.boundHashOps(key);\n        redisTemplate.setHashValueSerializer(new GenericToStringSerializer(Long.class));\n        return hashOps.get(field);\n    }\n\n    @Override\n    public Map<Serializable, Object>  getEntries(String key) {\n        BoundHashOperations hashOps = redisTemplate.boundHashOps(key);\n        //redisTemplate.setHashKeySerializer(new GenericToStringSerializer(String.class));\n        redisTemplate.setHashValueSerializer(new GenericToStringSerializer(Long.class));\n        return hashOps.entries();\n    }\n\n    @Override\n    public void put(String key, String field, Long value) {\n        BoundHashOperations hashOps = redisTemplate.boundHashOps(key);\n        redisTemplate.setHashValueSerializer(new GenericToStringSerializer(Long.class));\n        hashOps.put(field, value);\n    }\n}\n"
  },
  {
    "path": "weixin-service-redis/src/main/java/com/cheng/weixin/service/redis/service/redis/Function.java",
    "content": "package com.cheng.weixin.service.redis.service.redis;\n\n/**\n * Desc:\n * Author: Cheng\n * Date: 2016/4/14 0014\n */\npublic interface Function<T, E> {\n//    T callback(E e);\n}\n"
  },
  {
    "path": "weixin-service-redis/src/main/java/com/cheng/weixin/service/redis/service/redis/RedisService_bak.java",
    "content": "package com.cheng.weixin.service.redis.service.redis;\n\n/**\n * Desc:\n * Author: Cheng\n * Date: 2016/4/26 0026\n */\npublic class RedisService_bak /*implements RpcRedisService*/ {\n\n    /*\n    @Autowired\n    private ShardedJedisPool jedisPool;\n\n    private <T> T execute(Function<T, ShardedJedis> function) {\n        ShardedJedis shardedJedis = null;\n        try {\n            // 从连接池中获取Jedis分片对象\n            shardedJedis = jedisPool.getResource();\n            return function.callback(shardedJedis);\n        } catch (Exception e) {\n            e.printStackTrace();\n        } finally {\n            // 关闭，检测连接是否有效，有效则放回连接池中，无效则重置状态\n            if (null != shardedJedis) shardedJedis.close();\n        }\n        return null;\n    }*/\n/**\n     * 设置值\n     * @param key\n     * @param value\n     * @return\n     */\n    /*public String set(final String key, final String value) {\n        return this.execute(new Function<String, ShardedJedis>() {\n            @Override\n            public String callback(ShardedJedis shardedJedis) {\n                return shardedJedis.set(key, value);\n            }\n        });\n    }*/\n/**\n     * 设置值和过期时间\n     * @param key\n     * @param value\n     * @param seconds\n     * @return\n     *//*\n\n    public String set(final String key, final String value, final Integer seconds) {\n        return this.execute(new Function<String, ShardedJedis>() {\n            @Override\n            public String callback(ShardedJedis shardedJedis) {\n                String result = shardedJedis.set(key, value);\n                shardedJedis.expire(key, seconds);\n                return result;\n            }\n        });\n    }\n\n    */\n/**\n     * 设置单独的生存时间\n     * @param key\n     * @param seconds\n     * @return\n     *//*\n\n    public Long expire(final String key, final Integer seconds) {\n        return this.execute(new Function<Long, ShardedJedis>() {\n            @Override\n            public Long callback(ShardedJedis shardedJedis) {\n                return shardedJedis.expire(key, seconds);\n            }\n        });\n    }\n    */\n/**\n     * 获取值\n     * @param key\n     * @return\n     *//*\n\n    public String get(final String key) {\n        return execute(new Function<String, ShardedJedis>() {\n            @Override\n            public String callback(ShardedJedis shardedJedis) {\n                return shardedJedis.get(key);\n            }\n        });\n    }\n\n    */\n/**\n     * 删除值\n     * @param key\n     * @return\n     *//*\n\n    public Long del(final String key) {\n        return execute(new Function<Long, ShardedJedis>() {\n            @Override\n            public Long callback(ShardedJedis shardedJedis) {\n                return shardedJedis.del(key);\n            }\n        });\n    }\n*/\n\n}\n"
  },
  {
    "path": "weixin-service-redis/src/main/resources/Redme.md",
    "content": "Redis启动方式\n[cheng@redis redis-3.0.7]$ pwd\n/usr/local/redis-3.0.7\n[cheng@redis redis-3.0.7]$ redis-server ./redis.conf\n[cheng@redis redis-3.0.7]$ redis-cli\n127.0.0.1:6379> set \"abc\" \"123\"\nOK\n127.0.0.1:6379> get \"abc\"\n\"123\"\n127.0.0.1:6379>"
  },
  {
    "path": "weixin-service-redis/src/main/resources/log4j.properties",
    "content": "log4j.rootLogger=DEBUG,FILE\nlog4j.appender.Threshold=ERROR\n\n#log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender\n#log4j.appender.CONSOLE.Encoding=UTF-8\n#log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout\n#log4j.appender.CONSOLE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [service-redis] %p [%t] %c-<%L> %m%n\n\nlog4j.appender.FILE=org.apache.log4j.RollingFileAppender\nlog4j.appender.FILE.Encoding=UTF-8\nlog4j.appender.FILE.File=logs/service-redis.log\nlog4j.appender.FILE.MaxFileSize=4000KB\nlog4j.appender.FILE.MaxBackupIndex=10\nlog4j.appender.FILE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [service-redis] %p [%t] %c-<%L> %m%n\n\n#log4j.logger.org.apache.zookeeper.ClientCnxn=ERROR"
  },
  {
    "path": "weixin-service-redis/src/main/resources/spring/spring-context.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/context\n    http://www.springframework.org/schema/context/spring-context-3.2.xsd\">\n\n\t<!-- 引入配置文件 -->\n\t<context:property-placeholder location=\"classpath:system.properties,spring/redis.properties\" />\n\n\t<!-- 打开Spring的Annotation支持 -->\n\t<context:annotation-config />\n\n\t<!-- 扫描注入  -->\n\t<context:component-scan base-package=\"com.cheng.weixin.service.redis\" />\n\n\t<import resource=\"classpath:spring/spring-dubbo-provider.xml\"/>\n\t<import resource=\"classpath:spring/spring-redis.xml\"/>\n\n</beans>"
  },
  {
    "path": "weixin-service-redis/src/main/resources/spring/spring-dubbo-provider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd\n          http://code.alibabatech.com/schema/dubbo\n          http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n  <dubbo:application name=\"weixin-service-redis\"/>\n\n  <dubbo:registry id=\"zk1\" address=\"${weixin.dubbo.reistry.address}\" protocol=\"${weixin.dubbo.reistry.protocol}\"/> <!-- 注意要关闭防火墙 -->\n\n  <dubbo:protocol id=\"mydubbo\" name=\"dubbo\" host=\"${weixin.dubbo.host.address}\" port=\"${weixin.dubbo.redis.service.port}\"/>\n\n  <dubbo:provider registry=\"zk1\" protocol=\"mydubbo\"/>\n\n  <dubbo:service interface=\"com.cheng.weixin.rpc.redis.service.RpcRedisService\" ref=\"redisService\" version=\"1.0\"/>\n\n</beans>\n"
  },
  {
    "path": "weixin-service-redis/src/main/resources/spring/spring-redis.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\t\t\t xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t\t xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\">\n\n\t<!-- 构建连接池配置信息 -->\n\t<bean id=\"poolConfig\" class=\"redis.clients.jedis.JedisPoolConfig\">\n\t\t<property name=\"maxTotal\" value=\"${redis.maxTotal}\"/>\n\t\t<property name=\"maxIdle\" value=\"${redis.maxIdle}\" />\n\t\t<property name=\"maxWaitMillis\" value=\"${redis.maxWait}\" />\n\t\t<property name=\"testOnBorrow\" value=\"${redis.testOnBorrow}\" />\n\t</bean>\n\n\t<bean id=\"shardInfo\" class=\"redis.clients.jedis.JedisShardInfo\">\n\t\t<constructor-arg index=\"0\" value=\"${redis.node1.host}\" />\n\t\t<constructor-arg index=\"1\" value=\"${redis.node1.port}\" type=\"int\" />\n\t\t<constructor-arg index=\"2\" value=\"${redis.timeout}\" type=\"int\" />\n\t\t<property name=\"password\" value=\"${redis.node1.password}\" />\n\t</bean>\n\n\t<!-- 定义分片式集群连接池\n\t<bean id=\"jedisPool\" class=\"redis.clients.jedis.ShardedJedisPool\" destroy-method=\"close\">\n\t\t<constructor-arg index=\"0\" ref=\"poolConfig\"/>\n\t\t<constructor-arg index=\"1\">\n\t\t\t<list>\n\t\t\t\t<ref bean=\"shardInfo\"/>\n\t\t\t</list>\n\t\t</constructor-arg>\n\t</bean> -->\n\n\t<!-- redis服务器中心 -->\n\t<bean id=\"connectionFactory\"  class=\"org.springframework.data.redis.connection.jedis.JedisConnectionFactory\" >\n\t\t<property name=\"poolConfig\" ref=\"poolConfig\" />\n\t\t<property name=\"shardInfo\" ref=\"shardInfo\"/>\n\t\t<property name=\"database\" value=\"1\"/>\n\t</bean>\n\n\t<!-- Redis 序列换 -->\n\t<bean id=\"keySerializer\" class=\"org.springframework.data.redis.serializer.StringRedisSerializer\"/>\n\t<bean id=\"valueSerializer\" class=\"org.springframework.data.redis.serializer.JdkSerializationRedisSerializer\"/>\n\t<bean id=\"hashKeySerializer\" class=\"org.springframework.data.redis.serializer.StringRedisSerializer\"/>\n\n\t<!-- RedisTemplate 模版 -->\n\t<bean id=\"redisTemplate\" class=\"org.springframework.data.redis.core.RedisTemplate\" >\n\t\t<property name=\"connectionFactory\" ref=\"connectionFactory\" />\n\t\t<property name=\"keySerializer\" ref=\"keySerializer\"/>\n\t\t<property name=\"valueSerializer\" ref=\"valueSerializer\"/>\n\t\t<property name=\"hashKeySerializer\" ref=\"hashKeySerializer\"/>\n\t</bean >\n\n\t<!-- Redis 缓存时间 -->\n\t<bean id=\"redisCacheManager\" class=\"org.springframework.data.redis.cache.RedisCacheManager\">\n\t\t<constructor-arg index=\"0\" ref=\"redisTemplate\" />\n\t\t<property name=\"defaultExpiration\" value=\"${redis.expiration}\" />\n\t</bean>\n\n</beans>"
  },
  {
    "path": "weixin-service-redis/src/test/java/com/cheng/test/TestAll.java",
    "content": "package com.cheng.test;\n\nimport com.cheng.weixin.rpc.redis.service.RpcRedisService;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.test.context.ContextConfiguration;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\n\nimport java.io.Serializable;\nimport java.util.Map;\nimport java.util.Set;\n\n/**\n * Desc:\n * Author: 光灿\n * Date: 2016/7/1\n */\n@RunWith(SpringJUnit4ClassRunner.class)\n@ContextConfiguration(locations = {\"classpath*:spring-context.xml\"})\npublic class TestAll {\n    @Autowired\n    private RpcRedisService redisService;\n\n    @Test\n    public void test01() {\n        boolean data = redisService.exists(\"website\");\n        System.out.println(\"======> \"+data);\n    }\n\n    @Test\n    public void test02() {\n        long data = redisService.increase(\"user-12\",\"1\");\n        System.out.println(\"======> \"+data);\n    }\n    @Test\n    public void test03() {\n        Object obj = redisService.getValueByKeyANdField(\"user-11\",\"1\");\n        System.out.println(obj);\n    }\n    @Test\n    public void test04() {\n        Map<Serializable, Object> datas = redisService.getEntries(\"CART_1\");\n\n        Set<Serializable> fields = datas.keySet();\n        for (Serializable field : fields) {\n            System.out.println(\"====> Value: \"+field + \" Key: \" + datas.get(field));\n        }\n    }\n    @Test\n    public void test05() {\n        redisService.put(\"USER_1\", \"TRUE_1\", 15L);\n    }\n}\n"
  },
  {
    "path": "weixin-service-redis/src/test/java/com/cheng/test/TestMain.java",
    "content": "package com.cheng.test;\n\nimport com.cheng.weixin.service.redis.service.RedisService;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.BeansException;\nimport org.springframework.context.support.ClassPathXmlApplicationContext;\n\n/**\n * Desc: Spring 容器启动类\n * Author: Cheng\n * Date: 2016/4/21 0021\n */\npublic class TestMain {\n    private static final Logger log = LoggerFactory.getLogger(TestMain.class);\n\n    public static void main(String[] args) {\n        try {\n            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(\"classpath:/spring/spring-context.xml\");\n\n            RedisService redis = context.getBean(RedisService.class);\n            redis.set(\"Token\",\"4566855236965823333\");\n            System.out.println(\"======\");\n//            context.start();\n        } catch (BeansException e) {\n            e.printStackTrace();\n            log.error(\"content start error==>\" + e);\n        }\n\n//        synchronized (TimerMain.class) {\n//            while (true) {\n//                try {\n//                    TimerMain.class.wait();\n//                } catch (InterruptedException e) {\n//                    log.error(\"synchronized error==>\" + e);\n//                }\n//            }\n//        }\n\n    }\n\n}\n"
  },
  {
    "path": "weixin-service-redis/src/test/resources/log4j.properties",
    "content": "log4j.rootLogger=DEBUG,CONSOLE\n#,FILE\nlog4j.appender.Threshold=ERROR\n\nlog4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender\nlog4j.appender.CONSOLE.Encoding=UTF-8\nlog4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.CONSOLE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [service-redis] %p [%t] %c-<%L> %m%n\n\n#log4j.appender.FILE=org.apache.log4j.RollingFileAppender\n#log4j.appender.FILE.Encoding=UTF-8\n#log4j.appender.FILE.File=logs/service-redis.log\n#log4j.appender.FILE.MaxFileSize=4000KB\n#log4j.appender.FILE.MaxBackupIndex=10\n#log4j.appender.FILE.layout=org.apache.log4j.PatternLayout\n#log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [service-redis] %p [%t] %c-<%L> %m%n\n\n#log4j.logger.org.apache.zookeeper.ClientCnxn=ERROR"
  },
  {
    "path": "weixin-service-redis/src/test/resources/spring-context.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/context\n    http://www.springframework.org/schema/context/spring-context-3.2.xsd\">\n\n\t<!-- 引入配置文件 -->\n\t<context:property-placeholder location=\"redis.properties\" />\n\n\t<!-- 打开Spring的Annotation支持 -->\n\t<context:annotation-config />\n\n\t<!-- 扫描注入  -->\n\t<context:component-scan base-package=\"com.cheng.weixin.service.redis\" />\n\n\t<import resource=\"classpath:spring-redis.xml\"/>\n\n</beans>"
  },
  {
    "path": "weixin-service-redis/src/test/resources/spring-redis.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\t\t\t xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t\t xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\">\n\n\t<!-- 构建连接池配置信息 -->\n\t<bean id=\"poolConfig\" class=\"redis.clients.jedis.JedisPoolConfig\">\n\t\t<property name=\"maxTotal\" value=\"${redis.maxTotal}\"/>\n\t\t<property name=\"maxIdle\" value=\"${redis.maxIdle}\" />\n\t\t<property name=\"maxWaitMillis\" value=\"${redis.maxWait}\" />\n\t\t<property name=\"testOnBorrow\" value=\"${redis.testOnBorrow}\" />\n\t</bean>\n\n\t<bean id=\"shardInfo\" class=\"redis.clients.jedis.JedisShardInfo\">\n\t\t<constructor-arg index=\"0\" value=\"${redis.node1.host}\" />\n\t\t<constructor-arg index=\"1\" value=\"${redis.node1.port}\" type=\"int\" />\n\t\t<constructor-arg index=\"2\" value=\"${redis.timeout}\" type=\"int\" />\n\t\t<property name=\"password\" value=\"${redis.node1.password}\" />\n\t</bean>\n\n\t<!-- 定义分片式集群连接池\n\t<bean id=\"jedisPool\" class=\"redis.clients.jedis.ShardedJedisPool\" destroy-method=\"close\">\n\t\t<constructor-arg index=\"0\" ref=\"poolConfig\"/>\n\t\t<constructor-arg index=\"1\">\n\t\t\t<list>\n\t\t\t\t<ref bean=\"shardInfo\"/>\n\t\t\t</list>\n\t\t</constructor-arg>\n\t</bean> -->\n\n\t<!-- redis服务器中心 -->\n\t<bean id=\"connectionFactory\"  class=\"org.springframework.data.redis.connection.jedis.JedisConnectionFactory\" >\n\t\t<property name=\"poolConfig\" ref=\"poolConfig\" />\n\t\t<property name=\"shardInfo\" ref=\"shardInfo\"/>\n\t\t<property name=\"database\" value=\"1\"/>\n\t</bean>\n\n\t<!-- Redis 序列换 -->\n\t<bean id=\"keySerializer\" class=\"org.springframework.data.redis.serializer.StringRedisSerializer\"/>\n\t<bean id=\"valueSerializer\" class=\"org.springframework.data.redis.serializer.JdkSerializationRedisSerializer\"/>\n\t<bean id=\"hashKeySerializer\" class=\"org.springframework.data.redis.serializer.StringRedisSerializer\"/>\n\n\t<!-- RedisTemplate 模版 -->\n\t<bean id=\"redisTemplate\" class=\"org.springframework.data.redis.core.RedisTemplate\" >\n\t\t<property name=\"connectionFactory\" ref=\"connectionFactory\" />\n\t\t<property name=\"keySerializer\" ref=\"keySerializer\"/>\n\t\t<property name=\"valueSerializer\" ref=\"valueSerializer\"/>\n\t\t<property name=\"hashKeySerializer\" ref=\"hashKeySerializer\"/>\n\t</bean >\n\n\t<!-- Redis 缓存时间 -->\n\t<bean id=\"redisCacheManager\" class=\"org.springframework.data.redis.cache.RedisCacheManager\">\n\t\t<constructor-arg index=\"0\" ref=\"redisTemplate\" />\n\t\t<property name=\"defaultExpiration\" value=\"${redis.expiration}\" />\n\t</bean>\n\n</beans>"
  },
  {
    "path": "weixin-service-system/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-service-system</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-config</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-service</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-rpc-system</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>junit</groupId>\n      <artifactId>junit</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>log4j</groupId>\n      <artifactId>log4j</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-log4j12</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-logging</groupId>\n      <artifactId>commons-logging</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-beanutils</groupId>\n      <artifactId>commons-beanutils</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.github.pagehelper</groupId>\n      <artifactId>pagehelper</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>javax.servlet</groupId>\n      <artifactId>javax.servlet-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>mysql</groupId>\n      <artifactId>mysql-connector-java</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>druid</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjrt</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjweaver</artifactId>\n    </dependency>\n    <!-- Dubbo Start -->\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>dubbo</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.101tec</groupId>\n      <artifactId>zkclient</artifactId>\n    </dependency>\n    <!-- Dubbo End -->\n    <!-- Spring begin -->\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context-support</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-core</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-beans</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-aop</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-orm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-web</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-jdbc</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-oxm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-test</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-tx</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-expression</artifactId>\n    </dependency>\n    <!-- Spring end -->\n    <!-- MyBatis begin -->\n    <dependency>\n      <groupId>org.mybatis</groupId>\n      <artifactId>mybatis</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.mybatis</groupId>\n      <artifactId>mybatis-spring</artifactId>\n    </dependency>\n    <!-- MyBatis end -->\n  </dependencies>\n  <build>\n    <resources>\n      <resource>\n        <targetPath>${project.build.directory}/classes</targetPath>\n        <directory>src/main/resources</directory>\n        <filtering>true</filtering>\n        <includes>\n          <include>**/*.xml</include>\n          <include>**/*.properties</include>\n        </includes>\n        <excludes>\n          <exclude>rebel.xml</exclude>\n        </excludes>\n      </resource>\n      <resource>\n        <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>\n        <directory>src/main/resources/spring</directory>\n        <!--<directory>src/main/resources</directory>-->\n        <filtering>true</filtering>\n        <includes>\n          <include>spring-context.xml</include>\n        </includes>\n      </resource>\n    </resources>\n    <plugins>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-compiler-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-source-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-jar-plugin</artifactId>\n        <configuration>\n          <classesDirectory>target/classes/</classesDirectory>\n          <archive>\n            <!--生成的jar中，不要包含pom.xml和pom.properties这两个文件 -->\n            <addMavenDescriptor>false</addMavenDescriptor>\n            <manifest>\n              <mainClass>com.alibaba.dubbo.container.Main</mainClass>\n              <!-- 打包时MANIFEST.MF文件不记录时间版本 -->\n              <useUniqueVersions>false</useUniqueVersions>\n              <addClasspath>true</addClasspath>\n              <classpathPrefix>lib/</classpathPrefix>\n            </manifest>\n            <manifestEntries>\n              <Class-Path>.</Class-Path>\n            </manifestEntries>\n          </archive>\n        </configuration>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-dependency-plugin</artifactId>\n        <executions>\n          <execution>\n            <id>copy-dependencies</id>\n            <phase>package</phase>\n            <goals>\n              <goal>copy-dependencies</goal>\n            </goals>\n            <configuration>\n              <type>jar</type>\n              <includeTypes>jar</includeTypes>\n              <!--<useUniqueVersions>false</useUniqueVersions>-->\n              <outputDirectory>\n                ${project.build.directory}/lib\n              </outputDirectory>\n            </configuration>\n          </execution>\n        </executions>\n      </plugin>\n      <plugin>\n        <groupId>org.zeroturnaround</groupId>\n        <artifactId>jrebel-maven-plugin</artifactId>\n      </plugin>\n    </plugins>\n  </build>\n</project>"
  },
  {
    "path": "weixin-service-system/shell/service-system.sh",
    "content": "#!/bin/sh\n\n## java env\nexport JAVA_HOME=/usr/jdk/jdk1.7.0_45\nexport JRE_HOME=$JAVA_HOME/jre\n\n## service name\nAPP_NAME=system\n\nSERVICE_DIR=/usr/cheng/service/$APP_NAME\nSERVICE_NAME=weixin-service-$APP_NAME\nJAR_NAME=$SERVICE_NAME\\.jar\nPID=$SERVICE_NAME\\.pid\n\ncd $SERVICE_DIR\n\ncase \"$1\" in\n\n    start)\n        nohup $JRE_HOME/bin/java -Xms256m -Xmx512m -jar $JAR_NAME >/dev/null 2>&1 &\n        echo $! > $SERVICE_DIR/$PID\n        echo \"=== start $SERVICE_NAME\"\n        ;;\n\n    stop)\n        kill `cat $SERVICE_DIR/$PID`\n        rm -rf $SERVICE_DIR/$PID\n        echo \"=== stop $SERVICE_NAME\"\n\n        sleep 5\n\n        P_ID=`ps -ef | grep -w \"$SERVICE_NAME\" | grep -v \"grep\" | awk '{print $2}'`\n        if [ \"$P_ID\" == \"\" ]; then\n            echo \"=== $SERVICE_NAME process not exists or stop success\"\n        else\n            echo \"=== $SERVICE_NAME process pid is:$P_ID\"\n            echo \"=== begin kill $SERVICE_NAME process, pid is:$P_ID\"\n            kill -9 $P_ID\n        fi\n        ;;\n\n    restart)\n        $0 stop\n        sleep 2\n        $0 start\n        echo \"=== restart $SERVICE_NAME\"\n        ;;\n\n    *)\n        ## restart\n        $0 stop\n        sleep 2\n        $0 start\n        ;;\n\nesac\nexit 0\n\n"
  },
  {
    "path": "weixin-service-system/src/main/java/com/cheng/weixin/service/system/dao/AdDaoMapper.java",
    "content": "package com.cheng.weixin.service.system.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.system.entity.Ad;\nimport org.springframework.stereotype.Repository;\n\nimport java.util.List;\n\n/**\n * Desc:\n * Author: cheng\n * Date: 2016/6/29\n */\n@Repository\npublic interface AdDaoMapper extends BaseDaoMapper<Ad> {\n    /**\n     * 获取首页的广告图片\n     * @return\n     */\n    List<Ad> loadIndexAds();\n\n}\n"
  },
  {
    "path": "weixin-service-system/src/main/java/com/cheng/weixin/service/system/dao/AdJoinPositionDaoMapper.java",
    "content": "package com.cheng.weixin.service.system.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.system.entity.AdJoinPosition;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc:\n * Author: cheng\n * Date: 2016/6/29\n */\n@Repository\npublic interface AdJoinPositionDaoMapper extends BaseDaoMapper<AdJoinPosition> {\n}\n"
  },
  {
    "path": "weixin-service-system/src/main/java/com/cheng/weixin/service/system/dao/AdPositionDaoMapper.java",
    "content": "package com.cheng.weixin.service.system.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.system.entity.AdPosition;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc:\n * Author: cheng\n * Date: 2016/6/29\n */\n@Repository\npublic interface AdPositionDaoMapper extends BaseDaoMapper<AdPosition> {\n}\n"
  },
  {
    "path": "weixin-service-system/src/main/java/com/cheng/weixin/service/system/dao/NoticeDaoMapper.java",
    "content": "package com.cheng.weixin.service.system.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.system.entity.Notice;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 公告\n * Author: cheng\n * Date: 2016/6/29\n */\n@Repository\npublic interface NoticeDaoMapper extends BaseDaoMapper<Notice> {\n\n}\n"
  },
  {
    "path": "weixin-service-system/src/main/java/com/cheng/weixin/service/system/dao/NoticeTypeDaoMapper.java",
    "content": "package com.cheng.weixin.service.system.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.system.entity.Notice;\nimport com.cheng.weixin.rpc.system.entity.NoticeType;\n\n/**\n * Desc: 公告类型\n * Author: cheng\n * Date: 2016/6/29\n */\n//@Repository\n@Deprecated\npublic interface NoticeTypeDaoMapper extends BaseDaoMapper<NoticeType> {\n}\n"
  },
  {
    "path": "weixin-service-system/src/main/java/com/cheng/weixin/service/system/dao/SystemParamDaoMapper.java",
    "content": "package com.cheng.weixin.service.system.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.system.entity.SystemParam;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 系统参数\n * Author: cheng\n * Date: 2016/6/29\n */\n@Repository\npublic interface SystemParamDaoMapper extends BaseDaoMapper<SystemParam> {\n\n}\n"
  },
  {
    "path": "weixin-service-system/src/main/java/com/cheng/weixin/service/system/service/SystemService.java",
    "content": "package com.cheng.weixin.service.system.service;\n\nimport com.cheng.weixin.rpc.system.entity.Ad;\nimport com.cheng.weixin.rpc.system.entity.Notice;\nimport com.cheng.weixin.rpc.system.service.RpcSystemService;\nimport com.cheng.weixin.service.system.dao.AdDaoMapper;\nimport com.cheng.weixin.service.system.dao.NoticeDaoMapper;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\n\n/**\n * Desc: 广告\n * Author: cheng\n * Date: 2016/6/29\n */\n@Service(\"systemService\")\npublic class SystemService implements RpcSystemService {\n    @Autowired\n    private AdDaoMapper adDao;\n    @Autowired\n    private NoticeDaoMapper noticeDao;\n    /**\n     * 获取首页的图片\n     *\n     * @return\n     */\n    @Override\n    public List<Ad> getIndexAds() {\n        return adDao.loadIndexAds();\n    }\n\n    /**\n     * 获取首页的公告\n     *\n     * @return\n     */\n    @Override\n    public List<Notice> getIndexNotices() {\n        return noticeDao.loadAll();\n    }\n}\n"
  },
  {
    "path": "weixin-service-system/src/main/resources/log4j.properties",
    "content": "log4j.rootLogger=DEBUG,CONSOLE,FILE\nlog4j.appender.Threshold=ERROR\n\n#log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender\n#log4j.appender.CONSOLE.Encoding=UTF-8\n#log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout\n#log4j.appender.CONSOLE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [service-system] %p [%t] %c-<%L> %m%n\n\nlog4j.appender.FILE=org.apache.log4j.RollingFileAppender\nlog4j.appender.FILE.Encoding=UTF-8\nlog4j.appender.FILE.File=logs/service-system.log\nlog4j.appender.FILE.MaxFileSize=4000KB\nlog4j.appender.FILE.MaxBackupIndex=10\nlog4j.appender.FILE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [service-system] %p [%t] %c-<%L> %m%n\n\n#log4j.logger.org.apache.zookeeper.ClientCnxn=ERROR"
  },
  {
    "path": "weixin-service-system/src/main/resources/mybatis/mapper/AdJoinPositionMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.system.dao.AdJoinPositionDaoMapper\">\n  <sql id=\"tableName\">ad_join_position</sql>\n  <sql id=\"columns\">\n    a.id,a.ad_id,a.ad_position_id,a.create_date,a.update_date,a.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,ad_id,ad_position_id,create_date,update_date,status\n  </sql>\n  <sql id=\"adJoinPositionIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"adId != null and adId != ''\">name=#{ad_id},</if>\n    <if test=\"adPositionId != null and adPositionId != ''\">ad_position_id=#{adPositionId},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"adJoinPositionSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS a\n  </sql>\n\n  <sql id=\"adJoinPositionWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"adJoinPositionUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"adJoinPositionIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <!-- 根据ID获取图片 -->\n  <select id=\"load\" parameterType=\"Ad\" resultType=\"Ad\">\n    <include refid=\"adJoinPositionSelector\"/>\n    <include refid=\"adJoinPositionWhere\"/>\n  </select>\n  <!-- 获取全部图片信息 -->\n  <select id=\"loadAll\" resultType=\"Ad\">\n    <include refid=\"adJoinPositionSelector\"/>\n    <include refid=\"adJoinPositionWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"Ad\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"adJoinPositionUpdate\"/>\n    <include refid=\"adJoinPositionWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"Ad\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    <include refid=\"adJoinPositionIf\"/>\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-system/src/main/resources/mybatis/mapper/AdMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.system.dao.AdDaoMapper\">\n  <sql id=\"tableName\">ad</sql>\n  <sql id=\"columns\">\n    a.id,a.name,a.picture_url,a.link_url,a.width,a.height,a.priority,a.is_enable,\n    a.remarks,a.create_date,a.update_date,a.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,name,picture_url,link_url,width,height,priority,is_enable,remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"adIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"pictureUrl != null and pictureUrl != ''\">picture_url=#{pictureUrl},</if>\n    <if test=\"linkUrl != null and linkUrl != ''\">link_url=#{linkUrl},</if>\n    <if test=\"width != null and width != ''\">width=#{width},</if>\n    <if test=\"height != null and height != ''\">height=#{height},</if>\n    <if test=\"priority != null and priority != ''\">priority=#{priority},</if>\n    <if test=\"isEnable != null and isEnable != ''\">is_enable=#{isEnable},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"adSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS a\n  </sql>\n\n  <sql id=\"adWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"adUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"adIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <!-- 根据ID获取图片 -->\n  <select id=\"load\" parameterType=\"Ad\" resultType=\"Ad\">\n    <include refid=\"adSelector\"/>\n    <include refid=\"adWhere\"/>\n  </select>\n  <!-- 获取全部图片信息 -->\n  <select id=\"loadAll\" resultType=\"Ad\">\n    <include refid=\"adSelector\"/>\n    <include refid=\"adWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"Ad\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"adUpdate\"/>\n    <include refid=\"adWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"Ad\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    <include refid=\"adIf\"/>\n  </insert>\n\n  <!-- =================================================================== -->\n  <!-- 获取首页所有图片广告 -->\n  <select id=\"loadIndexAds\" resultType=\"Ad\">\n    <include refid=\"adSelector\"/>\n    LEFT JOIN ad_join_position ajp ON (ajp.ad_id = a.id)\n    LEFT JOIN ad_position ap ON (ap.id = ajp.ad_position_id)\n    where ap.type = \"INDEX\";\n  </select>\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-system/src/main/resources/mybatis/mapper/AdPositionMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.system.dao.AdPositionDaoMapper\">\n  <sql id=\"tableName\">ad_position</sql>\n  <sql id=\"columns\">\n    a.id,a.name,a.type,a.remarks,a.create_date,a.update_date,a.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,name,type,remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"adPositionIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"type != null and type != ''\">type=#{type},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"adPositionSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS a\n  </sql>\n\n  <sql id=\"adPositionWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"adPositionUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"adPositionIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <!-- 根据ID获取图片 -->\n  <select id=\"load\" parameterType=\"Ad\" resultType=\"Ad\">\n    <include refid=\"adPositionSelector\"/>\n    <include refid=\"adPositionWhere\"/>\n  </select>\n  <!-- 获取全部图片信息 -->\n  <select id=\"loadAll\" resultType=\"Ad\">\n    <include refid=\"adPositionSelector\"/>\n    <include refid=\"adPositionWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"Ad\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"adPositionUpdate\"/>\n    <include refid=\"adPositionWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"Ad\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    <include refid=\"adPositionIf\"/>\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-system/src/main/resources/mybatis/mapper/NoticeMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.system.dao.NoticeDaoMapper\">\n  <sql id=\"tableName\">notice</sql>\n  <sql id=\"columns\">\n    n.id,n.title,n.content,n.link_url,\n    n.remarks,n.create_date,n.update_date,n.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,title,content,link_url,remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"noticeIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"title != null and title != ''\">title=#{title},</if>\n    <if test=\"linkUrl != null and linkUrl != ''\">link_url=#{linkUrl},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"noticeSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS n\n  </sql>\n\n  <sql id=\"noticeWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"noticeUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"noticeIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <!-- 根据ID获取图片 -->\n  <select id=\"load\" parameterType=\"Notice\" resultType=\"Notice\">\n    <include refid=\"noticeSelector\"/>\n    <include refid=\"noticeWhere\"/>\n  </select>\n  <!-- 获取全部图片信息 -->\n  <select id=\"loadAll\" resultType=\"Notice\">\n    <include refid=\"noticeSelector\"/>\n    <include refid=\"noticeWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"Notice\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"noticeUpdate\"/>\n    <include refid=\"noticeWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"Notice\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    <include refid=\"noticeIf\"/>\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-system/src/main/resources/mybatis/mapper/SystemParamMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.system.dao.SystemParamDaoMapper\">\n  <sql id=\"tableName\">system_param</sql>\n  <sql id=\"columns\">\n    s.id,s.name,s.title,s.logo,s.description,s.copyright,\n    s.remarks,s.create_date,s.update_date,s.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,title,content,link_url,remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"systemParamIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"logo != null and logo != ''\">logo=#{logo},</if>\n    <if test=\"description != null and description != ''\">description=#{description},</if>\n    <if test=\"copyright != null and copyright != ''\">copyright=#{copyright},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"systemParamSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS n\n  </sql>\n\n  <sql id=\"systemParamWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"systemParamUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"systemParamIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <!-- 根据ID获取图片 -->\n  <select id=\"load\" parameterType=\"systemParam\" resultType=\"systemParam\">\n    <include refid=\"systemParamSelector\"/>\n    <include refid=\"systemParamWhere\"/>\n  </select>\n  <!-- 获取全部图片信息 -->\n  <select id=\"loadAll\" resultType=\"systemParam\">\n    <include refid=\"systemParamSelector\"/>\n    <include refid=\"systemParamWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"systemParam\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"systemParamUpdate\"/>\n    <include refid=\"systemParamWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"systemParam\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{name},#{title},#{logo},#{description},#{copyright},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-system/src/main/resources/mybatis/mybatis-config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE configuration\n        PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-config.dtd\">\n\n<configuration>\n  <settings>\n    <!-- 开启字段名和属性名驼峰匹配 -->\n    <setting name=\"mapUnderscoreToCamelCase\" value=\"true\"/>\n    <!-- 全局启用或禁用延迟加载。当禁用时，所有关联对象都会即时加载。 -->\n    <setting name=\"lazyLoadingEnabled\" value=\"true\"/>\n    <!-- 当启用时，有延迟加载属性的对象在被调用时将会完全加载任意属性。否则，每种属性将会按需要加载。 -->\n    <setting name=\"aggressiveLazyLoading\" value=\"true\"/>\n  </settings>\n  <plugins>\n    <plugin interceptor=\"com.github.pagehelper.PageHelper\">\n\n      <property name=\"dialect\" value=\"mysql\"/>\n\n    </plugin>\n  </plugins>\n</configuration>"
  },
  {
    "path": "weixin-service-system/src/main/resources/spring/spring-context.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/context\n    http://www.springframework.org/schema/context/spring-context-3.2.xsd\">\n\n\t<!-- 引入配置文件 -->\n\t<context:property-placeholder location=\"classpath:system.properties,classpath:jdbc.properties\" />\n\n\t<!-- 打开Spring的Annotation支持 -->\n\t<context:annotation-config />\n\n\t<!-- 扫描注入  -->\n\t<context:component-scan base-package=\"com.cheng.weixin.service.system\" />\n\n\t<import resource=\"classpath:spring/spring-dubbo-provider.xml\"/>\n\t<import resource=\"classpath:spring/spring-mybatis.xml\"/>\n\n</beans>"
  },
  {
    "path": "weixin-service-system/src/main/resources/spring/spring-dubbo-provider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd\n          http://code.alibabatech.com/schema/dubbo\n          http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n  <dubbo:application name=\"weixin-service-system\"/>\n\n  <dubbo:registry id=\"zk1\" address=\"${weixin.dubbo.reistry.address}\" protocol=\"${weixin.dubbo.reistry.protocol}\"/> <!-- 注意要关闭防火墙 -->\n\n  <dubbo:protocol id=\"mydubbo\" name=\"dubbo\" host=\"${weixin.dubbo.host.address}\" port=\"${weixin.dubbo.system.service.port}\"/>\n\n  <dubbo:provider registry=\"zk1\" protocol=\"mydubbo\"/>\n\n  <dubbo:service interface=\"com.cheng.weixin.rpc.system.service.RpcSystemService\" ref=\"systemService\" version=\"1.0\"/>\n\n</beans>\n"
  },
  {
    "path": "weixin-service-system/src/main/resources/spring/spring-mybatis.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:p=\"http://www.springframework.org/schema/p\"\n\txmlns:aop=\"http://www.springframework.org/schema/aop\"\n\txmlns:tx=\"http://www.springframework.org/schema/tx\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/tx\n    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd\n    http://www.springframework.org/schema/aop\n    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd\">\n\n\t<bean id=\"dataSource\" class=\"com.alibaba.druid.pool.DruidDataSource\" init-method=\"init\" destroy-method=\"close\">\n\t  <property name=\"driverClassName\" value=\"${jdbc.driverClassName}\"/>\n\t  <property name=\"url\" value=\"${jdbc.url}\"/>\n\t  <property name=\"username\" value=\"${jdbc.username}\"/>\n\t  <property name=\"password\" value=\"${jdbc.password}\"/>\n\t  <!-- 连接池最大使用连接数 -->\n\t  <property name=\"maxActive\" value=\"${jdbc.maxActive}\"/>\n\t  <!-- 初始化连接大小 -->\n\t  <property name=\"initialSize\" value=\"${jdbc.initialSize}\"/>\n\t  <!-- 获取连接最大等待时间 -->\n\t  <property name=\"maxWait\" value=\"${jdbc.maxWait}\"/>\n\t  <!-- 连接池最大空闲 -->\n\t  <!--  property name=\"maxIdle\" value=\"${jdbc.maxIdle}\"/>-->\n\t  <!-- 连接池最小空闲 -->\n\t  <property name=\"minIdle\" value=\"${jdbc.minIdle}\"/>\n\t  <!-- 自动清除无用连接 -->\n\t  <property name=\"removeAbandoned\" value=\"${jdbc.removeAbandoned}\"/>\n\t  <!-- 清除无用连接的等待时间 -->\n\t  <property name=\"removeAbandonedTimeout\" value=\"${jdbc.removeAbandonedTimeout}\"/>\n\t  <!-- 连接属性 -->\n\t  <property name=\"connectionProperties\" value=\"${jdbc.connectionProperties}\"/>\n\t</bean>\n\n  <!-- 注入SQLSession -->\n  <bean id=\"sqlSession\" class=\"org.mybatis.spring.SqlSessionTemplate\" scope=\"prototype\">\n    <constructor-arg index=\"0\" ref=\"sqlSessionFactory\"/>\n  </bean>\n\n\t<!-- mybatis配置 -->\n\t<bean id=\"sqlSessionFactory\" class=\"org.mybatis.spring.SqlSessionFactoryBean\"\n\t\tp:dataSource-ref=\"dataSource\"\n    p:configLocation=\"classpath:/mybatis/mybatis-config.xml\"\n\t\tp:typeAliasesPackage=\"com.cheng.weixin.rpc.system.entity\"\n\t\tp:mapperLocations=\"classpath:/mybatis/mapper/*.xml\" />\n\n\t<!-- spring与mybatis整合配置，扫描所有dao -->\n\t<bean class=\"org.mybatis.spring.mapper.MapperScannerConfigurer\"\n\t\tp:basePackage=\"com.cheng.weixin.service.system.dao\"\n\t\tp:sqlSessionFactoryBeanName=\"sqlSessionFactory\" />\n\n\t<!-- 对数据源进行事务管理 -->\n\t<bean id=\"transactionManager\" class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\"\n\t\tp:dataSource-ref=\"dataSource\" />\n\t<!-- 通知 -->\n\t<tx:advice id=\"txAdvice\" transaction-manager=\"transactionManager\">\n\t  <!-- 传播行为 -->\n\t  <tx:attributes>\n\t  \t<tx:method name=\"add*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"update*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"delete*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"get*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  \t<tx:method name=\"find*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  </tx:attributes>\n\t</tx:advice>\t\n\t<!-- 哪些类的哪些方法使用事务 -->\n\t<aop:config>\n\t  <aop:advisor advice-ref=\"txAdvice\" pointcut=\"execution(* com.cheng.weixin.service.system.service.*.*(..))\"/>\n\t</aop:config>\n\t\t\n\t<!-- 开启事务注解驱动 \n    <tx:annotation-driven />\n    -->\n</beans>"
  },
  {
    "path": "weixin-service-timer/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-service-timer</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-config</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-rpc-httpclient</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-rpc-redis</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>junit</groupId>\n      <artifactId>junit</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>log4j</groupId>\n      <artifactId>log4j</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-log4j12</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-logging</groupId>\n      <artifactId>commons-logging</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>fastjson</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.quartz-scheduler</groupId>\n      <artifactId>quartz</artifactId>\n    </dependency>\n    <!-- Dubbo Start -->\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>dubbo</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.101tec</groupId>\n      <artifactId>zkclient</artifactId>\n    </dependency>\n    <!-- Dubbo End -->\n    <!-- Spring begin -->\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context-support</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-core</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-beans</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-aop</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-orm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-test</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-tx</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-expression</artifactId>\n    </dependency>\n    <!-- Spring end -->\n  </dependencies>\n  <build>\n    <resources>\n      <resource>\n        <targetPath>${project.build.directory}/classes</targetPath>\n        <directory>src/main/resources</directory>\n        <filtering>true</filtering>\n        <includes>\n          <include>**/*.xml</include>\n          <include>**/*.properties</include>\n        </includes>\n        <excludes>\n          <exclude>rebel.xml</exclude>\n        </excludes>\n      </resource>\n      <resource>\n        <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>\n        <directory>src/main/resources/spring</directory>\n        <filtering>true</filtering>\n        <includes>\n          <include>spring-context.xml</include>\n        </includes>\n      </resource>\n    </resources>\n    <plugins>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-compiler-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-source-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-jar-plugin</artifactId>\n        <configuration>\n          <classesDirectory>target/classes/</classesDirectory>\n          <archive>\n            <!--生成的jar中，不要包含pom.xml和pom.properties这两个文件 -->\n            <addMavenDescriptor>false</addMavenDescriptor>\n            <manifest>\n              <mainClass>com.alibaba.dubbo.container.Main</mainClass>\n              <!-- 打包时MANIFEST.MF文件不记录时间版本 -->\n              <useUniqueVersions>false</useUniqueVersions>\n              <addClasspath>true</addClasspath>\n              <classpathPrefix>lib/</classpathPrefix>\n            </manifest>\n            <manifestEntries>\n              <Class-Path>.</Class-Path>\n            </manifestEntries>\n          </archive>\n        </configuration>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-dependency-plugin</artifactId>\n        <executions>\n          <execution>\n            <id>copy-dependencies</id>\n            <phase>package</phase>\n            <goals>\n              <goal>copy-dependencies</goal>\n            </goals>\n            <configuration>\n              <type>jar</type>\n              <includeTypes>jar</includeTypes>\n              <!--<useUniqueVersions>false</useUniqueVersions>-->\n              <outputDirectory>\n                ${project.build.directory}/lib\n              </outputDirectory>\n            </configuration>\n          </execution>\n        </executions>\n      </plugin>\n      <plugin>\n        <groupId>org.zeroturnaround</groupId>\n        <artifactId>jrebel-maven-plugin</artifactId>\n      </plugin>\n    </plugins>\n  </build>\n</project>"
  },
  {
    "path": "weixin-service-timer/shell/service-redis.sh",
    "content": "#!/bin/sh\n\n## java env\nexport JAVA_HOME=/usr/local/jdk1.7.0_45\nexport JRE_HOME=$JAVA_HOME/jre\n\n## service name\nAPP_NAME=timer\n\nSERVICE_DIR=/home/wusc/edu/service/$APP_NAME\nSERVICE_NAME=weixin-service-$APP_NAME\nJAR_NAME=$SERVICE_NAME\\.jar\nPID=$SERVICE_NAME\\.pid\n\ncd $SERVICE_DIR\n\ncase \"$1\" in\n\n    start)\n        nohup $JRE_HOME/bin/java -Xms256m -Xmx512m -jar $JAR_NAME >/dev/null 2>&1 &\n        echo $! > $SERVICE_DIR/$PID\n        echo \"=== start $SERVICE_NAME\"\n        ;;\n\n    stop)\n        kill `cat $SERVICE_DIR/$PID`\n        rm -rf $SERVICE_DIR/$PID\n        echo \"=== stop $SERVICE_NAME\"\n\n        sleep 5\n\n        P_ID=`ps -ef | grep -w \"$SERVICE_NAME\" | grep -v \"grep\" | awk '{print $2}'`\n        if [ \"$P_ID\" == \"\" ]; then\n            echo \"=== $SERVICE_NAME process not exists or stop success\"\n        else\n            echo \"=== $SERVICE_NAME process pid is:$P_ID\"\n            echo \"=== begin kill $SERVICE_NAME process, pid is:$P_ID\"\n            kill -9 $P_ID\n        fi\n        ;;\n\n    restart)\n        $0 stop\n        sleep 2\n        $0 start\n        echo \"=== restart $SERVICE_NAME\"\n        ;;\n\n    *)\n        ## restart\n        $0 stop\n        sleep 2\n        $0 start\n        ;;\n\nesac\nexit 0\n\n"
  },
  {
    "path": "weixin-service-timer/src/main/java/com/cheng/weixin/service/timer/main/TimerMain.java",
    "content": "package com.cheng.weixin.service.timer.main;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.BeansException;\nimport org.springframework.context.support.ClassPathXmlApplicationContext;\n\n/**\n * Desc: Spring 容器启动类\n * Author: Cheng\n * Date: 2016/4/21 0021\n */\npublic class TimerMain {\n    private static final Logger log = LoggerFactory.getLogger(TimerMain.class);\n\n    public static void main(String[] args) {\n        try {\n            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(\"classpath:/spring/spring-context.xml\");\n\n//            RefreshAccessTokenTask task = context.getBean(RefreshAccessTokenTask.class);\n//            task.refreshToken();\n\n            context.start();\n        } catch (BeansException e) {\n            e.printStackTrace();\n            log.error(\"content start error==>\" + e);\n        }\n\n        synchronized (TimerMain.class) {\n            while (true) {\n                try {\n                    TimerMain.class.wait();\n                } catch (InterruptedException e) {\n                    log.error(\"synchronized error==>\" + e);\n                }\n            }\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "weixin-service-timer/src/main/java/com/cheng/weixin/service/timer/token/RefreshAccessTokenTask.java",
    "content": "package com.cheng.weixin.service.timer.token;\n\nimport com.alibaba.fastjson.JSON;\nimport com.cheng.weixin.common.constant.weixin.WeixinFinalValue;\nimport com.cheng.weixin.common.constant.weixin.WeixinUrl;\nimport com.cheng.weixin.common.exception.ErrorEntity;\nimport com.cheng.weixin.rpc.httpclient.service.RpcHttpClientService;\nimport com.cheng.weixin.rpc.redis.service.RpcRedisService;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\n/**\n * 刷新access_token 定时任务\n * @author Cheng\n */\n@Component\npublic class RefreshAccessTokenTask {\n\t\n\tprivate static final Logger log = LoggerFactory.getLogger(RefreshAccessTokenTask.class);\n\n\t@Autowired\n\tprivate WeixinUrl weixinUrl;\n\t@Autowired\n\tprivate WeixinFinalValue weixinFinalValue;\n\t@Autowired\n\tprivate RpcHttpClientService httpClient;\n\t@Autowired\n\tprivate RpcRedisService redisService;\n\n\n\n\tpublic void refreshToken() {\n\t\tString url = weixinUrl.ACCESS_TOKEN_URL;\n\t\turl = url.replace(\"APPID\", weixinFinalValue.APPID).replace(\"APPSECRET\", weixinFinalValue.APPSECRET);\n\t\tString content = httpClient.doGet(url);\n        ErrorEntity err = JSON.parseObject(content, ErrorEntity.class);\n        if(err.getErrcode()!=null && !err.getErrcode().equals(\"0\")\n\t\t\t\t&& err.getErrmsg()!=null && !err.getErrmsg().equals(\"ok\")) {\n\t\t\tlog.error(\"发生错误，错误码：{}，错误消息：{}，正在重试！\", err.getErrcode(), err.getErrmsg());\n\t\t\trefreshToken();\n        }else {\n\t\t\tredisService.set(\"WEIXIN_ACCESS_TOKEN\", content);\n\t\t}\n\n\t}\n\n\n//\tpublic void refreshToken() {\n//\t\tDate date = new Date();\n//\t\tSystem.out.println(\"-->\"+new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\").format(date));\n//\t\tredisService.set(new SimpleDateFormat(\"HHmmss\").format(date), new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\").format(date));\n//\t}\n\n\n\t//\t\ttry {\n//\t\t\tAccessToken accessToken = JSON.parseObject(content, AccessToken.class);\n//\t\t\tWeixinContent.setAccessToken(accessToken.getAccess_token());\n//\t\t} catch (WeixinException err) {\n//\t\t\terr.printStackTrace();\n//\t\t\tlog.error(\"发生错误，错误码：{}，错误消息：{}，正在重试！\", err.getCode(), err.getErrorMsg());\n//\t\t\trefreshToken();\n//\t\t}\n}\n"
  },
  {
    "path": "weixin-service-timer/src/main/resources/config.properties",
    "content": ""
  },
  {
    "path": "weixin-service-timer/src/main/resources/log4j.properties",
    "content": "log4j.rootLogger=DEBUG,CONSOLE,FILE\nlog4j.appender.Threshold=ERROR\n\nlog4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender\nlog4j.appender.CONSOLE.Encoding=UTF-8\nlog4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.CONSOLE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [service-timer] %p [%t] %c-<%L> %m%n\n\nlog4j.appender.FILE=org.apache.log4j.RollingFileAppender\nlog4j.appender.FILE.Encoding=UTF-8\nlog4j.appender.FILE.File=logs/weixin-service-timer.log\nlog4j.appender.FILE.MaxFileSize=4000KB\nlog4j.appender.FILE.MaxBackupIndex=10\nlog4j.appender.FILE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [service-timer] %p [%t] %c-<%L> %m%n"
  },
  {
    "path": "weixin-service-timer/src/main/resources/spring/spring-context.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/context\n    http://www.springframework.org/schema/context/spring-context-3.2.xsd\">\n\n\t<!-- 引入配置文件 -->\n\t<context:property-placeholder location=\"classpath:system.properties,classpath:weixinconfig.properties,classpath:config.properties\" />\n\n\t<!-- 打开Spring的Annotation支持 -->\n\t<context:annotation-config />\n\n\t<!-- 扫描注入  -->\n\t<context:component-scan base-package=\"com.cheng.weixin.service.timer\" />\n\t<context:component-scan base-package=\"com.cheng.weixin.common.constant\" />\n\n\t<import resource=\"classpath:spring/spring-dubbo-consumer.xml\"/>\n\t<import resource=\"classpath:spring/spring-quartz.xml\"/>\n\n</beans>"
  },
  {
    "path": "weixin-service-timer/src/main/resources/spring/spring-dubbo-consumer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd\n          http://code.alibabatech.com/schema/dubbo\n          http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n  <dubbo:application name=\"weixin-web-timer\"/>\n\n  <dubbo:registry id=\"zk1\" address=\"${weixin.dubbo.reistry.address}\" protocol=\"zookeeper\"/> <!-- 注意要关闭防火墙 -->\n\n  <dubbo:consumer registry=\"zk1\"/>\n\n  <dubbo:reference id=\"httpClientService\" interface=\"com.cheng.weixin.rpc.httpclient.service.RpcHttpClientService\"/>\n  <dubbo:reference id=\"redisService\" interface=\"com.cheng.weixin.rpc.redis.service.RpcRedisService\"/>\n</beans>\n"
  },
  {
    "path": "weixin-service-timer/src/main/resources/spring/spring-quartz.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xmlns:p=\"http://www.springframework.org/schema/p\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd \">\n\n\t<!-- 实现类 -->\n\t<bean id=\"refreshAccessTokenTask\" class=\"com.cheng.weixin.service.timer.token.RefreshAccessTokenTask\"/>\n\t\n\t<!-- bean触发方法配置 -->\n\t<bean id=\"refreshAccessToken\" class=\"org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean\"\n\t\tp:targetObject-ref=\"refreshAccessTokenTask\"\n\t\tp:targetMethod=\"refreshToken\"/>\n\n\t<!-- 时间规则 微信：有效期为7200秒，7000000 一天调用2000次-->\n\t<bean id=\"refreshAccessTokenTime\" class=\"org.springframework.scheduling.quartz.SimpleTriggerFactoryBean\" \n\t\tp:jobDetail-ref=\"refreshAccessToken\"\n\t\tp:repeatInterval=\"2000\"/>\n\t\t\n\t<!-- 或者可以这样\n\t<bean id=\"refreshAccessTokenTime\" class=\"org.springframework.scheduling.quartz.CronTriggerFactoryBean\">\n    <property name=\"jobDetail\" ref=\"refreshAccessToken\"/>\n    <property name=\"cronExpression\" value=\"0 0 6 * * ?\"/>\n\t</bean>\n\t -->\n\t\t\n\t <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->\n\t<bean class=\"org.springframework.scheduling.quartz.SchedulerFactoryBean\" lazy-init=\"default\" autowire=\"default\" p:autoStartup=\"true\">\n\t\t<property name=\"triggers\">\n\t\t\t<list>\n\t\t\t\t<ref local=\"refreshAccessTokenTime\" />\n\t\t\t</list>\n\t\t</property>\n\t</bean>\n</beans>"
  },
  {
    "path": "weixin-service-user/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-service-user</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-config</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-service</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-rpc-user</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>junit</groupId>\n      <artifactId>junit</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>log4j</groupId>\n      <artifactId>log4j</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-log4j12</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-logging</groupId>\n      <artifactId>commons-logging</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-beanutils</groupId>\n      <artifactId>commons-beanutils</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.github.pagehelper</groupId>\n      <artifactId>pagehelper</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>javax.servlet</groupId>\n      <artifactId>javax.servlet-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>mysql</groupId>\n      <artifactId>mysql-connector-java</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>druid</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjrt</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjweaver</artifactId>\n    </dependency>\n    <!-- Dubbo Start -->\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>dubbo</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.101tec</groupId>\n      <artifactId>zkclient</artifactId>\n    </dependency>\n    <!-- Dubbo End -->\n    <!-- Spring begin -->\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context-support</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-core</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-beans</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-aop</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-orm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-web</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-jdbc</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-oxm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-test</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-tx</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-expression</artifactId>\n    </dependency>\n    <!-- Spring end -->\n    <!-- MyBatis begin -->\n    <dependency>\n      <groupId>org.mybatis</groupId>\n      <artifactId>mybatis</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.mybatis</groupId>\n      <artifactId>mybatis-spring</artifactId>\n    </dependency>\n    <!-- MyBatis end -->\n  </dependencies>\n\n  <build>\n    <resources>\n      <resource>\n        <targetPath>${project.build.directory}/classes</targetPath>\n        <directory>src/main/resources</directory>\n        <filtering>true</filtering>\n        <includes>\n          <include>**/*.xml</include>\n          <include>**/*.properties</include>\n        </includes>\n        <excludes>\n          <exclude>rebel.xml</exclude>\n        </excludes>\n      </resource>\n      <resource>\n        <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>\n        <directory>src/main/resources/spring</directory>\n        <!--<directory>src/main/resources</directory>-->\n        <filtering>true</filtering>\n        <includes>\n          <include>spring-context.xml</include>\n        </includes>\n      </resource>\n    </resources>\n    <plugins>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-compiler-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-source-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-jar-plugin</artifactId>\n        <configuration>\n          <classesDirectory>target/classes/</classesDirectory>\n          <archive>\n            <!--生成的jar中，不要包含pom.xml和pom.properties这两个文件 -->\n            <addMavenDescriptor>false</addMavenDescriptor>\n            <manifest>\n              <mainClass>com.alibaba.dubbo.container.Main</mainClass>\n              <!-- 打包时MANIFEST.MF文件不记录时间版本 -->\n              <useUniqueVersions>false</useUniqueVersions>\n              <addClasspath>true</addClasspath>\n              <classpathPrefix>lib/</classpathPrefix>\n            </manifest>\n            <manifestEntries>\n              <Class-Path>.</Class-Path>\n            </manifestEntries>\n          </archive>\n        </configuration>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-dependency-plugin</artifactId>\n        <executions>\n          <execution>\n            <id>copy-dependencies</id>\n            <phase>package</phase>\n            <goals>\n              <goal>copy-dependencies</goal>\n            </goals>\n            <configuration>\n              <type>jar</type>\n              <includeTypes>jar</includeTypes>\n              <!--<useUniqueVersions>false</useUniqueVersions>-->\n              <outputDirectory>\n                ${project.build.directory}/lib\n              </outputDirectory>\n            </configuration>\n          </execution>\n        </executions>\n      </plugin>\n      <plugin>\n        <groupId>org.zeroturnaround</groupId>\n        <artifactId>jrebel-maven-plugin</artifactId>\n      </plugin>\n    </plugins>\n  </build>\n</project>"
  },
  {
    "path": "weixin-service-user/shell/service-user.sh",
    "content": "#!/bin/sh\n\n## java env\nexport JAVA_HOME=/usr/jdk/jdk1.7.0_45\nexport JRE_HOME=$JAVA_HOME/jre\n\n## service name\nAPP_NAME=user\n\nSERVICE_DIR=/usr/cheng/service/$APP_NAME\nSERVICE_NAME=weixin-service-$APP_NAME\nJAR_NAME=$SERVICE_NAME\\.jar\nPID=$SERVICE_NAME\\.pid\n\ncd $SERVICE_DIR\n\ncase \"$1\" in\n\n    start)\n        nohup $JRE_HOME/bin/java -Xms256m -Xmx512m -jar $JAR_NAME >/dev/null 2>&1 &\n        echo $! > $SERVICE_DIR/$PID\n        echo \"=== start $SERVICE_NAME\"\n        ;;\n\n    stop)\n        kill `cat $SERVICE_DIR/$PID`\n        rm -rf $SERVICE_DIR/$PID\n        echo \"=== stop $SERVICE_NAME\"\n\n        sleep 5\n\n        P_ID=`ps -ef | grep -w \"$SERVICE_NAME\" | grep -v \"grep\" | awk '{print $2}'`\n        if [ \"$P_ID\" == \"\" ]; then\n            echo \"=== $SERVICE_NAME process not exists or stop success\"\n        else\n            echo \"=== $SERVICE_NAME process pid is:$P_ID\"\n            echo \"=== begin kill $SERVICE_NAME process, pid is:$P_ID\"\n            kill -9 $P_ID\n        fi\n        ;;\n\n    restart)\n        $0 stop\n        sleep 2\n        $0 start\n        echo \"=== restart $SERVICE_NAME\"\n        ;;\n\n    *)\n        ## restart\n        $0 stop\n        sleep 2\n        $0 start\n        ;;\n\nesac\nexit 0\n\n"
  },
  {
    "path": "weixin-service-user/src/main/java/com/cheng/weixin/service/user/dao/AccountDaoMapper.java",
    "content": "package com.cheng.weixin.service.user.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.user.entity.Account;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 用户基础信息\n * Author: cheng\n * Date: 2016/7/7\n */\n@Repository\npublic interface AccountDaoMapper extends BaseDaoMapper<Account> {\n}\n"
  },
  {
    "path": "weixin-service-user/src/main/java/com/cheng/weixin/service/user/dao/AccountLevelDaoMapper.java",
    "content": "package com.cheng.weixin.service.user.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.user.entity.AccountLevel;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 账户等级\n * Author: cheng\n * Date: 2016/7/7\n */\n@Repository\npublic interface AccountLevelDaoMapper extends BaseDaoMapper<AccountLevel> {\n}\n"
  },
  {
    "path": "weixin-service-user/src/main/java/com/cheng/weixin/service/user/dao/AccountUpgradeHistoryDaoMapper.java",
    "content": "package com.cheng.weixin.service.user.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.user.entity.AccountUpgradeHistory;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 账户升级历史\n * Author: cheng\n * Date: 2016/7/7\n */\n@Repository\npublic interface AccountUpgradeHistoryDaoMapper extends BaseDaoMapper<AccountUpgradeHistory> {\n}\n"
  },
  {
    "path": "weixin-service-user/src/main/java/com/cheng/weixin/service/user/dao/BehaviorDaoMapper.java",
    "content": "package com.cheng.weixin.service.user.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.user.entity.Behavior;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 用户基础信息\n * Author: cheng\n * Date: 2016/7/7\n */\n@Repository\npublic interface BehaviorDaoMapper extends BaseDaoMapper<Behavior> {\n}\n"
  },
  {
    "path": "weixin-service-user/src/main/java/com/cheng/weixin/service/user/dao/BonusPointRecordDaoMapper.java",
    "content": "package com.cheng.weixin.service.user.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.user.entity.BonusPointRecord;\nimport org.springframework.stereotype.Repository;\n\nimport java.util.List;\n\n/**\n * Desc: 积分记录  记录积分的收支情况\n * Author: cheng\n * Date: 2016/7/7\n */\n@Repository\npublic interface BonusPointRecordDaoMapper extends BaseDaoMapper<BonusPointRecord> {\n\n    /**\n     * 根据用户名获取最新一条积分\n     * @param bonusPointRecord\n     * @return\n     */\n    BonusPointRecord loadNewByUSerId(BonusPointRecord bonusPointRecord);\n    /**\n     * 根据用户名获取当前月积分\n     * @param bonusPointRecord\n     * @return\n     */\n    List<BonusPointRecord> loadByUSerIdAndCurrentMonth(BonusPointRecord bonusPointRecord);\n\n}\n"
  },
  {
    "path": "weixin-service-user/src/main/java/com/cheng/weixin/service/user/dao/CashRecordDaoMapper.java",
    "content": "package com.cheng.weixin.service.user.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.user.entity.CashRecord;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 用户基础信息\n * Author: cheng\n * Date: 2016/7/7\n */\n@Repository\npublic interface CashRecordDaoMapper extends BaseDaoMapper<CashRecord> {\n    /**\n     * 获取最新的一条现金记录\n     * @return\n     */\n    CashRecord loadNewByUser(CashRecord cashRecord);\n\n}\n"
  },
  {
    "path": "weixin-service-user/src/main/java/com/cheng/weixin/service/user/dao/CityDaoMapper.java",
    "content": "package com.cheng.weixin.service.user.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.user.entity.City;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 城市\n * Author: cheng\n * Date: 2016/7/7\n */\n@Repository\npublic interface CityDaoMapper extends BaseDaoMapper<City> {\n}\n"
  },
  {
    "path": "weixin-service-user/src/main/java/com/cheng/weixin/service/user/dao/CountryDaoMapper.java",
    "content": "package com.cheng.weixin.service.user.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.user.entity.Country;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 区县\n * Author: cheng\n * Date: 2016/7/7\n */\n@Repository\npublic interface CountryDaoMapper extends BaseDaoMapper<Country> {\n}\n"
  },
  {
    "path": "weixin-service-user/src/main/java/com/cheng/weixin/service/user/dao/CouponRecordDaoMapper.java",
    "content": "package com.cheng.weixin.service.user.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.user.entity.CouponRecord;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 记录券的收支情况\n * Author: cheng\n * Date: 2016/7/7\n */\n@Repository\npublic interface CouponRecordDaoMapper extends BaseDaoMapper<CouponRecord> {\n    /**\n     * 根据用户获取券记录\n     * @param couponRecord\n     * @return\n     */\n    CouponRecord loadByUser(CouponRecord couponRecord);\n\n}\n"
  },
  {
    "path": "weixin-service-user/src/main/java/com/cheng/weixin/service/user/dao/DeliveryAddressDaoMapper.java",
    "content": "package com.cheng.weixin.service.user.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.user.entity.DeliveryAddress;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 配送地址\n * Author: cheng\n * Date: 2016/7/7\n */\n@Repository\npublic interface DeliveryAddressDaoMapper extends BaseDaoMapper<DeliveryAddress> {\n    /**\n     * 获取默认的配送地址\n     * @return\n     */\n    //DeliveryAddress loadDefaultAddress( DeliveryAddress address);\n}\n"
  },
  {
    "path": "weixin-service-user/src/main/java/com/cheng/weixin/service/user/dao/MemberDaoMapper.java",
    "content": "package com.cheng.weixin.service.user.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.user.entity.Member;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 用户基础信息\n * Author: cheng\n * Date: 2016/7/7\n */\n@Repository\npublic interface MemberDaoMapper extends BaseDaoMapper<Member> {\n}\n"
  },
  {
    "path": "weixin-service-user/src/main/java/com/cheng/weixin/service/user/dao/ProductFocusDaoMapper.java",
    "content": "package com.cheng.weixin.service.user.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.user.entity.ProductFocus;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 关注商品\n * Author: cheng\n * Date: 2016/7/7\n */\n@Repository\npublic interface ProductFocusDaoMapper extends BaseDaoMapper<ProductFocus> {\n}\n"
  },
  {
    "path": "weixin-service-user/src/main/java/com/cheng/weixin/service/user/dao/ProvinceDaoMapper.java",
    "content": "package com.cheng.weixin.service.user.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.user.entity.Province;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 省份\n * Author: cheng\n * Date: 2016/7/7\n */\n@Repository\npublic interface ProvinceDaoMapper extends BaseDaoMapper<Province> {\n}\n"
  },
  {
    "path": "weixin-service-user/src/main/java/com/cheng/weixin/service/user/service/UserService.java",
    "content": "package com.cheng.weixin.service.user.service;\n\nimport com.cheng.common.entity.enums.Status;\nimport com.cheng.weixin.rpc.user.entity.*;\nimport com.cheng.weixin.rpc.user.enumType.Credit;\nimport com.cheng.weixin.rpc.user.enumType.Sex;\nimport com.cheng.weixin.rpc.user.enumType.SourceFrom;\nimport com.cheng.weixin.rpc.user.service.RpcUserService;\nimport com.cheng.weixin.service.user.dao.*;\nimport org.joda.time.DateTime;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.math.BigDecimal;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * Desc: 用户\n * Author: cheng\n * Date: 2016/7/7\n */\n@Service(\"userService\")\npublic class UserService implements RpcUserService {\n\n    protected final Logger logger = LoggerFactory.getLogger(getClass());\n\n    @Autowired\n    private AccountDaoMapper accountDao;\n    @Autowired\n    private AccountLevelDaoMapper accountLevelDao;\n    @Autowired\n    private MemberDaoMapper memberDao;\n    @Autowired\n    private DeliveryAddressDaoMapper deliveryAddressDao;\n    @Autowired\n    private BehaviorDaoMapper behaviorDao;\n    @Autowired\n    private BonusPointRecordDaoMapper bonusPointRecordDao;\n    @Autowired\n    private CouponRecordDaoMapper couponRecordDao;\n    @Autowired\n    private CashRecordDaoMapper cashRecordDao;\n    @Autowired\n    private ProductFocusDaoMapper productFocusDao;\n\n    @Override\n    public Account getAccountByLoginName(String loginName) {\n        return accountDao.load(new Account(null, loginName));\n    }\n\n    @Override\n    public Account getAccountById(String id) {\n        return accountDao.load(new Account(id, null));\n    }\n\n    @Override\n    public void saveAccess(String phone, String password, String nickname, String ip) {\n\n        if (null != getAccountByLoginName(phone)) {\n            logger.info(\"当前用户{}已存在\", phone);\n            throw new IllegalArgumentException(\"当前用户\"+phone+\"已存在\");\n        }\n\n        AccountLevel level = new AccountLevel();\n        level.setLevel(1);\n        level.setEnable(true);\n\n        AccountLevel accountLevel = accountLevelDao.load(level);\n        Account account = new Account();\n        account.setUsername(phone);\n        account.setPassword(password);\n        account.setNickname(nickname);\n        account.setAccountLevelId(accountLevel.getId());\n        account.setBalance(new BigDecimal(0));\n        account.setBonusPointUpgrade(accountLevel.getNextLevelNeedPoint());\n        account.setBonusPointUsable(0);\n        account.setCredit(Credit.WELL);\n        account.setEmployee(false);\n        account.setIp(ip);\n        account.setSourceFrom(SourceFrom.NO);\n        account.preInsert();\n        accountDao.save(account);\n\n        Member member = new Member();\n        member.setAccountId(account.getId());\n        member.setMobile(phone);\n        member.setSex(Sex.UNKNOW);\n        member.preInsert();\n        memberDao.save(member);\n    }\n\n    @Override\n    public String validateLogin(String loginName, String password, String loginIp) {\n        Account userAccount = accountDao.load(new Account(null, loginName));\n        if (null != userAccount) {\n            if (!password.equals(userAccount.getPassword())) {\n                return \"PASSWDFAIL\";\n            }\n        }else {\n            return \"NOTUSER\";\n        }\n        // 登陆成功保存登陆者的IP\n        userAccount.setIp(loginIp);\n        userAccount.preUpdate();\n        accountDao.update(userAccount);\n        return \"SUCCESS\";\n    }\n\n    @Override\n    public DeliveryAddress getDefaultAddress(String userId) {\n        return deliveryAddressDao.load(new DeliveryAddress(userId, true));\n    }\n\n    @Override\n    public DeliveryAddress getDeliveryAddress(String id, String userId) {\n        DeliveryAddress address = new DeliveryAddress();\n        address.setId(id);\n        address.setAccountId(userId);\n        return deliveryAddressDao.load(address);\n    }\n\n    @Override\n    public List<DeliveryAddress> getAllDeliveryAddr(String userId) {\n        return deliveryAddressDao.loadAll(new DeliveryAddress(userId, null));\n    }\n\n    @Override\n    public Account getAccount(String userId) {\n        Account account = new Account();\n        account.setId(userId);\n        return accountDao.load(account);\n    }\n\n    @Override\n    public Account getAccountByUsername(String username) {\n        Account account = new Account();\n        account.setUsername(username);\n        return accountDao.load(account);\n    }\n\n    @Override\n    public void updateAccount(Account account) {\n        account.preUpdate();\n        accountDao.update(account);\n    }\n\n    @Override\n    public void addBehavior(Behavior behavior) {\n        behavior.preInsert();\n        behaviorDao.save(behavior);\n    }\n\n    @Override\n    public BonusPointRecord getBonusPointRecord(String userId) {\n        return bonusPointRecordDao.loadNewByUSerId(new BonusPointRecord(userId));\n    }\n\n    @Override\n    public List<BonusPointRecord> getByUSerIdAndCurrentMonth(String userId) {\n        Date currentMonth = DateTime.now().dayOfMonth().withMinimumValue().hourOfDay().withMinimumValue().millisOfDay().withMinimumValue().toDate();\n        BonusPointRecord bonusPointRecord = new BonusPointRecord();\n        bonusPointRecord.setAccountId(userId);\n        bonusPointRecord.setCreateDate(currentMonth);\n        return bonusPointRecordDao.loadByUSerIdAndCurrentMonth(bonusPointRecord);\n    }\n\n    @Override\n    public void addBonusPointRecord(BonusPointRecord bonusPointRecord) {\n        bonusPointRecord.preInsert();\n        bonusPointRecordDao.save(bonusPointRecord);\n    }\n\n    @Override\n    public CouponRecord getCouponRecordByUser(String userId) {\n        return couponRecordDao.loadByUser(new CouponRecord(userId));\n    }\n\n    @Override\n    public void addCouponRecord(CouponRecord couponRecor) {\n        couponRecor.preInsert();\n        couponRecordDao.save(couponRecor);\n    }\n\n    @Override\n    public CashRecord getNewCashRecord(String userId) {\n        return cashRecordDao.loadNewByUser(new CashRecord(userId));\n    }\n\n    @Override\n    public void addCashRecord(CashRecord cashRecord) {\n        cashRecord.preInsert();\n        cashRecordDao.save(cashRecord);\n    }\n\n    @Override\n    public void addProductFocus(String userId, String productId) {\n        ProductFocus focus = new ProductFocus(userId, productId);\n        focus.preInsert();\n        productFocusDao.save(focus);\n    }\n\n    @Override\n    public void deleteProductFocus(String userId, String productId) {\n        ProductFocus focus = new ProductFocus(userId, productId);\n        focus.setStatus(Status.DELETE);\n        focus.preUpdate();\n        productFocusDao.delete(focus);\n    }\n\n    @Override\n    public boolean isProductFocus(String userId, String productId) {\n        ProductFocus focus = productFocusDao.load(new ProductFocus(userId, productId));\n        return focus!=null;\n    }\n\n    @Override\n    public Member getMemberById(String userId) {\n        return memberDao.load(new Member(userId));\n    }\n\n    @Override\n    public Member getMemberByAccountId(String userId) {\n        Member member = new Member();\n        member.setAccountId(userId);\n        return memberDao.load(member);\n    }\n\n    @Override\n    public AccountLevel getAccountLevelById(String id) {\n        AccountLevel level = new AccountLevel();\n        level.setId(id);\n        return accountLevelDao.load(level);\n    }\n\n    @Override\n    public AccountLevel getAccountLevelByLevel(int level) {\n        AccountLevel accountLevel = new AccountLevel();\n        accountLevel.setLevel(level);\n        accountLevel.setEnable(true);\n        return accountLevelDao.load(accountLevel);\n    }\n}\n"
  },
  {
    "path": "weixin-service-user/src/main/resources/log4j.properties",
    "content": "#log4j.rootLogger=DEBUG,CONSOLE\nlog4j.rootLogger=DEBUG,FILE\nlog4j.appender.Threshold=ERROR\n\n#log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender\n#log4j.appender.CONSOLE.Encoding=UTF-8\n#log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout\n#log4j.appender.CONSOLE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [service-user] %p [%t] %c-<%L> %m%n\n\nlog4j.appender.FILE=org.apache.log4j.RollingFileAppender\nlog4j.appender.FILE.Encoding=UTF-8\nlog4j.appender.FILE.File=logs/service-user.log\nlog4j.appender.FILE.MaxFileSize=4000KB\nlog4j.appender.FILE.MaxBackupIndex=10\nlog4j.appender.FILE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [service-user] %p [%t] %c-<%L> %m%n\n\nlog4j.logger.org.apache.zookeeper.ClientCnxn=INFO"
  },
  {
    "path": "weixin-service-user/src/main/resources/mybatis/mapper/AccountLevelMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.user.dao.AccountLevelDaoMapper\">\n  <sql id=\"tableName\">account_level</sql>\n  <sql id=\"columns\">\n    a.id,a.name,a.level,a.need_ronus_point,a.next_level_need_point,a.reduct_percent,a.consume_scale,a.free_frequency,a.is_enable,\n    a.remarks,a.create_date,a.update_date,a.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,account_id,name,need_ronus_point,next_level_need_point,reduct_percent,consume_scale,free_frequency,is_enable,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"accountLevelIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"level != null and level != ''\">level=#{level},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"needRonusPoint != null and needRonusPoint != ''\">need_ronus_point=#{needRonusPoint},</if>\n    <if test=\"nextLevelNeedPoint != null and nextLevelNeedPoint != ''\">next_level_need_point=#{nextLevelNeedPoint},</if>\n    <if test=\"reductPercent != null and reductPercent != ''\">reduct_percent=#{reductPercent},</if>\n    <if test=\"consumeScale != null and consumeScale != ''\">consume_scale=#{consumeScale},</if>\n    <if test=\"freeFrequency != null and freeFrequency != ''\">free_frequency=#{freeFrequency},</if>\n    <if test=\"isEnable != null\">is_enable=#{isEnable},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"accountLevelSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS a\n  </sql>\n\n  <sql id=\"accountLevelWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <if test=\"level != null and level != ''\">\n        AND level = #{level}\n      </if>\n      <if test=\"isEnable != null\">\n        AND is_enable = #{isEnable}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"accountLevelUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"accountLevelIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"AccountLevel\" resultType=\"AccountLevel\">\n    <include refid=\"accountLevelSelector\"/>\n    <include refid=\"accountLevelWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"AccountLevel\">\n    <include refid=\"accountLevelSelector\"/>\n    <include refid=\"accountLevelWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"AccountLevel\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"accountLevelUpdate\"/>\n    <include refid=\"accountLevelWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"AccountLevel\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{level},#{name},#{needRonusPoint},#{nextLevelNeedPoint},#{reductPercent},#{consumeScale},#{freeFrequency},#{isEnable},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-user/src/main/resources/mybatis/mapper/AccountMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.user.dao.AccountDaoMapper\">\n  <sql id=\"tableName\">account</sql>\n  <sql id=\"columns\">\n    a.id,a.avatar,a.nickname,a.account_level_id,a.credit,a.username,a.password,a.bonus_point_usable,\n    a.bonus_point_upgrade,a.balance,a.is_employee,a.ip,a.source_from,\n    a.remarks,a.create_date,a.update_date,a.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,avatar,nickname,account_level_id,credit,username,password,bonus_point_usable,\n    bonus_point_upgrade,balance,is_employee,ip,source_from,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"accountIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"avatar != null and avatar != ''\">avatar=#{avatar},</if>\n    <if test=\"nickname != null and nickname != ''\">nickname=#{nickname},</if>\n    <if test=\"accountLevelId != null and accountLevelId != ''\">account_level_id=#{accountLevelId},</if>\n    <if test=\"credit != null and credit != ''\">credit=#{credit},</if>\n    <if test=\"username != null and username != ''\">username=#{username},</if>\n    <if test=\"password != null and password != ''\">password=#{password},</if>\n    <if test=\"bonusPointUsable != null and bonusPointUsable != ''\">bonus_point_usable=#{bonusPointUsable},</if>\n    <if test=\"bonusPointUpgrade != null and bonusPointUpgrade != ''\">bonus_point_upgrade=#{bonusPointUpgrade},</if>\n    <if test=\"balance != null and balance != ''\">balance=#{balance},</if>\n    <if test=\"isEmployee != null and isEmployee != ''\">is_employee=#{isEmployee},</if>\n    <if test=\"ip != null and ip != ''\">ip=#{ip},</if>\n    <if test=\"sourceFrom != null and sourceFrom != ''\">source_from=#{sourceFrom},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"accountSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS a\n  </sql>\n\n  <sql id=\"accountWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <if test=\"username != null and username != ''\">\n        AND username = #{username}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"accountUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"accountIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"Account\" resultType=\"Account\">\n    <include refid=\"accountSelector\"/>\n    <include refid=\"accountWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"Account\">\n    <include refid=\"accountSelector\"/>\n    <include refid=\"accountWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"Account\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"accountUpdate\"/>\n    <include refid=\"accountWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"Account\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{avatar},#{nickname},#{accountLevelId},#{credit},#{username},#{password},#{bonusPointUsable},\n    #{bonusPointUpgrade},#{balance},#{isEmployee},#{ip},#{sourceFrom},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-user/src/main/resources/mybatis/mapper/AccountUpgradeHistoryMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.user.dao.AccountUpgradeHistoryDaoMapper\">\n  <sql id=\"tableName\">account_upgrade_history</sql>\n  <sql id=\"columns\">\n    a.id,a.account_id,a.previous_levels,a.current_levels,a.previous_bonus_point,a.current_bonus_point,\n    a.remarks,a.create_date,a.update_date,a.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,account_id,previous_levels,current_levels,previous_bonus_point,current_bonus_point,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"accountUpgradeHistoryIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"accountId != null and accountId != ''\">account_id=#{accountId},</if>\n    <if test=\"previousLevels != null and previousLevels != ''\">previous_levels=#{previousLevels},</if>\n    <if test=\"currentLevels != null and currentLevels != ''\">current_levels=#{currentLevels},</if>\n    <if test=\"previousBonusPoint != null and previousBonusPoint != ''\">previous_bonus_point=#{previousBonusPoint},</if>\n    <if test=\"currentBonusPoint != null and currentBonusPoint != ''\">current_bonus_point=#{currentBonusPoint},</if>\n\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"accountUpgradeHistorySelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS a\n  </sql>\n\n  <sql id=\"accountUpgradeHistoryWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"accountUpgradeHistoryUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"accountUpgradeHistoryIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"AccountUpgradeHistory\" resultType=\"AccountUpgradeHistory\">\n    <include refid=\"accountUpgradeHistorySelector\"/>\n    <include refid=\"accountUpgradeHistoryWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"AccountUpgradeHistory\">\n    <include refid=\"accountUpgradeHistorySelector\"/>\n    <include refid=\"accountUpgradeHistoryWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"AccountUpgradeHistory\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"accountUpgradeHistoryUpdate\"/>\n    <include refid=\"accountUpgradeHistoryWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"AccountUpgradeHistory\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{accountId},#{previousLevels},#{currentLevels},#{previousBonusPoint},#{currentBonusPoint},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-user/src/main/resources/mybatis/mapper/BehaviorMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.user.dao.BehaviorDaoMapper\">\n  <sql id=\"tableName\">behavior</sql>\n  <sql id=\"columns\">\n    b.id,b.behavior_type,b.name,b.oid,\n    b.remarks,b.create_date,b.update_date,b.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,behavior_type,name,oid,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"behaviorIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"behaviorType != null and behaviorType != ''\">behavior_type=#{behaviorType},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"oid != null and oid != ''\">oid=#{oid},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"behaviorSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS b\n  </sql>\n\n  <sql id=\"behaviorWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"behaviorUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"behaviorIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"Behavior\" resultType=\"Behavior\">\n    <include refid=\"behaviorSelector\"/>\n    <include refid=\"behaviorWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"Behavior\">\n    <include refid=\"behaviorSelector\"/>\n    <include refid=\"behaviorWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"Behavior\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"behaviorUpdate\"/>\n    <include refid=\"behaviorWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"Behavior\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{behaviorType},#{name},#{oid},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-user/src/main/resources/mybatis/mapper/BonusPointRecorMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.user.dao.BonusPointRecordDaoMapper\">\n  <sql id=\"tableName\">bonus_point_record</sql>\n  <sql id=\"columns\">\n    b.id,b.account_id,b.before_bonus_points,b.tx_bonus_points,b.frozen_bonus_points,\n    b.after_bonus_points,b.tx_type,b.behavior_id,b.tx_result,\n    b.remarks,b.create_date,b.update_date,b.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,account_id,before_bonus_points,tx_bonus_points,frozen_bonus_points,\n    after_bonus_points,tx_type,behavior_id,tx_result,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"bonusPointRecordIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"accountId != null and accountId != ''\">account_id=#{accountId},</if>\n    <if test=\"beforeBonusPoints != null and beforeBonusPoints != ''\">before_bonus_points=#{beforeBonusPoints},</if>\n    <if test=\"txBonusPoints != null and txBonusPoints != ''\">tx_bonus_points=#{txBonusPoints},</if>\n    <if test=\"frozenBonusPoints != null and frozenBonusPoints != ''\">frozen_bonus_points=#{frozenBonusPoints},</if>\n    <if test=\"afterBonusPoints != null and afterBonusPoints != ''\">after_bonus_points=#{afterBonusPoints},</if>\n    <if test=\"txType != null and txType != ''\">tx_type=#{txType},</if>\n    <if test=\"behaviorId != null and behaviorId != ''\">behavior_id=#{behaviorId},</if>\n    <if test=\"txResult != null and txResult != ''\">tx_result=#{txResult},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"bonusPointRecordSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS b\n  </sql>\n\n  <sql id=\"bonusPointRecordWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <if test=\"accountId != null and accountId != ''\">\n        AND account_id = #{accountId}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"bonusPointRecordUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"bonusPointRecordIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"BonusPointRecord\" resultType=\"BonusPointRecord\">\n    <include refid=\"bonusPointRecordSelector\"/>\n    <include refid=\"bonusPointRecordWhere\"/>\n  </select>\n\n  <select id=\"loadNewByUSerId\" parameterType=\"BonusPointRecord\" resultType=\"BonusPointRecord\">\n    <include refid=\"bonusPointRecordSelector\"/>\n    <include refid=\"bonusPointRecordWhere\"/>\n    ORDER BY create_date DESC LIMIT 1\n  </select>\n\n  <select id=\"loadByUSerIdAndCurrentMonth\" parameterType=\"BonusPointRecord\" resultType=\"BonusPointRecord\">\n    <include refid=\"bonusPointRecordSelector\"/>\n    <include refid=\"bonusPointRecordWhere\"/>\n    <if test=\"createDate != null\">\n      AND create_date &gt; #{createDate}\n    </if>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"BonusPointRecord\">\n    <include refid=\"bonusPointRecordSelector\"/>\n    <include refid=\"bonusPointRecordWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"BonusPointRecord\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"bonusPointRecordUpdate\"/>\n    <include refid=\"bonusPointRecordWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"BonusPointRecord\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{accountId},#{beforeBonusPoints},#{txBonusPoints},#{frozenBonusPoints},\n    #{afterBonusPoints},#{txType},#{behaviorId},#{txResult},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-user/src/main/resources/mybatis/mapper/CashRecordMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.user.dao.CashRecordDaoMapper\">\n  <sql id=\"tableName\">cash_record</sql>\n  <sql id=\"columns\">\n    c.id,c.account_id,c.before_money,c.tx_money,c.frozen_money,\n    c.after_bonus_points,c.tx_type,c.behavior_id,c.tx_result,\n    c.remarks,c.create_date,c.update_date,c.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,account_id,before_money,tx_money,frozen_money,after_bonus_points,tx_type,behavior_id,tx_result,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"behaviorIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"accountId != null and accountId != ''\">account_id=#{accountId},</if>\n    <if test=\"beforeMoney != null and beforeMoney != ''\">before_money=#{beforeMoney},</if>\n    <if test=\"txMoney != null and txMoney != ''\">tx_money=#{txMoney},</if>\n    <if test=\"frozenMoney != null and frozenMoney != ''\">frozen_money=#{frozenMoney},</if>\n    <if test=\"afterBonusPoints != null and afterBonusPoints != ''\">after_bonus_points=#{afterBonusPoints},</if>\n    <if test=\"txType != null and txType != ''\">tx_type=#{txType},</if>\n    <if test=\"behaviorId != null and behaviorId != ''\">behavior_id=#{behaviorId},</if>\n    <if test=\"txResult != null and txResult != ''\">tx_result=#{txResult},</if>\n\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"cashRecordSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS c\n  </sql>\n\n  <sql id=\"cashRecordWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <if test=\"accountId != null and accountId != ''\">\n        AND account_id = #{accountId}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"cashRecordUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"behaviorIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"CashRecord\" resultType=\"CashRecord\">\n    <include refid=\"cashRecordSelector\"/>\n    <include refid=\"cashRecordWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"CashRecord\">\n    <include refid=\"cashRecordSelector\"/>\n    <include refid=\"cashRecordWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"CashRecord\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"cashRecordUpdate\"/>\n    <include refid=\"cashRecordWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"CashRecord\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{accountId},#{beforeMoney},#{txMoney},#{frozenMoney},#{afterBonusPoints},#{txType},#{behaviorId},#{txResult},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n  <select id=\"loadNewByUser\" parameterType=\"CashRecord\" resultType=\"CashRecord\">\n    <include refid=\"cashRecordSelector\"/>\n    <include refid=\"cashRecordWhere\"/>\n    ORDER BY create_date DESC LIMIT 1\n  </select>\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-user/src/main/resources/mybatis/mapper/CityMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.user.dao.CityDaoMapper\">\n  <sql id=\"tableName\">city</sql>\n  <sql id=\"columns\">\n    b.id,b.nanme\n    b.remarks,b.create_date,b.update_date,b.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,name,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"cityIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"citySelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS b\n  </sql>\n\n  <sql id=\"cityWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"cityUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"cityIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"City\" resultType=\"City\">\n    <include refid=\"citySelector\"/>\n    <include refid=\"cityWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"City\">\n    <include refid=\"citySelector\"/>\n    <include refid=\"cityWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"City\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"cityUpdate\"/>\n    <include refid=\"cityWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"City\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{name},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-user/src/main/resources/mybatis/mapper/CountryMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.user.dao.CountryDaoMapper\">\n  <sql id=\"tableName\">country</sql>\n  <sql id=\"columns\">\n    b.id,b.nanme\n    b.remarks,b.create_date,b.update_date,b.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,name,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"countryIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"countrySelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS b\n  </sql>\n\n  <sql id=\"countryWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"countryUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"countryIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"Country\" resultType=\"Country\">\n    <include refid=\"countrySelector\"/>\n    <include refid=\"countryWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"Country\">\n    <include refid=\"countrySelector\"/>\n    <include refid=\"countryWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"Country\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"countryUpdate\"/>\n    <include refid=\"countryWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"Country\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{name},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-user/src/main/resources/mybatis/mapper/CouponRecordMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.user.dao.CouponRecordDaoMapper\">\n  <sql id=\"tableName\">coupon_record</sql>\n  <sql id=\"columns\">\n    c.id,c.account_id,c.coupon_code_id,c.tx_type,c.behavior_id,c.tx_result,\n    c.remarks,c.create_date,c.update_date,c.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,account_id,coupon_code_id,tx_type,behavior_id,tx_result,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"couponRecordIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"accountId != null and accountId != ''\">account_id=#{accountId},</if>\n    <if test=\"couponCodeId != null and couponCodeId != ''\">coupon_code_id=#{couponCodeId},</if>\n    <if test=\"txType != null and txType != ''\">tx_type=#{txType},</if>\n    <if test=\"behaviorId != null and behaviorId != ''\">behavior_id=#{behaviorId},</if>\n    <if test=\"txResult != null and txResult != ''\">tx_result=#{txResult},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"couponRecordSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS c\n  </sql>\n\n  <sql id=\"couponRecordWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <if test=\"accountId != null and accountId != ''\">\n        account_id = #{accountId}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"couponRecordUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"couponRecordIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"CouponRecord\" resultType=\"CouponRecord\">\n    <include refid=\"couponRecordSelector\"/>\n    <include refid=\"couponRecordWhere\"/>\n  </select>\n  <select id=\"loadByUser\" parameterType=\"CouponRecord\" resultType=\"CouponRecord\">\n    <include refid=\"couponRecordSelector\"/>\n    <include refid=\"couponRecordWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"CouponRecord\">\n    <include refid=\"couponRecordSelector\"/>\n    <include refid=\"couponRecordWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"CouponRecord\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"couponRecordUpdate\"/>\n    <include refid=\"couponRecordWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"Member\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{accountId},#{couponCodeId},#{txType},#{behaviorId},#{txResult},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-user/src/main/resources/mybatis/mapper/DeliveryAddressMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.user.dao.DeliveryAddressDaoMapper\">\n  <sql id=\"tableName\">delivery_address</sql>\n  <sql id=\"columns\">\n    d.id,d.account_id,d.region_province_id,d.region_city_id,d.region_country_id,\n    d.consignee,d.address,d.mobile,d.sex,d.tag,d.telephone,d.email,d.post_code,d.is_default,\n    d.remarks,d.create_date,d.update_date,d.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,account_id,region_province_id,region_city_id,region_country_id,\n    consignee,address,mobile,telephone,email,sex,tag,post_code,is_default,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"deliveryAddressIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"accountId != null and accountId != ''\">account_id=#{accountId},</if>\n    <if test=\"regionProvinceId != null and regionProvinceId != ''\">region_province_id=#{regionProvinceId},</if>\n    <if test=\"regionCityId != null and regionCityId != ''\">region_city_id=#{regionCityId},</if>\n    <if test=\"regionCountryId != null and regionCountryId != ''\">region_country_id=#{regionCountryId},</if>\n    <if test=\"consignee != null and consignee != ''\">email=#{consignee},</if>\n    <if test=\"address != null and address != ''\">address=#{address},</if>\n    <if test=\"mobile != null and mobile != ''\">mobile=#{mobile},</if>\n    <if test=\"sex != null\">sex=#{sex},</if>\n    <if test=\"tag != null and tag != ''\">tag=#{tag},</if>\n    <if test=\"telephone != null and telephone != ''\">telephone=#{telephone},</if>\n    <if test=\"email != null and email != ''\">email=#{email},</if>\n    <if test=\"postCode != null and postCode != ''\">post_code=#{postCode},</if>\n    <if test=\"isDefault != null and isDefault != ''\">is_default=#{isDefault},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null\">status=#{status}</if>\n  </sql>\n  <sql id=\"deliveryAddressSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS d\n  </sql>\n\n  <sql id=\"deliveryAddressWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <if test=\"accountId != null and accountId != ''\">\n        AND account_id = #{accountId}\n      </if>\n      <if test=\"isDefault != null\">\n        AND is_default = #{isDefault}\n      </if>\n      <choose>\n        <when test=\"status != null\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"deliveryAddressUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"deliveryAddressIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"DeliveryAddress\" resultType=\"DeliveryAddress\">\n    <include refid=\"deliveryAddressSelector\"/>\n    <include refid=\"deliveryAddressWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" parameterType=\"DeliveryAddress\" resultType=\"DeliveryAddress\">\n    <include refid=\"deliveryAddressSelector\"/>\n    <include refid=\"deliveryAddressWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"DeliveryAddress\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"deliveryAddressUpdate\"/>\n    <include refid=\"deliveryAddressWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"DeliveryAddress\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{accountId},#{regionProvinceId},#{regionCityId},#{regionCountryId},\n    #{consignee},#{address},#{mobile},#{sex},#{tag},#{telephone},#{email},#{postCode},#{isDefault},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-user/src/main/resources/mybatis/mapper/MemberMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.user.dao.MemberDaoMapper\">\n  <sql id=\"tableName\">member</sql>\n  <sql id=\"columns\">\n    m.id,m.account_id,m.name,m.employer,m.mobile,m.address,m.email,m.idcard,m.sex,m.birthday,m.region_province_id,\n    m.region_city_id,m.region_country_id,m.telephone,m.post_code,m.income_month,m.job,m.hobby,\n    m.remarks,m.create_date,m.update_date,m.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,account_id,name,employer,mobile,address,email,idcard,sex,birthday,region_province_id,\n    region_city_id,region_country_id,telephone,post_code,income_month,job,hobby,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"memberIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"accountId != null and accountId != ''\">account_id=#{accountId},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n    <if test=\"employer != null and employer != ''\">employer=#{employer},</if>\n    <if test=\"mobile != null and mobile != ''\">mobile=#{mobile},</if>\n    <if test=\"address != null and address != ''\">address=#{address},</if>\n    <if test=\"email != null and email != ''\">email=#{email},</if>\n    <if test=\"idcard != null and idcard != ''\">idcard=#{idcard},</if>\n    <if test=\"sex != null and sex != ''\">sex=#{sex},</if>\n    <if test=\"birthday != null and birthday != ''\">birthday=#{birthday},</if>\n    <if test=\"regionProvinceId != null and regionProvinceId != ''\">region_city_id=#{regionProvinceId},</if>\n    <if test=\"regionCityId != null and regionCityId != ''\">region_city_id=#{regionCityId},</if>\n    <if test=\"regionCountryId != null and regionCountryId != ''\">region_country_id=#{regionCountryId},</if>\n    <if test=\"telephone != null and telephone != ''\">telephone=#{telephone},</if>\n    <if test=\"postCode != null and postCode != ''\">post_code=#{postCode},</if>\n    <if test=\"incomeMonth != null and incomeMonth != ''\">income_month=#{incomeMonth},</if>\n    <if test=\"job != null and job != ''\">job=#{job},</if>\n    <if test=\"hobby != null and hobby != ''\">hobby=#{hobby},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"memberSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS m\n  </sql>\n\n  <sql id=\"memberWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <if test=\"accountId != null and accountId != ''\">\n        AND account_id = #{accountId}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"memberUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"memberIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"Member\" resultType=\"Member\">\n    <include refid=\"memberSelector\"/>\n    <include refid=\"memberWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"Member\">\n    <include refid=\"memberSelector\"/>\n    <include refid=\"memberWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"Member\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"memberUpdate\"/>\n    <include refid=\"memberWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"Member\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{accountId},#{name},#{employer},#{mobile},#{address},#{email},#{idcard},#{sex},#{birthday},#{regionProvinceId},\n    #{regionCityId},#{regionCountryId},#{telephone},#{postCode},#{incomeMonth},#{job},#{hobby},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-user/src/main/resources/mybatis/mapper/ProductFocusMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.user.dao.ProductFocusDaoMapper\">\n  <sql id=\"tableName\">product_focus</sql>\n  <sql id=\"columns\">\n    p.id,p.account_id,p.product_id,\n    p.remarks,p.create_date,p.update_date,p.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,account_id,product_id,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"productFocusIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"accountId != null and accountId != ''\">account_id=#{accountId},</if>\n    <if test=\"productId != null and productId != ''\">product_id=#{productId},</if>\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"productFocusSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS p\n  </sql>\n\n  <sql id=\"productFocusWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <if test=\"id != null and id != ''\">\n        AND accountId = #{accountId}\n      </if>\n      <if test=\"id != null and id != ''\">\n        AND productId = #{productId}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"productFocusDelete\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <if test=\"id != null and id != ''\">\n        AND accountId = #{accountId}\n      </if>\n      <if test=\"id != null and id != ''\">\n        AND productId = #{productId}\n      </if>\n    </where>\n  </sql>\n\n  <sql id=\"productFocusUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"productFocusIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"ProductFocus\" resultType=\"ProductFocus\">\n    <include refid=\"productFocusSelector\"/>\n    <include refid=\"productFocusWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"ProductFocus\">\n    <include refid=\"productFocusSelector\"/>\n    <include refid=\"productFocusWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"ProductFocus\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"productFocusUpdate\"/>\n    <include refid=\"productFocusWhere\"/>\n  </update>\n\n  <!-- 删除 -->\n  <update id=\"delete\" parameterType=\"ProductFocus\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"productFocusUpdate\"/>\n    <include refid=\"productFocusDelete\"/>\n  </update>\n\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"ProductFocus\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{accountId},#{productId},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-user/src/main/resources/mybatis/mapper/ProvinceMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.user.dao.ProvinceDaoMapper\">\n  <sql id=\"tableName\">province</sql>\n  <sql id=\"columns\">\n    b.id,b.nanme\n    b.remarks,b.create_date,b.update_date,b.status\n  </sql>\n  <sql id=\"insertColumns\">\n    id,name,\n    remarks,create_date,update_date,status\n  </sql>\n  <sql id=\"provinceIf\">\n    <if test=\"id != null and id != ''\">id=#{id},</if>\n    <if test=\"name != null and name != ''\">name=#{name},</if>\n\n    <if test=\"remarks != null and remarks != ''\">remarks=#{remarks},</if>\n    <if test=\"createDate != null and createDate != ''\">create_date=#{createDate},</if>\n    <if test=\"updateDate != null and updateDate != ''\">update_date=#{updateDate},</if>\n    <if test=\"status != null and status != ''\">status=#{status}</if>\n  </sql>\n  <sql id=\"provinceSelector\">\n    select\n      <include refid=\"columns\"/>\n    from\n      <include refid=\"tableName\"/> AS b\n  </sql>\n\n  <sql id=\"provinceWhere\">\n    <where>\n      <if test=\"id != null and id != ''\">\n        id = #{id}\n      </if>\n      <choose>\n        <when test=\"status != null and status !=''\">\n          AND status = #{status}\n        </when>\n        <otherwise>\n          AND status != 'DELETE'\n        </otherwise>\n      </choose>\n    </where>\n  </sql>\n\n  <sql id=\"provinceUpdate\">\n    <trim prefix=\"SET\" suffixOverrides=\",\">\n      <include refid=\"provinceIf\"/>\n    </trim>\n  </sql>\n\n<!-- =================================================================== -->\n\n  <select id=\"load\" parameterType=\"Province\" resultType=\"Province\">\n    <include refid=\"provinceSelector\"/>\n    <include refid=\"provinceWhere\"/>\n  </select>\n\n  <!-- 获取全部 -->\n  <select id=\"loadAll\" resultType=\"Province\">\n    <include refid=\"provinceSelector\"/>\n    <include refid=\"provinceWhere\"/>\n  </select>\n\n  <!-- 更新 -->\n  <update id=\"update\" parameterType=\"Province\">\n    UPDATE <include refid=\"tableName\"/>\n    <include refid=\"provinceUpdate\"/>\n    <include refid=\"provinceWhere\"/>\n  </update>\n  <!-- 插入 -->\n  <insert id=\"save\" parameterType=\"Province\">\n    INSERT INTO\n    <include refid=\"tableName\"/>\n    (\n    <include refid=\"insertColumns\"/>\n    )\n    VALUES\n    (\n    #{id},#{name},\n    #{remarks},#{createDate},#{updateDate},#{status}\n    )\n  </insert>\n\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-user/src/main/resources/mybatis/mybatis-config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE configuration\n        PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-config.dtd\">\n\n<configuration>\n  <settings>\n    <!-- 开启字段名和属性名驼峰匹配 -->\n    <setting name=\"mapUnderscoreToCamelCase\" value=\"true\"/>\n    <!-- 全局启用或禁用延迟加载。当禁用时，所有关联对象都会即时加载。 -->\n    <setting name=\"lazyLoadingEnabled\" value=\"true\"/>\n    <!-- 当启用时，有延迟加载属性的对象在被调用时将会完全加载任意属性。否则，每种属性将会按需要加载。 -->\n    <setting name=\"aggressiveLazyLoading\" value=\"true\"/>\n  </settings>\n  <plugins>\n    <plugin interceptor=\"com.github.pagehelper.PageHelper\">\n\n      <property name=\"dialect\" value=\"mysql\"/>\n\n    </plugin>\n  </plugins>\n</configuration>"
  },
  {
    "path": "weixin-service-user/src/main/resources/spring/spring-context.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/context\n    http://www.springframework.org/schema/context/spring-context-3.2.xsd\">\n\n\t<!-- 引入配置文件 -->\n\t<context:property-placeholder location=\"classpath:system.properties,classpath:jdbc.properties\" />\n\n\t<!-- 打开Spring的Annotation支持 -->\n\t<context:annotation-config />\n\n\t<!-- 扫描注入  -->\n\t<context:component-scan base-package=\"com.cheng.weixin.service.user\" />\n\n\t<import resource=\"classpath:spring/spring-dubbo-provider.xml\"/>\n\t<import resource=\"classpath:spring/spring-mybatis.xml\"/>\n\n</beans>"
  },
  {
    "path": "weixin-service-user/src/main/resources/spring/spring-dubbo-provider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd\n          http://code.alibabatech.com/schema/dubbo\n          http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n  <dubbo:application name=\"weixin-service-user\"/>\n\n  <dubbo:registry id=\"zk1\" address=\"${weixin.dubbo.reistry.address}\" protocol=\"${weixin.dubbo.reistry.protocol}\"/> <!-- 注意要关闭防火墙 -->\n\n  <dubbo:protocol id=\"mydubbo\" name=\"dubbo\" host=\"${weixin.dubbo.host.address}\" port=\"${weixin.dubbo.user.service.port}\"/>\n\n  <dubbo:provider registry=\"zk1\" protocol=\"mydubbo\"/>\n\n  <dubbo:service interface=\"com.cheng.weixin.rpc.user.service.RpcUserService\" ref=\"userService\" version=\"1.0\"/>\n\n</beans>\n"
  },
  {
    "path": "weixin-service-user/src/main/resources/spring/spring-mybatis.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:p=\"http://www.springframework.org/schema/p\"\n\txmlns:aop=\"http://www.springframework.org/schema/aop\"\n\txmlns:tx=\"http://www.springframework.org/schema/tx\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/tx\n    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd\n    http://www.springframework.org/schema/aop\n    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd\">\n\n\t<bean id=\"dataSource\" class=\"com.alibaba.druid.pool.DruidDataSource\" init-method=\"init\" destroy-method=\"close\">\n\t  <property name=\"driverClassName\" value=\"${jdbc.driverClassName}\"/>\n\t  <property name=\"url\" value=\"${jdbc.url}\"/>\n\t  <property name=\"username\" value=\"${jdbc.username}\"/>\n\t  <property name=\"password\" value=\"${jdbc.password}\"/>\n\t  <!-- 连接池最大使用连接数 -->\n\t  <property name=\"maxActive\" value=\"${jdbc.maxActive}\"/>\n\t  <!-- 初始化连接大小 -->\n\t  <property name=\"initialSize\" value=\"${jdbc.initialSize}\"/>\n\t  <!-- 获取连接最大等待时间 -->\n\t  <property name=\"maxWait\" value=\"${jdbc.maxWait}\"/>\n\t  <!-- 连接池最大空闲 -->\n\t  <!--  property name=\"maxIdle\" value=\"${jdbc.maxIdle}\"/>-->\n\t  <!-- 连接池最小空闲 -->\n\t  <property name=\"minIdle\" value=\"${jdbc.minIdle}\"/>\n\t  <!-- 自动清除无用连接 -->\n\t  <property name=\"removeAbandoned\" value=\"${jdbc.removeAbandoned}\"/>\n\t  <!-- 清除无用连接的等待时间 -->\n\t  <property name=\"removeAbandonedTimeout\" value=\"${jdbc.removeAbandonedTimeout}\"/>\n\t  <!-- 连接属性 -->\n\t  <property name=\"connectionProperties\" value=\"${jdbc.connectionProperties}\"/>\n\t</bean>\n\n  <!-- 注入SQLSession -->\n  <bean id=\"sqlSession\" class=\"org.mybatis.spring.SqlSessionTemplate\" scope=\"prototype\">\n    <constructor-arg index=\"0\" ref=\"sqlSessionFactory\"/>\n  </bean>\n\n\t<!-- mybatis配置 -->\n\t<bean id=\"sqlSessionFactory\" class=\"org.mybatis.spring.SqlSessionFactoryBean\"\n\t\tp:dataSource-ref=\"dataSource\"\n    p:configLocation=\"classpath:/mybatis/mybatis-config.xml\"\n\t\tp:typeAliasesPackage=\"com.cheng.weixin.rpc.user.entity\"\n\t\tp:mapperLocations=\"classpath:/mybatis/mapper/*.xml\" />\n\n\t<!-- spring与mybatis整合配置，扫描所有dao -->\n\t<bean class=\"org.mybatis.spring.mapper.MapperScannerConfigurer\"\n\t\tp:basePackage=\"com.cheng.weixin.service.user.dao\"\n\t\tp:sqlSessionFactoryBeanName=\"sqlSessionFactory\" />\n\n\t<!-- 对数据源进行事务管理 -->\n\t<bean id=\"transactionManager\" class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\"\n\t\tp:dataSource-ref=\"dataSource\" />\n\t<!-- 通知 -->\n\t<tx:advice id=\"txAdvice\" transaction-manager=\"transactionManager\">\n\t  <!-- 传播行为 -->\n\t  <tx:attributes>\n\t  \t<tx:method name=\"add*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"update*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"delete*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"get*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  \t<tx:method name=\"find*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  </tx:attributes>\n\t</tx:advice>\t\n\t<!-- 哪些类的哪些方法使用事务 -->\n\t<aop:config>\n\t  <aop:advisor advice-ref=\"txAdvice\" pointcut=\"execution(* com.cheng.weixin.service.user.service.*.*(..))\"/>\n\t</aop:config>\n\t\t\n\t<!-- 开启事务注解驱动 \n    <tx:annotation-driven />\n    -->\n</beans>"
  },
  {
    "path": "weixin-service-user/src/test/java/com/cheng/test/TestAll.java",
    "content": "package com.cheng.test;\n\nimport org.joda.time.DateTime;\n\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\n\n/**\n * Desc:\n * Author: 光灿\n * Date: 2016/11/19\n */\npublic class TestAll {\n\n\n    public static void main(String[] args) {\n        DateTime now = new DateTime();\n\n        now.dayOfMonth().withMaximumValue().toDate();\n        //Date currentMonth = DateTime.now().minusMonths(1).dayOfMonth().withMaximumValue().hourOfDay().withMaximumValue()..toDate();\n        Date currentMonth = DateTime.now().dayOfMonth().withMinimumValue().hourOfDay().withMinimumValue().millisOfDay().withMinimumValue().toDate();\n        SimpleDateFormat format = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\");\n        System.out.println(format.format(currentMonth));\n\n\n        System.out.println(now.dayOfMonth().withMaximumValue().toString(\"yyyyMMddEE\"));\n    }\n}\n"
  },
  {
    "path": "weixin-service-user/src/test/java/com/cheng/test/TestMain.java",
    "content": "package com.cheng.test;\n\nimport com.cheng.weixin.rpc.user.entity.DeliveryAddress;\nimport com.cheng.weixin.rpc.user.service.RpcUserService;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.test.context.ContextConfiguration;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\n\nimport java.util.List;\n\n/**\n * Desc:\n * Author: cheng\n * Date: 2016/7/11\n */\n@RunWith(SpringJUnit4ClassRunner.class)\n@ContextConfiguration(locations = {\"classpath*:spring-context.xml\"})\npublic class TestMain {\n    @Autowired\n    private RpcUserService userService;\n\n    @Test\n    public void saveAccess() {\n        userService.saveAccess(\"18600536683\",\"123456\",\"Cheng\",\"127.0.0.1\");\n    }\n\n    @Test\n    public void getDefaultAddress() {\n        DeliveryAddress address = userService.getDefaultAddress(\"1\");\n        System.out.println(address);\n    }\n\n    @Test\n    public void getAllDeliveryAddr() {\n        List<DeliveryAddress> addresses = userService.getAllDeliveryAddr(\"1\");\n        for (DeliveryAddress address : addresses) {\n            System.out.println(\"===> \"+address.getSex().getName());\n        }\n    }\n\n}\n"
  },
  {
    "path": "weixin-service-user/src/test/resources/log4j.properties",
    "content": "log4j.rootLogger=DEBUG,CONSOLE\nlog4j.appender.Threshold=ERROR\n\nlog4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender\nlog4j.appender.CONSOLE.Encoding=UTF-8\nlog4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.CONSOLE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [service-cart] %p [%t] %c-<%L> %m%n\n"
  },
  {
    "path": "weixin-service-user/src/test/resources/spring-context.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/context\n    http://www.springframework.org/schema/context/spring-context-3.2.xsd\">\n\n\t<!-- 引入配置文件 -->\n\t<context:property-placeholder location=\"jdbc.properties\" />\n\n\t<!-- 打开Spring的Annotation支持 -->\n\t<context:annotation-config />\n\n\t<!-- 扫描注入  -->\n\t<context:component-scan base-package=\"com.cheng.weixin.service.user\" />\n\n\t<import resource=\"classpath:spring-mybatis.xml\"/>\n\n</beans>"
  },
  {
    "path": "weixin-service-user/src/test/resources/spring-mybatis.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:p=\"http://www.springframework.org/schema/p\"\n\txmlns:aop=\"http://www.springframework.org/schema/aop\"\n\txmlns:tx=\"http://www.springframework.org/schema/tx\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/tx\n    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd\n    http://www.springframework.org/schema/aop\n    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd\">\n\n\t<bean id=\"dataSource\" class=\"com.alibaba.druid.pool.DruidDataSource\" init-method=\"init\" destroy-method=\"close\">\n\t  <property name=\"driverClassName\" value=\"${jdbc.driverClassName}\"/>\n\t  <property name=\"url\" value=\"${jdbc.url}\"/>\n\t  <property name=\"username\" value=\"${jdbc.username}\"/>\n\t  <property name=\"password\" value=\"${jdbc.password}\"/>\n\t  <!-- 连接池最大使用连接数 -->\n\t  <property name=\"maxActive\" value=\"${jdbc.maxActive}\"/>\n\t  <!-- 初始化连接大小 -->\n\t  <property name=\"initialSize\" value=\"${jdbc.initialSize}\"/>\n\t  <!-- 获取连接最大等待时间 -->\n\t  <property name=\"maxWait\" value=\"${jdbc.maxWait}\"/>\n\t  <!-- 连接池最大空闲 -->\n\t  <!--  property name=\"maxIdle\" value=\"${jdbc.maxIdle}\"/>-->\n\t  <!-- 连接池最小空闲 -->\n\t  <property name=\"minIdle\" value=\"${jdbc.minIdle}\"/>\n\t  <!-- 自动清除无用连接 -->\n\t  <property name=\"removeAbandoned\" value=\"${jdbc.removeAbandoned}\"/>\n\t  <!-- 清除无用连接的等待时间 -->\n\t  <property name=\"removeAbandonedTimeout\" value=\"${jdbc.removeAbandonedTimeout}\"/>\n\t  <!-- 连接属性 -->\n\t  <property name=\"connectionProperties\" value=\"${jdbc.connectionProperties}\"/>\n\t</bean>\n\n  <!-- 注入SQLSession -->\n  <bean id=\"sqlSession\" class=\"org.mybatis.spring.SqlSessionTemplate\" scope=\"prototype\">\n    <constructor-arg index=\"0\" ref=\"sqlSessionFactory\"/>\n  </bean>\n\n\t<!-- mybatis配置 -->\n\t<bean id=\"sqlSessionFactory\" class=\"org.mybatis.spring.SqlSessionFactoryBean\"\n\t\tp:dataSource-ref=\"dataSource\"\n    p:configLocation=\"classpath:/mybatis/mybatis-config.xml\"\n\t\tp:typeAliasesPackage=\"com.cheng.weixin.rpc.user.entity\"\n\t\tp:mapperLocations=\"classpath:/mybatis/mapper/*.xml\" />\n\n\t<!-- spring与mybatis整合配置，扫描所有dao -->\n\t<bean class=\"org.mybatis.spring.mapper.MapperScannerConfigurer\"\n\t\tp:basePackage=\"com.cheng.weixin.service.user.dao\"\n\t\tp:sqlSessionFactoryBeanName=\"sqlSessionFactory\" />\n\n\t<!-- 对数据源进行事务管理 -->\n\t<bean id=\"transactionManager\" class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\"\n\t\tp:dataSource-ref=\"dataSource\" />\n\t<!-- 通知 -->\n\t<tx:advice id=\"txAdvice\" transaction-manager=\"transactionManager\">\n\t  <!-- 传播行为 -->\n\t  <tx:attributes>\n\t  \t<tx:method name=\"add*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"update*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"delete*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"get*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  \t<tx:method name=\"find*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  </tx:attributes>\n\t</tx:advice>\t\n\t<!-- 哪些类的哪些方法使用事务 -->\n\t<aop:config>\n\t  <aop:advisor advice-ref=\"txAdvice\" pointcut=\"execution(* com.cheng.weixin.service.user.service.*.*(..))\"/>\n\t</aop:config>\n\t\t\n\t<!-- 开启事务注解驱动 \n    <tx:annotation-driven />\n    -->\n</beans>"
  },
  {
    "path": "weixin-service-wxtools/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n\n  <artifactId>weixin-service-wxtools</artifactId>\n\n  <dependencies>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-service</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-config</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-rpc-wxtools</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-rpc-httpclient</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>junit</groupId>\n      <artifactId>junit</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>javax.servlet</groupId>\n      <artifactId>javax.servlet-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>log4j</groupId>\n      <artifactId>log4j</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-log4j12</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>dom4j</groupId>\n      <artifactId>dom4j</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.apache.httpcomponents</groupId>\n      <artifactId>httpclient</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.apache.httpcomponents</groupId>\n      <artifactId>httpmime</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.quartz-scheduler</groupId>\n      <artifactId>quartz</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.thoughtworks.xstream</groupId>\n      <artifactId>xstream</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>fastjson</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.fasterxml.jackson.core</groupId>\n      <artifactId>jackson-core</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.fasterxml.jackson.core</groupId>\n      <artifactId>jackson-databind</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.fasterxml.jackson.core</groupId>\n      <artifactId>jackson-annotations</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>mysql</groupId>\n      <artifactId>mysql-connector-java</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>druid</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjrt</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjweaver</artifactId>\n    </dependency>\n    <!-- Spring begin -->\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-context-support</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-core</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-beans</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-aop</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-orm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-web</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-jdbc</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-oxm</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-test</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-tx</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-expression</artifactId>\n    </dependency>\n    <!-- Spring end -->\n    <!-- MyBatis begin -->\n    <dependency>\n      <groupId>org.mybatis</groupId>\n      <artifactId>mybatis</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.mybatis</groupId>\n      <artifactId>mybatis-spring</artifactId>\n    </dependency>\n    <!-- MyBatis end -->\n  </dependencies>\n  <build>\n    <resources>\n      <resource>\n        <targetPath>${project.build.directory}/classes</targetPath>\n        <directory>src/main/resources</directory>\n        <filtering>true</filtering>\n        <includes>\n          <include>**/*.xml</include>\n          <include>**/*.properties</include>\n        </includes>\n        <excludes>\n          <exclude>rebel.xml</exclude>\n        </excludes>\n      </resource>\n      <resource>\n        <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>\n        <directory>src/main/resources/spring</directory>\n        <!--<directory>src/main/resources</directory>-->\n        <filtering>true</filtering>\n        <includes>\n          <include>spring-context.xml</include>\n        </includes>\n      </resource>\n    </resources>\n    <plugins>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-compiler-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-source-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-jar-plugin</artifactId>\n        <configuration>\n          <classesDirectory>target/classes/</classesDirectory>\n          <archive>\n            <!--生成的jar中，不要包含pom.xml和pom.properties这两个文件 -->\n            <addMavenDescriptor>false</addMavenDescriptor>\n            <manifest>\n              <mainClass>com.alibaba.dubbo.container.Main</mainClass>\n              <!-- 打包时MANIFEST.MF文件不记录时间版本 -->\n              <useUniqueVersions>false</useUniqueVersions>\n              <addClasspath>true</addClasspath>\n              <classpathPrefix>lib/</classpathPrefix>\n            </manifest>\n            <manifestEntries>\n              <Class-Path>.</Class-Path>\n            </manifestEntries>\n          </archive>\n        </configuration>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-dependency-plugin</artifactId>\n        <executions>\n          <execution>\n            <id>copy-dependencies</id>\n            <phase>package</phase>\n            <goals>\n              <goal>copy-dependencies</goal>\n            </goals>\n            <configuration>\n              <type>jar</type>\n              <includeTypes>jar</includeTypes>\n              <!--<useUniqueVersions>false</useUniqueVersions>-->\n              <outputDirectory>\n                ${project.build.directory}/lib\n              </outputDirectory>\n            </configuration>\n          </execution>\n        </executions>\n      </plugin>\n      <plugin>\n        <groupId>org.zeroturnaround</groupId>\n        <artifactId>jrebel-maven-plugin</artifactId>\n      </plugin>\n    </plugins>\n  </build>\n</project>"
  },
  {
    "path": "weixin-service-wxtools/src/main/java/com/cheng/weixin/service/wxtools/dao/WxGroupDaoMapper.java",
    "content": "package com.cheng.weixin.service.wxtools.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.wxtools.entity.WxGroup;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 群组Dao\n * Author: Cheng\n * Date: 2016/1/29 0029\n */\n@Repository\npublic interface WxGroupDaoMapper extends BaseDaoMapper<WxGroup> {\n}\n"
  },
  {
    "path": "weixin-service-wxtools/src/main/java/com/cheng/weixin/service/wxtools/dao/WxMenuDaoMapper.java",
    "content": "package com.cheng.weixin.service.wxtools.dao;\n\nimport com.cheng.weixin.common.core.dao.BaseDaoMapper;\nimport com.cheng.weixin.rpc.wxtools.entity.WxMenu;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Desc: 菜单Dao\n * Author: Cheng\n * Date: 2016/1/29 0029\n */\n@Repository\npublic interface WxMenuDaoMapper extends BaseDaoMapper<WxMenu> {\n}\n"
  },
  {
    "path": "weixin-service-wxtools/src/main/java/com/cheng/weixin/service/wxtools/httputils/HttpClientService.java",
    "content": "package com.cheng.weixin.service.wxtools.httputils;\n\nimport org.springframework.stereotype.Component;\n\n/**\n * Desc: HttpClien 请求封装\n * Author: Cheng\n * Date: 2016/4/13 0013\n */\n@Component\npublic class HttpClientService {\n\n//    @Autowired\n//    private CloseableHttpClient httpClient;\n//    @Autowired\n//    private RequestConfig requestConfig;\n//\n//    /**\n//     * GET请求\n//     * @param url\n//     * @return\n//     */\n//    public String doGet(String url) {\n//        CloseableHttpResponse response = null;\n//        HttpGet httpGet = new HttpGet(url);\n//        httpGet.setConfig(requestConfig);\n//        try {\n//            response = httpClient.execute(httpGet);\n//            int statusCode = response.getStatusLine().getStatusCode();\n//            if(statusCode>= HttpStatus.SC_OK&&statusCode<HttpStatus.SC_MULTIPLE_CHOICES) {\n//                return getResponseContent(response, httpGet);\n//            }\n//            return null;\n//        } catch (ParseException | IOException e) {\n//            e.printStackTrace();\n//        }finally {\n//            closeResponse(response);\n//        }\n//        return null;\n//    }\n//\n//    /**\n//\t * POST 请求\n//\t * @param url 传入的微信地址\n//\t * @param data 需要发送的JSON参数\n//\t * @return 微信回复的消息\n//\t */\n//\tpublic String doPost(String url, String data) {\n//        CloseableHttpResponse response = null;\n//        HttpPost httpPost = new HttpPost(url);\n//        httpPost.setConfig(requestConfig);\n//        try {\n//            httpPost.setHeader(\"Content-Type\", \"application/json\");\n//            StringEntity params = new StringEntity(data,\"UTF-8\");\n//            httpPost.setEntity(params);\n//            response = httpClient.execute(httpPost);\n//            int statusCode = response.getStatusLine().getStatusCode();\n//            if(statusCode>= HttpStatus.SC_OK&&statusCode<HttpStatus.SC_MULTIPLE_CHOICES) {\n//                return getResponseContent(response, httpPost);\n//            }\n//            return null;\n//        } catch (UnsupportedCharsetException| IOException e) {\n//            e.printStackTrace();\n//        }finally {\n//            closeResponse(response);\n//        }\n//        return null;\n//    }\n//\t/**\n//\t * 发送媒体消息\n//\t * @param url 传入的微信地址\n//\t * @param path 需要传入的媒体文件\n//\t * @return 返回的结果\n//\t */\n//\tpublic String postMedia(String url, String path) {\n//\t\tCloseableHttpResponse response = null;\n//        HttpPost httpPost = new HttpPost(url);\n//        httpPost.setConfig(requestConfig);\n//\t\ttry {\n//\t\t\tFileBody fb = new FileBody(new File(path));\n//\t\t\tHttpEntity entity = MultipartEntityBuilder.create().addPart(\"media\", fb).build();\n//            httpPost.setEntity(entity);\n//\t\t\tresponse = httpClient.execute(httpPost);\n//\t\t\tint statusCode = response.getStatusLine().getStatusCode();\n//            if(statusCode>= HttpStatus.SC_OK&&statusCode<HttpStatus.SC_MULTIPLE_CHOICES) {\n//                return getResponseContent(response, httpPost);\n//            }\n//            return null;\n//\t\t} catch (ParseException | IOException e) {\n//\t\t\te.printStackTrace();\n//\t\t}finally {\n//            closeResponse(response);\n//\t\t}\n//\t\treturn null;\n//\t}\n//\t/**\n//\t * 根据媒体ID下载媒体资源\n//\t * @param url\n//\t * @param path\n//\t */\n//\tpublic void getMidie(String url, String path) {\n//\t\tCloseableHttpResponse response = null;\n//\t\tInputStream is = null;\n//\t\ttry {\n//\t\t\tHttpGet httpGet = new HttpGet(url);\n//\t\t\tresponse = httpClient.execute(httpGet);\n//\t\t\tint statusCode = response.getStatusLine().getStatusCode();\n//\t\t\tif(statusCode>=HttpStatus.SC_OK&&statusCode<HttpStatus.SC_MULTIPLE_CHOICES) {\n//\t\t\t\tHttpEntity entity = response.getEntity();\n//\t\t\t\tif(!entity.getContentType().getValue().equals(\"text/plain\")) {\n//\t\t\t\t\tis = entity.getContent();\n//\t\t\t\t\tFileUtils.copyInputStreamToFile(is, new File(path));\n//                    httpGet.releaseConnection();\n//\t\t\t\t}else {\n//                    getResponseContent(response, httpGet);\n//\t\t\t\t}\n//\t\t\t}\n//\t\t} catch (ParseException | IOException e) {\n//\t\t\te.printStackTrace();\n//\t\t}finally {\n//            closeResponse(response);\n//            closeInputStream(is);\n//        }\n//\t}\n//\n//    // 获取响应结果\n//    private String getResponseContent(CloseableHttpResponse response, HttpRequestBase httpRequest) throws IOException {\n//        HttpEntity entity = response.getEntity();\n//        String content = EntityUtils.toString(entity,\"UTF-8\");\n//        httpRequest.releaseConnection();\n//        ErrorEntity err = JSON.parseObject(content, ErrorEntity.class);\n//        if(err.getErrcode()!=null && !err.getErrcode().equals(\"0\") &&\n//                err.getErrmsg()!=null && !err.getErrmsg().equals(\"ok\")) {\n//            throw new WeixinException(Integer.parseInt(err.getErrcode()), err.getErrmsg());\n//        }\n//        return content;\n//    }\n//    // 关闭响应\n//    private void closeResponse(CloseableHttpResponse response) {\n//        try {\n//            if(response!=null) response.close();\n//        } catch (IOException e) {\n//            e.printStackTrace();\n//        }\n//    }\n//    // 关闭流\n//    private void closeInputStream(InputStream is) {\n//        try {\n//            if(is!=null) is.close();\n//        } catch (IOException e) {\n//            e.printStackTrace();\n//        }\n//    }\n}\n"
  },
  {
    "path": "weixin-service-wxtools/src/main/java/com/cheng/weixin/service/wxtools/httputils/HttpUtils.java",
    "content": "package com.cheng.weixin.service.wxtools.httputils;\n\n/**\n * HTTP请求方法\n * @author Cheng\n */\npublic class HttpUtils {\n//\t/**\n//\t * GET 请求\n//\t * @param url 传入的微信地址\n//\t * @return 微信返回的消息\n//\t */\n//\tpublic static String httpGet(String url) {\n//\t\tCloseableHttpClient httpClient = null;\n//\t\tCloseableHttpResponse response = null;\n//\t\ttry {\n//\t\t\thttpClient = HttpClientBuilder.create().build();\n//\t\t\tHttpGet httpget = new HttpGet(url);\n//\t\t\tresponse = httpClient.execute(httpget);\n//\t\t\tint statusCode = response.getStatusLine().getStatusCode();\n//\t\t\tif(statusCode>=200&&statusCode<300) {\n//\t\t\t\tHttpEntity entity = response.getEntity();\n//\t\t\t\tString content = EntityUtils.toString(entity,\"UTF-8\");\n//\t\t\t\thttpget.releaseConnection();\n//\t\t\t\tErrorEntity err = JSON.parseObject(content, ErrorEntity.class);\n//\t\t\t\tif(err.getErrcode()!=null && !err.getErrcode().equals(\"0\") &&\n//\t\t\t\t   err.getErrmsg()!=null && !err.getErrmsg().equals(\"ok\")) {\n//\t\t\t\t\tthrow new WeixinException(Integer.parseInt(err.getErrcode()), err.getErrmsg());\n//\t\t\t\t}\n//\t\t\t\treturn content;\n//\t\t\t}\n//\t\t} catch (ParseException | IOException e) {\n//\t\t\te.printStackTrace();\n//\t\t}finally {\n//\t\t\ttry {\n//\t\t\t\tif(httpClient!=null) httpClient.close();\n//\t\t\t} catch (IOException e) {\n//\t\t\t\te.printStackTrace();\n//\t\t\t}\n//\t\t\ttry {\n//\t\t\t\tif(response!=null) response.close();\n//\t\t\t} catch (IOException e) {\n//\t\t\t\te.printStackTrace();\n//\t\t\t}\n//\t\t}\n//\t\treturn null;\n//\t}\n//\n//\t/**\n//\t * POST 请求\n//\t * @param url 传入的微信地址\n//\t * @param data 需要发送的JSON参数\n//\t * @return 微信回复的消息\n//\t */\n//\tpublic static String httpPost(String url, String data) {\n//\t\tCloseableHttpClient httpClient = null;\n//\t\tCloseableHttpResponse response = null;\n//\t\ttry {\n//\t\t\thttpClient = HttpClientBuilder.create().build();\n//\t\t\tHttpPost httppost = new HttpPost(url);\n//\t\t\thttppost.setHeader(\"Content-Type\", \"application/json\");\n//\t\t\tStringEntity params = new StringEntity(data,\"UTF-8\");\n//\t\t\thttppost.setEntity(params);\n//\t\t\tresponse = httpClient.execute(httppost);\n//\t\t\tint statusCode = response.getStatusLine().getStatusCode();\n//\t\t\tif(statusCode>=HttpStatus.SC_OK&&statusCode<HttpStatus.SC_MULTIPLE_CHOICES) {\n//\t\t\t\tHttpEntity entity = response.getEntity();\n//\t\t\t\tString content = EntityUtils.toString(entity,\"UTF-8\");\n//\t\t\t\thttppost.releaseConnection();\n//\t\t\t\tErrorEntity err = JSON.parseObject(content, ErrorEntity.class);\n//\t\t\t\tif(err.getErrcode()!=null && !err.getErrcode().equals(\"0\") &&\n//\t\t\t\t   err.getErrmsg()!=null && !err.getErrmsg().equals(\"ok\")) {\n//\t\t\t\t\tthrow new WeixinException(Integer.parseInt(err.getErrcode()), err.getErrmsg());\n//\t\t\t\t}\n//\t\t\t\treturn content;\n//\t\t\t}\n//\t\t} catch (UnsupportedCharsetException | IOException e) {\n//\t\t\te.printStackTrace();\n//\t\t}finally {\n//\t\t\ttry {\n//\t\t\t\tif(httpClient!=null) httpClient.close();\n//\t\t\t} catch (IOException e) {\n//\t\t\t\te.printStackTrace();\n//\t\t\t}\n//\t\t\ttry {\n//\t\t\t\tif(response!=null) response.close();\n//\t\t\t} catch (IOException e) {\n//\t\t\t\te.printStackTrace();\n//\t\t\t}\n//\t\t}\n//\t\treturn null;\n//\t}\n//\t/**\n//\t * 发送媒体消息\n//\t * @param url 传入的微信地址\n//\t * @param path 需要传入的媒体文件\n//\t * @return 返回的结果\n//\t */\n//\tpublic static String postMedia(String url, String path) {\n//\t\tCloseableHttpClient httpClient = null;\n//\t\tCloseableHttpResponse response = null;\n//\t\ttry {\n//\t\t\thttpClient = HttpClientBuilder.create().build();\n//\t\t\tHttpPost httppost = new HttpPost(url);\n//\t\t\tFileBody fb = new FileBody(new File(path));\n//\t\t\tHttpEntity entity = MultipartEntityBuilder.create().addPart(\"media\", fb).build();\n//\t\t\thttppost.setEntity(entity);\n//\t\t\tresponse = httpClient.execute(httppost);\n//\t\t\tint statusCode = response.getStatusLine().getStatusCode();\n//\t\t\tif(statusCode>=HttpStatus.SC_OK&&statusCode<HttpStatus.SC_MULTIPLE_CHOICES) {\n//\t\t\t\tHttpEntity entityContent = response.getEntity();\n//\t\t\t\tString content = EntityUtils.toString(entityContent,\"UTF-8\");\n//\t\t\t\thttppost.releaseConnection();\n//\t\t\t\tErrorEntity err = JSON.parseObject(content, ErrorEntity.class);\n//\t\t\t\tif(err.getErrcode()!=null && !err.getErrcode().equals(\"0\") &&\n//\t\t\t\t   err.getErrmsg()!=null && !err.getErrmsg().equals(\"ok\")) {\n//\t\t\t\t\tthrow new WeixinException(Integer.parseInt(err.getErrcode()), err.getErrmsg());\n//\t\t\t\t}\n//\t\t\t\treturn content;\n//\t\t\t}\n//\t\t} catch (ParseException | IOException e) {\n//\t\t\te.printStackTrace();\n//\t\t}finally {\n//\t\t\ttry {\n//\t\t\t\tif(httpClient!=null) httpClient.close();\n//\t\t\t} catch (IOException e) {\n//\t\t\t\te.printStackTrace();\n//\t\t\t}\n//\t\t\ttry {\n//\t\t\t\tif(response!=null) response.close();\n//\t\t\t} catch (IOException e) {\n//\t\t\t\te.printStackTrace();\n//\t\t\t}\n//\t\t}\n//\t\treturn null;\n//\t}\n//\t/**\n//\t * 根据媒体ID下载媒体资源\n//\t * @param url\n//\t * @param path\n//\t */\n//\tpublic static void getMidie(String url, String path) {\n//\t\tCloseableHttpClient httpClient = null;\n//\t\tCloseableHttpResponse response = null;\n//\t\tInputStream is = null;\n//\t\ttry {\n//\t\t\thttpClient = HttpClientBuilder.create().build();\n//\t\t\tHttpGet httpget = new HttpGet(url);\n//\t\t\tresponse = httpClient.execute(httpget);\n//\t\t\tint statusCode = response.getStatusLine().getStatusCode();\n//\t\t\tif(statusCode>=HttpStatus.SC_OK&&statusCode<HttpStatus.SC_MULTIPLE_CHOICES) {\n//\t\t\t\tHttpEntity entity = response.getEntity();\n//\t\t\t\tif(!entity.getContentType().getValue().equals(\"text/plain\")) {\n//\t\t\t\t\tis = entity.getContent();\n//\t\t\t\t\tFileUtils.copyInputStreamToFile(is, new File(path));\n//\t\t\t\t\thttpget.releaseConnection();\n//\t\t\t\t}else {\n//\t\t\t\t\tString content = EntityUtils.toString(entity,\"UTF-8\");\n//\t\t\t\t\thttpget.releaseConnection();\n//\t\t\t\t\tErrorEntity err = JSON.parseObject(content, ErrorEntity.class);\n//\t\t\t\t\tif(err.getErrcode()!=null && !err.getErrcode().equals(\"0\") &&\n//\t\t\t\t\t\t\terr.getErrmsg()!=null && !err.getErrmsg().equals(\"ok\")) {\n//\t\t\t\t\t\tthrow new WeixinException(Integer.parseInt(err.getErrcode()), err.getErrmsg());\n//\t\t\t\t\t}\n//\t\t\t\t}\n//\t\t\t}\n//\t\t} catch (ParseException | IOException e) {\n//\t\t\te.printStackTrace();\n//\t\t}finally {\n//\t\t\ttry {\n//\t\t\t\tif(httpClient!=null) httpClient.close();\n//\t\t\t} catch (IOException e) {\n//\t\t\t\te.printStackTrace();\n//\t\t\t}\n//\t\t\ttry {\n//\t\t\t\tif(response!=null) response.close();\n//\t\t\t} catch (IOException e) {\n//\t\t\t\te.printStackTrace();\n//\t\t\t}\n//\t\t\ttry {\n//\t\t\t\tif(is!=null) is.close();\n//\t\t\t} catch (IOException e) {\n//\t\t\t\te.printStackTrace();\n//\t\t\t}\n//\t\t}\n//\t}\n}\n"
  },
  {
    "path": "weixin-service-wxtools/src/main/java/com/cheng/weixin/service/wxtools/service/WxGroupService.java",
    "content": "package com.cheng.weixin.service.wxtools.service;\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.JSONObject;\nimport com.alibaba.fastjson.TypeReference;\nimport com.cheng.weixin.common.constant.weixin.WeixinUrl;\nimport com.cheng.weixin.rpc.httpclient.service.RpcHttpClientService;\nimport com.cheng.weixin.rpc.wxtools.content.WeixinContent;\nimport com.cheng.weixin.rpc.wxtools.response.model.WxGroup;\nimport com.cheng.weixin.rpc.wxtools.service.RpcWxGroupService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n@Service(\"wxGroupService\")\npublic class WxGroupService  implements RpcWxGroupService {\n\n\t@Autowired\n\tprotected WeixinUrl weixinUrl;\n\t@Autowired\n\tprivate RpcHttpClientService httpClient;\n\n\t@Override\n\tpublic WxGroup addGroup(String name) {\n\t\tString url = weixinUrl.ADD_GROUP.replace(\"ACCESS_TOKEN\", WeixinContent.getInstance().getAccessToken());\n\n\t\tMap<String, Map<String, String>> parameter = new HashMap<>();\n\t\tMap<String, String> group = new HashMap<>();\n\t\tgroup.put(\"name\", name);\n\t\tparameter.put(\"group\", group);\n\t\tString data = JSON.toJSONString(parameter);\n\t\tString content = httpClient.doPost(url, data);\n\n\t\tJSONObject repData = JSONObject.parseObject(content);\n\t\tWxGroup repGroup = repData.getObject(\"group\", WxGroup.class);\n\t\treturn repGroup;\n\t}\n\n\t@Override\n\tpublic List<WxGroup> getAllGroup() {\n\t\tString url = weixinUrl.QUERY_ALL_GROUP.replace(\"ACCESS_TOKEN\", WeixinContent.getInstance().getAccessToken());\n\t\tString content = httpClient.doGet(url);\n\t\tMap<String, List<WxGroup>> repData = JSONObject.parseObject(content, new TypeReference<Map<String, List<WxGroup>>>(){});\n\t\treturn repData.get(\"groups\");\n\t}\n\n\t@Override\n\tpublic Integer getUserGroup(String openid) {\n\t\tString url = weixinUrl.QUERY_USER_GROUP.replace(\"ACCESS_TOKEN\", WeixinContent.getInstance().getAccessToken());\n\t\tMap<String, String> parameter = new HashMap<>();\n\t\tparameter.put(\"openid\", openid);\n\t\tString data = JSON.toJSONString(parameter);\n\t\tString content = httpClient.doPost(url, data);\n\n\t\tJSONObject repData = JSONObject.parseObject(content);\n\t\treturn repData.getInteger(\"groupid\");\n\t}\n\n\t@Override\n\tpublic void updateGroupName(int id, String name) {\n\t\tString url = weixinUrl.MODIFY_GROUP_NAME.replace(\"ACCESS_TOKEN\", WeixinContent.getInstance().getAccessToken());\n\t\tMap<String, WxGroup> parameter = new HashMap<>();\n\t\tparameter.put(\"group\", new WxGroup(id, name));\n\t\tString data = JSON.toJSONString(parameter);\n\t\thttpClient.doPost(url, data);\n\t}\n\n\t@Override\n\tpublic void updateUserGroup(String openid, int groupid) {\n\t\tString url = weixinUrl.MOVE_USER_GROUP.replace(\"ACCESS_TOKEN\", WeixinContent.getInstance().getAccessToken());\n\t\tMap<String, Object> parameter = new HashMap<>();\n\t\tparameter.put(\"openid\", openid);\n\t\tparameter.put(\"to_groupid\", groupid);\n\t\tString data = JSON.toJSONString(parameter);\n\t\thttpClient.doPost(url, data);\n\t}\n\n\t@Override\n\tpublic void updateBatchMoveUserGroup(List<String> openids, int groupid) {\n\t\tString url = weixinUrl.BATCH_MOVE_USER_GROUP.replace(\"ACCESS_TOKEN\", WeixinContent.getInstance().getAccessToken());\n\t\tMap<String, Object> parameter = new HashMap<>();\n\t\tparameter.put(\"openid_list\", openids);\n\t\tparameter.put(\"to_groupid\", groupid);\n\t\tString data = JSON.toJSONString(parameter);\n\n\t\thttpClient.doPost(url, data);\n\t}\n\n\t@Override\n\tpublic void deleteGroup(int id) {\n\t\tString url = weixinUrl.DELETE_GROUP.replace(\"ACCESS_TOKEN\", WeixinContent.getInstance().getAccessToken());\n\t\tMap<String, Object> parameter = new HashMap<>();\n\t\tparameter.put(\"group\", new WxGroup(id));\n\t\tString data = JSON.toJSONString(parameter);\n\n\t\thttpClient.doPost(url, data);\n\t}\n\n\t//@Override\n\t//public BaseDaoMapper getBaseDao() {\n\t//\treturn groupDao;\n\t//}\n\n}"
  },
  {
    "path": "weixin-service-wxtools/src/main/java/com/cheng/weixin/service/wxtools/service/WxMenuService.java",
    "content": "package com.cheng.weixin.service.wxtools.service;\n\n\nimport com.cheng.weixin.rpc.wxtools.service.RpcWxMenuService;\nimport org.springframework.stereotype.Component;\n\n/**\n * Desc: 菜单业务层\n * Author: Cheng\n * Date: 2016/1/29 0029\n */\n@Component(\"wxMenuService\")\npublic class WxMenuService implements RpcWxMenuService {\n\n\n\n    //@Override\n    //public BaseDaoMapper<Menu> getBaseDao() {\n    //    return menuDao;\n    //}\n}\n"
  },
  {
    "path": "weixin-service-wxtools/src/main/java/com/cheng/weixin/service/wxtools/service/msghandle/MessageHandle.java",
    "content": "package com.cheng.weixin.service.wxtools.service.msghandle;\n\nimport com.cheng.weixin.rpc.wxtools.enums.Event;\nimport com.cheng.weixin.rpc.wxtools.enums.MsgType;\nimport com.cheng.weixin.rpc.wxtools.enums.Status;\nimport com.cheng.weixin.rpc.wxtools.request.model.ImageMessage;\nimport com.cheng.weixin.rpc.wxtools.request.model.TextMessage;\nimport com.cheng.weixin.rpc.wxtools.request.model.WxImage;\nimport com.cheng.weixin.rpc.wxtools.service.RpcMessageHandleService;\nimport com.cheng.weixin.common.exception.MassageException;\nimport com.cheng.weixin.service.wxtools.utils.XMLUtils;\nimport org.apache.commons.io.IOUtils;\nimport org.dom4j.Document;\nimport org.dom4j.DocumentException;\nimport org.dom4j.DocumentHelper;\nimport org.dom4j.Element;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.stereotype.Component;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.io.IOException;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * 消息处理类\n * @author Cheng\n */\n@Component(\"messageHandle\")\npublic class MessageHandle implements RpcMessageHandleService {\n\tprivate static final Logger log = LoggerFactory.getLogger(MessageHandle.class);\n\t\n\t/**\n\t * 把XML转换程Map对象\n\t * @param request\n\t * @return\n\t */\n\t@SuppressWarnings(\"unchecked\")\n\tpublic Map<String, String> reqMsg2Map(HttpServletRequest request) {\n\t\tMap<String, String> maps = new HashMap<>();\n\t\ttry {\n\t\t\tString msg = IOUtils.toString(request.getInputStream(),\"UTF-8\");\n\t\t\t\n\t\t\tlog.debug(\"\\n接收到的XML为：\\n{}\", msg);\n\t\t\t\n\t\t\tDocument document = DocumentHelper.parseText(msg);\n\t\t\tElement root = document.getRootElement();\n\t\t\tList<Element> elements = root.elements();\n\t\t\tfor(Element element:elements) {\n\t\t\t\tmaps.put(element.getName(), element.getText());\n\t\t\t}\n\t\t\treturn maps;\n\t\t} catch (IOException | DocumentException e) {\n\t\t\tlog.error(\"消息转换Map出错！错误消息：{}\", e.getMessage());\n\t\t\tthrow new MassageException(3000, \"消息转换Map出错\");\n\t\t}\n\t}\n\t\n\t/**\n\t * 返回的消息总入口\n\t * @param msgMap\n\t * @return\n\t */\n\t@Override\n\tpublic String handleResp(Map<String, String> msgMap) {\n\t\tString msgType = msgMap.get(\"MsgType\");\n\t\tString eventType = msgMap.get(\"Event\");\n\t\tif(eventType!=null) {\n\t\t\tif(Event.unsubscribe.name().equals(eventType)) {\n\t\t\t\treturn handleUnsubscribe(msgMap);\n\t\t\t}else if(MsgType.event.name().equals(msgType)) {\n\t\t\t\treturn handleEvent(msgMap);\n\t\t\t}\n\t\t}else if(msgType!=null) {\n\t\t\tif(MsgType.text.name().equals(msgType)||MsgType.voice.name().equals(msgType)\n\t\t\t\t\t||MsgType.image.name().equals(msgType)||MsgType.shortvideo.name().equals(msgType)\n\t\t\t\t\t||MsgType.location.name().equals(msgType)||MsgType.link.name().equals(msgType)) {\n\t\t\t\t\n\t\t\t\treturn handleMsg(msgMap);\n\t\t\t}\n\t\t}\n\t\tthrow new MassageException(30001, \"没有此消息类型和事件类型\");\n\t}\n\t/**\n\t * 用户取消订阅\n\t * @param msgMap\n\t * @return\n\t */\n\tprivate String handleUnsubscribe(Map<String, String> msgMap) {\n\t\tlog.info(\"用户取消关注！\");\n\t\treturn \"success\";\n\t}\n\t\n\t/**\n\t * 消息处理\n\t * @param msgMap\n\t * @return\n\t */\n\tprivate String handleMsg(Map<String, String> msgMap) {\n\t\tString msgType = msgMap.get(\"MsgType\");\n\t\tif(MsgType.text.name().equals(msgType)) {\n\t\t\treturn textTypeMsgHandle(msgMap, \"你发送的是text消息！\");\n\t\t}else if(MsgType.voice.name().equals(msgType)) {\n\t\t\treturn textTypeMsgHandle(msgMap, \"你发送的是voice消息！\");\n\t\t}else if(MsgType.image.name().equals(msgType)) {\n\t\t\treturn imageTypeMsgHandle(msgMap);\n\t\t}else if(MsgType.shortvideo.name().equals(msgType)) {\n\t\t\treturn textTypeMsgHandle(msgMap, \"你发送的是shortvideo消息！\");\n\t\t}else if(MsgType.location.name().equals(msgType)) {\n\t\t\treturn textTypeMsgHandle(msgMap, \"你发送的是location消息！\");\n\t\t}else if(MsgType.link.name().equals(msgType)) {\n\t\t\treturn textTypeMsgHandle(msgMap, \"你发送的是link消息！\");\n\t\t}\n\t\tthrow new MassageException(30002, \"没有此消息类型\");\n\t}\n\t/**\n\t * 处理事件\n\t * @param msgMap\n\t * @return\n\t */\n\tprivate String handleEvent(Map<String, String> msgMap) {\n\t\tString eventType = msgMap.get(\"Event\");\n\t\tif(Event.subscribe.name().equals(eventType)) {\n\t\t\treturn textTypeMsgHandle(msgMap, \"谢谢关注！\");\n\t\t}else if(Event.CLICK.name().equals(eventType)) {\n\t\t\treturn textTypeMsgHandle(msgMap, \"自定义菜单事件！\");\n\t\t}else if(Event.LOCATION.name().equals(eventType)) {\n\t\t\treturn textTypeMsgHandle(msgMap, \"上报地理位置事件！\");\n\t\t}else if(Event.SCAN.name().equals(eventType)) {\n\t\t\treturn textTypeMsgHandle(msgMap, \"扫描带参数二维码事件！\");\n\t\t}else if(Event.VIEW.name().equals(eventType)) {\n\t\t\treturn textTypeMsgHandle(msgMap, \"点击菜单跳转链接时的事件推送！\");\n\t\t}else if(Event.click.name().equals(eventType)) {\n\t\t\treturn textTypeMsgHandle(msgMap, \"点击推事件！\");\n\t\t}else if(Event.view.name().equals(eventType)) {\n\t\t\treturn textTypeMsgHandle(msgMap, \"跳转URL！\");\n\t\t}else if(Event.scancode_push.name().equals(eventType)) {\n\t\t\treturn textTypeMsgHandle(msgMap, \"扫码推事件！\");\n\t\t}else if(Event.scancode_waitmsg.name().equals(eventType)) {\n\t\t\treturn textTypeMsgHandle(msgMap, \"扫码带提示！\");\n\t\t}else if(Event.pic_sysphoto.name().equals(eventType)) {\n\t\t\treturn textTypeMsgHandle(msgMap, \"弹出系统拍照发图！\");\n\t\t}else if(Event.pic_photo_or_album.name().equals(eventType)) {\n\t\t\treturn textTypeMsgHandle(msgMap, \"弹出拍照或者相册发图！\");\n\t\t}else if(Event.pic_weixin.name().equals(eventType)) {\n\t\t\treturn textTypeMsgHandle(msgMap, \"弹出微信相册发图器！\");\n\t\t}else if(Event.location_select.name().equals(eventType)) {\n\t\t\treturn textTypeMsgHandle(msgMap, \"弹出地理位置选择器！\");\n\t\t}else if(Event.media_id.name().equals(eventType)) {\n\t\t\treturn textTypeMsgHandle(msgMap, \"下发消息（除文本消息）！\");\n\t\t}else if(Event.view_limited.name().equals(eventType)) {\n\t\t\treturn textTypeMsgHandle(msgMap, \"跳转图文消息URL！\");\n\t\t}else if(Event.TEMPLATESENDJOBFINISH.name().equals(eventType)) {\n\t\t\t// 主动发消息是不用给微信回复消息的，回复了用户也接不到\n\t\t\tString status = msgMap.get(\"Status\"); \n\t\t\tString msgID = msgMap.get(\"MsgID\"); \n\t\t\tif(Status.SUCCESS.getName().equals(status)) {\n\t\t\t\tlog.debug(\"消息发送成功，消息ID：{}\", msgID);\n\t\t\t}else if(Status.SYSTEM_FAILED.getName().equals(status)) {\n\t\t\t\tlog.debug(\"消息发送失败，消息ID：{}\", msgID);\n\t\t\t}else if(Status.USER_BLOCK.getName().equals(status)) {\n\t\t\t\tlog.debug(\"消息被用户拒收，消息ID：{}\", msgID);\n\t\t\t}else {\n\t\t\t\tlog.debug(\"消息发送遇到未知异常，消息ID：{}\", msgID);\n\t\t\t}\n\t\t\treturn \"success\";\n\t\t}\n\t\tthrow new MassageException(30003, \"没有此事件类型\");\n\t}\n\t\n\t/**\n\t * 文本消息的处理\n\t * @param msgMap\n\t * @return\n\t */\n\tprivate String textTypeMsgHandle(Map<String, String> msgMap, String content) {\n\t\tTextMessage textMsg = new TextMessage();\n\t\ttextMsg.setToUserName(msgMap.get(\"FromUserName\"));\n\t\ttextMsg.setFromUserName(msgMap.get(\"ToUserName\"));\n\t\ttextMsg.setCreateTime(new Date().getTime());\n\t\ttextMsg.setMsgType(MsgType.text);\n\t\ttextMsg.setContent(content);\n\t\t\n\t\treturn XMLUtils.msg2XML(textMsg);\n\t}\n\t/**\n\t * 图片消息处理\n\t * @param msgMap\n\t * @return\n\t */\n\tprivate String imageTypeMsgHandle(Map<String, String> msgMap) {\n\t\tImageMessage imgMsg = new ImageMessage();\n\t\timgMsg.setToUserName(msgMap.get(\"FromUserName\"));\n\t\timgMsg.setFromUserName(msgMap.get(\"ToUserName\"));\n\t\timgMsg.setCreateTime(new Date().getTime());\n\t\timgMsg.setMsgType(MsgType.image);\n\t\tWxImage img = new WxImage();\n\t\tString mediaId = \"M8K2WcayqjRaisQMCygVpWk1VDAjL8XMhvB66Y5TpBHsopHViOEOIR4semy9oOAD\";\n\t\timg.setMediaId(mediaId);\n\t\timgMsg.setImage(img);\n\t\t\n\t\treturn XMLUtils.msg2XML(imgMsg);\n\t}\n\t\n}\n"
  },
  {
    "path": "weixin-service-wxtools/src/main/java/com/cheng/weixin/service/wxtools/utils/XMLUtils.java",
    "content": "package com.cheng.weixin.service.wxtools.utils;\n\nimport com.cheng.weixin.rpc.wxtools.enums.MsgType;\nimport com.cheng.weixin.rpc.wxtools.enums.Event;\nimport com.thoughtworks.xstream.XStream;\nimport com.thoughtworks.xstream.core.util.QuickWriter;\nimport com.thoughtworks.xstream.io.HierarchicalStreamWriter;\nimport com.thoughtworks.xstream.io.xml.PrettyPrintWriter;\nimport com.thoughtworks.xstream.io.xml.XppDriver;\n\nimport java.io.Serializable;\nimport java.io.Writer;\n\n/**\n * XML工具类\n * @author Cheng\n *\n */\npublic class XMLUtils {\n\t/**\n\t * 将文本消息转换成XML\n\t * @param msg\n\t * @return\n\t */\n\tpublic static String msg2XML(Serializable msg) {\n\t\txstream.alias(\"xml\", msg.getClass());\n\t\treturn xstream.toXML(msg);\n\t}\n\t\n//\tpublic static String voiceMsg2XML(VoiceMessage voiceMsg) {\n//\t\txstream.alias(\"xml\", voiceMsg.getClass());\n//\t\treturn xstream.toXML(voiceMsg);\n//\t}\n\t\n\t// 扩展xstream，使其支持CDATA块\n\tprivate static XStream xstream = new XStream(new XppDriver() {\n\t\t@Override\n\t\tpublic HierarchicalStreamWriter createWriter(Writer out) {\n\t\t\treturn new PrettyPrintWriter(out) {\n\t\t\t\t\n\t\t\t\tboolean cdata;\n\t\t\t\t\n\t\t\t\t@SuppressWarnings(\"rawtypes\")\n\t\t\t\t@Override\n\t\t\t\tpublic void startNode(String name, Class clazz) {\n\t\t\t\t\tsuper.startNode(name, clazz);\n\t\t\t\t\tcdata = false;\n\t\t\t\t\tif(clazz.equals(String.class)||clazz.equals(Event.class)||clazz.equals(MsgType.class)) {\n\t\t\t\t\t\tcdata=true;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\t@Override\n\t\t\t\tprotected void writeText(QuickWriter writer, String text) {\n\t\t\t\t\tif(cdata) {\n\t\t\t\t\t\twriter.write(\"<![CDATA[\");\n\t\t\t\t\t\twriter.write(text);\n\t\t\t\t\t\twriter.write(\"]]>\");\n\t\t\t\t\t}else {\n\t\t\t\t\t\twriter.write(text);\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\t\n\t\n}\n"
  },
  {
    "path": "weixin-service-wxtools/src/main/resources/mybatis/mapper/WxGroupMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.cheng.weixin.service.wxtools.dao.WxGroupDaoMapper\">\n</mapper>\n\n"
  },
  {
    "path": "weixin-service-wxtools/src/main/resources/mybatis/mybatis-config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE configuration\n        PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-config.dtd\">\n\n<configuration>\n  <settings>\n    <!-- 开启字段名和属性名驼峰匹配 -->\n    <setting name=\"mapUnderscoreToCamelCase\" value=\"true\"/>\n    <!-- 全局启用或禁用延迟加载。当禁用时，所有关联对象都会即时加载。 -->\n    <setting name=\"lazyLoadingEnabled\" value=\"true\"/>\n    <!-- 当启用时，有延迟加载属性的对象在被调用时将会完全加载任意属性。否则，每种属性将会按需要加载。 -->\n    <setting name=\"aggressiveLazyLoading\" value=\"true\"/>\n  </settings>\n</configuration>"
  },
  {
    "path": "weixin-service-wxtools/src/main/resources/spring/spring-context.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/context\n    http://www.springframework.org/schema/context/spring-context-3.2.xsd\">\n\n\t<!-- 引入配置文件 -->\n\t<context:property-placeholder location=\"classpath:system.properties,classpath:jdbc.properties\" />\n\n\t<!-- 打开Spring的Annotation支持 -->\n\t<context:annotation-config />\n\n\t<!-- 扫描注入  -->\n\t<context:component-scan base-package=\"com.cheng.weixin.service.wxtools\" />\n\n\t<import resource=\"classpath:spring/spring-dubbo-provider.xml\"/>\n\t<import resource=\"classpath:spring/spring-dubbo-consumer.xml\"/>\n\t<import resource=\"classpath:spring/spring-mybatis.xml\"/>\n\n</beans>"
  },
  {
    "path": "weixin-service-wxtools/src/main/resources/spring/spring-dubbo-consumer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd\n          http://code.alibabatech.com/schema/dubbo\n          http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n  <dubbo:consumer registry=\"zk1\"/>\n\n  <dubbo:reference id=\"httpClientService\" interface=\"com.cheng.weixin.rpc.httpclient.service.RpcHttpClientService\"/>\n</beans>\n"
  },
  {
    "path": "weixin-service-wxtools/src/main/resources/spring/spring-dubbo-provider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd\n          http://code.alibabatech.com/schema/dubbo\n          http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n  <dubbo:application name=\"weixin-service-wxtools\"/>\n\n  <dubbo:registry id=\"zk1\" address=\"${weixin.dubbo.reistry.address}\" protocol=\"zookeeper\"/> <!-- 注意要关闭防火墙 -->\n\n  <dubbo:protocol id=\"mydubbo\" name=\"dubbo\" port=\"20887\"/>\n\n  <dubbo:provider registry=\"zk1\" protocol=\"mydubbo\"/>\n\n  <dubbo:service interface=\"com.cheng.weixin.rpc.wxtools.service.RpcMessageHandleService\" ref=\"messageHandle\"/>\n  <dubbo:service interface=\"com.cheng.weixin.rpc.wxtools.service.RpcWxMenuService\" ref=\"wxMenuService\"/>\n  <dubbo:service interface=\"com.cheng.weixin.rpc.wxtools.service.RpcWxGroupService\" ref=\"wxGroupService\"/>\n\n</beans>\n"
  },
  {
    "path": "weixin-service-wxtools/src/main/resources/spring/spring-mybatis.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:p=\"http://www.springframework.org/schema/p\"\n\txmlns:aop=\"http://www.springframework.org/schema/aop\"\n\txmlns:tx=\"http://www.springframework.org/schema/tx\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/tx\n    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd\n    http://www.springframework.org/schema/aop\n    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd\">\n\n\t<bean id=\"dataSource\" class=\"com.alibaba.druid.pool.DruidDataSource\" init-method=\"init\" destroy-method=\"close\">\n\t  <property name=\"driverClassName\" value=\"${jdbc.driverClassName}\"/>\n\t  <property name=\"url\" value=\"${jdbc.url}\"/>\n\t  <property name=\"username\" value=\"${jdbc.username}\"/>\n\t  <property name=\"password\" value=\"${jdbc.password}\"/>\n\t  <!-- 连接池最大使用连接数 -->\n\t  <property name=\"maxActive\" value=\"${jdbc.maxActive}\"/>\n\t  <!-- 初始化连接大小 -->\n\t  <property name=\"initialSize\" value=\"${jdbc.initialSize}\"/>\n\t  <!-- 获取连接最大等待时间 -->\n\t  <property name=\"maxWait\" value=\"${jdbc.maxWait}\"/>\n\t  <!-- 连接池最大空闲 -->\n\t  <!--  property name=\"maxIdle\" value=\"${jdbc.maxIdle}\"/>-->\n\t  <!-- 连接池最小空闲 -->\n\t  <property name=\"minIdle\" value=\"${jdbc.minIdle}\"/>\n\t  <!-- 自动清除无用连接 -->\n\t  <property name=\"removeAbandoned\" value=\"${jdbc.removeAbandoned}\"/>\n\t  <!-- 清除无用连接的等待时间 -->\n\t  <property name=\"removeAbandonedTimeout\" value=\"${jdbc.removeAbandonedTimeout}\"/>\n\t  <!-- 连接属性 -->\n\t  <property name=\"connectionProperties\" value=\"${jdbc.connectionProperties}\"/>\n\t</bean>\n\n  <!-- 注入SQLSession -->\n  <bean id=\"sqlSession\" class=\"org.mybatis.spring.SqlSessionTemplate\" scope=\"prototype\">\n    <constructor-arg index=\"0\" ref=\"sqlSessionFactory\"/>\n  </bean>\n\n\t<!-- mybatis配置 -->\n\t<bean id=\"sqlSessionFactory\" class=\"org.mybatis.spring.SqlSessionFactoryBean\"\n\t\tp:dataSource-ref=\"dataSource\"\n    p:configLocation=\"classpath:/mybatis/mybatis-config.xml\"\n\t\tp:typeAliasesPackage=\"com.cheng.weixin.rpc.wxtools.entity\"\n\t\tp:mapperLocations=\"classpath:/mybatis/mapper/*.xml\" />\n\n\t<!-- spring与mybatis整合配置，扫描所有dao -->\n\t<bean class=\"org.mybatis.spring.mapper.MapperScannerConfigurer\"\n\t\tp:basePackage=\"com.cheng.weixin.service.wxtools.dao\"\n\t\tp:sqlSessionFactoryBeanName=\"sqlSessionFactory\" />\n\n\t<!-- 对数据源进行事务管理 -->\n\t<bean id=\"transactionManager\" class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\"\n\t\tp:dataSource-ref=\"dataSource\" />\n\t<!-- 通知 -->\n\t<tx:advice id=\"txAdvice\" transaction-manager=\"transactionManager\">\n\t  <!-- 传播行为 -->\n\t  <tx:attributes>\n\t  \t<tx:method name=\"add*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"update*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"delete*\" propagation=\"REQUIRED\"/>\n\t  \t<tx:method name=\"get*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  \t<tx:method name=\"find*\" propagation=\"SUPPORTS\" read-only=\"true\"/>\n\t  </tx:attributes>\n\t</tx:advice>\t\n\t<!-- 哪些类的哪些方法使用事务 -->\n\t<aop:config>\n\t  <aop:advisor advice-ref=\"txAdvice\" pointcut=\"execution(* com.cheng.weixin.service.wxtools.service.*.*(..))\"/>\n\t</aop:config>\n\t\t\n\t<!-- 开启事务注解驱动 \n    <tx:annotation-driven />\n    -->\n</beans>"
  },
  {
    "path": "weixin-web-manage/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n  <artifactId>weixin-web-manage</artifactId>\n  <packaging>war</packaging>\n  <name>weixin-web-manage</name>\n  <url>http://maven.apache.org</url>\n  <dependencies>\n    <dependency>\n      <groupId>${parent.groupId}</groupId>\n      <artifactId>weixin-common</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${project.groupId}</groupId>\n      <artifactId>weixin-common-config</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${parent.groupId}</groupId>\n      <artifactId>weixin-rpc-admin</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.cheng</groupId>\n      <artifactId>weixin-rpc-log</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>log4j</groupId>\n      <artifactId>log4j</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-log4j12</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-logging</groupId>\n      <artifactId>commons-logging</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>javax.servlet</groupId>\n      <artifactId>javax.servlet-api</artifactId>\n      <scope>provided</scope>\n    </dependency>\n    <dependency>\n      <groupId>jstl</groupId>\n      <artifactId>jstl</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>javax.servlet.jsp</groupId>\n      <artifactId>jsp-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>javax.el</groupId>\n      <artifactId>javax.el-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>opensymphony</groupId>\n      <artifactId>sitemesh</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>joda-time</groupId>\n      <artifactId>joda-time</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>net.sf.ehcache</groupId>\n      <artifactId>ehcache</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.apache.shiro</groupId>\n      <artifactId>shiro-core</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.apache.shiro</groupId>\n      <artifactId>shiro-web</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.apache.shiro</groupId>\n      <artifactId>shiro-spring</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.apache.shiro</groupId>\n      <artifactId>shiro-ehcache</artifactId>\n    </dependency>\n    <!-- Dubbo Start -->\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>dubbo</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.101tec</groupId>\n      <artifactId>zkclient</artifactId>\n    </dependency>\n    <!-- Dubbo End -->\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-webmvc</artifactId>\n    </dependency>\n  </dependencies>\n  <build>\n    <finalName>manage</finalName>\n    <plugins>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-compiler-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-source-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.zeroturnaround</groupId>\n        <artifactId>jrebel-maven-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.mortbay.jetty</groupId>\n        <artifactId>jetty-maven-plugin</artifactId>\n        <configuration>\n          <scanIntervalSeconds>0</scanIntervalSeconds>\n          <webApp>\n            <contextPath>/${project.build.finalName}</contextPath>\n          </webApp>\n        </configuration>\n      </plugin>\n    </plugins>\n  </build>\n</project>\n"
  },
  {
    "path": "weixin-web-manage/src/main/java/com/cheng/weixin/web/manage/controllers/AdminController.java",
    "content": "package com.cheng.weixin.web.manage.controllers;\n\nimport com.cheng.weixin.common.security.SecretUtils;\nimport com.cheng.weixin.common.utils.StringUtils;\nimport com.cheng.weixin.rpc.admin.entity.Admin;\nimport com.cheng.weixin.common.model.Page;\nimport com.cheng.weixin.web.manage.utils.UserUtils;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\n/**\n * Desc: 用户\n * Author: Cheng\n * Date: 2016/3/28 0028\n */\n@Controller\npublic class AdminController extends BaseController  {\n    /**\n     * 获取当前登录者的信息&更新用户信息\n     * @param model\n     * @return\n     */\n    @RequestMapping(value = \"info\")\n    public String info(Admin admin, Model model) {\n        Admin currentAdmin = UserUtils.getUser();\n        if (StringUtils.isNotBlank(admin.getUsername())) {\n            currentAdmin.setUsername(null);\n            currentAdmin.setMobile(admin.getMobile());\n            currentAdmin.setRemarks(admin.getRemarks());\n            adminService.updateAdminInfo(currentAdmin);\n            addMessage(model, \"msg\", \"更新成功！\");\n            // 清除缓存\n            UserUtils.clearCache(currentAdmin);\n        }\n        model.addAttribute(\"admin\", currentAdmin);\n        return \"admin/info\";\n    }\n\n    /**\n     * 修改密码\n     * @param oldPasswd\n     * @param newPasswd\n     * @param model\n     * @return\n     */\n    @RequestMapping(value = \"modifyPwd\", method = RequestMethod.POST)\n    public String modifyPwd(String oldPasswd, String newPasswd, Model model) {\n        Admin currentAdmin = UserUtils.getUser();\n        if (StringUtils.isNoneBlank(oldPasswd, newPasswd)) {\n            if (SecretUtils.validatePassword(oldPasswd, currentAdmin.getPassword())) {\n                adminService.updatePasswdById(currentAdmin.getId(), newPasswd);\n                addMessage(model, \"msg\", \"修改密码成功！\");\n                // 清除缓存\n                UserUtils.clearCache(currentAdmin);\n            }else {\n                addMessage(model, \"msg\", \"修改密码失败，旧密码错误！\");\n            }\n        }\n        model.addAttribute(\"admin\", currentAdmin);\n        return \"admin/info\";\n    }\n\n    /**\n     * 保存用户\n     * @param model\n     * @param admin\n     * @return\n     */\n    @RequestMapping(value = \"save\", method = RequestMethod.POST)\n    public String save(Model model, Admin admin) {\n        if(checkUserName(admin.getUsername())) {\n            addMessage(model, \"msg\", \"添加用户\" + admin.getUsername() + \"失败，用户名已存在！\");\n        }\n        admin.setPassword(SecretUtils.entryptPassword(\"abc1234\"));\n        adminService.add(admin);\n        addMessage(model, \"msg\", \"添加用户\" + admin.getUsername() + \"成功！\");\n        return \"redirect:admin/list\";\n    }\n\n    /**\n     * 获取用户列表\n     * @param model\n     * @param pageNum 当前页\n     * @return\n     */\n    @RequestMapping(value = \"list\", method = RequestMethod.GET)\n    public String list(Model model, int pageNum) {\n        Page<Admin> admins = adminService.findAdminAll(pageNum, 10);\n        model.addAttribute(\"admins\", admins);\n        return \"list\";\n    }\n\n    /**\n     * 检查用户名是否存在\n     * @param userName\n     * @return\n     */\n    @ResponseBody\n    @RequestMapping(value = \"checkName\")\n    public boolean checkUserName(String userName) {\n        Admin admin = adminService.getAdminByUsername(userName);\n        if (admin == null) {\n            return true;\n        }\n        return false;\n    }\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/java/com/cheng/weixin/web/manage/controllers/BaseController.java",
    "content": "package com.cheng.weixin.web.manage.controllers;\n\nimport com.cheng.weixin.rpc.admin.service.RpcAdminService;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.ui.Model;\n\n/**\n * Desc:\n * Author: Cheng\n * Date: 2016/1/20 0020\n */\npublic abstract class BaseController {\n    /** 统一的日志对象 **/\n    final Logger log = LoggerFactory.getLogger(getClass());\n\n    @Autowired\n    protected RpcAdminService adminService;\n\n    /**\n     * 添加Model消息\n     * @param model\n     * @param attribute\n     * @param messages\n     */\n    protected void addMessage(Model model, String attribute, String... messages) {\n        StringBuilder sb = new StringBuilder();\n        for (String message : messages) {\n            sb.append(message).append(messages.length > 1 ? \"<br/>\" : \"\");\n        }\n        model.addAttribute(attribute, sb.toString());\n    }\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/java/com/cheng/weixin/web/manage/controllers/IndexController.java",
    "content": "package com.cheng.weixin.web.manage.controllers;\n\nimport com.cheng.weixin.common.utils.CacheUtils;\nimport com.cheng.weixin.common.utils.Captcha;\nimport com.cheng.weixin.web.manage.security.SystemAuthorizingRealm;\nimport com.cheng.weixin.web.manage.utils.UserUtils;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * Author: 光灿\n * Date: 2016/1/24\n */\n@Controller\npublic class IndexController extends BaseController {\n\n    @RequestMapping(value = \"index\", method = RequestMethod.GET)\n    public String index() {\n        SystemAuthorizingRealm.Principal user = UserUtils.getPrincipal();\n        // 登录成功后验证码记数清零\n        Captcha.isValidateCodeLogin(user.getUsername(), false, true);\n        return \"index\";\n    }\n\n    @RequestMapping(value = \"home\", method = RequestMethod.GET)\n    public String home() {\n        return \"home\";\n    }\n\n\n    @RequestMapping(value = \"/test\", method = RequestMethod.GET)\n    public String test(Model model) {\n//        List<User> users = userService.findAll();\n//        for (User user : users) {\n//            System.out.println(user);\n//        }\n        Map<String, Integer> testMap = (Map<String, Integer>) CacheUtils.getSysCache(\"loginFailMap\");\n        if (null == testMap) {\n            testMap = new HashMap<>();\n            CacheUtils.putSysCache(\"loginFailMap\", testMap);\n        }\n        Integer testNum = testMap.get(\"test\");\n        if (null == testNum) {\n            testNum = 0;\n        }else {\n            testNum++;\n        }\n        testMap.put(\"test\", testNum);\n        model.addAttribute(\"countNum\", testNum);\n        return \"test\";\n    }\n\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/java/com/cheng/weixin/web/manage/controllers/LoginController.java",
    "content": "package com.cheng.weixin.web.manage.controllers;\n\nimport com.cheng.weixin.web.manage.security.SystemAuthorizingRealm;\nimport com.cheng.weixin.web.manage.security.WxFormAuthenticationFilter;\nimport com.cheng.weixin.common.utils.Captcha;\nimport com.cheng.weixin.web.manage.utils.UserUtils;\nimport org.apache.commons.lang3.StringUtils;\nimport org.apache.shiro.authz.UnauthorizedException;\nimport org.apache.shiro.web.util.WebUtils;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\n\nimport javax.imageio.ImageIO;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport javax.servlet.http.HttpSession;\nimport java.io.IOException;\nimport java.io.OutputStream;\n\n/**\n * Author: 光灿\n * Date: 2016/1/24\n */\n@Controller\npublic class LoginController extends BaseController {\n\n    /** 登录页 **/\n    @RequestMapping(value = \"login\",method = RequestMethod.GET)\n    public String login() {\n        SystemAuthorizingRealm.Principal principal = UserUtils.getPrincipal();\n        // 如果已经登录则跳转到管理首页\n        if(principal != null) {\n            return \"redirect:index\";\n        }\n        return \"login\";\n    }\n    /** 登录失败，登录验证有Shiro来完成 **/\n    @RequestMapping(value = \"login\", method = RequestMethod.POST)\n    public String loginFail(HttpServletRequest request, Model model) {\n        String username = WebUtils.getCleanParam(request, WxFormAuthenticationFilter.DEFAULT_USERNAME_PARAM);\n        String exception = (String) request.getAttribute(WxFormAuthenticationFilter.DEFAULT_ERROR_KEY_ATTRIBUTE_NAME);\n        String message = (String) request.getAttribute(WxFormAuthenticationFilter.DEFAULT_MESSAGE_PARAM);\n        if (StringUtils.isBlank(message) || StringUtils.equals(message, \"null\")) {\n            message = \"用户名或密码错误.\";\n        }\n        model.addAttribute(WxFormAuthenticationFilter.DEFAULT_USERNAME_PARAM, username);\n        model.addAttribute(WxFormAuthenticationFilter.DEFAULT_ERROR_KEY_ATTRIBUTE_NAME, exception);\n        model.addAttribute(WxFormAuthenticationFilter.DEFAULT_MESSAGE_PARAM, message);\n\n        // 非授权异常，登录失败，验证码加1。\n        if (!UnauthorizedException.class.getName().equals(exception)){\n            model.addAttribute(\"isValidateCodeLogin\", Captcha.isValidateCodeLogin(username, true, false));\n        }\n        return \"login\";\n    }\n\n    @RequestMapping(value = \"unauth\",method = RequestMethod.GET)\n    public String unauth() {\n\n        log.info(\"没有权限访问!\");\n\n        return \"unauth\";\n    }\n\n    @RequestMapping(value = \"drawCheckCode\",method = RequestMethod.GET)\n    public void drawCheckCode(HttpServletResponse resp, HttpSession session) throws IOException {\n        resp.setContentType(\"image/jpg\");\n        resp.setHeader(\"Pragma\", \"No-cache\");\n        resp.setHeader(\"Cache-Control\", \"no-cache\");\n        resp.setDateHeader(\"Expires\", 0);\n        int width = 80;//设置验证码的宽度\n        int height = 30;//验证码的高度\n        Captcha c = Captcha.getInstance();\n        c.set(width, height);\n        String checkCode = c.generateCheckcode();\n        session.setAttribute(Captcha.CAPTCHA,checkCode);\n        OutputStream os = resp.getOutputStream();\n        ImageIO.write(c.generateCheckImg(checkCode), \"jpg\", os);\n    }\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/java/com/cheng/weixin/web/manage/interceptor/LogInterceptor.java",
    "content": "package com.cheng.weixin.web.manage.interceptor;\n\nimport com.cheng.weixin.common.utils.DateUtils;\nimport com.cheng.weixin.common.utils.SystemUtils;\nimport com.cheng.weixin.rpc.log.service.RpcLogService;\nimport com.cheng.weixin.web.manage.utils.UserUtils;\nimport org.joda.time.DateTime;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.core.NamedThreadLocal;\nimport org.springframework.web.servlet.HandlerInterceptor;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\n\n/**\n * Desc: 日志拦截器\n * Author: Cheng\n * Date: 2016/3/23 0023\n */\npublic class LogInterceptor implements HandlerInterceptor {\n\n    private Logger logger = LoggerFactory.getLogger(LogInterceptor.class);\n\n    @Autowired\n    private RpcLogService logService;\n\n    private ThreadLocal<Long> runTimeThreadLocal = new NamedThreadLocal<>(\"run time ThreadLocal\");\n\n    @Override\n    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {\n        if (logger.isDebugEnabled()) {\n            long beginTime = System.currentTimeMillis(); // 开始时间\n            runTimeThreadLocal.set(beginTime);\n            logger.debug(\"开始时间：{} URI：{}\", new DateTime(beginTime).toString(\"hh:mm:ss.SSS\"), request.getRequestURI());\n        }\n        return true;\n    }\n\n    @Override\n    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {\n        if(modelAndView!=null) {\n            logger.info(\"ViewName：{}\", modelAndView.getViewName());\n        }\n    }\n\n    @Override\n    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {\n        System.out.println(\"===> \"+request.getRequestURI());\n\n        // 保存日志\n        logService.saveLog(SystemUtils.getRemoteAddr(request), request.getHeader(\"user-agent\"), request.getRequestURI(),\n                request.getParameterMap(), request.getMethod(),/*handler,*/ ex, null, UserUtils.getPrincipal().getUsername());\n\n        if (logger.isDebugEnabled()) {\n            long beginTime = runTimeThreadLocal.get(); // 开始时间\n            long endTime = System.currentTimeMillis(); // 结束时间\n            logger.debug(\"计时结束：{} 耗时：{} URI：{} 最大内存：{}m 已分配内存：{}m 已分配内存中的剩余空间：{}m 最大可用内存：{}m\",\n                    new DateTime(endTime).toString(\"hh:mm:ss.SSS\"), DateUtils.formatDateTime(endTime - beginTime),\n                    request.getRequestURI(),\n                    Runtime.getRuntime().maxMemory()/1024/1024,\n                    Runtime.getRuntime().totalMemory()/1024/1024,\n                    Runtime.getRuntime().freeMemory()/1024/1024,\n                    (Runtime.getRuntime().maxMemory()-Runtime.getRuntime().totalMemory()+Runtime.getRuntime().freeMemory())/1024/1024);\n        }\n    }\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/java/com/cheng/weixin/web/manage/security/SystemAuthorizingRealm.java",
    "content": "package com.cheng.weixin.web.manage.security;\n\nimport com.cheng.common.entity.enums.Status;\nimport com.cheng.weixin.common.security.Encodes;\nimport com.cheng.weixin.common.utils.Captcha;\nimport com.cheng.weixin.common.utils.ServletUtils;\nimport com.cheng.weixin.common.utils.StringUtils;\nimport com.cheng.weixin.common.utils.SystemUtils;\nimport com.cheng.weixin.rpc.admin.entity.Admin;\nimport com.cheng.weixin.rpc.admin.entity.Permission;\nimport com.cheng.weixin.rpc.admin.entity.Role;\nimport com.cheng.weixin.rpc.log.service.RpcLogService;\nimport com.cheng.weixin.web.manage.utils.UserUtils;\nimport org.apache.shiro.authc.*;\nimport org.apache.shiro.authz.AuthorizationInfo;\nimport org.apache.shiro.authz.SimpleAuthorizationInfo;\nimport org.apache.shiro.realm.AuthorizingRealm;\nimport org.apache.shiro.subject.PrincipalCollection;\nimport org.apache.shiro.util.ByteSource;\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * Desc: 登录认证与授权\n * Author: Cheng\n * Date: 2016/1/26 0026\n */\npublic class SystemAuthorizingRealm extends AuthorizingRealm {\n    //@Autowired\n    //private RpcAdminService adminService;\n    @Autowired\n    private RpcLogService logService;\n\n    // 返回一个唯一的Realm名字\n    @Override\n    public String getName() {\n        return super.getName();\n    }\n    // 判断此Realm是否支持此Token\n    @Override\n    public boolean supports(AuthenticationToken token) {\n        return token instanceof WxUsernamePasswordToken ;\n    }\n    // 认证\n    @Override\n    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken)\n            throws AuthenticationException {\n        WxUsernamePasswordToken token = (WxUsernamePasswordToken) authenticationToken;\n        // 判断验证码是否正确\n        if (Captcha.isValidateCodeLogin(token.getUsername(), false, false)) {\n            String captcha = (String) UserUtils.getSession().getAttribute(Captcha.CAPTCHA);\n            if (null == token.getCaptcha() || !token.getCaptcha().equalsIgnoreCase(captcha)) {\n                throw new AuthenticationException(\"msg:验证码错误，请重试.\");\n            }\n        }\n        // 校验用户名\n        Admin admin = UserUtils.getAdminByUsername(token.getUsername());\n        if(admin != null) {\n            if(admin.getStatus().equals(Status.LOCKED)) {\n                throw new LockedAccountException(\"msg:该帐号已禁止登录.\");\n            }\n            byte[] salt = Encodes.decodeHex(admin.getPassword().substring(0, 16));\n            return new SimpleAuthenticationInfo(new Principal(admin, token.isMobilelogin()),\n                    admin.getPassword().substring(16), ByteSource.Util.bytes(salt), getName());\n        }\n        return null;\n    }\n    // 授权\n    @Override\n    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {\n        System.out.println(\"=======AuthorizationInfo=======\");\n        Admin admin = UserUtils.getAdminByUsername((String) principalCollection.getPrimaryPrincipal());\n        if (admin != null) {\n            SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();\n            // 添加基于Permissionde权限\n            List<Permission> principals = UserUtils.getPermissions();\n            for (Permission permission : principals) {\n                if (StringUtils.isNotBlank(permission.getPrecode())) {\n                    info.addStringPermission(permission.getPrecode());\n                }\n            }\n            // 添加用户角色信息\n            for (Role role : admin.getRoles()) {\n                info.addRole(role.getEnname());\n            }\n            // 保存日志\n            HttpServletRequest request = ServletUtils.getRequest();\n            logService.saveLog(SystemUtils.getRemoteAddr(request),request.getHeader(\"user-agent\"),request.getRequestURI(),\n                    request.getParameterMap(),request.getMethod(), null, \"系统登录\", UserUtils.getPrincipal().getUsername());\n            return info;\n        }\n\n        return null;\n    }\n\n    /**\n     * 授权信息\n     */\n    public static class Principal implements Serializable {\n        private static final long serialVersionUID = 2866069566032650619L;\n        /** 编号 **/\n        private String id;\n        /** 登录名 **/\n        private String username;\n        /** 是否是手机登录 **/\n        private boolean mobileLogin;\n\n        public Principal(Admin admin, boolean mobileLogin) {\n            this.id = admin.getId();\n            this.username = admin.getUsername();\n            this.mobileLogin = mobileLogin;\n        }\n\n        public String getId() {\n            return id;\n        }\n\n        public void setId(String id) {\n            this.id = id;\n        }\n\n        public String getUsername() {\n            return username;\n        }\n\n        public void setUsername(String username) {\n            this.username = username;\n        }\n\n        public boolean isMobileLogin() {\n            return mobileLogin;\n        }\n\n        public void setMobileLogin(boolean mobileLogin) {\n            this.mobileLogin = mobileLogin;\n        }\n    }\n\n    /**\n     * 设定密码校验的Hash算法与迭代次数\n     * ！这里已在xml配置了 id=hashMatcher\n     */\n    /*@PostConstruct\n    public void initCredentialsMatcher() {\n        HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();\n        // 设置加密方式\n        matcher.setHashAlgorithmName(SecretUtils.HASH_ALGORITHM);\n        // 设置迭代次数\n        matcher.setHashIterations(SecretUtils.HASH_INTERATIONS);\n        // 注入到Shrio里自定义的加密方式\n        setCredentialsMatcher(matcher);\n    }*/\n\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/java/com/cheng/weixin/web/manage/security/WxFormAuthenticationFilter.java",
    "content": "package com.cheng.weixin.web.manage.security;\n\nimport com.cheng.weixin.common.utils.ServletUtils;\nimport com.cheng.weixin.common.utils.StringUtils;\nimport com.cheng.weixin.common.utils.SystemUtils;\nimport com.cheng.weixin.rpc.admin.entity.Admin;\nimport com.cheng.weixin.rpc.admin.service.RpcAdminService;\nimport org.apache.shiro.authc.AuthenticationException;\nimport org.apache.shiro.authc.AuthenticationToken;\nimport org.apache.shiro.authc.IncorrectCredentialsException;\nimport org.apache.shiro.authc.UnknownAccountException;\nimport org.apache.shiro.subject.Subject;\nimport org.apache.shiro.web.filter.authc.FormAuthenticationFilter;\nimport org.apache.shiro.web.util.WebUtils;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport javax.servlet.ServletRequest;\nimport javax.servlet.ServletResponse;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\n\n/**\n * Author: Cheng\n * Date: 2016/1/27 0027\n */\npublic class WxFormAuthenticationFilter extends FormAuthenticationFilter {\n\n    Logger log = LoggerFactory.getLogger(WxFormAuthenticationFilter.class);\n\n    @Autowired\n    private RpcAdminService adminService;\n\n    public static final String DEFAULT_CAPTCHA_PARAM = \"captcha\";\n    public static final String DEFAULT_MOBILE_PARAM = \"mobileLogin\";\n    public static final String DEFAULT_MESSAGE_PARAM = \"message\";\n\n    private String captchaParam = DEFAULT_CAPTCHA_PARAM;\n    private String mobileLoginParam = DEFAULT_MOBILE_PARAM;\n    private String messageParam = DEFAULT_MESSAGE_PARAM;\n\n    @Override\n    protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) {\n        String username = getUsername(request);\n        String password = getPassword(request);\n        if(password==null) {\n            password=\"\";\n        }\n        boolean rememberMe = isRememberMe(request);\n        String host = SystemUtils.getRemoteAddr((HttpServletRequest) request);\n        String captcha = getCaptcha(request);\n        boolean mobile = isMobileLogin(request);\n\n        return new WxUsernamePasswordToken(username, password.toCharArray(), rememberMe, host, mobile, captcha);\n    }\n    // 获取验证码\n    protected String getCaptcha(ServletRequest request) {\n        return WebUtils.getCleanParam(request, getCaptchaParam());\n    }\n    protected boolean isMobileLogin(ServletRequest request) {\n        return WebUtils.isTrue(request, getMobileLoginParam());\n    }\n    public String getMessageParam() {\n        return messageParam;\n    }\n    public String getMobileLoginParam() {\n        return mobileLoginParam;\n    }\n    public String getCaptchaParam() {\n        return captchaParam;\n    }\n\n    @Override\n    protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e,\n                                     ServletRequest request, ServletResponse response) {\n        String className = e.getClass().getName();\n        String message = \"\";\n        if(IncorrectCredentialsException.class.getName().equals(className)\n                || UnknownAccountException.class.getName().equals(className)) {\n            message = \"用户名或密码错误！\";\n        }else if (e.getMessage() != null && StringUtils.startsWith(e.getMessage(), \"msg:\")) {\n            message = StringUtils.replace(e.getMessage(), \"msg:\", \"\");\n        }else {\n            message = \"系统除了点问题请稍后再试！\";\n            log.error(\"发生错误{}\", e.getMessage());\n            e.printStackTrace();\n        }\n        request.setAttribute(getFailureKeyAttribute(), className);// 前台可以显现这些错误\n        request.setAttribute(getMessageParam(), message);// 用户提醒\n        return true;\n    }\n\n    @Override\n    protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request, ServletResponse response) throws Exception {\n        super.onLoginSuccess(token, subject, request, response);\n        SystemAuthorizingRealm.Principal principal = (SystemAuthorizingRealm.Principal) subject.getPrincipal();\n        // 更新登录信息\n        Admin admin = adminService.getAdminById(principal.getId());\n        admin.setNewLoginIp(SystemUtils.getRemoteAddr(ServletUtils.getRequest()));\n        adminService.updateAdminLoginInfo(admin);\n\n        //boolean contextRelative = true;\n        //String successUrl = this.getSuccessUrl();\n        //if(\"\".equals(successUrl)){\n        //    successUrl = DEFAULT_SUCCESS_URL;\n        //}\n        //WebUtils.issueRedirect(request, response, successUrl, null, contextRelative);\n        return false;\n    }\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/java/com/cheng/weixin/web/manage/security/WxUsernamePasswordToken.java",
    "content": "package com.cheng.weixin.web.manage.security;\n\nimport org.apache.commons.lang3.builder.ReflectionToStringBuilder;\nimport org.apache.shiro.authc.UsernamePasswordToken;\n\n/**\n * Author: Cheng\n * Date: 2016/1/26 0026\n */\npublic class WxUsernamePasswordToken extends UsernamePasswordToken {\n    /** 验证码 **/\n    private String captcha;\n    /** 是否是手机登录 **/\n    private boolean mobilelogin;\n\n    public WxUsernamePasswordToken() { super();}\n\n    public WxUsernamePasswordToken(String username, char[] password, boolean rememberMe,\n                                   String host, boolean mobilelogin, String captcha) {\n        super(username, password, rememberMe, host);\n        this.mobilelogin = mobilelogin;\n        this.captcha = captcha;\n    }\n\n    public String getCaptcha() {\n        return captcha;\n    }\n    public void setCaptcha(String captcha) {\n        this.captcha = captcha;\n    }\n    public boolean isMobilelogin() {\n        return mobilelogin;\n    }\n    public void setMobilelogin(boolean mobilelogin) {\n        this.mobilelogin = mobilelogin;\n    }\n\n    @Override\n    public String toString() {\n        return ReflectionToStringBuilder.toString(this);\n    }\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/java/com/cheng/weixin/web/manage/utils/UserUtils.java",
    "content": "package com.cheng.weixin.web.manage.utils;\n\nimport com.cheng.weixin.common.utils.CacheUtils;\nimport com.cheng.weixin.common.utils.SpringContextHolder;\nimport com.cheng.weixin.rpc.admin.entity.Admin;\nimport com.cheng.weixin.rpc.admin.entity.Permission;\nimport com.cheng.weixin.rpc.admin.entity.Role;\nimport com.cheng.weixin.rpc.admin.service.RpcAdminService;\nimport com.cheng.weixin.web.manage.security.SystemAuthorizingRealm;\nimport org.apache.shiro.SecurityUtils;\nimport org.apache.shiro.session.Session;\nimport org.apache.shiro.subject.Subject;\n\nimport java.util.List;\n\n/**\n * Desc: 用户工具\n * Author: Cheng\n * Date: 2016/2/1 0001\n */\npublic class UserUtils {\n\n    private static RpcAdminService adminService = SpringContextHolder.getBean(RpcAdminService.class);\n\n    private static final String ADMIN_CACHE = \"adminCache\";\n    private static final String ADMIN_CACHE_ID_ = \"id_\";\n    private static final String ADMIN_LOGIN_NAME_ = \"login_name_\";\n\n    private static final String CACHE_ROLE_LIST = \"roleList\";\n    private static final String CACHE_PERMISSION_LIST = \"permissionList\";\n\n    /**\n     * 根据ID获取用户\n     * @param id 用户ID\n     * @return 用户对象\n     */\n    public static Admin get(String id) {\n        Admin admin = (Admin) CacheUtils.get(ADMIN_CACHE, ADMIN_CACHE_ID_ + id);\n        if (admin == null) {\n            admin = adminService.getAdminById(id);\n            if (admin == null) {\n                return null;\n            }\n            admin.setRoles(adminService.getRolesByAdminId(admin.getId()));\n            CacheUtils.put(ADMIN_CACHE, ADMIN_LOGIN_NAME_+admin.getId(), admin);\n            CacheUtils.put(ADMIN_CACHE, ADMIN_CACHE_ID_+admin.getUsername(), admin);\n        }\n        return admin;\n    }\n\n    /**\n     * 根据用户名获取用户\n     * @param username 用户名\n     * @return 用户对象\n     */\n    public static Admin getAdminByUsername(String username) {\n        Admin admin = (Admin) CacheUtils.get(ADMIN_CACHE, ADMIN_LOGIN_NAME_ + username);\n        if (admin == null) {\n            admin = adminService.getAdminByUsername(username);\n            if (admin == null) {\n                return null;\n            }\n            admin.setRoles(adminService.getRolesByAdminId(admin.getId()));\n            CacheUtils.put(ADMIN_CACHE, ADMIN_LOGIN_NAME_+admin.getId(), admin);\n            CacheUtils.put(ADMIN_CACHE, ADMIN_CACHE_ID_+admin.getUsername(), admin);\n        }\n        return admin;\n    }\n\n    /**\n     * 清除指定用户缓存\n     * @param admin 用户对象\n     */\n    public static void clearCache(Admin admin) {\n        CacheUtils.remove(ADMIN_CACHE, ADMIN_CACHE_ID_+admin.getId());\n        CacheUtils.remove(ADMIN_CACHE, ADMIN_LOGIN_NAME_+admin.getUsername());\n    }\n\n    public static void clearCache() {\n        removeCache(CACHE_PERMISSION_LIST);\n        removeCache(CACHE_ROLE_LIST);\n        clearCache(getUser());\n    }\n\n    /**\n     * 获取当前用户\n     * @return\n     */\n    public static Admin getUser() {\n        SystemAuthorizingRealm.Principal principal = getPrincipal();\n        if (principal != null) {\n            Admin admin = get(principal.getId());\n            if (admin != null) {\n                return admin;\n            }\n        }\n        return new Admin();\n    }\n    /**\n     * 获取管理员角色\n     * @return\n     */\n    @SuppressWarnings(\"unchecked\")\n    public static List<Role> getRoles() {\n        List<Role> roles = (List<Role>) getCache(CACHE_ROLE_LIST);\n        if (roles == null) {\n            Admin admin = getUser();\n            if (admin.isSuperAdmin()) {\n                // 获取全部资源角色\n                roles = adminService.getAllRoles();\n            } else {\n                // 获取当前管理员的所属角色\n                roles = adminService.getRolesByAdminId(admin.getId());\n            }\n            putCache(CACHE_ROLE_LIST, roles);\n        }\n        return roles;\n    }\n\n    /**\n     * 获取管理员资源权限\n     * @return\n     */\n    @SuppressWarnings(\"unchecked\")\n    public static List<Permission> getPermissions() {\n        List<Permission> permissions = (List<Permission>) getCache(CACHE_PERMISSION_LIST);\n        if (permissions == null) {\n            Admin admin = getUser();\n            if (admin.isSuperAdmin()) {\n                // 获取全部资源权限\n                permissions = adminService.getAllPermissions();\n            } else {\n                // 获取当前管理员的所属权限\n                permissions = adminService.getPermissionByAdminId(admin.getId());\n            }\n            putCache(CACHE_PERMISSION_LIST, permissions);\n        }\n        return permissions;\n    }\n\n    /**\n     * 获取当前登陆者对象\n     * @return\n     */\n    public static SystemAuthorizingRealm.Principal getPrincipal() {\n        Subject subject = SecurityUtils.getSubject();\n        SystemAuthorizingRealm.Principal principal = (SystemAuthorizingRealm.Principal) subject.getPrincipal();\n        if (principal != null) {\n            return principal;\n        }\n        return null;\n    }\n\n    /**\n     * 获得当前用户的Session\n     * @return\n     */\n    public static Session getSession() {\n        Subject currentUser = SecurityUtils.getSubject();\n        Session session = currentUser.getSession(false);\n        if (null == session) {\n            session = currentUser.getSession();\n        }\n        return session;\n    }\n\n    // =====================用户缓存（对于经常变动的缓存放到Session里，用户退出后缓存丢失）================\n    /**\n     * 根据Key获取缓存的数据\n     * @param key\n     * @return\n     */\n    public static Object getCache(String key) {\n        return getCache(key, null);\n    }\n\n    /**\n     * 根据Key获取缓存的数据，如果没有则返回默认值\n     * @param key\n     * @param defaultValue\n     * @return\n     */\n    public static Object getCache(String key, Object defaultValue) {\n        Object obj = getSession().getAttribute(key);\n        return obj == null ? defaultValue : obj;\n    }\n\n    /**\n     * 添加缓存\n     * @param key\n     * @param value\n     */\n    public static void putCache(String key, Object value) {\n        getSession().setAttribute(key, value);\n    }\n\n    /**\n     * 根据Key移除缓存\n     * @param key\n     */\n    public static void removeCache(String key) {\n        getSession().removeAttribute(key);\n    }\n\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/resources/ehcache/ehcache.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ehcache xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:noNamespaceSchemaLocation=\"http://www.ehcache.org/ehcache.xsd\"\n         updateCheck=\"false\" name=\"defaultCache\">\n\n  <diskStore path=\"temp/ehcache\"/>\n  <!-- 默认缓存 -->\n  <defaultCache maxEntriesLocalHeap=\"100\" eternal=\"false\" timeToIdleSeconds=\"300\" timeToLiveSeconds=\"600\"\n                overflowToDisk=\"true\" maxEntriesLocalDisk=\"100000\"/>\n  <!-- 系统缓存 -->\n  <cache name=\"sysCache\" maxEntriesLocalHeap=\"100\" eternal=\"true\" overflowToDisk=\"true\"/>\n\n</ehcache>"
  },
  {
    "path": "weixin-web-manage/src/main/resources/globalconf.properties",
    "content": "#\\u7BA1\\u7406\\u8DEF\\u5F84\nadminPath=/a\n\n\n\n"
  },
  {
    "path": "weixin-web-manage/src/main/resources/log4j.properties",
    "content": "#log4j.rootLogger=DEBUG,FILE\nlog4j.rootLogger=DEBUG,CONSOLE\nlog4j.appender.Threshold=ERROR\n\nlog4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender\nlog4j.appender.CONSOLE.Encoding=UTF-8\nlog4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.CONSOLE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [web-manage] %p [%t] %c-<%L> %m%n\n\n#log4j.appender.FILE=org.apache.log4j.RollingFileAppender\n#log4j.appender.FILE.Encoding=UTF-8\n#log4j.appender.FILE.File=../logs/web-manage.log\n#log4j.appender.FILE.MaxFileSize=4000KB\n#log4j.appender.FILE.MaxBackupIndex=10\n#log4j.appender.FILE.layout=org.apache.log4j.PatternLayout\n#log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [web-manage] %p [%t] %c-<%L> %m%n"
  },
  {
    "path": "weixin-web-manage/src/main/resources/rebel.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<application xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://www.zeroturnaround.com\" xsi:schemaLocation=\"http://www.zeroturnaround.com http://www.zeroturnaround.com/alderaan/rebel-2_0.xsd\">\n\n\t<classpath>\n\t\t<dir name=\"D:/Works/idea/Weixin0.1/weixin-web/target/classes\">\n\t\t</dir>\n\t</classpath>\n\n\t<web>\n\t\t<link target=\"/\">\n\t\t\t<dir name=\"D:/Works/idea/Weixin0.1/weixin-web/src/main/webapp\">\n\t\t\t</dir>\n\t\t</link>\n\t</web>\n\n</application>\n"
  },
  {
    "path": "weixin-web-manage/src/main/resources/spring/applicationContext.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\t\t\t xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t\t xmlns:context=\"http://www.springframework.org/schema/context\"\n\t\t\t xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n\t\t\t\thttp://www.springframework.org/schema/beans/spring-beans-4.2.xsd\n\t\t\t\thttp://www.springframework.org/schema/context\n\t\t\t\thttp://www.springframework.org/schema/context/spring-context-4.2.xsd\">\n\n\t<!-- 打开Spring的Annotation支持 -->\n\t<context:annotation-config />\n\n\t<!-- 扫描注入  -->\n\t<context:component-scan base-package=\"com.cheng.weixin.web.manage\" />\n\t<context:component-scan base-package=\"com.cheng.weixin.common.utils\" />\n\n\t<context:property-placeholder ignore-unresolvable=\"true\" location=\"classpath:globalconf.properties,classpath:system.properties\"/>\n\n\t<!-- ehcache 缓存配置 -->\n\t<bean id=\"cacheManagerFactory\" class=\"org.springframework.cache.ehcache.EhCacheManagerFactoryBean\">\n\t\t<property name=\"configLocation\" value=\"classpath:ehcache/ehcache.xml\"/>\n\t</bean>\n\t<!-- 默认是cacheManager -->\n\t<bean id=\"cacheManager\" class=\"org.springframework.cache.ehcache.EhCacheCacheManager\">\n\t\t<property name=\"cacheManager\"  ref=\"cacheManagerFactory\"/>\n\t</bean>\n\n\t<import resource=\"classpath:spring/spring-shrio.xml\"/>\n\t<import resource=\"classpath:spring/spring-dubbo-consumer.xml\"/>\n</beans>"
  },
  {
    "path": "weixin-web-manage/src/main/resources/spring/spring-dubbo-consumer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n          http://www.springframework.org/schema/beans/spring-beans.xsd\n          http://code.alibabatech.com/schema/dubbo\n          http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n  <dubbo:application name=\"weixin-web-manage\"/>\n  <dubbo:registry id=\"zk1\" address=\"${weixin.dubbo.reistry.address}\" protocol=\"${weixin.dubbo.reistry.protocol}\"/> <!-- 注意要关闭防火墙 -->\n  <dubbo:consumer registry=\"zk1\"/>\n\n  <dubbo:reference id=\"adminService\" interface=\"com.cheng.weixin.rpc.admin.service.RpcAdminService\"\n                   check=\"false\" timeout=\"5000\" version=\"1.0\"/>\n  <dubbo:reference id=\"logService\" interface=\"com.cheng.weixin.rpc.log.service.RpcLogService\"\n                   check=\"false\" timeout=\"5000\" version=\"1.0\"/>\n</beans>\n"
  },
  {
    "path": "weixin-web-manage/src/main/resources/spring/spring-mvc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\t\t\t xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t\t xmlns:context=\"http://www.springframework.org/schema/context\"\n\t\t\t xmlns:mvc=\"http://www.springframework.org/schema/mvc\"\n\t\t\t xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n       http://www.springframework.org/schema/beans/spring-beans.xsd\n       http://www.springframework.org/schema/context\n       http://www.springframework.org/schema/context/spring-context.xsd\n       http://www.springframework.org/schema/mvc\n       http://www.springframework.org/schema/mvc/spring-mvc.xsd\">\n\n\t<!-- 支持注解 -->\n\t<mvc:annotation-driven />\n\n  \t<!-- 对静态资源文件的访问， 将无法mapping到Controller的path交给default servlet handler处理 -->\n  \t<mvc:default-servlet-handler />\n\n\t<!--<mvc:resources mapping=\"/resources/**\" location=\"/static/\" cache-period=\"31536000\"/>-->\n\t<mvc:resources mapping=\"/resources/**\" location=\"/static/\"/>\n\n\t<!-- 扫描controller（controller层注入） -->\n\t<context:component-scan base-package=\"com.cheng.weixin.web.manage.controllers\" use-default-filters=\"false\">\n\t\t<context:include-filter type=\"annotation\" expression=\"org.springframework.stereotype.Controller\"/>\n\t\t<context:include-filter type=\"annotation\" expression=\"org.springframework.web.bind.annotation.ControllerAdvice\"/>\n\t</context:component-scan>\n\n  <!-- 定义无Controller的path <->view直接映射 -->\n  <!--<mvc:view-controller path=\"/\" view-name=\"/index\"/>-->\n\t<mvc:view-controller path=\"/\" view-name=\"redirect:/index\"/> <!-- redirect: 必须加redirect: 不然不会经过controller -->\n\n\t<!-- 对模型视图添加前后缀 -->\n\t<bean id=\"viewResolver\" class=\"org.springframework.web.servlet.view.InternalResourceViewResolver\">\n\t\t<property name=\"viewClass\" value=\"org.springframework.web.servlet.view.JstlView\"/>\n\t\t<property name=\"prefix\" value=\"/WEB-INF/views/\"/>\n\t\t<property name=\"suffix\" value=\".jsp\"/>\n\t</bean>\n\n\t<!-- 拦截器配置，拦截顺序：先执行后定义的，排在第一位的最后执行。-->\n\t<mvc:interceptors>\n\t\t<mvc:interceptor>\n\t\t\t<mvc:mapping path=\"/**\" />\n\t\t\t<mvc:exclude-mapping path=\"/\"/>\n\t\t\t<mvc:exclude-mapping path=\"/resources/**\"/>\n\t\t\t<mvc:exclude-mapping path=\"/manage/drawCheckCode\"/>\n\t\t\t<mvc:exclude-mapping path=\"/login/**\"/>\n\t\t\t<bean class=\"com.cheng.weixin.web.manage.interceptor.LogInterceptor\" />\n\t\t</mvc:interceptor>\n\t</mvc:interceptors>\n\n</beans>"
  },
  {
    "path": "weixin-web-manage/src/main/resources/spring/spring-shrio.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n       http://www.springframework.org/schema/beans/spring-beans.xsd\">\n\n  <!-- Shiro 的Web过滤器 -->\n  <bean id=\"shiroFilter\" class=\"org.apache.shiro.spring.web.ShiroFilterFactoryBean\">\n    <property name=\"securityManager\" ref=\"securityManager\"/>\n    <property name=\"loginUrl\" value=\"/login\"/>\n    <property name=\"successUrl\" value=\"/index\"/>\n    <property name=\"unauthorizedUrl\" value=\"/unauth\"/>\n    <property name=\"filters\">\n      <map>\n        <entry key=\"authc\" value-ref=\"formAuthenticationFilter\"/>\n      </map>\n    </property>\n    <property name=\"filterChainDefinitions\">\n      <value>\n        <!-- 必须通过身份认证方可访问，身份认 证的url必须和过虑器中指定的loginUrl一致 -->\n        /checkCaptcha = anon\n        /login = authc\n        /unauth = anon\n        /resources/** = anon\n        /static/** = anon\n        /drawCheckCode = anon\n        /logout = logout\n        /** = user\n      </value>\n    </property>\n  </bean>\n  <!-- 安全管理器 -->\n  <bean id=\"securityManager\" class=\"org.apache.shiro.web.mgt.DefaultWebSecurityManager\">\n    <property name=\"realm\" ref=\"userRealm\" />\n    <property name=\"sessionManager\" ref=\"sessionManager\"/>\n    <property name=\"cacheManager\" ref=\"shiroCache\"/>\n  </bean>\n\n  <!-- 自定义 realm -->\n  <bean id=\"userRealm\" class=\"com.cheng.weixin.web.manage.security.SystemAuthorizingRealm\">\n    <property name=\"credentialsMatcher\" ref=\"hashMatcher\"/>\n  </bean>\n\n  <!-- 加密规则-->\n  <bean id=\"hashMatcher\" class=\"org.apache.shiro.authc.credential.HashedCredentialsMatcher\">\n    <property name=\"hashAlgorithmName\" value=\"SHA-1\"/>\n    <property name=\"hashIterations\" value=\"1024\"/>\n    <property name=\"hashSalted\" value=\"true\"/>\n  </bean>\n\n  <!-- 会话管理配置 -->\n  <bean id=\"sessionManager\" class=\"org.apache.shiro.web.session.mgt.DefaultWebSessionManager\">\n    <property name=\"sessionDAO\" ref=\"sessionDAO\"/>\n    <property name=\"globalSessionTimeout\" value=\"1800000\"/>\n    <property name=\"sessionIdCookie\" ref=\"sessionIdCookie\"/>\n    <property name=\"sessionIdCookieEnabled\" value=\"true\"/>\n  </bean>\n\n  <!-- 会话ID 生成器  -->\n  <bean id=\"sessionIdGenerator\" class=\"org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator\"/>\n\n  <!-- 会话DAO -->\n  <bean id=\"sessionDAO\" class=\"org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO\">\n    <property name=\"activeSessionsCacheName\" value=\"shiro-activeSessionCache\"/>\n    <property name=\"sessionIdGenerator\" ref=\"sessionIdGenerator\"/>\n    <property name=\"cacheManager\" ref=\"shiroCache\"/>\n  </bean>\n\n  <!-- 会话Cookie 模板  -->\n  <bean id=\"sessionIdCookie\" class=\"org.apache.shiro.web.servlet.SimpleCookie\">\n    <property name=\"name\" value=\"wxsid\"/>\n    <property name=\"httpOnly\" value=\"true\"/>\n    <property name=\"maxAge\" value=\"180000\"/>\n  </bean>\n\n  <!-- 定义授权缓存管理器 -->\n  <bean id=\"shiroCache\" class=\"org.apache.shiro.cache.ehcache.EhCacheManager\">\n    <property name=\"cacheManager\" ref=\"cacheManagerFactory\"/>\n  </bean>\n\n  <bean id=\"formAuthenticationFilter\" class=\"com.cheng.weixin.web.manage.security.WxFormAuthenticationFilter\">\n    <property name=\"usernameParam\" value=\"username\" />\n    <property name=\"passwordParam\" value=\"password\" />\n    <!-- <property name=\"rememberMeParam\" value=\"rememberMe\"/> -->\n    <property name=\"loginUrl\" value=\"/login\" />\n  </bean>\n\n  <!-- Shiro 生命周期处理器-->\n  <bean id=\"lifecycleBeanPostProcessor\" class=\"org.apache.shiro.spring.LifecycleBeanPostProcessor\"/>\n</beans>"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/WEB-INF/include/taglibs.jsp",
    "content": "<%@ page contentType=\"text/html;charset=UTF-8\" %>\n<%@ page language=\"java\" pageEncoding=\"utf-8\" %>\n<%@ taglib prefix=\"c\" uri=\"http://java.sun.com/jsp/jstl/core\" %>\n<%@ taglib prefix=\"fmt\" uri=\"http://java.sun.com/jstl/fmt_rt\" %>\n<%@ taglib prefix=\"sf\" uri=\"http://www.springframework.org/tags/form\"%>\n\n<%@ taglib prefix=\"sys\" tagdir=\"/WEB-INF/tags\" %>\n\n<c:set var=\"basePath\" value=\"${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}\"/>\n<c:set var=\"ctxStatic\" value=\"${basePath}/resources\"/>"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/WEB-INF/tags/captcha.tag",
    "content": "<%@ tag language=\"java\" pageEncoding=\"UTF-8\"%>\n<%@ attribute name=\"name\" type=\"java.lang.String\" required=\"true\" description=\"验证码输入框的名称\"%>\n\n<div class=\"captcha-area m-b\">\n  <input type=\"text\" class=\"form-control captcha\" name=\"${name}\" maxlength=\"4\" required placeholder=\"验证码\"/>\n  <img src=\"${pageContext.request.contextPath}/drawCheckCode\" title=\"点击刷新\" class=\"captchaCode\" onclick=\"$('.captchaCode').attr('src','${pageContext.request.contextPath}/drawCheckCode?'+new Date().getTime());\" style=\"cursor:pointer;\">\n</div>"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/WEB-INF/views/home.jsp",
    "content": "<%@ page contentType=\"text/html;charset=UTF-8\" language=\"java\" %>\n<%@ include file=\"/WEB-INF/include/taglibs.jsp\"%>\n<!DOCTYPE html>\n<html lang=\"zh\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>微信管理后台 - 首页</title>\n  <meta name=\"keywords\" content=\"微信管理后台\">\n  <meta name=\"description\" content=\"基于电商平台\">\n  <link rel=\"shortcut icon\" href=\"favicon.ico\">\n  <link href=\"${ctxStatic}/css/bootstrap.min14ed.css?v=3.3.6\" rel=\"stylesheet\">\n  <link href=\"${ctxStatic}/css/font-awesome.min93e3.css?v=4.4.0\" rel=\"stylesheet\">\n  <!-- Gritter 提示牌-->\n  <link href=\"${ctxStatic}/js/plugins/gritter/jquery.gritter.css\" rel=\"stylesheet\">\n\n  <link href=\"${ctxStatic}/css/animate.min.css\" rel=\"stylesheet\">\n  <link href=\"${ctxStatic}/css/style.min862f.css?v=4.1.0\" rel=\"stylesheet\">\n</head>\n\n<body class=\"gray-bg\">\n<div class=\"wrapper wrapper-content\">\n  <div class=\"row\">\n    <div class=\"col-sm-3\">\n      <div class=\"ibox float-e-margins\">\n        <div class=\"ibox-title\">\n          <span class=\"label label-success pull-right\">当月</span>\n          <h5>收入</h5>\n        </div>\n        <div class=\"ibox-content\">\n          <h1 class=\"no-margins\">6,226.5</h1>\n          <div class=\"stat-percent font-bold text-success\">&yen;6,921 <i class=\"fa fa-bolt\"></i></div>\n          <small>上月收入</small>\n        </div>\n      </div>\n    </div>\n    <div class=\"col-sm-3\">\n      <div class=\"ibox float-e-margins\">\n        <div class=\"ibox-title\">\n          <span class=\"label label-info pull-right\">当月</span>\n          <h5>订单</h5>\n        </div>\n        <div class=\"ibox-content\">\n          <h1 class=\"no-margins\">156</h1>\n          <div class=\"stat-percent font-bold text-info\">126 <i class=\"fa fa-level-up\"></i></div>\n          <small>上月订单</small>\n        </div>\n      </div>\n    </div>\n    <div class=\"col-sm-3\">\n      <div class=\"ibox float-e-margins\">\n        <div class=\"ibox-title\">\n          <span class=\"label label-primary pull-right\">今天</span>\n          <h5>访客</h5>\n        </div>\n        <div class=\"ibox-content\">\n          <h1 class=\"no-margins\">186</h1>\n          <div class=\"stat-percent font-bold text-navy\">6 <i class=\"fa fa-level-up\"></i></div>\n          <small>新访客</small>\n        </div>\n      </div>\n    </div>\n    <div class=\"col-sm-3\">\n      <div class=\"ibox float-e-margins\">\n        <div class=\"ibox-title\">\n          <span class=\"label label-danger pull-right\">最近一个月</span>\n          <h5>活跃用户</h5>\n        </div>\n        <div class=\"ibox-content\">\n          <h1 class=\"no-margins\">368</h1>\n          <div class=\"stat-percent font-bold text-danger\">2% <i class=\"fa fa-level-down\"></i></div>\n          <small>9月</small>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"row\">\n    <div class=\"col-sm-12\">\n      <div class=\"animated fadeInUp\">\n        <div class=\"ibox\">\n          <div class=\"ibox-title\">\n            <h5>实时订单</h5>\n            <div class=\"msg\" style=\"margin-left: 40%; float: left\">更新于 10月25日14:35:17</div>\n            <div class=\"ibox-tools\">\n              <button type=\"button\" id=\"loading-example-btn\" class=\"btn btn-white btn-sm\"><i class=\"fa fa-refresh\"></i> 刷新</button>\n              <a href=\"projects.html\" class=\"btn btn-primary btn-xs\">查看所有订单 &gt;&gt;</a>\n            </div>\n          </div>\n          <div class=\"ibox-content\">\n            <div class=\"project-list\">\n              <table class=\"table table-hover\">\n                <tbody>\n                <tr>\n                  <td class=\"project-status\">\n                    <span class=\"label label-primary\">已付款</span>\n                  </td>\n                  <td class=\"project-title\">\n                    <a href=\"project_detail.html\">张三 - 孙寺镇张楼村张三家 - 18600536683</a>\n                    <br/>\n                    <small><i class=\"fa fa-clock-o\"></i> 2014.08.15 11:25:16</small>\n                  </td>\n                  <td class=\"project-completion\">\n                    6 件商品\n                  </td>\n                  <td class=\"project-people\">\n                    <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"${ctxStatic}/img/a3.jpg\"></a>\n                    <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"${ctxStatic}/img/a1.jpg\"></a>\n                    <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"${ctxStatic}/img/a2.jpg\"></a>\n                    <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"${ctxStatic}/img/a4.jpg\"></a>\n                  </td>\n                  <td class=\"project-actions\">\n                    <a href=\"projects.html#\" class=\"btn btn-white btn-sm\"><i class=\"fa fa-folder\"></i> 查看 </a>\n                  </td>\n                </tr>\n                <tr>\n                  <td class=\"project-status\">\n                    <span class=\"label label-primary\">已付款</span>\n                  </td>\n                  <td class=\"project-title\">\n                    <a href=\"project_detail.html\">张三 - 孙寺镇张楼村张三家 - 18600536683</a>\n                    <br/>\n                    <small><i class=\"fa fa-clock-o\"></i> 2014.08.15 11:25:16</small>\n                  </td>\n                  <td class=\"project-completion\">6 件商品</td>\n                  <td class=\"project-people\">\n                    <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"${ctxStatic}/img/a3.jpg\"></a>\n                    <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"${ctxStatic}/img/a1.jpg\"></a>\n                    <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"${ctxStatic}/img/a1.jpg\"></a>\n                    <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"${ctxStatic}/img/a2.jpg\"></a>\n                    <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"${ctxStatic}/img/a4.jpg\"></a>\n                    <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"${ctxStatic}/img/a4.jpg\"></a>\n                  </td>\n                  <td class=\"project-actions\">\n                    <a href=\"projects.html#\" class=\"btn btn-white btn-sm\"><i class=\"fa fa-folder\"></i> 查看 </a>\n                  </td>\n                </tr>\n                <tr>\n                  <td class=\"project-status\">\n                    <span class=\"label label-primary\">已付款</span>\n                  </td>\n                  <td class=\"project-title\">\n                    <a href=\"project_detail.html\">张三 - 孙寺镇张楼村张三家 - 18600536683</a>\n                    <br/>\n                    <small><i class=\"fa fa-clock-o\"></i> 2014.08.15 11:25:16</small>\n                  </td>\n                  <td class=\"project-completion\">\n                    6 件商品\n                  </td>\n                  <td class=\"project-people\">\n                    <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"${ctxStatic}/img/a3.jpg\"></a>\n                    <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"${ctxStatic}/img/a1.jpg\"></a>\n                    <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"${ctxStatic}/img/a1.jpg\"></a>\n                    <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"${ctxStatic}/img/a2.jpg\"></a>\n                    <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"${ctxStatic}/img/a4.jpg\"></a>\n                    <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"${ctxStatic}/img/a4.jpg\"></a>\n                  </td>\n                  <td class=\"project-actions\">\n                    <a href=\"projects.html#\" class=\"btn btn-white btn-sm\"><i class=\"fa fa-folder\"></i> 查看 </a>\n                  </td>\n                </tr>\n                <tr>\n                  <td class=\"project-status\">\n                    <span class=\"label label-warning\">货到付款</span>\n                  </td>\n                  <td class=\"project-title\">\n                    <a href=\"project_detail.html\">李四 - 孙寺镇郑庄张三家 - 18600536683</a>\n                    <br/>\n                    <small><i class=\"fa fa-clock-o\"></i> 2014.08.15 11:25:16</small>\n                  </td>\n                  <td class=\"project-completion\">\n                    2 件商品\n                  </td>\n                  <td class=\"project-people\">\n                    <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"${ctxStatic}/img/a7.jpg\"></a>\n                    <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"${ctxStatic}/img/a6.jpg\"></a>\n                    <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"${ctxStatic}/img/a3.jpg\"></a>\n                  </td>\n                  <td class=\"project-actions\">\n                    <a href=\"projects.html#\" class=\"btn btn-white btn-sm\"><i class=\"fa fa-folder\"></i> 查看 </a>\n                  </td>\n                </tr>\n                <tr>\n                  <td class=\"project-status\">\n                    <span class=\"label label-default\">已取消</span>\n                  </td>\n                  <td class=\"project-title\">\n                    <a href=\"project_detail.html\">张三 - 孙寺镇刘楼村张三家 - 18600536683</a>\n                    <br/>\n                    <small><i class=\"fa fa-clock-o\"></i> 2014.08.15 11:25:16</small>\n                  </td>\n                  <td class=\"project-completion\">\n                    3 件商品\n                  </td>\n                  <td class=\"project-people\">\n                    <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"${ctxStatic}/img/a1.jpg\"></a>\n                    <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"${ctxStatic}/img/a3.jpg\"></a>\n                  </td>\n                  <td class=\"project-actions\">\n                    <a href=\"projects.html#\" class=\"btn btn-white btn-sm\"><i class=\"fa fa-folder\"></i> 查看 </a>\n                  </td>\n                </tr>\n                </tbody>\n              </table>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"row\">\n    <div class=\"col-sm-4\">\n      <div class=\"ibox float-e-margins\">\n        <div class=\"ibox-title\">\n          <h5>消息</h5>\n          <div class=\"ibox-tools\">\n            <a class=\"collapse-link\"><i class=\"fa fa-chevron-up\"></i></a>\n            <a class=\"close-link\"><i class=\"fa fa-times\"></i></a>\n          </div>\n        </div>\n        <div class=\"ibox-content ibox-heading\">\n          <h3><i class=\"fa fa-envelope-o\"></i> 新消息</h3>\n          <small><i class=\"fa fa-tim\"></i> 您有22条未读消息</small>\n        </div>\n        <div class=\"ibox-content\">\n          <div class=\"feed-activity-list\">\n            <div class=\"feed-element\">\n              <div>\n                <small class=\"pull-right text-navy\">1月前</small>\n                <strong>井幽幽</strong>\n                <div>有人说：“一辈子很长，要跟一个有趣的人在一起”。我想关注我的人，应该是那种喜欢找乐子也乐意分享乐趣的人，你们一定挺优秀的。所以单身的应该在这条留言，互相勾搭一下。特别有钱人又帅可以直接私信我！</div>\n                <small class=\"text-muted\">4月11日 00:00</small>\n              </div>\n            </div>\n            <div class=\"feed-element\">\n              <div>\n                <small class=\"pull-right\">2月前</small>\n                <strong>马伯庸 </strong>\n                <div>又方便，又防水，手感又好，还可以用手机遥控。简直是拍戏利器，由其是跟老师们搭戏的时候…想想还有点小激动啊，嘿嘿。</div>\n                <small class=\"text-muted\">11月8日 20:08 </small>\n              </div>\n            </div>\n            <div class=\"feed-element\">\n              <div>\n                <small class=\"pull-right\">5月前</small>\n                <strong>芒果宓 </strong>\n                <div>一个完整的梦。</div>\n                <small class=\"text-muted\">11月8日 20:08 </small>\n              </div>\n            </div>\n            <div class=\"feed-element\">\n              <div>\n                <small class=\"pull-right\">5月前</small>\n                <strong>刺猬尼克索</strong>\n                <div>哈哈哈哈 你卖什么萌啊! 蠢死了</div>\n                <small class=\"text-muted\">11月8日 20:08 </small>\n              </div>\n            </div>\n            <div class=\"feed-element\">\n              <div>\n                <small class=\"pull-right\">5月前</small>\n                <strong>老刀99</strong>\n                <div>昨天评论里你见过最“温暖和感人”的诗句，整理其中经典100首，值得你收下学习。</div>\n                <small class=\"text-muted\">11月8日 20:08 </small>\n              </div>\n            </div>\n            <div class=\"feed-element\">\n              <div>\n                <small class=\"pull-right\">5月前</small>\n                <strong>娱乐小主 </strong>\n                <div>你是否想过记录自己的梦？你是否想过有自己的一个记梦本？小时候写日记，没得写了就写昨晚的梦，后来变成了习惯………翻了一晚上自己做过的梦，想哭，想笑…</div>\n                <small class=\"text-muted\">11月8日 20:08 </small>\n              </div>\n            </div>\n            <div class=\"feed-element\">\n              <div>\n                <small class=\"pull-right\">5月前</small>\n                <strong>DMG电影 </strong>\n                <div>《和外国男票乘地铁，被中国大妈骂不要脸》妹子实在委屈到不行，中国妹子找外国男友很令人不能接受吗？大家都来说说自己的看法</div>\n                <small class=\"text-muted\">11月8日 20:08 </small>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"col-sm-8\">\n      <div class=\"row\">\n        <div class=\"col-sm-12\">\n          <div class=\"ibox float-e-margins\">\n            <div class=\"ibox-title\">\n              <h5>交易地区</h5>\n              <div class=\"ibox-tools\">\n                <a class=\"collapse-link\"><i class=\"fa fa-chevron-up\"></i></a>\n                <a class=\"close-link\"><i class=\"fa fa-times\"></i></a>\n              </div>\n            </div>\n            <div class=\"ibox-content\">\n              <div class=\"row\">\n                <div class=\"col-sm-12\">\n                  <table class=\"table table-hover margin bottom\">\n                    <thead>\n                    <tr>\n                      <th style=\"width: 12%\" class=\"text-center\">序号</th>\n                      <th>交易</th>\n                      <th class=\"text-center\">日期</th>\n                      <th class=\"text-center\">销售额</th>\n                    </tr>\n                    </thead>\n                    <tbody>\n                    <tr>\n                      <td class=\"text-center\">1</td>\n                      <td>防盗门</td>\n                      <td class=\"text-center small\">2014.9.15</td>\n                      <td class=\"text-center\"><span class=\"label label-primary\">&yen;483.00</span></td>\n                    </tr>\n                    <tr>\n                      <td class=\"text-center\">2</td>\n                      <td>衣柜</td>\n                      <td class=\"text-center small\">2014.9.15</td>\n                      <td class=\"text-center\"><span class=\"label label-primary\">&yen;327.00</span></td>\n                    </tr>\n                    <tr>\n                      <td class=\"text-center\">3</td>\n                      <td>防盗门</td>\n                      <td class=\"text-center small\">2014.9.15</td>\n                      <td class=\"text-center\"><span class=\"label label-warning\">&yen;125.00</span></td>\n\n                    </tr>\n                    <tr>\n                      <td class=\"text-center\">4</td>\n                      <td>橱柜</td>\n                      <td class=\"text-center small\">2014.9.15</td>\n                      <td class=\"text-center\"><span class=\"label label-primary\">&yen;344.00</span></td>\n                    </tr>\n                    <tr>\n                      <td class=\"text-center\">5</td>\n                      <td>手机</td>\n                      <td class=\"text-center small\">2014.9.15</td>\n                      <td class=\"text-center\"><span class=\"label label-primary\">&yen;235.00</span></td>\n                    </tr>\n                    <tr>\n                      <td class=\"text-center\">6</td>\n                      <td>显示器</td>\n                      <td class=\"text-center small\">2014.9.15</td>\n                      <td class=\"text-center\"><span class=\"label label-primary\">&yen;100.00</span></td>\n                    </tr>\n                    </tbody>\n                  </table>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col-sm-6\">\n          <div class=\"ibox float-e-margins\">\n            <div class=\"ibox-title\">\n              <h5>用户项目列表</h5>\n              <div class=\"ibox-tools\">\n                <a class=\"collapse-link\"><i class=\"fa fa-chevron-up\"></i></a>\n                <a class=\"close-link\"><i class=\"fa fa-times\"></i></a>\n              </div>\n            </div>\n            <div class=\"ibox-content\">\n              <table class=\"table table-hover no-margins\">\n                <thead>\n                <tr>\n                  <th>状态</th>\n                  <th>日期</th>\n                  <th>用户</th>\n                  <th>值</th>\n                </tr>\n                </thead>\n                <tbody>\n                <tr>\n                  <td><small>进行中...</small></td>\n                  <td><i class=\"fa fa-clock-o\"></i> 11:20</td>\n                  <td>青衣5858</td>\n                  <td class=\"text-navy\"> <i class=\"fa fa-level-up\"></i> 24%</td>\n                </tr>\n                <tr>\n                  <td><span class=\"label label-warning\">已取消</span></td>\n                  <td><i class=\"fa fa-clock-o\"></i> 10:40</td>\n                  <td>徐子崴</td>\n                  <td class=\"text-navy\"> <i class=\"fa fa-level-up\"></i> 66%</td>\n                </tr>\n                <tr>\n                  <td><small>进行中...</small></td>\n                  <td><i class=\"fa fa-clock-o\"></i> 01:30</td>\n                  <td>姜岚昕</td>\n                  <td class=\"text-navy\"> <i class=\"fa fa-level-up\"></i> 54%</td>\n                </tr>\n                <tr>\n                  <td><small>进行中...</small></td>\n                  <td><i class=\"fa fa-clock-o\"></i> 02:20</td>\n                  <td>武汉大兵哥</td>\n                  <td class=\"text-navy\"> <i class=\"fa fa-level-up\"></i> 12%</td>\n                </tr>\n                <tr>\n                  <td><small>进行中...</small></td>\n                  <td><i class=\"fa fa-clock-o\"></i> 09:40</td>\n                  <td>荆莹儿</td>\n                  <td class=\"text-navy\"> <i class=\"fa fa-level-up\"></i> 22%</td>\n                </tr>\n                <tr>\n                  <td><span class=\"label label-primary\">已完成</span></td>\n                  <td><i class=\"fa fa-clock-o\"></i> 04:10</td>\n                  <td>栾某某</td>\n                  <td class=\"text-navy\"> <i class=\"fa fa-level-up\"></i> 66%</td>\n                </tr>\n                <tr>\n                  <td><small>进行中...</small></td>\n                  <td><i class=\"fa fa-clock-o\"></i> 12:08</td>\n                  <td>范范范二妮</td>\n                  <td class=\"text-navy\"> <i class=\"fa fa-level-up\"></i> 23%</td>\n                </tr>\n                </tbody>\n              </table>\n            </div>\n          </div>\n        </div>\n        <div class=\"col-sm-6\">\n          <div class=\"ibox float-e-margins\">\n            <div class=\"ibox-title\">\n              <h5>任务列表</h5>\n              <div class=\"ibox-tools\">\n                <a class=\"collapse-link\"><i class=\"fa fa-chevron-up\"></i></a>\n                <a class=\"close-link\"><i class=\"fa fa-times\"></i></a>\n              </div>\n            </div>\n            <div class=\"ibox-content\">\n              <ul class=\"todo-list m-t small-list ui-sortable\">\n                <li>\n                  <a href=\"widgets.html#\" class=\"check-link\"><i class=\"fa fa-check-square\"></i> </a>\n                  <span class=\"m-l-xs todo-completed\">开会</span>\n                </li>\n                <li>\n                  <a href=\"widgets.html#\" class=\"check-link\"><i class=\"fa fa-check-square\"></i> </a>\n                  <span class=\"m-l-xs  todo-completed\">项目开发</span>\n                </li>\n                <li>\n                  <a href=\"widgets.html#\" class=\"check-link\"><i class=\"fa fa-square-o\"></i> </a>\n                  <span class=\"m-l-xs\">修改bug</span>\n                  <small class=\"label label-primary\"><i class=\"fa fa-clock-o\"></i> 1小时</small>\n                </li>\n                <li>\n                  <a href=\"widgets.html#\" class=\"check-link\"><i class=\"fa fa-square-o\"></i> </a>\n                  <span class=\"m-l-xs\">修改bug</span>\n                  <small class=\"label label-primary\"><i class=\"fa fa-clock-o\"></i> 1小时</small>\n                </li>\n                <li>\n                  <a href=\"widgets.html#\" class=\"check-link\"><i class=\"fa fa-square-o\"></i> </a>\n                  <span class=\"m-l-xs\">修改bug</span>\n                  <small class=\"label label-primary\"><i class=\"fa fa-clock-o\"></i> 1小时</small>\n                </li>\n                <li>\n                  <a href=\"widgets.html#\" class=\"check-link\"><i class=\"fa fa-square-o\"></i> </a>\n                  <span class=\"m-l-xs\">修改bug</span>\n                  <small class=\"label label-primary\"><i class=\"fa fa-clock-o\"></i> 1小时</small>\n                </li>\n                <li>\n                  <a href=\"widgets.html#\" class=\"check-link\"><i class=\"fa fa-square-o\"></i> </a>\n                  <span class=\"m-l-xs\">修改bug</span>\n                  <small class=\"label label-primary\"><i class=\"fa fa-clock-o\"></i> 1小时</small>\n                </li>\n              </ul>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n<script src=\"${ctxStatic}/js/jquery.min.js?v=2.1.4\"></script>\n<script src=\"${ctxStatic}/js/bootstrap.min.js?v=3.3.6\"></script>\n<script src=\"${ctxStatic}/js/content.min.js?v=1.0.0\"></script>\n<script src=\"${ctxStatic}/js/plugins/jquery-ui/jquery-ui.min.js\"></script>\n<script>\n  $(document).ready(function() {\n    $(\"#loading-example-btn\").click(function() {\n      btn = $(this);\n      simpleLoad(btn, true);\n      simpleLoad(btn, false)\n    })\n  });\n  function simpleLoad(btn, state) {\n    if (state) {\n      btn.children().addClass(\"fa-spin\");\n      btn.contents().last().replaceWith(\" Loading\")\n    } else {\n      setTimeout(function() {\n        btn.children().removeClass(\"fa-spin\");\n        btn.contents().last().replaceWith(\" Refresh\")\n      }, 2000)\n    }\n  };\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/WEB-INF/views/index.jsp",
    "content": "<%@ page contentType=\"text/html;charset=UTF-8\" language=\"java\" %>\n<%@ include file=\"/WEB-INF/include/taglibs.jsp\"%>\n<!DOCTYPE html>\n<html lang=\"zh\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta name=\"renderer\" content=\"webkit\">\n  <meta http-equiv=\"Cache-Control\" content=\"no-siteapp\" />\n  <title>微信管理后台 - 主页</title>\n  <meta name=\"keywords\" content=\"微信管理后台\">\n  <meta name=\"description\" content=\"基于电商平台\">\n  <!--[if lt IE 9]>\n  <meta http-equiv=\"refresh\" content=\"0;ie.html\" />\n  <![endif]-->\n  <link rel=\"shortcut icon\" href=\"${ctxStatic}/favicon.ico\">\n  <link href=\"${ctxStatic}/css/bootstrap.min14ed.css?v=3.3.6\" rel=\"stylesheet\">\n  <link href=\"${ctxStatic}/css/font-awesome.min93e3.css?v=4.4.0\" rel=\"stylesheet\">\n  <link href=\"${ctxStatic}/css/animate.min.css\" rel=\"stylesheet\">\n  <link href=\"${ctxStatic}/css/style.min862f.css?v=4.1.0\" rel=\"stylesheet\">\n</head>\n\n<body class=\"fixed-sidebar full-height-layout gray-bg\" style=\"overflow:hidden\">\n<div id=\"wrapper\">\n  <!--左侧导航开始-->\n  <nav class=\"navbar-default navbar-static-side\" role=\"navigation\">\n    <div class=\"nav-close\"><i class=\"fa fa-times-circle\"></i>\n    </div>\n    <div class=\"sidebar-collapse\">\n      <ul class=\"nav\" id=\"side-menu\">\n        <li class=\"nav-header\">\n          <div class=\"dropdown profile-element\">\n            <span><img alt=\"image\" class=\"img-circle\" src=\"${ctxStatic}/img/profile_small.jpg\" /></span>\n            <a data-toggle=\"dropdown\" class=\"dropdown-toggle\" href=\"#\">\n              <span class=\"clear\">\n                  <span class=\"block m-t-xs\"><strong class=\"font-bold\">Cheng</strong></span>\n                  <span class=\"text-muted text-xs block\">超级管理员<b class=\"caret\"></b></span>\n              </span>\n            </a>\n            <ul class=\"dropdown-menu animated fadeInRight m-t-xs\">\n              <li><a class=\"J_menuItem\" href=\"form_avatar.html\">修改头像</a></li>\n              <li><a class=\"J_menuItem\" href=\"profile.html\">个人资料</a></li>\n              <li class=\"divider\"></li>\n              <li><a href=\"logout\">安全退出</a></li>\n            </ul>\n          </div>\n          <div class=\"logo-element\">Shop</div>\n        </li>\n        <li>\n          <a class=\"J_menuItem\" href=\"home\">\n            <i class=\"fa fa-home\"></i>\n            <span class=\"nav-label\">主页</span>\n          </a>\n        </li>\n      </ul>\n    </div>\n  </nav>\n  <!--左侧导航结束-->\n\n  <!--右侧部分开始-->\n  <div id=\"page-wrapper\" class=\"gray-bg dashbard-1\">\n    <div class=\"row border-bottom\">\n      <nav class=\"navbar navbar-static-top\" role=\"navigation\" style=\"margin-bottom: 0\">\n        <div class=\"navbar-header\">\n          <a class=\"navbar-minimalize minimalize-styl-2 btn btn-primary \" href=\"#\"><i class=\"fa fa-bars\"></i></a>\n          <form role=\"search\" class=\"navbar-form-custom\" method=\"post\" action=\"http://www.zi-han.net/theme/hplus/search_results.html\">\n            <div class=\"form-group\">\n              <input type=\"text\" placeholder=\"请输入您需要查找的内容 …\" class=\"form-control\" name=\"top-search\" id=\"top-search\">\n            </div>\n          </form>\n        </div>\n        <ul class=\"nav navbar-top-links navbar-right\">\n          <li class=\"dropdown\">\n            <a class=\"dropdown-toggle count-info\" data-toggle=\"dropdown\" href=\"#\">\n              <i class=\"fa fa-envelope\"></i> <span class=\"label label-warning\">16</span>\n            </a>\n            <ul class=\"dropdown-menu dropdown-messages\">\n              <li class=\"m-t-xs\">\n                <div class=\"dropdown-messages-box\">\n                  <a href=\"profile.html\" class=\"pull-left\"><img alt=\"image\" class=\"img-circle\" src=\"${ctxStatic}/img/a7.jpg\"></a>\n                  <div class=\"media-body\">\n                    <small class=\"pull-right\">46小时前</small>\n                    <strong>小四</strong> 这个在日本投降书上签字的军官，建国后一定是个不小的干部吧？<br>\n                    <small class=\"text-muted\">3天前 2014.11.8</small>\n                  </div>\n                </div>\n              </li>\n              <li class=\"divider\"></li>\n              <li>\n                <div class=\"dropdown-messages-box\">\n                  <a href=\"profile.html\" class=\"pull-left\"><img alt=\"image\" class=\"img-circle\" src=\"${ctxStatic}/img/a4.jpg\"></a>\n                  <div class=\"media-body \">\n                    <small class=\"pull-right text-navy\">25小时前</small>\n                    <strong>国民岳父</strong> 如何看待“男子不满自己爱犬被称为狗，刺伤路人”？——这人比犬还凶<br>\n                    <small class=\"text-muted\">昨天</small>\n                  </div>\n                </div>\n              </li>\n              <li class=\"divider\"></li>\n              <li>\n                <div class=\"text-center link-block\">\n                  <a class=\"J_menuItem\" href=\"mailbox.html\">\n                    <i class=\"fa fa-envelope\"></i><strong> 查看所有消息</strong>\n                  </a>\n                </div>\n              </li>\n            </ul>\n          </li>\n          <li class=\"dropdown\">\n            <a class=\"dropdown-toggle count-info\" data-toggle=\"dropdown\" href=\"#\">\n              <i class=\"fa fa-bell\"></i> <span class=\"label label-primary\">8</span>\n            </a>\n            <ul class=\"dropdown-menu dropdown-alerts\">\n              <li>\n                <a href=\"mailbox.html\">\n                  <div>\n                    <i class=\"fa fa-envelope fa-fw\"></i> 您有16条未读消息\n                    <span class=\"pull-right text-muted small\">4分钟前</span>\n                  </div>\n                </a>\n              </li>\n              <li class=\"divider\"></li>\n              <li>\n                <a href=\"profile.html\">\n                  <div>\n                    <i class=\"fa fa-qq fa-fw\"></i> 3条新回复\n                    <span class=\"pull-right text-muted small\">12分钟钱</span>\n                  </div>\n                </a>\n              </li>\n              <li class=\"divider\"></li>\n              <li>\n                <div class=\"text-center link-block\">\n                  <a class=\"J_menuItem\" href=\"notifications.html\">\n                    <strong>查看所有 </strong><i class=\"fa fa-angle-right\"></i>\n                  </a>\n                </div>\n              </li>\n            </ul>\n          </li>\n          <li class=\"dropdown hidden-xs\">\n            <a class=\"right-sidebar-toggle\" aria-expanded=\"false\"><i class=\"fa fa-tasks\"></i> 主题</a>\n          </li>\n        </ul>\n      </nav>\n    </div>\n    <div class=\"row content-tabs\">\n      <button class=\"roll-nav roll-left J_tabLeft\"><i class=\"fa fa-backward\"></i>\n      </button>\n      <nav class=\"page-tabs J_menuTabs\">\n        <div class=\"page-tabs-content\">\n          <a href=\"javascript:;\" class=\"active J_menuTab\" data-id=\"home\">首页</a>\n        </div>\n      </nav>\n      <button class=\"roll-nav roll-right J_tabRight\"><i class=\"fa fa-forward\"></i>\n      </button>\n      <div class=\"btn-group roll-nav roll-right\">\n        <button class=\"dropdown J_tabClose\" data-toggle=\"dropdown\">关闭操作<span class=\"caret\"></span></button>\n        <ul role=\"menu\" class=\"dropdown-menu dropdown-menu-right\">\n          <li class=\"J_tabShowActive\"><a>定位当前选项卡</a></li>\n          <li class=\"divider\"></li>\n          <li class=\"J_tabCloseAll\"><a>关闭全部选项卡</a></li>\n          <li class=\"J_tabCloseOther\"><a>关闭其他选项卡</a></li>\n        </ul>\n      </div>\n      <a href=\"logout\" class=\"roll-nav roll-right J_tabExit\"><i class=\"fa fa fa-sign-out\"></i> 退出</a>\n    </div>\n    <div class=\"row J_mainContent\" id=\"content-main\">\n      <iframe class=\"J_iframe\" name=\"iframe0\" width=\"100%\" height=\"100%\" src=\"home\" frameborder=\"0\" data-id=\"home\" seamless></iframe>\n    </div>\n    <div class=\"footer\">\n      <div class=\"pull-right\">By Cheng &copy; 2015-2016</div>\n    </div>\n  </div>\n  <!--右侧部分结束-->\n\n  <!--右侧边栏开始-->\n  <div id=\"right-sidebar\">\n    <div class=\"sidebar-container\">\n      <ul class=\"nav nav-tabs navs-2\">\n        <li class=\"active\"><a data-toggle=\"tab\" href=\"#tab-1\"><i class=\"fa fa-gear\"></i> 主题</a></li>\n        <li class=\"\"><a data-toggle=\"tab\" href=\"#tab-2\">通知</a></li>\n      </ul>\n      <div class=\"tab-content\">\n        <div id=\"tab-1\" class=\"tab-pane active\">\n          <div class=\"sidebar-title\">\n            <h3><i class=\"fa fa-comments-o\"></i> 主题设置</h3>\n            <small><i class=\"fa fa-tim\"></i> 你可以从这里选择和预览主题的布局和样式，这些设置会被保存在本地，下次打开的时候会直接应用这些设置。</small>\n          </div>\n          <div class=\"skin-setttings\">\n            <div class=\"title\">主题设置</div>\n            <div class=\"setings-item\">\n              <span>收起左侧菜单</span>\n              <div class=\"switch\">\n                <div class=\"onoffswitch\">\n                  <input type=\"checkbox\" name=\"collapsemenu\" class=\"onoffswitch-checkbox\" id=\"collapsemenu\">\n                  <label class=\"onoffswitch-label\" for=\"collapsemenu\">\n                    <span class=\"onoffswitch-inner\"></span>\n                    <span class=\"onoffswitch-switch\"></span>\n                  </label>\n                </div>\n              </div>\n            </div>\n            <div class=\"setings-item\">\n              <span>固定顶部</span>\n              <div class=\"switch\">\n                <div class=\"onoffswitch\">\n                  <input type=\"checkbox\" name=\"fixednavbar\" class=\"onoffswitch-checkbox\" id=\"fixednavbar\">\n                  <label class=\"onoffswitch-label\" for=\"fixednavbar\">\n                    <span class=\"onoffswitch-inner\"></span><span class=\"onoffswitch-switch\"></span>\n                  </label>\n                </div>\n              </div>\n            </div>\n            <div class=\"setings-item\">\n              <span>固定宽度</span>\n              <div class=\"switch\">\n                <div class=\"onoffswitch\">\n                  <input type=\"checkbox\" name=\"boxedlayout\" class=\"onoffswitch-checkbox\" id=\"boxedlayout\">\n                  <label class=\"onoffswitch-label\" for=\"boxedlayout\">\n                    <span class=\"onoffswitch-inner\"></span><span class=\"onoffswitch-switch\"></span>\n                  </label>\n                </div>\n              </div>\n            </div>\n            <div class=\"title\">皮肤选择</div>\n            <div class=\"setings-item default-skin nb\">\n              <span class=\"skin-name \"><a href=\"#\" class=\"s-skin-0\">默认皮肤</a></span>\n            </div>\n            <div class=\"setings-item blue-skin nb\">\n              <span class=\"skin-name \"><a href=\"#\" class=\"s-skin-1\">蓝色主题</a></span>\n            </div>\n            <div class=\"setings-item yellow-skin nb\">\n              <span class=\"skin-name \"><a href=\"#\" class=\"s-skin-3\">黄色/紫色主题</a></span>\n            </div>\n          </div>\n        </div>\n        <div id=\"tab-2\" class=\"tab-pane\">\n          <div class=\"sidebar-title\">\n            <h3> <i class=\"fa fa-comments-o\"></i> 最新通知</h3>\n            <small><i class=\"fa fa-tim\"></i> 您当前有2条未读信息</small>\n          </div>\n          <div>\n            <div class=\"sidebar-message\">\n              <a href=\"#\">\n                <div class=\"pull-left text-center\">\n                  <img alt=\"image\" class=\"img-circle message-avatar\" src=\"${ctxStatic}/img/a1.jpg\">\n                  <div class=\"m-t-xs\">\n                    <i class=\"fa fa-star text-warning\"></i>\n                    <i class=\"fa fa-star text-warning\"></i>\n                  </div>\n                </div>\n                <div class=\"media-body\">\n                  据天津日报报道：瑞海公司董事长于学伟，副董事长董社轩等10人在13日上午已被控制。<br>\n                  <small class=\"text-muted\">今天 4:21</small>\n                </div>\n              </a>\n            </div>\n            <div class=\"sidebar-message\">\n              <a href=\"#\">\n                <div class=\"pull-left text-center\">\n                  <img alt=\"image\" class=\"img-circle message-avatar\" src=\"${ctxStatic}/img/a2.jpg\">\n                </div>\n                <div class=\"media-body\">\n                  HCY48之音乐大魔王会员专属皮肤已上线，快来一键换装拥有他，宣告你对华晨宇的爱吧！<br>\n                  <small class=\"text-muted\">昨天 2:45</small>\n                </div>\n              </a>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n  <!--右侧边栏结束-->\n</div>\n<script src=\"${ctxStatic}/js/jquery.min.js?v=2.1.4\"></script>\n<script src=\"${ctxStatic}/js/bootstrap.min.js?v=3.3.6\"></script>\n<script src=\"${ctxStatic}/js/plugins/metisMenu/jquery.metisMenu.js\"></script>\n<script src=\"${ctxStatic}/js/plugins/slimscroll/jquery.slimscroll.min.js\"></script>\n<script src=\"${ctxStatic}/js/plugins/layer/layer.min.js\"></script>\n<script src=\"${ctxStatic}/js/hplus.min.js?v=4.1.0\"></script>\n<script src=\"${ctxStatic}/js/contabs.min.js\" type=\"text/javascript\"></script>\n<script src=\"${ctxStatic}/js/plugins/pace/pace.min.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/WEB-INF/views/login.jsp",
    "content": "<%@ page contentType=\"text/html;charset=UTF-8\" language=\"java\" %>\n<%@ include file=\"/WEB-INF/include/taglibs.jsp\"%>\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0\">\n  <title>微信管理后台 - 登录</title>\n  <meta name=\"keywords\" content=\"微信管理后台\">\n  <meta name=\"description\" content=\"基于电商平台\">\n  <link href=\"${ctxStatic}/css/bootstrap.min.css\" rel=\"stylesheet\">\n  <link href=\"${ctxStatic}/css/font-awesome.min93e3.css?v=4.4.0\" rel=\"stylesheet\">\n  <link href=\"${ctxStatic}/css/animate.min.css\" rel=\"stylesheet\">\n  <link href=\"${ctxStatic}/css/plugins/toastr/toastr.min.css\" rel=\"stylesheet\">\n  <link href=\"${ctxStatic}/css/style.min.css\" rel=\"stylesheet\">\n  <link href=\"${ctxStatic}/css/login.min.css\" rel=\"stylesheet\">\n  <!--[if lt IE 9]>\n  <meta http-equiv=\"refresh\" content=\"0;ie.html\" />\n  <![endif]-->\n  <style>\n    .layui-layer-content {\n      color: #666;\n    }\n  </style>\n</head>\n\n<body class=\"signin\">\n<div class=\"signinpanel\">\n  <div class=\"row\">\n    <div class=\"col-sm-7\">\n      <div class=\"signin-info\">\n        <div class=\"logopanel m-b\">\n          <h1>[ WeiXin-Shop ]</h1>\n        </div>\n        <div class=\"m-b\"></div>\n        <h4>欢迎使用 <strong>微信管理后台</strong></h4>\n        <ul class=\"m-b\">\n          <li><i class=\"fa fa-arrow-circle-o-right m-r-xs\"></i> 优势一</li>\n          <li><i class=\"fa fa-arrow-circle-o-right m-r-xs\"></i> 优势二</li>\n          <li><i class=\"fa fa-arrow-circle-o-right m-r-xs\"></i> 优势三</li>\n          <li><i class=\"fa fa-arrow-circle-o-right m-r-xs\"></i> 优势四</li>\n          <li><i class=\"fa fa-arrow-circle-o-right m-r-xs\"></i> 优势五</li>\n        </ul>\n        <!--<strong>还没有账号？ <a href=\"#\">立即注册&raquo;</a></strong>-->\n      </div>\n    </div>\n    <div class=\"col-sm-5\">\n      <form action=\"${basePath}/login\" method=\"post\">\n        <h4 class=\"no-margins\">登录：</h4>\n        <p class=\"m-t-md\">登录到微信管理后台</p>\n        <input type=\"text\" class=\"form-control m-b uname\" name=\"username\" required value=\"${username}\" placeholder=\"用户名\" />\n        <input type=\"password\" class=\"form-control m-b pword\" name=\"password\" required placeholder=\"密码\" />\n        <c:if test=\"${isValidateCodeLogin}\">\n          <sys:captcha name=\"captcha\"/>\n        </c:if>\n        <a id=\"forgetPwd\" href=\"javascript:\">忘记密码了？</a>\n        <button class=\"btn btn-success btn-block\">登录</button>\n      </form>\n    </div>\n  </div>\n  <div class=\"signup-footer\">\n    <div class=\"pull-left\">\n      Copyright &copy; 2015-2016 <a href=\"javascript:\">微信管理后台</a> Powered By Wxin v0.1\n    </div>\n  </div>\n</div>\n\n<script src=\"${ctxStatic}/js/jquery.min.js?v=2.1.4\"></script>\n<script src=\"${ctxStatic}/js/bootstrap.min.js?v=3.3.6\"></script>\n<script src=\"${ctxStatic}/js/plugins/toastr/toastr.min.js\"></script>\n<script src=\"${ctxStatic}/js/plugins/layer/layer.min.js\"></script>\n<script >\n  $(function() {\n    // 错误消息\n    if (\"${message}\") {\n      var msg = \"<h3>${message}</h3>\";\n      toastr.options = {\n        \"closeButton\": true,\n        \"debug\": false,\n        \"progressBar\": true,\n        \"positionClass\": \"toast-top-right\",\n        \"onclick\": null,\n        \"showDuration\": \"400\",\n        \"hideDuration\": \"400\",\n        \"timeOut\": \"7000\",\n        \"extendedTimeOut\": \"1000\",\n        \"showEasing\": \"swing\",\n        \"hideEasing\": \"linear\",\n        \"showMethod\": \"fadeIn\",\n        \"hideMethod\": \"fadeOut\"\n      }\n      toastr[\"error\"](msg);\n    }\n\n    // 忘记密码提示\n    $(\"#forgetPwd\").click(function(){\n      parent.layer.alert('<h4>请联系管理员: 18600536683</h4>', {\n        skin: 'layui-layer-molv'\n      });\n    });\n  });\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/WEB-INF/views/test.jsp",
    "content": "<html>\n<body>\n<h2>Hello World!-testq</h2>\n\n<h1>${content}</h1>\n\n</body>\n</html>\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/WEB-INF/web.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<web-app xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns=\"http://java.sun.com/xml/ns/javaee\"\n\txsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee\n\t\thttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\" version=\"3.0\">\n  <description>weixin-manage</description>\n  <context-param>\n    <param-name>contextConfigLocation</param-name>\n    <param-value>classpath:spring/applicationContext.xml</param-value>\n  </context-param>\n  <listener>\n    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>\n  </listener>\n  <listener>\n    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>\n  </listener>\n\n  <filter>\n    <filter-name>SpringEncodingFilter</filter-name>\n    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>\n    <init-param>\n      <param-name>encoding</param-name>\n      <param-value>UTF-8</param-value>\n    </init-param>\n    <init-param>\n      <param-name>forceEncoding</param-name>\n      <param-value>true</param-value>\n    </init-param>\n  </filter>\n  <filter-mapping>\n    <filter-name>SpringEncodingFilter</filter-name>\n    <url-pattern>/*</url-pattern>\n  </filter-mapping>\n\n  <servlet>\n    <servlet-name>dispatcher</servlet-name>\n    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>\n    <init-param>\n      <param-name>contextConfigLocation</param-name>\n      <param-value>classpath:/spring/spring-mvc.xml</param-value>\n    </init-param>\n    <load-on-startup>1</load-on-startup>\n  </servlet>\n  <servlet-mapping>\n    <servlet-name>dispatcher</servlet-name>\n    <url-pattern>/</url-pattern>\n  </servlet-mapping>\n\n  <!-- shiro security filter -->\n  <filter>\n    <filter-name>shiroFilter</filter-name>\n    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>\n    <init-param>\n      <param-name>targetFilterLifecycle</param-name>\n      <param-value>true</param-value>\n    </init-param>\n  </filter>\n  <filter-mapping>\n    <filter-name>shiroFilter</filter-name>\n    <url-pattern>/*</url-pattern>\n  </filter-mapping>\n\n  <welcome-file-list>\n    <welcome-file>index.jsp</welcome-file>\n  </welcome-file-list>\n</web-app>"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/bootstrap.min14ed.css",
    "content": "/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:\" (\" attr(href) \")\"}abbr[title]:after{content:\" (\" attr(title) \")\"}a[href^=\"javascript:\"]:after,a[href^=\"#\"]:after{content:\"\"}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regulard41d.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:\"\\002a\"}.glyphicon-plus:before{content:\"\\002b\"}.glyphicon-eur:before,.glyphicon-euro:before{content:\"\\20ac\"}.glyphicon-minus:before{content:\"\\2212\"}.glyphicon-cloud:before{content:\"\\2601\"}.glyphicon-envelope:before{content:\"\\2709\"}.glyphicon-pencil:before{content:\"\\270f\"}.glyphicon-glass:before{content:\"\\e001\"}.glyphicon-music:before{content:\"\\e002\"}.glyphicon-search:before{content:\"\\e003\"}.glyphicon-heart:before{content:\"\\e005\"}.glyphicon-star:before{content:\"\\e006\"}.glyphicon-star-empty:before{content:\"\\e007\"}.glyphicon-user:before{content:\"\\e008\"}.glyphicon-film:before{content:\"\\e009\"}.glyphicon-th-large:before{content:\"\\e010\"}.glyphicon-th:before{content:\"\\e011\"}.glyphicon-th-list:before{content:\"\\e012\"}.glyphicon-ok:before{content:\"\\e013\"}.glyphicon-remove:before{content:\"\\e014\"}.glyphicon-zoom-in:before{content:\"\\e015\"}.glyphicon-zoom-out:before{content:\"\\e016\"}.glyphicon-off:before{content:\"\\e017\"}.glyphicon-signal:before{content:\"\\e018\"}.glyphicon-cog:before{content:\"\\e019\"}.glyphicon-trash:before{content:\"\\e020\"}.glyphicon-home:before{content:\"\\e021\"}.glyphicon-file:before{content:\"\\e022\"}.glyphicon-time:before{content:\"\\e023\"}.glyphicon-road:before{content:\"\\e024\"}.glyphicon-download-alt:before{content:\"\\e025\"}.glyphicon-download:before{content:\"\\e026\"}.glyphicon-upload:before{content:\"\\e027\"}.glyphicon-inbox:before{content:\"\\e028\"}.glyphicon-play-circle:before{content:\"\\e029\"}.glyphicon-repeat:before{content:\"\\e030\"}.glyphicon-refresh:before{content:\"\\e031\"}.glyphicon-list-alt:before{content:\"\\e032\"}.glyphicon-lock:before{content:\"\\e033\"}.glyphicon-flag:before{content:\"\\e034\"}.glyphicon-headphones:before{content:\"\\e035\"}.glyphicon-volume-off:before{content:\"\\e036\"}.glyphicon-volume-down:before{content:\"\\e037\"}.glyphicon-volume-up:before{content:\"\\e038\"}.glyphicon-qrcode:before{content:\"\\e039\"}.glyphicon-barcode:before{content:\"\\e040\"}.glyphicon-tag:before{content:\"\\e041\"}.glyphicon-tags:before{content:\"\\e042\"}.glyphicon-book:before{content:\"\\e043\"}.glyphicon-bookmark:before{content:\"\\e044\"}.glyphicon-print:before{content:\"\\e045\"}.glyphicon-camera:before{content:\"\\e046\"}.glyphicon-font:before{content:\"\\e047\"}.glyphicon-bold:before{content:\"\\e048\"}.glyphicon-italic:before{content:\"\\e049\"}.glyphicon-text-height:before{content:\"\\e050\"}.glyphicon-text-width:before{content:\"\\e051\"}.glyphicon-align-left:before{content:\"\\e052\"}.glyphicon-align-center:before{content:\"\\e053\"}.glyphicon-align-right:before{content:\"\\e054\"}.glyphicon-align-justify:before{content:\"\\e055\"}.glyphicon-list:before{content:\"\\e056\"}.glyphicon-indent-left:before{content:\"\\e057\"}.glyphicon-indent-right:before{content:\"\\e058\"}.glyphicon-facetime-video:before{content:\"\\e059\"}.glyphicon-picture:before{content:\"\\e060\"}.glyphicon-map-marker:before{content:\"\\e062\"}.glyphicon-adjust:before{content:\"\\e063\"}.glyphicon-tint:before{content:\"\\e064\"}.glyphicon-edit:before{content:\"\\e065\"}.glyphicon-share:before{content:\"\\e066\"}.glyphicon-check:before{content:\"\\e067\"}.glyphicon-move:before{content:\"\\e068\"}.glyphicon-step-backward:before{content:\"\\e069\"}.glyphicon-fast-backward:before{content:\"\\e070\"}.glyphicon-backward:before{content:\"\\e071\"}.glyphicon-play:before{content:\"\\e072\"}.glyphicon-pause:before{content:\"\\e073\"}.glyphicon-stop:before{content:\"\\e074\"}.glyphicon-forward:before{content:\"\\e075\"}.glyphicon-fast-forward:before{content:\"\\e076\"}.glyphicon-step-forward:before{content:\"\\e077\"}.glyphicon-eject:before{content:\"\\e078\"}.glyphicon-chevron-left:before{content:\"\\e079\"}.glyphicon-chevron-right:before{content:\"\\e080\"}.glyphicon-plus-sign:before{content:\"\\e081\"}.glyphicon-minus-sign:before{content:\"\\e082\"}.glyphicon-remove-sign:before{content:\"\\e083\"}.glyphicon-ok-sign:before{content:\"\\e084\"}.glyphicon-question-sign:before{content:\"\\e085\"}.glyphicon-info-sign:before{content:\"\\e086\"}.glyphicon-screenshot:before{content:\"\\e087\"}.glyphicon-remove-circle:before{content:\"\\e088\"}.glyphicon-ok-circle:before{content:\"\\e089\"}.glyphicon-ban-circle:before{content:\"\\e090\"}.glyphicon-arrow-left:before{content:\"\\e091\"}.glyphicon-arrow-right:before{content:\"\\e092\"}.glyphicon-arrow-up:before{content:\"\\e093\"}.glyphicon-arrow-down:before{content:\"\\e094\"}.glyphicon-share-alt:before{content:\"\\e095\"}.glyphicon-resize-full:before{content:\"\\e096\"}.glyphicon-resize-small:before{content:\"\\e097\"}.glyphicon-exclamation-sign:before{content:\"\\e101\"}.glyphicon-gift:before{content:\"\\e102\"}.glyphicon-leaf:before{content:\"\\e103\"}.glyphicon-fire:before{content:\"\\e104\"}.glyphicon-eye-open:before{content:\"\\e105\"}.glyphicon-eye-close:before{content:\"\\e106\"}.glyphicon-warning-sign:before{content:\"\\e107\"}.glyphicon-plane:before{content:\"\\e108\"}.glyphicon-calendar:before{content:\"\\e109\"}.glyphicon-random:before{content:\"\\e110\"}.glyphicon-comment:before{content:\"\\e111\"}.glyphicon-magnet:before{content:\"\\e112\"}.glyphicon-chevron-up:before{content:\"\\e113\"}.glyphicon-chevron-down:before{content:\"\\e114\"}.glyphicon-retweet:before{content:\"\\e115\"}.glyphicon-shopping-cart:before{content:\"\\e116\"}.glyphicon-folder-close:before{content:\"\\e117\"}.glyphicon-folder-open:before{content:\"\\e118\"}.glyphicon-resize-vertical:before{content:\"\\e119\"}.glyphicon-resize-horizontal:before{content:\"\\e120\"}.glyphicon-hdd:before{content:\"\\e121\"}.glyphicon-bullhorn:before{content:\"\\e122\"}.glyphicon-bell:before{content:\"\\e123\"}.glyphicon-certificate:before{content:\"\\e124\"}.glyphicon-thumbs-up:before{content:\"\\e125\"}.glyphicon-thumbs-down:before{content:\"\\e126\"}.glyphicon-hand-right:before{content:\"\\e127\"}.glyphicon-hand-left:before{content:\"\\e128\"}.glyphicon-hand-up:before{content:\"\\e129\"}.glyphicon-hand-down:before{content:\"\\e130\"}.glyphicon-circle-arrow-right:before{content:\"\\e131\"}.glyphicon-circle-arrow-left:before{content:\"\\e132\"}.glyphicon-circle-arrow-up:before{content:\"\\e133\"}.glyphicon-circle-arrow-down:before{content:\"\\e134\"}.glyphicon-globe:before{content:\"\\e135\"}.glyphicon-wrench:before{content:\"\\e136\"}.glyphicon-tasks:before{content:\"\\e137\"}.glyphicon-filter:before{content:\"\\e138\"}.glyphicon-briefcase:before{content:\"\\e139\"}.glyphicon-fullscreen:before{content:\"\\e140\"}.glyphicon-dashboard:before{content:\"\\e141\"}.glyphicon-paperclip:before{content:\"\\e142\"}.glyphicon-heart-empty:before{content:\"\\e143\"}.glyphicon-link:before{content:\"\\e144\"}.glyphicon-phone:before{content:\"\\e145\"}.glyphicon-pushpin:before{content:\"\\e146\"}.glyphicon-usd:before{content:\"\\e148\"}.glyphicon-gbp:before{content:\"\\e149\"}.glyphicon-sort:before{content:\"\\e150\"}.glyphicon-sort-by-alphabet:before{content:\"\\e151\"}.glyphicon-sort-by-alphabet-alt:before{content:\"\\e152\"}.glyphicon-sort-by-order:before{content:\"\\e153\"}.glyphicon-sort-by-order-alt:before{content:\"\\e154\"}.glyphicon-sort-by-attributes:before{content:\"\\e155\"}.glyphicon-sort-by-attributes-alt:before{content:\"\\e156\"}.glyphicon-unchecked:before{content:\"\\e157\"}.glyphicon-expand:before{content:\"\\e158\"}.glyphicon-collapse-down:before{content:\"\\e159\"}.glyphicon-collapse-up:before{content:\"\\e160\"}.glyphicon-log-in:before{content:\"\\e161\"}.glyphicon-flash:before{content:\"\\e162\"}.glyphicon-log-out:before{content:\"\\e163\"}.glyphicon-new-window:before{content:\"\\e164\"}.glyphicon-record:before{content:\"\\e165\"}.glyphicon-save:before{content:\"\\e166\"}.glyphicon-open:before{content:\"\\e167\"}.glyphicon-saved:before{content:\"\\e168\"}.glyphicon-import:before{content:\"\\e169\"}.glyphicon-export:before{content:\"\\e170\"}.glyphicon-send:before{content:\"\\e171\"}.glyphicon-floppy-disk:before{content:\"\\e172\"}.glyphicon-floppy-saved:before{content:\"\\e173\"}.glyphicon-floppy-remove:before{content:\"\\e174\"}.glyphicon-floppy-save:before{content:\"\\e175\"}.glyphicon-floppy-open:before{content:\"\\e176\"}.glyphicon-credit-card:before{content:\"\\e177\"}.glyphicon-transfer:before{content:\"\\e178\"}.glyphicon-cutlery:before{content:\"\\e179\"}.glyphicon-header:before{content:\"\\e180\"}.glyphicon-compressed:before{content:\"\\e181\"}.glyphicon-earphone:before{content:\"\\e182\"}.glyphicon-phone-alt:before{content:\"\\e183\"}.glyphicon-tower:before{content:\"\\e184\"}.glyphicon-stats:before{content:\"\\e185\"}.glyphicon-sd-video:before{content:\"\\e186\"}.glyphicon-hd-video:before{content:\"\\e187\"}.glyphicon-subtitles:before{content:\"\\e188\"}.glyphicon-sound-stereo:before{content:\"\\e189\"}.glyphicon-sound-dolby:before{content:\"\\e190\"}.glyphicon-sound-5-1:before{content:\"\\e191\"}.glyphicon-sound-6-1:before{content:\"\\e192\"}.glyphicon-sound-7-1:before{content:\"\\e193\"}.glyphicon-copyright-mark:before{content:\"\\e194\"}.glyphicon-registration-mark:before{content:\"\\e195\"}.glyphicon-cloud-download:before{content:\"\\e197\"}.glyphicon-cloud-upload:before{content:\"\\e198\"}.glyphicon-tree-conifer:before{content:\"\\e199\"}.glyphicon-tree-deciduous:before{content:\"\\e200\"}.glyphicon-cd:before{content:\"\\e201\"}.glyphicon-save-file:before{content:\"\\e202\"}.glyphicon-open-file:before{content:\"\\e203\"}.glyphicon-level-up:before{content:\"\\e204\"}.glyphicon-copy:before{content:\"\\e205\"}.glyphicon-paste:before{content:\"\\e206\"}.glyphicon-alert:before{content:\"\\e209\"}.glyphicon-equalizer:before{content:\"\\e210\"}.glyphicon-king:before{content:\"\\e211\"}.glyphicon-queen:before{content:\"\\e212\"}.glyphicon-pawn:before{content:\"\\e213\"}.glyphicon-bishop:before{content:\"\\e214\"}.glyphicon-knight:before{content:\"\\e215\"}.glyphicon-baby-formula:before{content:\"\\e216\"}.glyphicon-tent:before{content:\"\\26fa\"}.glyphicon-blackboard:before{content:\"\\e218\"}.glyphicon-bed:before{content:\"\\e219\"}.glyphicon-apple:before{content:\"\\f8ff\"}.glyphicon-erase:before{content:\"\\e221\"}.glyphicon-hourglass:before{content:\"\\231b\"}.glyphicon-lamp:before{content:\"\\e223\"}.glyphicon-duplicate:before{content:\"\\e224\"}.glyphicon-piggy-bank:before{content:\"\\e225\"}.glyphicon-scissors:before{content:\"\\e226\"}.glyphicon-bitcoin:before{content:\"\\e227\"}.glyphicon-btc:before{content:\"\\e227\"}.glyphicon-xbt:before{content:\"\\e227\"}.glyphicon-yen:before{content:\"\\00a5\"}.glyphicon-jpy:before{content:\"\\00a5\"}.glyphicon-ruble:before{content:\"\\20bd\"}.glyphicon-rub:before{content:\"\\20bd\"}.glyphicon-scale:before{content:\"\\e230\"}.glyphicon-ice-lolly:before{content:\"\\e231\"}.glyphicon-ice-lolly-tasted:before{content:\"\\e232\"}.glyphicon-education:before{content:\"\\e233\"}.glyphicon-option-horizontal:before{content:\"\\e234\"}.glyphicon-option-vertical:before{content:\"\\e235\"}.glyphicon-menu-hamburger:before{content:\"\\e236\"}.glyphicon-modal-window:before{content:\"\\e237\"}.glyphicon-oil:before{content:\"\\e238\"}.glyphicon-grain:before{content:\"\\e239\"}.glyphicon-sunglasses:before{content:\"\\e240\"}.glyphicon-text-size:before{content:\"\\e241\"}.glyphicon-text-color:before{content:\"\\e242\"}.glyphicon-text-background:before{content:\"\\e243\"}.glyphicon-object-align-top:before{content:\"\\e244\"}.glyphicon-object-align-bottom:before{content:\"\\e245\"}.glyphicon-object-align-horizontal:before{content:\"\\e246\"}.glyphicon-object-align-left:before{content:\"\\e247\"}.glyphicon-object-align-vertical:before{content:\"\\e248\"}.glyphicon-object-align-right:before{content:\"\\e249\"}.glyphicon-triangle-right:before{content:\"\\e250\"}.glyphicon-triangle-left:before{content:\"\\e251\"}.glyphicon-triangle-bottom:before{content:\"\\e252\"}.glyphicon-triangle-top:before{content:\"\\e253\"}.glyphicon-console:before{content:\"\\e254\"}.glyphicon-superscript:before{content:\"\\e255\"}.glyphicon-subscript:before{content:\"\\e256\"}.glyphicon-menu-left:before{content:\"\\e257\"}.glyphicon-menu-right:before{content:\"\\e258\"}.glyphicon-menu-down:before{content:\"\\e259\"}.glyphicon-menu-up:before{content:\"\\e260\"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\\2014 \\00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\\00A0 \\2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,\"Courier New\",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:\"\";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:\"/\\00a0\"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:\"\";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:\" \";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:\" \";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:\" \";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:\" \";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\\2039'}.carousel-control .icon-next:before{content:'\\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:\" \"}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}\n/*# sourceMappingURL=bootstrap.min.css.map */\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/font-awesome.min93e3.css",
    "content": "/*!\n *  Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */@font-face{font-family:FontAwesome;src:url(../fonts/fontawesome-webfont93e3.eot?v=4.4.0);src:url(../fonts/fontawesome-webfontd41d.eot?#iefix&v=4.4.0) format('embedded-opentype'),url(../fonts/fontawesome-webfont93e3.woff2?v=4.4.0) format('woff2'),url(../fonts/fontawesome-webfont93e3.woff?v=4.4.0) format('woff'),url(../fonts/fontawesome-webfont93e3.ttf?v=4.4.0) format('truetype'),url(../fonts/fontawesome-webfont93e3.svg?v=4.4.0#fontawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:\"\\f000\"}.fa-music:before{content:\"\\f001\"}.fa-search:before{content:\"\\f002\"}.fa-envelope-o:before{content:\"\\f003\"}.fa-heart:before{content:\"\\f004\"}.fa-star:before{content:\"\\f005\"}.fa-star-o:before{content:\"\\f006\"}.fa-user:before{content:\"\\f007\"}.fa-film:before{content:\"\\f008\"}.fa-th-large:before{content:\"\\f009\"}.fa-th:before{content:\"\\f00a\"}.fa-th-list:before{content:\"\\f00b\"}.fa-check:before{content:\"\\f00c\"}.fa-close:before,.fa-remove:before,.fa-times:before{content:\"\\f00d\"}.fa-search-plus:before{content:\"\\f00e\"}.fa-search-minus:before{content:\"\\f010\"}.fa-power-off:before{content:\"\\f011\"}.fa-signal:before{content:\"\\f012\"}.fa-cog:before,.fa-gear:before{content:\"\\f013\"}.fa-trash-o:before{content:\"\\f014\"}.fa-home:before{content:\"\\f015\"}.fa-file-o:before{content:\"\\f016\"}.fa-clock-o:before{content:\"\\f017\"}.fa-road:before{content:\"\\f018\"}.fa-download:before{content:\"\\f019\"}.fa-arrow-circle-o-down:before{content:\"\\f01a\"}.fa-arrow-circle-o-up:before{content:\"\\f01b\"}.fa-inbox:before{content:\"\\f01c\"}.fa-play-circle-o:before{content:\"\\f01d\"}.fa-repeat:before,.fa-rotate-right:before{content:\"\\f01e\"}.fa-refresh:before{content:\"\\f021\"}.fa-list-alt:before{content:\"\\f022\"}.fa-lock:before{content:\"\\f023\"}.fa-flag:before{content:\"\\f024\"}.fa-headphones:before{content:\"\\f025\"}.fa-volume-off:before{content:\"\\f026\"}.fa-volume-down:before{content:\"\\f027\"}.fa-volume-up:before{content:\"\\f028\"}.fa-qrcode:before{content:\"\\f029\"}.fa-barcode:before{content:\"\\f02a\"}.fa-tag:before{content:\"\\f02b\"}.fa-tags:before{content:\"\\f02c\"}.fa-book:before{content:\"\\f02d\"}.fa-bookmark:before{content:\"\\f02e\"}.fa-print:before{content:\"\\f02f\"}.fa-camera:before{content:\"\\f030\"}.fa-font:before{content:\"\\f031\"}.fa-bold:before{content:\"\\f032\"}.fa-italic:before{content:\"\\f033\"}.fa-text-height:before{content:\"\\f034\"}.fa-text-width:before{content:\"\\f035\"}.fa-align-left:before{content:\"\\f036\"}.fa-align-center:before{content:\"\\f037\"}.fa-align-right:before{content:\"\\f038\"}.fa-align-justify:before{content:\"\\f039\"}.fa-list:before{content:\"\\f03a\"}.fa-dedent:before,.fa-outdent:before{content:\"\\f03b\"}.fa-indent:before{content:\"\\f03c\"}.fa-video-camera:before{content:\"\\f03d\"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:\"\\f03e\"}.fa-pencil:before{content:\"\\f040\"}.fa-map-marker:before{content:\"\\f041\"}.fa-adjust:before{content:\"\\f042\"}.fa-tint:before{content:\"\\f043\"}.fa-edit:before,.fa-pencil-square-o:before{content:\"\\f044\"}.fa-share-square-o:before{content:\"\\f045\"}.fa-check-square-o:before{content:\"\\f046\"}.fa-arrows:before{content:\"\\f047\"}.fa-step-backward:before{content:\"\\f048\"}.fa-fast-backward:before{content:\"\\f049\"}.fa-backward:before{content:\"\\f04a\"}.fa-play:before{content:\"\\f04b\"}.fa-pause:before{content:\"\\f04c\"}.fa-stop:before{content:\"\\f04d\"}.fa-forward:before{content:\"\\f04e\"}.fa-fast-forward:before{content:\"\\f050\"}.fa-step-forward:before{content:\"\\f051\"}.fa-eject:before{content:\"\\f052\"}.fa-chevron-left:before{content:\"\\f053\"}.fa-chevron-right:before{content:\"\\f054\"}.fa-plus-circle:before{content:\"\\f055\"}.fa-minus-circle:before{content:\"\\f056\"}.fa-times-circle:before{content:\"\\f057\"}.fa-check-circle:before{content:\"\\f058\"}.fa-question-circle:before{content:\"\\f059\"}.fa-info-circle:before{content:\"\\f05a\"}.fa-crosshairs:before{content:\"\\f05b\"}.fa-times-circle-o:before{content:\"\\f05c\"}.fa-check-circle-o:before{content:\"\\f05d\"}.fa-ban:before{content:\"\\f05e\"}.fa-arrow-left:before{content:\"\\f060\"}.fa-arrow-right:before{content:\"\\f061\"}.fa-arrow-up:before{content:\"\\f062\"}.fa-arrow-down:before{content:\"\\f063\"}.fa-mail-forward:before,.fa-share:before{content:\"\\f064\"}.fa-expand:before{content:\"\\f065\"}.fa-compress:before{content:\"\\f066\"}.fa-plus:before{content:\"\\f067\"}.fa-minus:before{content:\"\\f068\"}.fa-asterisk:before{content:\"\\f069\"}.fa-exclamation-circle:before{content:\"\\f06a\"}.fa-gift:before{content:\"\\f06b\"}.fa-leaf:before{content:\"\\f06c\"}.fa-fire:before{content:\"\\f06d\"}.fa-eye:before{content:\"\\f06e\"}.fa-eye-slash:before{content:\"\\f070\"}.fa-exclamation-triangle:before,.fa-warning:before{content:\"\\f071\"}.fa-plane:before{content:\"\\f072\"}.fa-calendar:before{content:\"\\f073\"}.fa-random:before{content:\"\\f074\"}.fa-comment:before{content:\"\\f075\"}.fa-magnet:before{content:\"\\f076\"}.fa-chevron-up:before{content:\"\\f077\"}.fa-chevron-down:before{content:\"\\f078\"}.fa-retweet:before{content:\"\\f079\"}.fa-shopping-cart:before{content:\"\\f07a\"}.fa-folder:before{content:\"\\f07b\"}.fa-folder-open:before{content:\"\\f07c\"}.fa-arrows-v:before{content:\"\\f07d\"}.fa-arrows-h:before{content:\"\\f07e\"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:\"\\f080\"}.fa-twitter-square:before{content:\"\\f081\"}.fa-facebook-square:before{content:\"\\f082\"}.fa-camera-retro:before{content:\"\\f083\"}.fa-key:before{content:\"\\f084\"}.fa-cogs:before,.fa-gears:before{content:\"\\f085\"}.fa-comments:before{content:\"\\f086\"}.fa-thumbs-o-up:before{content:\"\\f087\"}.fa-thumbs-o-down:before{content:\"\\f088\"}.fa-star-half:before{content:\"\\f089\"}.fa-heart-o:before{content:\"\\f08a\"}.fa-sign-out:before{content:\"\\f08b\"}.fa-linkedin-square:before{content:\"\\f08c\"}.fa-thumb-tack:before{content:\"\\f08d\"}.fa-external-link:before{content:\"\\f08e\"}.fa-sign-in:before{content:\"\\f090\"}.fa-trophy:before{content:\"\\f091\"}.fa-github-square:before{content:\"\\f092\"}.fa-upload:before{content:\"\\f093\"}.fa-lemon-o:before{content:\"\\f094\"}.fa-phone:before{content:\"\\f095\"}.fa-square-o:before{content:\"\\f096\"}.fa-bookmark-o:before{content:\"\\f097\"}.fa-phone-square:before{content:\"\\f098\"}.fa-twitter:before{content:\"\\f099\"}.fa-facebook-f:before,.fa-facebook:before{content:\"\\f09a\"}.fa-github:before{content:\"\\f09b\"}.fa-unlock:before{content:\"\\f09c\"}.fa-credit-card:before{content:\"\\f09d\"}.fa-feed:before,.fa-rss:before{content:\"\\f09e\"}.fa-hdd-o:before{content:\"\\f0a0\"}.fa-bullhorn:before{content:\"\\f0a1\"}.fa-bell:before{content:\"\\f0f3\"}.fa-certificate:before{content:\"\\f0a3\"}.fa-hand-o-right:before{content:\"\\f0a4\"}.fa-hand-o-left:before{content:\"\\f0a5\"}.fa-hand-o-up:before{content:\"\\f0a6\"}.fa-hand-o-down:before{content:\"\\f0a7\"}.fa-arrow-circle-left:before{content:\"\\f0a8\"}.fa-arrow-circle-right:before{content:\"\\f0a9\"}.fa-arrow-circle-up:before{content:\"\\f0aa\"}.fa-arrow-circle-down:before{content:\"\\f0ab\"}.fa-globe:before{content:\"\\f0ac\"}.fa-wrench:before{content:\"\\f0ad\"}.fa-tasks:before{content:\"\\f0ae\"}.fa-filter:before{content:\"\\f0b0\"}.fa-briefcase:before{content:\"\\f0b1\"}.fa-arrows-alt:before{content:\"\\f0b2\"}.fa-group:before,.fa-users:before{content:\"\\f0c0\"}.fa-chain:before,.fa-link:before{content:\"\\f0c1\"}.fa-cloud:before{content:\"\\f0c2\"}.fa-flask:before{content:\"\\f0c3\"}.fa-cut:before,.fa-scissors:before{content:\"\\f0c4\"}.fa-copy:before,.fa-files-o:before{content:\"\\f0c5\"}.fa-paperclip:before{content:\"\\f0c6\"}.fa-floppy-o:before,.fa-save:before{content:\"\\f0c7\"}.fa-square:before{content:\"\\f0c8\"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:\"\\f0c9\"}.fa-list-ul:before{content:\"\\f0ca\"}.fa-list-ol:before{content:\"\\f0cb\"}.fa-strikethrough:before{content:\"\\f0cc\"}.fa-underline:before{content:\"\\f0cd\"}.fa-table:before{content:\"\\f0ce\"}.fa-magic:before{content:\"\\f0d0\"}.fa-truck:before{content:\"\\f0d1\"}.fa-pinterest:before{content:\"\\f0d2\"}.fa-pinterest-square:before{content:\"\\f0d3\"}.fa-google-plus-square:before{content:\"\\f0d4\"}.fa-google-plus:before{content:\"\\f0d5\"}.fa-money:before{content:\"\\f0d6\"}.fa-caret-down:before{content:\"\\f0d7\"}.fa-caret-up:before{content:\"\\f0d8\"}.fa-caret-left:before{content:\"\\f0d9\"}.fa-caret-right:before{content:\"\\f0da\"}.fa-columns:before{content:\"\\f0db\"}.fa-sort:before,.fa-unsorted:before{content:\"\\f0dc\"}.fa-sort-desc:before,.fa-sort-down:before{content:\"\\f0dd\"}.fa-sort-asc:before,.fa-sort-up:before{content:\"\\f0de\"}.fa-envelope:before{content:\"\\f0e0\"}.fa-linkedin:before{content:\"\\f0e1\"}.fa-rotate-left:before,.fa-undo:before{content:\"\\f0e2\"}.fa-gavel:before,.fa-legal:before{content:\"\\f0e3\"}.fa-dashboard:before,.fa-tachometer:before{content:\"\\f0e4\"}.fa-comment-o:before{content:\"\\f0e5\"}.fa-comments-o:before{content:\"\\f0e6\"}.fa-bolt:before,.fa-flash:before{content:\"\\f0e7\"}.fa-sitemap:before{content:\"\\f0e8\"}.fa-umbrella:before{content:\"\\f0e9\"}.fa-clipboard:before,.fa-paste:before{content:\"\\f0ea\"}.fa-lightbulb-o:before{content:\"\\f0eb\"}.fa-exchange:before{content:\"\\f0ec\"}.fa-cloud-download:before{content:\"\\f0ed\"}.fa-cloud-upload:before{content:\"\\f0ee\"}.fa-user-md:before{content:\"\\f0f0\"}.fa-stethoscope:before{content:\"\\f0f1\"}.fa-suitcase:before{content:\"\\f0f2\"}.fa-bell-o:before{content:\"\\f0a2\"}.fa-coffee:before{content:\"\\f0f4\"}.fa-cutlery:before{content:\"\\f0f5\"}.fa-file-text-o:before{content:\"\\f0f6\"}.fa-building-o:before{content:\"\\f0f7\"}.fa-hospital-o:before{content:\"\\f0f8\"}.fa-ambulance:before{content:\"\\f0f9\"}.fa-medkit:before{content:\"\\f0fa\"}.fa-fighter-jet:before{content:\"\\f0fb\"}.fa-beer:before{content:\"\\f0fc\"}.fa-h-square:before{content:\"\\f0fd\"}.fa-plus-square:before{content:\"\\f0fe\"}.fa-angle-double-left:before{content:\"\\f100\"}.fa-angle-double-right:before{content:\"\\f101\"}.fa-angle-double-up:before{content:\"\\f102\"}.fa-angle-double-down:before{content:\"\\f103\"}.fa-angle-left:before{content:\"\\f104\"}.fa-angle-right:before{content:\"\\f105\"}.fa-angle-up:before{content:\"\\f106\"}.fa-angle-down:before{content:\"\\f107\"}.fa-desktop:before{content:\"\\f108\"}.fa-laptop:before{content:\"\\f109\"}.fa-tablet:before{content:\"\\f10a\"}.fa-mobile-phone:before,.fa-mobile:before{content:\"\\f10b\"}.fa-circle-o:before{content:\"\\f10c\"}.fa-quote-left:before{content:\"\\f10d\"}.fa-quote-right:before{content:\"\\f10e\"}.fa-spinner:before{content:\"\\f110\"}.fa-circle:before{content:\"\\f111\"}.fa-mail-reply:before,.fa-reply:before{content:\"\\f112\"}.fa-github-alt:before{content:\"\\f113\"}.fa-folder-o:before{content:\"\\f114\"}.fa-folder-open-o:before{content:\"\\f115\"}.fa-smile-o:before{content:\"\\f118\"}.fa-frown-o:before{content:\"\\f119\"}.fa-meh-o:before{content:\"\\f11a\"}.fa-gamepad:before{content:\"\\f11b\"}.fa-keyboard-o:before{content:\"\\f11c\"}.fa-flag-o:before{content:\"\\f11d\"}.fa-flag-checkered:before{content:\"\\f11e\"}.fa-terminal:before{content:\"\\f120\"}.fa-code:before{content:\"\\f121\"}.fa-mail-reply-all:before,.fa-reply-all:before{content:\"\\f122\"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:\"\\f123\"}.fa-location-arrow:before{content:\"\\f124\"}.fa-crop:before{content:\"\\f125\"}.fa-code-fork:before{content:\"\\f126\"}.fa-chain-broken:before,.fa-unlink:before{content:\"\\f127\"}.fa-question:before{content:\"\\f128\"}.fa-info:before{content:\"\\f129\"}.fa-exclamation:before{content:\"\\f12a\"}.fa-superscript:before{content:\"\\f12b\"}.fa-subscript:before{content:\"\\f12c\"}.fa-eraser:before{content:\"\\f12d\"}.fa-puzzle-piece:before{content:\"\\f12e\"}.fa-microphone:before{content:\"\\f130\"}.fa-microphone-slash:before{content:\"\\f131\"}.fa-shield:before{content:\"\\f132\"}.fa-calendar-o:before{content:\"\\f133\"}.fa-fire-extinguisher:before{content:\"\\f134\"}.fa-rocket:before{content:\"\\f135\"}.fa-maxcdn:before{content:\"\\f136\"}.fa-chevron-circle-left:before{content:\"\\f137\"}.fa-chevron-circle-right:before{content:\"\\f138\"}.fa-chevron-circle-up:before{content:\"\\f139\"}.fa-chevron-circle-down:before{content:\"\\f13a\"}.fa-html5:before{content:\"\\f13b\"}.fa-css3:before{content:\"\\f13c\"}.fa-anchor:before{content:\"\\f13d\"}.fa-unlock-alt:before{content:\"\\f13e\"}.fa-bullseye:before{content:\"\\f140\"}.fa-ellipsis-h:before{content:\"\\f141\"}.fa-ellipsis-v:before{content:\"\\f142\"}.fa-rss-square:before{content:\"\\f143\"}.fa-play-circle:before{content:\"\\f144\"}.fa-ticket:before{content:\"\\f145\"}.fa-minus-square:before{content:\"\\f146\"}.fa-minus-square-o:before{content:\"\\f147\"}.fa-level-up:before{content:\"\\f148\"}.fa-level-down:before{content:\"\\f149\"}.fa-check-square:before{content:\"\\f14a\"}.fa-pencil-square:before{content:\"\\f14b\"}.fa-external-link-square:before{content:\"\\f14c\"}.fa-share-square:before{content:\"\\f14d\"}.fa-compass:before{content:\"\\f14e\"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:\"\\f150\"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:\"\\f151\"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:\"\\f152\"}.fa-eur:before,.fa-euro:before{content:\"\\f153\"}.fa-gbp:before{content:\"\\f154\"}.fa-dollar:before,.fa-usd:before{content:\"\\f155\"}.fa-inr:before,.fa-rupee:before{content:\"\\f156\"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:\"\\f157\"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:\"\\f158\"}.fa-krw:before,.fa-won:before{content:\"\\f159\"}.fa-bitcoin:before,.fa-btc:before{content:\"\\f15a\"}.fa-file:before{content:\"\\f15b\"}.fa-file-text:before{content:\"\\f15c\"}.fa-sort-alpha-asc:before{content:\"\\f15d\"}.fa-sort-alpha-desc:before{content:\"\\f15e\"}.fa-sort-amount-asc:before{content:\"\\f160\"}.fa-sort-amount-desc:before{content:\"\\f161\"}.fa-sort-numeric-asc:before{content:\"\\f162\"}.fa-sort-numeric-desc:before{content:\"\\f163\"}.fa-thumbs-up:before{content:\"\\f164\"}.fa-thumbs-down:before{content:\"\\f165\"}.fa-youtube-square:before{content:\"\\f166\"}.fa-youtube:before{content:\"\\f167\"}.fa-xing:before{content:\"\\f168\"}.fa-xing-square:before{content:\"\\f169\"}.fa-youtube-play:before{content:\"\\f16a\"}.fa-dropbox:before{content:\"\\f16b\"}.fa-stack-overflow:before{content:\"\\f16c\"}.fa-instagram:before{content:\"\\f16d\"}.fa-flickr:before{content:\"\\f16e\"}.fa-adn:before{content:\"\\f170\"}.fa-bitbucket:before{content:\"\\f171\"}.fa-bitbucket-square:before{content:\"\\f172\"}.fa-tumblr:before{content:\"\\f173\"}.fa-tumblr-square:before{content:\"\\f174\"}.fa-long-arrow-down:before{content:\"\\f175\"}.fa-long-arrow-up:before{content:\"\\f176\"}.fa-long-arrow-left:before{content:\"\\f177\"}.fa-long-arrow-right:before{content:\"\\f178\"}.fa-apple:before{content:\"\\f179\"}.fa-windows:before{content:\"\\f17a\"}.fa-android:before{content:\"\\f17b\"}.fa-linux:before{content:\"\\f17c\"}.fa-dribbble:before{content:\"\\f17d\"}.fa-skype:before{content:\"\\f17e\"}.fa-foursquare:before{content:\"\\f180\"}.fa-trello:before{content:\"\\f181\"}.fa-female:before{content:\"\\f182\"}.fa-male:before{content:\"\\f183\"}.fa-gittip:before,.fa-gratipay:before{content:\"\\f184\"}.fa-sun-o:before{content:\"\\f185\"}.fa-moon-o:before{content:\"\\f186\"}.fa-archive:before{content:\"\\f187\"}.fa-bug:before{content:\"\\f188\"}.fa-vk:before{content:\"\\f189\"}.fa-weibo:before{content:\"\\f18a\"}.fa-renren:before{content:\"\\f18b\"}.fa-pagelines:before{content:\"\\f18c\"}.fa-stack-exchange:before{content:\"\\f18d\"}.fa-arrow-circle-o-right:before{content:\"\\f18e\"}.fa-arrow-circle-o-left:before{content:\"\\f190\"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:\"\\f191\"}.fa-dot-circle-o:before{content:\"\\f192\"}.fa-wheelchair:before{content:\"\\f193\"}.fa-vimeo-square:before{content:\"\\f194\"}.fa-try:before,.fa-turkish-lira:before{content:\"\\f195\"}.fa-plus-square-o:before{content:\"\\f196\"}.fa-space-shuttle:before{content:\"\\f197\"}.fa-slack:before{content:\"\\f198\"}.fa-envelope-square:before{content:\"\\f199\"}.fa-wordpress:before{content:\"\\f19a\"}.fa-openid:before{content:\"\\f19b\"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:\"\\f19c\"}.fa-graduation-cap:before,.fa-mortar-board:before{content:\"\\f19d\"}.fa-yahoo:before{content:\"\\f19e\"}.fa-google:before{content:\"\\f1a0\"}.fa-reddit:before{content:\"\\f1a1\"}.fa-reddit-square:before{content:\"\\f1a2\"}.fa-stumbleupon-circle:before{content:\"\\f1a3\"}.fa-stumbleupon:before{content:\"\\f1a4\"}.fa-delicious:before{content:\"\\f1a5\"}.fa-digg:before{content:\"\\f1a6\"}.fa-pied-piper:before{content:\"\\f1a7\"}.fa-pied-piper-alt:before{content:\"\\f1a8\"}.fa-drupal:before{content:\"\\f1a9\"}.fa-joomla:before{content:\"\\f1aa\"}.fa-language:before{content:\"\\f1ab\"}.fa-fax:before{content:\"\\f1ac\"}.fa-building:before{content:\"\\f1ad\"}.fa-child:before{content:\"\\f1ae\"}.fa-paw:before{content:\"\\f1b0\"}.fa-spoon:before{content:\"\\f1b1\"}.fa-cube:before{content:\"\\f1b2\"}.fa-cubes:before{content:\"\\f1b3\"}.fa-behance:before{content:\"\\f1b4\"}.fa-behance-square:before{content:\"\\f1b5\"}.fa-steam:before{content:\"\\f1b6\"}.fa-steam-square:before{content:\"\\f1b7\"}.fa-recycle:before{content:\"\\f1b8\"}.fa-automobile:before,.fa-car:before{content:\"\\f1b9\"}.fa-cab:before,.fa-taxi:before{content:\"\\f1ba\"}.fa-tree:before{content:\"\\f1bb\"}.fa-spotify:before{content:\"\\f1bc\"}.fa-deviantart:before{content:\"\\f1bd\"}.fa-soundcloud:before{content:\"\\f1be\"}.fa-database:before{content:\"\\f1c0\"}.fa-file-pdf-o:before{content:\"\\f1c1\"}.fa-file-word-o:before{content:\"\\f1c2\"}.fa-file-excel-o:before{content:\"\\f1c3\"}.fa-file-powerpoint-o:before{content:\"\\f1c4\"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:\"\\f1c5\"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:\"\\f1c6\"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:\"\\f1c7\"}.fa-file-movie-o:before,.fa-file-video-o:before{content:\"\\f1c8\"}.fa-file-code-o:before{content:\"\\f1c9\"}.fa-vine:before{content:\"\\f1ca\"}.fa-codepen:before{content:\"\\f1cb\"}.fa-jsfiddle:before{content:\"\\f1cc\"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:\"\\f1cd\"}.fa-circle-o-notch:before{content:\"\\f1ce\"}.fa-ra:before,.fa-rebel:before{content:\"\\f1d0\"}.fa-empire:before,.fa-ge:before{content:\"\\f1d1\"}.fa-git-square:before{content:\"\\f1d2\"}.fa-git:before{content:\"\\f1d3\"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:\"\\f1d4\"}.fa-tencent-weibo:before{content:\"\\f1d5\"}.fa-qq:before{content:\"\\f1d6\"}.fa-wechat:before,.fa-weixin:before{content:\"\\f1d7\"}.fa-paper-plane:before,.fa-send:before{content:\"\\f1d8\"}.fa-paper-plane-o:before,.fa-send-o:before{content:\"\\f1d9\"}.fa-history:before{content:\"\\f1da\"}.fa-circle-thin:before{content:\"\\f1db\"}.fa-header:before{content:\"\\f1dc\"}.fa-paragraph:before{content:\"\\f1dd\"}.fa-sliders:before{content:\"\\f1de\"}.fa-share-alt:before{content:\"\\f1e0\"}.fa-share-alt-square:before{content:\"\\f1e1\"}.fa-bomb:before{content:\"\\f1e2\"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:\"\\f1e3\"}.fa-tty:before{content:\"\\f1e4\"}.fa-binoculars:before{content:\"\\f1e5\"}.fa-plug:before{content:\"\\f1e6\"}.fa-slideshare:before{content:\"\\f1e7\"}.fa-twitch:before{content:\"\\f1e8\"}.fa-yelp:before{content:\"\\f1e9\"}.fa-newspaper-o:before{content:\"\\f1ea\"}.fa-wifi:before{content:\"\\f1eb\"}.fa-calculator:before{content:\"\\f1ec\"}.fa-paypal:before{content:\"\\f1ed\"}.fa-google-wallet:before{content:\"\\f1ee\"}.fa-cc-visa:before{content:\"\\f1f0\"}.fa-cc-mastercard:before{content:\"\\f1f1\"}.fa-cc-discover:before{content:\"\\f1f2\"}.fa-cc-amex:before{content:\"\\f1f3\"}.fa-cc-paypal:before{content:\"\\f1f4\"}.fa-cc-stripe:before{content:\"\\f1f5\"}.fa-bell-slash:before{content:\"\\f1f6\"}.fa-bell-slash-o:before{content:\"\\f1f7\"}.fa-trash:before{content:\"\\f1f8\"}.fa-copyright:before{content:\"\\f1f9\"}.fa-at:before{content:\"\\f1fa\"}.fa-eyedropper:before{content:\"\\f1fb\"}.fa-paint-brush:before{content:\"\\f1fc\"}.fa-birthday-cake:before{content:\"\\f1fd\"}.fa-area-chart:before{content:\"\\f1fe\"}.fa-pie-chart:before{content:\"\\f200\"}.fa-line-chart:before{content:\"\\f201\"}.fa-lastfm:before{content:\"\\f202\"}.fa-lastfm-square:before{content:\"\\f203\"}.fa-toggle-off:before{content:\"\\f204\"}.fa-toggle-on:before{content:\"\\f205\"}.fa-bicycle:before{content:\"\\f206\"}.fa-bus:before{content:\"\\f207\"}.fa-ioxhost:before{content:\"\\f208\"}.fa-angellist:before{content:\"\\f209\"}.fa-cc:before{content:\"\\f20a\"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:\"\\f20b\"}.fa-meanpath:before{content:\"\\f20c\"}.fa-buysellads:before{content:\"\\f20d\"}.fa-connectdevelop:before{content:\"\\f20e\"}.fa-dashcube:before{content:\"\\f210\"}.fa-forumbee:before{content:\"\\f211\"}.fa-leanpub:before{content:\"\\f212\"}.fa-sellsy:before{content:\"\\f213\"}.fa-shirtsinbulk:before{content:\"\\f214\"}.fa-simplybuilt:before{content:\"\\f215\"}.fa-skyatlas:before{content:\"\\f216\"}.fa-cart-plus:before{content:\"\\f217\"}.fa-cart-arrow-down:before{content:\"\\f218\"}.fa-diamond:before{content:\"\\f219\"}.fa-ship:before{content:\"\\f21a\"}.fa-user-secret:before{content:\"\\f21b\"}.fa-motorcycle:before{content:\"\\f21c\"}.fa-street-view:before{content:\"\\f21d\"}.fa-heartbeat:before{content:\"\\f21e\"}.fa-venus:before{content:\"\\f221\"}.fa-mars:before{content:\"\\f222\"}.fa-mercury:before{content:\"\\f223\"}.fa-intersex:before,.fa-transgender:before{content:\"\\f224\"}.fa-transgender-alt:before{content:\"\\f225\"}.fa-venus-double:before{content:\"\\f226\"}.fa-mars-double:before{content:\"\\f227\"}.fa-venus-mars:before{content:\"\\f228\"}.fa-mars-stroke:before{content:\"\\f229\"}.fa-mars-stroke-v:before{content:\"\\f22a\"}.fa-mars-stroke-h:before{content:\"\\f22b\"}.fa-neuter:before{content:\"\\f22c\"}.fa-genderless:before{content:\"\\f22d\"}.fa-facebook-official:before{content:\"\\f230\"}.fa-pinterest-p:before{content:\"\\f231\"}.fa-whatsapp:before{content:\"\\f232\"}.fa-server:before{content:\"\\f233\"}.fa-user-plus:before{content:\"\\f234\"}.fa-user-times:before{content:\"\\f235\"}.fa-bed:before,.fa-hotel:before{content:\"\\f236\"}.fa-viacoin:before{content:\"\\f237\"}.fa-train:before{content:\"\\f238\"}.fa-subway:before{content:\"\\f239\"}.fa-medium:before{content:\"\\f23a\"}.fa-y-combinator:before,.fa-yc:before{content:\"\\f23b\"}.fa-optin-monster:before{content:\"\\f23c\"}.fa-opencart:before{content:\"\\f23d\"}.fa-expeditedssl:before{content:\"\\f23e\"}.fa-battery-4:before,.fa-battery-full:before{content:\"\\f240\"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:\"\\f241\"}.fa-battery-2:before,.fa-battery-half:before{content:\"\\f242\"}.fa-battery-1:before,.fa-battery-quarter:before{content:\"\\f243\"}.fa-battery-0:before,.fa-battery-empty:before{content:\"\\f244\"}.fa-mouse-pointer:before{content:\"\\f245\"}.fa-i-cursor:before{content:\"\\f246\"}.fa-object-group:before{content:\"\\f247\"}.fa-object-ungroup:before{content:\"\\f248\"}.fa-sticky-note:before{content:\"\\f249\"}.fa-sticky-note-o:before{content:\"\\f24a\"}.fa-cc-jcb:before{content:\"\\f24b\"}.fa-cc-diners-club:before{content:\"\\f24c\"}.fa-clone:before{content:\"\\f24d\"}.fa-balance-scale:before{content:\"\\f24e\"}.fa-hourglass-o:before{content:\"\\f250\"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:\"\\f251\"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:\"\\f252\"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:\"\\f253\"}.fa-hourglass:before{content:\"\\f254\"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:\"\\f255\"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:\"\\f256\"}.fa-hand-scissors-o:before{content:\"\\f257\"}.fa-hand-lizard-o:before{content:\"\\f258\"}.fa-hand-spock-o:before{content:\"\\f259\"}.fa-hand-pointer-o:before{content:\"\\f25a\"}.fa-hand-peace-o:before{content:\"\\f25b\"}.fa-trademark:before{content:\"\\f25c\"}.fa-registered:before{content:\"\\f25d\"}.fa-creative-commons:before{content:\"\\f25e\"}.fa-gg:before{content:\"\\f260\"}.fa-gg-circle:before{content:\"\\f261\"}.fa-tripadvisor:before{content:\"\\f262\"}.fa-odnoklassniki:before{content:\"\\f263\"}.fa-odnoklassniki-square:before{content:\"\\f264\"}.fa-get-pocket:before{content:\"\\f265\"}.fa-wikipedia-w:before{content:\"\\f266\"}.fa-safari:before{content:\"\\f267\"}.fa-chrome:before{content:\"\\f268\"}.fa-firefox:before{content:\"\\f269\"}.fa-opera:before{content:\"\\f26a\"}.fa-internet-explorer:before{content:\"\\f26b\"}.fa-television:before,.fa-tv:before{content:\"\\f26c\"}.fa-contao:before{content:\"\\f26d\"}.fa-500px:before{content:\"\\f26e\"}.fa-amazon:before{content:\"\\f270\"}.fa-calendar-plus-o:before{content:\"\\f271\"}.fa-calendar-minus-o:before{content:\"\\f272\"}.fa-calendar-times-o:before{content:\"\\f273\"}.fa-calendar-check-o:before{content:\"\\f274\"}.fa-industry:before{content:\"\\f275\"}.fa-map-pin:before{content:\"\\f276\"}.fa-map-signs:before{content:\"\\f277\"}.fa-map-o:before{content:\"\\f278\"}.fa-map:before{content:\"\\f279\"}.fa-commenting:before{content:\"\\f27a\"}.fa-commenting-o:before{content:\"\\f27b\"}.fa-houzz:before{content:\"\\f27c\"}.fa-vimeo:before{content:\"\\f27d\"}.fa-black-tie:before{content:\"\\f27e\"}.fa-fonticons:before{content:\"\\f280\"}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/awesome-bootstrap-checkbox/awesome-bootstrap-checkbox.css",
    "content": ".checkbox {\n  padding-left: 20px;\n}\n.checkbox label {\n  display: inline-block;\n  vertical-align: middle;\n  position: relative;\n  padding-left: 5px;\n}\n.checkbox label::before {\n  content: \"\";\n  display: inline-block;\n  position: absolute;\n  width: 17px;\n  height: 17px;\n  left: 0;\n  margin-left: -20px;\n  border: 1px solid #cccccc;\n  border-radius: 3px;\n  background-color: #fff;\n  -webkit-transition: border 0.15s ease-in-out, color 0.15s ease-in-out;\n  -o-transition: border 0.15s ease-in-out, color 0.15s ease-in-out;\n  transition: border 0.15s ease-in-out, color 0.15s ease-in-out;\n}\n.checkbox label::after {\n  display: inline-block;\n  position: absolute;\n  width: 16px;\n  height: 16px;\n  left: 0;\n  top: 0;\n  margin-left: -20px;\n  padding-left: 3px;\n  padding-top: 1px;\n  font-size: 11px;\n  color: #555555;\n}\n.checkbox input[type=\"checkbox\"],\n.checkbox input[type=\"radio\"] {\n  opacity: 0;\n  z-index: 1;\n}\n.checkbox input[type=\"checkbox\"]:focus + label::before,\n.checkbox input[type=\"radio\"]:focus + label::before {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.checkbox input[type=\"checkbox\"]:checked + label::after,\n.checkbox input[type=\"radio\"]:checked + label::after {\n  font-family: \"FontAwesome\";\n  content: \"\\f00c\";\n}\n.checkbox input[type=\"checkbox\"]:disabled + label,\n.checkbox input[type=\"radio\"]:disabled + label {\n  opacity: 0.65;\n}\n.checkbox input[type=\"checkbox\"]:disabled + label::before,\n.checkbox input[type=\"radio\"]:disabled + label::before {\n  background-color: #eeeeee;\n  cursor: not-allowed;\n}\n.checkbox.checkbox-circle label::before {\n  border-radius: 50%;\n}\n.checkbox.checkbox-inline {\n  margin-top: 0;\n}\n\n.checkbox-primary input[type=\"checkbox\"]:checked + label::before,\n.checkbox-primary input[type=\"radio\"]:checked + label::before {\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.checkbox-primary input[type=\"checkbox\"]:checked + label::after,\n.checkbox-primary input[type=\"radio\"]:checked + label::after {\n  color: #fff;\n}\n\n.checkbox-danger input[type=\"checkbox\"]:checked + label::before,\n.checkbox-danger input[type=\"radio\"]:checked + label::before {\n  background-color: #d9534f;\n  border-color: #d9534f;\n}\n.checkbox-danger input[type=\"checkbox\"]:checked + label::after,\n.checkbox-danger input[type=\"radio\"]:checked + label::after {\n  color: #fff;\n}\n\n.checkbox-info input[type=\"checkbox\"]:checked + label::before,\n.checkbox-info input[type=\"radio\"]:checked + label::before {\n  background-color: #5bc0de;\n  border-color: #5bc0de;\n}\n.checkbox-info input[type=\"checkbox\"]:checked + label::after,\n.checkbox-info input[type=\"radio\"]:checked + label::after {\n  color: #fff;\n}\n\n.checkbox-warning input[type=\"checkbox\"]:checked + label::before,\n.checkbox-warning input[type=\"radio\"]:checked + label::before {\n  background-color: #f0ad4e;\n  border-color: #f0ad4e;\n}\n.checkbox-warning input[type=\"checkbox\"]:checked + label::after,\n.checkbox-warning input[type=\"radio\"]:checked + label::after {\n  color: #fff;\n}\n\n.checkbox-success input[type=\"checkbox\"]:checked + label::before,\n.checkbox-success input[type=\"radio\"]:checked + label::before {\n  background-color: #5cb85c;\n  border-color: #5cb85c;\n}\n.checkbox-success input[type=\"checkbox\"]:checked + label::after,\n.checkbox-success input[type=\"radio\"]:checked + label::after {\n  color: #fff;\n}\n\n.radio {\n  padding-left: 20px;\n}\n.radio label {\n  display: inline-block;\n  vertical-align: middle;\n  position: relative;\n  padding-left: 5px;\n}\n.radio label::before {\n  content: \"\";\n  display: inline-block;\n  position: absolute;\n  width: 17px;\n  height: 17px;\n  left: 0;\n  margin-left: -20px;\n  border: 1px solid #cccccc;\n  border-radius: 50%;\n  background-color: #fff;\n  -webkit-transition: border 0.15s ease-in-out;\n  -o-transition: border 0.15s ease-in-out;\n  transition: border 0.15s ease-in-out;\n}\n.radio label::after {\n  display: inline-block;\n  position: absolute;\n  content: \" \";\n  width: 11px;\n  height: 11px;\n  left: 3px;\n  top: 3px;\n  margin-left: -20px;\n  border-radius: 50%;\n  background-color: #555555;\n  -webkit-transform: scale(0, 0);\n  -ms-transform: scale(0, 0);\n  -o-transform: scale(0, 0);\n  transform: scale(0, 0);\n  -webkit-transition: -webkit-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33);\n  -moz-transition: -moz-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33);\n  -o-transition: -o-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33);\n  transition: transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33);\n}\n.radio input[type=\"radio\"] {\n  opacity: 0;\n  z-index: 1;\n}\n.radio input[type=\"radio\"]:focus + label::before {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.radio input[type=\"radio\"]:checked + label::after {\n  -webkit-transform: scale(1, 1);\n  -ms-transform: scale(1, 1);\n  -o-transform: scale(1, 1);\n  transform: scale(1, 1);\n}\n.radio input[type=\"radio\"]:disabled + label {\n  opacity: 0.65;\n}\n.radio input[type=\"radio\"]:disabled + label::before {\n  cursor: not-allowed;\n}\n.radio.radio-inline {\n  margin-top: 0;\n}\n\n.radio-primary input[type=\"radio\"] + label::after {\n  background-color: #337ab7;\n}\n.radio-primary input[type=\"radio\"]:checked + label::before {\n  border-color: #337ab7;\n}\n.radio-primary input[type=\"radio\"]:checked + label::after {\n  background-color: #337ab7;\n}\n\n.radio-danger input[type=\"radio\"] + label::after {\n  background-color: #d9534f;\n}\n.radio-danger input[type=\"radio\"]:checked + label::before {\n  border-color: #d9534f;\n}\n.radio-danger input[type=\"radio\"]:checked + label::after {\n  background-color: #d9534f;\n}\n\n.radio-info input[type=\"radio\"] + label::after {\n  background-color: #5bc0de;\n}\n.radio-info input[type=\"radio\"]:checked + label::before {\n  border-color: #5bc0de;\n}\n.radio-info input[type=\"radio\"]:checked + label::after {\n  background-color: #5bc0de;\n}\n\n.radio-warning input[type=\"radio\"] + label::after {\n  background-color: #f0ad4e;\n}\n.radio-warning input[type=\"radio\"]:checked + label::before {\n  border-color: #f0ad4e;\n}\n.radio-warning input[type=\"radio\"]:checked + label::after {\n  background-color: #f0ad4e;\n}\n\n.radio-success input[type=\"radio\"] + label::after {\n  background-color: #5cb85c;\n}\n.radio-success input[type=\"radio\"]:checked + label::before {\n  border-color: #5cb85c;\n}\n.radio-success input[type=\"radio\"]:checked + label::after {\n  background-color: #5cb85c;\n}\n\ninput[type=\"checkbox\"].styled:checked + label:after,\ninput[type=\"radio\"].styled:checked + label:after {\n  font-family: 'FontAwesome';\n  content: \"\\f00c\";\n}\ninput[type=\"checkbox\"] .styled:checked + label::before,\ninput[type=\"radio\"] .styled:checked + label::before {\n  color: #fff;\n}\ninput[type=\"checkbox\"] .styled:checked + label::after,\ninput[type=\"radio\"] .styled:checked + label::after {\n  color: #fff;\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/chosen/chosen.css",
    "content": "/*!\nChosen, a Select Box Enhancer for jQuery and Prototype\nby Patrick Filler for Harvest, http://getharvest.com\n\nVersion 1.1.0\nFull source at https://github.com/harvesthq/chosen\nCopyright (c) 2011 Harvest http://getharvest.com\n\nMIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md\nThis file is generated by `grunt build`, do not edit it by hand.\n*/\n\n/* @group Base */\n.chosen-container {\n    position: relative;\n    display: inline-block;\n    vertical-align: middle;\n    font-size: 13px;\n    zoom: 1;\n    *display: inline;\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    user-select: none;\n}\n.chosen-container .chosen-drop {\n    position: absolute;\n    top: 100%;\n    left: -9999px;\n    z-index: 1010;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n    width: 100%;\n    border: 1px solid #aaa;\n    border-top: 0;\n    background: #fff;\n    box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15);\n}\n.chosen-container.chosen-with-drop .chosen-drop {\n    left: 0;\n}\n.chosen-container a {\n    cursor: pointer;\n}\n\n/* @end */\n/* @group Single Chosen */\n.chosen-container-single .chosen-single {\n    position: relative;\n    display: block;\n    overflow: hidden;\n    padding: 0 0 0 8px;\n    height: 23px;\n    border: 1px solid #aaa;\n    border-radius: 5px;\n    background-color: #fff;\n    background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4));\n    background: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);\n    background: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);\n    background: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);\n    background: linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);\n    background-clip: padding-box;\n    box-shadow: 0 0 3px white inset, 0 1px 1px rgba(0, 0, 0, 0.1);\n    color: #444;\n    text-decoration: none;\n    white-space: nowrap;\n    line-height: 24px;\n}\n.chosen-container-single .chosen-default {\n    color: #999;\n}\n.chosen-container-single .chosen-single span {\n    display: block;\n    overflow: hidden;\n    margin-right: 26px;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n}\n.chosen-container-single .chosen-single-with-deselect span {\n    margin-right: 38px;\n}\n.chosen-container-single .chosen-single abbr {\n    position: absolute;\n    top: 6px;\n    right: 26px;\n    display: block;\n    width: 12px;\n    height: 12px;\n    background: url('chosen-sprite.png') -42px 1px no-repeat;\n    font-size: 1px;\n}\n.chosen-container-single .chosen-single abbr:hover {\n    background-position: -42px -10px;\n}\n.chosen-container-single.chosen-disabled .chosen-single abbr:hover {\n    background-position: -42px -10px;\n}\n.chosen-container-single .chosen-single div {\n    position: absolute;\n    top: 0;\n    right: 0;\n    display: block;\n    width: 18px;\n    height: 100%;\n}\n.chosen-container-single .chosen-single div b {\n    display: block;\n    width: 100%;\n    height: 100%;\n    background: url('chosen-sprite.png') no-repeat 0px 7px;\n}\n.chosen-container-single .chosen-search {\n    position: relative;\n    z-index: 1010;\n    margin: 0;\n    padding: 3px 4px;\n    white-space: nowrap;\n}\n.chosen-container-single .chosen-search input[type=\"text\"] {\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n    margin: 1px 0;\n    padding: 4px 20px 4px 5px;\n    width: 100%;\n    height: auto;\n    outline: 0;\n    border: 1px solid #aaa;\n    background: white url('chosen-sprite.png') no-repeat 100% -20px;\n    background: url('chosen-sprite.png') no-repeat 100% -20px;\n    font-size: 1em;\n    font-family: sans-serif;\n    line-height: normal;\n    border-radius: 0;\n}\n.chosen-container-single .chosen-drop {\n    margin-top: -1px;\n    border-radius: 0 0 4px 4px;\n    background-clip: padding-box;\n}\n.chosen-container-single.chosen-container-single-nosearch .chosen-search {\n    position: absolute;\n    left: -9999px;\n}\n\n/* @end */\n/* @group Results */\n.chosen-container .chosen-results {\n    position: relative;\n    overflow-x: hidden;\n    overflow-y: auto;\n    margin: 0 4px 4px 0;\n    padding: 0 0 0 4px;\n    max-height: 240px;\n    -webkit-overflow-scrolling: touch;\n}\n.chosen-container .chosen-results li {\n    display: none;\n    margin: 0;\n    padding: 5px 6px;\n    list-style: none;\n    line-height: 15px;\n    -webkit-touch-callout: none;\n}\n.chosen-container .chosen-results li.active-result {\n    display: list-item;\n    cursor: pointer;\n}\n.chosen-container .chosen-results li.disabled-result {\n    display: list-item;\n    color: #ccc;\n    cursor: default;\n}\n.chosen-container .chosen-results li.highlighted {\n    background-color: #3875d7;\n    background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));\n    background-image: -webkit-linear-gradient(#3875d7 20%, #2a62bc 90%);\n    background-image: -moz-linear-gradient(#3875d7 20%, #2a62bc 90%);\n    background-image: -o-linear-gradient(#3875d7 20%, #2a62bc 90%);\n    background-image: linear-gradient(#3875d7 20%, #2a62bc 90%);\n    color: #fff;\n}\n.chosen-container .chosen-results li.no-results {\n    display: list-item;\n    background: #f4f4f4;\n}\n.chosen-container .chosen-results li.group-result {\n    display: list-item;\n    font-weight: bold;\n    cursor: default;\n}\n.chosen-container .chosen-results li.group-option {\n    padding-left: 15px;\n}\n.chosen-container .chosen-results li em {\n    font-style: normal;\n    text-decoration: underline;\n}\n\n/* @end */\n/* @group Multi Chosen */\n.chosen-container-multi .chosen-choices {\n    -moz-box-sizing: border-box;\n    background-color: #FFFFFF;\n    border: 1px solid #CBD5DD;\n    border-radius: 2px;\n    cursor: text;\n    height: auto !important;\n    margin: 0;\n    min-height: 30px;\n    overflow: hidden;\n    padding: 2px;\n    position: relative;\n    width: 100%;\n}\n.chosen-container-multi .chosen-choices li {\n    float: left;\n    list-style: none;\n}\n.chosen-container-multi .chosen-choices li.search-field {\n    margin: 0;\n    padding: 0;\n    white-space: nowrap;\n}\n.chosen-container-multi .chosen-choices li.search-field input[type=\"text\"] {\n    margin: 1px 0;\n    padding: 5px;\n    height: 25px;\n    outline: 0;\n    border: 0 !important;\n    background: transparent !important;\n    box-shadow: none;\n    color: #666;\n    font-size: 100%;\n    font-family: sans-serif;\n    line-height: normal;\n    border-radius: 0;\n}\n.chosen-container-multi .chosen-choices li.search-field .default {\n    color: #999;\n}\n.chosen-container-multi .chosen-choices li.search-choice {\n    position: relative;\n    margin: 3px 0 3px 5px;\n    padding: 3px 20px 3px 5px;\n    border: 1px solid #aaa;\n    border-radius: 3px;\n    background-color: #e4e4e4;\n    background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));\n    background-image: -webkit-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);\n    background-image: -moz-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);\n    background-image: -o-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);\n    background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);\n    background-clip: padding-box;\n    box-shadow: 0 0 2px white inset, 0 1px 0 rgba(0, 0, 0, 0.05);\n    color: #333;\n    line-height: 13px;\n    cursor: default;\n}\n.chosen-container-multi .chosen-choices li.search-choice .search-choice-close {\n    position: absolute;\n    top: 4px;\n    right: 3px;\n    display: block;\n    width: 12px;\n    height: 12px;\n    background: url('chosen-sprite.png') -42px 1px no-repeat;\n    font-size: 1px;\n}\n.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover {\n    background-position: -42px -10px;\n}\n.chosen-container-multi .chosen-choices li.search-choice-disabled {\n    padding-right: 5px;\n    border: 1px solid #ccc;\n    background-color: #e4e4e4;\n    background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));\n    background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);\n    background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);\n    background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);\n    background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);\n    color: #666;\n}\n.chosen-container-multi .chosen-choices li.search-choice-focus {\n    background: #d4d4d4;\n}\n.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close {\n    background-position: -42px -10px;\n}\n.chosen-container-multi .chosen-results {\n    margin: 0;\n    padding: 0;\n}\n.chosen-container-multi .chosen-drop .result-selected {\n    display: list-item;\n    color: #ccc;\n    cursor: default;\n}\n\n/* @end */\n/* @group Active  */\n.chosen-container-active .chosen-single {\n    border: 1px solid #5897fb;\n    box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);\n}\n.chosen-container-active.chosen-with-drop .chosen-single {\n    border: 1px solid #aaa;\n    -moz-border-radius-bottomright: 0;\n    border-bottom-right-radius: 0;\n    -moz-border-radius-bottomleft: 0;\n    border-bottom-left-radius: 0;\n}\n.chosen-container-active.chosen-with-drop .chosen-single div {\n    border-left: none;\n    background: transparent;\n}\n.chosen-container-active.chosen-with-drop .chosen-single div b {\n    background-position: -18px 7px;\n}\n.chosen-container-active .chosen-choices {\n    border: 1px solid #5897fb;\n    box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);\n}\n.chosen-container-active .chosen-choices li.search-field input[type=\"text\"] {\n    color: #111 !important;\n}\n\n/* @end */\n/* @group Disabled Support */\n.chosen-disabled {\n    opacity: 0.5 !important;\n    cursor: default;\n}\n.chosen-disabled .chosen-single {\n    cursor: default;\n}\n.chosen-disabled .chosen-choices .search-choice .search-choice-close {\n    cursor: default;\n}\n\n/* @end */\n/* @group Right to Left */\n.chosen-rtl {\n    text-align: right;\n}\n.chosen-rtl .chosen-single {\n    overflow: visible;\n    padding: 0 8px 0 0;\n}\n.chosen-rtl .chosen-single span {\n    margin-right: 0;\n    margin-left: 26px;\n    direction: rtl;\n}\n.chosen-rtl .chosen-single-with-deselect span {\n    margin-left: 38px;\n}\n.chosen-rtl .chosen-single div {\n    right: auto;\n    left: 3px;\n}\n.chosen-rtl .chosen-single abbr {\n    right: auto;\n    left: 26px;\n}\n.chosen-rtl .chosen-choices li {\n    float: right;\n}\n.chosen-rtl .chosen-choices li.search-field input[type=\"text\"] {\n    direction: rtl;\n}\n.chosen-rtl .chosen-choices li.search-choice {\n    margin: 3px 5px 3px 0;\n    padding: 3px 5px 3px 19px;\n}\n.chosen-rtl .chosen-choices li.search-choice .search-choice-close {\n    right: auto;\n    left: 4px;\n}\n.chosen-rtl.chosen-container-single-nosearch .chosen-search,\n.chosen-rtl .chosen-drop {\n    left: 9999px;\n}\n.chosen-rtl.chosen-container-single .chosen-results {\n    margin: 0 0 4px 4px;\n    padding: 0 4px 0 0;\n}\n.chosen-rtl .chosen-results li.group-option {\n    padding-right: 15px;\n    padding-left: 0;\n}\n.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div {\n    border-right: none;\n}\n.chosen-rtl .chosen-search input[type=\"text\"] {\n    padding: 4px 5px 4px 20px;\n    background: white url('chosen-sprite.png') no-repeat -30px -20px;\n    background: url('chosen-sprite.png') no-repeat -30px -20px;\n    direction: rtl;\n}\n.chosen-rtl.chosen-container-single .chosen-single div b {\n    background-position: 6px 2px;\n}\n.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b {\n    background-position: -12px 2px;\n}\n\n/* @end */\n/* @group Retina compatibility */\n@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi) {\n    .chosen-rtl .chosen-search input[type=\"text\"],\n    .chosen-container-single .chosen-single abbr,\n    .chosen-container-single .chosen-single div b,\n    .chosen-container-single .chosen-search input[type=\"text\"],\n    .chosen-container-multi .chosen-choices .search-choice .search-choice-close,\n    .chosen-container .chosen-results-scroll-down span,\n    .chosen-container .chosen-results-scroll-up span {\n        background-image: url('chosen-sprite%402x.png') !important;\n        background-size: 52px 37px !important;\n        background-repeat: no-repeat !important;\n    }\n}\n/* @end */\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/clockpicker/clockpicker.css",
    "content": "/*!\n * ClockPicker v{package.version} for Bootstrap (http://weareoutman.github.io/clockpicker/)\n * Copyright 2014 Wang Shenwei.\n * Licensed under MIT (https://github.com/weareoutman/clockpicker/blob/gh-pages/LICENSE)\n */\n\n.clockpicker .input-group-addon {\n\tcursor: pointer;\n}\n.clockpicker-moving {\n\tcursor: move;\n}\n.clockpicker-align-left.popover > .arrow {\n\tleft: 25px;\n}\n.clockpicker-align-top.popover > .arrow {\n\ttop: 17px;\n}\n.clockpicker-align-right.popover > .arrow {\n\tleft: auto;\n\tright: 25px;\n}\n.clockpicker-align-bottom.popover > .arrow {\n\ttop: auto;\n\tbottom: 6px;\n}\n.clockpicker-popover .popover-title {\n\tbackground-color: #fff;\n\tcolor: #999;\n\tfont-size: 24px;\n\tfont-weight: bold;\n\tline-height: 30px;\n\ttext-align: center;\n}\n.clockpicker-popover .popover-title span {\n\tcursor: pointer;\n}\n.clockpicker-popover .popover-content {\n\tbackground-color: #f8f8f8;\n\tpadding: 12px;\n}\n.popover-content:last-child {\n\tborder-bottom-left-radius: 5px;\n\tborder-bottom-right-radius: 5px;\n}\n.clockpicker-plate {\n\tbackground-color: #fff;\n\tborder: 1px solid #ccc;\n\tborder-radius: 50%;\n\twidth: 200px;\n\theight: 200px;\n\toverflow: visible;\n\tposition: relative;\n\t/* Disable text selection highlighting. Thanks to Hermanya */\n\t-webkit-touch-callout: none;\n\t-webkit-user-select: none;\n\t-khtml-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n.clockpicker-canvas,\n.clockpicker-dial {\n\twidth: 200px;\n\theight: 200px;\n\tposition: absolute;\n\tleft: -1px;\n\ttop: -1px;\n}\n.clockpicker-minutes {\n\tvisibility: hidden;\n}\n.clockpicker-tick {\n\tborder-radius: 50%;\n\tcolor: #666;\n\tline-height: 26px;\n\ttext-align: center;\n\twidth: 26px;\n\theight: 26px;\n\tposition: absolute;\n\tcursor: pointer;\n}\n.clockpicker-tick.active,\n.clockpicker-tick:hover {\n\tbackground-color: rgb(192, 229, 247);\n\tbackground-color: rgba(0, 149, 221, .25);\n}\n.clockpicker-button {\n\tbackground-image: none;\n\tbackground-color: #fff;\n\tborder-width: 1px 0 0;\n\tborder-top-left-radius: 0;\n\tborder-top-right-radius: 0;\n\tmargin: 0;\n\tpadding: 10px 0;\n}\n.clockpicker-button:hover {\n\tbackground-image: none;\n\tbackground-color: #ebebeb;\n}\n.clockpicker-button:focus {\n\toutline: none!important;\n}\n.clockpicker-dial {\n\t-webkit-transition: -webkit-transform 350ms, opacity 350ms;\n\t-moz-transition: -moz-transform 350ms, opacity 350ms;\n\t-ms-transition: -ms-transform 350ms, opacity 350ms;\n\t-o-transition: -o-transform 350ms, opacity 350ms;\n\ttransition: transform 350ms, opacity 350ms;\n}\n.clockpicker-dial-out {\n\topacity: 0;\n}\n.clockpicker-hours.clockpicker-dial-out {\n\t-webkit-transform: scale(1.2, 1.2);\n\t-moz-transform: scale(1.2, 1.2);\n\t-ms-transform: scale(1.2, 1.2);\n\t-o-transform: scale(1.2, 1.2);\n\ttransform: scale(1.2, 1.2);\n}\n.clockpicker-minutes.clockpicker-dial-out {\n\t-webkit-transform: scale(.8, .8);\n\t-moz-transform: scale(.8, .8);\n\t-ms-transform: scale(.8, .8);\n\t-o-transform: scale(.8, .8);\n\ttransform: scale(.8, .8);\n}\n.clockpicker-canvas {\n\t-webkit-transition: opacity 175ms;\n\t-moz-transition: opacity 175ms;\n\t-ms-transition: opacity 175ms;\n\t-o-transition: opacity 175ms;\n\ttransition: opacity 175ms;\n}\n.clockpicker-canvas-out {\n\topacity: 0.25;\n}\n.clockpicker-canvas-bearing,\n.clockpicker-canvas-fg {\n\tstroke: none;\n\tfill: rgb(0, 149, 221);\n}\n.clockpicker-canvas-bg {\n\tstroke: none;\n\tfill: rgb(192, 229, 247);\n}\n.clockpicker-canvas-bg-trans {\n\tfill: rgba(0, 149, 221, .25);\n}\n.clockpicker-canvas line {\n\tstroke: rgb(0, 149, 221);\n\tstroke-width: 1;\n\tstroke-linecap: round;\n\t/*shape-rendering: crispEdges;*/\n}\n.clockpicker-button.am-button {\n\tmargin: 1px;\n\tpadding: 5px;\n\tborder: 1px solid rgba(0, 0, 0, .2);\n\tborder-radius: 4px;\n\n}\n.clockpicker-button.pm-button {\n\tmargin: 1px 1px 1px 136px;\n\tpadding: 5px;\n\tborder: 1px solid rgba(0, 0, 0, .2);\n\tborder-radius: 4px;\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/codemirror/ambiance.css",
    "content": "/* ambiance theme for codemirror */\n\n/* Color scheme */\n\n.cm-s-ambiance .cm-keyword { color: #cda869; }\n.cm-s-ambiance .cm-atom { color: #CF7EA9; }\n.cm-s-ambiance .cm-number { color: #78CF8A; }\n.cm-s-ambiance .cm-def { color: #aac6e3; }\n.cm-s-ambiance .cm-variable { color: #ffb795; }\n.cm-s-ambiance .cm-variable-2 { color: #eed1b3; }\n.cm-s-ambiance .cm-variable-3 { color: #faded3; }\n.cm-s-ambiance .cm-property { color: #eed1b3; }\n.cm-s-ambiance .cm-operator {color: #fa8d6a;}\n.cm-s-ambiance .cm-comment { color: #555; font-style:italic; }\n.cm-s-ambiance .cm-string { color: #8f9d6a; }\n.cm-s-ambiance .cm-string-2 { color: #9d937c; }\n.cm-s-ambiance .cm-meta { color: #D2A8A1; }\n.cm-s-ambiance .cm-qualifier { color: yellow; }\n.cm-s-ambiance .cm-builtin { color: #9999cc; }\n.cm-s-ambiance .cm-bracket { color: #24C2C7; }\n.cm-s-ambiance .cm-tag { color: #fee4ff }\n.cm-s-ambiance .cm-attribute {  color: #9B859D; }\n.cm-s-ambiance .cm-header {color: blue;}\n.cm-s-ambiance .cm-quote { color: #24C2C7; }\n.cm-s-ambiance .cm-hr { color: pink; }\n.cm-s-ambiance .cm-link { color: #F4C20B; }\n.cm-s-ambiance .cm-special { color: #FF9D00; }\n.cm-s-ambiance .cm-error { color: #AF2018; }\n\n.cm-s-ambiance .CodeMirror-matchingbracket { color: #0f0; }\n.cm-s-ambiance .CodeMirror-nonmatchingbracket { color: #f22; }\n\n.cm-s-ambiance .CodeMirror-selected {\n  background: rgba(255, 255, 255, 0.15);\n}\n.cm-s-ambiance.CodeMirror-focused .CodeMirror-selected {\n  background: rgba(255, 255, 255, 0.10);\n}\n\n/* Editor styling */\n\n.cm-s-ambiance.CodeMirror {\n  line-height: 1.40em;\n  color: #E6E1DC;\n  background-color: #202020;\n  -webkit-box-shadow: inset 0 0 10px black;\n  -moz-box-shadow: inset 0 0 10px black;\n  box-shadow: inset 0 0 10px black;\n}\n\n.cm-s-ambiance .CodeMirror-gutters {\n  background: #3D3D3D;\n  border-right: 1px solid #4D4D4D;\n  box-shadow: 0 10px 20px black;\n}\n\n.cm-s-ambiance .CodeMirror-linenumber {\n  text-shadow: 0px 1px 1px #4d4d4d;\n  color: #111;\n  padding: 0 5px;\n}\n\n.cm-s-ambiance .CodeMirror-guttermarker { color: #aaa; }\n.cm-s-ambiance .CodeMirror-guttermarker-subtle { color: #111; }\n\n.cm-s-ambiance .CodeMirror-lines .CodeMirror-cursor {\n  border-left: 1px solid #7991E8;\n}\n\n.cm-s-ambiance .CodeMirror-activeline-background {\n  background: none repeat scroll 0% 0% rgba(255, 255, 255, 0.031);\n}\n\n.cm-s-ambiance.CodeMirror,\n.cm-s-ambiance .CodeMirror-gutters {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAQAAAAHUWYVAABFFUlEQVQYGbzBCeDVU/74/6fj9HIcx/FRHx9JCFmzMyGRURhLZIkUsoeRfUjS2FNDtr6WkMhO9sm+S8maJfu+Jcsg+/o/c+Z4z/t97/vezy3z+z8ekGlnYICG/o7gdk+wmSHZ1z4pJItqapjoKXWahm8NmV6eOTbWUOp6/6a/XIg6GQqmenJ2lDHyvCFZ2cBDbmtHA043VFhHwXxClWmeYAdLhV00Bd85go8VmaFCkbVkzlQENzfBDZ5gtN7HwF0KDrTwJ0dypSOzpaKCMwQHKTIreYIxlmhXTzTWkVm+LTynZhiSBT3RZQ7aGfjGEd3qyXQ1FDymqbKxpspERQN2MiRjNZlFFQXfCNFm9nM1zpAsoYjmtRTc5ajwuaXc5xrWskT97RaKzAGe5ARHhVUsDbjKklziiX5WROcJwSNCNI+9w1Jwv4Zb2r7lCMZ4oq5C0EdTx+2GzNuKpJ+iFf38JEWkHJn9DNF7mmBDITrWEg0VWL3pHU20tSZnuqWu+R3BtYa8XxV1HO7GyD32UkOpL/yDloINFTmvtId+nmAjxRw40VMwVKiwrKLE4bK5UOVntYwhOcSSXKrJHKPJedocpGjVz/ZMIbnYUPB10/eKCrs5apqpgVmWzBYWpmtKHecJPjaUuEgRDDaU0oZghCJ6zNMQ5ZhDYx05r5v2muQdM0EILtXUsaKiQX9WMEUotagQzFbUNN6NUPC2nm5pxEWGCjMc3GdJHjSU2kORLK/JGSrkfGEIjncU/CYUnOipoYemwj8tST9NsJmB7TUVXtbUtXATJVZXBMvYeTXJfobgJUPmGMP/yFaWonaa6BcFO3nqcIqCozSZoZoSr1g4zJOzuyGnxTEX3lUEJ7WcZgme8ddaWvWJo2AJR9DZU3CUIbhCSG6ybSwN6qtJVnCU2svDTP2ZInOw2cBTrqtQahtNZn9NcJ4l2NaSmSkkP1noZWnVwkLmdUPOwLZEwy2Z3S3R+4rIG9hcbpPXHFVWcQdZkn2FOta3cKWQnNRC5g1LsJah4GCzSVsKnCOY5OAFRTBekyyryeyilhFKva75r4Mc0aWanGEaThcy31s439KKxTzJYY5WTHPU1FtIHjQU3Oip4xlNzj/lBw23dYZVliQa7WAXf4shetcQfatI+jWRDBPmyNeW6A1P5kdDgyYJlba0BIM8BZu1JfrFwItyjcAMR3K0BWOIrtMEXyhyrlVEx3ui5dUBjmB/Q3CXW85R4mBD0s7B+4q5tKUjOlb9qqmhi5AZ6GFIC5HXtOobdYGlVdMVbNJ8toNTFcHxnoL+muBagcctjWnbNMuR00uI7nQESwg5q2qqrKWIfrNUmeQocY6HuyxJV02wj36w00yhpmUFenv4p6fUkZYqLyuinx2RGOjhCXYyJF84oiU00YMOOhhquNdfbOB7gU88pY4xJO8LVdp6/q2voeB4R04vIdhSE40xZObx1HGGJ/ja0LBthFInKaLPPFzuCaYaoj8JjPME8yoyxo6zlBqkiUZYgq00OYMswbWO5NGmq+xhipxHLRW29ARjNKXO0wRnear8XSg4XFPLKEPUS1GqvyLwiuBUoa7zpZ0l5xxFwWmWZC1H5h5FwU8eQ7K+g8UcVY6TMQreVQT/8uQ8Z+ALIXnSEa2pYZQneE9RZbSBNYXfWYJzW/h/4j4Dp1tYVcFIC5019Vyi4ThPqSFCzjGWaHQTBU8q6vrVwgxP9Lkm840imWKpcLCjYTtrKuwvsKSnrvHCXGkSMk9p6lhckfRpIeis+N2PiszT+mFLspyGleUhDwcLrZqmyeylxwjBcKHEapqkmyangyLZRVOijwOtCY5SsG5zL0OwlCJ4y5KznF3EUNDDrinwiyLZRzOXtlBbK5ITHFGLp8Q0R6ab6mS7enI2cFrxOyHvOCFaT1HThS1krjCwqWeurCkk+willhCC+RSZnRXBiZaC5RXRIZYKp2lyfrHwiKPKR0JDzrdU2EFgpidawlFDR6FgXUMNa+g1FY3bUQh2cLCwosRdnuQTS/S+JVrGLeWIvtQUvONJxlqSQYYKpwoN2kaocLjdVsis4Mk80ESF2YpSkzwldjHkjFCUutI/r+EHDU8oCs6yzL3PhWiEooZdFMkymlas4AcI3KmoMMNSQ3tHzjGWCrcJJdYyZC7QFGwjRL9p+MrRkAGWzIaWCn9W0F3TsK01c2ZvQw0byvxuQU0r1lM0qJO7wW0kRIMdDTtXEdzi4VIh+EoIHm0mWtAtpCixlabgn83fKTI7anJe9ST7WIK1DMGpQmYeA58ImV6ezOGOzK2Kgq01pd60cKWiUi9Lievb/0vIDPHQ05Kzt4ddPckQBQtoaurjyHnek/nKzpQLrVgKPjIkh2v4uyezpv+Xoo7fPFXaGFp1vaLKxQ4uUpQQS5VuQs7BCq4xRJv7fwpVvvFEB3j+620haOuocqMhWd6TTPAEx+mdFNGHdranFe95WrWmIvlY4F1Dle2ECgc6cto7SryuqGGGha0tFQ5V53migUKmg6XKAo4qS3mik+0OZpAhOLeZKicacgaYcyx5hypYQE02ZA4xi/pNhOQxR4klNKyqacj+mpxnLTnnGSo85++3ZCZq6lrZkXlGEX3o+C9FieccJbZWVFjC0Yo1FZnJhoYMFoI1hEZ9r6hwg75HwzBNhbZCdJEfJwTPGzJvaKImw1yYX1HDAmpXR+ZJQ/SmgqMNVQb5vgamGwLtt7VwvP7Qk1xpiM5x5Cyv93E06MZmgs0Nya2azIKOYKCGBQQW97RmhKNKF02JZqHEJ4o58qp7X5EcZmc56trXEqzjCBZ1MFGR87Ql2tSTs6CGxS05PTzRQorkbw7aKoKXFDXsYW42VJih/q+FP2BdTzDTwVqOYB13liM50vG7wy28qagyuIXMeQI/Oqq8bcn5wJI50xH00CRntyfpL1T4hydYpoXgNiFzoIUTDZnLNRzh4TBHwbYGDvZkxmlyJloyr6tRihpeUG94GnKtIznREF0tzJG/OOr73JBcrSh1k6WuTprgLU+mnSGnv6Zge0NNz+kTDdH8nuAuTdJDCNb21LCiIuqlYbqGzT3RAoZofQfjFazkqeNWdYaGvYTM001EW2oKPvVk1ldUGSgUtHFwjKM1h9jnFcmy5lChoLNaQMGGDsYbKixlaMBmmsx1QjCfflwTfO/gckW0ruZ3jugKR3R5W9hGUWqCgxuFgsuaCHorotGKzGaeZB9DMsaTnKCpMtwTvOzhYk0rdrArKCqcaWmVk1+F372ur1YkKxgatI8Qfe1gIX9wE9FgS8ESmuABIXnRUbCapcKe+nO7slClSZFzpV/LkLncEb1qiO42fS3R855Su2mCLh62t1SYZZYVmKwIHjREF2uihTzB20JOkz7dkxzYQnK0UOU494wh+VWRc6Un2kpTaVgLDFEkJ/uhzRcI0YKGgpGWOlocBU/a4fKoJ/pEaNV6jip3+Es9VXY078rGnmAdf7t9ylPXS34RBSuYPs1UecZTU78WanhBCHpZ5sAoTz0LGZKjPf9TRypqWEiTvOFglL1fCEY3wY/++rbk7C8bWebA6p6om6PgOL2kp44TFJlVNBXae2rqqdZztOJpT87GQsE9jqCPIe9VReZuQ/CIgacsyZdCpIScSYqcZk8r+nsyCzhyfhOqHGOIvrLknC8wTpFcaYiGC/RU1NRbUeUpocQOnkRpGOrIOcNRx+1uA0UrzhSSt+VyS3SJpnFWkzNDqOFGIWcfR86DnmARTQ1HKIL33ExPiemeOhYSSjzlSUZZuE4TveoJLnBUOFof6KiysCbnAEcZgcUNTDOwkqWu3RWtmGpZwlHhJENdZ3miGz0lJlsKnjbwqSHQjpxnFDlTLLwqJPMZMjd7KrzkSG7VsxXBZE+F8YZkb01Oe00yyRK9psh5SYh29ySPKBo2ylNht7ZkZnsKenjKNJu9PNEyZpaCHv4Kt6RQsLvAVp7M9kIimmCUwGeWqLMmGuIotYMmWNpSahkhZw9FqZsVnKJhsjAHvtHMsTM9fCI06Dx/u3vfUXCqfsKRc4oFY2jMsoo/7DJDwZ1CsIKnJu+J9ldkpmiCxQx1rWjI+T9FwcWWzOuaYH0Hj7klNRVWEQpmaqosakiGNTFHdjS/qnUdmf0NJW5xsL0HhimCCZZSRzmSPTXJQ4aaztAwtZnoabebJ+htCaZ7Cm535ByoqXKbX1WRc4Eh2MkRXWzImVc96Cj4VdOKVxR84VdQsIUM8Psoou2byVHyZFuq7O8otbSQ2UAoeEWTudATLGSpZzVLlXVkPU2Jc+27lsw2jmg5T5VhbeE3BT083K9WsTTkFU/Osi0rC5lRlpwRHUiesNS0sOvmqGML1aRbPAxTJD9ZKtxuob+hhl8cwYGWpJ8nub7t5p6coYbMovZ1BTdaKn1jYD6h4GFDNFyT/Kqe1XCXphXHOKLZmuRSRdBPEfVUXQzJm5YGPGGJdvAEr7hHNdGZnuBvrpciGmopOLf5N0uVMy0FfYToJk90uUCbJupaVpO53UJXR2bVpoU00V2KOo4zMFrBd0Jtz2pa0clT5Q5L8IpQ177mWQejPMEJhuQjS10ref6HHjdEhy1P1EYR7GtO0uSsKJQYLiTnG1rVScj5lyazpqWGl5uBbRWl7m6ixGOOnEsMJR7z8J0n6KMnCdxhiNYQCoZ6CmYLnO8omC3MkW3bktlPmEt/VQQHejL3+dOE5FlPdK/Mq8hZxxJtLyRrepLThYKbLZxkSb5W52vYxNOaOxUF0yxMUPwBTYqCzy01XayYK0sJyWBLqX0MwU5CzoymRzV0EjjeUeLgDpTo6ij42ZAzvD01dHUUTPLU96MdLbBME8nFBn7zJCMtJcZokn8YoqU0FS5WFKyniHobguMcmW8N0XkWZjkyN3hqOMtS08r+/xTBwpZSZ3qiVRX8SzMHHjfUNFjgHEPmY9PL3ykEzxkSre/1ZD6z/NuznuB0RcE1TWTm9zRgfUWVJiG6yrzgmWPXC8EAR4Wxhlad0ZbgQyEz3pG5RVEwwDJH2mgKpjcTiCOzn1lfUWANFbZ2BA8balnEweJC9J0iuaeZoI+ippFCztEKVvckR2iice1JvhVytrQwUAZpgsubCPaU7xUe9vWnaOpaSBEspalykhC9bUlOMpT42ZHca6hyrqKmw/wMR8H5ZmdFoBVJb03O4UL0tSNnvIeRmkrLWqrs78gcrEn2tpcboh0UPOW3UUR9PMk4T4nnNKWmCjlrefhCwxRNztfmIQVdDElvS4m1/WuOujoZCs5XVOjtKPGokJzsYCtFYoWonSPT21DheU/wWhM19FcElwqNGOsp9Q8N/cwXaiND1MmeL1Q5XROtYYgGeFq1aTMsoMmcrKjQrOFQTQ1fmBYhmW6o8Jkjc7iDJRTBIo5kgJD5yMEYA3srCg7VFKwiVJkmRCc5ohGOKhsYMn/XBLdo5taZjlb9YAlGWRimqbCsoY7HFAXLa5I1HPRxMMsQDHFkWtRNniqT9UEeNjcE7RUlrCJ4R2CSJuqlKHWvJXjAUNcITYkenuBRB84TbeepcqTj3zZyFJzgYQdHnqfgI0ddUwS6GqWpsKWhjq9cV0vBAEMN2znq+EBfIWT+pClYw5xsTlJU6GeIBsjGmmANTzJZiIYpgrM0Oa8ZMjd7NP87jxhqGOhJlnQtjuQpB+8aEE00wZFznSJPyHxgH3HkPOsJFvYk8zqCHzTs1BYOa4J3PFU+UVRZxlHDM4YavlNUuMoRveiZA2d7grMNc2g+RbSCEKzmgYsUmWmazFJyoiOZ4KnyhKOGRzWJa0+moyV4TVHDzn51Awtqaphfk/lRQ08FX1iiqxTB/kLwd0VynKfEvI6cd4XMV5bMhZ7gZUWVzYQ6Nm2BYzxJbw3bGthEUUMfgbGeorae6DxHtJoZ6alhZ0+ytiVoK1R4z5PTrOECT/SugseEOlb1MMNR4VRNcJy+V1Hg9ONClSZFZjdHlc6W6FBLdJja2MC5hhpu0DBYEY1TFGwiFAxRRCsYkiM9JRb0JNMVkW6CZYT/2EiTGWmo8k+h4FhDNE7BvppoTSFnmCV5xZKzvcCdDo7VVPnIU+I+Rc68juApC90MwcFCsJ5hDqxgScYKreruyQwTqrzoqDCmhWi4IbhB0Yrt3RGa6GfDv52rKXWhh28dyZaWUvcZeMTBaZoSGyiCtRU5J8iviioHaErs7Jkj61syVzTTgOcUOQ8buFBTYWdL5g3T4qlpe0+wvD63heAXRfCCIed9RbCsp2CiI7raUOYOTU13N8PNHvpaGvayo4a3LLT1lDrVEPT2zLUlheB1R+ZTRfKWJ+dcocLJfi11vyJ51lLqJ0WD7tRwryezjiV5W28uJO9qykzX8JDe2lHl/9oyBwa2UMfOngpXCixvKdXTk3wrsKmiVYdZIqsoWEERjbcUNDuiaQomGoIbFdEHmsyWnuR+IeriKDVLnlawlyNHKwKlSU631PKep8J4Q+ayjkSLKYLhalNHlYvttb6fHm0p6OApsZ4l2VfdqZkjuysy6ysKLlckf1KUutCTs39bmCgEyyoasIWlVaMF7mgmWtBT8Kol5xpH9IGllo8cJdopcvZ2sImlDmMIbtDk3KIpeNiS08lQw11NFPTwVFlPP6pJ2gvRfI7gQUfmNAtf6Gs0wQxDsKGlVBdF8rCa3jzdwMaGHOsItrZk7hAyOzpK9VS06j5F49b0VNGOOfKs3lDToMsMBe9ZWtHFEgxTJLs7qrygKZjUnmCYoeAqeU6jqWuLJup4WghOdvCYJnrSkSzoyRkm5M2StQwVltPkfCAk58tET/CSg+8MUecmotMEnhBKfWBIZsg2ihruMJQaoIm+tkTLKEqspMh00w95gvFCQRtDwTT1gVDDSEVdlwqZfxoQRbK0g+tbiBZxzKlpnpypejdDwTaeOvorMk/IJE10h9CqRe28hhLbe0pMsdSwv4ZbhKivo2BjDWfL8UKJgeavwlwb5KlwhyE4u4XkGE2ytZCznKLCDZZq42VzT8HLCrpruFbIfOIINmh/qCdZ1ZBc65kLHR1Bkyf5zn6pN3SvGKIlFNGplhrO9QSXanLOMQTLCa0YJCRrCZm/CZmrLTm7WzCK4GJDiWUdFeYx1LCFg3NMd0XmCuF3Y5rITLDUsYS9zoHVzwnJoYpSTQoObyEzr4cFBNqYTopoaU/wkyLZ2lPhX/5Y95ulxGTV7KjhWrOZgl8MyUUafjYraNjNU1N3IWcjT5WzWqjwtoarHSUObGYO3GCJZpsBlnJGPd6ZYLyl1GdCA2625IwwJDP8GUKymbzuyPlZlvTUsaUh5zFDhRWFzPKKZLAlWdcQbObgF9tOqOsmB1dqcqYJmWstFbZRRI9poolmqiLnU0POvxScpah2iSL5UJNzgScY5+AuIbpO0YD3NCW+dLMszFSdFCWGqG6eVq2uYVNDdICGD6W7EPRWZEY5gpsE9rUkS3mijzzJnm6UpUFXG1hCUeVoS5WfNcFpblELL2qqrCvMvRfd45oalvKU2tiQ6ePJOVMRXase9iTtLJztPxJKLWpo2CRDcJwn2sWSLKIO1WQWNTCvpVUvOZhgSC40JD0dOctaSqzkCRbXsKlb11Oip6PCJ0IwSJM31j3akRxlP7Rwn6aGaUL0qiLnJkvB3xWZ2+Q1TfCwpQH3G0o92UzmX4o/oJNQMMSQc547wVHhdk+VCw01DFYEnTxzZKAm74QmeNNR1w6WzEhNK15VJzuCdxQ53dRUDws5KvwgBMOEgpcVNe0hZI6RXT1Jd0cyj5nsaEAHgVmGaJIlWdsc5Ui2ElrRR6jrRAttNMEAIWrTDFubkZaok7/AkzfIwfuWVq0jHzuCK4QabtLUMVPB3kJ0oyHTSVFlqMALilJf2Rf8k5aaHtMfayocLBS8L89oKoxpJvnAkDPa0qp5DAUTHKWmCcnthlou8iCKaFFLHWcINd1nyIwXqrSxMNmSs6KmoL2QrKuWtlQ5V0120xQ5vRyZS1rgFkWwhiOwiuQbR0OOVhQM9iS3tiXp4RawRPMp5tDletOOBL95MpM01dZTBM9pkn5qF010rIeHFcFZhmSGpYpTsI6nwhqe5C9ynhlpp5ophuRb6WcJFldkVnVEwwxVfrVkvnWUuNLCg5bgboFHPDlDPDmnK7hUrWiIbjadDclujlZcaokOFup4Ri1kacV6jmrrK1hN9bGwpKEBQ4Q6DvIUXOmo6U5LqQM6EPyiKNjVkPnJkDPNEaxhiFay5ExW1NXVUGqcpYYdPcGiCq7z/TSlbhL4pplWXKd7NZO5QQFrefhRQW/NHOsqcIglc4UhWklR8K0QzbAw08CBDnpbgqXdeD/QUsM4RZXDFBW6WJKe/mFPdH0LtBgiq57wFLzlyQzz82qYx5D5WJP5yVJDW01BfyHnS6HKO/reZqId1WGa4Hkh2kWodJ8i6KoIPlAj2hPt76CzXsVR6koPRzWTfKqIentatYpQw2me4AA3y1Kind3SwoOKZDcFXTwl9tWU6mfgRk9d71sKtlNwrjnYw5tC5n5LdKiGry3JKNlHEd3oaMCFHrazBPMp/uNJ+V7IudcSbeOIdjUEdwl0VHCOZo5t6YluEuaC9mQeMgSfOyKnYGFHcIeQ84yQWbuJYJpZw5CzglDH7gKnWqqM9ZTaXcN0TeYhR84eQtJT76JJ1lREe7WnnvsMmRc9FQ7SBBM9mV3lCUdmHk/S2RAMt0QjFNFqQpWjDPQ01DXWUdDBkXziKPjGEP3VP+zIWU2t7im41FOloyWzn/L6dkUy3VLDaZ6appgDLHPjJEsyvJngWEPUyVBiAaHCTEXwrLvSEbV1e1gKJniicWorC1MUrVjB3uDhJE/wgSOzk1DXpk0k73qCM8xw2UvD5kJmDUfOomqMpWCkJRlvKXGmoeBm18USjVIk04SClxTB6YrgLAPLWYK9HLUt5cmc0vYES8GnTeRc6skZbQkWdxRsIcyBRzx1DbTk9FbU0caTPOgJHhJKnOGIVhQqvKmo0llRw9sabrZkDtdg3PqaKi9oatjY8B+G371paMg6+mZFNNtQ04mWBq3rYLOmtWWQp8KJnpy9DdFensyjdqZ+yY40VJlH8wcdLzC8PZnvHMFUTZUrDTkLyQaGus5X5LzpYAf3i+e/ZlhqGqWhh6Ou6xTR9Z6oi5AZZtp7Mj2EEm8oSpxiYZCHU/1fbGdNNNRRoZMhmilEb2gqHOEJDtXkHK/JnG6IrvbPCwV3NhONVdS1thBMs1T4QOBcTWa2IzhMk2nW5Kyn9tXUtpv9RsG2msxk+ZsQzRQacJncpgke0+T8y5Fzj8BiGo7XlJjaTIlpQs7KFjpqGnKuoyEPeIKnFMkZHvopgh81ySxNFWvJWcKRs70j2FOT012IllEEO1n4pD1513Yg2ssQPOThOkvyrqHUdEXOSEsihmBbTbKX1kLBPWqWkLOqJbjB3GBIZmoa8qWl4CG/iZ7oiA72ZL7TJNeZUY7kFQftDcHHluBzRbCegzMtrRjVQpX2lgoPKKLJAkcbMl01XK2p7yhL8pCBbQ3BN2avJgKvttcrWDK3CiUOVxQ8ZP+pqXKyIxnmBymCg5vJjNfkPK4+c8cIfK8ocVt7kmfd/I5SR1hKvCzUtb+lhgc00ZaO6CyhIQP1Uv4yIZjload72PXX0OIJvnFU+0Zf6MhsJwTfW0r0UwQfW4LNLZl5HK261JCZ4qnBaAreVAS3WrjV0LBnNDUNNDToCEeFfwgcb4gOEqLRhirWkexrCEYKVV711DLYEE1XBEsp5tpTGjorkomKYF9FDXv7fR3BGwbettSxnyL53MBPjsxDZjMh+VUW9NRxq1DhVk+FSxQcaGjV9Pawv6eGByw5qzoy7xk4RsOShqjJwWKe/1pEEfzkobeD/dQJmpqedcyBTy2sr4nGNRH0c0SPWTLrqAc0OQcb/gemKgqucQT7ySWKCn2EUotoCvpZct7RO2sy/QW0IWcXd7pQRQyZVwT2USRO87uhjioTLKV2brpMUcMQRbKH/N2T+UlTpaMls6cmc6CCNy3JdYYSUzzJQ4oSD3oKLncULOiJvjBEC2oqnCJkJluCYy2ZQ5so9YYlZ1VLlQU1mXEW1jZERwj/MUSRc24TdexlqLKfQBtDTScJUV8FszXBEY5ktpD5Ur9hYB4Nb1iikw3JoYpkKX+RodRKFt53MMuRnKSpY31PwYaGaILh3wxJGz9TkTPEETxoCWZrgvOlmyMzxFEwVJE5xZKzvyJ4WxEc16Gd4Xe3Weq4XH2jKRikqOkGQ87hQnC7wBmGYLAnesX3M+S87eFATauuN+Qcrh7xIxXJbUIdMw3JGE3ylCWzrieaqCn4zhGM19TQ3z1oH1AX+pWEqIc7wNGAkULBo/ZxRaV9NNyh4Br3rCHZzbzmSfawBL0dNRwpW1kK9mxPXR9povcdrGSZK9c2k0xwFGzjuniCtRSZCZ6ccZ7gaktmgAOtKbG/JnOkJrjcQTdFMsxRQ2cLY3WTIrlCw1eWKn8R6pvt4GFDso3QoL4a3nLk3G6JrtME3dSenpx7PNFTmga0EaJTLQ061sEeQoWXhSo9LTXsaSjoJQRXeZLtDclbCrYzfzHHeaKjHCVOUkQHO3JeEepr56mhiyaYYKjjNU+Fed1wS5VlhWSqI/hYUdDOkaxiKehoyOnrCV5yBHtbWFqTHCCwtpDcYolesVR5yUzTZBb3RNMd0d6WP+SvhuBmRcGxnuQzT95IC285cr41cLGQ6aJJhmi4TMGempxeimBRQw1tFKV+8jd6KuzoSTqqDxzRtpZkurvKEHxlqXKRIjjfUNNXQsNOsRScoWFLT+YeRZVD3GRN0MdQcKqQjHDMrdGGVu3iYJpQx3WGUvfbmxwFfR20WBq0oYY7LMFhhgYtr8jpaEnaOzjawWWaTP8mMr0t/EPDPoqcnxTBI5o58L7uoWnMrpoqPwgVrlAUWE+V+TQl9rawoyP6QGAlQw2TPRX+YSkxyBC8Z6jhHkXBgQL7WII3DVFnRfCrBfxewv9D6xsyjys4VkhWb9pUU627JllV0YDNHMku/ldNMMXDEo4aFnAkk4U6frNEU4XgZUPmEKHUl44KrzmYamjAbh0JFvGnaTLPu1s9jPCwjFpYiN7z1DTOk/nc07CfDFzmCf7i+bfNHXhDtLeBXzTBT5rkMvWOIxpl4EMh2LGJBu2syDnAEx2naEhHDWMMzPZEhygyS1mS5RTJr5ZkoKbEUoYqr2kqdDUE8ztK7OaIntJkFrIECwv8LJTaVx5XJE86go8dFeZ3FN3rjabCAYpoYEeC9zzJVULBbmZhDyd7ko09ydpNZ3nm2Kee4FPPXHnYEF1nqOFEC08LUVcDvYXkJHW8gTaKCk9YGOeIJhqiE4ToPEepdp7IWFjdwnWaufGMwJJCMtUTTBBK9BGCOy2tGGrJTHIwyEOzp6aPzNMOtlZkDvcEWpP5SVNhfkvDxhmSazTJXYrM9U1E0xwFVwqZQwzJxw6+kGGGUj2FglGGmnb1/G51udRSMNlTw6GGnCcUwVcOpmsqTHa06o72sw1RL02p9z0VbnMLOaIX3QKaYKSCFQzBKEUNHTSc48k53RH9wxGMtpQa5KjjW0W0n6XCCCG4yxNNdhQ4R4l1Ff+2sSd6UFHiIEOyqqFgT01mEUMD+joy75jPhOA+oVVLm309FR4yVOlp4RhLiScNmSmaYF5Pw0STrOIoWMSR2UkRXOMp+M4SHW8o8Zoi6OZgjKOaFar8zZDzkWzvKOjkKBjmCXby8JahhjXULY4KlzgKLvAwxVGhvyd4zxB1d9T0piazmKLCVZY5sKiD0y2ZSYrkUEPUbIk+dlQ4SJHTR50k1DPaUWIdTZW9NJwnJMOECgd7ou/MnppMJ02O1VT4Wsh85MnZzcFTngpXGKo84qmwgKbCL/orR/SzJ2crA+t6Mp94KvxJUeIbT3CQu1uIdlQEOzlKfS3UMcrTiFmOuroocrZrT2AcmamOKg8YomeEKm/rlT2sociMaybaUlFhuqHCM2qIJ+rg4EcDFymiDSxzaHdPcpE62pD5kyM5SBMoA1PaUtfIthS85ig1VPiPPYXgYEMNk4Qq7TXBgo7oT57gPUdwgCHzhIVFPFU6OYJzHAX9m5oNrVjeE61miDrqQ4VSa1oiURTsKHC0IfjNwU2WzK6eqK8jWln4g15TVBnqmDteCJ501PGAocJhhqjZdtBEB6lnhLreFJKxmlKbeGrqLiSThVIbCdGzloasa6lpMQXHCME2boLpJgT7yWaemu6wBONbqGNVRS0PKIL7LckbjmQtR7K8I5qtqel+T/ChJTNIKLjdUMNIRyvOEko9YYl2cwQveBikCNawJKcLBbc7+JM92mysNvd/Fqp8a0k6CNEe7cnZrxlW0wQXaXjaktnRwNOGZKYiONwS7a1JVheq3WgJHlQUGKHKmp4KAxXR/ULURcNgoa4zhKSLpZR3kxRRb0NmD0OFn+UCS7CzI1nbP6+o4x47QZE5xRCt3ZagnYcvmpYQktXdk5YKXTzBC57kKEe0VVuiSYqapssMS3C9p2CKkHOg8B8Pa8p5atrIw3qezIWanMGa5HRDNF6RM9wcacl0N+Q8Z8hsIkSnaIIdHRUOEebAPy1zbCkhM062FCJtif7PU+UtoVXzWKqM1PxXO8cfdruhFQ/a6x3JKYagvVDhQEtNiyiiSQ7OsuRsZUku0CRNDs4Sog6KKjsZgk2bYJqijgsEenoKeniinRXBn/U3lgpPdyDZynQx8IiioMnCep5Ky8mjGs6Wty0l1hUQTcNWswS3WRp2kCNZwJG8omG8JphPUaFbC8lEfabwP7VtM9yoaNCAjpR41VNhrD9LkbN722v0CoZMByFzhaW+MyzRYEWFDQwN2M4/JiT76PuljT3VU/A36eaIThb+R9oZGOAJ9tewkgGvqOMNRWYjT/Cwu99Q8LqDE4TgbLWxJ1jaDDAERsFOFrobgjUsBScaguXU8kKm2RL19tRypSHnHNlHiIZqgufs4opgQdVdwxBNNFBR6kVFqb8ogimOzB6a6HTzrlDHEpYaxjiiA4TMQobkDg2vejjfwJGWmnbVFAw3H3hq2NyQfG7hz4aC+w3BbwbesG0swYayvpAs6++Ri1Vfzx93mFChvyN5xVHTS+0p9aqCAxyZ6ZacZyw5+7uuQkFPR9DDk9NOiE7X1PCYJVjVUqq7JlrHwWALF5nfHNGjApdpqgzx5OwilDhCiDYTgnc9waGW4BdLNNUQvOtpzDOWHDH8D7TR/A/85KljEQu3NREc4Pl/6B1Hhc8Umb5CsKMmGC9EPcxoT2amwHNCmeOEnOPbklnMkbOgIvO5UMOpQrS9UGVdt6iH/fURjhI/WOpaW9OKLYRod6HCUEdOX000wpDZQ6hwg6LgZfOqo1RfT/CrJzjekXOGhpc1VW71ZLbXyyp+93ILbC1kPtIEYx0FIx1VDrLoVzXRKRYWk809yYlC9ImcrinxtabKnzRJk3lAU1OLEN1j2zrYzr2myHRXJFf4h4QKT1qSTzTB5+ZNTzTRkAxX8FcLV2uS8eoQQ2aAkFzvCM72sJIcJET3WPjRk5wi32uSS9rfZajpWEvj9hW42F4o5NytSXYy8IKHay10VYdrcl4SkqscrXpMwyGOgtkajheSxdQqmpxP1L3t4R5PqasFnrQEjytq6qgp9Y09Qx9o4S1FzhUCn1kyHSzBWLemoSGvOqLNhZyBjmCaAUYpMgt4Ck7wBBMMwWKWgjsUwTaGVsxWC1mYoKiyqqeGKYqonSIRQ3KIkHO0pmAxTdBHkbOvfllfr+AA+7gnc50huVKYK393FOyg7rbPO/izI7hE4CnHHHnJ0ogNPRUGeUpsrZZTBJcrovUcJe51BPsr6GkJdhCCsZ6aTtMEb2pqWkqeVtDXE/QVggsU/Nl86d9RMF3DxvZTA58agu810RWawCiSzzXBeU3MMW9oyJUedvNEvQyNu1f10BSMddR1vaLCYpYa/mGocLSiYDcLbQz8aMn5iyF4xBNMs1P0QEOV7o5gaWGuzSeLue4tt3ro7y4Tgm4G/mopdZgl6q0o6KzJWE3mMksNr3r+a6CbT8g5wZNzT9O7fi/zpaOmnz3BRoqos+tv9zMbdpxsqDBOEewtJLt7cg5wtKKbvldpSzRRCD43VFheCI7yZLppggMVBS/KMAdHODJvOwq2NQSbKKKPLdFWQs7Fqo+mpl01JXYRgq8dnGLhTiFzqmWsUMdpllZdbKlyvSdYxhI9YghOtxR8LgSLWHK62mGGVoxzBE8LNWzqH9CUesQzFy5RQzTc56mhi6fgXEWwpKfE5Z7M05ZgZUPmo6auiv8YKzDYwWBLMErIbKHJvOwIrvEdhOBcQ9JdU1NHQ7CXn2XIDFBKU2WAgcX9UAUzDXWd5alwuyJ41Z9rjKLCL4aCp4WarhPm2rH+SaHUYE001JDZ2ZAzXPjdMpZWvC9wmqIB2lLhQ01D5jO06hghWMndbM7yRJMsoCj1vYbnFQVrW9jak3OlEJ3s/96+p33dEPRV5GxiqaGjIthUU6FFEZyqCa5qJrpBdzSw95IUnOPIrCUUjRZQFrbw5PR0R1qiYx3cb6nrWUMrBmmiBQxVHtTew5ICP/ip6g4hed/Akob/32wvBHsIOX83cI8hGeNeNPCIkPmXe8fPKx84OMSRM1MTdXSwjCZ4S30jVGhvqTRak/OVhgGazHuOCud5onEO1lJr6ecVyaOK6H7zqlBlIaHE0oroCgfvGJIdPcmfLNGLjpz7hZwZQpUbFME0A1cIJa7VNORkgfsMBatbKgwwJM9bSvQXeNOvbIjelg6WWvo5kvbKaJJNHexkKNHL9xRyFlH8Ti2riB5wVPhUk7nGkJnoCe428LR/wRGdYIlmWebCyxou1rCk4g/ShugBDX0V0ZQWkh0dOVsagkM0yV6OoLd5ye+pRlsCr0n+KiQrGuq5yJDzrTAXHtLUMduTDBVKrSm3eHL+6ijxhFDX9Z5gVU/wliHYTMiMFpKLNMEywu80wd3meoFmt6VbRMPenhrOc6DVe4pgXU8DnnHakLOIIrlF4FZPIw6R+zxBP0dyq6OOZ4Q5sLKCcz084ok+VsMMyQhNZmmBgX5xIXOEJTmi7VsGTvMTNdHHhpzdbE8Du2oKxgvBqQKdDDnTFOylCFaxR1syz2iqrOI/FEpNc3C6f11/7+ASS6l2inq2ciTrCCzgyemrCL5SVPjQkdPZUmGy2c9Sw9FtR1sS30RmsKPCS4rkIC/2U0MduwucYolGaPjKEyhzmiPYXagyWbYz8LWBDdzRimAXzxx4z8K9hpzlhLq+NiQ97HuKorMUfK/OVvC2JfiHUPCQI/q7J2gjK+tTDNxkCc4TMssqCs4TGtLVwQihyoAWgj9bosU80XGW6Ac9TJGziaUh5+hnFcHOnlaM1iRn29NaqGENTTTSUHCH2tWTeV0osUhH6psuVLjRUmGWhm6OZEshGeNowABHcJ2Bpy2ZszRcKkRXd2QuKVEeXnbfaEq825FguqfgfE2whlChSRMdron+LATTPQ2Z369t4B9C5gs/ylzv+CMmepIDPclFQl13W0rspPd1JOcbghGOEutqCv5qacURQl3dDKyvyJlqKXGPgcM9FfawJAMVmdcspcYKOZc4GjDYkFlK05olNMHyHn4zFNykyOxt99RkHlfwmiHo60l2EKI+mhreEKp080Tbug08BVPcgoqC5zWt+NLDTZ7oNSF51N1qie7Va3uCCwyZbkINf/NED6jzOsBdZjFN8oqG3wxVunqCSYYKf3EdhJyf9YWGf7tRU2oH3VHgPr1fe5J9hOgHd7xQ0y7qBwXr23aGErP0cm64JVjZwsOGqL+mhNgZmhJLW2oY4UhedsyBgzrCKrq7BmcpNVhR6jBPq64Vgi+kn6XE68pp8J5/+0wRHGOpsKenQn9DZntPzjRLZpDAdD2fnSgkG9tmIXnUwQ6WVighs7Yi2MxQ0N3CqYaCXkJ0oyOztMDJjmSSpcpvlrk0RMMOjmArQ04PRV1DO1FwhCVaUVPpKUM03JK5SxPsIWRu8/CGHi8UHChiqGFDTbSRJWeYUDDcH6vJWUxR4k1FXbMUwV6e4AJFXS8oMqsZKqzvYQ9DDQdZckY4aGsIhtlubbd2r3j4QBMoTamdPZk7O/Bf62lacZwneNjQoGcdVU7zJOd7ghsUHOkosagic6cnWc8+4gg285R6zZP5s1/LUbCKIznTwK36PkdwlOrl4U1LwfdCCa+IrvFkmgw1PCAUXKWo0sURXWcI2muKJlgyFzhynCY4RBOsqCjoI1R5zREco0n2Vt09BQtYSizgKNHfUmUrQ5UOCh51BFcLmY7umhYqXKQomOop8bUnWNNQcIiBcYaC6xzMNOS8JQQfeqKBmmglB+97ok/lfk3ygaHSyZaCRTzRxQo6GzLfa2jWBPepw+UmT7SQEJyiyRkhBLMVOfcoMjcK0eZChfUNzFAUzCsEN5vP/X1uP/n/aoMX+K+nw/Hjr/9xOo7j7Pju61tLcgvJpTWXNbfN5jLpi6VfCOviTktKlFusQixdEKWmEBUKNaIpjZRSSOXSgzaaKLdabrm1/9nZ+/f+vd/vz/v9+Xy+zZ7PRorYoZqyLrCwQdEAixxVOEXNNnjX2nUSRlkqGmWowk8lxR50JPy9Bo6qJXaXwNvREBvnThPEPrewryLhcAnj5WE15Fqi8W7R1sAuEu86S4ENikItFN4xkv9Af4nXSnUVcLiA9xzesFpivRRVeFKtsMRaKBhuSbjOELnAUtlSQUpXgdfB4Z1oSbnFEetbQ0IrAe+Y+pqnDcEJFj6S8LDZzZHwY4e3XONNlARraomNEt2bkvGsosA3ioyHm+6jCMbI59wqt4eeara28IzEmyPgoRaUOEDhTVdEJhmCoTWfC0p8aNkCp0oYqih2iqGi4yXeMkOsn4LdLLnmKfh/YogjNsPebeFGR4m9BJHLzB61XQ3BtpISfS2FugsK9FAtLWX1dCRcrCnUp44CNzuCowUZmxSRgYaE6Za0W2u/E7CVXCiI/UOR8aAm1+OSyE3mOUcwyc1zBBeoX1kiKy0Zfxck1Gsyulti11i83QTBF5Kg3pDQThFMVHiPSlK+0cSedng/VaS8bOZbtsBcTcZAR8JP5KeqQ1OYKAi20njdNNRpgnsU//K+JnaXJaGTomr7aYIphoRn9aeShJWKEq9LcozSF7QleEfDI5LYm5bgVkFkRwVDBCVu0DDIkGupo8TZBq+/pMQURYErJQmPKGKjNDkWOLx7Jd5QizdUweIaKrlP7SwJDhZvONjLkOsBBX9UpGxnydhXkfBLQ8IxgojQbLFnJf81JytSljclYYyEFyx0kVBvKWOFJmONpshGAcsduQY5giVNCV51eOdJYo/pLhbvM0uDHSevNKRcrKZIqnCtJeEsO95RoqcgGK4ocZcho1tTYtcZvH41pNQ7vA0WrhIfOSraIIntIAi+NXWCErdbkvrWwjRLrt0NKUdL6KSOscTOdMSOUtBHwL6OLA0vNSdynaWQEnCpIvKaIrJJEbvHkmuNhn6OjM8VkSGSqn1uYJCGHnq9I3aLhNME3t6GjIkO7xrNFumpyTNX/NrwX7CrIRiqqWijI9JO4d1iieykyfiposQIQ8YjjsjlBh6oHWbwRjgYJQn2NgSnNycmJAk3NiXhx44Sxykihxm8ybUwT1OVKySc7vi3OXVkdBJ4AyXBeksDXG0IhgtYY0lY5ahCD0ehborIk5aUWRJviMA7Xt5kyRjonrXENkm8yYqgs8VzgrJmClK20uMM3jRJ0FiQICQF9hdETlLQWRIb5ki6WDfWRPobvO6a4GP5mcOrNzDFELtTkONLh9dXE8xypEg7z8A9jkhrQ6Fhjlg/QVktJXxt4WXzT/03Q8IaQWSqIuEvloQ2mqC9Jfi7wRul4RX3pSPlzpoVlmCtI2jvKHCFhjcM3sN6lqF6HxnKelLjXWbwrpR4xzuCrTUZx2qq9oAh8p6ixCUGr78g8oyjRAtB5CZFwi80VerVpI0h+IeBxa6Zg6kWvpDHaioYYuEsRbDC3eOmC2JvGYLeioxGknL2UATNJN6hmtj1DlpLvDVmocYbrGCVJKOrg4X6DgddLA203BKMFngdJJFtFd7vJLm6KEpc5yjQrkk7M80SGe34X24nSex1Ra5Omgb71JKyg8SrU3i/kARKwWpH0kOGhKkObyfd0ZGjvyXlAkVZ4xRbYJ2irFMkFY1SwyWxr2oo4zlNiV+7zmaweFpT4kR3kaDAFW6xpSqzJay05FtYR4HmZhc9UxKbbfF2V8RG1MBmSaE+kmC6JnaRXK9gsiXhJHl/U0qM0WTcbyhwkYIvFGwjSbjfwhiJt8ZSQU+Bd5+marPMOkVkD0muxYLIfEuhh60x/J92itguihJSEMySVPQnTewnEm+620rTQEMsOfo4/kP/0ARvWjitlpSX7GxBgcMEsd3EEeYWvdytd+Saawi6aCIj1CkGb6Aj9rwhx16Cf3vAwFy5pyLhVonXzy51FDpdEblbkdJbUcEPDEFzQ8qNmhzzLTmmKWKbFCXeEuRabp6rxbvAtLF442QjQ+wEA9eL1xSR7Q0JXzlSHjJ4exq89yR0laScJ/FW6z4a73pFMEfDiRZvuvijIt86RaSFOl01riV2mD1UEvxGk/Geg5aWwGki1zgKPG9J2U8PEg8qYvMsZeytiTRXBMslCU8JSlxi8EabjwUldlDNLfzTUmCgxWsjqWCOHavYAqsknKFIO0yQ61VL5AVFxk6WhEaCAkdJgt9aSkzXlKNX2jEa79waYuc7gq0N3GDJGCBhoiTXUEPsdknCUE1CK0fwsiaylSF2uiDyO4XX3pFhNd7R4itFGc0k/ElBZwWvq+GC6szVeEoS/MZ+qylwpKNKv9Z469UOjqCjwlusicyTxG6VpNxcQ8IncoR4RhLbR+NdpGGmJWOcIzJGUuKPGpQg8rrG21dOMqQssJQ4RxH5jaUqnZuQ0F4Q+cjxLwPtpZbIAk3QTJHQWBE5S1BokoVtDd6lhqr9UpHSUxMcIYl9pojsb8h4SBOsMQcqvOWC2E8EVehqiJ1hrrAEbQxeK0NGZ0Gkq+guSRgniM23bIHVkqwx4hiHd7smaOyglyIyQuM978j4VS08J/A2G1KeMBRo4fBaSNhKUEZfQewVQ/C1I+MgfbEleEzCUw7mKXI0M3hd1EESVji8x5uQ41nxs1q4RMJCCXs7Iq9acpxn22oSDnQ/sJTxsCbHIYZiLyhY05TY0ZLIOQrGaSJDDN4t8pVaIrsqqFdEegtizc1iTew5Q4ayBDMUsQMkXocaYkc0hZua412siZ1rSXlR460zRJ5SlHGe5j801RLMlJTxtaOM3Q1pvxJ45zUlWFD7rsAbpfEm1JHxG0eh8w2R7QQVzBUw28FhFp5QZzq8t2rx2joqulYTWSuJdTYfWwqMFMcovFmSyJPNyLhE4E10pHzYjOC3huArRa571ZsGajQpQx38SBP5pyZB6lMU3khDnp0MBV51BE9o2E+TY5Ml2E8S7C0o6w1xvCZjf0HkVEHCzFoyNmqC+9wdcqN+Tp7jSDheE9ws8Y5V0NJCn2bk2tqSY4okdrEhx1iDN8cSudwepWmAGXKcJXK65H9to8jYQRH7SBF01ESUJdd0TayVInaWhLkOjlXE5irKGOnI6GSWGCJa482zBI9rCr0jyTVcEuzriC1vcr6mwFGSiqy5zMwxBH/TJHwjSPhL8+01kaaSUuMFKTcLEvaUePcrSmwn8DZrgikWb7CGPxkSjhQwrRk57tctmxLsb9sZvL9LSlyuSLlWkqOjwduo8b6Uv1DkmudIeFF2dHCgxVtk8dpIvHpBxhEOdhKk7OLIUSdJ+cSRY57B+0DgGUUlNfpthTfGkauzxrvTsUUaCVhlKeteTXCoJDCa2NOKhOmC4G1H8JBd4OBZReSRGkqcb/CO1PyLJTLB4j1q8JYaIutEjSLX8YKM+a6phdMsdLFUoV5RTm9JSkuDN8WcIon0NZMNZWh1q8C7SJEwV5HxrmnnTrf3KoJBlmCYI2ilSLlfEvlE4011NNgjgthzEua0oKK7JLE7HZHlEl60BLMVFewg4EWNt0ThrVNEVkkiTwpKXSWJzdRENgvKGq4IhjsiezgSFtsfCUq8qki5S1LRQeYQQ4nemmCkImWMw3tFUoUBZk4NOeZYEp4XRKTGa6wJjrWNHBVJR4m3FCnbuD6aak2WsMTh3SZImGCIPKNgsDpVwnsa70K31lCFJZYcwwSMFcQulGTsZuEaSdBXkPGZhu0FsdUO73RHjq8MPGGIfaGIbVTk6iuI3GFgucHrIQkmWSJdBd7BBu+uOryWAhY7+Lki9rK5wtEQzWwvtbqGhIMFwWRJsElsY4m9IIg9L6lCX0VklaPAYkfkZEGDnOWowlBJjtMUkcGK4Lg6EtoZInMUBVYLgn0UsdmCyCz7gIGHFfk+k1QwTh5We7A9x+IdJ6CvIkEagms0hR50eH9UnTQJ+2oiKyVlLFUE+8gBGu8MQ3CppUHesnjTHN4QB/UGPhCTHLFPHMFrCqa73gqObUJGa03wgbhHkrCfpEpzNLE7JDS25FMKhlhKKWKfCgqstLCPu1zBXy0J2ztwjtixBu8UTRn9LVtkmCN2iyFhtME70JHRQ1KVZXqKI/KNIKYMCYs1GUMEKbM1bKOI9LDXC7zbHS+bt+1MTWS9odA9DtrYtpbImQJ2VHh/lisEwaHqUk1kjKTAKknkBEXkbkdMGwq0dnhzLJF3NJH3JVwrqOB4Sca2hti75nmJN0WzxS6UxDYoEpxpa4htVlRjkYE7DZGzJVU72uC9IyhQL4i8YfGWSYLLNcHXloyz7QhNifmKSE9JgfGmuyLhc403Xm9vqcp6gXe3xuuv8F6VJNxkyTHEkHG2g0aKXL0MsXc1bGfgas2//dCONXiNLCX+5mB7eZIl1kHh7ajwpikyzlUUWOVOsjSQlsS+M0R+pPje/dzBXRZGO0rMtgQrLLG9VSu9n6CMXS3BhwYmSoIBhsjNBmZbgusE9BCPCP5triU4VhNbJfE+swSP27aayE8tuTpYYjtrYjMVGZdp2NpS1s6aBnKSHDsbKuplKbHM4a0wMFd/5/DmGyKrJSUaW4IBrqUhx0vyfzTBBLPIUcnZdrAkNsKR0sWRspumSns6Ch0v/qqIbBYUWKvPU/CFoyrDJGwSNFhbA/MlzKqjrO80hRbpKx0Jewsi/STftwGSlKc1JZyAzx05dhLEdnfQvhZOqiHWWEAHC7+30FuRcZUgaO5gpaIK+xsiHRUsqaPElTV40xQZQ107Q9BZE1nryDVGU9ZSQ47bmhBpLcYpUt7S+xuK/FiT8qKjwXYw5ypS2iuCv7q1gtgjhuBuB8LCFY5cUuCNtsQOFcT+4Ih9JX+k8Ea6v0iCIRZOtCT0Et00JW5UeC85Cg0ScK0k411HcG1zKtre3SeITBRk7WfwDhEvaYLTHP9le0m8By0JDwn4TlLW/aJOvGHxdjYUes+ScZigCkYQdNdEOhkiezgShqkx8ueKjI8lDfK2oNiOFvrZH1hS+tk7NV7nOmLHicGWEgubkXKdwdtZknCLJXaCpkrjZBtLZFsDP9CdxWsSr05Sxl6CMmoFbCOgryX40uDtamB7SVmXW4Ihlgpmq+00tBKUUa83WbjLUNkzDmY7cow1JDygyPGlhgGKYKz4vcV7QBNbJIgM11TUqZaMdwTeSguH6rOaw1JRKzaaGyxVm2EJ/uCIrVWUcZUkcp2grMsEjK+DMwS59jQk3Kd6SEq1d0S6uVmO4Bc1lDXTUcHjluCXEq+1OlBDj1pi9zgiXxnKuE0SqTXwhqbETW6RggMEnGl/q49UT2iCzgJvRwVXS2K/d6+ZkyUl7jawSVLit46EwxVljDZwoSQ20sDBihztHfk2yA8NVZghiXwrYHQdfKAOtzsayjhY9bY0yE2CWEeJ9xfzO423xhL5syS2TFJofO2pboHob0nY4GiAgRrvGQEDa/FWSsoaaYl0syRsEt3kWoH3B01shCXhTUWe9w3Bt44SC9QCh3eShQctwbaK2ApLroGCMlZrYqvlY3qYhM0aXpFkPOuoqJ3Dm6fxXrGwVF9gCWZagjPqznfkuMKQ8DPTQRO8ZqG1hPGKEm9IgpGW4DZDgTNriTxvFiq+Lz+0cKfp4wj6OCK9JSnzNSn9LFU7UhKZZMnYwcJ8s8yRsECScK4j5UOB95HFO0CzhY4xJxuCix0lDlEUeMdS6EZBkTsUkZ4K74dugyTXS7aNgL8aqjDfkCE0ZbwkCXpaWCKhl8P7VD5jxykivSyxyZrYERbe168LYu9ZYh86IkscgVLE7tWPKmJv11CgoyJltMEbrohtVAQfO4ImltiHEroYEs7RxAarVpY8AwXMcMReFOTYWe5iiLRQxJ5Q8DtJ8LQhWOhIeFESPGsILhbNDRljNbHzNRlTFbk2S3L0NOS6V1KFJYKUbSTcIIhM0wQ/s2TM0SRMNcQmSap3jCH4yhJZKSkwyRHpYYgsFeQ4U7xoCB7VVOExhXepo9ABBsYbvGWKXPME3lyH95YioZ0gssQRWWbI+FaSMkXijZXwgiTlYdPdkNLaETxlyDVIwqeaEus0aTcYcg0RVOkpR3CSJqIddK+90JCxzsDVloyrFd5ZAr4TBKfaWa6boEA7C7s6EpYaeFPjveooY72mjIccLHJ9HUwVlDhKkmutJDJBwnp1rvulJZggKDRfbXAkvC/4l3ozQOG9a8lxjx0i7nV4jSXc7vhe3OwIxjgSHjdEhhsif9YkPGlus3iLFDnWOFhtCZbJg0UbQcIaR67JjthoCyMEZRwhiXWyxO5QxI6w5NhT4U1WsJvDO60J34fW9hwzwlKij6ZAW9ne4L0s8C6XeBMEkd/LQy1VucBRot6QMlbivaBhoBgjqGiCJNhsqVp/S2SsG6DIONCR0dXhvWbJ+MRRZJkkuEjgDXJjFQW6SSL7GXK8Z2CZg7cVsbWGoKmEpzQ5elpiy8Ryg7dMkLLUEauzeO86CuwlSOlgYLojZWeJ9xM3S1PWfEfKl5ISLQ0MEKR8YOB2QfCxJBjrKPCN4f9MkaSsqoVXJBmP7EpFZ9UQfOoOFwSzBN4MQ8LsGrymlipcJQhmy0GaQjPqCHaXRwuCZwRbqK2Fg9wlClZqYicrIgMdZfxTQ0c7TBIbrChxmuzoKG8XRaSrIhhiyNFJkrC7oIAWMEOQa5aBekPCRknCo4IKPrYkvCDI8aYmY7WFtprgekcJZ3oLIqssCSMtFbQTJKwXYy3BY5oCh2iKPCpJOE+zRdpYgi6O2KmOAgvVCYaU4ySRek1sgyFhJ403QFHiVEmJHwtybO1gs8Hr5+BETQX3War0qZngYGgtVZtoqd6vFSk/UwdZElYqyjrF4HXUeFspIi9IGKf4j92pKGAdCYMVsbcV3kRF0N+R8LUd5PCsIGWoxDtBkCI0nKofdJQxT+LtZflvuc8Q3CjwWkq8KwUpHzkK/NmSsclCL0nseQdj5FRH5CNHSgtLiW80Of5HU9Hhlsga9bnBq3fEVltKfO5IaSTmGjjc4J0otcP7QsJUSQM8pEj5/wCuUuC2DWz8AAAAAElFTkSuQmCC\");\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/codemirror/codemirror.css",
    "content": "/* BASICS */\n\n.CodeMirror {\n  /* Set height, width, borders, and global font properties here */\n  font-family: monospace;\n  height: 300px;\n}\n.CodeMirror-scroll {\n  /* Set scrolling behaviour here */\n  overflow: auto;\n}\n\n/* PADDING */\n\n.CodeMirror-lines {\n  padding: 4px 0; /* Vertical padding around content */\n}\n.CodeMirror pre {\n  padding: 0 4px; /* Horizontal padding of content */\n}\n\n.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {\n  background-color: white; /* The little square between H and V scrollbars */\n}\n\n/* GUTTER */\n\n.CodeMirror-gutters {\n  border-right: 1px solid #ddd;\n  background-color: #f7f7f7;\n  white-space: nowrap;\n}\n.CodeMirror-linenumbers {}\n.CodeMirror-linenumber {\n  padding: 0 3px 0 5px;\n  min-width: 20px;\n  text-align: right;\n  color: #999;\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n}\n\n.CodeMirror-guttermarker { color: black; }\n.CodeMirror-guttermarker-subtle { color: #999; }\n\n/* CURSOR */\n\n.CodeMirror div.CodeMirror-cursor {\n  border-left: 1px solid black;\n}\n/* Shown when moving in bi-directional text */\n.CodeMirror div.CodeMirror-secondarycursor {\n  border-left: 1px solid silver;\n}\n.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor {\n  width: auto;\n  border: 0;\n  background: #7e7;\n}\n.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursors {\n  z-index: 1;\n}\n\n.cm-animate-fat-cursor {\n  width: auto;\n  border: 0;\n  -webkit-animation: blink 1.06s steps(1) infinite;\n  -moz-animation: blink 1.06s steps(1) infinite;\n  animation: blink 1.06s steps(1) infinite;\n}\n@-moz-keyframes blink {\n  0% { background: #7e7; }\n  50% { background: none; }\n  100% { background: #7e7; }\n}\n@-webkit-keyframes blink {\n  0% { background: #7e7; }\n  50% { background: none; }\n  100% { background: #7e7; }\n}\n@keyframes blink {\n  0% { background: #7e7; }\n  50% { background: none; }\n  100% { background: #7e7; }\n}\n\n/* Can style cursor different in overwrite (non-insert) mode */\ndiv.CodeMirror-overwrite div.CodeMirror-cursor {}\n\n.cm-tab { display: inline-block; text-decoration: inherit; }\n\n.CodeMirror-ruler {\n  border-left: 1px solid #ccc;\n  position: absolute;\n}\n\n/* DEFAULT THEME */\n\n.cm-s-default .cm-keyword {color: #708;}\n.cm-s-default .cm-atom {color: #219;}\n.cm-s-default .cm-number {color: #164;}\n.cm-s-default .cm-def {color: #00f;}\n.cm-s-default .cm-variable,\n.cm-s-default .cm-punctuation,\n.cm-s-default .cm-property,\n.cm-s-default .cm-operator {}\n.cm-s-default .cm-variable-2 {color: #05a;}\n.cm-s-default .cm-variable-3 {color: #085;}\n.cm-s-default .cm-comment {color: #a50;}\n.cm-s-default .cm-string {color: #a11;}\n.cm-s-default .cm-string-2 {color: #f50;}\n.cm-s-default .cm-meta {color: #555;}\n.cm-s-default .cm-qualifier {color: #555;}\n.cm-s-default .cm-builtin {color: #30a;}\n.cm-s-default .cm-bracket {color: #997;}\n.cm-s-default .cm-tag {color: #170;}\n.cm-s-default .cm-attribute {color: #00c;}\n.cm-s-default .cm-header {color: blue;}\n.cm-s-default .cm-quote {color: #090;}\n.cm-s-default .cm-hr {color: #999;}\n.cm-s-default .cm-link {color: #00c;}\n\n.cm-negative {color: #d44;}\n.cm-positive {color: #292;}\n.cm-header, .cm-strong {font-weight: bold;}\n.cm-em {font-style: italic;}\n.cm-link {text-decoration: underline;}\n\n.cm-s-default .cm-error {color: #f00;}\n.cm-invalidchar {color: #f00;}\n\n/* Default styles for common addons */\n\ndiv.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}\ndiv.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}\n.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }\n.CodeMirror-activeline-background {background: #e8f2ff;}\n\n/* STOP */\n\n/* The rest of this file contains styles related to the mechanics of\n   the editor. You probably shouldn't touch them. */\n\n.CodeMirror {\n  line-height: 1;\n  position: relative;\n  overflow: hidden;\n  background: white;\n  color: black;\n}\n\n.CodeMirror-scroll {\n  /* 30px is the magic margin used to hide the element's real scrollbars */\n  /* See overflow: hidden in .CodeMirror */\n  margin-bottom: -30px; margin-right: -30px;\n  padding-bottom: 30px;\n  height: 100%;\n  outline: none; /* Prevent dragging from highlighting the element */\n  position: relative;\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n}\n.CodeMirror-sizer {\n  position: relative;\n  border-right: 30px solid transparent;\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n}\n\n/* The fake, visible scrollbars. Used to force redraw during scrolling\n   before actuall scrolling happens, thus preventing shaking and\n   flickering artifacts. */\n.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {\n  position: absolute;\n  z-index: 6;\n  display: none;\n}\n.CodeMirror-vscrollbar {\n  right: 0; top: 0;\n  overflow-x: hidden;\n  overflow-y: scroll;\n}\n.CodeMirror-hscrollbar {\n  bottom: 0; left: 0;\n  overflow-y: hidden;\n  overflow-x: scroll;\n}\n.CodeMirror-scrollbar-filler {\n  right: 0; bottom: 0;\n}\n.CodeMirror-gutter-filler {\n  left: 0; bottom: 0;\n}\n\n.CodeMirror-gutters {\n  position: absolute; left: 0; top: 0;\n  padding-bottom: 30px;\n  z-index: 3;\n}\n.CodeMirror-gutter {\n  white-space: normal;\n  height: 100%;\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  padding-bottom: 30px;\n  margin-bottom: -32px;\n  display: inline-block;\n  /* Hack to make IE7 behave */\n  *zoom:1;\n  *display:inline;\n}\n.CodeMirror-gutter-elt {\n  position: absolute;\n  cursor: default;\n  z-index: 4;\n}\n\n.CodeMirror-lines {\n  cursor: text;\n  min-height: 1px; /* prevents collapsing before first draw */\n}\n.CodeMirror pre {\n  /* Reset some styles that the rest of the page might have set */\n  -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;\n  border-width: 0;\n  background: transparent;\n  font-family: inherit;\n  font-size: inherit;\n  margin: 0;\n  white-space: pre;\n  word-wrap: normal;\n  line-height: inherit;\n  color: inherit;\n  z-index: 2;\n  position: relative;\n  overflow: visible;\n}\n.CodeMirror-wrap pre {\n  word-wrap: break-word;\n  white-space: pre-wrap;\n  word-break: normal;\n}\n\n.CodeMirror-linebackground {\n  position: absolute;\n  left: 0; right: 0; top: 0; bottom: 0;\n  z-index: 0;\n}\n\n.CodeMirror-linewidget {\n  position: relative;\n  z-index: 2;\n  overflow: auto;\n}\n\n.CodeMirror-widget {}\n\n.CodeMirror-wrap .CodeMirror-scroll {\n  overflow-x: hidden;\n}\n\n.CodeMirror-measure {\n  position: absolute;\n  width: 100%;\n  height: 0;\n  overflow: hidden;\n  visibility: hidden;\n}\n.CodeMirror-measure pre { position: static; }\n\n.CodeMirror div.CodeMirror-cursor {\n  position: absolute;\n  border-right: none;\n  width: 0;\n}\n\ndiv.CodeMirror-cursors {\n  visibility: hidden;\n  position: relative;\n  z-index: 3;\n}\n.CodeMirror-focused div.CodeMirror-cursors {\n  visibility: visible;\n}\n\n.CodeMirror-selected { background: #d9d9d9; }\n.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }\n.CodeMirror-crosshair { cursor: crosshair; }\n\n.cm-searching {\n  background: #ffa;\n  background: rgba(255, 255, 0, .4);\n}\n\n/* IE7 hack to prevent it from returning funny offsetTops on the spans */\n.CodeMirror span { *vertical-align: text-bottom; }\n\n/* Used to force a border model for a node */\n.cm-force-border { padding-right: .1px; }\n\n@media print {\n  /* Hide the cursor when printing */\n  .CodeMirror div.CodeMirror-cursors {\n    visibility: hidden;\n  }\n}\n\n/* Help users use markselection to safely style text background */\nspan.CodeMirror-selectedtext { background: none; }\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/dataTables/dataTables.bootstrap.css",
    "content": "div.dataTables_length label {\n    float: left;\n    text-align: left;\n    font-weight: normal;\n}\n\ndiv.dataTables_length select {\n    width: 75px;\n}\n\ndiv.dataTables_filter label {\n    float: right;\n    font-weight: normal;\n}\n\ndiv.dataTables_filter input {\n    width: 16em;\n}\n\ndiv.dataTables_info {\n    padding-top: 8px;\n}\n\ndiv.dataTables_paginate {\n    float: right;\n    margin: 0;\n}\n\ndiv.dataTables_paginate ul.pagination {\n    margin: 2px 0;\n    white-space: nowrap;\n}\n\ntable.dataTable,\ntable.dataTable td,\ntable.dataTable th {\n    -webkit-box-sizing: content-box;\n    -moz-box-sizing: content-box;\n    box-sizing: content-box;\n}\n\ntable.dataTable {\n    clear: both;\n    margin-top: 6px !important;\n    margin-bottom: 6px !important;\n    max-width: none !important;\n}\n\ntable.dataTable thead .sorting,\ntable.dataTable thead .sorting_asc,\ntable.dataTable thead .sorting_desc,\ntable.dataTable thead .sorting_asc_disabled,\ntable.dataTable thead .sorting_desc_disabled {\n    cursor: pointer;\n}\n\ntable.dataTable thead .sorting {\n\n}\n\ntable.dataTable thead .sorting_asc {\n    background: url('../images/sort_asc.png') no-repeat center right;\n}\n\ntable.dataTable thead .sorting_desc {\n    background: url('../images/sort_desc.png') no-repeat center right;\n}\n\ntable.dataTable thead .sorting_asc_disabled {\n}\n\ntable.dataTable thead .sorting_desc_disabled {\n}\n\ntable.dataTable th:active {\n    outline: none;\n}\n\n/* Scrolling */\n\ndiv.dataTables_scrollHead table {\n    margin-bottom: 0 !important;\n    border-bottom-left-radius: 0;\n    border-bottom-right-radius: 0;\n}\n\ndiv.dataTables_scrollHead table thead tr:last-child th:first-child,\ndiv.dataTables_scrollHead table thead tr:last-child td:first-child {\n    border-bottom-left-radius: 0 !important;\n    border-bottom-right-radius: 0 !important;\n}\n\ndiv.dataTables_scrollBody table {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n    border-top: none;\n}\n\ndiv.dataTables_scrollBody tbody tr:first-child th,\ndiv.dataTables_scrollBody tbody tr:first-child td {\n    border-top: none;\n}\n\ndiv.dataTables_scrollFoot table {\n    margin-top: 0 !important;\n    border-top: none;\n}\n\n/*\n * TableTools styles\n */\n\n.table tbody tr.active td,\n.table tbody tr.active th {\n    color: white;\n    background-color: #08C;\n}\n\n.table tbody tr.active:hover td,\n.table tbody tr.active:hover th {\n    background-color: #0075b0 !important;\n}\n\n.table tbody tr.active a {\n    color: white;\n}\n\n.table-striped tbody tr.active:nth-child(odd) td,\n.table-striped tbody tr.active:nth-child(odd) th {\n    background-color: #017ebc;\n}\n\ntable.DTTT_selectable tbody tr {\n    cursor: pointer;\n}\n\ndiv.DTTT .btn {\n    font-size: 12px;\n    color: #333 !important;\n}\n\ndiv.DTTT .btn:hover {\n    text-decoration: none !important;\n}\n\nul.DTTT_dropdown.dropdown-menu {\n    z-index: 2003;\n}\n\nul.DTTT_dropdown.dropdown-menu a {\n    color: #333 !important; /* needed only when demo_page.css is included */\n}\n\nul.DTTT_dropdown.dropdown-menu li {\n    position: relative;\n}\n\nul.DTTT_dropdown.dropdown-menu li:hover a {\n    color: white !important;\n    background-color: #0088cc;\n}\n\ndiv.DTTT_collection_background {\n    z-index: 2002;\n}\n\n/* TableTools information display */\n\ndiv.DTTT_print_info.modal {\n    height: 150px;\n    margin-top: -75px;\n    text-align: center;\n}\n\ndiv.DTTT_print_info h6 {\n    margin: 1em;\n    font-size: 28px;\n    font-weight: normal;\n    line-height: 28px;\n}\n\ndiv.DTTT_print_info p {\n    font-size: 14px;\n    line-height: 20px;\n}\n\n/*\n * FixedColumns styles\n */\n\ndiv.DTFC_LeftHeadWrapper table,\ndiv.DTFC_LeftFootWrapper table,\ndiv.DTFC_RightHeadWrapper table,\ndiv.DTFC_RightFootWrapper table,\ntable.DTFC_Cloned tr.even {\n    background-color: white;\n}\n\ndiv.DTFC_RightHeadWrapper table,\ndiv.DTFC_LeftHeadWrapper table {\n    margin-bottom: 0 !important;\n    border-top-right-radius: 0 !important;\n    border-bottom-left-radius: 0 !important;\n    border-bottom-right-radius: 0 !important;\n}\n\ndiv.DTFC_RightHeadWrapper table thead tr:last-child th:first-child,\ndiv.DTFC_RightHeadWrapper table thead tr:last-child td:first-child,\ndiv.DTFC_LeftHeadWrapper table thead tr:last-child th:first-child,\ndiv.DTFC_LeftHeadWrapper table thead tr:last-child td:first-child {\n    border-bottom-left-radius: 0 !important;\n    border-bottom-right-radius: 0 !important;\n}\n\ndiv.DTFC_RightBodyWrapper table,\ndiv.DTFC_LeftBodyWrapper table {\n    margin-bottom: 0 !important;\n    border-top: none;\n}\n\ndiv.DTFC_RightBodyWrapper tbody tr:first-child th,\ndiv.DTFC_RightBodyWrapper tbody tr:first-child td,\ndiv.DTFC_LeftBodyWrapper tbody tr:first-child th,\ndiv.DTFC_LeftBodyWrapper tbody tr:first-child td {\n    border-top: none;\n}\n\ndiv.DTFC_RightFootWrapper table,\ndiv.DTFC_LeftFootWrapper table {\n    border-top: none;\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/datapicker/datepicker3.css",
    "content": "/*!\n * Datepicker for Bootstrap\n *\n * Copyright 2012 Stefan Petre\n * Improvements by Andrew Rowls\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n */\n.datepicker {\n  padding: 4px;\n  border-radius: 4px;\n  direction: ltr;\n  /*.dow {\n\t\tborder-top: 1px solid #ddd !important;\n\t}*/\n}\n.datepicker-inline {\n  width: 220px;\n}\n.datepicker.datepicker-rtl {\n  direction: rtl;\n}\n.datepicker.datepicker-rtl table tr td span {\n  float: right;\n}\n.datepicker-dropdown {\n  top: 0;\n  left: 0;\n}\n.datepicker-dropdown:before {\n  content: '';\n  display: inline-block;\n  border-left: 7px solid transparent;\n  border-right: 7px solid transparent;\n  border-bottom: 7px solid #ccc;\n  border-top: 0;\n  border-bottom-color: rgba(0, 0, 0, 0.2);\n  position: absolute;\n}\n.datepicker-dropdown:after {\n  content: '';\n  display: inline-block;\n  border-left: 6px solid transparent;\n  border-right: 6px solid transparent;\n  border-bottom: 6px solid #fff;\n  border-top: 0;\n  position: absolute;\n}\n.datepicker-dropdown.datepicker-orient-left:before {\n  left: 6px;\n}\n.datepicker-dropdown.datepicker-orient-left:after {\n  left: 7px;\n}\n.datepicker-dropdown.datepicker-orient-right:before {\n  right: 6px;\n}\n.datepicker-dropdown.datepicker-orient-right:after {\n  right: 7px;\n}\n.datepicker-dropdown.datepicker-orient-top:before {\n  top: -7px;\n}\n.datepicker-dropdown.datepicker-orient-top:after {\n  top: -6px;\n}\n.datepicker-dropdown.datepicker-orient-bottom:before {\n  bottom: -7px;\n  border-bottom: 0;\n  border-top: 7px solid #999;\n}\n.datepicker-dropdown.datepicker-orient-bottom:after {\n  bottom: -6px;\n  border-bottom: 0;\n  border-top: 6px solid #fff;\n}\n.datepicker > div {\n  display: none;\n}\n.datepicker.days div.datepicker-days {\n  display: block;\n}\n.datepicker.months div.datepicker-months {\n  display: block;\n}\n.datepicker.years div.datepicker-years {\n  display: block;\n}\n.datepicker table {\n  margin: 0;\n  -webkit-touch-callout: none;\n  -webkit-user-select: none;\n  -khtml-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.datepicker table tr td,\n.datepicker table tr th {\n  text-align: center;\n  width: 30px;\n  height: 30px;\n  border-radius: 4px;\n  border: none;\n}\n.table-striped .datepicker table tr td,\n.table-striped .datepicker table tr th {\n  background-color: transparent;\n}\n.datepicker table tr td.day:hover,\n.datepicker table tr td.day.focused {\n  background: #eeeeee;\n  cursor: pointer;\n}\n.datepicker table tr td.old,\n.datepicker table tr td.new {\n  color: #999999;\n}\n.datepicker table tr td.disabled,\n.datepicker table tr td.disabled:hover {\n  background: none;\n  color: #999999;\n  cursor: default;\n}\n.datepicker table tr td.today,\n.datepicker table tr td.today:hover,\n.datepicker table tr td.today.disabled,\n.datepicker table tr td.today.disabled:hover {\n  color: #000000;\n  background-color: #ffdb99;\n  border-color: #ffb733;\n}\n.datepicker table tr td.today:hover,\n.datepicker table tr td.today:hover:hover,\n.datepicker table tr td.today.disabled:hover,\n.datepicker table tr td.today.disabled:hover:hover,\n.datepicker table tr td.today:focus,\n.datepicker table tr td.today:hover:focus,\n.datepicker table tr td.today.disabled:focus,\n.datepicker table tr td.today.disabled:hover:focus,\n.datepicker table tr td.today:active,\n.datepicker table tr td.today:hover:active,\n.datepicker table tr td.today.disabled:active,\n.datepicker table tr td.today.disabled:hover:active,\n.datepicker table tr td.today.active,\n.datepicker table tr td.today:hover.active,\n.datepicker table tr td.today.disabled.active,\n.datepicker table tr td.today.disabled:hover.active,\n.open .dropdown-toggle.datepicker table tr td.today,\n.open .dropdown-toggle.datepicker table tr td.today:hover,\n.open .dropdown-toggle.datepicker table tr td.today.disabled,\n.open .dropdown-toggle.datepicker table tr td.today.disabled:hover {\n  color: #000000;\n  background-color: #ffcd70;\n  border-color: #f59e00;\n}\n.datepicker table tr td.today:active,\n.datepicker table tr td.today:hover:active,\n.datepicker table tr td.today.disabled:active,\n.datepicker table tr td.today.disabled:hover:active,\n.datepicker table tr td.today.active,\n.datepicker table tr td.today:hover.active,\n.datepicker table tr td.today.disabled.active,\n.datepicker table tr td.today.disabled:hover.active,\n.open .dropdown-toggle.datepicker table tr td.today,\n.open .dropdown-toggle.datepicker table tr td.today:hover,\n.open .dropdown-toggle.datepicker table tr td.today.disabled,\n.open .dropdown-toggle.datepicker table tr td.today.disabled:hover {\n  background-image: none;\n}\n.datepicker table tr td.today.disabled,\n.datepicker table tr td.today:hover.disabled,\n.datepicker table tr td.today.disabled.disabled,\n.datepicker table tr td.today.disabled:hover.disabled,\n.datepicker table tr td.today[disabled],\n.datepicker table tr td.today:hover[disabled],\n.datepicker table tr td.today.disabled[disabled],\n.datepicker table tr td.today.disabled:hover[disabled],\nfieldset[disabled] .datepicker table tr td.today,\nfieldset[disabled] .datepicker table tr td.today:hover,\nfieldset[disabled] .datepicker table tr td.today.disabled,\nfieldset[disabled] .datepicker table tr td.today.disabled:hover,\n.datepicker table tr td.today.disabled:hover,\n.datepicker table tr td.today:hover.disabled:hover,\n.datepicker table tr td.today.disabled.disabled:hover,\n.datepicker table tr td.today.disabled:hover.disabled:hover,\n.datepicker table tr td.today[disabled]:hover,\n.datepicker table tr td.today:hover[disabled]:hover,\n.datepicker table tr td.today.disabled[disabled]:hover,\n.datepicker table tr td.today.disabled:hover[disabled]:hover,\nfieldset[disabled] .datepicker table tr td.today:hover,\nfieldset[disabled] .datepicker table tr td.today:hover:hover,\nfieldset[disabled] .datepicker table tr td.today.disabled:hover,\nfieldset[disabled] .datepicker table tr td.today.disabled:hover:hover,\n.datepicker table tr td.today.disabled:focus,\n.datepicker table tr td.today:hover.disabled:focus,\n.datepicker table tr td.today.disabled.disabled:focus,\n.datepicker table tr td.today.disabled:hover.disabled:focus,\n.datepicker table tr td.today[disabled]:focus,\n.datepicker table tr td.today:hover[disabled]:focus,\n.datepicker table tr td.today.disabled[disabled]:focus,\n.datepicker table tr td.today.disabled:hover[disabled]:focus,\nfieldset[disabled] .datepicker table tr td.today:focus,\nfieldset[disabled] .datepicker table tr td.today:hover:focus,\nfieldset[disabled] .datepicker table tr td.today.disabled:focus,\nfieldset[disabled] .datepicker table tr td.today.disabled:hover:focus,\n.datepicker table tr td.today.disabled:active,\n.datepicker table tr td.today:hover.disabled:active,\n.datepicker table tr td.today.disabled.disabled:active,\n.datepicker table tr td.today.disabled:hover.disabled:active,\n.datepicker table tr td.today[disabled]:active,\n.datepicker table tr td.today:hover[disabled]:active,\n.datepicker table tr td.today.disabled[disabled]:active,\n.datepicker table tr td.today.disabled:hover[disabled]:active,\nfieldset[disabled] .datepicker table tr td.today:active,\nfieldset[disabled] .datepicker table tr td.today:hover:active,\nfieldset[disabled] .datepicker table tr td.today.disabled:active,\nfieldset[disabled] .datepicker table tr td.today.disabled:hover:active,\n.datepicker table tr td.today.disabled.active,\n.datepicker table tr td.today:hover.disabled.active,\n.datepicker table tr td.today.disabled.disabled.active,\n.datepicker table tr td.today.disabled:hover.disabled.active,\n.datepicker table tr td.today[disabled].active,\n.datepicker table tr td.today:hover[disabled].active,\n.datepicker table tr td.today.disabled[disabled].active,\n.datepicker table tr td.today.disabled:hover[disabled].active,\nfieldset[disabled] .datepicker table tr td.today.active,\nfieldset[disabled] .datepicker table tr td.today:hover.active,\nfieldset[disabled] .datepicker table tr td.today.disabled.active,\nfieldset[disabled] .datepicker table tr td.today.disabled:hover.active {\n  background-color: #ffdb99;\n  border-color: #ffb733;\n}\n.datepicker table tr td.today:hover:hover {\n  color: #000;\n}\n.datepicker table tr td.today.active:hover {\n  color: #fff;\n}\n.datepicker table tr td.range,\n.datepicker table tr td.range:hover,\n.datepicker table tr td.range.disabled,\n.datepicker table tr td.range.disabled:hover {\n  background: #eeeeee;\n  border-radius: 0;\n}\n.datepicker table tr td.range.today,\n.datepicker table tr td.range.today:hover,\n.datepicker table tr td.range.today.disabled,\n.datepicker table tr td.range.today.disabled:hover {\n  color: #000000;\n  background-color: #f7ca77;\n  border-color: #f1a417;\n  border-radius: 0;\n}\n.datepicker table tr td.range.today:hover,\n.datepicker table tr td.range.today:hover:hover,\n.datepicker table tr td.range.today.disabled:hover,\n.datepicker table tr td.range.today.disabled:hover:hover,\n.datepicker table tr td.range.today:focus,\n.datepicker table tr td.range.today:hover:focus,\n.datepicker table tr td.range.today.disabled:focus,\n.datepicker table tr td.range.today.disabled:hover:focus,\n.datepicker table tr td.range.today:active,\n.datepicker table tr td.range.today:hover:active,\n.datepicker table tr td.range.today.disabled:active,\n.datepicker table tr td.range.today.disabled:hover:active,\n.datepicker table tr td.range.today.active,\n.datepicker table tr td.range.today:hover.active,\n.datepicker table tr td.range.today.disabled.active,\n.datepicker table tr td.range.today.disabled:hover.active,\n.open .dropdown-toggle.datepicker table tr td.range.today,\n.open .dropdown-toggle.datepicker table tr td.range.today:hover,\n.open .dropdown-toggle.datepicker table tr td.range.today.disabled,\n.open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover {\n  color: #000000;\n  background-color: #f4bb51;\n  border-color: #bf800c;\n}\n.datepicker table tr td.range.today:active,\n.datepicker table tr td.range.today:hover:active,\n.datepicker table tr td.range.today.disabled:active,\n.datepicker table tr td.range.today.disabled:hover:active,\n.datepicker table tr td.range.today.active,\n.datepicker table tr td.range.today:hover.active,\n.datepicker table tr td.range.today.disabled.active,\n.datepicker table tr td.range.today.disabled:hover.active,\n.open .dropdown-toggle.datepicker table tr td.range.today,\n.open .dropdown-toggle.datepicker table tr td.range.today:hover,\n.open .dropdown-toggle.datepicker table tr td.range.today.disabled,\n.open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover {\n  background-image: none;\n}\n.datepicker table tr td.range.today.disabled,\n.datepicker table tr td.range.today:hover.disabled,\n.datepicker table tr td.range.today.disabled.disabled,\n.datepicker table tr td.range.today.disabled:hover.disabled,\n.datepicker table tr td.range.today[disabled],\n.datepicker table tr td.range.today:hover[disabled],\n.datepicker table tr td.range.today.disabled[disabled],\n.datepicker table tr td.range.today.disabled:hover[disabled],\nfieldset[disabled] .datepicker table tr td.range.today,\nfieldset[disabled] .datepicker table tr td.range.today:hover,\nfieldset[disabled] .datepicker table tr td.range.today.disabled,\nfieldset[disabled] .datepicker table tr td.range.today.disabled:hover,\n.datepicker table tr td.range.today.disabled:hover,\n.datepicker table tr td.range.today:hover.disabled:hover,\n.datepicker table tr td.range.today.disabled.disabled:hover,\n.datepicker table tr td.range.today.disabled:hover.disabled:hover,\n.datepicker table tr td.range.today[disabled]:hover,\n.datepicker table tr td.range.today:hover[disabled]:hover,\n.datepicker table tr td.range.today.disabled[disabled]:hover,\n.datepicker table tr td.range.today.disabled:hover[disabled]:hover,\nfieldset[disabled] .datepicker table tr td.range.today:hover,\nfieldset[disabled] .datepicker table tr td.range.today:hover:hover,\nfieldset[disabled] .datepicker table tr td.range.today.disabled:hover,\nfieldset[disabled] .datepicker table tr td.range.today.disabled:hover:hover,\n.datepicker table tr td.range.today.disabled:focus,\n.datepicker table tr td.range.today:hover.disabled:focus,\n.datepicker table tr td.range.today.disabled.disabled:focus,\n.datepicker table tr td.range.today.disabled:hover.disabled:focus,\n.datepicker table tr td.range.today[disabled]:focus,\n.datepicker table tr td.range.today:hover[disabled]:focus,\n.datepicker table tr td.range.today.disabled[disabled]:focus,\n.datepicker table tr td.range.today.disabled:hover[disabled]:focus,\nfieldset[disabled] .datepicker table tr td.range.today:focus,\nfieldset[disabled] .datepicker table tr td.range.today:hover:focus,\nfieldset[disabled] .datepicker table tr td.range.today.disabled:focus,\nfieldset[disabled] .datepicker table tr td.range.today.disabled:hover:focus,\n.datepicker table tr td.range.today.disabled:active,\n.datepicker table tr td.range.today:hover.disabled:active,\n.datepicker table tr td.range.today.disabled.disabled:active,\n.datepicker table tr td.range.today.disabled:hover.disabled:active,\n.datepicker table tr td.range.today[disabled]:active,\n.datepicker table tr td.range.today:hover[disabled]:active,\n.datepicker table tr td.range.today.disabled[disabled]:active,\n.datepicker table tr td.range.today.disabled:hover[disabled]:active,\nfieldset[disabled] .datepicker table tr td.range.today:active,\nfieldset[disabled] .datepicker table tr td.range.today:hover:active,\nfieldset[disabled] .datepicker table tr td.range.today.disabled:active,\nfieldset[disabled] .datepicker table tr td.range.today.disabled:hover:active,\n.datepicker table tr td.range.today.disabled.active,\n.datepicker table tr td.range.today:hover.disabled.active,\n.datepicker table tr td.range.today.disabled.disabled.active,\n.datepicker table tr td.range.today.disabled:hover.disabled.active,\n.datepicker table tr td.range.today[disabled].active,\n.datepicker table tr td.range.today:hover[disabled].active,\n.datepicker table tr td.range.today.disabled[disabled].active,\n.datepicker table tr td.range.today.disabled:hover[disabled].active,\nfieldset[disabled] .datepicker table tr td.range.today.active,\nfieldset[disabled] .datepicker table tr td.range.today:hover.active,\nfieldset[disabled] .datepicker table tr td.range.today.disabled.active,\nfieldset[disabled] .datepicker table tr td.range.today.disabled:hover.active {\n  background-color: #f7ca77;\n  border-color: #f1a417;\n}\n.datepicker table tr td.selected,\n.datepicker table tr td.selected:hover,\n.datepicker table tr td.selected.disabled,\n.datepicker table tr td.selected.disabled:hover {\n  color: #ffffff;\n  background-color: #999999;\n  border-color: #555555;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.datepicker table tr td.selected:hover,\n.datepicker table tr td.selected:hover:hover,\n.datepicker table tr td.selected.disabled:hover,\n.datepicker table tr td.selected.disabled:hover:hover,\n.datepicker table tr td.selected:focus,\n.datepicker table tr td.selected:hover:focus,\n.datepicker table tr td.selected.disabled:focus,\n.datepicker table tr td.selected.disabled:hover:focus,\n.datepicker table tr td.selected:active,\n.datepicker table tr td.selected:hover:active,\n.datepicker table tr td.selected.disabled:active,\n.datepicker table tr td.selected.disabled:hover:active,\n.datepicker table tr td.selected.active,\n.datepicker table tr td.selected:hover.active,\n.datepicker table tr td.selected.disabled.active,\n.datepicker table tr td.selected.disabled:hover.active,\n.open .dropdown-toggle.datepicker table tr td.selected,\n.open .dropdown-toggle.datepicker table tr td.selected:hover,\n.open .dropdown-toggle.datepicker table tr td.selected.disabled,\n.open .dropdown-toggle.datepicker table tr td.selected.disabled:hover {\n  color: #ffffff;\n  background-color: #858585;\n  border-color: #373737;\n}\n.datepicker table tr td.selected:active,\n.datepicker table tr td.selected:hover:active,\n.datepicker table tr td.selected.disabled:active,\n.datepicker table tr td.selected.disabled:hover:active,\n.datepicker table tr td.selected.active,\n.datepicker table tr td.selected:hover.active,\n.datepicker table tr td.selected.disabled.active,\n.datepicker table tr td.selected.disabled:hover.active,\n.open .dropdown-toggle.datepicker table tr td.selected,\n.open .dropdown-toggle.datepicker table tr td.selected:hover,\n.open .dropdown-toggle.datepicker table tr td.selected.disabled,\n.open .dropdown-toggle.datepicker table tr td.selected.disabled:hover {\n  background-image: none;\n}\n.datepicker table tr td.selected.disabled,\n.datepicker table tr td.selected:hover.disabled,\n.datepicker table tr td.selected.disabled.disabled,\n.datepicker table tr td.selected.disabled:hover.disabled,\n.datepicker table tr td.selected[disabled],\n.datepicker table tr td.selected:hover[disabled],\n.datepicker table tr td.selected.disabled[disabled],\n.datepicker table tr td.selected.disabled:hover[disabled],\nfieldset[disabled] .datepicker table tr td.selected,\nfieldset[disabled] .datepicker table tr td.selected:hover,\nfieldset[disabled] .datepicker table tr td.selected.disabled,\nfieldset[disabled] .datepicker table tr td.selected.disabled:hover,\n.datepicker table tr td.selected.disabled:hover,\n.datepicker table tr td.selected:hover.disabled:hover,\n.datepicker table tr td.selected.disabled.disabled:hover,\n.datepicker table tr td.selected.disabled:hover.disabled:hover,\n.datepicker table tr td.selected[disabled]:hover,\n.datepicker table tr td.selected:hover[disabled]:hover,\n.datepicker table tr td.selected.disabled[disabled]:hover,\n.datepicker table tr td.selected.disabled:hover[disabled]:hover,\nfieldset[disabled] .datepicker table tr td.selected:hover,\nfieldset[disabled] .datepicker table tr td.selected:hover:hover,\nfieldset[disabled] .datepicker table tr td.selected.disabled:hover,\nfieldset[disabled] .datepicker table tr td.selected.disabled:hover:hover,\n.datepicker table tr td.selected.disabled:focus,\n.datepicker table tr td.selected:hover.disabled:focus,\n.datepicker table tr td.selected.disabled.disabled:focus,\n.datepicker table tr td.selected.disabled:hover.disabled:focus,\n.datepicker table tr td.selected[disabled]:focus,\n.datepicker table tr td.selected:hover[disabled]:focus,\n.datepicker table tr td.selected.disabled[disabled]:focus,\n.datepicker table tr td.selected.disabled:hover[disabled]:focus,\nfieldset[disabled] .datepicker table tr td.selected:focus,\nfieldset[disabled] .datepicker table tr td.selected:hover:focus,\nfieldset[disabled] .datepicker table tr td.selected.disabled:focus,\nfieldset[disabled] .datepicker table tr td.selected.disabled:hover:focus,\n.datepicker table tr td.selected.disabled:active,\n.datepicker table tr td.selected:hover.disabled:active,\n.datepicker table tr td.selected.disabled.disabled:active,\n.datepicker table tr td.selected.disabled:hover.disabled:active,\n.datepicker table tr td.selected[disabled]:active,\n.datepicker table tr td.selected:hover[disabled]:active,\n.datepicker table tr td.selected.disabled[disabled]:active,\n.datepicker table tr td.selected.disabled:hover[disabled]:active,\nfieldset[disabled] .datepicker table tr td.selected:active,\nfieldset[disabled] .datepicker table tr td.selected:hover:active,\nfieldset[disabled] .datepicker table tr td.selected.disabled:active,\nfieldset[disabled] .datepicker table tr td.selected.disabled:hover:active,\n.datepicker table tr td.selected.disabled.active,\n.datepicker table tr td.selected:hover.disabled.active,\n.datepicker table tr td.selected.disabled.disabled.active,\n.datepicker table tr td.selected.disabled:hover.disabled.active,\n.datepicker table tr td.selected[disabled].active,\n.datepicker table tr td.selected:hover[disabled].active,\n.datepicker table tr td.selected.disabled[disabled].active,\n.datepicker table tr td.selected.disabled:hover[disabled].active,\nfieldset[disabled] .datepicker table tr td.selected.active,\nfieldset[disabled] .datepicker table tr td.selected:hover.active,\nfieldset[disabled] .datepicker table tr td.selected.disabled.active,\nfieldset[disabled] .datepicker table tr td.selected.disabled:hover.active {\n  background-color: #999999;\n  border-color: #555555;\n}\n.datepicker table tr td.active,\n.datepicker table tr td.active:hover,\n.datepicker table tr td.active.disabled,\n.datepicker table tr td.active.disabled:hover {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #357ebd;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.datepicker table tr td.active:hover,\n.datepicker table tr td.active:hover:hover,\n.datepicker table tr td.active.disabled:hover,\n.datepicker table tr td.active.disabled:hover:hover,\n.datepicker table tr td.active:focus,\n.datepicker table tr td.active:hover:focus,\n.datepicker table tr td.active.disabled:focus,\n.datepicker table tr td.active.disabled:hover:focus,\n.datepicker table tr td.active:active,\n.datepicker table tr td.active:hover:active,\n.datepicker table tr td.active.disabled:active,\n.datepicker table tr td.active.disabled:hover:active,\n.datepicker table tr td.active.active,\n.datepicker table tr td.active:hover.active,\n.datepicker table tr td.active.disabled.active,\n.datepicker table tr td.active.disabled:hover.active,\n.open .dropdown-toggle.datepicker table tr td.active,\n.open .dropdown-toggle.datepicker table tr td.active:hover,\n.open .dropdown-toggle.datepicker table tr td.active.disabled,\n.open .dropdown-toggle.datepicker table tr td.active.disabled:hover {\n  color: #ffffff;\n  background-color: #3276b1;\n  border-color: #285e8e;\n}\n.datepicker table tr td.active:active,\n.datepicker table tr td.active:hover:active,\n.datepicker table tr td.active.disabled:active,\n.datepicker table tr td.active.disabled:hover:active,\n.datepicker table tr td.active.active,\n.datepicker table tr td.active:hover.active,\n.datepicker table tr td.active.disabled.active,\n.datepicker table tr td.active.disabled:hover.active,\n.open .dropdown-toggle.datepicker table tr td.active,\n.open .dropdown-toggle.datepicker table tr td.active:hover,\n.open .dropdown-toggle.datepicker table tr td.active.disabled,\n.open .dropdown-toggle.datepicker table tr td.active.disabled:hover {\n  background-image: none;\n}\n.datepicker table tr td.active.disabled,\n.datepicker table tr td.active:hover.disabled,\n.datepicker table tr td.active.disabled.disabled,\n.datepicker table tr td.active.disabled:hover.disabled,\n.datepicker table tr td.active[disabled],\n.datepicker table tr td.active:hover[disabled],\n.datepicker table tr td.active.disabled[disabled],\n.datepicker table tr td.active.disabled:hover[disabled],\nfieldset[disabled] .datepicker table tr td.active,\nfieldset[disabled] .datepicker table tr td.active:hover,\nfieldset[disabled] .datepicker table tr td.active.disabled,\nfieldset[disabled] .datepicker table tr td.active.disabled:hover,\n.datepicker table tr td.active.disabled:hover,\n.datepicker table tr td.active:hover.disabled:hover,\n.datepicker table tr td.active.disabled.disabled:hover,\n.datepicker table tr td.active.disabled:hover.disabled:hover,\n.datepicker table tr td.active[disabled]:hover,\n.datepicker table tr td.active:hover[disabled]:hover,\n.datepicker table tr td.active.disabled[disabled]:hover,\n.datepicker table tr td.active.disabled:hover[disabled]:hover,\nfieldset[disabled] .datepicker table tr td.active:hover,\nfieldset[disabled] .datepicker table tr td.active:hover:hover,\nfieldset[disabled] .datepicker table tr td.active.disabled:hover,\nfieldset[disabled] .datepicker table tr td.active.disabled:hover:hover,\n.datepicker table tr td.active.disabled:focus,\n.datepicker table tr td.active:hover.disabled:focus,\n.datepicker table tr td.active.disabled.disabled:focus,\n.datepicker table tr td.active.disabled:hover.disabled:focus,\n.datepicker table tr td.active[disabled]:focus,\n.datepicker table tr td.active:hover[disabled]:focus,\n.datepicker table tr td.active.disabled[disabled]:focus,\n.datepicker table tr td.active.disabled:hover[disabled]:focus,\nfieldset[disabled] .datepicker table tr td.active:focus,\nfieldset[disabled] .datepicker table tr td.active:hover:focus,\nfieldset[disabled] .datepicker table tr td.active.disabled:focus,\nfieldset[disabled] .datepicker table tr td.active.disabled:hover:focus,\n.datepicker table tr td.active.disabled:active,\n.datepicker table tr td.active:hover.disabled:active,\n.datepicker table tr td.active.disabled.disabled:active,\n.datepicker table tr td.active.disabled:hover.disabled:active,\n.datepicker table tr td.active[disabled]:active,\n.datepicker table tr td.active:hover[disabled]:active,\n.datepicker table tr td.active.disabled[disabled]:active,\n.datepicker table tr td.active.disabled:hover[disabled]:active,\nfieldset[disabled] .datepicker table tr td.active:active,\nfieldset[disabled] .datepicker table tr td.active:hover:active,\nfieldset[disabled] .datepicker table tr td.active.disabled:active,\nfieldset[disabled] .datepicker table tr td.active.disabled:hover:active,\n.datepicker table tr td.active.disabled.active,\n.datepicker table tr td.active:hover.disabled.active,\n.datepicker table tr td.active.disabled.disabled.active,\n.datepicker table tr td.active.disabled:hover.disabled.active,\n.datepicker table tr td.active[disabled].active,\n.datepicker table tr td.active:hover[disabled].active,\n.datepicker table tr td.active.disabled[disabled].active,\n.datepicker table tr td.active.disabled:hover[disabled].active,\nfieldset[disabled] .datepicker table tr td.active.active,\nfieldset[disabled] .datepicker table tr td.active:hover.active,\nfieldset[disabled] .datepicker table tr td.active.disabled.active,\nfieldset[disabled] .datepicker table tr td.active.disabled:hover.active {\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n.datepicker table tr td span {\n  display: block;\n  width: 23%;\n  height: 54px;\n  line-height: 54px;\n  float: left;\n  margin: 1%;\n  cursor: pointer;\n  border-radius: 4px;\n}\n.datepicker table tr td span:hover {\n  background: #eeeeee;\n}\n.datepicker table tr td span.disabled,\n.datepicker table tr td span.disabled:hover {\n  background: none;\n  color: #999999;\n  cursor: default;\n}\n.datepicker table tr td span.active,\n.datepicker table tr td span.active:hover,\n.datepicker table tr td span.active.disabled,\n.datepicker table tr td span.active.disabled:hover {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #357ebd;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.datepicker table tr td span.active:hover,\n.datepicker table tr td span.active:hover:hover,\n.datepicker table tr td span.active.disabled:hover,\n.datepicker table tr td span.active.disabled:hover:hover,\n.datepicker table tr td span.active:focus,\n.datepicker table tr td span.active:hover:focus,\n.datepicker table tr td span.active.disabled:focus,\n.datepicker table tr td span.active.disabled:hover:focus,\n.datepicker table tr td span.active:active,\n.datepicker table tr td span.active:hover:active,\n.datepicker table tr td span.active.disabled:active,\n.datepicker table tr td span.active.disabled:hover:active,\n.datepicker table tr td span.active.active,\n.datepicker table tr td span.active:hover.active,\n.datepicker table tr td span.active.disabled.active,\n.datepicker table tr td span.active.disabled:hover.active,\n.open .dropdown-toggle.datepicker table tr td span.active,\n.open .dropdown-toggle.datepicker table tr td span.active:hover,\n.open .dropdown-toggle.datepicker table tr td span.active.disabled,\n.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover {\n  color: #ffffff;\n  background-color: #3276b1;\n  border-color: #285e8e;\n}\n.datepicker table tr td span.active:active,\n.datepicker table tr td span.active:hover:active,\n.datepicker table tr td span.active.disabled:active,\n.datepicker table tr td span.active.disabled:hover:active,\n.datepicker table tr td span.active.active,\n.datepicker table tr td span.active:hover.active,\n.datepicker table tr td span.active.disabled.active,\n.datepicker table tr td span.active.disabled:hover.active,\n.open .dropdown-toggle.datepicker table tr td span.active,\n.open .dropdown-toggle.datepicker table tr td span.active:hover,\n.open .dropdown-toggle.datepicker table tr td span.active.disabled,\n.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover {\n  background-image: none;\n}\n.datepicker table tr td span.active.disabled,\n.datepicker table tr td span.active:hover.disabled,\n.datepicker table tr td span.active.disabled.disabled,\n.datepicker table tr td span.active.disabled:hover.disabled,\n.datepicker table tr td span.active[disabled],\n.datepicker table tr td span.active:hover[disabled],\n.datepicker table tr td span.active.disabled[disabled],\n.datepicker table tr td span.active.disabled:hover[disabled],\nfieldset[disabled] .datepicker table tr td span.active,\nfieldset[disabled] .datepicker table tr td span.active:hover,\nfieldset[disabled] .datepicker table tr td span.active.disabled,\nfieldset[disabled] .datepicker table tr td span.active.disabled:hover,\n.datepicker table tr td span.active.disabled:hover,\n.datepicker table tr td span.active:hover.disabled:hover,\n.datepicker table tr td span.active.disabled.disabled:hover,\n.datepicker table tr td span.active.disabled:hover.disabled:hover,\n.datepicker table tr td span.active[disabled]:hover,\n.datepicker table tr td span.active:hover[disabled]:hover,\n.datepicker table tr td span.active.disabled[disabled]:hover,\n.datepicker table tr td span.active.disabled:hover[disabled]:hover,\nfieldset[disabled] .datepicker table tr td span.active:hover,\nfieldset[disabled] .datepicker table tr td span.active:hover:hover,\nfieldset[disabled] .datepicker table tr td span.active.disabled:hover,\nfieldset[disabled] .datepicker table tr td span.active.disabled:hover:hover,\n.datepicker table tr td span.active.disabled:focus,\n.datepicker table tr td span.active:hover.disabled:focus,\n.datepicker table tr td span.active.disabled.disabled:focus,\n.datepicker table tr td span.active.disabled:hover.disabled:focus,\n.datepicker table tr td span.active[disabled]:focus,\n.datepicker table tr td span.active:hover[disabled]:focus,\n.datepicker table tr td span.active.disabled[disabled]:focus,\n.datepicker table tr td span.active.disabled:hover[disabled]:focus,\nfieldset[disabled] .datepicker table tr td span.active:focus,\nfieldset[disabled] .datepicker table tr td span.active:hover:focus,\nfieldset[disabled] .datepicker table tr td span.active.disabled:focus,\nfieldset[disabled] .datepicker table tr td span.active.disabled:hover:focus,\n.datepicker table tr td span.active.disabled:active,\n.datepicker table tr td span.active:hover.disabled:active,\n.datepicker table tr td span.active.disabled.disabled:active,\n.datepicker table tr td span.active.disabled:hover.disabled:active,\n.datepicker table tr td span.active[disabled]:active,\n.datepicker table tr td span.active:hover[disabled]:active,\n.datepicker table tr td span.active.disabled[disabled]:active,\n.datepicker table tr td span.active.disabled:hover[disabled]:active,\nfieldset[disabled] .datepicker table tr td span.active:active,\nfieldset[disabled] .datepicker table tr td span.active:hover:active,\nfieldset[disabled] .datepicker table tr td span.active.disabled:active,\nfieldset[disabled] .datepicker table tr td span.active.disabled:hover:active,\n.datepicker table tr td span.active.disabled.active,\n.datepicker table tr td span.active:hover.disabled.active,\n.datepicker table tr td span.active.disabled.disabled.active,\n.datepicker table tr td span.active.disabled:hover.disabled.active,\n.datepicker table tr td span.active[disabled].active,\n.datepicker table tr td span.active:hover[disabled].active,\n.datepicker table tr td span.active.disabled[disabled].active,\n.datepicker table tr td span.active.disabled:hover[disabled].active,\nfieldset[disabled] .datepicker table tr td span.active.active,\nfieldset[disabled] .datepicker table tr td span.active:hover.active,\nfieldset[disabled] .datepicker table tr td span.active.disabled.active,\nfieldset[disabled] .datepicker table tr td span.active.disabled:hover.active {\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n.datepicker table tr td span.old,\n.datepicker table tr td span.new {\n  color: #999999;\n}\n.datepicker th.datepicker-switch {\n  width: 145px;\n}\n.datepicker thead tr:first-child th,\n.datepicker tfoot tr th {\n  cursor: pointer;\n}\n.datepicker thead tr:first-child th:hover,\n.datepicker tfoot tr th:hover {\n  background: #eeeeee;\n}\n.datepicker .cw {\n  font-size: 10px;\n  width: 12px;\n  padding: 0 2px 0 5px;\n  vertical-align: middle;\n}\n.datepicker thead tr:first-child th.cw {\n  cursor: default;\n  background-color: transparent;\n}\n.input-group.date .input-group-addon i {\n  cursor: pointer;\n  width: 16px;\n  height: 16px;\n}\n.input-daterange input {\n  text-align: center;\n}\n.input-daterange input:first-child {\n  border-radius: 3px 0 0 3px;\n}\n.input-daterange input:last-child {\n  border-radius: 0 3px 3px 0;\n}\n.input-daterange .input-group-addon {\n  width: auto;\n  min-width: 16px;\n  padding: 4px 5px;\n  font-weight: normal;\n  line-height: 1.428571429;\n  text-align: center;\n  text-shadow: 0 1px 0 #fff;\n  vertical-align: middle;\n  background-color: #eeeeee;\n  border-width: 1px 0;\n  margin-left: -5px;\n  margin-right: -5px;\n}\n.datepicker.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  float: left;\n  display: none;\n  min-width: 160px;\n  list-style: none;\n  background-color: #ffffff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 5px;\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  *border-right-width: 2px;\n  *border-bottom-width: 2px;\n  color: #333333;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 13px;\n  line-height: 1.428571429;\n}\n.datepicker.dropdown-menu th,\n.datepicker.dropdown-menu td {\n  padding: 4px 5px;\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/dropzone/basic.css",
    "content": "/* The MIT License */\n.dropzone,\n.dropzone *,\n.dropzone-previews,\n.dropzone-previews * {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n.dropzone {\n  position: relative;\n  border: 1px solid rgba(0,0,0,0.08);\n  background: rgba(0,0,0,0.02);\n  padding: 1em;\n}\n.dropzone.dz-clickable {\n  cursor: pointer;\n}\n.dropzone.dz-clickable .dz-message,\n.dropzone.dz-clickable .dz-message span {\n  cursor: pointer;\n}\n.dropzone.dz-clickable * {\n  cursor: default;\n}\n.dropzone .dz-message {\n  opacity: 1;\n  -ms-filter: none;\n  filter: none;\n}\n.dropzone.dz-drag-hover {\n  border-color: rgba(0,0,0,0.15);\n  background: rgba(0,0,0,0.04);\n}\n.dropzone.dz-started .dz-message {\n  display: none;\n}\n.dropzone .dz-preview,\n.dropzone-previews .dz-preview {\n  background: rgba(255,255,255,0.8);\n  position: relative;\n  display: inline-block;\n  margin: 17px;\n  vertical-align: top;\n  border: 1px solid #acacac;\n  padding: 6px 6px 6px 6px;\n}\n.dropzone .dz-preview.dz-file-preview [data-dz-thumbnail],\n.dropzone-previews .dz-preview.dz-file-preview [data-dz-thumbnail] {\n  display: none;\n}\n.dropzone .dz-preview .dz-details,\n.dropzone-previews .dz-preview .dz-details {\n  width: 100px;\n  height: 100px;\n  position: relative;\n  background: #ebebeb;\n  padding: 5px;\n  margin-bottom: 22px;\n}\n.dropzone .dz-preview .dz-details .dz-filename,\n.dropzone-previews .dz-preview .dz-details .dz-filename {\n  overflow: hidden;\n  height: 100%;\n}\n.dropzone .dz-preview .dz-details img,\n.dropzone-previews .dz-preview .dz-details img {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100px;\n  height: 100px;\n}\n.dropzone .dz-preview .dz-details .dz-size,\n.dropzone-previews .dz-preview .dz-details .dz-size {\n  position: absolute;\n  bottom: -28px;\n  left: 3px;\n  height: 28px;\n  line-height: 28px;\n}\n.dropzone .dz-preview.dz-error .dz-error-mark,\n.dropzone-previews .dz-preview.dz-error .dz-error-mark {\n  display: block;\n}\n.dropzone .dz-preview.dz-success .dz-success-mark,\n.dropzone-previews .dz-preview.dz-success .dz-success-mark {\n  display: block;\n}\n.dropzone .dz-preview:hover .dz-details img,\n.dropzone-previews .dz-preview:hover .dz-details img {\n  display: none;\n}\n.dropzone .dz-preview .dz-success-mark,\n.dropzone-previews .dz-preview .dz-success-mark,\n.dropzone .dz-preview .dz-error-mark,\n.dropzone-previews .dz-preview .dz-error-mark {\n  display: none;\n  position: absolute;\n  width: 40px;\n  height: 40px;\n  font-size: 30px;\n  text-align: center;\n  right: -10px;\n  top: -10px;\n}\n.dropzone .dz-preview .dz-success-mark,\n.dropzone-previews .dz-preview .dz-success-mark {\n  color: #8cc657;\n}\n.dropzone .dz-preview .dz-error-mark,\n.dropzone-previews .dz-preview .dz-error-mark {\n  color: #ee162d;\n}\n.dropzone .dz-preview .dz-progress,\n.dropzone-previews .dz-preview .dz-progress {\n  position: absolute;\n  top: 100px;\n  left: 6px;\n  right: 6px;\n  height: 6px;\n  background: #d7d7d7;\n  display: none;\n}\n.dropzone .dz-preview .dz-progress .dz-upload,\n.dropzone-previews .dz-preview .dz-progress .dz-upload {\n  display: block;\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 0%;\n  background-color: #8cc657;\n}\n.dropzone .dz-preview.dz-processing .dz-progress,\n.dropzone-previews .dz-preview.dz-processing .dz-progress {\n  display: block;\n}\n.dropzone .dz-preview .dz-error-message,\n.dropzone-previews .dz-preview .dz-error-message {\n  display: none;\n  position: absolute;\n  top: -5px;\n  left: -20px;\n  background: rgba(245,245,245,0.8);\n  padding: 8px 10px;\n  color: #800;\n  min-width: 140px;\n  max-width: 500px;\n  z-index: 500;\n}\n.dropzone .dz-preview:hover.dz-error .dz-error-message,\n.dropzone-previews .dz-preview:hover.dz-error .dz-error-message {\n  display: block;\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/dropzone/dropzone.css",
    "content": "/* The MIT License */\n.dropzone,\n.dropzone *,\n.dropzone-previews,\n.dropzone-previews * {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n.dropzone {\n  position: relative;\n  border: 1px solid rgba(0,0,0,0.08);\n  background: rgba(0,0,0,0.02);\n  padding: 1em;\n}\n.dropzone.dz-clickable {\n  cursor: pointer;\n}\n.dropzone.dz-clickable .dz-message,\n.dropzone.dz-clickable .dz-message span {\n  cursor: pointer;\n}\n.dropzone.dz-clickable * {\n  cursor: default;\n}\n.dropzone .dz-message {\n  opacity: 1;\n  -ms-filter: none;\n  filter: none;\n}\n.dropzone.dz-drag-hover {\n  border-color: rgba(0,0,0,0.15);\n  background: rgba(0,0,0,0.04);\n}\n.dropzone.dz-started .dz-message {\n  display: none;\n}\n.dropzone .dz-preview,\n.dropzone-previews .dz-preview {\n  background: rgba(255,255,255,0.8);\n  position: relative;\n  display: inline-block;\n  margin: 17px;\n  vertical-align: top;\n  border: 1px solid #acacac;\n  padding: 6px 6px 6px 6px;\n}\n.dropzone .dz-preview.dz-file-preview [data-dz-thumbnail],\n.dropzone-previews .dz-preview.dz-file-preview [data-dz-thumbnail] {\n  display: none;\n}\n.dropzone .dz-preview .dz-details,\n.dropzone-previews .dz-preview .dz-details {\n  width: 100px;\n  height: 100px;\n  position: relative;\n  background: #ebebeb;\n  padding: 5px;\n  margin-bottom: 22px;\n}\n.dropzone .dz-preview .dz-details .dz-filename,\n.dropzone-previews .dz-preview .dz-details .dz-filename {\n  overflow: hidden;\n  height: 100%;\n}\n.dropzone .dz-preview .dz-details img,\n.dropzone-previews .dz-preview .dz-details img {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100px;\n  height: 100px;\n}\n.dropzone .dz-preview .dz-details .dz-size,\n.dropzone-previews .dz-preview .dz-details .dz-size {\n  position: absolute;\n  bottom: -28px;\n  left: 3px;\n  height: 28px;\n  line-height: 28px;\n}\n.dropzone .dz-preview.dz-error .dz-error-mark,\n.dropzone-previews .dz-preview.dz-error .dz-error-mark {\n  display: block;\n}\n.dropzone .dz-preview.dz-success .dz-success-mark,\n.dropzone-previews .dz-preview.dz-success .dz-success-mark {\n  display: block;\n}\n.dropzone .dz-preview:hover .dz-details img,\n.dropzone-previews .dz-preview:hover .dz-details img {\n  display: none;\n}\n.dropzone .dz-preview .dz-success-mark,\n.dropzone-previews .dz-preview .dz-success-mark,\n.dropzone .dz-preview .dz-error-mark,\n.dropzone-previews .dz-preview .dz-error-mark {\n  display: none;\n  position: absolute;\n  width: 40px;\n  height: 40px;\n  font-size: 30px;\n  text-align: center;\n  right: -10px;\n  top: -10px;\n}\n.dropzone .dz-preview .dz-success-mark,\n.dropzone-previews .dz-preview .dz-success-mark {\n  color: #8cc657;\n}\n.dropzone .dz-preview .dz-error-mark,\n.dropzone-previews .dz-preview .dz-error-mark {\n  color: #ee162d;\n}\n.dropzone .dz-preview .dz-progress,\n.dropzone-previews .dz-preview .dz-progress {\n  position: absolute;\n  top: 100px;\n  left: 6px;\n  right: 6px;\n  height: 6px;\n  background: #d7d7d7;\n  display: none;\n}\n.dropzone .dz-preview .dz-progress .dz-upload,\n.dropzone-previews .dz-preview .dz-progress .dz-upload {\n  display: block;\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 0%;\n  background-color: #8cc657;\n}\n.dropzone .dz-preview.dz-processing .dz-progress,\n.dropzone-previews .dz-preview.dz-processing .dz-progress {\n  display: block;\n}\n.dropzone .dz-preview .dz-error-message,\n.dropzone-previews .dz-preview .dz-error-message {\n  display: none;\n  position: absolute;\n  top: -5px;\n  left: -20px;\n  background: rgba(245,245,245,0.8);\n  padding: 8px 10px;\n  color: #800;\n  min-width: 140px;\n  max-width: 500px;\n  z-index: 500;\n}\n.dropzone .dz-preview:hover.dz-error .dz-error-message,\n.dropzone-previews .dz-preview:hover.dz-error .dz-error-message {\n  display: block;\n}\n.dropzone {\n  border: 1px solid rgba(0,0,0,0.03);\n  min-height: 360px;\n  -webkit-border-radius: 3px;\n  border-radius: 3px;\n  background: rgba(0,0,0,0.03);\n  padding: 23px;\n}\n.dropzone .dz-default.dz-message {\n  opacity: 1;\n  -ms-filter: none;\n  filter: none;\n  -webkit-transition: opacity 0.3s ease-in-out;\n  -moz-transition: opacity 0.3s ease-in-out;\n  -o-transition: opacity 0.3s ease-in-out;\n  -ms-transition: opacity 0.3s ease-in-out;\n  transition: opacity 0.3s ease-in-out;\n  background-image: url(\"../images/spritemap.png\");\n  background-repeat: no-repeat;\n  background-position: 0 0;\n  position: absolute;\n  width: 428px;\n  height: 123px;\n  margin-left: -214px;\n  margin-top: -61.5px;\n  top: 50%;\n  left: 50%;\n}\n@media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx) {\n  .dropzone .dz-default.dz-message {\n    background-image: url(\"../images/spritemap%402x.png\");\n    -webkit-background-size: 428px 406px;\n    -moz-background-size: 428px 406px;\n    background-size: 428px 406px;\n  }\n}\n.dropzone .dz-default.dz-message span {\n  display: none;\n}\n.dropzone.dz-square .dz-default.dz-message {\n  background-position: 0 -123px;\n  width: 268px;\n  margin-left: -134px;\n  height: 174px;\n  margin-top: -87px;\n}\n.dropzone.dz-drag-hover .dz-message {\n  opacity: 0.15;\n  -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=15)\";\n  filter: alpha(opacity=15);\n}\n.dropzone.dz-started .dz-message {\n  display: block;\n  opacity: 0;\n  -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";\n  filter: alpha(opacity=0);\n}\n.dropzone .dz-preview,\n.dropzone-previews .dz-preview {\n  -webkit-box-shadow: 1px 1px 4px rgba(0,0,0,0.16);\n  box-shadow: 1px 1px 4px rgba(0,0,0,0.16);\n  font-size: 14px;\n}\n.dropzone .dz-preview.dz-image-preview:hover .dz-details img,\n.dropzone-previews .dz-preview.dz-image-preview:hover .dz-details img {\n  display: block;\n  opacity: 0.1;\n  -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=10)\";\n  filter: alpha(opacity=10);\n}\n.dropzone .dz-preview.dz-success .dz-success-mark,\n.dropzone-previews .dz-preview.dz-success .dz-success-mark {\n  opacity: 1;\n  -ms-filter: none;\n  filter: none;\n}\n.dropzone .dz-preview.dz-error .dz-error-mark,\n.dropzone-previews .dz-preview.dz-error .dz-error-mark {\n  opacity: 1;\n  -ms-filter: none;\n  filter: none;\n}\n.dropzone .dz-preview.dz-error .dz-progress .dz-upload,\n.dropzone-previews .dz-preview.dz-error .dz-progress .dz-upload {\n  background: #ee1e2d;\n}\n.dropzone .dz-preview .dz-error-mark,\n.dropzone-previews .dz-preview .dz-error-mark,\n.dropzone .dz-preview .dz-success-mark,\n.dropzone-previews .dz-preview .dz-success-mark {\n  display: block;\n  opacity: 0;\n  -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";\n  filter: alpha(opacity=0);\n  -webkit-transition: opacity 0.4s ease-in-out;\n  -moz-transition: opacity 0.4s ease-in-out;\n  -o-transition: opacity 0.4s ease-in-out;\n  -ms-transition: opacity 0.4s ease-in-out;\n  transition: opacity 0.4s ease-in-out;\n  background-image: url(\"../images/spritemap.png\");\n  background-repeat: no-repeat;\n}\n@media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx) {\n  .dropzone .dz-preview .dz-error-mark,\n  .dropzone-previews .dz-preview .dz-error-mark,\n  .dropzone .dz-preview .dz-success-mark,\n  .dropzone-previews .dz-preview .dz-success-mark {\n    background-image: url(\"../images/spritemap%402x.png\");\n    -webkit-background-size: 428px 406px;\n    -moz-background-size: 428px 406px;\n    background-size: 428px 406px;\n  }\n}\n.dropzone .dz-preview .dz-error-mark span,\n.dropzone-previews .dz-preview .dz-error-mark span,\n.dropzone .dz-preview .dz-success-mark span,\n.dropzone-previews .dz-preview .dz-success-mark span {\n  display: none;\n}\n.dropzone .dz-preview .dz-error-mark,\n.dropzone-previews .dz-preview .dz-error-mark {\n  background-position: -268px -123px;\n}\n.dropzone .dz-preview .dz-success-mark,\n.dropzone-previews .dz-preview .dz-success-mark {\n  background-position: -268px -163px;\n}\n.dropzone .dz-preview .dz-progress .dz-upload,\n.dropzone-previews .dz-preview .dz-progress .dz-upload {\n  -webkit-animation: loading 0.4s linear infinite;\n  -moz-animation: loading 0.4s linear infinite;\n  -o-animation: loading 0.4s linear infinite;\n  -ms-animation: loading 0.4s linear infinite;\n  animation: loading 0.4s linear infinite;\n  -webkit-transition: width 0.3s ease-in-out;\n  -moz-transition: width 0.3s ease-in-out;\n  -o-transition: width 0.3s ease-in-out;\n  -ms-transition: width 0.3s ease-in-out;\n  transition: width 0.3s ease-in-out;\n  -webkit-border-radius: 2px;\n  border-radius: 2px;\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 0%;\n  height: 100%;\n  background-image: url(\"../images/spritemap.png\");\n  background-repeat: repeat-x;\n  background-position: 0px -400px;\n}\n@media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx) {\n  .dropzone .dz-preview .dz-progress .dz-upload,\n  .dropzone-previews .dz-preview .dz-progress .dz-upload {\n    background-image: url(\"../images/spritemap%402x.png\");\n    -webkit-background-size: 428px 406px;\n    -moz-background-size: 428px 406px;\n    background-size: 428px 406px;\n  }\n}\n.dropzone .dz-preview.dz-success .dz-progress,\n.dropzone-previews .dz-preview.dz-success .dz-progress {\n  display: block;\n  opacity: 0;\n  -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";\n  filter: alpha(opacity=0);\n  -webkit-transition: opacity 0.4s ease-in-out;\n  -moz-transition: opacity 0.4s ease-in-out;\n  -o-transition: opacity 0.4s ease-in-out;\n  -ms-transition: opacity 0.4s ease-in-out;\n  transition: opacity 0.4s ease-in-out;\n}\n.dropzone .dz-preview .dz-error-message,\n.dropzone-previews .dz-preview .dz-error-message {\n  display: block;\n  opacity: 0;\n  -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";\n  filter: alpha(opacity=0);\n  -webkit-transition: opacity 0.3s ease-in-out;\n  -moz-transition: opacity 0.3s ease-in-out;\n  -o-transition: opacity 0.3s ease-in-out;\n  -ms-transition: opacity 0.3s ease-in-out;\n  transition: opacity 0.3s ease-in-out;\n}\n.dropzone .dz-preview:hover.dz-error .dz-error-message,\n.dropzone-previews .dz-preview:hover.dz-error .dz-error-message {\n  opacity: 1;\n  -ms-filter: none;\n  filter: none;\n}\n.dropzone a.dz-remove,\n.dropzone-previews a.dz-remove {\n  background-image: -webkit-linear-gradient(top, #fafafa, #eee);\n  background-image: -moz-linear-gradient(top, #fafafa, #eee);\n  background-image: -o-linear-gradient(top, #fafafa, #eee);\n  background-image: -ms-linear-gradient(top, #fafafa, #eee);\n  background-image: linear-gradient(to bottom, #fafafa, #eee);\n  -webkit-border-radius: 2px;\n  border-radius: 2px;\n  border: 1px solid #eee;\n  text-decoration: none;\n  display: block;\n  padding: 4px 5px;\n  text-align: center;\n  color: #aaa;\n  margin-top: 26px;\n}\n.dropzone a.dz-remove:hover,\n.dropzone-previews a.dz-remove:hover {\n  color: #666;\n}\n@-moz-keyframes loading {\n  0% {\n    background-position: 0 -400px;\n  }\n\n  100% {\n    background-position: -7px -400px;\n  }\n}\n@-webkit-keyframes loading {\n  0% {\n    background-position: 0 -400px;\n  }\n\n  100% {\n    background-position: -7px -400px;\n  }\n}\n@-o-keyframes loading {\n  0% {\n    background-position: 0 -400px;\n  }\n\n  100% {\n    background-position: -7px -400px;\n  }\n}\n@-ms-keyframes loading {\n  0% {\n    background-position: 0 -400px;\n  }\n\n  100% {\n    background-position: -7px -400px;\n  }\n}\n@keyframes loading {\n  0% {\n    background-position: 0 -400px;\n  }\n\n  100% {\n    background-position: -7px -400px;\n  }\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/footable/footable.core.css",
    "content": "@font-face {\n  font-family: 'footable';\n  src: url('fonts/footable.eot');\n  src: url('fonts/footabled41d.eot?#iefix') format('embedded-opentype'), url('fonts/footable.woff') format('woff'), url('fonts/footable.ttf') format('truetype'), url('fonts/footable.svg#footable') format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  @font-face {\n    font-family: 'footable';\n    src: url('fonts/footable.svg#footable') format('svg');\n    font-weight: normal;\n    font-style: normal;\n  }\n}\n.footable {\n  width: 100%;\n  /** SORTING **/\n\n  /** PAGINATION **/\n\n}\n.footable.breakpoint > tbody > tr.footable-detail-show > td {\n  border-bottom: none;\n}\n.footable.breakpoint > tbody > tr.footable-detail-show > td > span.footable-toggle:before {\n  content: \"\\e001\";\n}\n.footable.breakpoint > tbody > tr:hover:not(.footable-row-detail) {\n  cursor: pointer;\n}\n.footable.breakpoint > tbody > tr > td.footable-cell-detail {\n  background: #eee;\n  border-top: none;\n}\n.footable.breakpoint > tbody > tr > td > span.footable-toggle {\n  display: inline-block;\n  font-family: 'footable';\n  speak: none;\n  font-style: normal;\n  font-weight: normal;\n  font-variant: normal;\n  text-transform: none;\n  -webkit-font-smoothing: antialiased;\n  padding-right: 5px;\n  font-size: 14px;\n  color: #888888;\n}\n.footable.breakpoint > tbody > tr > td > span.footable-toggle:before {\n  content: \"\\e000\";\n}\n.footable.breakpoint.toggle-circle > tbody > tr.footable-detail-show > td > span.footable-toggle:before {\n  content: \"\\e005\";\n}\n.footable.breakpoint.toggle-circle > tbody > tr > td > span.footable-toggle:before {\n  content: \"\\e004\";\n}\n.footable.breakpoint.toggle-circle-filled > tbody > tr.footable-detail-show > td > span.footable-toggle:before {\n  content: \"\\e003\";\n}\n.footable.breakpoint.toggle-circle-filled > tbody > tr > td > span.footable-toggle:before {\n  content: \"\\e002\";\n}\n.footable.breakpoint.toggle-square > tbody > tr.footable-detail-show > td > span.footable-toggle:before {\n  content: \"\\e007\";\n}\n.footable.breakpoint.toggle-square > tbody > tr > td > span.footable-toggle:before {\n  content: \"\\e006\";\n}\n.footable.breakpoint.toggle-square-filled > tbody > tr.footable-detail-show > td > span.footable-toggle:before {\n  content: \"\\e009\";\n}\n.footable.breakpoint.toggle-square-filled > tbody > tr > td > span.footable-toggle:before {\n  content: \"\\e008\";\n}\n.footable.breakpoint.toggle-arrow > tbody > tr.footable-detail-show > td > span.footable-toggle:before {\n  content: \"\\e00f\";\n}\n.footable.breakpoint.toggle-arrow > tbody > tr > td > span.footable-toggle:before {\n  content: \"\\e011\";\n}\n.footable.breakpoint.toggle-arrow-small > tbody > tr.footable-detail-show > td > span.footable-toggle:before {\n  content: \"\\e013\";\n}\n.footable.breakpoint.toggle-arrow-small > tbody > tr > td > span.footable-toggle:before {\n  content: \"\\e015\";\n}\n.footable.breakpoint.toggle-arrow-circle > tbody > tr.footable-detail-show > td > span.footable-toggle:before {\n  content: \"\\e01b\";\n}\n.footable.breakpoint.toggle-arrow-circle > tbody > tr > td > span.footable-toggle:before {\n  content: \"\\e01d\";\n}\n.footable.breakpoint.toggle-arrow-circle-filled > tbody > tr.footable-detail-show > td > span.footable-toggle:before {\n  content: \"\\e00b\";\n}\n.footable.breakpoint.toggle-arrow-circle-filled > tbody > tr > td > span.footable-toggle:before {\n  content: \"\\e00d\";\n}\n.footable.breakpoint.toggle-arrow-tiny > tbody > tr.footable-detail-show > td > span.footable-toggle:before {\n  content: \"\\e01f\";\n}\n.footable.breakpoint.toggle-arrow-tiny > tbody > tr > td > span.footable-toggle:before {\n  content: \"\\e021\";\n}\n.footable.breakpoint.toggle-arrow-alt > tbody > tr.footable-detail-show > td > span.footable-toggle:before {\n  content: \"\\e017\";\n}\n.footable.breakpoint.toggle-arrow-alt > tbody > tr > td > span.footable-toggle:before {\n  content: \"\\e019\";\n}\n.footable.breakpoint.toggle-medium > tbody > tr > td > span.footable-toggle {\n  font-size: 18px;\n}\n.footable.breakpoint.toggle-large > tbody > tr > td > span.footable-toggle {\n  font-size: 24px;\n}\n.footable > thead > tr > th {\n  -webkit-touch-callout: none;\n  -webkit-user-select: none;\n  -khtml-user-select: none;\n  -moz-user-select: -moz-none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.footable > thead > tr > th.footable-sortable:hover {\n  cursor: pointer;\n}\n.footable > thead > tr > th.footable-sorted > span.footable-sort-indicator:before {\n  content: \"\\e013\";\n}\n.footable > thead > tr > th.footable-sorted-desc > span.footable-sort-indicator:before {\n  content: \"\\e012\";\n}\n.footable > thead > tr > th > span.footable-sort-indicator {\n  display: inline-block;\n  font-family: 'footable';\n  speak: none;\n  font-style: normal;\n  font-weight: normal;\n  font-variant: normal;\n  text-transform: none;\n  -webkit-font-smoothing: antialiased;\n  padding-left: 5px;\n}\n.footable > thead > tr > th > span.footable-sort-indicator:before {\n  content: \"\\e022\";\n}\n.footable > tfoot .pagination {\n  margin: 0;\n}\n.footable.no-paging .hide-if-no-paging {\n  display: none;\n}\n.footable-row-detail-inner {\n  display: table;\n}\n.footable-row-detail-row {\n  display: table-row;\n  line-height: 1.5em;\n}\n.footable-row-detail-group {\n  display: block;\n  line-height: 2em;\n  font-size: 1.2em;\n  font-weight: bold;\n}\n.footable-row-detail-name {\n  display: table-cell;\n  font-weight: bold;\n  padding-right: 0.5em;\n}\n.footable-row-detail-value {\n  display: table-cell;\n}\n.footable-odd {\n  background-color: #f7f7f7;\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/fullcalendar/fullcalendar.css",
    "content": "/*!\n * FullCalendar v1.6.4 Stylesheet\n * Docs & License: http://arshaw.com/fullcalendar/\n * (c) 2013 Adam Shaw\n */\n\n\n.fc {\n\tdirection: ltr;\n\ttext-align: left;\n\t}\n\n.fc table {\n\tborder-collapse: collapse;\n\tborder-spacing: 0;\n\t}\n\nhtml .fc,\n.fc table {\n\tfont-size: 1em;\n\t}\n\n.fc td,\n.fc th {\n\tpadding: 0;\n\tvertical-align: top;\n\t}\n\n\n\n/* Header\n------------------------------------------------------------------------*/\n\n.fc-header td {\n\twhite-space: nowrap;\n\t}\n\n.fc-header-left {\n\twidth: 25%;\n\ttext-align: left;\n\t}\n\n.fc-header-center {\n\ttext-align: center;\n\t}\n\n.fc-header-right {\n\twidth: 25%;\n\ttext-align: right;\n\t}\n\n.fc-header-title {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\t}\n\n.fc-header-title h2 {\n\tmargin-top: 0;\n\twhite-space: nowrap;\n\t}\n\n.fc .fc-header-space {\n\tpadding-left: 10px;\n\t}\n\n.fc-header .fc-button {\n\tmargin-bottom: 1em;\n\tvertical-align: top;\n\t}\n\n/* buttons edges butting together */\n\n.fc-header .fc-button {\n\tmargin-right: -1px;\n\t}\n\n.fc-header .fc-corner-right,  /* non-theme */\n.fc-header .ui-corner-right { /* theme */\n\tmargin-right: 0; /* back to normal */\n\t}\n\n/* button layering (for border precedence) */\n\n.fc-header .fc-state-hover,\n.fc-header .ui-state-hover {\n\tz-index: 2;\n\t}\n\n.fc-header .fc-state-down {\n\tz-index: 3;\n\t}\n\n.fc-header .fc-state-active,\n.fc-header .ui-state-active {\n\tz-index: 4;\n\t}\n\n\n\n/* Content\n------------------------------------------------------------------------*/\n\n.fc-content {\n\tclear: both;\n\tzoom: 1; /* for IE7, gives accurate coordinates for [un]freezeContentHeight */\n\t}\n\n.fc-view {\n\twidth: 100%;\n\toverflow: hidden;\n\t}\n\n\n\n/* Cell Styles\n------------------------------------------------------------------------*/\n\n.fc-widget-header,    /* <th>, usually */\n.fc-widget-content {  /* <td>, usually */\n\tborder: 1px solid #ddd;\n\t}\n\n.fc-state-highlight { /* <td> today cell */ /* TODO: add .fc-today to <th> */\n\tbackground: #fcf8e3;\n\t}\n\n.fc-cell-overlay { /* semi-transparent rectangle while dragging */\n\tbackground: #bce8f1;\n\topacity: .3;\n\tfilter: alpha(opacity=30); /* for IE */\n\t}\n\n\n\n/* Buttons\n------------------------------------------------------------------------*/\n\n.fc-button {\n\tposition: relative;\n\tdisplay: inline-block;\n\tpadding: 0 .6em;\n\toverflow: hidden;\n\theight: 1.9em;\n\tline-height: 1.9em;\n\twhite-space: nowrap;\n\tcursor: pointer;\n\t}\n\n.fc-state-default { /* non-theme */\n\tborder: 1px solid;\n\t}\n\n.fc-state-default.fc-corner-left { /* non-theme */\n\tborder-top-left-radius: 4px;\n\tborder-bottom-left-radius: 4px;\n\t}\n\n.fc-state-default.fc-corner-right { /* non-theme */\n\tborder-top-right-radius: 4px;\n\tborder-bottom-right-radius: 4px;\n\t}\n\n/*\n\tOur default prev/next buttons use HTML entities like &lsaquo; &rsaquo; &laquo; &raquo;\n\tand we'll try to make them look good cross-browser.\n*/\n\n.fc-text-arrow {\n\tmargin: 0 .1em;\n\tfont-size: 2em;\n\tfont-family: \"Courier New\", Courier, monospace;\n\tvertical-align: baseline; /* for IE7 */\n\t}\n\n.fc-button-prev .fc-text-arrow,\n.fc-button-next .fc-text-arrow { /* for &lsaquo; &rsaquo; */\n\tfont-weight: bold;\n\t}\n\n/* icon (for jquery ui) */\n\n.fc-button .fc-icon-wrap {\n\tposition: relative;\n\tfloat: left;\n\ttop: 50%;\n\t}\n\n.fc-button .ui-icon {\n\tposition: relative;\n\tfloat: left;\n\tmargin-top: -50%;\n\t*margin-top: 0;\n\t*top: -50%;\n\t}\n\n/*\n  button states\n  borrowed from twitter bootstrap (http://twitter.github.com/bootstrap/)\n*/\n\n.fc-state-default {\n\tbackground-color: #f5f5f5;\n\tbackground-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);\n\tbackground-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));\n\tbackground-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);\n\tbackground-image: -o-linear-gradient(top, #ffffff, #e6e6e6);\n\tbackground-image: linear-gradient(to bottom, #ffffff, #e6e6e6);\n\tbackground-repeat: repeat-x;\n\tborder-color: #e6e6e6 #e6e6e6 #bfbfbf;\n\tborder-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n\tcolor: #333;\n\ttext-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);\n\tbox-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);\n\t}\n\n.fc-state-hover,\n.fc-state-down,\n.fc-state-active,\n.fc-state-disabled {\n\tcolor: #333333;\n\tbackground-color: #e6e6e6;\n\t}\n\n.fc-state-hover {\n\tcolor: #333333;\n\ttext-decoration: none;\n\tbackground-position: 0 -15px;\n\t-webkit-transition: background-position 0.1s linear;\n\t   -moz-transition: background-position 0.1s linear;\n\t     -o-transition: background-position 0.1s linear;\n\t        transition: background-position 0.1s linear;\n\t}\n\n.fc-state-down,\n.fc-state-active {\n\tbackground-color: #cccccc;\n\tbackground-image: none;\n\toutline: 0;\n\tbox-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);\n\t}\n\n.fc-state-disabled {\n\tcursor: default;\n\tbackground-image: none;\n\topacity: 0.65;\n\tfilter: alpha(opacity=65);\n\tbox-shadow: none;\n\t}\n\n\n\n/* Global Event Styles\n------------------------------------------------------------------------*/\n\n.fc-event-container > * {\n\tz-index: 8;\n\t}\n\n.fc-event-container > .ui-draggable-dragging,\n.fc-event-container > .ui-resizable-resizing {\n\tz-index: 9;\n\t}\n\n.fc-event {\n\tborder: 1px solid #3a87ad; /* default BORDER color */\n\tbackground-color: #3a87ad; /* default BACKGROUND color */\n\tcolor: #fff;               /* default TEXT color */\n\tfont-size: .85em;\n\tcursor: default;\n\t}\n\na.fc-event {\n\ttext-decoration: none;\n\t}\n\na.fc-event,\n.fc-event-draggable {\n\tcursor: pointer;\n\t}\n\n.fc-rtl .fc-event {\n\ttext-align: right;\n\t}\n\n.fc-event-inner {\n\twidth: 100%;\n\theight: 100%;\n\toverflow: hidden;\n\t}\n\n.fc-event-time,\n.fc-event-title {\n\tpadding: 0 1px;\n\t}\n\n.fc .ui-resizable-handle {\n\tdisplay: block;\n\tposition: absolute;\n\tz-index: 99999;\n\toverflow: hidden; /* hacky spaces (IE6/7) */\n\tfont-size: 300%;  /* */\n\tline-height: 50%; /* */\n\t}\n\n\n\n/* Horizontal Events\n------------------------------------------------------------------------*/\n\n.fc-event-hori {\n\tborder-width: 1px 0;\n\tmargin-bottom: 1px;\n\t}\n\n.fc-ltr .fc-event-hori.fc-event-start,\n.fc-rtl .fc-event-hori.fc-event-end {\n\tborder-left-width: 1px;\n\tborder-top-left-radius: 3px;\n\tborder-bottom-left-radius: 3px;\n\t}\n\n.fc-ltr .fc-event-hori.fc-event-end,\n.fc-rtl .fc-event-hori.fc-event-start {\n\tborder-right-width: 1px;\n\tborder-top-right-radius: 3px;\n\tborder-bottom-right-radius: 3px;\n\t}\n\n/* resizable */\n\n.fc-event-hori .ui-resizable-e {\n\ttop: 0           !important; /* importants override pre jquery ui 1.7 styles */\n\tright: -3px      !important;\n\twidth: 7px       !important;\n\theight: 100%     !important;\n\tcursor: e-resize;\n\t}\n\n.fc-event-hori .ui-resizable-w {\n\ttop: 0           !important;\n\tleft: -3px       !important;\n\twidth: 7px       !important;\n\theight: 100%     !important;\n\tcursor: w-resize;\n\t}\n\n.fc-event-hori .ui-resizable-handle {\n\t_padding-bottom: 14px; /* IE6 had 0 height */\n\t}\n\n\n\n/* Reusable Separate-border Table\n------------------------------------------------------------*/\n\ntable.fc-border-separate {\n\tborder-collapse: separate;\n\t}\n\n.fc-border-separate th,\n.fc-border-separate td {\n\tborder-width: 1px 0 0 1px;\n\t}\n\n.fc-border-separate th.fc-last,\n.fc-border-separate td.fc-last {\n\tborder-right-width: 1px;\n\t}\n\n.fc-border-separate tr.fc-last th,\n.fc-border-separate tr.fc-last td {\n\tborder-bottom-width: 1px;\n\t}\n\n.fc-border-separate tbody tr.fc-first td,\n.fc-border-separate tbody tr.fc-first th {\n\tborder-top-width: 0;\n\t}\n\n\n\n/* Month View, Basic Week View, Basic Day View\n------------------------------------------------------------------------*/\n\n.fc-grid th {\n\ttext-align: center;\n\t}\n\n.fc .fc-week-number {\n\twidth: 22px;\n\ttext-align: center;\n\t}\n\n.fc .fc-week-number div {\n\tpadding: 0 2px;\n\t}\n\n.fc-grid .fc-day-number {\n\tfloat: right;\n\tpadding: 0 2px;\n\t}\n\n.fc-grid .fc-other-month .fc-day-number {\n\topacity: 0.3;\n\tfilter: alpha(opacity=30); /* for IE */\n\t/* opacity with small font can sometimes look too faded\n\t   might want to set the 'color' property instead\n\t   making day-numbers bold also fixes the problem */\n\t}\n\n.fc-grid .fc-day-content {\n\tclear: both;\n\tpadding: 2px 2px 1px; /* distance between events and day edges */\n\t}\n\n/* event styles */\n\n.fc-grid .fc-event-time {\n\tfont-weight: bold;\n\t}\n\n/* right-to-left */\n\n.fc-rtl .fc-grid .fc-day-number {\n\tfloat: left;\n\t}\n\n.fc-rtl .fc-grid .fc-event-time {\n\tfloat: right;\n\t}\n\n\n\n/* Agenda Week View, Agenda Day View\n------------------------------------------------------------------------*/\n\n.fc-agenda table {\n\tborder-collapse: separate;\n\t}\n\n.fc-agenda-days th {\n\ttext-align: center;\n\t}\n\n.fc-agenda .fc-agenda-axis {\n\twidth: 50px;\n\tpadding: 0 4px;\n\tvertical-align: middle;\n\ttext-align: right;\n\twhite-space: nowrap;\n\tfont-weight: normal;\n\t}\n\n.fc-agenda .fc-week-number {\n\tfont-weight: bold;\n\t}\n\n.fc-agenda .fc-day-content {\n\tpadding: 2px 2px 1px;\n\t}\n\n/* make axis border take precedence */\n\n.fc-agenda-days .fc-agenda-axis {\n\tborder-right-width: 1px;\n\t}\n\n.fc-agenda-days .fc-col0 {\n\tborder-left-width: 0;\n\t}\n\n/* all-day area */\n\n.fc-agenda-allday th {\n\tborder-width: 0 1px;\n\t}\n\n.fc-agenda-allday .fc-day-content {\n\tmin-height: 34px; /* TODO: doesnt work well in quirksmode */\n\t_height: 34px;\n\t}\n\n/* divider (between all-day and slots) */\n\n.fc-agenda-divider-inner {\n\theight: 2px;\n\toverflow: hidden;\n\t}\n\n.fc-widget-header .fc-agenda-divider-inner {\n\tbackground: #eee;\n\t}\n\n/* slot rows */\n\n.fc-agenda-slots th {\n\tborder-width: 1px 1px 0;\n\t}\n\n.fc-agenda-slots td {\n\tborder-width: 1px 0 0;\n\tbackground: none;\n\t}\n\n.fc-agenda-slots td div {\n\theight: 20px;\n\t}\n\n.fc-agenda-slots tr.fc-slot0 th,\n.fc-agenda-slots tr.fc-slot0 td {\n\tborder-top-width: 0;\n\t}\n\n.fc-agenda-slots tr.fc-minor th,\n.fc-agenda-slots tr.fc-minor td {\n\tborder-top-style: dotted;\n\t}\n\n.fc-agenda-slots tr.fc-minor th.ui-widget-header {\n\t*border-top-style: solid; /* doesn't work with background in IE6/7 */\n\t}\n\n\n\n/* Vertical Events\n------------------------------------------------------------------------*/\n\n.fc-event-vert {\n\tborder-width: 0 1px;\n\t}\n\n.fc-event-vert.fc-event-start {\n\tborder-top-width: 1px;\n\tborder-top-left-radius: 3px;\n\tborder-top-right-radius: 3px;\n\t}\n\n.fc-event-vert.fc-event-end {\n\tborder-bottom-width: 1px;\n\tborder-bottom-left-radius: 3px;\n\tborder-bottom-right-radius: 3px;\n\t}\n\n.fc-event-vert .fc-event-time {\n\twhite-space: nowrap;\n\tfont-size: 10px;\n\t}\n\n.fc-event-vert .fc-event-inner {\n\tposition: relative;\n\tz-index: 2;\n\t}\n\n.fc-event-vert .fc-event-bg { /* makes the event lighter w/ a semi-transparent overlay  */\n\tposition: absolute;\n\tz-index: 1;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\tbackground: #fff;\n\topacity: .25;\n\tfilter: alpha(opacity=25);\n\t}\n\n.fc .ui-draggable-dragging .fc-event-bg, /* TODO: something nicer like .fc-opacity */\n.fc-select-helper .fc-event-bg {\n\tdisplay: none\\9; /* for IE6/7/8. nested opacity filters while dragging don't work */\n\t}\n\n/* resizable */\n\n.fc-event-vert .ui-resizable-s {\n\tbottom: 0        !important; /* importants override pre jquery ui 1.7 styles */\n\twidth: 100%      !important;\n\theight: 8px      !important;\n\toverflow: hidden !important;\n\tline-height: 8px !important;\n\tfont-size: 11px  !important;\n\tfont-family: monospace;\n\ttext-align: center;\n\tcursor: s-resize;\n\t}\n\n.fc-agenda .ui-resizable-resizing { /* TODO: better selector */\n\t_overflow: hidden;\n\t}\n\n\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/fullcalendar/fullcalendar.print.css",
    "content": "/*!\n * FullCalendar v1.6.4 Print Stylesheet\n * Docs & License: http://arshaw.com/fullcalendar/\n * (c) 2013 Adam Shaw\n */\n\n/*\n * Include this stylesheet on your page to get a more printer-friendly calendar.\n * When including this stylesheet, use the media='print' attribute of the <link> tag.\n * Make sure to include this stylesheet IN ADDITION to the regular fullcalendar.css.\n */\n\n\n /* Events\n-----------------------------------------------------*/\n\n.fc-event {\n\tbackground: #fff !important;\n\tcolor: #000 !important;\n\t}\n\n/* for vertical events */\n\n.fc-event-bg {\n\tdisplay: none !important;\n\t}\n\n.fc-event .ui-resizable-handle {\n\tdisplay: none !important;\n\t}\n\n\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/iCheck/custom.css",
    "content": "/* iCheck plugin Square skin, green\n----------------------------------- */\n.icheckbox_square-green,\n.iradio_square-green {\n    display: inline-block;\n    *display: inline;\n    vertical-align: middle;\n    margin: 0;\n    padding: 0;\n    width: 22px;\n    height: 22px;\n    background: url(green.png) no-repeat;\n    border: none;\n    cursor: pointer;\n}\n\n.icheckbox_square-green {\n    background-position: 0 0;\n}\n.icheckbox_square-green.hover {\n    background-position: -24px 0;\n}\n.icheckbox_square-green.checked {\n    background-position: -48px 0;\n}\n.icheckbox_square-green.disabled {\n    background-position: -72px 0;\n    cursor: default;\n}\n.icheckbox_square-green.checked.disabled {\n    background-position: -96px 0;\n}\n\n.iradio_square-green {\n    background-position: -120px 0;\n}\n.iradio_square-green.hover {\n    background-position: -144px 0;\n}\n.iradio_square-green.checked {\n    background-position: -168px 0;\n}\n.iradio_square-green.disabled {\n    background-position: -192px 0;\n    cursor: default;\n}\n.iradio_square-green.checked.disabled {\n    background-position: -216px 0;\n}\n\n/* HiDPI support */\n@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) {\n    .icheckbox_square-green,\n    .iradio_square-green {\n        background-image: url(green%402x.png);\n        -webkit-background-size: 240px 24px;\n        background-size: 240px 24px;\n    }\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/ionRangeSlider/ion.rangeSlider.css",
    "content": "/* Ion.RangeSlider\n// css version 1.8.5\n// by Denis Ineshin | ionden.com\n// ===================================================================================================================*/\n\n/* =====================================================================================================================\n// RangeSlider */\n\n.irs {\n    position: relative; display: block;\n}\n    .irs-line {\n        position: relative; display: block;\n        overflow: hidden;\n    }\n        .irs-line-left, .irs-line-mid, .irs-line-right {\n            position: absolute; display: block;\n            top: 0;\n        }\n        .irs-line-left {\n            left: 0; width: 10%;\n        }\n        .irs-line-mid {\n            left: 10%; width: 80%;\n        }\n        .irs-line-right {\n            right: 0; width: 10%;\n        }\n\n    .irs-diapason {\n        position: absolute; display: block;\n        left: 0; width: 100%;\n    }\n    .irs-slider {\n        position: absolute; display: block;\n        cursor: default;\n        z-index: 1;\n    }\n        .irs-slider.single {\n            left: 10px;\n        }\n            .irs-slider.single:before {\n                position: absolute; display: block; content: \"\";\n                top: -30%; left: -30%;\n                width: 160%; height: 160%;\n                background: rgba(0,0,0,0.0);\n            }\n        .irs-slider.from {\n            left: 100px;\n        }\n            .irs-slider.from:before {\n                position: absolute; display: block; content: \"\";\n                top: -30%; left: -30%;\n                width: 130%; height: 160%;\n                background: rgba(0,0,0,0.0);\n            }\n        .irs-slider.to {\n            left: 300px;\n        }\n            .irs-slider.to:before {\n                position: absolute; display: block; content: \"\";\n                top: -30%; left: 0;\n                width: 130%; height: 160%;\n                background: rgba(0,0,0,0.0);\n            }\n        .irs-slider.last {\n            z-index: 2;\n        }\n\n    .irs-min {\n        position: absolute; display: block;\n        left: 0;\n        cursor: default;\n    }\n    .irs-max {\n        position: absolute; display: block;\n        right: 0;\n        cursor: default;\n    }\n\n    .irs-from, .irs-to, .irs-single {\n        position: absolute; display: block;\n        top: 0; left: 0;\n        cursor: default;\n        white-space: nowrap;\n    }\n\n\n.irs-grid {\n    position: absolute; display: none;\n    bottom: 0; left: 0;\n    width: 100%; height: 20px;\n}\n.irs-with-grid .irs-grid {\n    display: block;\n}\n    .irs-grid-pol {\n        position: absolute;\n        top: 0; left: 0;\n        width: 1px; height: 8px;\n        background: #000;\n    }\n    .irs-grid-pol.small {\n        height: 4px;\n    }\n    .irs-grid-text {\n        position: absolute;\n        bottom: 0; left: 0;\n        width: 100px;\n        white-space: nowrap;\n        text-align: center;\n        font-size: 9px; line-height: 9px;\n        color: #000;\n    }\n\n.irs-disable-mask {\n    position: absolute; display: block;\n    top: 0; left: 0;\n    width: 100%; height: 100%;\n    cursor: default;\n    background: rgba(0,0,0,0.0);\n    z-index: 2;\n}\n.irs-disabled {\n    opacity: 0.4;\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/ionRangeSlider/ion.rangeSlider.skinFlat.css",
    "content": "/* Ion.RangeSlider, Flat UI Skin\n// css version 1.8.5\n// by Denis Ineshin | ionden.com\n// ===================================================================================================================*/\n\n/* =====================================================================================================================\n// Skin details */\n\n.irs-line-mid,\n.irs-line-left,\n.irs-line-right,\n.irs-diapason,\n.irs-slider {\n    background: url(../images/sprite-skin-flat.png) repeat-x;\n}\n\n.irs {\n    height: 40px;\n}\n.irs-with-grid {\n    height: 60px;\n}\n.irs-line {\n    height: 12px; top: 25px;\n}\n    .irs-line-left {\n        height: 12px;\n        background-position: 0 -30px;\n    }\n    .irs-line-mid {\n        height: 12px;\n        background-position: 0 0;\n    }\n    .irs-line-right {\n        height: 12px;\n        background-position: 100% -30px;\n    }\n\n.irs-diapason {\n    height: 12px; top: 25px;\n    background-position: 0 -60px;\n}\n\n.irs-slider {\n    width: 16px; height: 18px;\n    top: 22px;\n    background-position: 0 -90px;\n}\n#irs-active-slider, .irs-slider:hover {\n    background-position: 0 -120px;\n}\n\n.irs-min, .irs-max {\n    color: #999;\n    font-size: 10px; line-height: 1.333;\n    text-shadow: none;\n    top: 0; padding: 1px 3px;\n    background: #e1e4e9;\n    border-radius: 4px;\n}\n\n.irs-from, .irs-to, .irs-single {\n    color: #fff;\n    font-size: 10px; line-height: 1.333;\n    text-shadow: none;\n    padding: 1px 5px;\n    background: #ed5565;\n    border-radius: 4px;\n}\n.irs-from:after, .irs-to:after, .irs-single:after {\n    position: absolute; display: block; content: \"\";\n    bottom: -6px; left: 50%;\n    width: 0; height: 0;\n    margin-left: -3px;\n    overflow: hidden;\n    border: 3px solid transparent;\n    border-top-color: #ed5565;\n}\n\n\n.irs-grid-pol {\n    background: #e1e4e9;\n}\n.irs-grid-text {\n    color: #999;\n}\n\n.irs-disabled {\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/jqgrid/ui.jqgridffe4.css",
    "content": "/*Grid*/\n.ui-jqgrid {\n\tposition: relative;\n\tborder: 1px solid #ddd;\n    overflow: hidden;\n}\n.ui-jqgrid .ui-jqgrid-view {\n\tposition: relative;\n\tleft:0;\n\ttop: 0;\n\tpadding: 0;\n}\n.ui-jqgrid .ui-common-table {}\n\n/* Caption*/\n.ui-jqgrid .ui-jqgrid-titlebar {\n\tfont-weight: normal;\n\tmin-height:37px;\n\tpadding: 4px 8px;\n\tposition: relative;\n\tmargin-right: 2px;\n\tborder-bottom: 1px solid #ddd; //default\n\n}\n.ui-jqgrid .ui-jqgrid-caption {\n\ttext-align: left;\n}\n.ui-jqgrid .ui-jqgrid-title {\n\tpadding-top: 5px;\n\tvertical-align: middle;\n}\n.ui-jqgrid .ui-jqgrid-titlebar-close {\n\tcolor: inherit;\n\tposition: absolute;\n\ttop: 50%;\n\tmargin: -10px 7px 0 0;\n\tpadding: 1px;\n\tcursor:pointer;\n}\n.ui-jqgrid .ui-jqgrid-titlebar-close span {\n\tdisplay: block;\n\tmargin: 1px;\n}\n.ui-jqgrid .ui-jqgrid-titlebar-close:hover {  }\n\n/* Header*/\n.ui-jqgrid .ui-jqgrid-hdiv {\n\tposition: relative;\n\tmargin: 0;\n\tpadding: 0;\n\toverflow: hidden;\n}\n.ui-jqgrid .ui-jqgrid-hbox {\n\tfloat: left;\n\tpadding-right: 20px;\n}\n.ui-jqgrid .ui-jqgrid-htable {\n\tmargin-bottom: 0;\n\ttable-layout: fixed;\n\tborder-top:none;\n}\n.ui-jqgrid .ui-jqgrid-htable thead th {\n\toverflow : hidden;\n\tborder-bottom : none;\n\tpadding-right: 2px;\n}\n.ui-jqgrid .ui-jqgrid-htable thead th div {\n\toverflow: hidden;\n\tposition:relative;\n}\n.ui-th-column, .ui-jqgrid .ui-jqgrid-htable th.ui-th-column {\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n.ui-th-column-header,\n.ui-jqgrid .ui-jqgrid-htable th.ui-th-column-header {\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n.ui-th-ltr, .ui-jqgrid .ui-jqgrid-htable th.ui-th-ltr {}\n.ui-th-rtl, .ui-jqgrid .ui-jqgrid-htable th.ui-th-rtl {text-align: center; }\n.ui-first-th-ltr { }\n.ui-first-th-rtl { }\n.ui-jqgrid tr.jqg-first-row-header th {\n\theight:auto;\n\tborder-top:none;\n\tpadding-bottom: 0;\n\tpadding-top: 0;\n\tborder-bottom: none;\n\tpadding-right: 2px;\n\ttext-align: center;\n}\n.ui-jqgrid tr.jqg-second-row-header th,\n.ui-jqgrid tr.jqg-third--row-header th\n{\n\tborder-top:none;\n\ttext-align: center;\n}\n\n.ui-jqgrid .ui-th-div-ie {\n\twhite-space: nowrap;\n\tzoom :1;\n\theight:17px;\n}\n.ui-jqgrid .ui-jqgrid-resize {\n\theight:20px !important;\n\tposition: relative;\n\tcursor :e-resize;\n\tdisplay: inline;\n\toverflow: hidden;\n}\n.ui-jqgrid .ui-grid-ico-sort {\n\tmargin-left:5px;\n\toverflow:hidden;\n\tposition:absolute;\n\tright: 3px;\n\tfont-size:12px;\n}\n.ui-jqgrid .ui-icon-asc {\n\tmargin-top:-3px;\n}\n.ui-jqgrid .ui-icon-desc {\n\tmargin-top:4px;\n}\n.ui-jqgrid .ui-i-asc {\n\tmargin-top:0;\n}\n.ui-jqgrid .ui-i-desc {\n\tmargin-top:0;\n\tmargin-right:13px;\n}\n.ui-jqgrid .ui-single-sort-asc {\n\tmargin-top:0;\n}\n.ui-jqgrid .ui-single-sort-desc {}\n.ui-jqgrid .ui-jqgrid-sortable {\n\tcursor:pointer;\n}\n.ui-jqgrid tr.ui-search-toolbar th { }\n.ui-jqgrid .ui-search-table td.ui-search-clear { }\n.ui-jqgrid tr.ui-search-toolbar td > input { }\n.ui-jqgrid tr.ui-search-toolbar select {}\n\n/* Body */\n.ui-jqgrid .table-bordered,\n.ui-jqgrid .table-bordered td,\n.ui-jqgrid .table-bordered th.ui-th-ltr\n{\n\tborder-left:0px none !important;\n}\n.ui-jqgrid .table-bordered th.ui-th-rtl\n{\n\tborder-right:0px none !important;\n}\n.ui-jqgrid .table-bordered tr.ui-row-rtl td\n{\n\tborder-right:0px none !important;\n\tborder-left: 1px solid #ddd !important;\n}\ndiv.tablediv > .table-bordered {\n\tborder-left : 1px solid #ddd !important;\n}\n.ui-jqgrid  .ui-jqgrid-bdiv table.table-bordered td {\n\tborder-top: 0px none;\n}\n.ui-jqgrid .ui-jqgrid-bdiv {\n\tposition: relative;\n\tmargin: 0;\n\tpadding:0;\n\toverflow-x:hidden;\n\ttext-align:left;\n}\n.ui-jqgrid .ui-jqgrid-btable {\n\ttable-layout: fixed;\n\tborder-left:none ;\n\tborder-top:none;\n\tmargin-bottom: 0px\n}\n.ui-jqgrid tr.jqgrow {\n\toutline-style: none;\n}\n.ui-jqgrid tr.jqgroup {\n\toutline-style: none;\n}\n.ui-jqgrid tr.jqgrow td {\n\toverflow: hidden;\n\twhite-space: pre;\n\tpadding-right: 2px;\n}\n.ui-jqgrid tr.jqgfirstrow  td {\n\theight:auto;\n\tborder-top:none;\n\tpadding-bottom: 0;\n\tpadding-top: 0;\n\tborder-bottom: none;\n\tpadding-right: 2px;\n}\n.ui-jqgrid tr.jqgroup td { }\n.ui-jqgrid tr.jqfoot td {}\n.ui-jqgrid tr.ui-row-ltr td {}\n.ui-jqgrid tr.ui-row-rtl td {}\n.ui-jqgrid td.jqgrid-rownum { }\n.ui-jqgrid .ui-jqgrid-resize-mark {\n\twidth:2px;\n\tleft:0;\n\tbackground-color:#777;\n\tcursor: e-resize;\n\tcursor: col-resize;\n\tposition:absolute;\n\ttop:0;\n\theight:100px;\n\toverflow:hidden;\n\tdisplay:none;\n\tborder:0 none;\n\tz-index: 99999;\n\n}\n/* Footer */\n.ui-jqgrid .ui-jqgrid-sdiv {\n\tposition: relative;\n\tmargin: 0;\n\tpadding: 0;\n\toverflow: hidden;\n\tborder-left: 0 none !important;\n\tborder-top : 0 none !important;\n\tborder-right : 0 none !important;\n}\n.ui-jqgrid .ui-jqgrid-ftable {\n\ttable-layout:fixed;\n\tmargin-bottom:0;\n}\n\n.ui-jqgrid tr.footrow td {\n\tfont-weight: bold;\n\toverflow: hidden;\n\twhite-space:nowrap;\n\tpadding-right: 2px;\n\tborder-bottom: 0px none;\n}\n.ui-jqgrid tr.footrow-ltr td {\n\ttext-align:left;\n}\n.ui-jqgrid tr.footrow-rtl td {\n\ttext-align:right;\n}\n\n/* Pager*/\n.ui-jqgrid .ui-jqgrid-pager,\n.ui-jqgrid .ui-jqgrid-toppager\n{\n\tborder-left-width: 0px;\n\tborder-top: 1px solid #ddd;\n\tpadding : 4px 0px;\n\tposition: relative;\n\theight: auto;\n\twhite-space: nowrap;\n\toverflow: hidden;\n}\n.ui-jqgrid .ui-jqgrid-toppager {\n\tborder-top-width :0;\n\tborder-bottom : 1px solid #ddd;\n}\n.ui-jqgrid .ui-jqgrid-toppager .ui-pager-control,\n.ui-jqgrid .ui-jqgrid-pager .ui-pager-control {\n\tposition: relative;\n\tborder-left: 0;\n\tborder-bottom: 0;\n\tborder-top: 0;\n\theight: 30px;\n}\n.ui-jqgrid .ui-pg-table {\n\tposition: relative;\n\tpadding: 1px 0;\n\twidth:auto;\n\tmargin: 0;\n}\n.ui-jqgrid .ui-pg-table td {\n\tfont-weight:normal;\n\tvertical-align:middle;\n\tpadding:0px 6px;\n}\n.ui-jqgrid .ui-pg-button  {\n\theight:auto;\n}\n.ui-jqgrid .ui-pg-button span {\n\tdisplay: block;\n\tmargin: 2px;\n\tfloat:left;\n}\n.ui-jqgrid .ui-pg-button:hover {  }\n.ui-jqgrid .ui-disabled:hover {}\n.ui-jqgrid .ui-pg-input,\n.ui-jqgrid .ui-jqgrid-toppager .ui-pg-input {\n\tdisplay: inline;\n\theight:auto;\n\twidth: auto;\n\tfont-size:.9em;\n\tmargin:0;\n\tline-height: inherit;\n\tpadding: 0px 5px\n}\n.ui-jqgrid .ui-pg-selbox,\n.ui-jqgrid .ui-jqgrid-toppager .ui-pg-selbox {\n\tfont-size:.9em;\n\tline-height:inherit;\n\tdisplay:block;\n\theight:22px;\n\tmargin: 0;\n\tpadding: 3px 0px 3px 3px;\n\tborder:none;\n}\n.ui-jqgrid .ui-separator {\n\theight: 18px;\n\tborder : none;\n\tborder-left: 2px solid #ccc ; //default\n}\n.ui-separator-li {\n\theight: 2px;\n\tborder : none;\n\tborder-top: 2px solid #ccc ;  //default\n\tmargin: 0; padding: 0; width:100%\n}\n.ui-jqgrid .ui-jqgrid-pager .ui-pg-div,\n.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div\n{\n\tfloat:left;\n\tposition:relative;\n}\n.ui-jqgrid .ui-jqgrid-pager .ui-pg-button,\n.ui-jqgrid .ui-jqgrid-toppager .ui-pg-button\n{\n\tcursor:pointer;\n}\n.ui-jqgrid .ui-jqgrid-pager .ui-pg-div  span,\n.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div  span\n{\n\tfloat:left;\n}\n.ui-jqgrid td input,\n.ui-jqgrid td select,\n.ui-jqgrid td textarea {\n\tmargin: 0;\n}\n.ui-jqgrid td textarea {\n\twidth:auto;\n\theight:auto;\n}\n.ui-jqgrid .ui-jqgrid-pager .ui-pager-table,\n.ui-jqgrid .ui-jqgrid-toppager .ui-pager-table\n{\n\twidth:100%;\n\ttable-layout:fixed;\n\theight:100%;\n}\n.ui-jqgrid .ui-jqgrid-pager .ui-paging-info,\n.ui-jqgrid .ui-jqgrid-toppager .ui-paging-info\n{\n\tfont-weight: normal;\n\theight:auto;\n\tmargin-top:3px;\n\tmargin-right:4px;\n\tdisplay: inline;\n}\n.ui-jqgrid .ui-jqgrid-pager .ui-paging-pager,\n.ui-jqgrid .ui-jqgrid-toppager .ui-paging-pager\n{\n\ttable-layout:auto;\n\theight:100%;\n}\n.ui-jqgrid .ui-jqgrid-pager .navtable,\n.ui-jqgrid .ui-jqgrid-toppager .navtable\n{\n\tfloat:left;\n\ttable-layout:auto;\n\theight:100%;\n}\n\n/*Subgrid*/\n\n.ui-jqgrid .ui-jqgrid-btable .ui-sgcollapsed span {\n\tdisplay: block;\n}\n.ui-jqgrid .ui-subgrid {\n\tmargin:0;\n\tpadding:0;\n\twidth:100%;\n}\n.ui-jqgrid .ui-subgrid table {\n\ttable-layout: fixed;\n}\n.ui-jqgrid .ui-subgrid tr.ui-subtblcell td {}\n.ui-jqgrid .ui-subgrid td.subgrid-data {\n\tborder-top:  0 none !important;\n}\n.ui-jqgrid .ui-subgrid td.subgrid-cell {\n\tvertical-align: middle\n}\n.ui-jqgrid a.ui-sghref {\n\ttext-decoration: none;\n\tcolor : #010101; //default\n}\n.ui-jqgrid .ui-th-subgrid {height:20px;}\n.tablediv > .row { margin: 0 0}\n/* loading */\n.ui-jqgrid .loading {\n\tposition: absolute;\n\ttop: 45%;\n\tleft: 45%;\n\twidth: auto;\n\tz-index:101;\n\tpadding: 6px;\n\tmargin: 5px;\n\ttext-align: center;\n\tdisplay: none;\n\tborder: 1px solid #ddd;  //default\n\tfont-size: 14px;\n\tbackground-color: #d9edf7;\n}\n.ui-jqgrid .jqgrid-overlay {\n\tdisplay:none;\n\tz-index:100;\n}\n/* IE * html .jqgrid-overlay {width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');} */\n* .jqgrid-overlay iframe {\n\tposition:absolute;\n\ttop:0;\n\tleft:0;\n\tz-index:-1;\n}\n/* IE width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}*/\n/* end loading div */\n\n/* Toolbar */\n.ui-jqgrid .ui-userdata {\n\tpadding: 4px 0px;\n\toverflow: hidden;\n\tmin-height: 32px;\n}\n.ui-jqgrid .ui-userdata-top {\n\tborder-left-width: 0px;    //default\n\tborder-bottom: 1px solid #ddd;\n}\n.ui-jqgrid .ui-userdata-bottom {\n\tborder-left-width: 0px;    //default\n\tborder-top: 1px solid #ddd;\n}\n/*Modal Window */\n.ui-jqdialog { }\n.ui-jqdialog {\n\tdisplay: none;\n\twidth: 500px;\n\tposition: absolute;\n\t//padding: 5px;\n\toverflow:visible;\n}\n.ui-jqdialog .ui-jqdialog-titlebar {\n\tpadding: .1em .1em;\n\tmin-height: 35px;\n}\n.ui-jqdialog .ui-jqdialog-title {\n\tmargin: .3em 0 .2em;\n\tfont-weight: bold;\n\tpadding-left :6px;\n\tpadding-right:6px;\n}\n.ui-jqdialog .ui-jqdialog-titlebar-close {\n\tposition: absolute;\n\ttop: 0%;\n\tmargin: 3px 5px 0 0;\n\tpadding: 8px;\n\tcursor:pointer;\n}\n\n.ui-jqdialog .ui-jqdialog-titlebar-close span {  }\n.ui-jqdialog .ui-jqdialog-titlebar-close:hover,\n.ui-jqdialog .ui-jqdialog-titlebar-close:focus {\n\tpadding: 8px;\n}\n.ui-jqdialog-content, .ui-jqdialog .ui-jqdialog-content {\n\tborder: 0;\n\tpadding: .3em .2em;\n\tbackground: none;\n\theight:auto;\n}\n.ui-jqdialog .ui-jqconfirm {\n\tpadding: .4em 1em;\n\tborder-width:3px;\n\tposition:absolute;\n\tbottom:10px;\n\tright:10px;\n\toverflow:visible;\n\tdisplay:none;\n\theight:120px;\n\twidth:220px;\n\ttext-align:center;\n\tbackground-color: #fff;\n\tborder-radius: 4px;\n\t-webkit-border-radius: 4px;\n\t-moz-border-radius: 4px;\n}\n.ui-jqdialog>.ui-resizable-se { }\n.ui-jqgrid>.ui-resizable-se { }\n/* end Modal window*/\n/* Form edit */\n.ui-jqdialog-content .FormGrid {\n\tmargin: 0 8px 0 8px;\n\toverflow:auto;\n\tposition:relative;\n}\n.ui-jqdialog-content .EditTable {\n\twidth: 100%;\n\tmargin-bottom:0;\n}\n.ui-jqdialog-content .DelTable {\n\twidth: 100%;\n\tmargin-bottom:0;\n}\n.EditTable td input,\n.EditTable td select,\n.EditTable td textarea {\n\twidth: 98%;\n\tdisplay: inline-block;\n}\n.EditTable td textarea {\n\twidth:auto;\n\theight:auto;\n}\n.EditTable .FormData td {\n\theight:37px !important;\n}\n.ui-jqdialog-content td.EditButton {\n\ttext-align: right;\n\tpadding: 5px 5px 5px 0;\n}\n.ui-jqdialog-content td.navButton {\n\ttext-align: center;\n\tborder-left: 0 none;\n\tborder-top: 0 none;\n\tborder-right: 0 none;\n\tpadding-bottom:5px;\n\tpadding-top:5px;\n}\n.ui-jqdialog-content input.FormElement {\n\tpadding: .5em .3em;\n\tmargin-bottom: 5px\n}\n.ui-jqdialog-content select.FormElement {\n\tpadding:.3em;\n\tmargin-bottom: 3px;\n}\n.ui-jqdialog-content .data-line {\n\tpadding-top:.1em;\n\tborder: 0 none;\n}\n\n.ui-jqdialog-content .CaptionTD {\n\tvertical-align: middle;\n\tborder: 0 none;\n\tpadding: 2px;\n\twhite-space: nowrap;\n}\n.ui-jqdialog-content .DataTD {\n\tpadding: 2px;\n\tborder: 0 none;\n\tvertical-align: top;\n}\n.ui-jqdialog-content .form-view-data {\n\twhite-space:pre\n}\n.fm-button {  }\n.fm-button-icon-left {\n\tmargin-left: 4px;\n\tmargin-right: 4px;\n}\n.fm-button-icon-right {\n\tmargin-left: 4px;\n\tmargin-right: 4px;\n}\n.fm-button-icon-left  {  }\n.fm-button-icon-right  { }\n#nData, #pData {\n\tmargin-left: 4px;\n\tmargin-right: 4px;\n}\n#sData span, #cData span {\n\tmargin-left: 5px;\n}\n/* End Eorm edit */\n/*.ui-jqgrid .edit-cell {}*/\n.ui-jqgrid .selected-row,\ndiv.ui-jqgrid .selected-row td {\n\tfont-style : normal;\n}\n/* inline edit actions button*/\n.ui-inline-del, .ui-inline-cancel {\n    margin-left: 14px;\n}\n.ui-jqgrid .inline-edit-cell {}\n/* Tree Grid */\n.ui-jqgrid .tree-wrap {\n\tfloat: left;\n\tposition: relative;\n\theight: 18px;\n\twhite-space: nowrap;\n\toverflow: hidden;\n}\n.ui-jqgrid .tree-minus {\n\tposition: absolute;\n\theight: 18px;\n\twidth: 18px;\n\toverflow: hidden;\n}\n.ui-jqgrid .tree-plus {\n\tposition: absolute;\n\theight: 18px;\n\twidth: 18px;\n\toverflow: hidden;\n}\n.ui-jqgrid .tree-leaf {\n\tposition: absolute;\n\theight: 18px;\n\twidth: 18px;\n\toverflow: hidden;\n}\n.ui-jqgrid .treeclick {\n\tcursor: pointer;\n}\n/* moda dialog */\n* iframe.jqm {\n\tposition:absolute;\n\ttop:0;\n\tleft:0;\n\tz-index:-1;\n}\n/*\t width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}*/\n.ui-jqgrid-dnd tr td {\n\tborder-right-width: 1px;\n\tborder-right-color: inherit;\n\tborder-right-style: solid;\n\theight:20px\n}\n/* RTL Support */\n.ui-jqgrid .ui-jqgrid-caption-rtl {\n\ttext-align: right;\n}\n.ui-jqgrid .ui-jqgrid-hbox-rtl {\n\tfloat: right;\n\tpadding-left: 20px;\n}\n.ui-jqgrid .ui-jqgrid-resize-ltr {\n\tfloat: right;\n\tmargin: -2px -2px -2px 0;\n\theight:100%;\n}\n.ui-jqgrid .ui-jqgrid-resize-rtl {\n\tfloat: left;\n\tmargin: -2px -2px -2px -0px;\n}\n.ui-jqgrid .ui-sort-rtl {\n\n}\n.ui-jqgrid .tree-wrap-ltr {\n\tfloat: left;\n}\n.ui-jqgrid .tree-wrap-rtl {\n\tfloat: right;\n}\n.ui-jqgrid .ui-ellipsis {\n\t-moz-text-overflow:ellipsis;\n\ttext-overflow:ellipsis;\n}\n/* Toolbar Search Menu. Nav menu */\n.ui-search-menu,\n.ui-nav-menu {\n\tposition: absolute;\n\tpadding: 2px 5px;\n\tz-index:99999;\n}\n.ui-search-menu.ui-menu .ui-menu-item,\n.ui-nav-menu.ui-menu .ui-menu-item\n{\n\tlist-style-image: none;\n\tpadding-right: 0;\n\tpadding-left: 0;\n}\n.ui-search-menu.ui-menu .ui-menu-item a,\n.ui-nav-menu.ui-menu .ui-menu-item a\n{\n\tdisplay: block;\n}\n.ui-search-menu.ui-menu .ui-menu-item a.g-menu-item:hover,\n.ui-nav-menu.ui-menu .ui-menu-item a.g-menu-item:hover\n{\n\tmargin: -1px;\n\tfont-weight: normal;\n}\n.ui-jqgrid .ui-search-table {\n\tpadding: 0;\n\tborder: 0 none;\n\theight:20px;\n\twidth:100%;\n}\n.ui-jqgrid .ui-search-table .ui-search-oper {\n\twidth:20px;\n}\na.g-menu-item, a.soptclass, a.clearsearchclass {\n\tcursor: pointer;\n}\n.ui-jqgrid .ui-jqgrid-view input,\n.ui-jqgrid .ui-jqgrid-view select,\n.ui-jqgrid .ui-jqgrid-view textarea,\n.ui-jqgrid .ui-jqgrid-view button {\n    //font-size: 11px\n}\n.ui-jqgrid .ui-scroll-popup {\n\twidth: 100px;\n}\n.ui-search-table select,\n.ui-search-table input\n{\n\tpadding: 4px 3px;\n}\n\n.ui-disabled {\n\topacity: .35;\n\tfilter:Alpha(Opacity=35); /* support: IE8 */\n\tbackground-image: none;\n}\n.ui-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\tbackground-color: rgba(0,0,0,0.5);\n\topacity: .3;\n\tfilter: Alpha(Opacity=30); /* support: IE8 */\n}\n\n.ui-jqgrid-pager .ui-pg-table .ui-pg-button:hover,\n.ui-jqgrid-toppager .ui-pg-table .ui-pg-button:hover\n{\n\tbackground-color: #ddd;\n}\n.ui-jqgrid-corner  {\n\t border-radius: 5px\n}\n.ui-resizable-handle {\n\t//position: absolute;\n\tdisplay: block;\n\tleft :97%;\n}\n.ui-jqdialog .ui-resizable-se {\n\twidth: 12px;\n\theight: 12px;\n\tright: -5px;\n\tbottom: -5px;\n\tbackground-position: 16px 16px;\n}\n.ui-resizable-se {\n\tcursor: se-resize;\n\twidth: 12px;\n\theight: 12px;\n\tright: 1px;\n\tbottom: 1px;\n}\n.ui-top-corner {\n\tborder-top-left-radius: 5px;\n\tborder-top-right-radius: 5px;\n}\n.ui-bottom-corner {\n\tborder-bottom-left-radius: 5px;\n\tborder-bottom-right-radius: 5px;\n}\n\n.ui-search-table {\n\tmargin-bottom: 0;\n}\n.ui-search-table .columns, .ui-search-table .operators {\n\tpadding-right: 5px;\n}\n.opsel {\n\tfloat :left;\n\twidth : 100px;\n\tmargin-right : 5px;\n}\n.add-group, .add-rule, .delete-group {\n\twidth: 14%;\n\tmargin-right : 5px;\n}\n.delete-rule {\n\twidth : 15px;\n}\nul.ui-search-menu, ul.ui-nav-menu {\n\t list-style-type:  none;\n}\nul.ui-search-menu li a,\nul.ui-nav-menu li a,\n.soptclass,\n.clearsearchclass {\n\ttext-decoration: none;\n\tcolor : #010101;\n}\nul.ui-search-menu li a:hover, ul.ui-nav-menu li a:hover, a.soptclass:hover, a.clearsearchclass:hover {\n\tbackground-color: #ddd;\n\tpadding: 1px 1px;\n\ttext-decoration: none;\n}\nul.ui-search-menu li, ul.ui-nav-menu li {\n\tpadding : 5px 5px;\n}\n.ui-menu-item hr {\n\tmargin-bottom: 0px;\n\tmargin-top:0px;\n}\n\n.searchFilter .ui-search-table td,\n.searchFilter .ui-search-table th\n{\n\tborder-top: 0px none !important;\n}\n\n.searchFilter .queryresult {\n\tmargin-bottom: 5px;\n}\n.searchFilter .queryresult tr td{\n\tborder-top: 0px none;\n}\n.ui-search-label {\n\tpadding-left: 5px;\n}\n\n.frozen-div, .frozen-bdiv {\n\tbackground-color: #fff;\n}\n/*\n.ui-jqgrid .ui-jqgrid-caption,\n.ui-jqgrid .ui-jqgrid-pager,\n.ui-jqgrid .ui-jqgrid-toppager,\n.ui-jqgrid .ui-jqgrid-htable thead th,\n.ui-jqgrid .ui-userdata-top,\n.ui-jqgrid .ui-userdata-bottom,\n.ui-jqgrid .ui-jqgrid-hdiv,\n.ui-jqdialog .ui-jqdialog-titlebar\n{\n    background-image: none, linear-gradient(to bottom, #fff 0px, #e0e0e0 100%);\n    background-repeat: repeat-x;\n    border-color: #ccc;\n    text-shadow: 0 1px 0 #fff;\n}\n*/\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/nouslider/jquery.nouislider.css",
    "content": "\n/* Functional styling;\n * These styles are required for noUiSlider to function.\n * You don't need to change these rules to apply your design.\n */\n.noUi-target,\n.noUi-target * {\n-webkit-touch-callout: none;\n-webkit-user-select: none;\n-ms-touch-action: none;\n-ms-user-select: none;\n-moz-user-select: none;\n-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n.noUi-base {\n\twidth: 100%;\n\theight: 100%;\n\tposition: relative;\n}\n.noUi-origin {\n\tposition: absolute;\n\tright: 0;\n\ttop: 0;\n\tleft: 0;\n\tbottom: 0;\n}\n.noUi-handle {\n\tposition: relative;\n\tz-index: 1;\n}\n.noUi-stacking .noUi-handle {\n/* This class is applied to the lower origin when\n   its values is > 50%. */\n\tz-index: 10;\n}\n.noUi-stacking + .noUi-origin {\n/* Fix stacking order in IE7, which incorrectly\n   creates a new context for the origins. */\n\t*z-index: -1;\n}\n.noUi-state-tap .noUi-origin {\n-webkit-transition: left 0.3s, top 0.3s;\n\ttransition: left 0.3s, top 0.3s;\n}\n.noUi-state-drag * {\n\tcursor: inherit !important;\n}\n\n/* Slider size and handle placement;\n */\n.noUi-horizontal {\n\theight: 18px;\n}\n.noUi-horizontal .noUi-handle {\n\twidth: 34px;\n\theight: 28px;\n\tleft: -17px;\n\ttop: -6px;\n}\n.noUi-horizontal.noUi-extended {\n\tpadding: 0 15px;\n}\n.noUi-horizontal.noUi-extended .noUi-origin  {\n\tright: -15px;\n}\n.noUi-vertical {\n\twidth: 18px;\n}\n.noUi-vertical .noUi-handle {\n\twidth: 28px;\n\theight: 34px;\n\tleft: -6px;\n\ttop: -17px;\n}\n.noUi-vertical.noUi-extended {\n\tpadding: 15px 0;\n}\n.noUi-vertical.noUi-extended .noUi-origin  {\n\tbottom: -15px;\n}\n\n/* Styling;\n */\n.noUi-background {\n\tbackground: #FAFAFA;\n\tbox-shadow: inset 0 1px 1px #f0f0f0;\n}\n.noUi-connect {\n\tbackground: #3FB8AF;\n\tbox-shadow: inset 0 0 3px rgba(51,51,51,0.45);\n-webkit-transition: background 450ms;\n\ttransition: background 450ms;\n}\n.noUi-origin {\n\tborder-radius: 2px;\n}\n.noUi-target {\n\tborder-radius: 4px;\n\tborder: 1px solid #D3D3D3;\n\tbox-shadow: inset 0 1px 1px #F0F0F0, 0 3px 6px -5px #BBB;\n}\n.noUi-target.noUi-connect {\n\tbox-shadow: inset 0 0 3px rgba(51,51,51,0.45), 0 3px 6px -5px #BBB;\n}\n\n/* Handles and cursors;\n */\n.noUi-dragable {\n\tcursor: w-resize;\n}\n.noUi-vertical .noUi-dragable {\n\tcursor: n-resize;\n}\n.noUi-handle {\n\tborder: 1px solid #D9D9D9;\n\tborder-radius: 3px;\n\tbackground: #FFF;\n\tcursor: default;\n\tbox-shadow: inset 0 0 1px #FFF,\n\t\t\t\tinset 0 1px 7px #EBEBEB,\n\t\t\t\t0 3px 6px -3px #BBB;\n}\n.noUi-active {\n\tbox-shadow: inset 0 0 1px #FFF,\n\t\t\t\tinset 0 1px 7px #DDD,\n\t\t\t\t0 3px 6px -3px #BBB;\n}\n\n/* Handle stripes;\n */\n.noUi-handle:before,\n.noUi-handle:after {\n\tcontent: \"\";\n\tdisplay: block;\n\tposition: absolute;\n\theight: 14px;\n\twidth: 1px;\n\tbackground: #E8E7E6;\n\tleft: 14px;\n\ttop: 6px;\n}\n.noUi-handle:after {\n\tleft: 17px;\n}\n.noUi-vertical .noUi-handle:before,\n.noUi-vertical .noUi-handle:after {\n\twidth: 14px;\n\theight: 1px;\n\tleft: 6px;\n\ttop: 14px;\n}\n.noUi-vertical .noUi-handle:after {\n\ttop: 17px;\n}\n\n/* Disabled state;\n */\n[disabled].noUi-connect,\n[disabled] .noUi-connect {\n\tbackground: #B8B8B8;\n}\n[disabled] .noUi-handle {\n\tcursor: not-allowed;\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/plyr/plyr.css",
    "content": "@-webkit-keyframes progress{to{background-position:40px 0}}@keyframes progress{to{background-position:40px 0}}.sr-only{position:absolute!important;clip:rect(1px,1px,1px,1px);padding:0!important;border:0!important;height:1px!important;width:1px!important;overflow:hidden}.player{position:relative;max-width:100%;min-width:290px}.player,.player *,.player ::after,.player ::before{box-sizing:border-box}.player-video-wrapper{position:relative}.player audio,.player video{width:100%;height:auto;vertical-align:middle}.player-video-embed{padding-bottom:56.25%;height:0}.player-video-embed iframe{position:absolute;top:0;left:0;width:100%;height:100%;border:0}.player-captions{display:none;position:absolute;bottom:0;left:0;width:100%;padding:20px 20px 30px;color:#fff;font-size:20px;text-align:center;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}.player-captions span{border-radius:2px;padding:3px 10px;background:rgba(0,0,0,.9)}.player-captions span:empty{display:none}@media (min-width:768px){.player-captions{font-size:24px}}.player.captions-active .player-captions{display:block}.player.fullscreen-active .player-captions{font-size:32px}.player-controls{zoom:1;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;position:relative;padding:10px;background:#fff;line-height:1;text-align:center;box-shadow:0 1px 1px rgba(52,63,74,.2)}.player-controls:after,.player-controls:before{content:\"\";display:table}.player-controls:after{clear:both}.player-controls-right{display:block;margin:10px auto 0}@media (min-width:560px){.player-controls-left{float:left}.player-controls-right{float:right;margin-top:0}}.player-controls button{display:inline-block;vertical-align:middle;margin:0 2px;padding:5px 10px;overflow:hidden;border:0;background:0 0;border-radius:3px;cursor:pointer;color:#6b7d86;transition:background .3s ease,color .3s ease,opacity .3s ease}.player-controls button svg{width:18px;height:18px;display:block;fill:currentColor;transition:fill .3s ease}.player-controls button.tab-focus,.player-controls button:hover{background:#3498db;color:#fff}.player-controls button:focus{outline:0}.player-controls .icon-captions-on,.player-controls .icon-exit-fullscreen,.player-controls .icon-muted{display:none}.player-controls .player-time{display:inline-block;vertical-align:middle;margin-left:10px;color:#6b7d86;font-weight:600;font-size:14px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}.player-controls .player-time+.player-time{display:none}@media (min-width:560px){.player-controls .player-time+.player-time{display:inline-block}}.player-controls .player-time+.player-time::before{content:'\\2044';margin-right:10px}.player-tooltip{position:absolute;z-index:2;bottom:100%;margin-bottom:10px;padding:10px 15px;opacity:0;background:#fff;border:1px solid #d6dadd;border-radius:3px;color:#6b7d86;font-size:14px;line-height:1.5;font-weight:600;-webkit-transform:translate(-50%,30px) scale(0);transform:translate(-50%,30px) scale(0);-webkit-transform-origin:50% 100%;transform-origin:50% 100%;transition:-webkit-transform .2s .1s ease,opacity .2s .1s ease;transition:transform .2s .1s ease,opacity .2s .1s ease}.player-tooltip::after{content:'';position:absolute;z-index:1;top:100%;left:50%;display:block;width:10px;height:10px;background:#fff;-webkit-transform:translate(-50%,-50%) rotate(45deg) translateY(1px);transform:translate(-50%,-50%) rotate(45deg) translateY(1px);border:1px solid #d6dadd;border-width:0 1px 1px 0}.player button.tab-focus:focus .player-tooltip,.player button:hover .player-tooltip{opacity:1;-webkit-transform:translate(-50%,0) scale(1);transform:translate(-50%,0) scale(1)}.player button:hover .player-tooltip{z-index:3}.player-progress{position:absolute;bottom:100%;left:0;right:0;width:100%;height:10px;background:rgba(86,93,100,.2)}.player-progress-buffer[value],.player-progress-played[value],.player-progress-seek[type=range]{position:absolute;left:0;top:0;width:100%;height:10px;margin:0;padding:0;vertical-align:top;-webkit-appearance:none;-moz-appearance:none;border:none;background:0 0}.player-progress-buffer[value]::-webkit-progress-bar,.player-progress-played[value]::-webkit-progress-bar{background:0 0}.player-progress-buffer[value]::-webkit-progress-value,.player-progress-played[value]::-webkit-progress-value{background:currentColor}.player-progress-buffer[value]::-moz-progress-bar,.player-progress-played[value]::-moz-progress-bar{background:currentColor}.player-progress-played[value]{z-index:2;color:#3498db}.player-progress-buffer[value]{color:rgba(86,93,100,.25)}.player-progress-seek[type=range]{z-index:4;cursor:pointer;outline:0}.player-progress-seek[type=range]::-webkit-slider-runnable-track{background:0 0;border:0}.player-progress-seek[type=range]::-webkit-slider-thumb{-webkit-appearance:none;background:0 0;border:0;width:20px;height:10px}.player-progress-seek[type=range]::-moz-range-track{background:0 0;border:0}.player-progress-seek[type=range]::-moz-range-thumb{-moz-appearance:none;background:0 0;border:0;width:20px;height:10px}.player-progress-seek[type=range]::-ms-track{color:transparent;background:0 0;border:0}.player-progress-seek[type=range]::-ms-fill-lower,.player-progress-seek[type=range]::-ms-fill-upper{background:0 0;border:0}.player-progress-seek[type=range]::-ms-thumb{background:0 0;border:0;width:20px;height:10px}.player-progress-seek[type=range]:focus{outline:0}.player-progress-seek[type=range]::-moz-focus-outer{border:0}.player.loading .player-progress-buffer{-webkit-animation:progress 1s linear infinite;animation:progress 1s linear infinite;background-size:40px 40px;background-repeat:repeat-x;background-color:rgba(86,93,100,.25);background-image:linear-gradient(-45deg,rgba(0,0,0,.15) 25%,transparent 25%,transparent 50%,rgba(0,0,0,.15) 50%,rgba(0,0,0,.15) 75%,transparent 75%,transparent);color:transparent}.player-controls [data-player=pause],.player.playing .player-controls [data-player=play]{display:none}.player.playing .player-controls [data-player=pause]{display:inline-block}.player-volume[type=range]{display:inline-block;vertical-align:middle;-webkit-appearance:none;-moz-appearance:none;width:100px;margin:0 10px 0 0;padding:0;cursor:pointer;background:0 0;border:none}.player-volume[type=range]::-webkit-slider-runnable-track{height:6px;background:#e6e6e6;border:0;border-radius:3px}.player-volume[type=range]::-webkit-slider-thumb{-webkit-appearance:none;margin-top:-3px;height:12px;width:12px;background:#6b7d86;border:0;border-radius:6px;transition:background .3s ease;cursor:ew-resize}.player-volume[type=range]::-moz-range-track{height:6px;background:#e6e6e6;border:0;border-radius:3px}.player-volume[type=range]::-moz-range-thumb{height:12px;width:12px;background:#6b7d86;border:0;border-radius:6px;transition:background .3s ease;cursor:ew-resize}.player-volume[type=range]::-ms-track{height:6px;background:0 0;border-color:transparent;border-width:3px 0;color:transparent}.player-volume[type=range]::-ms-fill-lower,.player-volume[type=range]::-ms-fill-upper{height:6px;background:#e6e6e6;border:0;border-radius:3px}.player-volume[type=range]::-ms-thumb{height:12px;width:12px;background:#6b7d86;border:0;border-radius:6px;transition:background .3s ease;cursor:ew-resize}.player-volume[type=range]:focus{outline:0}.player-volume[type=range]:focus::-webkit-slider-thumb{background:#3498db}.player-volume[type=range]:focus::-moz-range-thumb{background:#3498db}.player-volume[type=range]:focus::-ms-thumb{background:#3498db}.player-audio.ios .player-controls-right,.player.ios .player-volume,.player.ios [data-player=mute]{display:none}.player-audio.ios .player-controls-left{float:none}.player-audio .player-controls{padding-top:20px}.player-audio .player-progress{bottom:auto;top:0;background:#d6dadd}.player-fullscreen,.player.fullscreen-active{position:fixed;top:0;left:0;right:0;bottom:0;height:100%;width:100%;z-index:10000000;background:#000}.player-fullscreen video,.player.fullscreen-active video{height:100%}.player-fullscreen .player-video-wrapper,.player.fullscreen-active .player-video-wrapper{height:100%;width:100%}.player-fullscreen .player-controls,.player.fullscreen-active .player-controls{position:absolute;bottom:0;left:0;right:0}.player-fullscreen.fullscreen-hide-controls.playing .player-controls,.player.fullscreen-active.fullscreen-hide-controls.playing .player-controls{-webkit-transform:translateY(100%) translateY(5px);transform:translateY(100%) translateY(5px);transition:-webkit-transform .3s .2s ease;transition:transform .3s .2s ease}.player-fullscreen.fullscreen-hide-controls.playing.player-hover .player-controls,.player.fullscreen-active.fullscreen-hide-controls.playing.player-hover .player-controls{-webkit-transform:translateY(0);transform:translateY(0)}.player-fullscreen.fullscreen-hide-controls.playing .player-captions,.player.fullscreen-active.fullscreen-hide-controls.playing .player-captions{bottom:5px;transition:bottom .3s .2s ease}.player-fullscreen .player-captions,.player-fullscreen.fullscreen-hide-controls.playing.player-hover .player-captions,.player.fullscreen-active .player-captions,.player.fullscreen-active.fullscreen-hide-controls.playing.player-hover .player-captions{top:auto;bottom:90px}@media (min-width:560px){.player-fullscreen .player-captions,.player-fullscreen.fullscreen-hide-controls.playing.player-hover .player-captions,.player.fullscreen-active .player-captions,.player.fullscreen-active.fullscreen-hide-controls.playing.player-hover .player-captions{bottom:60px}}.player.captions-active .player-controls .icon-captions-on,.player.fullscreen-active .icon-exit-fullscreen,.player.muted .player-controls .icon-muted{display:block}.player [data-player=captions],.player [data-player=fullscreen],.player.captions-active .player-controls .icon-captions-on+svg,.player.fullscreen-active .icon-exit-fullscreen+svg,.player.muted .player-controls .icon-muted+svg{display:none}.player.captions-enabled [data-player=captions],.player.fullscreen-enabled [data-player=fullscreen]{display:inline-block}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/simditor/simditor.css",
    "content": ".simditor {\n  position: relative;\n  border: 1px solid #c9d8db;\n}\n.simditor .simditor-wrapper {\n  position: relative;\n  background: #ffffff;\n  overflow: hidden;\n}\n.simditor .simditor-wrapper .simditor-placeholder {\n  display: none;\n  position: absolute;\n  left: 0;\n  z-index: 0;\n  padding: 22px 15px;\n  font-size: 16px;\n  font-family: arial, sans-serif;\n  line-height: 1.5;\n  color: #999999;\n  background: transparent;\n}\n.simditor .simditor-wrapper.toolbar-floating .simditor-toolbar {\n  position: fixed;\n  top: 0;\n  z-index: 10;\n  box-shadow: 0 0 6px rgba(0, 0, 0, 0.1);\n}\n.simditor .simditor-wrapper .simditor-image-loading {\n  width: 100%;\n  height: 100%;\n  background: rgba(0, 0, 0, 0.4);\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 2;\n}\n.simditor .simditor-wrapper .simditor-image-loading span {\n  width: 30px;\n  height: 30px;\n  background: #ffffff url(../../../img/loading-upload.gif) no-repeat center center;\n  border-radius: 30px;\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  margin: -15px 0 0 -15px;\n  box-shadow: 0 0 8px rgba(0, 0, 0, 0.4);\n}\n.simditor .simditor-wrapper .simditor-image-loading.uploading span {\n  background: #ffffff;\n  color: #333333;\n  font-size: 14px;\n  line-height: 30px;\n  text-align: center;\n}\n.simditor .simditor-body {\n  padding: 22px 15px 40px;\n  min-height: 300px;\n  outline: none;\n  cursor: text;\n  position: relative;\n  z-index: 1;\n  background: transparent;\n}\n.simditor .simditor-body a.selected {\n  background: #b3d4fd;\n}\n.simditor .simditor-body a.simditor-mention {\n  cursor: pointer;\n}\n.simditor .simditor-body .simditor-table {\n  position: relative;\n}\n.simditor .simditor-body .simditor-table.resizing {\n  cursor: col-resize;\n}\n.simditor .simditor-body .simditor-table .simditor-resize-handle {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 10px;\n  height: 100%;\n  cursor: col-resize;\n}\n.simditor .simditor-body pre {\n  /*min-height: 28px;*/\n  box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  word-wrap: break-word !important;\n  white-space: pre-wrap !important;\n}\n.simditor .simditor-body img {\n  cursor: pointer;\n}\n.simditor .simditor-body img.selected {\n  box-shadow: 0 0 0 4px #cccccc;\n}\n.simditor .simditor-paste-area,\n.simditor .simditor-clean-paste-area {\n  background: transparent;\n  border: none;\n  outline: none;\n  resize: none;\n  padding: 0;\n  margin: 0;\n}\n.simditor .simditor-toolbar {\n  border-bottom: 1px solid #eeeeee;\n  background: #ffffff;\n  width: 100%;\n}\n.simditor .simditor-toolbar > ul {\n  margin: 0;\n  padding: 0 0 0 6px;\n  list-style: none;\n}\n.simditor .simditor-toolbar > ul:after {\n  content: \"\";\n  display: table;\n  clear: both;\n}\n.simditor .simditor-toolbar > ul > li {\n  position: relative;\n  float: left;\n}\n.simditor .simditor-toolbar > ul > li > span.separator {\n  display: block;\n  float: left;\n  background: #cfcfcf;\n  width: 1px;\n  height: 18px;\n  margin: 11px 15px;\n}\n.simditor .simditor-toolbar > ul > li > .toolbar-item {\n  display: block;\n  float: left;\n  width: 50px;\n  height: 40px;\n  outline: none;\n  color: #333333;\n  font-size: 15px;\n  line-height: 40px;\n  text-align: center;\n  text-decoration: none;\n}\n.simditor .simditor-toolbar > ul > li > .toolbar-item span {\n  opacity: 0.6;\n}\n.simditor .simditor-toolbar > ul > li > .toolbar-item span.fa {\n  display: inline;\n  line-height: normal;\n}\n.simditor .simditor-toolbar > ul > li > .toolbar-item:hover span {\n  opacity: 1;\n}\n.simditor .simditor-toolbar > ul > li > .toolbar-item.active {\n  background: #eeeeee;\n}\n.simditor .simditor-toolbar > ul > li > .toolbar-item.active span {\n  opacity: 1;\n}\n.simditor .simditor-toolbar > ul > li > .toolbar-item.disabled {\n  cursor: default;\n}\n.simditor .simditor-toolbar > ul > li > .toolbar-item.disabled span {\n  opacity: 0.3;\n}\n.simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-title span:before {\n  content: \"T\";\n  font-size: 19px;\n  font-weight: bold;\n  font-family: 'Times New Roman';\n}\n.simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-title.active-h1 span:before {\n  content: 'H1';\n  font-size: 18px;\n}\n.simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-title.active-h2 span:before {\n  content: 'H2';\n  font-size: 18px;\n}\n.simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-title.active-h3 span:before {\n  content: 'H3';\n  font-size: 18px;\n}\n.simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-color {\n  font-size: 14px;\n  position: relative;\n}\n.simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-color span:before {\n  position: relative;\n  top: -2px;\n}\n.simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-color:after {\n  content: '';\n  display: block;\n  width: 14px;\n  height: 4px;\n  background: #cccccc;\n  position: absolute;\n  top: 26px;\n  left: 50%;\n  margin: 0 0 0 -7px;\n}\n.simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-color:hover:after {\n  background: #999999;\n}\n.simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-color.disabled:after {\n  background: #dfdfdf;\n}\n.simditor .simditor-toolbar > ul > li.menu-on .toolbar-item {\n  position: relative;\n  z-index: 21;\n  background: #ffffff;\n  box-shadow: 0 -3px 3px rgba(0, 0, 0, 0.2);\n}\n.simditor .simditor-toolbar > ul > li.menu-on .toolbar-item span {\n  opacity: 1;\n}\n.simditor .simditor-toolbar > ul > li.menu-on .toolbar-item.toolbar-item-color:after {\n  background: #999999;\n}\n.simditor .simditor-toolbar > ul > li.menu-on .toolbar-menu {\n  display: block;\n}\n.simditor .simditor-toolbar .toolbar-menu {\n  display: none;\n  position: absolute;\n  top: 40px;\n  left: 0;\n  z-index: 20;\n  background: #ffffff;\n  text-align: left;\n  box-shadow: 0 0 3px rgba(0, 0, 0, 0.2);\n}\n.simditor .simditor-toolbar .toolbar-menu ul {\n  min-width: 160px;\n  list-style: none;\n  margin: 0;\n  padding: 10px 1px;\n}\n.simditor .simditor-toolbar .toolbar-menu ul > li .menu-item {\n  display: block;\n  font-size: 16px;\n  line-height: 2em;\n  padding: 0 10px;\n  text-decoration: none;\n  color: #666666;\n}\n.simditor .simditor-toolbar .toolbar-menu ul > li .menu-item:hover {\n  background: #f6f6f6;\n}\n.simditor .simditor-toolbar .toolbar-menu ul > li .menu-item.menu-item-h1 {\n  font-size: 24px;\n  color: #333333;\n}\n.simditor .simditor-toolbar .toolbar-menu ul > li .menu-item.menu-item-h2 {\n  font-size: 22px;\n  color: #333333;\n}\n.simditor .simditor-toolbar .toolbar-menu ul > li .menu-item.menu-item-h3 {\n  font-size: 20px;\n  color: #333333;\n}\n.simditor .simditor-toolbar .toolbar-menu ul > li .menu-item.menu-item-h4 {\n  font-size: 18px;\n  color: #333333;\n}\n.simditor .simditor-toolbar .toolbar-menu ul > li .menu-item.menu-item-h5 {\n  font-size: 16px;\n  color: #333333;\n}\n.simditor .simditor-toolbar .toolbar-menu ul > li .separator {\n  display: block;\n  border-top: 1px solid #cccccc;\n  height: 0;\n  line-height: 0;\n  font-size: 0;\n  margin: 6px 0;\n}\n.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color {\n  width: 96px;\n}\n.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list {\n  height: 40px;\n  margin: 10px 6px 6px 10px;\n  padding: 0;\n  min-width: 0;\n}\n.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li {\n  float: left;\n  margin: 0 4px 4px 0;\n}\n.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color {\n  display: block;\n  width: 16px;\n  height: 16px;\n  background: #dfdfdf;\n  border-radius: 2px;\n}\n.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color:hover {\n  opacity: 0.8;\n}\n.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color.font-color-default {\n  background: #333333;\n}\n.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-1 {\n  background: #E33737;\n}\n.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-2 {\n  background: #e28b41;\n}\n.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-3 {\n  background: #c8a732;\n}\n.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-4 {\n  background: #209361;\n}\n.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-5 {\n  background: #418caf;\n}\n.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-6 {\n  background: #aa8773;\n}\n.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-7 {\n  background: #999999;\n}\n.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table {\n  background: #ffffff;\n}\n.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table {\n  border: none;\n  border-collapse: collapse;\n  border-spacing: 0;\n  table-layout: fixed;\n}\n.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table td {\n  height: 16px;\n  padding: 0;\n  border: 2px solid #ffffff;\n  background: #f3f3f3;\n  cursor: pointer;\n}\n.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table td:before {\n  width: 16px;\n  display: block;\n  content: \"\";\n}\n.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table td.selected {\n  background: #cfcfcf;\n}\n.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-edit-table {\n  display: none;\n}\n.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-edit-table ul {\n  min-width: 240px;\n}\n.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-image .menu-item-upload-image {\n  position: relative;\n  overflow: hidden;\n}\n.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-image .menu-item-upload-image input[type=file] {\n  position: absolute;\n  right: 0px;\n  top: 0px;\n  opacity: 0;\n  font-size: 100px;\n  cursor: pointer;\n}\n.simditor .simditor-popover {\n  display: none;\n  padding: 5px 8px 0;\n  background: #ffffff;\n  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);\n  border-radius: 2px;\n  position: absolute;\n  z-index: 2;\n}\n.simditor .simditor-popover .settings-field {\n  margin: 0 0 5px 0;\n  font-size: 12px;\n  height: 25px;\n  line-height: 25px;\n}\n.simditor .simditor-popover .settings-field label {\n  margin: 0 8px 0 0;\n  float: left;\n}\n.simditor .simditor-popover .settings-field input[type=text] {\n  float: left;\n  width: 200px;\n  box-sizing: border-box;\n  font-size: 12px;\n}\n.simditor .simditor-popover .settings-field input[type=text].image-size {\n  width: 87px;\n}\n.simditor .simditor-popover .settings-field .times {\n  float: left;\n  width: 26px;\n  font-size: 12px;\n  text-align: center;\n}\n.simditor .simditor-popover.link-popover .btn-unlink, .simditor .simditor-popover.image-popover .btn-upload, .simditor .simditor-popover.image-popover .btn-restore {\n  float: left;\n  margin: 0 0 0 8px;\n  color: #333333;\n  font-size: 14px;\n  outline: 0;\n}\n.simditor .simditor-popover.link-popover .btn-unlink span, .simditor .simditor-popover.image-popover .btn-upload span, .simditor .simditor-popover.image-popover .btn-restore span {\n  opacity: 0.6;\n}\n.simditor .simditor-popover.link-popover .btn-unlink:hover span, .simditor .simditor-popover.image-popover .btn-upload:hover span, .simditor .simditor-popover.image-popover .btn-restore:hover span {\n  opacity: 1;\n}\n.simditor .simditor-popover.image-popover .btn-upload {\n  position: relative;\n  display: inline-block;\n  overflow: hidden;\n}\n.simditor .simditor-popover.image-popover .btn-upload input[type=file] {\n  position: absolute;\n  right: 0px;\n  top: 0px;\n  opacity: 0;\n  height: 100%;\n  width: 28px;\n}\n.simditor.simditor-mobile .simditor-toolbar > ul > li > .toolbar-item {\n  width: 46px;\n}\n.simditor.simditor-mobile .simditor-wrapper.toolbar-floating .simditor-toolbar {\n  position: absolute;\n  top: 0;\n  z-index: 10;\n  box-shadow: 0 0 6px rgba(0, 0, 0, 0.1);\n}\n\n.simditor .simditor-body, .editor-style {\n  font-size: 16px;\n  font-family: arial, sans-serif;\n  line-height: 1.6;\n  color: #333;\n  outline: none;\n  word-wrap: break-word;\n}\n.simditor .simditor-body > :first-child, .editor-style > :first-child {\n  margin-top: 0 !important;\n}\n.simditor .simditor-body a, .editor-style a {\n  color: #4298BA;\n  text-decoration: none;\n  word-break: break-all;\n}\n.simditor .simditor-body a:visited, .editor-style a:visited {\n  color: #4298BA;\n}\n.simditor .simditor-body a:hover, .editor-style a:hover {\n  color: #0F769F;\n}\n.simditor .simditor-body a:active, .editor-style a:active {\n  color: #9E792E;\n}\n.simditor .simditor-body a:hover, .simditor .simditor-body a:active, .editor-style a:hover, .editor-style a:active {\n  outline: 0;\n}\n.simditor .simditor-body h1, .simditor .simditor-body h2, .simditor .simditor-body h3, .simditor .simditor-body h4, .simditor .simditor-body h5, .simditor .simditor-body h6, .editor-style h1, .editor-style h2, .editor-style h3, .editor-style h4, .editor-style h5, .editor-style h6 {\n  font-weight: normal;\n  margin: 40px 0 20px;\n  color: #000000;\n}\n.simditor .simditor-body h1, .editor-style h1 {\n  font-size: 24px;\n}\n.simditor .simditor-body h2, .editor-style h2 {\n  font-size: 22px;\n}\n.simditor .simditor-body h3, .editor-style h3 {\n  font-size: 20px;\n}\n.simditor .simditor-body h4, .editor-style h4 {\n  font-size: 18px;\n}\n.simditor .simditor-body h5, .editor-style h5 {\n  font-size: 16px;\n}\n.simditor .simditor-body h6, .editor-style h6 {\n  font-size: 16px;\n}\n.simditor .simditor-body p, .simditor .simditor-body div, .editor-style p, .editor-style div {\n  word-wrap: break-word;\n  margin: 0 0 15px 0;\n  color: #333;\n  word-wrap: break-word;\n}\n.simditor .simditor-body b, .simditor .simditor-body strong, .editor-style b, .editor-style strong {\n  font-weight: bold;\n}\n.simditor .simditor-body i, .simditor .simditor-body em, .editor-style i, .editor-style em {\n  font-style: italic;\n}\n.simditor .simditor-body u, .editor-style u {\n  text-decoration: underline;\n}\n.simditor .simditor-body strike, .simditor .simditor-body del, .editor-style strike, .editor-style del {\n  text-decoration: line-through;\n}\n.simditor .simditor-body ul, .simditor .simditor-body ol, .editor-style ul, .editor-style ol {\n  list-style: disc outside none;\n  margin: 15px 0;\n  padding: 0 0 0 40px;\n  line-height: 1.6;\n}\n.simditor .simditor-body ul ul, .simditor .simditor-body ul ol, .simditor .simditor-body ol ul, .simditor .simditor-body ol ol, .editor-style ul ul, .editor-style ul ol, .editor-style ol ul, .editor-style ol ol {\n  padding-left: 30px;\n}\n.simditor .simditor-body ul ul, .simditor .simditor-body ol ul, .editor-style ul ul, .editor-style ol ul {\n  list-style: circle outside none;\n}\n.simditor .simditor-body ul ul ul, .simditor .simditor-body ol ul ul, .editor-style ul ul ul, .editor-style ol ul ul {\n  list-style: square outside none;\n}\n.simditor .simditor-body ol, .editor-style ol {\n  list-style: decimal;\n}\n.simditor .simditor-body blockquote, .editor-style blockquote {\n  border-left: 6px solid #ddd;\n  padding: 5px 0 5px 10px;\n  margin: 15px 0 15px 15px;\n}\n.simditor .simditor-body blockquote > :first-child, .editor-style blockquote > :first-child {\n  margin-top: 0;\n}\n.simditor .simditor-body pre, .editor-style pre {\n  padding: 10px 5px 10px 10px;\n  margin: 15px 0;\n  display: block;\n  line-height: 18px;\n  background: #F0F0F0;\n  border-radius: 3px;\n  font-size: 13px;\n  font-family: 'monaco', 'Consolas', \"Liberation Mono\", Courier, monospace;\n  overflow-x: auto;\n  white-space: nowrap;\n}\n.simditor .simditor-body code, .editor-style code {\n  display: inline-block;\n  padding: 0 4px;\n  margin: 0 5px;\n  background: #eeeeee;\n  border-radius: 3px;\n  font-size: 13px;\n  font-family: 'monaco', 'Consolas', \"Liberation Mono\", Courier, monospace;\n}\n.simditor .simditor-body hr, .editor-style hr {\n  display: block;\n  height: 0px;\n  border: 0;\n  border-top: 1px solid #ccc;\n  margin: 15px 0;\n  padding: 0;\n}\n.simditor .simditor-body table, .editor-style table {\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: collapse;\n  border-spacing: 0;\n  margin: 15px 0;\n}\n.simditor .simditor-body table thead, .editor-style table thead {\n  background-color: #f9f9f9;\n}\n.simditor .simditor-body table td, .editor-style table td {\n  min-width: 40px;\n  height: 30px;\n  border: 1px solid #ccc;\n  vertical-align: top;\n  padding: 2px 4px;\n  box-sizing: border-box;\n}\n.simditor .simditor-body table td.active, .editor-style table td.active {\n  background-color: #ffffee;\n}\n.simditor .simditor-body img, .editor-style img {\n  margin: 0 5px;\n  vertical-align: middle;\n}\n.simditor .simditor-body *[data-indent=\"0\"], .editor-style *[data-indent=\"0\"] {\n  margin-left: 0px;\n}\n.simditor .simditor-body *[data-indent=\"1\"], .editor-style *[data-indent=\"1\"] {\n  margin-left: 40px;\n}\n.simditor .simditor-body *[data-indent=\"2\"], .editor-style *[data-indent=\"2\"] {\n  margin-left: 80px;\n}\n.simditor .simditor-body *[data-indent=\"3\"], .editor-style *[data-indent=\"3\"] {\n  margin-left: 120px;\n}\n.simditor .simditor-body *[data-indent=\"4\"], .editor-style *[data-indent=\"4\"] {\n  margin-left: 160px;\n}\n.simditor .simditor-body *[data-indent=\"5\"], .editor-style *[data-indent=\"5\"] {\n  margin-left: 200px;\n}\n.simditor .simditor-body *[data-indent=\"6\"], .editor-style *[data-indent=\"6\"] {\n  margin-left: 240px;\n}\n.simditor .simditor-body *[data-indent=\"7\"], .editor-style *[data-indent=\"7\"] {\n  margin-left: 280px;\n}\n.simditor .simditor-body *[data-indent=\"8\"], .editor-style *[data-indent=\"8\"] {\n  margin-left: 320px;\n}\n.simditor .simditor-body *[data-indent=\"9\"], .editor-style *[data-indent=\"9\"] {\n  margin-left: 360px;\n}\n.simditor .simditor-body *[data-indent=\"10\"], .editor-style *[data-indent=\"10\"] {\n  margin-left: 400px;\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/steps/jquery.steps.css",
    "content": "/*\n    Common\n*/\n\n.wizard,\n.tabcontrol\n{\n    display: block;\n    width: 100%;\n    overflow: hidden;\n}\n\n.wizard a,\n.tabcontrol a\n{\n    outline: 0;\n}\n\n.wizard ul,\n.tabcontrol ul\n{\n    list-style: none !important;\n    padding: 0;\n    margin: 0;\n}\n\n.wizard ul > li,\n.tabcontrol ul > li\n{\n    display: block;\n    padding: 0;\n}\n\n/* Accessibility */\n.wizard > .steps .current-info,\n.tabcontrol > .steps .current-info\n{\n    position: absolute;\n    left: -999em;\n}\n\n.wizard > .content > .title,\n.tabcontrol > .content > .title\n{\n    position: absolute;\n    left: -999em;\n}\n\n\n\n/*\n    Wizard\n*/\n\n.wizard > .steps\n{\n    position: relative;\n    display: block;\n    width: 100%;\n}\n\n.wizard.vertical > .steps\n{\n    display: inline;\n    float: left;\n    width: 30%;\n}\n\n.wizard > .steps > ul > li\n{\n    width: 25%;\n}\n\n.wizard > .steps > ul > li,\n.wizard > .actions > ul > li\n{\n    float: left;\n}\n\n.wizard.vertical > .steps > ul > li\n{\n    float: none;\n    width: 100%;\n}\n\n.wizard > .steps a,\n.wizard > .steps a:hover,\n.wizard > .steps a:active\n{\n    display: block;\n    width: auto;\n    margin: 0 0.5em 0.5em;\n    padding: 8px;\n    text-decoration: none;\n\n    -webkit-border-radius: 5px;\n    -moz-border-radius: 5px;\n    border-radius: 5px;\n}\n\n.wizard > .steps .disabled a,\n.wizard > .steps .disabled a:hover,\n.wizard > .steps .disabled a:active\n{\n    background: #eee;\n    color: #aaa;\n    cursor: default;\n}\n\n.wizard > .steps .current a,\n.wizard > .steps .current a:hover,\n.wizard > .steps .current a:active\n{\n    background: #1AB394;\n    color: #fff;\n    cursor: default;\n}\n\n.wizard > .steps .done a,\n.wizard > .steps .done a:hover,\n.wizard > .steps .done a:active\n{\n    background: #6fd1bd;\n    color: #fff;\n}\n\n.wizard > .steps .error a,\n.wizard > .steps .error a:hover,\n.wizard > .steps .error a:active\n{\n    background: #ED5565 ;\n    color: #fff;\n}\n\n.wizard > .content\n{\n    background: #eee;\n    display: block;\n    margin: 5px 5px 10px 5px;\n    min-height: 120px;\n    overflow: hidden;\n    position: relative;\n    width: auto;\n\n    -webkit-border-radius: 5px;\n    -moz-border-radius: 5px;\n    border-radius: 5px;\n}\n\n.wizard-big.wizard > .content {\n    min-height: 320px;\n}\n.wizard.vertical > .content\n{\n    display: inline;\n    float: left;\n    margin: 0 2.5% 0.5em 2.5%;\n    width: 65%;\n}\n\n.wizard > .content > .body\n{\n    float: left;\n    position: absolute;\n    width: 95%;\n    height: 95%;\n    padding: 2.5%;\n}\n\n.wizard > .content > .body ul\n{\n    list-style: disc !important;\n}\n\n.wizard > .content > .body ul > li\n{\n    display: list-item;\n}\n\n.wizard > .content > .body > iframe\n{\n    border: 0 none;\n    width: 100%;\n    height: 100%;\n}\n\n.wizard > .content > .body input\n{\n    display: block;\n    border: 1px solid #ccc;\n}\n\n.wizard > .content > .body input[type=\"checkbox\"]\n{\n    display: inline-block;\n}\n\n.wizard > .content > .body input.error\n{\n    background: rgb(251, 227, 228);\n    border: 1px solid #fbc2c4;\n    color: #8a1f11;\n}\n\n.wizard > .content > .body label\n{\n    display: inline-block;\n    margin-bottom: 0.5em;\n}\n\n.wizard > .content > .body label.error\n{\n    color: #8a1f11;\n    display: inline-block;\n    margin-left: 1.5em;\n}\n\n.wizard > .actions\n{\n    position: relative;\n    display: block;\n    text-align: right;\n    width: 100%;\n}\n\n.wizard.vertical > .actions\n{\n    display: inline;\n    float: right;\n    margin: 0 2.5%;\n    width: 95%;\n}\n\n.wizard > .actions > ul\n{\n    display: inline-block;\n    text-align: right;\n}\n\n.wizard > .actions > ul > li\n{\n    margin: 0 0.5em;\n}\n\n.wizard.vertical > .actions > ul > li\n{\n    margin: 0 0 0 1em;\n}\n\n.wizard > .actions a,\n.wizard > .actions a:hover,\n.wizard > .actions a:active\n{\n    background: #1AB394;\n    color: #fff;\n    display: block;\n    padding: 0.5em 1em;\n    text-decoration: none;\n\n    -webkit-border-radius: 5px;\n    -moz-border-radius: 5px;\n    border-radius: 5px;\n}\n\n.wizard > .actions .disabled a,\n.wizard > .actions .disabled a:hover,\n.wizard > .actions .disabled a:active\n{\n    background: #eee;\n    color: #aaa;\n}\n\n.wizard > .loading\n{\n}\n\n.wizard > .loading .spinner\n{\n}\n\n\n\n/*\n    Tabcontrol\n*/\n\n.tabcontrol > .steps\n{\n    position: relative;\n    display: block;\n    width: 100%;\n}\n\n.tabcontrol > .steps > ul\n{\n    position: relative;\n    margin: 6px 0 0 0;\n    top: 1px;\n    z-index: 1;\n}\n\n.tabcontrol > .steps > ul > li\n{\n    float: left;\n    margin: 5px 2px 0 0;\n    padding: 1px;\n\n    -webkit-border-top-left-radius: 5px;\n    -webkit-border-top-right-radius: 5px;\n    -moz-border-radius-topleft: 5px;\n    -moz-border-radius-topright: 5px;\n    border-top-left-radius: 5px;\n    border-top-right-radius: 5px;\n}\n\n.tabcontrol > .steps > ul > li:hover\n{\n    background: #edecec;\n    border: 1px solid #bbb;\n    padding: 0;\n}\n\n.tabcontrol > .steps > ul > li.current\n{\n    background: #fff;\n    border: 1px solid #bbb;\n    border-bottom: 0 none;\n    padding: 0 0 1px 0;\n    margin-top: 0;\n}\n\n.tabcontrol > .steps > ul > li > a\n{\n    color: #5f5f5f;\n    display: inline-block;\n    border: 0 none;\n    margin: 0;\n    padding: 10px 30px;\n    text-decoration: none;\n}\n\n.tabcontrol > .steps > ul > li > a:hover\n{\n    text-decoration: none;\n}\n\n.tabcontrol > .steps > ul > li.current > a\n{\n    padding: 15px 30px 10px 30px;\n}\n\n.tabcontrol > .content\n{\n    position: relative;\n    display: inline-block;\n    width: 100%;\n    height: 35em;\n    overflow: hidden;\n    border-top: 1px solid #bbb;\n    padding-top: 20px;\n}\n\n.tabcontrol > .content > .body\n{\n    float: left;\n    position: absolute;\n    width: 95%;\n    height: 95%;\n    padding: 2.5%;\n}\n\n.tabcontrol > .content > .body ul\n{\n    list-style: disc !important;\n}\n\n.tabcontrol > .content > .body ul > li\n{\n    display: list-item;\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/summernote/summernote-bs3.css",
    "content": ".note-editor {\n  /*! normalize.css v2.1.3 | MIT License | git.io/normalize */\n\n}\n.note-editor article,\n.note-editor aside,\n.note-editor details,\n.note-editor figcaption,\n.note-editor figure,\n.note-editor footer,\n.note-editor header,\n.note-editor hgroup,\n.note-editor main,\n.note-editor nav,\n.note-editor section,\n.note-editor summary {\n  display: block;\n}\n.note-editor audio,\n.note-editor canvas,\n.note-editor video {\n  display: inline-block;\n}\n.note-editor audio:not([controls]) {\n  display: none;\n  height: 0;\n}\n.note-editor [hidden],\n.note-editor template {\n  display: none;\n}\n.note-editor html {\n  font-family: sans-serif;\n  -ms-text-size-adjust: 100%;\n  -webkit-text-size-adjust: 100%;\n}\n.note-editor body {\n  margin: 0;\n}\n.note-editor a {\n  background: transparent;\n}\n.note-editor a:focus {\n  outline: thin dotted;\n}\n.note-editor a:active,\n.note-editor a:hover {\n  outline: 0;\n}\n.note-editor h1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n.note-editor abbr[title] {\n  border-bottom: 1px dotted;\n}\n.note-editor b,\n.note-editor strong {\n  font-weight: bold;\n}\n.note-editor dfn {\n  font-style: italic;\n}\n.note-editor hr {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  height: 0;\n}\n.note-editor mark {\n  background: #ff0;\n  color: #000;\n}\n.note-editor code,\n.note-editor kbd,\n.note-editor pre,\n.note-editor samp {\n  font-family: monospace, serif;\n  font-size: 1em;\n}\n.note-editor pre {\n  white-space: pre-wrap;\n}\n.note-editor q {\n  quotes: \"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\";\n}\n.note-editor small {\n  font-size: 80%;\n}\n.note-editor sub,\n.note-editor sup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n.note-editor sup {\n  top: -0.5em;\n}\n.note-editor sub {\n  bottom: -0.25em;\n}\n.note-editor img {\n  border: 0;\n}\n.note-editor svg:not(:root) {\n  overflow: hidden;\n}\n.note-editor figure {\n  margin: 0;\n}\n.note-editor fieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\n.note-editor legend {\n  border: 0;\n  padding: 0;\n}\n.note-editor button,\n.note-editor input,\n.note-editor select,\n.note-editor textarea {\n  font-family: inherit;\n  font-size: 100%;\n  margin: 0;\n}\n.note-editor button,\n.note-editor input {\n  line-height: normal;\n}\n.note-editor button,\n.note-editor select {\n  text-transform: none;\n}\n.note-editor button,\n.note-editor html input[type=\"button\"],\n.note-editor input[type=\"reset\"],\n.note-editor input[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\n.note-editor button[disabled],\n.note-editor html input[disabled] {\n  cursor: default;\n}\n.note-editor input[type=\"checkbox\"],\n.note-editor input[type=\"radio\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\n.note-editor input[type=\"search\"] {\n  -webkit-appearance: textfield;\n  -moz-box-sizing: content-box;\n  -webkit-box-sizing: content-box;\n  box-sizing: content-box;\n}\n.note-editor input[type=\"search\"]::-webkit-search-cancel-button,\n.note-editor input[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n.note-editor button::-moz-focus-inner,\n.note-editor input::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\n.note-editor textarea {\n  overflow: auto;\n  vertical-align: top;\n}\n.note-editor table {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n@media print {\n  .note-editor * {\n    text-shadow: none !important;\n    color: #000 !important;\n    background: transparent !important;\n    box-shadow: none !important;\n  }\n  .note-editor a,\n  .note-editor a:visited {\n    text-decoration: underline;\n  }\n  .note-editor a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  .note-editor abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  .note-editor .ir a:after,\n  .note-editor a[href^=\"javascript:\"]:after,\n  .note-editor a[href^=\"#\"]:after {\n    content: \"\";\n  }\n  .note-editor pre,\n  .note-editor blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  .note-editor thead {\n    display: table-header-group;\n  }\n  .note-editor tr,\n  .note-editor img {\n    page-break-inside: avoid;\n  }\n  .note-editor img {\n    max-width: 100% !important;\n  }\n  @page  {\n    margin: 2cm .5cm;\n  }\n  .note-editor p,\n  .note-editor h2,\n  .note-editor h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  .note-editor h2,\n  .note-editor h3 {\n    page-break-after: avoid;\n  }\n  .note-editor .navbar {\n    display: none;\n  }\n  .note-editor .table td,\n  .note-editor .table th {\n    background-color: #fff !important;\n  }\n  .note-editor .btn > .caret,\n  .note-editor .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .note-editor .label {\n    border: 1px solid #000;\n  }\n  .note-editor .table {\n    border-collapse: collapse !important;\n  }\n  .note-editor .table-bordered th,\n  .note-editor .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n.note-editor *,\n.note-editor *:before,\n.note-editor *:after {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n.note-editor html {\n  font-size: 62.5%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n.note-editor body {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #333333;\n  background-color: #ffffff;\n}\n.note-editor input,\n.note-editor button,\n.note-editor select,\n.note-editor textarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n.note-editor a {\n  color: #428bca;\n  text-decoration: none;\n}\n.note-editor a:hover,\n.note-editor a:focus {\n  color: #2a6496;\n  text-decoration: underline;\n}\n.note-editor a:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.note-editor img {\n  vertical-align: middle;\n}\n.note-editor .img-responsive {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n.note-editor .img-rounded {\n  border-radius: 6px;\n}\n.note-editor .img-thumbnail {\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n  display: inline-block;\n  max-width: 100%;\n  height: auto;\n}\n.note-editor .img-circle {\n  border-radius: 50%;\n}\n.note-editor hr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n}\n.note-editor .sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n.note-editor p {\n  margin: 0 0 10px;\n}\n.note-editor .lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 200;\n  line-height: 1.4;\n}\n@media (min-width: 768px) {\n  .note-editor .lead {\n    font-size: 21px;\n  }\n}\n.note-editor small,\n.note-editor .small {\n  font-size: 85%;\n}\n.note-editor cite {\n  font-style: normal;\n}\n.note-editor .text-muted {\n  color: #999999;\n}\n.note-editor .text-primary {\n  color: #428bca;\n}\n.note-editor .text-primary:hover {\n  color: #3071a9;\n}\n.note-editor .text-warning {\n  color: #c09853;\n}\n.note-editor .text-warning:hover {\n  color: #a47e3c;\n}\n.note-editor .text-danger {\n  color: #b94a48;\n}\n.note-editor .text-danger:hover {\n  color: #953b39;\n}\n.note-editor .text-success {\n  color: #468847;\n}\n.note-editor .text-success:hover {\n  color: #356635;\n}\n.note-editor .text-info {\n  color: #3a87ad;\n}\n.note-editor .text-info:hover {\n  color: #2d6987;\n}\n.note-editor .text-left {\n  text-align: left;\n}\n.note-editor .text-right {\n  text-align: right;\n}\n.note-editor .text-center {\n  text-align: center;\n}\n.note-editor h1,\n.note-editor h2,\n.note-editor h3,\n.note-editor h4,\n.note-editor h5,\n.note-editor h6,\n.note-editor .h1,\n.note-editor .h2,\n.note-editor .h3,\n.note-editor .h4,\n.note-editor .h5,\n.note-editor .h6 {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\n.note-editor h1 small,\n.note-editor h2 small,\n.note-editor h3 small,\n.note-editor h4 small,\n.note-editor h5 small,\n.note-editor h6 small,\n.note-editor .h1 small,\n.note-editor .h2 small,\n.note-editor .h3 small,\n.note-editor .h4 small,\n.note-editor .h5 small,\n.note-editor .h6 small,\n.note-editor h1 .small,\n.note-editor h2 .small,\n.note-editor h3 .small,\n.note-editor h4 .small,\n.note-editor h5 .small,\n.note-editor h6 .small,\n.note-editor .h1 .small,\n.note-editor .h2 .small,\n.note-editor .h3 .small,\n.note-editor .h4 .small,\n.note-editor .h5 .small,\n.note-editor .h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #999999;\n}\n.note-editor h1,\n.note-editor h2,\n.note-editor h3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\n.note-editor h1 small,\n.note-editor h2 small,\n.note-editor h3 small,\n.note-editor h1 .small,\n.note-editor h2 .small,\n.note-editor h3 .small {\n  font-size: 65%;\n}\n.note-editor h4,\n.note-editor h5,\n.note-editor h6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.note-editor h4 small,\n.note-editor h5 small,\n.note-editor h6 small,\n.note-editor h4 .small,\n.note-editor h5 .small,\n.note-editor h6 .small {\n  font-size: 75%;\n}\n.note-editor h1,\n.note-editor .h1 {\n  font-size: 36px;\n}\n.note-editor h2,\n.note-editor .h2 {\n  font-size: 30px;\n}\n.note-editor h3,\n.note-editor .h3 {\n  font-size: 24px;\n}\n.note-editor h4,\n.note-editor .h4 {\n  font-size: 18px;\n}\n.note-editor h5,\n.note-editor .h5 {\n  font-size: 14px;\n}\n.note-editor h6,\n.note-editor .h6 {\n  font-size: 12px;\n}\n.note-editor .page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee;\n}\n.note-editor ul,\n.note-editor ol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\n.note-editor ul ul,\n.note-editor ol ul,\n.note-editor ul ol,\n.note-editor ol ol {\n  margin-bottom: 0;\n}\n.note-editor .list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n.note-editor .list-inline {\n  padding-left: 0;\n  list-style: none;\n}\n.note-editor .list-inline > li {\n  display: inline-block;\n  padding-left: 5px;\n  padding-right: 5px;\n}\n.note-editor dl {\n  margin-bottom: 20px;\n}\n.note-editor dt,\n.note-editor dd {\n  line-height: 1.428571429;\n}\n.note-editor dt {\n  font-weight: bold;\n}\n.note-editor dd {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .note-editor .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    clear: left;\n    text-align: right;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .note-editor .dl-horizontal dd {\n    margin-left: 180px;\n  }\n  .note-editor .dl-horizontal dd:before,\n  .note-editor .dl-horizontal dd:after {\n    content: \" \";\n    /* 1 */\n\n    display: table;\n    /* 2 */\n\n  }\n  .note-editor .dl-horizontal dd:after {\n    clear: both;\n  }\n  .note-editor .dl-horizontal dd:before,\n  .note-editor .dl-horizontal dd:after {\n    content: \" \";\n    /* 1 */\n\n    display: table;\n    /* 2 */\n\n  }\n  .note-editor .dl-horizontal dd:after {\n    clear: both;\n  }\n}\n.note-editor abbr[title],\n.note-editor abbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #999999;\n}\n.note-editor abbr.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n.note-editor blockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  border-left: 5px solid #eeeeee;\n}\n.note-editor blockquote p {\n  font-size: 17.5px;\n  font-weight: 300;\n  line-height: 1.25;\n}\n.note-editor blockquote p:last-child {\n  margin-bottom: 0;\n}\n.note-editor blockquote small {\n  display: block;\n  line-height: 1.428571429;\n  color: #999999;\n}\n.note-editor blockquote small:before {\n  content: '\\2014 \\00A0';\n}\n.note-editor blockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n}\n.note-editor blockquote.pull-right p,\n.note-editor blockquote.pull-right small,\n.note-editor blockquote.pull-right .small {\n  text-align: right;\n}\n.note-editor blockquote.pull-right small:before,\n.note-editor blockquote.pull-right .small:before {\n  content: '';\n}\n.note-editor blockquote.pull-right small:after,\n.note-editor blockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\n.note-editor blockquote:before,\n.note-editor blockquote:after {\n  content: \"\";\n}\n.note-editor address {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.428571429;\n}\n.note-editor code,\n.note-editor kdb,\n.note-editor pre,\n.note-editor samp {\n  font-family: Monaco, Menlo, Consolas, \"Courier New\", monospace;\n}\n.note-editor code {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  white-space: nowrap;\n  border-radius: 4px;\n}\n.note-editor pre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.428571429;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: #333333;\n  background-color: #f5f5f5;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n.note-editor pre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n.note-editor .pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.note-editor .container {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.note-editor .container:before,\n.note-editor .container:after {\n  content: \" \";\n  /* 1 */\n\n  display: table;\n  /* 2 */\n\n}\n.note-editor .container:after {\n  clear: both;\n}\n.note-editor .container:before,\n.note-editor .container:after {\n  content: \" \";\n  /* 1 */\n\n  display: table;\n  /* 2 */\n\n}\n.note-editor .container:after {\n  clear: both;\n}\n.note-editor .row {\n  margin-left: -15px;\n  margin-right: -15px;\n}\n.note-editor .row:before,\n.note-editor .row:after {\n  content: \" \";\n  /* 1 */\n\n  display: table;\n  /* 2 */\n\n}\n.note-editor .row:after {\n  clear: both;\n}\n.note-editor .row:before,\n.note-editor .row:after {\n  content: \" \";\n  /* 1 */\n\n  display: table;\n  /* 2 */\n\n}\n.note-editor .row:after {\n  clear: both;\n}\n.note-editor .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.note-editor .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11 {\n  float: left;\n}\n.note-editor .col-xs-12 {\n  width: 100%;\n}\n.note-editor .col-xs-11 {\n  width: 91.66666666666666%;\n}\n.note-editor .col-xs-10 {\n  width: 83.33333333333334%;\n}\n.note-editor .col-xs-9 {\n  width: 75%;\n}\n.note-editor .col-xs-8 {\n  width: 66.66666666666666%;\n}\n.note-editor .col-xs-7 {\n  width: 58.333333333333336%;\n}\n.note-editor .col-xs-6 {\n  width: 50%;\n}\n.note-editor .col-xs-5 {\n  width: 41.66666666666667%;\n}\n.note-editor .col-xs-4 {\n  width: 33.33333333333333%;\n}\n.note-editor .col-xs-3 {\n  width: 25%;\n}\n.note-editor .col-xs-2 {\n  width: 16.666666666666664%;\n}\n.note-editor .col-xs-1 {\n  width: 8.333333333333332%;\n}\n.note-editor .col-xs-pull-12 {\n  right: 100%;\n}\n.note-editor .col-xs-pull-11 {\n  right: 91.66666666666666%;\n}\n.note-editor .col-xs-pull-10 {\n  right: 83.33333333333334%;\n}\n.note-editor .col-xs-pull-9 {\n  right: 75%;\n}\n.note-editor .col-xs-pull-8 {\n  right: 66.66666666666666%;\n}\n.note-editor .col-xs-pull-7 {\n  right: 58.333333333333336%;\n}\n.note-editor .col-xs-pull-6 {\n  right: 50%;\n}\n.note-editor .col-xs-pull-5 {\n  right: 41.66666666666667%;\n}\n.note-editor .col-xs-pull-4 {\n  right: 33.33333333333333%;\n}\n.note-editor .col-xs-pull-3 {\n  right: 25%;\n}\n.note-editor .col-xs-pull-2 {\n  right: 16.666666666666664%;\n}\n.note-editor .col-xs-pull-1 {\n  right: 8.333333333333332%;\n}\n.note-editor .col-xs-push-12 {\n  left: 100%;\n}\n.note-editor .col-xs-push-11 {\n  left: 91.66666666666666%;\n}\n.note-editor .col-xs-push-10 {\n  left: 83.33333333333334%;\n}\n.note-editor .col-xs-push-9 {\n  left: 75%;\n}\n.note-editor .col-xs-push-8 {\n  left: 66.66666666666666%;\n}\n.note-editor .col-xs-push-7 {\n  left: 58.333333333333336%;\n}\n.note-editor .col-xs-push-6 {\n  left: 50%;\n}\n.note-editor .col-xs-push-5 {\n  left: 41.66666666666667%;\n}\n.note-editor .col-xs-push-4 {\n  left: 33.33333333333333%;\n}\n.note-editor .col-xs-push-3 {\n  left: 25%;\n}\n.note-editor .col-xs-push-2 {\n  left: 16.666666666666664%;\n}\n.note-editor .col-xs-push-1 {\n  left: 8.333333333333332%;\n}\n.note-editor .col-xs-offset-12 {\n  margin-left: 100%;\n}\n.note-editor .col-xs-offset-11 {\n  margin-left: 91.66666666666666%;\n}\n.note-editor .col-xs-offset-10 {\n  margin-left: 83.33333333333334%;\n}\n.note-editor .col-xs-offset-9 {\n  margin-left: 75%;\n}\n.note-editor .col-xs-offset-8 {\n  margin-left: 66.66666666666666%;\n}\n.note-editor .col-xs-offset-7 {\n  margin-left: 58.333333333333336%;\n}\n.note-editor .col-xs-offset-6 {\n  margin-left: 50%;\n}\n.note-editor .col-xs-offset-5 {\n  margin-left: 41.66666666666667%;\n}\n.note-editor .col-xs-offset-4 {\n  margin-left: 33.33333333333333%;\n}\n.note-editor .col-xs-offset-3 {\n  margin-left: 25%;\n}\n.note-editor .col-xs-offset-2 {\n  margin-left: 16.666666666666664%;\n}\n.note-editor .col-xs-offset-1 {\n  margin-left: 8.333333333333332%;\n}\n@media (min-width: 768px) {\n  .note-editor .container {\n    width: 750px;\n  }\n  .note-editor .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11 {\n    float: left;\n  }\n  .note-editor .col-sm-12 {\n    width: 100%;\n  }\n  .note-editor .col-sm-11 {\n    width: 91.66666666666666%;\n  }\n  .note-editor .col-sm-10 {\n    width: 83.33333333333334%;\n  }\n  .note-editor .col-sm-9 {\n    width: 75%;\n  }\n  .note-editor .col-sm-8 {\n    width: 66.66666666666666%;\n  }\n  .note-editor .col-sm-7 {\n    width: 58.333333333333336%;\n  }\n  .note-editor .col-sm-6 {\n    width: 50%;\n  }\n  .note-editor .col-sm-5 {\n    width: 41.66666666666667%;\n  }\n  .note-editor .col-sm-4 {\n    width: 33.33333333333333%;\n  }\n  .note-editor .col-sm-3 {\n    width: 25%;\n  }\n  .note-editor .col-sm-2 {\n    width: 16.666666666666664%;\n  }\n  .note-editor .col-sm-1 {\n    width: 8.333333333333332%;\n  }\n  .note-editor .col-sm-pull-12 {\n    right: 100%;\n  }\n  .note-editor .col-sm-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .note-editor .col-sm-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .note-editor .col-sm-pull-9 {\n    right: 75%;\n  }\n  .note-editor .col-sm-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .note-editor .col-sm-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .note-editor .col-sm-pull-6 {\n    right: 50%;\n  }\n  .note-editor .col-sm-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .note-editor .col-sm-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .note-editor .col-sm-pull-3 {\n    right: 25%;\n  }\n  .note-editor .col-sm-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .note-editor .col-sm-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .note-editor .col-sm-push-12 {\n    left: 100%;\n  }\n  .note-editor .col-sm-push-11 {\n    left: 91.66666666666666%;\n  }\n  .note-editor .col-sm-push-10 {\n    left: 83.33333333333334%;\n  }\n  .note-editor .col-sm-push-9 {\n    left: 75%;\n  }\n  .note-editor .col-sm-push-8 {\n    left: 66.66666666666666%;\n  }\n  .note-editor .col-sm-push-7 {\n    left: 58.333333333333336%;\n  }\n  .note-editor .col-sm-push-6 {\n    left: 50%;\n  }\n  .note-editor .col-sm-push-5 {\n    left: 41.66666666666667%;\n  }\n  .note-editor .col-sm-push-4 {\n    left: 33.33333333333333%;\n  }\n  .note-editor .col-sm-push-3 {\n    left: 25%;\n  }\n  .note-editor .col-sm-push-2 {\n    left: 16.666666666666664%;\n  }\n  .note-editor .col-sm-push-1 {\n    left: 8.333333333333332%;\n  }\n  .note-editor .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .note-editor .col-sm-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .note-editor .col-sm-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .note-editor .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .note-editor .col-sm-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .note-editor .col-sm-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .note-editor .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .note-editor .col-sm-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .note-editor .col-sm-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .note-editor .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .note-editor .col-sm-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .note-editor .col-sm-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n}\n@media (min-width: 992px) {\n  .note-editor .container {\n    width: 970px;\n  }\n  .note-editor .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11 {\n    float: left;\n  }\n  .note-editor .col-md-12 {\n    width: 100%;\n  }\n  .note-editor .col-md-11 {\n    width: 91.66666666666666%;\n  }\n  .note-editor .col-md-10 {\n    width: 83.33333333333334%;\n  }\n  .note-editor .col-md-9 {\n    width: 75%;\n  }\n  .note-editor .col-md-8 {\n    width: 66.66666666666666%;\n  }\n  .note-editor .col-md-7 {\n    width: 58.333333333333336%;\n  }\n  .note-editor .col-md-6 {\n    width: 50%;\n  }\n  .note-editor .col-md-5 {\n    width: 41.66666666666667%;\n  }\n  .note-editor .col-md-4 {\n    width: 33.33333333333333%;\n  }\n  .note-editor .col-md-3 {\n    width: 25%;\n  }\n  .note-editor .col-md-2 {\n    width: 16.666666666666664%;\n  }\n  .note-editor .col-md-1 {\n    width: 8.333333333333332%;\n  }\n  .note-editor .col-md-pull-12 {\n    right: 100%;\n  }\n  .note-editor .col-md-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .note-editor .col-md-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .note-editor .col-md-pull-9 {\n    right: 75%;\n  }\n  .note-editor .col-md-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .note-editor .col-md-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .note-editor .col-md-pull-6 {\n    right: 50%;\n  }\n  .note-editor .col-md-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .note-editor .col-md-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .note-editor .col-md-pull-3 {\n    right: 25%;\n  }\n  .note-editor .col-md-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .note-editor .col-md-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .note-editor .col-md-push-12 {\n    left: 100%;\n  }\n  .note-editor .col-md-push-11 {\n    left: 91.66666666666666%;\n  }\n  .note-editor .col-md-push-10 {\n    left: 83.33333333333334%;\n  }\n  .note-editor .col-md-push-9 {\n    left: 75%;\n  }\n  .note-editor .col-md-push-8 {\n    left: 66.66666666666666%;\n  }\n  .note-editor .col-md-push-7 {\n    left: 58.333333333333336%;\n  }\n  .note-editor .col-md-push-6 {\n    left: 50%;\n  }\n  .note-editor .col-md-push-5 {\n    left: 41.66666666666667%;\n  }\n  .note-editor .col-md-push-4 {\n    left: 33.33333333333333%;\n  }\n  .note-editor .col-md-push-3 {\n    left: 25%;\n  }\n  .note-editor .col-md-push-2 {\n    left: 16.666666666666664%;\n  }\n  .note-editor .col-md-push-1 {\n    left: 8.333333333333332%;\n  }\n  .note-editor .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .note-editor .col-md-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .note-editor .col-md-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .note-editor .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .note-editor .col-md-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .note-editor .col-md-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .note-editor .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .note-editor .col-md-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .note-editor .col-md-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .note-editor .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .note-editor .col-md-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .note-editor .col-md-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n}\n@media (min-width: 1200px) {\n  .note-editor .container {\n    width: 1170px;\n  }\n  .note-editor .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11 {\n    float: left;\n  }\n  .note-editor .col-lg-12 {\n    width: 100%;\n  }\n  .note-editor .col-lg-11 {\n    width: 91.66666666666666%;\n  }\n  .note-editor .col-lg-10 {\n    width: 83.33333333333334%;\n  }\n  .note-editor .col-lg-9 {\n    width: 75%;\n  }\n  .note-editor .col-lg-8 {\n    width: 66.66666666666666%;\n  }\n  .note-editor .col-lg-7 {\n    width: 58.333333333333336%;\n  }\n  .note-editor .col-lg-6 {\n    width: 50%;\n  }\n  .note-editor .col-lg-5 {\n    width: 41.66666666666667%;\n  }\n  .note-editor .col-lg-4 {\n    width: 33.33333333333333%;\n  }\n  .note-editor .col-lg-3 {\n    width: 25%;\n  }\n  .note-editor .col-lg-2 {\n    width: 16.666666666666664%;\n  }\n  .note-editor .col-lg-1 {\n    width: 8.333333333333332%;\n  }\n  .note-editor .col-lg-pull-12 {\n    right: 100%;\n  }\n  .note-editor .col-lg-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .note-editor .col-lg-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .note-editor .col-lg-pull-9 {\n    right: 75%;\n  }\n  .note-editor .col-lg-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .note-editor .col-lg-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .note-editor .col-lg-pull-6 {\n    right: 50%;\n  }\n  .note-editor .col-lg-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .note-editor .col-lg-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .note-editor .col-lg-pull-3 {\n    right: 25%;\n  }\n  .note-editor .col-lg-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .note-editor .col-lg-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .note-editor .col-lg-push-12 {\n    left: 100%;\n  }\n  .note-editor .col-lg-push-11 {\n    left: 91.66666666666666%;\n  }\n  .note-editor .col-lg-push-10 {\n    left: 83.33333333333334%;\n  }\n  .note-editor .col-lg-push-9 {\n    left: 75%;\n  }\n  .note-editor .col-lg-push-8 {\n    left: 66.66666666666666%;\n  }\n  .note-editor .col-lg-push-7 {\n    left: 58.333333333333336%;\n  }\n  .note-editor .col-lg-push-6 {\n    left: 50%;\n  }\n  .note-editor .col-lg-push-5 {\n    left: 41.66666666666667%;\n  }\n  .note-editor .col-lg-push-4 {\n    left: 33.33333333333333%;\n  }\n  .note-editor .col-lg-push-3 {\n    left: 25%;\n  }\n  .note-editor .col-lg-push-2 {\n    left: 16.666666666666664%;\n  }\n  .note-editor .col-lg-push-1 {\n    left: 8.333333333333332%;\n  }\n  .note-editor .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .note-editor .col-lg-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .note-editor .col-lg-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .note-editor .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .note-editor .col-lg-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .note-editor .col-lg-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .note-editor .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .note-editor .col-lg-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .note-editor .col-lg-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .note-editor .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .note-editor .col-lg-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .note-editor .col-lg-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n}\n.note-editor table {\n  max-width: 100%;\n  background-color: transparent;\n}\n.note-editor th {\n  text-align: left;\n}\n.note-editor .table {\n  width: 100%;\n  margin-bottom: 20px;\n}\n.note-editor .table > thead > tr > th,\n.note-editor .table > tbody > tr > th,\n.note-editor .table > tfoot > tr > th,\n.note-editor .table > thead > tr > td,\n.note-editor .table > tbody > tr > td,\n.note-editor .table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.428571429;\n  vertical-align: top;\n  border-top: 1px solid #dddddd;\n}\n.note-editor .table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dddddd;\n}\n.note-editor .table > caption + thead > tr:first-child > th,\n.note-editor .table > colgroup + thead > tr:first-child > th,\n.note-editor .table > thead:first-child > tr:first-child > th,\n.note-editor .table > caption + thead > tr:first-child > td,\n.note-editor .table > colgroup + thead > tr:first-child > td,\n.note-editor .table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n.note-editor .table > tbody + tbody {\n  border-top: 2px solid #dddddd;\n}\n.note-editor .table .table {\n  background-color: #ffffff;\n}\n.note-editor .table-condensed > thead > tr > th,\n.note-editor .table-condensed > tbody > tr > th,\n.note-editor .table-condensed > tfoot > tr > th,\n.note-editor .table-condensed > thead > tr > td,\n.note-editor .table-condensed > tbody > tr > td,\n.note-editor .table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n.note-editor .table-bordered {\n  border: 1px solid #dddddd;\n}\n.note-editor .table-bordered > thead > tr > th,\n.note-editor .table-bordered > tbody > tr > th,\n.note-editor .table-bordered > tfoot > tr > th,\n.note-editor .table-bordered > thead > tr > td,\n.note-editor .table-bordered > tbody > tr > td,\n.note-editor .table-bordered > tfoot > tr > td {\n  border: 1px solid #dddddd;\n}\n.note-editor .table-bordered > thead > tr > th,\n.note-editor .table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n.note-editor .table-striped > tbody > tr:nth-child(odd) > td,\n.note-editor .table-striped > tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n.note-editor .table-hover > tbody > tr:hover > td,\n.note-editor .table-hover > tbody > tr:hover > th {\n  background-color: #f5f5f5;\n}\n.note-editor table col[class*=\"col-\"] {\n  float: none;\n  display: table-column;\n}\n.note-editor table td[class*=\"col-\"],\n.note-editor table th[class*=\"col-\"] {\n  float: none;\n  display: table-cell;\n}\n.note-editor .table > thead > tr > td.active,\n.note-editor .table > tbody > tr > td.active,\n.note-editor .table > tfoot > tr > td.active,\n.note-editor .table > thead > tr > th.active,\n.note-editor .table > tbody > tr > th.active,\n.note-editor .table > tfoot > tr > th.active,\n.note-editor .table > thead > tr.active > td,\n.note-editor .table > tbody > tr.active > td,\n.note-editor .table > tfoot > tr.active > td,\n.note-editor .table > thead > tr.active > th,\n.note-editor .table > tbody > tr.active > th,\n.note-editor .table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n.note-editor .table > thead > tr > td.success,\n.note-editor .table > tbody > tr > td.success,\n.note-editor .table > tfoot > tr > td.success,\n.note-editor .table > thead > tr > th.success,\n.note-editor .table > tbody > tr > th.success,\n.note-editor .table > tfoot > tr > th.success,\n.note-editor .table > thead > tr.success > td,\n.note-editor .table > tbody > tr.success > td,\n.note-editor .table > tfoot > tr.success > td,\n.note-editor .table > thead > tr.success > th,\n.note-editor .table > tbody > tr.success > th,\n.note-editor .table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.note-editor .table-hover > tbody > tr > td.success:hover,\n.note-editor .table-hover > tbody > tr > th.success:hover,\n.note-editor .table-hover > tbody > tr.success:hover > td,\n.note-editor .table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6;\n  border-color: #c9e2b3;\n}\n.note-editor .table > thead > tr > td.danger,\n.note-editor .table > tbody > tr > td.danger,\n.note-editor .table > tfoot > tr > td.danger,\n.note-editor .table > thead > tr > th.danger,\n.note-editor .table > tbody > tr > th.danger,\n.note-editor .table > tfoot > tr > th.danger,\n.note-editor .table > thead > tr.danger > td,\n.note-editor .table > tbody > tr.danger > td,\n.note-editor .table > tfoot > tr.danger > td,\n.note-editor .table > thead > tr.danger > th,\n.note-editor .table > tbody > tr.danger > th,\n.note-editor .table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.note-editor .table-hover > tbody > tr > td.danger:hover,\n.note-editor .table-hover > tbody > tr > th.danger:hover,\n.note-editor .table-hover > tbody > tr.danger:hover > td,\n.note-editor .table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc;\n  border-color: #e4b9c0;\n}\n.note-editor .table > thead > tr > td.warning,\n.note-editor .table > tbody > tr > td.warning,\n.note-editor .table > tfoot > tr > td.warning,\n.note-editor .table > thead > tr > th.warning,\n.note-editor .table > tbody > tr > th.warning,\n.note-editor .table > tfoot > tr > th.warning,\n.note-editor .table > thead > tr.warning > td,\n.note-editor .table > tbody > tr.warning > td,\n.note-editor .table > tfoot > tr.warning > td,\n.note-editor .table > thead > tr.warning > th,\n.note-editor .table > tbody > tr.warning > th,\n.note-editor .table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.note-editor .table-hover > tbody > tr > td.warning:hover,\n.note-editor .table-hover > tbody > tr > th.warning:hover,\n.note-editor .table-hover > tbody > tr.warning:hover > td,\n.note-editor .table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc;\n  border-color: #f7e1b5;\n}\n@media (max-width: 767px) {\n  .note-editor .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-y: hidden;\n    overflow-x: scroll;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid #dddddd;\n    -webkit-overflow-scrolling: touch;\n  }\n  .note-editor .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .note-editor .table-responsive > .table > thead > tr > th,\n  .note-editor .table-responsive > .table > tbody > tr > th,\n  .note-editor .table-responsive > .table > tfoot > tr > th,\n  .note-editor .table-responsive > .table > thead > tr > td,\n  .note-editor .table-responsive > .table > tbody > tr > td,\n  .note-editor .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .note-editor .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .note-editor .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .note-editor .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .note-editor .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .note-editor .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .note-editor .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .note-editor .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .note-editor .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .note-editor .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .note-editor .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .note-editor .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .note-editor .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .note-editor .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .note-editor .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .note-editor .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .note-editor .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .note-editor .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\n.note-editor fieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n.note-editor legend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\n.note-editor label {\n  display: inline-block;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n.note-editor input[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n.note-editor input[type=\"radio\"],\n.note-editor input[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  /* IE8-9 */\n\n  line-height: normal;\n}\n.note-editor input[type=\"file\"] {\n  display: block;\n}\n.note-editor select[multiple],\n.note-editor select[size] {\n  height: auto;\n}\n.note-editor select optgroup {\n  font-size: inherit;\n  font-style: inherit;\n  font-family: inherit;\n}\n.note-editor input[type=\"file\"]:focus,\n.note-editor input[type=\"radio\"]:focus,\n.note-editor input[type=\"checkbox\"]:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.note-editor input[type=\"number\"]::-webkit-outer-spin-button,\n.note-editor input[type=\"number\"]::-webkit-inner-spin-button {\n  height: auto;\n}\n.note-editor output {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #555555;\n  vertical-align: middle;\n}\n.note-editor .form-control:-moz-placeholder {\n  color: #999999;\n}\n.note-editor .form-control::-moz-placeholder {\n  color: #999999;\n}\n.note-editor .form-control:-ms-input-placeholder {\n  color: #999999;\n}\n.note-editor .form-control::-webkit-input-placeholder {\n  color: #999999;\n}\n.note-editor .form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #555555;\n  vertical-align: middle;\n  background-color: #ffffff;\n  background-image: none;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 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.note-editor .form-control: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, 0.6);\n  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.note-editor .form-control[disabled],\n.note-editor .form-control[readonly],\nfieldset[disabled] .note-editor .form-control {\n  cursor: not-allowed;\n  background-color: #eeeeee;\n}\ntextarea.note-editor .form-control {\n  height: auto;\n}\n.note-editor .form-group {\n  margin-bottom: 15px;\n}\n.note-editor .radio,\n.note-editor .checkbox {\n  display: block;\n  min-height: 20px;\n  margin-top: 10px;\n  margin-bottom: 10px;\n  padding-left: 20px;\n  vertical-align: middle;\n}\n.note-editor .radio label,\n.note-editor .checkbox label {\n  display: inline;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n.note-editor .radio input[type=\"radio\"],\n.note-editor .radio-inline input[type=\"radio\"],\n.note-editor .checkbox input[type=\"checkbox\"],\n.note-editor .checkbox-inline input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n.note-editor .radio + .radio,\n.note-editor .checkbox + .checkbox {\n  margin-top: -5px;\n}\n.note-editor .radio-inline,\n.note-editor .checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.note-editor .radio-inline + .radio-inline,\n.note-editor .checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\n.note-editor input[type=\"radio\"][disabled],\n.note-editor input[type=\"checkbox\"][disabled],\n.note-editor .radio[disabled],\n.note-editor .radio-inline[disabled],\n.note-editor .checkbox[disabled],\n.note-editor .checkbox-inline[disabled],\nfieldset[disabled] .note-editor input[type=\"radio\"],\nfieldset[disabled] .note-editor input[type=\"checkbox\"],\nfieldset[disabled] .note-editor .radio,\nfieldset[disabled] .note-editor .radio-inline,\nfieldset[disabled] .note-editor .checkbox,\nfieldset[disabled] .note-editor .checkbox-inline {\n  cursor: not-allowed;\n}\n.note-editor .input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.note-editor .input-sm {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.note-editor .input-sm {\n  height: auto;\n}\n.note-editor .input-lg {\n  height: 45px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.note-editor .input-lg {\n  height: 45px;\n  line-height: 45px;\n}\ntextarea.note-editor .input-lg {\n  height: auto;\n}\n.note-editor .has-warning .help-block,\n.note-editor .has-warning .control-label {\n  color: #c09853;\n}\n.note-editor .has-warning .form-control {\n  border-color: #c09853;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.note-editor .has-warning .form-control:focus {\n  border-color: #a47e3c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n}\n.note-editor .has-warning .input-group-addon {\n  color: #c09853;\n  border-color: #c09853;\n  background-color: #fcf8e3;\n}\n.note-editor .has-error .help-block,\n.note-editor .has-error .control-label {\n  color: #b94a48;\n}\n.note-editor .has-error .form-control {\n  border-color: #b94a48;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.note-editor .has-error .form-control:focus {\n  border-color: #953b39;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n}\n.note-editor .has-error .input-group-addon {\n  color: #b94a48;\n  border-color: #b94a48;\n  background-color: #f2dede;\n}\n.note-editor .has-success .help-block,\n.note-editor .has-success .control-label {\n  color: #468847;\n}\n.note-editor .has-success .form-control {\n  border-color: #468847;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.note-editor .has-success .form-control:focus {\n  border-color: #356635;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n}\n.note-editor .has-success .input-group-addon {\n  color: #468847;\n  border-color: #468847;\n  background-color: #dff0d8;\n}\n.note-editor .form-control-static {\n  margin-bottom: 0;\n}\n.note-editor .help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n@media (min-width: 768px) {\n  .note-editor .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .note-editor .form-inline .form-control {\n    display: inline-block;\n  }\n  .note-editor .form-inline .radio,\n  .note-editor .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    padding-left: 0;\n  }\n  .note-editor .form-inline .radio input[type=\"radio\"],\n  .note-editor .form-inline .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n.note-editor .form-horizontal .control-label,\n.note-editor .form-horizontal .radio,\n.note-editor .form-horizontal .checkbox,\n.note-editor .form-horizontal .radio-inline,\n.note-editor .form-horizontal .checkbox-inline {\n  margin-top: 0;\n  margin-bottom: 0;\n  padding-top: 7px;\n}\n.note-editor .form-horizontal .form-group {\n  margin-left: -15px;\n  margin-right: -15px;\n}\n.note-editor .form-horizontal .form-group:before,\n.note-editor .form-horizontal .form-group:after {\n  content: \" \";\n  /* 1 */\n\n  display: table;\n  /* 2 */\n\n}\n.note-editor .form-horizontal .form-group:after {\n  clear: both;\n}\n.note-editor .form-horizontal .form-group:before,\n.note-editor .form-horizontal .form-group:after {\n  content: \" \";\n  /* 1 */\n\n  display: table;\n  /* 2 */\n\n}\n.note-editor .form-horizontal .form-group:after {\n  clear: both;\n}\n.note-editor .form-horizontal .form-control-static {\n  padding-top: 7px;\n}\n@media (min-width: 768px) {\n  .note-editor .form-horizontal .control-label {\n    text-align: right;\n  }\n}\n.note-editor .btn {\n  display: inline-block;\n  margin-bottom: 0;\n  font-weight: normal;\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  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  border-radius: 4px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  -o-user-select: none;\n  user-select: none;\n}\n.note-editor .btn:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.note-editor .btn:hover,\n.note-editor .btn:focus {\n  color: #333333;\n  text-decoration: none;\n}\n.note-editor .btn:active,\n.note-editor .btn.active {\n  outline: 0;\n  background-image: none;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.note-editor .btn.disabled,\n.note-editor .btn[disabled],\nfieldset[disabled] .note-editor .btn {\n  cursor: not-allowed;\n  pointer-events: none;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.note-editor .btn-default {\n  color: #333333;\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n.note-editor .btn-default:hover,\n.note-editor .btn-default:focus,\n.note-editor .btn-default:active,\n.note-editor .btn-default.active,\n.open .dropdown-toggle.note-editor .btn-default {\n  color: #333333;\n  background-color: #ebebeb;\n  border-color: #adadad;\n}\n.note-editor .btn-default:active,\n.note-editor .btn-default.active,\n.open .dropdown-toggle.note-editor .btn-default {\n  background-image: none;\n}\n.note-editor .btn-default.disabled,\n.note-editor .btn-default[disabled],\nfieldset[disabled] .note-editor .btn-default,\n.note-editor .btn-default.disabled:hover,\n.note-editor .btn-default[disabled]:hover,\nfieldset[disabled] .note-editor .btn-default:hover,\n.note-editor .btn-default.disabled:focus,\n.note-editor .btn-default[disabled]:focus,\nfieldset[disabled] .note-editor .btn-default:focus,\n.note-editor .btn-default.disabled:active,\n.note-editor .btn-default[disabled]:active,\nfieldset[disabled] .note-editor .btn-default:active,\n.note-editor .btn-default.disabled.active,\n.note-editor .btn-default[disabled].active,\nfieldset[disabled] .note-editor .btn-default.active {\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n.note-editor .btn-primary {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n.note-editor .btn-primary:hover,\n.note-editor .btn-primary:focus,\n.note-editor .btn-primary:active,\n.note-editor .btn-primary.active,\n.open .dropdown-toggle.note-editor .btn-primary {\n  color: #ffffff;\n  background-color: #3276b1;\n  border-color: #285e8e;\n}\n.note-editor .btn-primary:active,\n.note-editor .btn-primary.active,\n.open .dropdown-toggle.note-editor .btn-primary {\n  background-image: none;\n}\n.note-editor .btn-primary.disabled,\n.note-editor .btn-primary[disabled],\nfieldset[disabled] .note-editor .btn-primary,\n.note-editor .btn-primary.disabled:hover,\n.note-editor .btn-primary[disabled]:hover,\nfieldset[disabled] .note-editor .btn-primary:hover,\n.note-editor .btn-primary.disabled:focus,\n.note-editor .btn-primary[disabled]:focus,\nfieldset[disabled] .note-editor .btn-primary:focus,\n.note-editor .btn-primary.disabled:active,\n.note-editor .btn-primary[disabled]:active,\nfieldset[disabled] .note-editor .btn-primary:active,\n.note-editor .btn-primary.disabled.active,\n.note-editor .btn-primary[disabled].active,\nfieldset[disabled] .note-editor .btn-primary.active {\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n.note-editor .btn-warning {\n  color: #ffffff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.note-editor .btn-warning:hover,\n.note-editor .btn-warning:focus,\n.note-editor .btn-warning:active,\n.note-editor .btn-warning.active,\n.open .dropdown-toggle.note-editor .btn-warning {\n  color: #ffffff;\n  background-color: #ed9c28;\n  border-color: #d58512;\n}\n.note-editor .btn-warning:active,\n.note-editor .btn-warning.active,\n.open .dropdown-toggle.note-editor .btn-warning {\n  background-image: none;\n}\n.note-editor .btn-warning.disabled,\n.note-editor .btn-warning[disabled],\nfieldset[disabled] .note-editor .btn-warning,\n.note-editor .btn-warning.disabled:hover,\n.note-editor .btn-warning[disabled]:hover,\nfieldset[disabled] .note-editor .btn-warning:hover,\n.note-editor .btn-warning.disabled:focus,\n.note-editor .btn-warning[disabled]:focus,\nfieldset[disabled] .note-editor .btn-warning:focus,\n.note-editor .btn-warning.disabled:active,\n.note-editor .btn-warning[disabled]:active,\nfieldset[disabled] .note-editor .btn-warning:active,\n.note-editor .btn-warning.disabled.active,\n.note-editor .btn-warning[disabled].active,\nfieldset[disabled] .note-editor .btn-warning.active {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.note-editor .btn-danger {\n  color: #ffffff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.note-editor .btn-danger:hover,\n.note-editor .btn-danger:focus,\n.note-editor .btn-danger:active,\n.note-editor .btn-danger.active,\n.open .dropdown-toggle.note-editor .btn-danger {\n  color: #ffffff;\n  background-color: #d2322d;\n  border-color: #ac2925;\n}\n.note-editor .btn-danger:active,\n.note-editor .btn-danger.active,\n.open .dropdown-toggle.note-editor .btn-danger {\n  background-image: none;\n}\n.note-editor .btn-danger.disabled,\n.note-editor .btn-danger[disabled],\nfieldset[disabled] .note-editor .btn-danger,\n.note-editor .btn-danger.disabled:hover,\n.note-editor .btn-danger[disabled]:hover,\nfieldset[disabled] .note-editor .btn-danger:hover,\n.note-editor .btn-danger.disabled:focus,\n.note-editor .btn-danger[disabled]:focus,\nfieldset[disabled] .note-editor .btn-danger:focus,\n.note-editor .btn-danger.disabled:active,\n.note-editor .btn-danger[disabled]:active,\nfieldset[disabled] .note-editor .btn-danger:active,\n.note-editor .btn-danger.disabled.active,\n.note-editor .btn-danger[disabled].active,\nfieldset[disabled] .note-editor .btn-danger.active {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.note-editor .btn-success {\n  color: #ffffff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.note-editor .btn-success:hover,\n.note-editor .btn-success:focus,\n.note-editor .btn-success:active,\n.note-editor .btn-success.active,\n.open .dropdown-toggle.note-editor .btn-success {\n  color: #ffffff;\n  background-color: #47a447;\n  border-color: #398439;\n}\n.note-editor .btn-success:active,\n.note-editor .btn-success.active,\n.open .dropdown-toggle.note-editor .btn-success {\n  background-image: none;\n}\n.note-editor .btn-success.disabled,\n.note-editor .btn-success[disabled],\nfieldset[disabled] .note-editor .btn-success,\n.note-editor .btn-success.disabled:hover,\n.note-editor .btn-success[disabled]:hover,\nfieldset[disabled] .note-editor .btn-success:hover,\n.note-editor .btn-success.disabled:focus,\n.note-editor .btn-success[disabled]:focus,\nfieldset[disabled] .note-editor .btn-success:focus,\n.note-editor .btn-success.disabled:active,\n.note-editor .btn-success[disabled]:active,\nfieldset[disabled] .note-editor .btn-success:active,\n.note-editor .btn-success.disabled.active,\n.note-editor .btn-success[disabled].active,\nfieldset[disabled] .note-editor .btn-success.active {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.note-editor .btn-info {\n  color: #ffffff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.note-editor .btn-info:hover,\n.note-editor .btn-info:focus,\n.note-editor .btn-info:active,\n.note-editor .btn-info.active,\n.open .dropdown-toggle.note-editor .btn-info {\n  color: #ffffff;\n  background-color: #39b3d7;\n  border-color: #269abc;\n}\n.note-editor .btn-info:active,\n.note-editor .btn-info.active,\n.open .dropdown-toggle.note-editor .btn-info {\n  background-image: none;\n}\n.note-editor .btn-info.disabled,\n.note-editor .btn-info[disabled],\nfieldset[disabled] .note-editor .btn-info,\n.note-editor .btn-info.disabled:hover,\n.note-editor .btn-info[disabled]:hover,\nfieldset[disabled] .note-editor .btn-info:hover,\n.note-editor .btn-info.disabled:focus,\n.note-editor .btn-info[disabled]:focus,\nfieldset[disabled] .note-editor .btn-info:focus,\n.note-editor .btn-info.disabled:active,\n.note-editor .btn-info[disabled]:active,\nfieldset[disabled] .note-editor .btn-info:active,\n.note-editor .btn-info.disabled.active,\n.note-editor .btn-info[disabled].active,\nfieldset[disabled] .note-editor .btn-info.active {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.note-editor .btn-link {\n  color: #428bca;\n  font-weight: normal;\n  cursor: pointer;\n  border-radius: 0;\n}\n.note-editor .btn-link,\n.note-editor .btn-link:active,\n.note-editor .btn-link[disabled],\nfieldset[disabled] .note-editor .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.note-editor .btn-link,\n.note-editor .btn-link:hover,\n.note-editor .btn-link:focus,\n.note-editor .btn-link:active {\n  border-color: transparent;\n}\n.note-editor .btn-link:hover,\n.note-editor .btn-link:focus {\n  color: #2a6496;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.note-editor .btn-link[disabled]:hover,\nfieldset[disabled] .note-editor .btn-link:hover,\n.note-editor .btn-link[disabled]:focus,\nfieldset[disabled] .note-editor .btn-link:focus {\n  color: #999999;\n  text-decoration: none;\n}\n.note-editor .btn-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n.note-editor .btn-sm,\n.note-editor .btn-xs {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.note-editor .btn-xs {\n  padding: 1px 5px;\n}\n.note-editor .btn-block {\n  display: block;\n  width: 100%;\n  padding-left: 0;\n  padding-right: 0;\n}\n.note-editor .btn-block + .btn-block {\n  margin-top: 5px;\n}\n.note-editor input[type=\"submit\"].btn-block,\n.note-editor input[type=\"reset\"].btn-block,\n.note-editor input[type=\"button\"].btn-block {\n  width: 100%;\n}\n.note-editor .fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n  transition: opacity 0.15s linear;\n}\n.note-editor .fade.in {\n  opacity: 1;\n}\n.note-editor .collapse {\n  display: none;\n}\n.note-editor .collapse.in {\n  display: block;\n}\n.note-editor .collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n  transition: height 0.35s ease;\n}\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('../../../fonts/glyphicons-halflings-regular.eot');\n  src: url('../../../fonts/glyphicons-halflings-regulard41d.eot?') format('embedded-opentype'), url('../../../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../../../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../../../fonts/glyphicons-halflings-regular.svg') format('svg');\n}\n.note-editor .glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n}\n.note-editor .glyphicon:empty {\n  width: 1em;\n}\n.note-editor .glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n.note-editor .glyphicon-plus:before {\n  content: \"\\2b\";\n}\n.note-editor .glyphicon-euro:before {\n  content: \"\\20ac\";\n}\n.note-editor .glyphicon-minus:before {\n  content: \"\\2212\";\n}\n.note-editor .glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n.note-editor .glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n.note-editor .glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n.note-editor .glyphicon-glass:before {\n  content: \"\\e001\";\n}\n.note-editor .glyphicon-music:before {\n  content: \"\\e002\";\n}\n.note-editor .glyphicon-search:before {\n  content: \"\\e003\";\n}\n.note-editor .glyphicon-heart:before {\n  content: \"\\e005\";\n}\n.note-editor .glyphicon-star:before {\n  content: \"\\e006\";\n}\n.note-editor .glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n.note-editor .glyphicon-user:before {\n  content: \"\\e008\";\n}\n.note-editor .glyphicon-film:before {\n  content: \"\\e009\";\n}\n.note-editor .glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n.note-editor .glyphicon-th:before {\n  content: \"\\e011\";\n}\n.note-editor .glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n.note-editor .glyphicon-ok:before {\n  content: \"\\e013\";\n}\n.note-editor .glyphicon-remove:before {\n  content: \"\\e014\";\n}\n.note-editor .glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n.note-editor .glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n.note-editor .glyphicon-off:before {\n  content: \"\\e017\";\n}\n.note-editor .glyphicon-signal:before {\n  content: \"\\e018\";\n}\n.note-editor .glyphicon-cog:before {\n  content: \"\\e019\";\n}\n.note-editor .glyphicon-trash:before {\n  content: \"\\e020\";\n}\n.note-editor .glyphicon-home:before {\n  content: \"\\e021\";\n}\n.note-editor .glyphicon-file:before {\n  content: \"\\e022\";\n}\n.note-editor .glyphicon-time:before {\n  content: \"\\e023\";\n}\n.note-editor .glyphicon-road:before {\n  content: \"\\e024\";\n}\n.note-editor .glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n.note-editor .glyphicon-download:before {\n  content: \"\\e026\";\n}\n.note-editor .glyphicon-upload:before {\n  content: \"\\e027\";\n}\n.note-editor .glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n.note-editor .glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n.note-editor .glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n.note-editor .glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n.note-editor .glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n.note-editor .glyphicon-lock:before {\n  content: \"\\e033\";\n}\n.note-editor .glyphicon-flag:before {\n  content: \"\\e034\";\n}\n.note-editor .glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n.note-editor .glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n.note-editor .glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n.note-editor .glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n.note-editor .glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n.note-editor .glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n.note-editor .glyphicon-tag:before {\n  content: \"\\e041\";\n}\n.note-editor .glyphicon-tags:before {\n  content: \"\\e042\";\n}\n.note-editor .glyphicon-book:before {\n  content: \"\\e043\";\n}\n.note-editor .glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n.note-editor .glyphicon-print:before {\n  content: \"\\e045\";\n}\n.note-editor .glyphicon-camera:before {\n  content: \"\\e046\";\n}\n.note-editor .glyphicon-font:before {\n  content: \"\\e047\";\n}\n.note-editor .glyphicon-bold:before {\n  content: \"\\e048\";\n}\n.note-editor .glyphicon-italic:before {\n  content: \"\\e049\";\n}\n.note-editor .glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n.note-editor .glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n.note-editor .glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n.note-editor .glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n.note-editor .glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n.note-editor .glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n.note-editor .glyphicon-list:before {\n  content: \"\\e056\";\n}\n.note-editor .glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n.note-editor .glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n.note-editor .glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n.note-editor .glyphicon-picture:before {\n  content: \"\\e060\";\n}\n.note-editor .glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n.note-editor .glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n.note-editor .glyphicon-tint:before {\n  content: \"\\e064\";\n}\n.note-editor .glyphicon-edit:before {\n  content: \"\\e065\";\n}\n.note-editor .glyphicon-share:before {\n  content: \"\\e066\";\n}\n.note-editor .glyphicon-check:before {\n  content: \"\\e067\";\n}\n.note-editor .glyphicon-move:before {\n  content: \"\\e068\";\n}\n.note-editor .glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n.note-editor .glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n.note-editor .glyphicon-backward:before {\n  content: \"\\e071\";\n}\n.note-editor .glyphicon-play:before {\n  content: \"\\e072\";\n}\n.note-editor .glyphicon-pause:before {\n  content: \"\\e073\";\n}\n.note-editor .glyphicon-stop:before {\n  content: \"\\e074\";\n}\n.note-editor .glyphicon-forward:before {\n  content: \"\\e075\";\n}\n.note-editor .glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n.note-editor .glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n.note-editor .glyphicon-eject:before {\n  content: \"\\e078\";\n}\n.note-editor .glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n.note-editor .glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n.note-editor .glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n.note-editor .glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n.note-editor .glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n.note-editor .glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n.note-editor .glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n.note-editor .glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n.note-editor .glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n.note-editor .glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n.note-editor .glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n.note-editor .glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n.note-editor .glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n.note-editor .glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n.note-editor .glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n.note-editor .glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n.note-editor .glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n.note-editor .glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n.note-editor .glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n.note-editor .glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n.note-editor .glyphicon-gift:before {\n  content: \"\\e102\";\n}\n.note-editor .glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n.note-editor .glyphicon-fire:before {\n  content: \"\\e104\";\n}\n.note-editor .glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n.note-editor .glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n.note-editor .glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n.note-editor .glyphicon-plane:before {\n  content: \"\\e108\";\n}\n.note-editor .glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n.note-editor .glyphicon-random:before {\n  content: \"\\e110\";\n}\n.note-editor .glyphicon-comment:before {\n  content: \"\\e111\";\n}\n.note-editor .glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n.note-editor .glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n.note-editor .glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n.note-editor .glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n.note-editor .glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n.note-editor .glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n.note-editor .glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n.note-editor .glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n.note-editor .glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n.note-editor .glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n.note-editor .glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n.note-editor .glyphicon-bell:before {\n  content: \"\\e123\";\n}\n.note-editor .glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n.note-editor .glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n.note-editor .glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n.note-editor .glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n.note-editor .glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n.note-editor .glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n.note-editor .glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n.note-editor .glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n.note-editor .glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n.note-editor .glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n.note-editor .glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n.note-editor .glyphicon-globe:before {\n  content: \"\\e135\";\n}\n.note-editor .glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n.note-editor .glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n.note-editor .glyphicon-filter:before {\n  content: \"\\e138\";\n}\n.note-editor .glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n.note-editor .glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n.note-editor .glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n.note-editor .glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n.note-editor .glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n.note-editor .glyphicon-link:before {\n  content: \"\\e144\";\n}\n.note-editor .glyphicon-phone:before {\n  content: \"\\e145\";\n}\n.note-editor .glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n.note-editor .glyphicon-usd:before {\n  content: \"\\e148\";\n}\n.note-editor .glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n.note-editor .glyphicon-sort:before {\n  content: \"\\e150\";\n}\n.note-editor .glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n.note-editor .glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n.note-editor .glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n.note-editor .glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n.note-editor .glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n.note-editor .glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n.note-editor .glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n.note-editor .glyphicon-expand:before {\n  content: \"\\e158\";\n}\n.note-editor .glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n.note-editor .glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n.note-editor .glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n.note-editor .glyphicon-flash:before {\n  content: \"\\e162\";\n}\n.note-editor .glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n.note-editor .glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n.note-editor .glyphicon-record:before {\n  content: \"\\e165\";\n}\n.note-editor .glyphicon-save:before {\n  content: \"\\e166\";\n}\n.note-editor .glyphicon-open:before {\n  content: \"\\e167\";\n}\n.note-editor .glyphicon-saved:before {\n  content: \"\\e168\";\n}\n.note-editor .glyphicon-import:before {\n  content: \"\\e169\";\n}\n.note-editor .glyphicon-export:before {\n  content: \"\\e170\";\n}\n.note-editor .glyphicon-send:before {\n  content: \"\\e171\";\n}\n.note-editor .glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n.note-editor .glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n.note-editor .glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n.note-editor .glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n.note-editor .glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n.note-editor .glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n.note-editor .glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n.note-editor .glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n.note-editor .glyphicon-header:before {\n  content: \"\\e180\";\n}\n.note-editor .glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n.note-editor .glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n.note-editor .glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n.note-editor .glyphicon-tower:before {\n  content: \"\\e184\";\n}\n.note-editor .glyphicon-stats:before {\n  content: \"\\e185\";\n}\n.note-editor .glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n.note-editor .glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n.note-editor .glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n.note-editor .glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n.note-editor .glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n.note-editor .glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n.note-editor .glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n.note-editor .glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n.note-editor .glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n.note-editor .glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n.note-editor .glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n.note-editor .glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n.note-editor .glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n.note-editor .glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n.note-editor .caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px solid #000000;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n  border-bottom: 0 dotted;\n}\n.note-editor .dropdown {\n  position: relative;\n}\n.note-editor .dropdown-toggle:focus {\n  outline: 0;\n}\n.note-editor .dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  list-style: none;\n  font-size: 14px;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box;\n}\n.note-editor .dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.note-editor .dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.note-editor .dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.428571429;\n  color: #333333;\n  white-space: nowrap;\n}\n.note-editor .dropdown-menu > li > a:hover,\n.note-editor .dropdown-menu > li > a:focus {\n  text-decoration: none;\n  color: #262626;\n  background-color: #f5f5f5;\n}\n.note-editor .dropdown-menu > .active > a,\n.note-editor .dropdown-menu > .active > a:hover,\n.note-editor .dropdown-menu > .active > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  outline: 0;\n  background-color: #428bca;\n}\n.note-editor .dropdown-menu > .disabled > a,\n.note-editor .dropdown-menu > .disabled > a:hover,\n.note-editor .dropdown-menu > .disabled > a:focus {\n  color: #999999;\n}\n.note-editor .dropdown-menu > .disabled > a:hover,\n.note-editor .dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  cursor: not-allowed;\n}\n.note-editor .open > .dropdown-menu {\n  display: block;\n  left:0!important;\n    right:auto!important;\n}\n.note-editor .open > a {\n  outline: 0;\n}\n.note-editor .dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.428571429;\n  color: #999999;\n}\n.note-editor .dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: 990;\n}\n.note-editor .pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.note-editor .dropup .caret,\n.note-editor .navbar-fixed-bottom .dropdown .caret {\n  border-top: 0 dotted;\n  border-bottom: 4px solid #000000;\n  content: \"\";\n}\n.note-editor .dropup .dropdown-menu,\n.note-editor .navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n@media (min-width: 768px) {\n  .note-editor .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n  }\n}\n.btn-default .note-editor .caret {\n  border-top-color: #333333;\n}\n.btn-primary .note-editor .caret,\n.btn-success .note-editor .caret,\n.btn-warning .note-editor .caret,\n.btn-danger .note-editor .caret,\n.btn-info .note-editor .caret {\n  border-top-color: #fff;\n}\n.note-editor .dropup .btn-default .caret {\n  border-bottom-color: #333333;\n}\n.note-editor .dropup .btn-primary .caret,\n.note-editor .dropup .btn-success .caret,\n.note-editor .dropup .btn-warning .caret,\n.note-editor .dropup .btn-danger .caret,\n.note-editor .dropup .btn-info .caret {\n  border-bottom-color: #fff;\n}\n.note-editor .btn-group,\n.note-editor .btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n.note-editor .btn-group > .btn,\n.note-editor .btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n.note-editor .btn-group > .btn:hover,\n.note-editor .btn-group-vertical > .btn:hover,\n.note-editor .btn-group > .btn:focus,\n.note-editor .btn-group-vertical > .btn:focus,\n.note-editor .btn-group > .btn:active,\n.note-editor .btn-group-vertical > .btn:active,\n.note-editor .btn-group > .btn.active,\n.note-editor .btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n.note-editor .btn-group > .btn:focus,\n.note-editor .btn-group-vertical > .btn:focus {\n  outline: none;\n}\n.note-editor .btn-group .btn + .btn,\n.note-editor .btn-group .btn + .btn-group,\n.note-editor .btn-group .btn-group + .btn,\n.note-editor .btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n.note-editor .btn-toolbar:before,\n.note-editor .btn-toolbar:after {\n  content: \" \";\n  /* 1 */\n\n  display: table;\n  /* 2 */\n\n}\n.note-editor .btn-toolbar:after {\n  clear: both;\n}\n.note-editor .btn-toolbar:before,\n.note-editor .btn-toolbar:after {\n  content: \" \";\n  /* 1 */\n\n  display: table;\n  /* 2 */\n\n}\n.note-editor .btn-toolbar:after {\n  clear: both;\n}\n.note-editor .btn-toolbar .btn-group {\n  float: left;\n}\n.note-editor .btn-toolbar > .btn + .btn,\n.note-editor .btn-toolbar > .btn-group + .btn,\n.note-editor .btn-toolbar > .btn + .btn-group,\n.note-editor .btn-toolbar > .btn-group + .btn-group {\n  margin-left: 5px;\n}\n.note-editor .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n.note-editor .btn-group > .btn:first-child {\n  margin-left: 0;\n}\n.note-editor .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.note-editor .btn-group > .btn:last-child:not(:first-child),\n.note-editor .btn-group > .dropdown-toggle:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.note-editor .btn-group > .btn-group {\n  float: left;\n}\n.note-editor .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.note-editor .btn-group > .btn-group:first-child > .btn:last-child,\n.note-editor .btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.note-editor .btn-group > .btn-group:last-child > .btn:first-child {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.note-editor .btn-group .dropdown-toggle:active,\n.note-editor .btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.note-editor .btn-group-xs > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n  padding: 1px 5px;\n}\n.note-editor .btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.note-editor .btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n.note-editor .btn-group > .btn + .dropdown-toggle {\n  padding-left: 5px;\n  padding-right: 5px;\n}\n.note-editor .btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n.note-editor .btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.note-editor .btn .caret {\n  margin-left: 0;\n}\n.note-editor .btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n.note-editor .dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n.note-editor .btn-group-vertical > .btn,\n.note-editor .btn-group-vertical > .btn-group {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n.note-editor .btn-group-vertical > .btn-group:before,\n.note-editor .btn-group-vertical > .btn-group:after {\n  content: \" \";\n  /* 1 */\n\n  display: table;\n  /* 2 */\n\n}\n.note-editor .btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n.note-editor .btn-group-vertical > .btn-group:before,\n.note-editor .btn-group-vertical > .btn-group:after {\n  content: \" \";\n  /* 1 */\n\n  display: table;\n  /* 2 */\n\n}\n.note-editor .btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n.note-editor .btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n.note-editor .btn-group-vertical > .btn + .btn,\n.note-editor .btn-group-vertical > .btn + .btn-group,\n.note-editor .btn-group-vertical > .btn-group + .btn,\n.note-editor .btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n.note-editor .btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.note-editor .btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.note-editor .btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-bottom-left-radius: 4px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.note-editor .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.note-editor .btn-group-vertical > .btn-group:first-child > .btn:last-child,\n.note-editor .btn-group-vertical > .btn-group:first-child > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.note-editor .btn-group-vertical > .btn-group:last-child > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.note-editor .btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n}\n.note-editor .btn-group-justified .btn {\n  float: none;\n  display: table-cell;\n  width: 1%;\n}\n.note-editor [data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n.note-editor [data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: none;\n}\n.note-editor .input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n.note-editor .input-group.col {\n  float: none;\n  padding-left: 0;\n  padding-right: 0;\n}\n.note-editor .input-group .form-control {\n  width: 100%;\n  margin-bottom: 0;\n}\n.note-editor .input-group-lg > .form-control,\n.note-editor .input-group-lg > .input-group-addon,\n.note-editor .input-group-lg > .input-group-btn > .btn {\n  height: 45px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.note-editor .input-group-lg > .form-control,\nselect.note-editor .input-group-lg > .input-group-addon,\nselect.note-editor .input-group-lg > .input-group-btn > .btn {\n  height: 45px;\n  line-height: 45px;\n}\ntextarea.note-editor .input-group-lg > .form-control,\ntextarea.note-editor .input-group-lg > .input-group-addon,\ntextarea.note-editor .input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n.note-editor .input-group-sm > .form-control,\n.note-editor .input-group-sm > .input-group-addon,\n.note-editor .input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.note-editor .input-group-sm > .form-control,\nselect.note-editor .input-group-sm > .input-group-addon,\nselect.note-editor .input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.note-editor .input-group-sm > .form-control,\ntextarea.note-editor .input-group-sm > .input-group-addon,\ntextarea.note-editor .input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n.note-editor .input-group-addon,\n.note-editor .input-group-btn,\n.note-editor .input-group .form-control {\n  display: table-cell;\n}\n.note-editor .input-group-addon:not(:first-child):not(:last-child),\n.note-editor .input-group-btn:not(:first-child):not(:last-child),\n.note-editor .input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.note-editor .input-group-addon,\n.note-editor .input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.note-editor .input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555555;\n  text-align: center;\n  background-color: #eeeeee;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n.note-editor .input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n.note-editor .input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n.note-editor .input-group-addon input[type=\"radio\"],\n.note-editor .input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n.note-editor .input-group .form-control:first-child,\n.note-editor .input-group-addon:first-child,\n.note-editor .input-group-btn:first-child > .btn,\n.note-editor .input-group-btn:first-child > .dropdown-toggle,\n.note-editor .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.note-editor .input-group-addon:first-child {\n  border-right: 0;\n}\n.note-editor .input-group .form-control:last-child,\n.note-editor .input-group-addon:last-child,\n.note-editor .input-group-btn:last-child > .btn,\n.note-editor .input-group-btn:last-child > .dropdown-toggle,\n.note-editor .input-group-btn:first-child > .btn:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.note-editor .input-group-addon:last-child {\n  border-left: 0;\n}\n.note-editor .input-group-btn {\n  position: relative;\n  white-space: nowrap;\n}\n.note-editor .input-group-btn:first-child > .btn {\n  margin-right: -1px;\n}\n.note-editor .input-group-btn:last-child > .btn {\n  margin-left: -1px;\n}\n.note-editor .input-group-btn > .btn {\n  position: relative;\n}\n.note-editor .input-group-btn > .btn + .btn {\n  margin-left: -4px;\n}\n.note-editor .input-group-btn > .btn:hover,\n.note-editor .input-group-btn > .btn:active {\n  z-index: 2;\n}\n.note-editor .nav {\n  margin-bottom: 0;\n  padding-left: 0;\n  list-style: none;\n}\n.note-editor .nav:before,\n.note-editor .nav:after {\n  content: \" \";\n  /* 1 */\n\n  display: table;\n  /* 2 */\n\n}\n.note-editor .nav:after {\n  clear: both;\n}\n.note-editor .nav:before,\n.note-editor .nav:after {\n  content: \" \";\n  /* 1 */\n\n  display: table;\n  /* 2 */\n\n}\n.note-editor .nav:after {\n  clear: both;\n}\n.note-editor .nav > li {\n  position: relative;\n  display: block;\n}\n.note-editor .nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n.note-editor .nav > li > a:hover,\n.note-editor .nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n.note-editor .nav > li.disabled > a {\n  color: #999999;\n}\n.note-editor .nav > li.disabled > a:hover,\n.note-editor .nav > li.disabled > a:focus {\n  color: #999999;\n  text-decoration: none;\n  background-color: transparent;\n  cursor: not-allowed;\n}\n.note-editor .nav .open > a,\n.note-editor .nav .open > a:hover,\n.note-editor .nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #428bca;\n}\n.note-editor .nav .open > a .caret,\n.note-editor .nav .open > a:hover .caret,\n.note-editor .nav .open > a:focus .caret {\n  border-top-color: #2a6496;\n  border-bottom-color: #2a6496;\n}\n.note-editor .nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.note-editor .nav > li > a > img {\n  max-width: none;\n}\n.note-editor .nav-tabs {\n  border-bottom: 1px solid #dddddd;\n}\n.note-editor .nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n.note-editor .nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.428571429;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n.note-editor .nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #dddddd;\n}\n.note-editor .nav-tabs > li.active > a,\n.note-editor .nav-tabs > li.active > a:hover,\n.note-editor .nav-tabs > li.active > a:focus {\n  color: #555555;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-bottom-color: transparent;\n  cursor: default;\n}\n.note-editor .nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n.note-editor .nav-tabs.nav-justified > li {\n  float: none;\n}\n.note-editor .nav-tabs.nav-justified > li > a {\n  text-align: center;\n  margin-bottom: 5px;\n}\n@media (min-width: 768px) {\n  .note-editor .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .note-editor .nav-tabs.nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.note-editor .nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.note-editor .nav-tabs.nav-justified > .active > a,\n.note-editor .nav-tabs.nav-justified > .active > a:hover,\n.note-editor .nav-tabs.nav-justified > .active > a:focus {\n  border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n  .note-editor .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #dddddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .note-editor .nav-tabs.nav-justified > .active > a,\n  .note-editor .nav-tabs.nav-justified > .active > a:hover,\n  .note-editor .nav-tabs.nav-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n.note-editor .nav-pills > li {\n  float: left;\n}\n.note-editor .nav-pills > li > a {\n  border-radius: 4px;\n}\n.note-editor .nav-pills > li + li {\n  margin-left: 2px;\n}\n.note-editor .nav-pills > li.active > a,\n.note-editor .nav-pills > li.active > a:hover,\n.note-editor .nav-pills > li.active > a:focus {\n  color: #ffffff;\n  background-color: #428bca;\n}\n.note-editor .nav-pills > li.active > a .caret,\n.note-editor .nav-pills > li.active > a:hover .caret,\n.note-editor .nav-pills > li.active > a:focus .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n.note-editor .nav-stacked > li {\n  float: none;\n}\n.note-editor .nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n.note-editor .nav-justified {\n  width: 100%;\n}\n.note-editor .nav-justified > li {\n  float: none;\n}\n.note-editor .nav-justified > li > a {\n  text-align: center;\n  margin-bottom: 5px;\n}\n@media (min-width: 768px) {\n  .note-editor .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .note-editor .nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.note-editor .nav-tabs-justified {\n  border-bottom: 0;\n}\n.note-editor .nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.note-editor .nav-tabs-justified > .active > a,\n.note-editor .nav-tabs-justified > .active > a:hover,\n.note-editor .nav-tabs-justified > .active > a:focus {\n  border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n  .note-editor .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #dddddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .note-editor .nav-tabs-justified > .active > a,\n  .note-editor .nav-tabs-justified > .active > a:hover,\n  .note-editor .nav-tabs-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n.note-editor .tab-content > .tab-pane {\n  display: none;\n}\n.note-editor .tab-content > .active {\n  display: block;\n}\n.note-editor .nav .caret {\n  border-top-color: #428bca;\n  border-bottom-color: #428bca;\n}\n.note-editor .nav a:hover .caret {\n  border-top-color: #2a6496;\n  border-bottom-color: #2a6496;\n}\n.note-editor .nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.note-editor .navbar {\n  position: relative;\n  z-index: 1000;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n.note-editor .navbar:before,\n.note-editor .navbar:after {\n  content: \" \";\n  /* 1 */\n\n  display: table;\n  /* 2 */\n\n}\n.note-editor .navbar:after {\n  clear: both;\n}\n.note-editor .navbar:before,\n.note-editor .navbar:after {\n  content: \" \";\n  /* 1 */\n\n  display: table;\n  /* 2 */\n\n}\n.note-editor .navbar:after {\n  clear: both;\n}\n@media (min-width: 768px) {\n  .note-editor .navbar {\n    border-radius: 4px;\n  }\n}\n.note-editor .navbar-header:before,\n.note-editor .navbar-header:after {\n  content: \" \";\n  /* 1 */\n\n  display: table;\n  /* 2 */\n\n}\n.note-editor .navbar-header:after {\n  clear: both;\n}\n.note-editor .navbar-header:before,\n.note-editor .navbar-header:after {\n  content: \" \";\n  /* 1 */\n\n  display: table;\n  /* 2 */\n\n}\n.note-editor .navbar-header:after {\n  clear: both;\n}\n@media (min-width: 768px) {\n  .note-editor .navbar-header {\n    float: left;\n  }\n}\n.note-editor .navbar-collapse {\n  max-height: 340px;\n  overflow-x: visible;\n  padding-right: 15px;\n  padding-left: 15px;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch;\n}\n.note-editor .navbar-collapse:before,\n.note-editor .navbar-collapse:after {\n  content: \" \";\n  /* 1 */\n\n  display: table;\n  /* 2 */\n\n}\n.note-editor .navbar-collapse:after {\n  clear: both;\n}\n.note-editor .navbar-collapse:before,\n.note-editor .navbar-collapse:after {\n  content: \" \";\n  /* 1 */\n\n  display: table;\n  /* 2 */\n\n}\n.note-editor .navbar-collapse:after {\n  clear: both;\n}\n.note-editor .navbar-collapse.in {\n  overflow-y: auto;\n}\n@media (min-width: 768px) {\n  .note-editor .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n  }\n  .note-editor .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .note-editor .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .note-editor .navbar-collapse .navbar-nav.navbar-left:first-child {\n    margin-left: -15px;\n  }\n  .note-editor .navbar-collapse .navbar-nav.navbar-right:last-child {\n    margin-right: -15px;\n  }\n  .note-editor .navbar-collapse .navbar-text:last-child {\n    margin-right: 0;\n  }\n}\n.note-editor .container > .navbar-header,\n.note-editor .container > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .note-editor .container > .navbar-header,\n  .note-editor .container > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n.note-editor .navbar-static-top {\n  border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n  .note-editor .navbar-static-top {\n    border-radius: 0;\n  }\n}\n.note-editor .navbar-fixed-top,\n.note-editor .navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n  .note-editor .navbar-fixed-top,\n  .note-editor .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n.note-editor .navbar-fixed-top {\n  z-index: 1030;\n  top: 0;\n}\n.note-editor .navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n}\n.note-editor .navbar-brand {\n  float: left;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n}\n.note-editor .navbar-brand:hover,\n.note-editor .navbar-brand:focus {\n  text-decoration: none;\n}\n@media (min-width: 768px) {\n  .navbar > .container .note-editor .navbar-brand {\n    margin-left: -15px;\n  }\n}\n.note-editor .navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: 15px;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.note-editor .navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n.note-editor .navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n@media (min-width: 768px) {\n  .note-editor .navbar-toggle {\n    display: none;\n  }\n}\n.note-editor .navbar-nav {\n  margin: 7.5px -15px;\n}\n.note-editor .navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n@media (max-width: 767px) {\n  .note-editor .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    box-shadow: none;\n  }\n  .note-editor .navbar-nav .open .dropdown-menu > li > a,\n  .note-editor .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .note-editor .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .note-editor .navbar-nav .open .dropdown-menu > li > a:hover,\n  .note-editor .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n@media (min-width: 768px) {\n  .note-editor .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .note-editor .navbar-nav > li {\n    float: left;\n  }\n  .note-editor .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n}\n@media (min-width: 768px) {\n  .note-editor .navbar-left {\n    float: left !important;\n  }\n  .note-editor .navbar-right {\n    float: right !important;\n  }\n}\n.note-editor .navbar-form {\n  margin-left: -15px;\n  margin-right: -15px;\n  padding: 10px 15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n  .note-editor .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .note-editor .navbar-form .form-control {\n    display: inline-block;\n  }\n  .note-editor .navbar-form .radio,\n  .note-editor .navbar-form .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    padding-left: 0;\n  }\n  .note-editor .navbar-form .radio input[type=\"radio\"],\n  .note-editor .navbar-form .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n@media (max-width: 767px) {\n  .note-editor .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n}\n@media (min-width: 768px) {\n  .note-editor .navbar-form {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n  }\n}\n.note-editor .navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.note-editor .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.note-editor .navbar-nav.pull-right > li > .dropdown-menu,\n.note-editor .navbar-nav > li > .dropdown-menu.pull-right {\n  left: auto;\n  right: 0;\n}\n.note-editor .navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n.note-editor .navbar-text {\n  float: left;\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n  .note-editor .navbar-text {\n    margin-left: 15px;\n    margin-right: 15px;\n  }\n}\n.note-editor .navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n.note-editor .navbar-default .navbar-brand {\n  color: #777777;\n}\n.note-editor .navbar-default .navbar-brand:hover,\n.note-editor .navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n.note-editor .navbar-default .navbar-text {\n  color: #777777;\n}\n.note-editor .navbar-default .navbar-nav > li > a {\n  color: #777777;\n}\n.note-editor .navbar-default .navbar-nav > li > a:hover,\n.note-editor .navbar-default .navbar-nav > li > a:focus {\n  color: #333333;\n  background-color: transparent;\n}\n.note-editor .navbar-default .navbar-nav > .active > a,\n.note-editor .navbar-default .navbar-nav > .active > a:hover,\n.note-editor .navbar-default .navbar-nav > .active > a:focus {\n  color: #555555;\n  background-color: #e7e7e7;\n}\n.note-editor .navbar-default .navbar-nav > .disabled > a,\n.note-editor .navbar-default .navbar-nav > .disabled > a:hover,\n.note-editor .navbar-default .navbar-nav > .disabled > a:focus {\n  color: #cccccc;\n  background-color: transparent;\n}\n.note-editor .navbar-default .navbar-toggle {\n  border-color: #dddddd;\n}\n.note-editor .navbar-default .navbar-toggle:hover,\n.note-editor .navbar-default .navbar-toggle:focus {\n  background-color: #dddddd;\n}\n.note-editor .navbar-default .navbar-toggle .icon-bar {\n  background-color: #cccccc;\n}\n.note-editor .navbar-default .navbar-collapse,\n.note-editor .navbar-default .navbar-form {\n  border-color: #e7e7e7;\n}\n.note-editor .navbar-default .navbar-nav > .dropdown > a:hover .caret,\n.note-editor .navbar-default .navbar-nav > .dropdown > a:focus .caret {\n  border-top-color: #333333;\n  border-bottom-color: #333333;\n}\n.note-editor .navbar-default .navbar-nav > .open > a,\n.note-editor .navbar-default .navbar-nav > .open > a:hover,\n.note-editor .navbar-default .navbar-nav > .open > a:focus {\n  background-color: #e7e7e7;\n  color: #555555;\n}\n.note-editor .navbar-default .navbar-nav > .open > a .caret,\n.note-editor .navbar-default .navbar-nav > .open > a:hover .caret,\n.note-editor .navbar-default .navbar-nav > .open > a:focus .caret {\n  border-top-color: #555555;\n  border-bottom-color: #555555;\n}\n.note-editor .navbar-default .navbar-nav > .dropdown > a .caret {\n  border-top-color: #777777;\n  border-bottom-color: #777777;\n}\n@media (max-width: 767px) {\n  .note-editor .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777777;\n  }\n  .note-editor .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .note-editor .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #333333;\n    background-color: transparent;\n  }\n  .note-editor .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .note-editor .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .note-editor .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #555555;\n    background-color: #e7e7e7;\n  }\n  .note-editor .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .note-editor .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .note-editor .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #cccccc;\n    background-color: transparent;\n  }\n}\n.note-editor .navbar-default .navbar-link {\n  color: #777777;\n}\n.note-editor .navbar-default .navbar-link:hover {\n  color: #333333;\n}\n.note-editor .navbar-inverse {\n  background-color: #222222;\n  border-color: #080808;\n}\n.note-editor .navbar-inverse .navbar-brand {\n  color: #999999;\n}\n.note-editor .navbar-inverse .navbar-brand:hover,\n.note-editor .navbar-inverse .navbar-brand:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n.note-editor .navbar-inverse .navbar-text {\n  color: #999999;\n}\n.note-editor .navbar-inverse .navbar-nav > li > a {\n  color: #999999;\n}\n.note-editor .navbar-inverse .navbar-nav > li > a:hover,\n.note-editor .navbar-inverse .navbar-nav > li > a:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n.note-editor .navbar-inverse .navbar-nav > .active > a,\n.note-editor .navbar-inverse .navbar-nav > .active > a:hover,\n.note-editor .navbar-inverse .navbar-nav > .active > a:focus {\n  color: #ffffff;\n  background-color: #080808;\n}\n.note-editor .navbar-inverse .navbar-nav > .disabled > a,\n.note-editor .navbar-inverse .navbar-nav > .disabled > a:hover,\n.note-editor .navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444444;\n  background-color: transparent;\n}\n.note-editor .navbar-inverse .navbar-toggle {\n  border-color: #333333;\n}\n.note-editor .navbar-inverse .navbar-toggle:hover,\n.note-editor .navbar-inverse .navbar-toggle:focus {\n  background-color: #333333;\n}\n.note-editor .navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #ffffff;\n}\n.note-editor .navbar-inverse .navbar-collapse,\n.note-editor .navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n.note-editor .navbar-inverse .navbar-nav > .open > a,\n.note-editor .navbar-inverse .navbar-nav > .open > a:hover,\n.note-editor .navbar-inverse .navbar-nav > .open > a:focus {\n  background-color: #080808;\n  color: #ffffff;\n}\n.note-editor .navbar-inverse .navbar-nav > .dropdown > a:hover .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n.note-editor .navbar-inverse .navbar-nav > .dropdown > a .caret {\n  border-top-color: #999999;\n  border-bottom-color: #999999;\n}\n.note-editor .navbar-inverse .navbar-nav > .open > a .caret,\n.note-editor .navbar-inverse .navbar-nav > .open > a:hover .caret,\n.note-editor .navbar-inverse .navbar-nav > .open > a:focus .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n@media (max-width: 767px) {\n  .note-editor .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .note-editor .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #999999;\n  }\n  .note-editor .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .note-editor .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #ffffff;\n    background-color: transparent;\n  }\n  .note-editor .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .note-editor .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .note-editor .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #ffffff;\n    background-color: #080808;\n  }\n  .note-editor .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .note-editor .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .note-editor .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444444;\n    background-color: transparent;\n  }\n}\n.note-editor .navbar-inverse .navbar-link {\n  color: #999999;\n}\n.note-editor .navbar-inverse .navbar-link:hover {\n  color: #ffffff;\n}\n.note-editor .breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n.note-editor .breadcrumb > li {\n  display: inline-block;\n}\n.note-editor .breadcrumb > li + li:before {\n  content: \"/\\00a0\";\n  padding: 0 5px;\n  color: #cccccc;\n}\n.note-editor .breadcrumb > .active {\n  color: #999999;\n}\n.note-editor .pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n.note-editor .pagination > li {\n  display: inline;\n}\n.note-editor .pagination > li > a,\n.note-editor .pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  line-height: 1.428571429;\n  text-decoration: none;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  margin-left: -1px;\n}\n.note-editor .pagination > li:first-child > a,\n.note-editor .pagination > li:first-child > span {\n  margin-left: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 4px;\n}\n.note-editor .pagination > li:last-child > a,\n.note-editor .pagination > li:last-child > span {\n  border-bottom-right-radius: 4px;\n  border-top-right-radius: 4px;\n}\n.note-editor .pagination > li > a:hover,\n.note-editor .pagination > li > span:hover,\n.note-editor .pagination > li > a:focus,\n.note-editor .pagination > li > span:focus {\n  background-color: #eeeeee;\n}\n.note-editor .pagination > .active > a,\n.note-editor .pagination > .active > span,\n.note-editor .pagination > .active > a:hover,\n.note-editor .pagination > .active > span:hover,\n.note-editor .pagination > .active > a:focus,\n.note-editor .pagination > .active > span:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n  cursor: default;\n}\n.note-editor .pagination > .disabled > span,\n.note-editor .pagination > .disabled > span:hover,\n.note-editor .pagination > .disabled > span:focus,\n.note-editor .pagination > .disabled > a,\n.note-editor .pagination > .disabled > a:hover,\n.note-editor .pagination > .disabled > a:focus {\n  color: #999999;\n  background-color: #ffffff;\n  border-color: #dddddd;\n  cursor: not-allowed;\n}\n.note-editor .pagination-lg > li > a,\n.note-editor .pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\n.note-editor .pagination-lg > li:first-child > a,\n.note-editor .pagination-lg > li:first-child > span {\n  border-bottom-left-radius: 6px;\n  border-top-left-radius: 6px;\n}\n.note-editor .pagination-lg > li:last-child > a,\n.note-editor .pagination-lg > li:last-child > span {\n  border-bottom-right-radius: 6px;\n  border-top-right-radius: 6px;\n}\n.note-editor .pagination-sm > li > a,\n.note-editor .pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n.note-editor .pagination-sm > li:first-child > a,\n.note-editor .pagination-sm > li:first-child > span {\n  border-bottom-left-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.note-editor .pagination-sm > li:last-child > a,\n.note-editor .pagination-sm > li:last-child > span {\n  border-bottom-right-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.note-editor .pager {\n  padding-left: 0;\n  margin: 20px 0;\n  list-style: none;\n  text-align: center;\n}\n.note-editor .pager:before,\n.note-editor .pager:after {\n  content: \" \";\n  /* 1 */\n\n  display: table;\n  /* 2 */\n\n}\n.note-editor .pager:after {\n  clear: both;\n}\n.note-editor .pager:before,\n.note-editor .pager:after {\n  content: \" \";\n  /* 1 */\n\n  display: table;\n  /* 2 */\n\n}\n.note-editor .pager:after {\n  clear: both;\n}\n.note-editor .pager li {\n  display: inline;\n}\n.note-editor .pager li > a,\n.note-editor .pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 15px;\n}\n.note-editor .pager li > a:hover,\n.note-editor .pager li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n.note-editor .pager .next > a,\n.note-editor .pager .next > span {\n  float: right;\n}\n.note-editor .pager .previous > a,\n.note-editor .pager .previous > span {\n  float: left;\n}\n.note-editor .pager .disabled > a,\n.note-editor .pager .disabled > a:hover,\n.note-editor .pager .disabled > a:focus,\n.note-editor .pager .disabled > span {\n  color: #999999;\n  background-color: #ffffff;\n  cursor: not-allowed;\n}\n.note-editor .label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\n.note-editor .label[href]:hover,\n.note-editor .label[href]:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.note-editor .label:empty {\n  display: none;\n}\n.note-editor .label-default {\n  background-color: #999999;\n}\n.note-editor .label-default[href]:hover,\n.note-editor .label-default[href]:focus {\n  background-color: #808080;\n}\n.note-editor .label-primary {\n  background-color: #428bca;\n}\n.note-editor .label-primary[href]:hover,\n.note-editor .label-primary[href]:focus {\n  background-color: #3071a9;\n}\n.note-editor .label-success {\n  background-color: #5cb85c;\n}\n.note-editor .label-success[href]:hover,\n.note-editor .label-success[href]:focus {\n  background-color: #449d44;\n}\n.note-editor .label-info {\n  background-color: #5bc0de;\n}\n.note-editor .label-info[href]:hover,\n.note-editor .label-info[href]:focus {\n  background-color: #31b0d5;\n}\n.note-editor .label-warning {\n  background-color: #f0ad4e;\n}\n.note-editor .label-warning[href]:hover,\n.note-editor .label-warning[href]:focus {\n  background-color: #ec971f;\n}\n.note-editor .label-danger {\n  background-color: #d9534f;\n}\n.note-editor .label-danger[href]:hover,\n.note-editor .label-danger[href]:focus {\n  background-color: #c9302c;\n}\n.note-editor .badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  color: #ffffff;\n  line-height: 1;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-align: center;\n  background-color: #999999;\n  border-radius: 10px;\n}\n.note-editor .badge:empty {\n  display: none;\n}\n.note-editor a.badge:hover,\n.note-editor a.badge:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.note-editor .btn .badge {\n  position: relative;\n  top: -1px;\n}\n.note-editor a.list-group-item.active > .badge,\n.note-editor .nav-pills > .active > a > .badge {\n  color: #428bca;\n  background-color: #ffffff;\n}\n.note-editor .nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n.note-editor .jumbotron {\n  padding: 30px;\n  margin-bottom: 30px;\n  font-size: 21px;\n  font-weight: 200;\n  line-height: 2.1428571435;\n  color: inherit;\n  background-color: #eeeeee;\n}\n.note-editor .jumbotron h1 {\n  line-height: 1;\n  color: inherit;\n}\n.note-editor .jumbotron p {\n  line-height: 1.4;\n}\n.container .note-editor .jumbotron {\n  border-radius: 6px;\n}\n@media screen and (min-width: 768px) {\n  .note-editor .jumbotron {\n    padding-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .note-editor .jumbotron {\n    padding-left: 60px;\n    padding-right: 60px;\n  }\n  .note-editor .jumbotron h1 {\n    font-size: 63px;\n  }\n}\n.note-editor .thumbnail {\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n  display: inline-block;\n  max-width: 100%;\n  height: auto;\n  display: block;\n  margin-bottom: 20px;\n}\n.note-editor .thumbnail > img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n.note-editor a.thumbnail:hover,\n.note-editor a.thumbnail:focus,\n.note-editor a.thumbnail.active {\n  border-color: #428bca;\n}\n.note-editor .thumbnail > img {\n  margin-left: auto;\n  margin-right: auto;\n}\n.note-editor .thumbnail .caption {\n  padding: 9px;\n  color: #333333;\n}\n.note-editor .alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.note-editor .alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n.note-editor .alert .alert-link {\n  font-weight: bold;\n}\n.note-editor .alert > p,\n.note-editor .alert > ul {\n  margin-bottom: 0;\n}\n.note-editor .alert > p + p {\n  margin-top: 5px;\n}\n.note-editor .alert-dismissable {\n  padding-right: 35px;\n}\n.note-editor .alert-dismissable .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n.note-editor .alert-success {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n  color: #468847;\n}\n.note-editor .alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.note-editor .alert-success .alert-link {\n  color: #356635;\n}\n.note-editor .alert-info {\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n  color: #3a87ad;\n}\n.note-editor .alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.note-editor .alert-info .alert-link {\n  color: #2d6987;\n}\n.note-editor .alert-warning {\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n  color: #c09853;\n}\n.note-editor .alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.note-editor .alert-warning .alert-link {\n  color: #a47e3c;\n}\n.note-editor .alert-danger {\n  background-color: #f2dede;\n  border-color: #ebccd1;\n  color: #b94a48;\n}\n.note-editor .alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n.note-editor .alert-danger .alert-link {\n  color: #953b39;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@-moz-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 0 0;\n  }\n  to {\n    background-position: 40px 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.note-editor .progress {\n  overflow: hidden;\n  height: 20px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.note-editor .progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #ffffff;\n  text-align: center;\n  background-color: #428bca;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width 0.6s ease;\n  transition: width 0.6s ease;\n}\n.note-editor .progress-striped .progress-bar {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 40px 40px;\n}\n.note-editor .progress.active .progress-bar {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n  -moz-animation: progress-bar-stripes 2s linear infinite;\n  -ms-animation: progress-bar-stripes 2s linear infinite;\n  -o-animation: progress-bar-stripes 2s linear infinite;\n  animation: progress-bar-stripes 2s linear infinite;\n}\n.note-editor .progress-bar-success {\n  background-color: #5cb85c;\n}\n.progress-striped .note-editor .progress-bar-success {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.note-editor .progress-bar-info {\n  background-color: #5bc0de;\n}\n.progress-striped .note-editor .progress-bar-info {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.note-editor .progress-bar-warning {\n  background-color: #f0ad4e;\n}\n.progress-striped .note-editor .progress-bar-warning {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.note-editor .progress-bar-danger {\n  background-color: #d9534f;\n}\n.progress-striped .note-editor .progress-bar-danger {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.note-editor .media,\n.note-editor .media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n.note-editor .media,\n.note-editor .media .media {\n  margin-top: 15px;\n}\n.note-editor .media:first-child {\n  margin-top: 0;\n}\n.note-editor .media-object {\n  display: block;\n}\n.note-editor .media-heading {\n  margin: 0 0 5px;\n}\n.note-editor .media > .pull-left {\n  margin-right: 10px;\n}\n.note-editor .media > .pull-right {\n  margin-left: 10px;\n}\n.note-editor .media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.note-editor .list-group {\n  margin-bottom: 20px;\n  padding-left: 0;\n}\n.note-editor .list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\n.note-editor .list-group-item:first-child {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n}\n.note-editor .list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.note-editor .list-group-item > .badge {\n  float: right;\n}\n.note-editor .list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n.note-editor a.list-group-item {\n  color: #555555;\n}\n.note-editor a.list-group-item .list-group-item-heading {\n  color: #333333;\n}\n.note-editor a.list-group-item:hover,\n.note-editor a.list-group-item:focus {\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.note-editor a.list-group-item.active,\n.note-editor a.list-group-item.active:hover,\n.note-editor a.list-group-item.active:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n.note-editor a.list-group-item.active .list-group-item-heading,\n.note-editor a.list-group-item.active:hover .list-group-item-heading,\n.note-editor a.list-group-item.active:focus .list-group-item-heading {\n  color: inherit;\n}\n.note-editor a.list-group-item.active .list-group-item-text,\n.note-editor a.list-group-item.active:hover .list-group-item-text,\n.note-editor a.list-group-item.active:focus .list-group-item-text {\n  color: #e1edf7;\n}\n.note-editor .list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.note-editor .list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n.note-editor .panel {\n  margin-bottom: 20px;\n  background-color: #ffffff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.note-editor .panel-body {\n  padding: 15px;\n}\n.note-editor .panel-body:before,\n.note-editor .panel-body:after {\n  content: \" \";\n  /* 1 */\n\n  display: table;\n  /* 2 */\n\n}\n.note-editor .panel-body:after {\n  clear: both;\n}\n.note-editor .panel-body:before,\n.note-editor .panel-body:after {\n  content: \" \";\n  /* 1 */\n\n  display: table;\n  /* 2 */\n\n}\n.note-editor .panel-body:after {\n  clear: both;\n}\n.note-editor .panel > .list-group {\n  margin-bottom: 0;\n}\n.note-editor .panel > .list-group .list-group-item {\n  border-width: 1px 0;\n}\n.note-editor .panel > .list-group .list-group-item:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.note-editor .panel > .list-group .list-group-item:last-child {\n  border-bottom: 0;\n}\n.note-editor .panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.note-editor .panel > .table,\n.note-editor .panel > .table-responsive {\n  margin-bottom: 0;\n}\n.note-editor .panel > .panel-body + .table,\n.note-editor .panel > .panel-body + .table-responsive {\n  border-top: 1px solid #dddddd;\n}\n.note-editor .panel > .table-bordered,\n.note-editor .panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n.note-editor .panel > .table-bordered > thead > tr > th:first-child,\n.note-editor .panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.note-editor .panel > .table-bordered > tbody > tr > th:first-child,\n.note-editor .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.note-editor .panel > .table-bordered > tfoot > tr > th:first-child,\n.note-editor .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.note-editor .panel > .table-bordered > thead > tr > td:first-child,\n.note-editor .panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.note-editor .panel > .table-bordered > tbody > tr > td:first-child,\n.note-editor .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.note-editor .panel > .table-bordered > tfoot > tr > td:first-child,\n.note-editor .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n.note-editor .panel > .table-bordered > thead > tr > th:last-child,\n.note-editor .panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.note-editor .panel > .table-bordered > tbody > tr > th:last-child,\n.note-editor .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.note-editor .panel > .table-bordered > tfoot > tr > th:last-child,\n.note-editor .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.note-editor .panel > .table-bordered > thead > tr > td:last-child,\n.note-editor .panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.note-editor .panel > .table-bordered > tbody > tr > td:last-child,\n.note-editor .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.note-editor .panel > .table-bordered > tfoot > tr > td:last-child,\n.note-editor .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n.note-editor .panel > .table-bordered > thead > tr:last-child > th,\n.note-editor .panel > .table-responsive > .table-bordered > thead > tr:last-child > th,\n.note-editor .panel > .table-bordered > tbody > tr:last-child > th,\n.note-editor .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.note-editor .panel > .table-bordered > tfoot > tr:last-child > th,\n.note-editor .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n.note-editor .panel > .table-bordered > thead > tr:last-child > td,\n.note-editor .panel > .table-responsive > .table-bordered > thead > tr:last-child > td,\n.note-editor .panel > .table-bordered > tbody > tr:last-child > td,\n.note-editor .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.note-editor .panel > .table-bordered > tfoot > tr:last-child > td,\n.note-editor .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n  border-bottom: 0;\n}\n.note-editor .panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.note-editor .panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n}\n.note-editor .panel-title > a {\n  color: inherit;\n}\n.note-editor .panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #dddddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.note-editor .panel-group .panel {\n  margin-bottom: 0;\n  border-radius: 4px;\n  overflow: hidden;\n}\n.note-editor .panel-group .panel + .panel {\n  margin-top: 5px;\n}\n.note-editor .panel-group .panel-heading {\n  border-bottom: 0;\n}\n.note-editor .panel-group .panel-heading + .panel-collapse .panel-body {\n  border-top: 1px solid #dddddd;\n}\n.note-editor .panel-group .panel-footer {\n  border-top: 0;\n}\n.note-editor .panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #dddddd;\n}\n.note-editor .panel-default {\n  border-color: #dddddd;\n}\n.note-editor .panel-default > .panel-heading {\n  color: #333333;\n  background-color: #f5f5f5;\n  border-color: #dddddd;\n}\n.note-editor .panel-default > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #dddddd;\n}\n.note-editor .panel-default > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #dddddd;\n}\n.note-editor .panel-primary {\n  border-color: #428bca;\n}\n.note-editor .panel-primary > .panel-heading {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n.note-editor .panel-primary > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #428bca;\n}\n.note-editor .panel-primary > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #428bca;\n}\n.note-editor .panel-success {\n  border-color: #d6e9c6;\n}\n.note-editor .panel-success > .panel-heading {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.note-editor .panel-success > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #d6e9c6;\n}\n.note-editor .panel-success > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n.note-editor .panel-warning {\n  border-color: #faebcc;\n}\n.note-editor .panel-warning > .panel-heading {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.note-editor .panel-warning > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #faebcc;\n}\n.note-editor .panel-warning > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #faebcc;\n}\n.note-editor .panel-danger {\n  border-color: #ebccd1;\n}\n.note-editor .panel-danger > .panel-heading {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.note-editor .panel-danger > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #ebccd1;\n}\n.note-editor .panel-danger > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #ebccd1;\n}\n.note-editor .panel-info {\n  border-color: #bce8f1;\n}\n.note-editor .panel-info > .panel-heading {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.note-editor .panel-info > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #bce8f1;\n}\n.note-editor .panel-info > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #bce8f1;\n}\n.note-editor .well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.note-editor .well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n.note-editor .well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n.note-editor .well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n.note-editor .close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000000;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.2;\n  filter: alpha(opacity=20);\n}\n.note-editor .close:hover,\n.note-editor .close:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\nbutton.note-editor .close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n.modal-open {\n  overflow: hidden;\n}\n.modal {\n  display: none;\n  overflow: auto;\n  overflow-y: scroll;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n}\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n  -ms-transform: translate(0, -25%);\n  transform: translate(0, -25%);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n  -moz-transition: -moz-transform 0.3s ease-out;\n  -o-transition: -o-transform 0.3s ease-out;\n  transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n  -ms-transform: translate(0, 0);\n  transform: translate(0, 0);\n}\n.modal-dialog {\n  margin-left: auto;\n  margin-right: auto;\n  width: auto;\n  padding: 10px;\n  z-index: 1050;\n}\n.modal-content {\n  position: relative;\n  background-color: #ffffff;\n  border: 1px solid #999999;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box;\n  outline: none;\n}\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n  background-color: #000000;\n}\n.modal-backdrop.fade {\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n.modal-header {\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n  min-height: 16.428571429px;\n}\n.modal-header .close {\n  margin-top: -2px;\n}\n.modal-title {\n  margin: 0;\n  line-height: 1.428571429;\n}\n.modal-body {\n  position: relative;\n  padding: 20px;\n}\n.modal-footer {\n  margin-top: 15px;\n  padding: 19px 20px 20px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n.modal-footer:before,\n.modal-footer:after {\n  content: \" \";\n  /* 1 */\n\n  display: table;\n  /* 2 */\n\n}\n.modal-footer:after {\n  clear: both;\n}\n.modal-footer:before,\n.modal-footer:after {\n  content: \" \";\n  /* 1 */\n\n  display: table;\n  /* 2 */\n\n}\n.modal-footer:after {\n  clear: both;\n}\n.modal-footer .btn + .btn {\n  margin-left: 5px;\n  margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n@media screen and (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    padding-top: 30px;\n    padding-bottom: 30px;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1030;\n  display: block;\n  visibility: visible;\n  font-size: 12px;\n  line-height: 1.4;\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n.tooltip.in {\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n.tooltip.top {\n  margin-top: -3px;\n  padding: 5px 0;\n}\n.tooltip.right {\n  margin-left: 3px;\n  padding: 0 5px;\n}\n.tooltip.bottom {\n  margin-top: 3px;\n  padding: 5px 0;\n}\n.tooltip.left {\n  margin-left: -3px;\n  padding: 0 5px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #ffffff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000000;\n  border-radius: 4px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000000;\n}\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000000;\n}\n.tooltip.top-right .tooltip-arrow {\n  bottom: 0;\n  right: 5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1010;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  text-align: left;\n  background-color: #ffffff;\n  background-clip: padding-box;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  white-space: normal;\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  margin: 0;\n  padding: 8px 14px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover .arrow,\n.popover .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover .arrow {\n  border-width: 11px;\n}\n.popover .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n.popover.top .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-width: 0;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  bottom: -11px;\n}\n.popover.top .arrow:after {\n  content: \" \";\n  bottom: 1px;\n  margin-left: -10px;\n  border-bottom-width: 0;\n  border-top-color: #ffffff;\n}\n.popover.right .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-left-width: 0;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right .arrow:after {\n  content: \" \";\n  left: 1px;\n  bottom: -10px;\n  border-left-width: 0;\n  border-right-color: #ffffff;\n}\n.popover.bottom .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  top: -11px;\n}\n.popover.bottom .arrow:after {\n  content: \" \";\n  top: 1px;\n  margin-left: -10px;\n  border-top-width: 0;\n  border-bottom-color: #ffffff;\n}\n.popover.left .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left .arrow:after {\n  content: \" \";\n  right: 1px;\n  border-right-width: 0;\n  border-left-color: #ffffff;\n  bottom: -10px;\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n}\n.carousel-inner > .item {\n  display: none;\n  position: relative;\n  -webkit-transition: 0.6s ease-in-out left;\n  transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n  line-height: 1;\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: 15%;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n  font-size: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-control.left {\n  background-image: -webkit-gradient(linear, 0% top, 100% top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001)));\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0%), color-stop(rgba(0, 0, 0, 0.0001) 100%));\n  background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n  left: auto;\n  right: 0;\n  background-image: -webkit-gradient(linear, 0% top, 100% top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5)));\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0%), color-stop(rgba(0, 0, 0, 0.5) 100%));\n  background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #ffffff;\n  text-decoration: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  margin-left: -10px;\n  font-family: serif;\n}\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  border: 1px solid #ffffff;\n  border-radius: 10px;\n  cursor: pointer;\n}\n.carousel-indicators .active {\n  margin: 0;\n  width: 12px;\n  height: 12px;\n  background-color: #ffffff;\n}\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n  text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicons-chevron-left,\n  .carousel-control .glyphicons-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    margin-left: -15px;\n    font-size: 30px;\n  }\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n.clearfix:before,\n.clearfix:after {\n  content: \" \";\n  /* 1 */\n\n  display: table;\n  /* 2 */\n\n}\n.clearfix:after {\n  clear: both;\n}\n.center-block {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n.affix {\n  position: fixed;\n}\n@-ms-viewport {\n  width: device-width;\n}\n.visible-xs,\ntr.visible-xs,\nth.visible-xs,\ntd.visible-xs {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-xs.visible-sm {\n    display: block !important;\n  }\n  tr.visible-xs.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-sm,\n  td.visible-xs.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-xs.visible-md {\n    display: block !important;\n  }\n  tr.visible-xs.visible-md {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-md,\n  td.visible-xs.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-xs.visible-lg {\n    display: block !important;\n  }\n  tr.visible-xs.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-lg,\n  td.visible-xs.visible-lg {\n    display: table-cell !important;\n  }\n}\n.visible-sm,\ntr.visible-sm,\nth.visible-sm,\ntd.visible-sm {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-sm.visible-xs {\n    display: block !important;\n  }\n  tr.visible-sm.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-xs,\n  td.visible-sm.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-sm.visible-md {\n    display: block !important;\n  }\n  tr.visible-sm.visible-md {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-md,\n  td.visible-sm.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-sm.visible-lg {\n    display: block !important;\n  }\n  tr.visible-sm.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-lg,\n  td.visible-sm.visible-lg {\n    display: table-cell !important;\n  }\n}\n.visible-md,\ntr.visible-md,\nth.visible-md,\ntd.visible-md {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-md.visible-xs {\n    display: block !important;\n  }\n  tr.visible-md.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-md.visible-xs,\n  td.visible-md.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-md.visible-sm {\n    display: block !important;\n  }\n  tr.visible-md.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-md.visible-sm,\n  td.visible-md.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-md.visible-lg {\n    display: block !important;\n  }\n  tr.visible-md.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-md.visible-lg,\n  td.visible-md.visible-lg {\n    display: table-cell !important;\n  }\n}\n.visible-lg,\ntr.visible-lg,\nth.visible-lg,\ntd.visible-lg {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-lg.visible-xs {\n    display: block !important;\n  }\n  tr.visible-lg.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-xs,\n  td.visible-lg.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-lg.visible-sm {\n    display: block !important;\n  }\n  tr.visible-lg.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-sm,\n  td.visible-lg.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-lg.visible-md {\n    display: block !important;\n  }\n  tr.visible-lg.visible-md {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-md,\n  td.visible-lg.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n.hidden-xs {\n  display: block !important;\n}\ntr.hidden-xs {\n  display: table-row !important;\n}\nth.hidden-xs,\ntd.hidden-xs {\n  display: table-cell !important;\n}\n@media (max-width: 767px) {\n  .hidden-xs,\n  tr.hidden-xs,\n  th.hidden-xs,\n  td.hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-xs.hidden-sm,\n  tr.hidden-xs.hidden-sm,\n  th.hidden-xs.hidden-sm,\n  td.hidden-xs.hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-xs.hidden-md,\n  tr.hidden-xs.hidden-md,\n  th.hidden-xs.hidden-md,\n  td.hidden-xs.hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-xs.hidden-lg,\n  tr.hidden-xs.hidden-lg,\n  th.hidden-xs.hidden-lg,\n  td.hidden-xs.hidden-lg {\n    display: none !important;\n  }\n}\n.hidden-sm {\n  display: block !important;\n}\ntr.hidden-sm {\n  display: table-row !important;\n}\nth.hidden-sm,\ntd.hidden-sm {\n  display: table-cell !important;\n}\n@media (max-width: 767px) {\n  .hidden-sm.hidden-xs,\n  tr.hidden-sm.hidden-xs,\n  th.hidden-sm.hidden-xs,\n  td.hidden-sm.hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm,\n  tr.hidden-sm,\n  th.hidden-sm,\n  td.hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-sm.hidden-md,\n  tr.hidden-sm.hidden-md,\n  th.hidden-sm.hidden-md,\n  td.hidden-sm.hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-sm.hidden-lg,\n  tr.hidden-sm.hidden-lg,\n  th.hidden-sm.hidden-lg,\n  td.hidden-sm.hidden-lg {\n    display: none !important;\n  }\n}\n.hidden-md {\n  display: block !important;\n}\ntr.hidden-md {\n  display: table-row !important;\n}\nth.hidden-md,\ntd.hidden-md {\n  display: table-cell !important;\n}\n@media (max-width: 767px) {\n  .hidden-md.hidden-xs,\n  tr.hidden-md.hidden-xs,\n  th.hidden-md.hidden-xs,\n  td.hidden-md.hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-md.hidden-sm,\n  tr.hidden-md.hidden-sm,\n  th.hidden-md.hidden-sm,\n  td.hidden-md.hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md,\n  tr.hidden-md,\n  th.hidden-md,\n  td.hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-md.hidden-lg,\n  tr.hidden-md.hidden-lg,\n  th.hidden-md.hidden-lg,\n  td.hidden-md.hidden-lg {\n    display: none !important;\n  }\n}\n.hidden-lg {\n  display: block !important;\n}\ntr.hidden-lg {\n  display: table-row !important;\n}\nth.hidden-lg,\ntd.hidden-lg {\n  display: table-cell !important;\n}\n@media (max-width: 767px) {\n  .hidden-lg.hidden-xs,\n  tr.hidden-lg.hidden-xs,\n  th.hidden-lg.hidden-xs,\n  td.hidden-lg.hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-lg.hidden-sm,\n  tr.hidden-lg.hidden-sm,\n  th.hidden-lg.hidden-sm,\n  td.hidden-lg.hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-lg.hidden-md,\n  tr.hidden-lg.hidden-md,\n  th.hidden-lg.hidden-md,\n  td.hidden-lg.hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-lg,\n  tr.hidden-lg,\n  th.hidden-lg,\n  td.hidden-lg {\n    display: none !important;\n  }\n}\n.visible-print,\ntr.visible-print,\nth.visible-print,\ntd.visible-print {\n  display: none !important;\n}\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n  .hidden-print,\n  tr.hidden-print,\n  th.hidden-print,\n  td.hidden-print {\n    display: none !important;\n  }\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/summernote/summernote.css",
    "content": ".note-editor {\n    height: 300px;\n}\n\n.note-editor .note-dropzone {\n    position: absolute;\n    z-index: 1;\n    display: none;\n    color: #87cefa;\n    background-color: white;\n    border: 2px dashed #87cefa;\n    opacity: .95;\n    pointer-event: none\n}\n\n.note-editor .note-dropzone .note-dropzone-message {\n    display: table-cell;\n    font-size: 28px;\n    font-weight: bold;\n    text-align: center;\n    vertical-align: middle\n}\n\n.note-editor .note-dropzone.hover {\n    color: #098ddf;\n    border: 2px dashed #098ddf\n}\n\n.note-editor.dragover .note-dropzone {\n    display: table\n}\n\n.note-editor.fullscreen {\n    position: fixed;\n    top: 0;\n    left: 0;\n    z-index: 1050;\n    width: 100%\n}\n\n.note-editor.fullscreen .note-editable {\n    background-color: white\n}\n\n.note-editor.fullscreen .note-resizebar {\n    display: none\n}\n\n.note-editor.codeview .note-editable {\n    display: none\n}\n\n.note-editor.codeview .note-codable {\n    display: block\n}\n\n.note-editor .note-toolbar {\n    padding-bottom: 5px;\n    padding-left: 10px;\n    padding-top: 5px;\n    margin: 0;\n    background-color: #f5f5f5;\n    border-bottom: 1px solid #E7EAEC\n}\n\n.note-editor .note-toolbar > .btn-group {\n    margin-top: 5px;\n    margin-right: 5px;\n    margin-left: 0\n}\n\n.note-editor .note-toolbar .note-table .dropdown-menu {\n    min-width: 0;\n    padding: 5px\n}\n\n.note-editor .note-toolbar .note-table .dropdown-menu .note-dimension-picker {\n    font-size: 18px\n}\n\n.note-editor .note-toolbar .note-table .dropdown-menu .note-dimension-picker .note-dimension-picker-mousecatcher {\n    position: absolute !important;\n    z-index: 3;\n    width: 10em;\n    height: 10em;\n    cursor: pointer\n}\n\n.note-editor .note-toolbar .note-table .dropdown-menu .note-dimension-picker .note-dimension-picker-unhighlighted {\n    position: relative !important;\n    z-index: 1;\n    width: 5em;\n    height: 5em;\n    background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC') repeat\n}\n\n.note-editor .note-toolbar .note-table .dropdown-menu .note-dimension-picker .note-dimension-picker-highlighted {\n    position: absolute !important;\n    z-index: 2;\n    width: 1em;\n    height: 1em;\n    background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC') repeat\n}\n\n.note-editor .note-toolbar .note-style h1, .note-editor .note-toolbar .note-style h2, .note-editor .note-toolbar .note-style h3, .note-editor .note-toolbar .note-style h4, .note-editor .note-toolbar .note-style h5, .note-editor .note-toolbar .note-style h6, .note-editor .note-toolbar .note-style blockquote {\n    margin: 0\n}\n\n.note-editor .note-toolbar .note-color .dropdown-toggle {\n    width: 20px;\n    padding-left: 5px\n}\n\n.note-editor .note-toolbar .note-color .dropdown-menu {\n    min-width: 290px\n}\n\n.note-editor .note-toolbar .note-color .dropdown-menu .btn-group {\n    margin: 0\n}\n\n.note-editor .note-toolbar .note-color .dropdown-menu .btn-group:first-child {\n    margin: 0 5px\n}\n\n.note-editor .note-toolbar .note-color .dropdown-menu .btn-group .note-palette-title {\n    margin: 2px 7px;\n    font-size: 12px;\n    text-align: center;\n    border-bottom: 1px solid #eee\n}\n\n.note-editor .note-toolbar .note-color .dropdown-menu .btn-group .note-color-reset {\n    padding: 0 3px;\n    margin: 5px;\n    font-size: 12px;\n    cursor: pointer;\n    -webkit-border-radius: 5px;\n    -moz-border-radius: 5px;\n    border-radius: 5px\n}\n\n.note-editor .note-toolbar .note-color .dropdown-menu .btn-group .note-color-reset:hover {\n    background: #eee\n}\n\n.note-editor .note-toolbar .note-para .dropdown-menu {\n    min-width: 216px;\n    padding: 5px\n}\n\n.note-editor .note-toolbar .note-para .dropdown-menu > div:first-child {\n    margin-right: 5px\n}\n\n.note-editor .note-statusbar {\n    background-color: #f5f5f5\n}\n\n.note-editor .note-statusbar .note-resizebar {\n    width: 100%;\n    height: 8px;\n    cursor: s-resize;\n    border-top: 1px solid #a9a9a9\n}\n\n.note-editor .note-statusbar .note-resizebar .note-icon-bar {\n    width: 20px;\n    margin: 1px auto;\n    border-top: 1px solid #a9a9a9\n}\n\n.note-editor .note-popover .popover {\n    max-width: none\n}\n\n.note-editor .note-popover .popover .popover-content {\n    padding: 5px\n}\n\n.note-editor .note-popover .popover .popover-content a {\n    display: inline-block;\n    max-width: 200px;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    vertical-align: middle\n}\n\n.note-editor .note-popover .popover .popover-content .btn-group + .btn-group {\n    margin-left: 5px\n}\n\n.note-editor .note-popover .popover .arrow {\n    left: 20px\n}\n\n.note-editor .note-handle .note-control-selection {\n    position: absolute;\n    display: none;\n    border: 1px solid black\n}\n\n.note-editor .note-handle .note-control-selection > div {\n    position: absolute\n}\n\n.note-editor .note-handle .note-control-selection .note-control-selection-bg {\n    width: 100%;\n    height: 100%;\n    background-color: black;\n    -webkit-opacity: .3;\n    -khtml-opacity: .3;\n    -moz-opacity: .3;\n    opacity: .3;\n    -ms-filter: alpha(opacity=30);\n    filter: alpha(opacity=30)\n}\n\n.note-editor .note-handle .note-control-selection .note-control-handle {\n    width: 7px;\n    height: 7px;\n    border: 1px solid black\n}\n\n.note-editor .note-handle .note-control-selection .note-control-holder {\n    width: 7px;\n    height: 7px;\n    border: 1px solid black\n}\n\n.note-editor .note-handle .note-control-selection .note-control-sizing {\n    width: 7px;\n    height: 7px;\n    background-color: white;\n    border: 1px solid black\n}\n\n.note-editor .note-handle .note-control-selection .note-control-nw {\n    top: -5px;\n    left: -5px;\n    border-right: 0;\n    border-bottom: 0\n}\n\n.note-editor .note-handle .note-control-selection .note-control-ne {\n    top: -5px;\n    right: -5px;\n    border-bottom: 0;\n    border-left: none\n}\n\n.note-editor .note-handle .note-control-selection .note-control-sw {\n    bottom: -5px;\n    left: -5px;\n    border-top: 0;\n    border-right: 0\n}\n\n.note-editor .note-handle .note-control-selection .note-control-se {\n    right: -5px;\n    bottom: -5px;\n    cursor: se-resize\n}\n\n.note-editor .note-handle .note-control-selection .note-control-selection-info {\n    right: 0;\n    bottom: 0;\n    padding: 5px;\n    margin: 5px;\n    font-size: 12px;\n    color: white;\n    background-color: black;\n    -webkit-border-radius: 5px;\n    -moz-border-radius: 5px;\n    border-radius: 5px;\n    -webkit-opacity: .7;\n    -khtml-opacity: .7;\n    -moz-opacity: .7;\n    opacity: .7;\n    -ms-filter: alpha(opacity=70);\n    filter: alpha(opacity=70)\n}\n\n.note-editor .note-dialog > div {\n    display: none\n}\n\n.note-editor .note-dialog .note-image-dialog .note-dropzone {\n    min-height: 100px;\n    margin-bottom: 10px;\n    font-size: 30px;\n    line-height: 4;\n    color: lightgray;\n    text-align: center;\n    border: 4px dashed lightgray\n}\n\n.note-editor .note-dialog .note-help-dialog {\n    font-size: 12px;\n    color: #ccc;\n    background: transparent;\n    background-color: #222 !important;\n    border: 0;\n    -webkit-opacity: .9;\n    -khtml-opacity: .9;\n    -moz-opacity: .9;\n    opacity: .9;\n    -ms-filter: alpha(opacity=90);\n    filter: alpha(opacity=90)\n}\n\n.note-editor .note-dialog .note-help-dialog .modal-content {\n    background: transparent;\n    border: 1px solid white;\n    -webkit-border-radius: 5px;\n    -moz-border-radius: 5px;\n    border-radius: 5px;\n    -webkit-box-shadow: none;\n    -moz-box-shadow: none;\n    box-shadow: none\n}\n\n.note-editor .note-dialog .note-help-dialog a {\n    font-size: 12px;\n    color: white\n}\n\n.note-editor .note-dialog .note-help-dialog .title {\n    padding-bottom: 5px;\n    font-size: 14px;\n    font-weight: bold;\n    color: white;\n    border-bottom: white 1px solid\n}\n\n.note-editor .note-dialog .note-help-dialog .modal-close {\n    font-size: 14px;\n    color: #dd0;\n    cursor: pointer\n}\n\n.note-editor .note-dialog .note-help-dialog .note-shortcut-layout {\n    width: 100%\n}\n\n.note-editor .note-dialog .note-help-dialog .note-shortcut-layout td {\n    vertical-align: top\n}\n\n.note-editor .note-dialog .note-help-dialog .note-shortcut {\n    margin-top: 8px\n}\n\n.note-editor .note-dialog .note-help-dialog .note-shortcut th {\n    font-size: 13px;\n    color: #dd0;\n    text-align: left\n}\n\n.note-editor .note-dialog .note-help-dialog .note-shortcut td:first-child {\n    min-width: 110px;\n    padding-right: 10px;\n    font-family: \"Courier New\";\n    color: #dd0;\n    text-align: right\n}\n\n.note-editor .note-editable {\n    padding: 20px;\n    overflow: auto;\n    outline: 0\n}\n\n.note-editor .note-editable[contenteditable=\"false\"] {\n    background-color: #e5e5e5\n}\n\n.note-editor .note-codable {\n    display: none;\n    width: 100%;\n    padding: 10px;\n    margin-bottom: 0;\n    font-family: Menlo, Monaco, monospace, sans-serif;\n    font-size: 14px;\n    color: #ccc;\n    background-color: #222;\n    border: 0;\n    -webkit-border-radius: 0;\n    -moz-border-radius: 0;\n    border-radius: 0;\n    box-shadow: none;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    -ms-box-sizing: border-box;\n    box-sizing: border-box;\n    resize: none\n}\n\n.note-editor .dropdown-menu {\n    min-width: 90px\n}\n\n.note-editor .dropdown-menu.right {\n    right: 0;\n    left: auto\n}\n\n.note-editor .dropdown-menu.right::before {\n    right: 9px;\n    left: auto !important\n}\n\n.note-editor .dropdown-menu.right::after {\n    right: 10px;\n    left: auto !important\n}\n\n.note-editor .dropdown-menu li a i {\n    color: deepskyblue;\n    visibility: hidden\n}\n\n.note-editor .dropdown-menu li a.checked i {\n    visibility: visible\n}\n\n.note-editor .note-fontsize-10 {\n    font-size: 10px\n}\n\n.note-editor .note-color-palette {\n    line-height: 1\n}\n\n.note-editor .note-color-palette div .note-color-btn {\n    width: 17px;\n    height: 17px;\n    padding: 0;\n    margin: 0;\n    border: 1px solid #fff\n}\n\n.note-editor .note-color-palette div .note-color-btn:hover {\n    border: 1px solid #000\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/sweetalert/sweetalert.css",
    "content": "body.stop-scrolling {\n  height: 100%;\n  overflow: hidden; }\n\n.sweet-overlay {\n  background-color: black;\n  /* IE8 */\n  -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=40)\";\n  /* IE8 */\n  background-color: rgba(0, 0, 0, 0.4);\n  position: fixed;\n  left: 0;\n  right: 0;\n  top: 0;\n  bottom: 0;\n  display: none;\n  z-index: 10000; }\n\n.sweet-alert {\n  background-color: white;\n  font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  width: 478px;\n  padding: 17px;\n  border-radius: 5px;\n  text-align: center;\n  position: fixed;\n  left: 50%;\n  top: 50%;\n  margin-left: -256px;\n  margin-top: -200px;\n  overflow: hidden;\n  display: none;\n  z-index: 99999; }\n  @media all and (max-width: 540px) {\n    .sweet-alert {\n      width: auto;\n      margin-left: 0;\n      margin-right: 0;\n      left: 15px;\n      right: 15px; } }\n  .sweet-alert h2 {\n    color: #575757;\n    font-size: 30px;\n    text-align: center;\n    font-weight: 600;\n    text-transform: none;\n    position: relative;\n    margin: 25px 0;\n    padding: 0;\n    line-height: 40px;\n    display: block; }\n  .sweet-alert p {\n    color: #797979;\n    font-size: 16px;\n    text-align: center;\n    font-weight: 300;\n    position: relative;\n    text-align: inherit;\n    float: none;\n    margin: 0;\n    padding: 0;\n    line-height: normal; }\n  .sweet-alert fieldset {\n    border: none;\n    position: relative; }\n  .sweet-alert .sa-error-container {\n    background-color: #f1f1f1;\n    margin-left: -17px;\n    margin-right: -17px;\n    overflow: hidden;\n    padding: 0 10px;\n    max-height: 0;\n    webkit-transition: padding 0.15s, max-height 0.15s;\n    transition: padding 0.15s, max-height 0.15s; }\n    .sweet-alert .sa-error-container.show {\n      padding: 10px 0;\n      max-height: 100px;\n      webkit-transition: padding 0.2s, max-height 0.2s;\n      transition: padding 0.25s, max-height 0.25s; }\n    .sweet-alert .sa-error-container .icon {\n      display: inline-block;\n      width: 24px;\n      height: 24px;\n      border-radius: 50%;\n      background-color: #ea7d7d;\n      color: white;\n      line-height: 24px;\n      text-align: center;\n      margin-right: 3px; }\n    .sweet-alert .sa-error-container p {\n      display: inline-block; }\n  .sweet-alert .sa-input-error {\n    position: absolute;\n    top: 29px;\n    right: 26px;\n    width: 20px;\n    height: 20px;\n    opacity: 0;\n    -webkit-transform: scale(0.5);\n    transform: scale(0.5);\n    -webkit-transform-origin: 50% 50%;\n    transform-origin: 50% 50%;\n    -webkit-transition: all 0.1s;\n    transition: all 0.1s; }\n    .sweet-alert .sa-input-error::before, .sweet-alert .sa-input-error::after {\n      content: \"\";\n      width: 20px;\n      height: 6px;\n      background-color: #f06e57;\n      border-radius: 3px;\n      position: absolute;\n      top: 50%;\n      margin-top: -4px;\n      left: 50%;\n      margin-left: -9px; }\n    .sweet-alert .sa-input-error::before {\n      -webkit-transform: rotate(-45deg);\n      transform: rotate(-45deg); }\n    .sweet-alert .sa-input-error::after {\n      -webkit-transform: rotate(45deg);\n      transform: rotate(45deg); }\n    .sweet-alert .sa-input-error.show {\n      opacity: 1;\n      -webkit-transform: scale(1);\n      transform: scale(1); }\n  .sweet-alert input {\n    width: 100%;\n    box-sizing: border-box;\n    border-radius: 3px;\n    border: 1px solid #d7d7d7;\n    height: 43px;\n    margin-top: 10px;\n    margin-bottom: 17px;\n    font-size: 18px;\n    box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.06);\n    padding: 0 12px;\n    display: none;\n    -webkit-transition: all 0.3s;\n    transition: all 0.3s; }\n    .sweet-alert input:focus {\n      outline: none;\n      box-shadow: 0px 0px 3px #c4e6f5;\n      border: 1px solid #b4dbed; }\n      .sweet-alert input:focus::-moz-placeholder {\n        transition: opacity 0.3s 0.03s ease;\n        opacity: 0.5; }\n      .sweet-alert input:focus:-ms-input-placeholder {\n        transition: opacity 0.3s 0.03s ease;\n        opacity: 0.5; }\n      .sweet-alert input:focus::-webkit-input-placeholder {\n        transition: opacity 0.3s 0.03s ease;\n        opacity: 0.5; }\n    .sweet-alert input::-moz-placeholder {\n      color: #bdbdbd; }\n    .sweet-alert input:-ms-input-placeholder {\n      color: #bdbdbd; }\n    .sweet-alert input::-webkit-input-placeholder {\n      color: #bdbdbd; }\n  .sweet-alert.show-input input {\n    display: block; }\n  .sweet-alert button {\n    background-color: #AEDEF4;\n    color: white;\n    border: none;\n    box-shadow: none;\n    font-size: 17px;\n    font-weight: 500;\n    -webkit-border-radius: 4px;\n    border-radius: 5px;\n    padding: 10px 32px;\n    margin: 26px 5px 0 5px;\n    cursor: pointer; }\n    .sweet-alert button:focus {\n      outline: none;\n      box-shadow: 0 0 2px rgba(128, 179, 235, 0.5), inset 0 0 0 1px rgba(0, 0, 0, 0.05); }\n    .sweet-alert button:hover {\n      background-color: #a1d9f2; }\n    .sweet-alert button:active {\n      background-color: #81ccee; }\n    .sweet-alert button.cancel {\n      background-color: #D0D0D0; }\n      .sweet-alert button.cancel:hover {\n        background-color: #c8c8c8; }\n      .sweet-alert button.cancel:active {\n        background-color: #b6b6b6; }\n      .sweet-alert button.cancel:focus {\n        box-shadow: rgba(197, 205, 211, 0.8) 0px 0px 2px, rgba(0, 0, 0, 0.0470588) 0px 0px 0px 1px inset !important; }\n    .sweet-alert button::-moz-focus-inner {\n      border: 0; }\n  .sweet-alert[data-has-cancel-button=false] button {\n    box-shadow: none !important; }\n  .sweet-alert[data-has-confirm-button=false][data-has-cancel-button=false] {\n    padding-bottom: 40px; }\n  .sweet-alert .sa-icon {\n    width: 80px;\n    height: 80px;\n    border: 4px solid gray;\n    -webkit-border-radius: 40px;\n    border-radius: 40px;\n    border-radius: 50%;\n    margin: 20px auto;\n    padding: 0;\n    position: relative;\n    box-sizing: content-box; }\n    .sweet-alert .sa-icon.sa-error {\n      border-color: #F27474; }\n      .sweet-alert .sa-icon.sa-error .sa-x-mark {\n        position: relative;\n        display: block; }\n      .sweet-alert .sa-icon.sa-error .sa-line {\n        position: absolute;\n        height: 5px;\n        width: 47px;\n        background-color: #F27474;\n        display: block;\n        top: 37px;\n        border-radius: 2px; }\n        .sweet-alert .sa-icon.sa-error .sa-line.sa-left {\n          -webkit-transform: rotate(45deg);\n          transform: rotate(45deg);\n          left: 17px; }\n        .sweet-alert .sa-icon.sa-error .sa-line.sa-right {\n          -webkit-transform: rotate(-45deg);\n          transform: rotate(-45deg);\n          right: 16px; }\n    .sweet-alert .sa-icon.sa-warning {\n      border-color: #F8BB86; }\n      .sweet-alert .sa-icon.sa-warning .sa-body {\n        position: absolute;\n        width: 5px;\n        height: 47px;\n        left: 50%;\n        top: 10px;\n        -webkit-border-radius: 2px;\n        border-radius: 2px;\n        margin-left: -2px;\n        background-color: #F8BB86; }\n      .sweet-alert .sa-icon.sa-warning .sa-dot {\n        position: absolute;\n        width: 7px;\n        height: 7px;\n        -webkit-border-radius: 50%;\n        border-radius: 50%;\n        margin-left: -3px;\n        left: 50%;\n        bottom: 10px;\n        background-color: #F8BB86; }\n    .sweet-alert .sa-icon.sa-info {\n      border-color: #C9DAE1; }\n      .sweet-alert .sa-icon.sa-info::before {\n        content: \"\";\n        position: absolute;\n        width: 5px;\n        height: 29px;\n        left: 50%;\n        bottom: 17px;\n        border-radius: 2px;\n        margin-left: -2px;\n        background-color: #C9DAE1; }\n      .sweet-alert .sa-icon.sa-info::after {\n        content: \"\";\n        position: absolute;\n        width: 7px;\n        height: 7px;\n        border-radius: 50%;\n        margin-left: -3px;\n        top: 19px;\n        background-color: #C9DAE1; }\n    .sweet-alert .sa-icon.sa-success {\n      border-color: #A5DC86; }\n      .sweet-alert .sa-icon.sa-success::before, .sweet-alert .sa-icon.sa-success::after {\n        content: '';\n        -webkit-border-radius: 40px;\n        border-radius: 40px;\n        border-radius: 50%;\n        position: absolute;\n        width: 60px;\n        height: 120px;\n        background: white;\n        -webkit-transform: rotate(45deg);\n        transform: rotate(45deg); }\n      .sweet-alert .sa-icon.sa-success::before {\n        -webkit-border-radius: 120px 0 0 120px;\n        border-radius: 120px 0 0 120px;\n        top: -7px;\n        left: -33px;\n        -webkit-transform: rotate(-45deg);\n        transform: rotate(-45deg);\n        -webkit-transform-origin: 60px 60px;\n        transform-origin: 60px 60px; }\n      .sweet-alert .sa-icon.sa-success::after {\n        -webkit-border-radius: 0 120px 120px 0;\n        border-radius: 0 120px 120px 0;\n        top: -11px;\n        left: 30px;\n        -webkit-transform: rotate(-45deg);\n        transform: rotate(-45deg);\n        -webkit-transform-origin: 0px 60px;\n        transform-origin: 0px 60px; }\n      .sweet-alert .sa-icon.sa-success .sa-placeholder {\n        width: 80px;\n        height: 80px;\n        border: 4px solid rgba(165, 220, 134, 0.2);\n        -webkit-border-radius: 40px;\n        border-radius: 40px;\n        border-radius: 50%;\n        box-sizing: content-box;\n        position: absolute;\n        left: -4px;\n        top: -4px;\n        z-index: 2; }\n      .sweet-alert .sa-icon.sa-success .sa-fix {\n        width: 5px;\n        height: 90px;\n        background-color: white;\n        position: absolute;\n        left: 28px;\n        top: 8px;\n        z-index: 1;\n        -webkit-transform: rotate(-45deg);\n        transform: rotate(-45deg); }\n      .sweet-alert .sa-icon.sa-success .sa-line {\n        height: 5px;\n        background-color: #A5DC86;\n        display: block;\n        border-radius: 2px;\n        position: absolute;\n        z-index: 2; }\n        .sweet-alert .sa-icon.sa-success .sa-line.sa-tip {\n          width: 25px;\n          left: 14px;\n          top: 46px;\n          -webkit-transform: rotate(45deg);\n          transform: rotate(45deg); }\n        .sweet-alert .sa-icon.sa-success .sa-line.sa-long {\n          width: 47px;\n          right: 8px;\n          top: 38px;\n          -webkit-transform: rotate(-45deg);\n          transform: rotate(-45deg); }\n    .sweet-alert .sa-icon.sa-custom {\n      background-size: contain;\n      border-radius: 0;\n      border: none;\n      background-position: center center;\n      background-repeat: no-repeat; }\n\n/*\n * Animations\n */\n@-webkit-keyframes showSweetAlert {\n  0% {\n    transform: scale(0.7);\n    -webkit-transform: scale(0.7); }\n  45% {\n    transform: scale(1.05);\n    -webkit-transform: scale(1.05); }\n  80% {\n    transform: scale(0.95);\n    -webkit-transform: scale(0.95); }\n  100% {\n    transform: scale(1);\n    -webkit-transform: scale(1); } }\n\n@keyframes showSweetAlert {\n  0% {\n    transform: scale(0.7);\n    -webkit-transform: scale(0.7); }\n  45% {\n    transform: scale(1.05);\n    -webkit-transform: scale(1.05); }\n  80% {\n    transform: scale(0.95);\n    -webkit-transform: scale(0.95); }\n  100% {\n    transform: scale(1);\n    -webkit-transform: scale(1); } }\n\n@-webkit-keyframes hideSweetAlert {\n  0% {\n    transform: scale(1);\n    -webkit-transform: scale(1); }\n  100% {\n    transform: scale(0.5);\n    -webkit-transform: scale(0.5); } }\n\n@keyframes hideSweetAlert {\n  0% {\n    transform: scale(1);\n    -webkit-transform: scale(1); }\n  100% {\n    transform: scale(0.5);\n    -webkit-transform: scale(0.5); } }\n\n@-webkit-keyframes slideFromTop {\n  0% {\n    top: 0%; }\n  100% {\n    top: 50%; } }\n\n@keyframes slideFromTop {\n  0% {\n    top: 0%; }\n  100% {\n    top: 50%; } }\n\n@-webkit-keyframes slideToTop {\n  0% {\n    top: 50%; }\n  100% {\n    top: 0%; } }\n\n@keyframes slideToTop {\n  0% {\n    top: 50%; }\n  100% {\n    top: 0%; } }\n\n@-webkit-keyframes slideFromBottom {\n  0% {\n    top: 70%; }\n  100% {\n    top: 50%; } }\n\n@keyframes slideFromBottom {\n  0% {\n    top: 70%; }\n  100% {\n    top: 50%; } }\n\n@-webkit-keyframes slideToBottom {\n  0% {\n    top: 50%; }\n  100% {\n    top: 70%; } }\n\n@keyframes slideToBottom {\n  0% {\n    top: 50%; }\n  100% {\n    top: 70%; } }\n\n.showSweetAlert[data-animation=pop] {\n  -webkit-animation: showSweetAlert 0.3s;\n  animation: showSweetAlert 0.3s; }\n\n.showSweetAlert[data-animation=none] {\n  -webkit-animation: none;\n  animation: none; }\n\n.showSweetAlert[data-animation=slide-from-top] {\n  -webkit-animation: slideFromTop 0.3s;\n  animation: slideFromTop 0.3s; }\n\n.showSweetAlert[data-animation=slide-from-bottom] {\n  -webkit-animation: slideFromBottom 0.3s;\n  animation: slideFromBottom 0.3s; }\n\n.hideSweetAlert[data-animation=pop] {\n  -webkit-animation: hideSweetAlert 0.2s;\n  animation: hideSweetAlert 0.2s; }\n\n.hideSweetAlert[data-animation=none] {\n  -webkit-animation: none;\n  animation: none; }\n\n.hideSweetAlert[data-animation=slide-from-top] {\n  -webkit-animation: slideToTop 0.4s;\n  animation: slideToTop 0.4s; }\n\n.hideSweetAlert[data-animation=slide-from-bottom] {\n  -webkit-animation: slideToBottom 0.3s;\n  animation: slideToBottom 0.3s; }\n\n@-webkit-keyframes animateSuccessTip {\n  0% {\n    width: 0;\n    left: 1px;\n    top: 19px; }\n  54% {\n    width: 0;\n    left: 1px;\n    top: 19px; }\n  70% {\n    width: 50px;\n    left: -8px;\n    top: 37px; }\n  84% {\n    width: 17px;\n    left: 21px;\n    top: 48px; }\n  100% {\n    width: 25px;\n    left: 14px;\n    top: 45px; } }\n\n@keyframes animateSuccessTip {\n  0% {\n    width: 0;\n    left: 1px;\n    top: 19px; }\n  54% {\n    width: 0;\n    left: 1px;\n    top: 19px; }\n  70% {\n    width: 50px;\n    left: -8px;\n    top: 37px; }\n  84% {\n    width: 17px;\n    left: 21px;\n    top: 48px; }\n  100% {\n    width: 25px;\n    left: 14px;\n    top: 45px; } }\n\n@-webkit-keyframes animateSuccessLong {\n  0% {\n    width: 0;\n    right: 46px;\n    top: 54px; }\n  65% {\n    width: 0;\n    right: 46px;\n    top: 54px; }\n  84% {\n    width: 55px;\n    right: 0px;\n    top: 35px; }\n  100% {\n    width: 47px;\n    right: 8px;\n    top: 38px; } }\n\n@keyframes animateSuccessLong {\n  0% {\n    width: 0;\n    right: 46px;\n    top: 54px; }\n  65% {\n    width: 0;\n    right: 46px;\n    top: 54px; }\n  84% {\n    width: 55px;\n    right: 0px;\n    top: 35px; }\n  100% {\n    width: 47px;\n    right: 8px;\n    top: 38px; } }\n\n@-webkit-keyframes rotatePlaceholder {\n  0% {\n    transform: rotate(-45deg);\n    -webkit-transform: rotate(-45deg); }\n  5% {\n    transform: rotate(-45deg);\n    -webkit-transform: rotate(-45deg); }\n  12% {\n    transform: rotate(-405deg);\n    -webkit-transform: rotate(-405deg); }\n  100% {\n    transform: rotate(-405deg);\n    -webkit-transform: rotate(-405deg); } }\n\n@keyframes rotatePlaceholder {\n  0% {\n    transform: rotate(-45deg);\n    -webkit-transform: rotate(-45deg); }\n  5% {\n    transform: rotate(-45deg);\n    -webkit-transform: rotate(-45deg); }\n  12% {\n    transform: rotate(-405deg);\n    -webkit-transform: rotate(-405deg); }\n  100% {\n    transform: rotate(-405deg);\n    -webkit-transform: rotate(-405deg); } }\n\n.animateSuccessTip {\n  -webkit-animation: animateSuccessTip 0.75s;\n  animation: animateSuccessTip 0.75s; }\n\n.animateSuccessLong {\n  -webkit-animation: animateSuccessLong 0.75s;\n  animation: animateSuccessLong 0.75s; }\n\n.sa-icon.sa-success.animate::after {\n  -webkit-animation: rotatePlaceholder 4.25s ease-in;\n  animation: rotatePlaceholder 4.25s ease-in; }\n\n@-webkit-keyframes animateErrorIcon {\n  0% {\n    transform: rotateX(100deg);\n    -webkit-transform: rotateX(100deg);\n    opacity: 0; }\n  100% {\n    transform: rotateX(0deg);\n    -webkit-transform: rotateX(0deg);\n    opacity: 1; } }\n\n@keyframes animateErrorIcon {\n  0% {\n    transform: rotateX(100deg);\n    -webkit-transform: rotateX(100deg);\n    opacity: 0; }\n  100% {\n    transform: rotateX(0deg);\n    -webkit-transform: rotateX(0deg);\n    opacity: 1; } }\n\n.animateErrorIcon {\n  -webkit-animation: animateErrorIcon 0.5s;\n  animation: animateErrorIcon 0.5s; }\n\n@-webkit-keyframes animateXMark {\n  0% {\n    transform: scale(0.4);\n    -webkit-transform: scale(0.4);\n    margin-top: 26px;\n    opacity: 0; }\n  50% {\n    transform: scale(0.4);\n    -webkit-transform: scale(0.4);\n    margin-top: 26px;\n    opacity: 0; }\n  80% {\n    transform: scale(1.15);\n    -webkit-transform: scale(1.15);\n    margin-top: -6px; }\n  100% {\n    transform: scale(1);\n    -webkit-transform: scale(1);\n    margin-top: 0;\n    opacity: 1; } }\n\n@keyframes animateXMark {\n  0% {\n    transform: scale(0.4);\n    -webkit-transform: scale(0.4);\n    margin-top: 26px;\n    opacity: 0; }\n  50% {\n    transform: scale(0.4);\n    -webkit-transform: scale(0.4);\n    margin-top: 26px;\n    opacity: 0; }\n  80% {\n    transform: scale(1.15);\n    -webkit-transform: scale(1.15);\n    margin-top: -6px; }\n  100% {\n    transform: scale(1);\n    -webkit-transform: scale(1);\n    margin-top: 0;\n    opacity: 1; } }\n\n.animateXMark {\n  -webkit-animation: animateXMark 0.5s;\n  animation: animateXMark 0.5s; }\n\n@-webkit-keyframes pulseWarning {\n  0% {\n    border-color: #F8D486; }\n  100% {\n    border-color: #F8BB86; } }\n\n@keyframes pulseWarning {\n  0% {\n    border-color: #F8D486; }\n  100% {\n    border-color: #F8BB86; } }\n\n.pulseWarning {\n  -webkit-animation: pulseWarning 0.75s infinite alternate;\n  animation: pulseWarning 0.75s infinite alternate; }\n\n@-webkit-keyframes pulseWarningIns {\n  0% {\n    background-color: #F8D486; }\n  100% {\n    background-color: #F8BB86; } }\n\n@keyframes pulseWarningIns {\n  0% {\n    background-color: #F8D486; }\n  100% {\n    background-color: #F8BB86; } }\n\n.pulseWarningIns {\n  -webkit-animation: pulseWarningIns 0.75s infinite alternate;\n  animation: pulseWarningIns 0.75s infinite alternate; }\n\n/* Internet Explorer 9 has some special quirks that are fixed here */\n/* The icons are not animated. */\n/* This file is automatically merged into sweet-alert.min.js through Gulp */\n/* Error icon */\n.sweet-alert .sa-icon.sa-error .sa-line.sa-left {\n  -ms-transform: rotate(45deg) \\9; }\n\n.sweet-alert .sa-icon.sa-error .sa-line.sa-right {\n  -ms-transform: rotate(-45deg) \\9; }\n\n/* Success icon */\n.sweet-alert .sa-icon.sa-success {\n  border-color: transparent\\9; }\n\n.sweet-alert .sa-icon.sa-success .sa-line.sa-tip {\n  -ms-transform: rotate(45deg) \\9; }\n\n.sweet-alert .sa-icon.sa-success .sa-line.sa-long {\n  -ms-transform: rotate(-45deg) \\9; }\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/switchery/switchery.css",
    "content": "/*\n *\n * Main stylesheet for Switchery.\n * http://abpetkov.github.io/switchery/\n *\n */\n\n.switchery {\n    background-color: #fff;\n    border: 1px solid #dfdfdf;\n    border-radius: 20px;\n    cursor: pointer;\n    display: inline-block;\n    height: 30px;\n    position: relative;\n    vertical-align: middle;\n    width: 50px;\n\n    -webkit-box-sizing: content-box;\n    -moz-box-sizing: content-box;\n    box-sizing: content-box;\n}\n\n.switchery > small {\n    background: #fff;\n    border-radius: 100%;\n    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);\n    height: 30px;\n    position: absolute;\n    top: 0;\n    width: 30px;\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/treeview/bootstrap-treeview.css",
    "content": "/* =========================================================\n * bootstrap-treeview.css v1.0.0\n * =========================================================\n * Copyright 2013 Jonathan Miles\n * Project URL : http://www.jondmiles.com/bootstrap-treeview\n *\n * Licensed under the Apache License, Version 2.0 (the \"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://www.apache.org/licenses/LICENSE-2.0\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\n.list-group-item {\n\tcursor: pointer;\n}\n\n/*.list-group-item:hover {\n  background-color: #f5f5f5;\n}*/\n\nspan.indent {\n\tmargin-left: 10px;\n\tmargin-right: 10px;\n}\n\nspan.icon {\n\tmargin-right: 5px;\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/css/plugins/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": "weixin-web-manage/src/main/webapp/static/css/style.min862f.css",
    "content": "h1, h2, h3, h4, h5, h6 {\n  font-weight: 100\n}\n\nh1 {\n  font-size: 30px\n}\n\nh2 {\n  font-size: 24px\n}\n\nh3 {\n  font-size: 16px\n}\n\nh4 {\n  font-size: 14px\n}\n\nh5 {\n  font-size: 12px\n}\n\nh6 {\n  font-size: 10px\n}\n\nh3, h4, h5 {\n  margin-top: 5px;\n  font-weight: 600\n}\n\na:focus {\n  outline: 0\n}\n\n.nav > li > a {\n  color: #a7b1c2;\n  font-weight: 600;\n  padding: 14px 20px 14px 25px\n}\n\n.nav li > a {\n  display: block\n}\n\n.nav.navbar-right > li > a {\n  color: #999c9e\n}\n\n.nav > li.active > a {\n  color: #fff\n}\n\n.navbar-default .nav > li > a:focus, .navbar-default .nav > li > a:hover {\n  background-color: #293846;\n  color: #fff\n}\n\n.nav .open > a, .nav .open > a:focus, .nav .open > a:hover {\n  background: #fff\n}\n\n.nav > li > a i {\n  margin-right: 6px\n}\n\n.navbar {\n  border: 0\n}\n\n.navbar-default {\n  background-color: transparent;\n  border-color: #2f4050;\n  position: relative\n}\n\n.navbar-top-links li {\n  display: inline-block\n}\n\n.navbar-top-links li:last-child {\n  margin-right: 30px\n}\n\nbody.body-small .navbar-top-links li:last-child {\n  margin-right: 10px\n}\n\n.navbar-top-links li a {\n  padding: 20px 10px;\n  min-height: 50px\n}\n\n.dropdown-menu {\n  border: medium none;\n  display: none;\n  float: left;\n  font-size: 12px;\n  left: 0;\n  list-style: none outside none;\n  padding: 0;\n  position: absolute;\n  text-shadow: none;\n  top: 100%;\n  z-index: 1000;\n  border-radius: 0;\n  box-shadow: 0 0 3px rgba(86, 96, 117, .3)\n}\n\n.dropdown-menu > li > a {\n  border-radius: 3px;\n  color: inherit;\n  line-height: 25px;\n  margin: 4px;\n  text-align: left;\n  font-weight: 400\n}\n\n.dropdown-menu > li > a.font-bold {\n  font-weight: 600\n}\n\n.navbar-top-links .dropdown-menu li {\n  display: block\n}\n\n.navbar-top-links .dropdown-menu li:last-child {\n  margin-right: 0\n}\n\n.navbar-top-links .dropdown-menu li a {\n  padding: 3px 20px;\n  min-height: 0\n}\n\n.navbar-top-links .dropdown-menu li a div {\n  white-space: normal\n}\n\n.navbar-top-links .dropdown-alerts, .navbar-top-links .dropdown-messages, .navbar-top-links .dropdown-tasks {\n  width: 310px;\n  min-width: 0\n}\n\n.navbar-top-links .dropdown-messages {\n  margin-left: 5px\n}\n\n.navbar-top-links .dropdown-tasks {\n  margin-left: -59px\n}\n\n.navbar-top-links .dropdown-alerts {\n  margin-left: -123px\n}\n\n.navbar-top-links .dropdown-user {\n  right: 0;\n  left: auto\n}\n\n.dropdown-alerts, .dropdown-messages {\n  padding: 10px\n}\n\n.dropdown-alerts li a, .dropdown-messages li a {\n  font-size: 12px\n}\n\n.dropdown-alerts li em, .dropdown-messages li em {\n  font-size: 10px\n}\n\n.nav.navbar-top-links .dropdown-alerts a {\n  font-size: 12px\n}\n\n.nav-header {\n  padding: 33px 25px;\n  background: url(patterns/header-profile.png) no-repeat\n}\n\n.nav > li.active {\n  border-left: 4px solid #19aa8d;\n  background: #293846\n}\n\n.nav.nav-second-level > li.active {\n  border: none\n}\n\n.nav.nav-second-level.collapse[style] {\n  height: auto !important\n}\n\n.nav-header a {\n  color: #DFE4ED\n}\n\n.nav-header .text-muted {\n  color: #8095a8\n}\n\n.minimalize-styl-2 {\n  padding: 4px 12px;\n  margin: 14px 5px 5px 20px;\n  font-size: 14px;\n  float: left\n}\n\n.navbar-form-custom {\n  float: left;\n  height: 50px;\n  padding: 0;\n  width: 200px;\n  display: inline-table\n}\n\n.navbar-form-custom .form-group {\n  margin-bottom: 0\n}\n\n.nav.navbar-top-links a {\n  font-size: 14px\n}\n\n.navbar-form-custom .form-control {\n  background: none repeat scroll 0 0 rgba(0, 0, 0, 0);\n  border: medium none;\n  font-size: 14px;\n  height: 60px;\n  margin: 0;\n  z-index: 2000\n}\n\n.count-info .label {\n  line-height: 12px;\n  padding: 1px 5px;\n  position: absolute;\n  right: 6px;\n  top: 12px\n}\n\n.arrow {\n  float: right;\n  margin-top: 2px\n}\n\n.fa.arrow:before {\n  content: \"\\f104\"\n}\n\n.active > a > .fa.arrow:before {\n  content: \"\\f107\"\n}\n\n.nav-second-level li, .nav-third-level li {\n  border-bottom: none !important\n}\n\n.nav-second-level li a {\n  padding: 7px 15px 7px 10px;\n  padding-left: 52px\n}\n\n.nav-third-level li a {\n  padding-left: 62px\n}\n\n.nav-second-level li:last-child {\n  margin-bottom: 10px\n}\n\n.mini-navbar .nav li:focus > .nav-second-level, body:not(.fixed-sidebar):not(.canvas-menu).mini-navbar .nav li:hover > .nav-second-level {\n  display: block;\n  border-radius: 0 2px 2px 0;\n  min-width: 140px;\n  height: auto\n}\n\nbody.mini-navbar .navbar-default .nav > li > .nav-second-level li a {\n  font-size: 12px;\n  border-radius: 0 2px 2px 0\n}\n\n.fixed-nav .slimScrollDiv #side-menu {\n  padding-bottom: 60px;\n  position: relative\n}\n\n.slimScrollDiv > * {\n  overflow: hidden\n}\n\n.mini-navbar .nav-second-level li a {\n  padding: 10px 10px 10px 15px\n}\n\n.canvas-menu.mini-navbar .nav-second-level {\n  background: #293846\n}\n\n.mini-navbar li.active .nav-second-level {\n  left: 65px\n}\n\n.navbar-default .special_link a {\n  background: #1ab394;\n  color: #fff\n}\n\n.navbar-default .special_link a:hover {\n  background: #17987e !important;\n  color: #fff\n}\n\n.navbar-default .special_link a span.label {\n  background: #fff;\n  color: #1ab394\n}\n\n.navbar-default .landing_link a {\n  background: #1cc09f;\n  color: #fff\n}\n\n.navbar-default .landing_link a:hover {\n  background: #1ab394 !important;\n  color: #fff\n}\n\n.navbar-default .landing_link a span.label {\n  background: #fff;\n  color: #1cc09f\n}\n\n.logo-element {\n  text-align: center;\n  font-size: 18px;\n  font-weight: 600;\n  color: #fff;\n  display: none;\n  padding: 18px 0\n}\n\n.pace-done #page-wrapper, .pace-done .footer, .pace-done .nav-header, .pace-done .navbar-static-side, .pace-done li.active {\n  -webkit-transition: all .5s;\n  transition: all .5s\n}\n\n.navbar-fixed-top {\n  -webkit-transition-duration: .5s;\n  transition-duration: .5s;\n  z-index: 2030\n}\n\n.navbar-fixed-top, .navbar-static-top {\n  background: #f3f3f4\n}\n\n.fixed-nav #wrapper {\n  padding-top: 60px;\n  box-sizing: border-box\n}\n\n.fixed-nav .minimalize-styl-2 {\n  margin: 14px 5px 5px 15px\n}\n\n.body-small .navbar-fixed-top {\n  margin-left: 0\n}\n\nbody.mini-navbar .navbar-static-side {\n  width: 70px\n}\n\nbody.mini-navbar .nav-label, body.mini-navbar .navbar-default .nav li a span, body.mini-navbar .profile-element {\n  display: none\n}\n\nbody.canvas-menu .profile-element {\n  display: block\n}\n\nbody:not(.fixed-sidebar):not(.canvas-menu).mini-navbar .nav-second-level {\n  display: none\n}\n\nbody.mini-navbar .navbar-default .nav > li > a {\n  font-size: 16px\n}\n\nbody.mini-navbar .logo-element {\n  display: block\n}\n\nbody.canvas-menu .logo-element {\n  display: none\n}\n\nbody.mini-navbar .nav-header {\n  padding: 0;\n  background-color: #1ab394\n}\n\nbody.canvas-menu .nav-header {\n  padding: 33px 25px\n}\n\nbody.mini-navbar #page-wrapper {\n  margin: 0 0 0 70px\n}\n\nbody.canvas-menu.mini-navbar #page-wrapper, body.canvas-menu.mini-navbar .footer {\n  margin: 0\n}\n\nbody.canvas-menu .navbar-static-side, body.fixed-sidebar .navbar-static-side {\n  position: fixed;\n  width: 220px;\n  z-index: 2001;\n  height: 100%\n}\n\nbody.fixed-sidebar.mini-navbar .navbar-static-side {\n  width: 70px\n}\n\nbody.body-small.fixed-sidebar.mini-navbar #page-wrapper, body.fixed-sidebar.mini-navbar #page-wrapper {\n  margin: 0 0 0 70px\n}\n\nbody.body-small.fixed-sidebar.mini-navbar .navbar-static-side {\n  width: 70px\n}\n\n.fixed-sidebar.mini-navbar .nav li > .nav-second-level {\n  display: none\n}\n\n.fixed-sidebar.mini-navbar .nav li.active {\n  border-left-width: 0\n}\n\n.canvas-menu.mini-navbar .nav li:hover > .nav-second-level, .fixed-sidebar.mini-navbar .nav li:hover > .nav-second-level {\n  position: absolute;\n  left: 70px;\n  top: 0;\n  background-color: #2f4050;\n  padding: 10px 10px 0;\n  font-size: 12px;\n  display: block;\n  min-width: 140px;\n  border-radius: 2px\n}\n\nbody.fixed-sidebar.mini-navbar .navbar-default .nav > li > .nav-second-level li a {\n  font-size: 12px;\n  border-radius: 3px\n}\n\nbody.canvas-menu.mini-navbar .navbar-default .nav > li > .nav-second-level li a {\n  font-size: 13px;\n  border-radius: 3px\n}\n\n.canvas-menu.mini-navbar .nav-second-level li a, .fixed-sidebar.mini-navbar .nav-second-level li a {\n  padding: 10px 10px 10px 15px\n}\n\n.canvas-menu.mini-navbar .nav-second-level, .fixed-sidebar.mini-navbar .nav-second-level {\n  position: relative;\n  padding: 0;\n  font-size: 13px\n}\n\n.canvas-menu.mini-navbar li.active .nav-second-level, .fixed-sidebar.mini-navbar li.active .nav-second-level {\n  left: 0\n}\n\nbody.canvas-menu nav.navbar-static-side {\n  z-index: 2001;\n  background: #2f4050;\n  height: 100%;\n  position: fixed;\n  display: none\n}\n\nbody.canvas-menu.mini-navbar nav.navbar-static-side {\n  display: block;\n  width: 70px\n}\n\n.top-navigation #page-wrapper {\n  margin-left: 0\n}\n\n.top-navigation .navbar-nav .dropdown-menu > .active > a {\n  background: #fff;\n  color: #1ab394;\n  font-weight: 700\n}\n\n.white-bg .navbar-fixed-top, .white-bg .navbar-static-top {\n  background: #fff\n}\n\n.top-navigation .navbar {\n  margin-bottom: 0\n}\n\n.top-navigation .nav > li > a {\n  padding: 15px 20px;\n  color: #676a6c\n}\n\n.top-navigation .nav > li a:focus, .top-navigation .nav > li a:hover {\n  background: #fff;\n  color: #1ab394\n}\n\n.top-navigation .nav > li.active {\n  background: #fff;\n  border: none\n}\n\n.top-navigation .nav > li.active > a {\n  color: #1ab394\n}\n\n.top-navigation .navbar-right {\n  padding-right: 10px\n}\n\n.top-navigation .navbar-nav .dropdown-menu {\n  box-shadow: none;\n  border: 1px solid #e7eaec\n}\n\n.top-navigation .dropdown-menu > li > a {\n  margin: 0;\n  padding: 7px 20px\n}\n\n.navbar .dropdown-menu {\n  margin-top: 0\n}\n\n.top-navigation .navbar-brand {\n  background: #1ab394;\n  color: #fff;\n  padding: 15px 25px\n}\n\n.top-navigation .navbar-top-links li:last-child {\n  margin-right: 0\n}\n\n.body-small.fixed-sidebar.mini-navbar .top-navigation #page-wrapper, .canvas-menu #page-wrapper, .mini-navbar .top-navigation #page-wrapper, .top-navigation.body-small.fixed-sidebar.mini-navbar #page-wrapper, .top-navigation.mini-navbar #page-wrapper {\n  margin: 0\n}\n\n.fixed-nav #wrapper.top-navigation, .top-navigation.fixed-nav #wrapper {\n  margin-top: 50px\n}\n\n.top-navigation .footer.fixed {\n  margin-left: 0 !important\n}\n\n.top-navigation .wrapper.wrapper-content {\n  padding: 40px\n}\n\n.body-small .top-navigation .wrapper.wrapper-content, .top-navigation.body-small .wrapper.wrapper-content {\n  padding: 40px 0\n}\n\n.navbar-toggle {\n  color: #fff;\n  padding: 6px 12px;\n  font-size: 14px\n}\n\n.top-navigation .navbar-nav .open .dropdown-menu .dropdown-header, .top-navigation .navbar-nav .open .dropdown-menu > li > a {\n  padding: 10px 15px 10px 20px\n}\n\n@media (max-width: 768px) {\n  .top-navigation .navbar-header {\n    display: block;\n    float: none\n  }\n}\n\n.menu-visible-lg, .menu-visible-md {\n  display: none !important\n}\n\n@media (min-width: 1200px) {\n  .menu-visible-lg {\n    display: block !important\n  }\n}\n\n@media (min-width: 992px) {\n  .menu-visible-md {\n    display: block !important\n  }\n}\n\n@media (max-width: 767px) {\n  .menu-visible-lg, .menu-visible-md {\n    display: block !important\n  }\n}\n\n.btn {\n  border-radius: 3px\n}\n\n.float-e-margins .btn {\n  margin-bottom: 5px\n}\n\n.btn-w-m {\n  min-width: 120px\n}\n\n.btn-primary.btn-outline {\n  color: #1ab394\n}\n\n.btn-success.btn-outline {\n  color: #1c84c6\n}\n\n.btn-info.btn-outline {\n  color: #23c6c8\n}\n\n.btn-warning.btn-outline {\n  color: #f8ac59\n}\n\n.btn-danger.btn-outline {\n  color: #ed5565\n}\n\n.btn-danger.btn-outline:hover, .btn-info.btn-outline:hover, .btn-primary.btn-outline:hover, .btn-success.btn-outline:hover, .btn-warning.btn-outline:hover {\n  color: #fff\n}\n\n.btn-primary {\n  background-color: #1ab394;\n  border-color: #1ab394;\n  color: #FFF\n}\n\n.btn-primary.active, .btn-primary:active, .btn-primary:focus, .btn-primary:hover, .open .dropdown-toggle.btn-primary {\n  background-color: #18a689;\n  border-color: #18a689;\n  color: #FFF\n}\n\n.btn-primary.active, .btn-primary:active, .open .dropdown-toggle.btn-primary {\n  background-image: none\n}\n\n.btn-primary.active[disabled], .btn-primary.disabled, .btn-primary.disabled.active, .btn-primary.disabled:active, .btn-primary.disabled:focus, .btn-primary.disabled:hover, .btn-primary[disabled], .btn-primary[disabled]:active, .btn-primary[disabled]:focus, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary, fieldset[disabled] .btn-primary.active, fieldset[disabled] .btn-primary:active, fieldset[disabled] .btn-primary:focus, fieldset[disabled] .btn-primary:hover {\n  background-color: #1dc5a3;\n  border-color: #1dc5a3\n}\n\n.btn-success {\n  background-color: #1c84c6;\n  border-color: #1c84c6;\n  color: #FFF\n}\n\n.btn-success.active, .btn-success:active, .btn-success:focus, .btn-success:hover, .open .dropdown-toggle.btn-success {\n  background-color: #1a7bb9;\n  border-color: #1a7bb9;\n  color: #FFF\n}\n\n.btn-success.active, .btn-success:active, .open .dropdown-toggle.btn-success {\n  background-image: none\n}\n\n.btn-success.active[disabled], .btn-success.disabled, .btn-success.disabled.active, .btn-success.disabled:active, .btn-success.disabled:focus, .btn-success.disabled:hover, .btn-success[disabled], .btn-success[disabled]:active, .btn-success[disabled]:focus, .btn-success[disabled]:hover, fieldset[disabled] .btn-success, fieldset[disabled] .btn-success.active, fieldset[disabled] .btn-success:active, fieldset[disabled] .btn-success:focus, fieldset[disabled] .btn-success:hover {\n  background-color: #1f90d8;\n  border-color: #1f90d8\n}\n\n.btn-info {\n  background-color: #23c6c8;\n  border-color: #23c6c8;\n  color: #FFF\n}\n\n.btn-info.active, .btn-info:active, .btn-info:focus, .btn-info:hover, .open .dropdown-toggle.btn-info {\n  background-color: #21b9bb;\n  border-color: #21b9bb;\n  color: #FFF\n}\n\n.btn-info.active, .btn-info:active, .open .dropdown-toggle.btn-info {\n  background-image: none\n}\n\n.btn-info.active[disabled], .btn-info.disabled, .btn-info.disabled.active, .btn-info.disabled:active, .btn-info.disabled:focus, .btn-info.disabled:hover, .btn-info[disabled], .btn-info[disabled]:active, .btn-info[disabled]:focus, .btn-info[disabled]:hover, fieldset[disabled] .btn-info, fieldset[disabled] .btn-info.active, fieldset[disabled] .btn-info:active, fieldset[disabled] .btn-info:focus, fieldset[disabled] .btn-info:hover {\n  background-color: #26d7d9;\n  border-color: #26d7d9\n}\n\n.btn-default {\n  background-color: #c2c2c2;\n  border-color: #c2c2c2;\n  color: #FFF\n}\n\n.btn-default.active, .btn-default:active, .btn-default:focus, .btn-default:hover, .open .dropdown-toggle.btn-default {\n  background-color: #bababa;\n  border-color: #bababa;\n  color: #FFF\n}\n\n.btn-default.active, .btn-default:active, .open .dropdown-toggle.btn-default {\n  background-image: none\n}\n\n.btn-default.active[disabled], .btn-default.disabled, .btn-default.disabled.active, .btn-default.disabled:active, .btn-default.disabled:focus, .btn-default.disabled:hover, .btn-default[disabled], .btn-default[disabled]:active, .btn-default[disabled]:focus, .btn-default[disabled]:hover, fieldset[disabled] .btn-default, fieldset[disabled] .btn-default.active, fieldset[disabled] .btn-default:active, fieldset[disabled] .btn-default:focus, fieldset[disabled] .btn-default:hover {\n  background-color: #ccc;\n  border-color: #ccc\n}\n\n.btn-warning {\n  background-color: #f8ac59;\n  border-color: #f8ac59;\n  color: #FFF\n}\n\n.btn-warning.active, .btn-warning:active, .btn-warning:focus, .btn-warning:hover, .open .dropdown-toggle.btn-warning {\n  background-color: #f7a54a;\n  border-color: #f7a54a;\n  color: #FFF\n}\n\n.btn-warning.active, .btn-warning:active, .open .dropdown-toggle.btn-warning {\n  background-image: none\n}\n\n.btn-warning.active[disabled], .btn-warning.disabled, .btn-warning.disabled.active, .btn-warning.disabled:active, .btn-warning.disabled:focus, .btn-warning.disabled:hover, .btn-warning[disabled], .btn-warning[disabled]:active, .btn-warning[disabled]:focus, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning, fieldset[disabled] .btn-warning.active, fieldset[disabled] .btn-warning:active, fieldset[disabled] .btn-warning:focus, fieldset[disabled] .btn-warning:hover {\n  background-color: #f9b66d;\n  border-color: #f9b66d\n}\n\n.btn-danger {\n  background-color: #ed5565;\n  border-color: #ed5565;\n  color: #FFF\n}\n\n.btn-danger.active, .btn-danger:active, .btn-danger:focus, .btn-danger:hover, .open .dropdown-toggle.btn-danger {\n  background-color: #ec4758;\n  border-color: #ec4758;\n  color: #FFF\n}\n\n.btn-danger.active, .btn-danger:active, .open .dropdown-toggle.btn-danger {\n  background-image: none\n}\n\n.btn-danger.active[disabled], .btn-danger.disabled, .btn-danger.disabled.active, .btn-danger.disabled:active, .btn-danger.disabled:focus, .btn-danger.disabled:hover, .btn-danger[disabled], .btn-danger[disabled]:active, .btn-danger[disabled]:focus, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger, fieldset[disabled] .btn-danger.active, fieldset[disabled] .btn-danger:active, fieldset[disabled] .btn-danger:focus, fieldset[disabled] .btn-danger:hover {\n  background-color: #ef6776;\n  border-color: #ef6776\n}\n\n.btn-link {\n  color: inherit\n}\n\n.btn-link.active, .btn-link:active, .btn-link:focus, .btn-link:hover, .open .dropdown-toggle.btn-link {\n  color: #1ab394;\n  text-decoration: none\n}\n\n.btn-link.active, .btn-link:active, .open .dropdown-toggle.btn-link {\n  background-image: none\n}\n\n.btn-link.active[disabled], .btn-link.disabled, .btn-link.disabled.active, .btn-link.disabled:active, .btn-link.disabled:focus, .btn-link.disabled:hover, .btn-link[disabled], .btn-link[disabled]:active, .btn-link[disabled]:focus, .btn-link[disabled]:hover, fieldset[disabled] .btn-link, fieldset[disabled] .btn-link.active, fieldset[disabled] .btn-link:active, fieldset[disabled] .btn-link:focus, fieldset[disabled] .btn-link:hover {\n  color: #cacaca\n}\n\n.btn-white {\n  color: inherit;\n  background: #fff;\n  border: 1px solid #e7eaec\n}\n\n.btn-white.active, .btn-white:active, .btn-white:focus, .btn-white:hover, .open .dropdown-toggle.btn-white {\n  color: inherit;\n  border: 1px solid #d2d2d2\n}\n\n.btn-white.active, .btn-white:active {\n  box-shadow: 0 2px 5px rgba(0, 0, 0, .15) inset\n}\n\n.btn-white.active, .btn-white:active, .open .dropdown-toggle.btn-white {\n  background-image: none\n}\n\n.btn-white.active[disabled], .btn-white.disabled, .btn-white.disabled.active, .btn-white.disabled:active, .btn-white.disabled:focus, .btn-white.disabled:hover, .btn-white[disabled], .btn-white[disabled]:active, .btn-white[disabled]:focus, .btn-white[disabled]:hover, fieldset[disabled] .btn-white, fieldset[disabled] .btn-white.active, fieldset[disabled] .btn-white:active, fieldset[disabled] .btn-white:focus, fieldset[disabled] .btn-white:hover {\n  color: #cacaca\n}\n\n.form-control, .form-control:focus, .has-error .form-control:focus, .has-success .form-control:focus, .has-warning .form-control:focus, .navbar-collapse, .navbar-form, .navbar-form-custom .form-control:focus, .navbar-form-custom .form-control:hover, .open .btn.dropdown-toggle, .panel, .popover, .progress, .progress-bar {\n  box-shadow: none\n}\n\n.btn-outline {\n  color: inherit;\n  background-color: transparent;\n  -webkit-transition: all .5s;\n  transition: all .5s\n}\n\n.btn-rounded {\n  border-radius: 50px\n}\n\n.btn-large-dim {\n  width: 90px;\n  height: 90px;\n  font-size: 42px\n}\n\nbutton.dim {\n  display: inline-block;\n  color: #fff;\n  text-decoration: none;\n  text-transform: uppercase;\n  text-align: center;\n  padding-top: 6px;\n  margin-right: 10px;\n  position: relative;\n  cursor: pointer;\n  border-radius: 5px;\n  font-weight: 600;\n  margin-bottom: 20px !important\n}\n\nbutton.dim:active {\n  top: 3px\n}\n\nbutton.btn-primary.dim {\n  box-shadow: inset 0 0 0 #16987e, 0 5px 0 0 #16987e, 0 10px 5px #999\n}\n\nbutton.btn-primary.dim:active {\n  box-shadow: inset 0 0 0 #16987e, 0 2px 0 0 #16987e, 0 5px 3px #999\n}\n\nbutton.btn-default.dim {\n  box-shadow: inset 0 0 0 #b3b3b3, 0 5px 0 0 #b3b3b3, 0 10px 5px #999\n}\n\nbutton.btn-default.dim:active {\n  box-shadow: inset 0 0 0 #b3b3b3, 0 2px 0 0 #b3b3b3, 0 5px 3px #999\n}\n\nbutton.btn-warning.dim {\n  box-shadow: inset 0 0 0 #f79d3c, 0 5px 0 0 #f79d3c, 0 10px 5px #999\n}\n\nbutton.btn-warning.dim:active {\n  box-shadow: inset 0 0 0 #f79d3c, 0 2px 0 0 #f79d3c, 0 5px 3px #999\n}\n\nbutton.btn-info.dim {\n  box-shadow: inset 0 0 0 #1eacae, 0 5px 0 0 #1eacae, 0 10px 5px #999\n}\n\nbutton.btn-info.dim:active {\n  box-shadow: inset 0 0 0 #1eacae, 0 2px 0 0 #1eacae, 0 5px 3px #999\n}\n\nbutton.btn-success.dim {\n  box-shadow: inset 0 0 0 #1872ab, 0 5px 0 0 #1872ab, 0 10px 5px #999\n}\n\nbutton.btn-success.dim:active {\n  box-shadow: inset 0 0 0 #1872ab, 0 2px 0 0 #1872ab, 0 5px 3px #999\n}\n\nbutton.btn-danger.dim {\n  box-shadow: inset 0 0 0 #ea394c, 0 5px 0 0 #ea394c, 0 10px 5px #999\n}\n\nbutton.btn-danger.dim:active {\n  box-shadow: inset 0 0 0 #ea394c, 0 2px 0 0 #ea394c, 0 5px 3px #999\n}\n\nbutton.dim:before {\n  font-size: 50px;\n  line-height: 1em;\n  font-weight: 400;\n  color: #fff;\n  display: block;\n  padding-top: 10px\n}\n\nbutton.dim:active:before {\n  top: 7px;\n  font-size: 50px\n}\n\n.label {\n  background-color: #d1dade;\n  color: #5e5e5e;\n  font-size: 10px;\n  font-weight: 600;\n  padding: 3px 8px;\n  text-shadow: none\n}\n\n.badge {\n  background-color: #d1dade;\n  color: #5e5e5e;\n  font-size: 11px;\n  font-weight: 600;\n  padding-bottom: 4px;\n  padding-left: 6px;\n  padding-right: 6px;\n  text-shadow: none\n}\n\n.badge-primary, .label-primary {\n  background-color: #1ab394;\n  color: #FFF\n}\n\n.badge-success, .label-success {\n  background-color: #1c84c6;\n  color: #FFF\n}\n\n.badge-warning, .label-warning {\n  background-color: #f8ac59;\n  color: #FFF\n}\n\n.badge-warning-light, .label-warning-light {\n  background-color: #f8ac59;\n  color: #fff\n}\n\n.badge-danger, .label-danger {\n  background-color: #ed5565;\n  color: #FFF\n}\n\n.badge-info, .label-info {\n  background-color: #23c6c8;\n  color: #FFF\n}\n\n.badge-inverse, .label-inverse {\n  background-color: #262626;\n  color: #FFF\n}\n\n.badge-white, .label-white {\n  background-color: #FFF;\n  color: #5E5E5E\n}\n\n.badge-disable, .label-white {\n  background-color: #2A2E36;\n  color: #8B91A0\n}\n\n.chosen-container-single .chosen-single {\n  background: #fff;\n  box-shadow: none;\n  -moz-box-sizing: border-box;\n  background-color: #FFF;\n  border: 1px solid #CBD5DD;\n  border-radius: 2px;\n  cursor: text;\n  height: auto !important;\n  margin: 0;\n  min-height: 30px;\n  overflow: hidden;\n  padding: 4px 12px;\n  position: relative;\n  width: 100%\n}\n\n.chosen-container-multi .chosen-choices li.search-choice {\n  background: #f1f1f1;\n  border: 1px solid #ededed;\n  border-radius: 2px;\n  box-shadow: none;\n  color: #333;\n  cursor: default;\n  line-height: 13px;\n  margin: 3px 0 3px 5px;\n  padding: 3px 20px 3px 5px;\n  position: relative\n}\n\n.pagination > .active > a, .pagination > .active > a:focus, .pagination > .active > a:hover, .pagination > .active > span, .pagination > .active > span:focus, .pagination > .active > span:hover {\n  background-color: #f4f4f4;\n  border-color: #DDD;\n  color: inherit;\n  cursor: default;\n  z-index: 2\n}\n\n.pagination > li > a, .pagination > li > span {\n  background-color: #FFF;\n  border: 1px solid #DDD;\n  color: inherit;\n  float: left;\n  line-height: 1.42857;\n  margin-left: -1px;\n  padding: 4px 10px;\n  position: relative;\n  text-decoration: none\n}\n\n.tooltip-inner {\n  background-color: #2F4050\n}\n\n.tooltip.top .tooltip-arrow {\n  border-top-color: #2F4050\n}\n\n.tooltip.right .tooltip-arrow {\n  border-right-color: #2F4050\n}\n\n.tooltip.bottom .tooltip-arrow {\n  border-bottom-color: #2F4050\n}\n\n.tooltip.left .tooltip-arrow {\n  border-left-color: #2F4050\n}\n\n.easypiechart {\n  position: relative;\n  text-align: center\n}\n\n.easypiechart .h2 {\n  margin-left: 10px;\n  margin-top: 10px;\n  display: inline-block\n}\n\n.easypiechart canvas {\n  top: 0;\n  left: 0\n}\n\n.easypiechart .easypie-text {\n  line-height: 1;\n  position: absolute;\n  top: 33px;\n  width: 100%;\n  z-index: 1\n}\n\n.easypiechart img {\n  margin-top: -4px\n}\n\n.jqstooltip {\n  box-sizing: content-box\n}\n\n.fc-state-default {\n  background-color: #fff;\n  background-image: none;\n  background-repeat: repeat-x;\n  box-shadow: none;\n  color: #333;\n  text-shadow: none;\n  border: 1px solid\n}\n\n.fc-button {\n  color: inherit;\n  border: 1px solid #e7eaec;\n  cursor: pointer;\n  display: inline-block;\n  height: 1.9em;\n  line-height: 1.9em;\n  overflow: hidden;\n  padding: 0 .6em;\n  position: relative;\n  white-space: nowrap\n}\n\n.fc-state-active {\n  background-color: #1ab394;\n  border-color: #1ab394;\n  color: #fff\n}\n\n.fc-header-title h2 {\n  font-size: 16px;\n  font-weight: 600;\n  color: inherit\n}\n\n.fc-content .fc-widget-content, .fc-content .fc-widget-header {\n  border-color: #e7eaec;\n  font-weight: 400\n}\n\n.fc-border-separate tbody {\n  background-color: #F8F8F8\n}\n\n.fc-state-highlight {\n  background: none repeat scroll 0 0 #FCF8E3\n}\n\n.external-event {\n  padding: 5px 10px;\n  border-radius: 2px;\n  cursor: pointer;\n  margin-bottom: 5px\n}\n\n.fc-ltr .fc-event-hori.fc-event-end, .fc-rtl .fc-event-hori.fc-event-start {\n  border-radius: 2px\n}\n\n.fc-agenda .fc-event-time, .fc-event, .fc-event a {\n  padding: 4px 6px;\n  background-color: #1ab394;\n  border-color: #1ab394\n}\n\n.fc-event-time, .fc-event-title {\n  color: #717171;\n  padding: 0 1px\n}\n\n.ui-calendar .fc-event-time, .ui-calendar .fc-event-title {\n  color: #fff\n}\n\n.chat-activity-list .chat-element {\n  border-bottom: 1px solid #e7eaec\n}\n\n.chat-element:first-child {\n  margin-top: 0\n}\n\n.chat-element {\n  padding-bottom: 15px\n}\n\n.chat-element, .chat-element .media {\n  margin-top: 15px\n}\n\n.chat-element, .media-body {\n  overflow: hidden\n}\n\n.media-body {\n  display: block;\n  width: auto\n}\n\n.chat-element > .pull-left {\n  margin-right: 10px\n}\n\n.chat-element img.img-circle, .dropdown-messages-box img.img-circle {\n  width: 38px;\n  height: 38px\n}\n\n.chat-element .well {\n  border: 1px solid #e7eaec;\n  box-shadow: none;\n  margin-top: 10px;\n  margin-bottom: 5px;\n  padding: 10px 20px;\n  font-size: 11px;\n  line-height: 16px\n}\n\n.chat-element .actions {\n  margin-top: 10px\n}\n\n.chat-element .photos {\n  margin: 10px 0\n}\n\n.right.chat-element > .pull-right {\n  margin-left: 10px\n}\n\n.chat-photo {\n  max-height: 180px;\n  border-radius: 4px;\n  overflow: hidden;\n  margin-right: 10px;\n  margin-bottom: 10px\n}\n\n.chat {\n  margin: 0;\n  padding: 0;\n  list-style: none\n}\n\n.chat li {\n  margin-bottom: 10px;\n  padding-bottom: 5px;\n  border-bottom: 1px dotted #B3A9A9\n}\n\n.chat li.left .chat-body {\n  margin-left: 60px\n}\n\n.chat li.right .chat-body {\n  margin-right: 60px\n}\n\n.chat li .chat-body p {\n  margin: 0;\n  color: #777\n}\n\n.chat .glyphicon, .panel .slidedown .glyphicon {\n  margin-right: 5px\n}\n\n.chat-panel .panel-body {\n  height: 350px;\n  overflow-y: scroll\n}\n\na.list-group-item.active, a.list-group-item.active:focus, a.list-group-item.active:hover {\n  background-color: #1ab394;\n  border-color: #1ab394;\n  color: #FFF;\n  z-index: 2\n}\n\n.list-group-item-heading {\n  margin-top: 10px\n}\n\n.list-group-item-text {\n  margin: 0 0 10px;\n  color: inherit;\n  font-size: 12px;\n  line-height: inherit\n}\n\n.no-padding .list-group-item {\n  border-left: none;\n  border-right: none;\n  border-bottom: none\n}\n\n.no-padding .list-group-item:first-child {\n  border-left: none;\n  border-right: none;\n  border-bottom: none;\n  border-top: none\n}\n\n.no-padding .list-group {\n  margin-bottom: 0\n}\n\n.list-group-item {\n  background-color: inherit;\n  border: 1px solid #e7eaec;\n  display: block;\n  margin-bottom: -1px;\n  padding: 10px 15px;\n  position: relative\n}\n\n.elements-list .list-group-item {\n  border-left: none;\n  border-right: none;\n  padding: 15px 25px\n}\n\n.elements-list .list-group-item:first-child {\n  border-left: none;\n  border-right: none;\n  border-top: none !important\n}\n\n.elements-list .list-group {\n  margin-bottom: 0\n}\n\n.elements-list a {\n  color: inherit\n}\n\n.elements-list .list-group-item.active, .elements-list .list-group-item:hover {\n  background: #f3f3f4;\n  color: inherit;\n  border-color: #e7eaec;\n  border-radius: 0\n}\n\n.elements-list li.active {\n  -webkit-transition: none;\n  transition: none\n}\n\n.element-detail-box {\n  padding: 25px\n}\n\n.flot-chart {\n  display: block;\n  height: 200px\n}\n\n.widget .flot-chart.dashboard-chart {\n  display: block;\n  height: 120px;\n  margin-top: 40px\n}\n\n.flot-chart.dashboard-chart {\n  display: block;\n  height: 180px;\n  margin-top: 40px\n}\n\n.flot-chart-content {\n  width: 100%;\n  height: 100%\n}\n\n.flot-chart-pie-content {\n  width: 200px;\n  height: 200px;\n  margin: auto\n}\n\n.jqstooltip {\n  position: absolute;\n  display: block;\n  left: 0;\n  top: 0;\n  visibility: hidden;\n  background: #2b303a;\n  background-color: rgba(43, 48, 58, .8);\n  color: #fff;\n  text-align: left;\n  white-space: nowrap;\n  z-index: 10000;\n  padding: 5px;\n  min-height: 22px;\n  border-radius: 3px\n}\n\n.jqsfield {\n  color: #fff;\n  text-align: left\n}\n\n.h-200 {\n  min-height: 200px\n}\n\n.legendLabel {\n  padding-left: 5px\n}\n\n.stat-list li:first-child {\n  margin-top: 0\n}\n\n.stat-list {\n  list-style: none;\n  padding: 0;\n  margin: 0\n}\n\n.stat-percent {\n  float: right\n}\n\n.stat-list li {\n  margin-top: 15px;\n  position: relative\n}\n\ntable.dataTable thead .sorting, table.dataTable thead .sorting_asc:after, table.dataTable thead .sorting_asc_disabled, table.dataTable thead .sorting_desc, table.dataTable thead .sorting_desc_disabled {\n  background: 0 0\n}\n\ntable.dataTable thead .sorting_asc:after {\n  float: right;\n  font-family: fontawesome\n}\n\ntable.dataTable thead .sorting_desc:after {\n  content: \"\\f0dd\";\n  float: right;\n  font-family: fontawesome\n}\n\ntable.dataTable thead .sorting:after {\n  content: \"\\f0dc\";\n  float: right;\n  font-family: fontawesome;\n  color: rgba(50, 50, 50, .5)\n}\n\n.dataTables_wrapper {\n  padding-bottom: 30px\n}\n\n.img-circle {\n  border-radius: 50%\n}\n\n.btn-circle {\n  width: 30px;\n  height: 30px;\n  padding: 6px 0;\n  border-radius: 15px;\n  text-align: center;\n  font-size: 12px;\n  line-height: 1.428571429\n}\n\n.btn-circle.btn-lg {\n  width: 50px;\n  height: 50px;\n  padding: 10px 16px;\n  border-radius: 25px;\n  font-size: 18px;\n  line-height: 1.33\n}\n\n.btn-circle.btn-xl {\n  width: 70px;\n  height: 70px;\n  padding: 10px 16px;\n  border-radius: 35px;\n  font-size: 24px;\n  line-height: 1.33\n}\n\n.show-grid [class^=col-] {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  border: 1px solid #ddd;\n  background-color: #eee !important\n}\n\n.show-grid {\n  margin: 15px 0\n}\n\n.css-animation-box h1 {\n  font-size: 44px\n}\n\n.animation-efect-links a {\n  padding: 4px 6px;\n  font-size: 12px\n}\n\n#animation_box {\n  background-color: #f9f8f8;\n  border-radius: 16px;\n  width: 80%;\n  margin: 0 auto;\n  padding-top: 80px\n}\n\n.animation-text-box {\n  position: absolute;\n  margin-top: 40px;\n  left: 50%;\n  margin-left: -100px;\n  width: 200px\n}\n\n.animation-text-info {\n  position: absolute;\n  margin-top: -60px;\n  left: 50%;\n  margin-left: -100px;\n  width: 200px;\n  font-size: 10px\n}\n\n.animation-text-box h2 {\n  font-size: 54px;\n  font-weight: 600;\n  margin-bottom: 5px\n}\n\n.animation-text-box p {\n  font-size: 12px;\n  text-transform: uppercase\n}\n\n.pace {\n  -webkit-pointer-events: none;\n  pointer-events: none;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none\n}\n\n.pace .pace-progress {\n  background: #1ab394;\n  position: fixed;\n  z-index: 2000;\n  top: 0;\n  width: 100%;\n  height: 2px\n}\n\n.pace-inactive {\n  display: none\n}\n\n.widget {\n  border-radius: 5px;\n  padding: 15px 20px;\n  margin-bottom: 10px;\n  margin-top: 10px\n}\n\n.widget.style1 h2 {\n  font-size: 30px\n}\n\n.widget h2, .widget h3 {\n  margin-top: 5px;\n  margin-bottom: 0\n}\n\n.widget-text-box {\n  padding: 20px;\n  border: 1px solid #e7eaec;\n  background: #fff\n}\n\n.widget-head-color-box {\n  border-radius: 5px 5px 0 0;\n  margin-top: 10px\n}\n\n.widget .flot-chart {\n  height: 100px\n}\n\n.vertical-align div {\n  display: inline-block;\n  vertical-align: middle\n}\n\n.vertical-align h2, .vertical-align h3 {\n  margin: 0\n}\n\n.todo-list {\n  list-style: none outside none;\n  margin: 0;\n  padding: 0;\n  font-size: 14px\n}\n\n.todo-list.small-list {\n  font-size: 12px\n}\n\n.todo-list.small-list > li {\n  background: #f3f3f4;\n  border-left: none;\n  border-right: none;\n  border-radius: 4px;\n  color: inherit;\n  margin-bottom: 2px;\n  padding: 6px 6px 6px 12px\n}\n\n.todo-list.small-list .btn-group-xs > .btn, .todo-list.small-list .btn-xs {\n  border-radius: 5px;\n  font-size: 10px;\n  line-height: 1.5;\n  padding: 1px 2px 1px 5px\n}\n\n.todo-list > li {\n  background: #f3f3f4;\n  border-left: 6px solid #e7eaec;\n  border-right: 6px solid #e7eaec;\n  border-radius: 4px;\n  color: inherit;\n  margin-bottom: 2px;\n  padding: 10px\n}\n\n.todo-list .handle {\n  cursor: move;\n  display: inline-block;\n  font-size: 16px;\n  margin: 0 5px\n}\n\n.todo-list > li .label {\n  font-size: 9px;\n  margin-left: 10px\n}\n\n.check-link {\n  font-size: 16px\n}\n\n.todo-completed {\n  text-decoration: line-through\n}\n\n.geo-statistic h1 {\n  font-size: 36px;\n  margin-bottom: 0\n}\n\n.glyphicon.fa {\n  font-family: FontAwesome\n}\n\n.inline {\n  display: inline-block !important\n}\n\n.input-s-sm {\n  width: 120px\n}\n\n.input-s {\n  width: 200px\n}\n\n.input-s-lg {\n  width: 250px\n}\n\n.i-checks {\n  padding-left: 0\n}\n\n.form-control, .single-line {\n  background-color: #FFF;\n  background-image: none;\n  border: 1px solid #e5e6e7;\n  border-radius: 1px;\n  color: inherit;\n  display: block;\n  padding: 6px 12px;\n  -webkit-transition: border-color .15s ease-in-out 0s, box-shadow .15s ease-in-out 0s;\n  transition: border-color .15s ease-in-out 0s, box-shadow .15s ease-in-out 0s;\n  width: 100%;\n  font-size: 14px\n}\n\n.form-control:focus, .single-line:focus {\n  border-color: #1ab394 !important\n}\n\n.has-success .form-control {\n  border-color: #1ab394\n}\n\n.has-warning .form-control {\n  border-color: #f8ac59\n}\n\n.has-error .form-control {\n  border-color: #ed5565\n}\n\n.has-success .control-label {\n  color: #1ab394\n}\n\n.has-warning .control-label {\n  color: #f8ac59\n}\n\n.has-error .control-label {\n  color: #ed5565\n}\n\n.input-group-addon {\n  background-color: #fff;\n  border: 1px solid #E5E6E7;\n  border-radius: 1px;\n  color: inherit;\n  font-size: 14px;\n  font-weight: 400;\n  line-height: 1;\n  padding: 6px 12px;\n  text-align: center\n}\n\n.spinner-buttons.input-group-btn .btn-xs {\n  line-height: 1.13\n}\n\n.spinner-buttons.input-group-btn {\n  width: 20%\n}\n\n.noUi-connect {\n  background: none repeat scroll 0 0 #1ab394;\n  box-shadow: none\n}\n\n.slider_red .noUi-connect {\n  background: none repeat scroll 0 0 #ed5565;\n  box-shadow: none\n}\n\n.ui-sortable .ibox-title {\n  cursor: move\n}\n\n.ui-sortable-placeholder {\n  border: 1px dashed #cecece !important;\n  visibility: visible !important;\n  background: #e7eaec\n}\n\n.ibox.ui-sortable-placeholder {\n  margin: 0 0 23px !important\n}\n\n.tabs-container .panel-body {\n  background: #fff;\n  border: 1px solid #e7eaec;\n  border-radius: 2px;\n  padding: 20px;\n  position: relative\n}\n\n.tabs-container .nav-tabs > li.active > a, .tabs-container .nav-tabs > li.active > a:focus, .tabs-container .nav-tabs > li.active > a:hover {\n  background-color: #fff\n}\n\n.tabs-container .nav-tabs > li {\n  float: left;\n  margin-bottom: -1px\n}\n\n.tabs-container .nav-tabs > li.active > a, .tabs-container .nav-tabs > li.active > a:focus, .tabs-container .nav-tabs > li.active > a:hover {\n  border: 1px solid #e7eaec;\n  border-bottom-color: transparent\n}\n\n.tabs-container .nav-tabs {\n  border-bottom: 1px solid #e7eaec\n}\n\n.tabs-container .tab-pane .panel-body {\n  border-top: none\n}\n\n.tabs-container .tabs-left .tab-pane .panel-body, .tabs-container .tabs-right .tab-pane .panel-body {\n  border-top: 1px solid #e7eaec\n}\n\n.tabs-container .nav-tabs > li a:hover {\n  background: 0 0;\n  border-color: transparent\n}\n\n.tabs-container .tabs-below > .nav-tabs, .tabs-container .tabs-left > .nav-tabs, .tabs-container .tabs-right > .nav-tabs {\n  border-bottom: 0\n}\n\n.tabs-container .tabs-left .panel-body {\n  position: static\n}\n\n.tabs-container .tabs-left > .nav-tabs, .tabs-container .tabs-right > .nav-tabs {\n  width: 20%\n}\n\n.tabs-container .tabs-left .panel-body {\n  width: 80%;\n  margin-left: 20%\n}\n\n.tabs-container .tabs-right .panel-body {\n  width: 80%;\n  margin-right: 20%\n}\n\n.tabs-container .pill-content > .pill-pane, .tabs-container .tab-content > .tab-pane {\n  display: none\n}\n\n.tabs-container .pill-content > .active, .tabs-container .tab-content > .active {\n  display: block\n}\n\n.tabs-container .tabs-below > .nav-tabs {\n  border-top: 1px solid #e7eaec\n}\n\n.tabs-container .tabs-below > .nav-tabs > li {\n  margin-top: -1px;\n  margin-bottom: 0\n}\n\n.tabs-container .tabs-below > .nav-tabs > li > a {\n  border-radius: 0 0 4px 4px\n}\n\n.tabs-container .tabs-below > .nav-tabs > li > a:focus, .tabs-container .tabs-below > .nav-tabs > li > a:hover {\n  border-top-color: #e7eaec;\n  border-bottom-color: transparent\n}\n\n.tabs-container .tabs-left > .nav-tabs > li, .tabs-container .tabs-right > .nav-tabs > li {\n  float: none\n}\n\n.tabs-container .tabs-left > .nav-tabs > li > a, .tabs-container .tabs-right > .nav-tabs > li > a {\n  min-width: 74px;\n  margin-right: 0;\n  margin-bottom: 3px\n}\n\n.tabs-container .tabs-left > .nav-tabs {\n  float: left;\n  margin-right: 19px\n}\n\n.tabs-container .tabs-left > .nav-tabs > li > a {\n  margin-right: -1px;\n  border-radius: 4px 0 0 4px\n}\n\n.tabs-container .tabs-left > .nav-tabs .active > a, .tabs-container .tabs-left > .nav-tabs .active > a:focus, .tabs-container .tabs-left > .nav-tabs .active > a:hover {\n  border-color: #e7eaec transparent #e7eaec #e7eaec;\n  *border-right-color: #fff\n}\n\n.tabs-container .tabs-right > .nav-tabs {\n  float: right;\n  margin-left: 19px\n}\n\n.tabs-container .tabs-right > .nav-tabs > li > a {\n  margin-left: -1px;\n  border-radius: 0 4px 4px 0\n}\n\n.tabs-container .tabs-right > .nav-tabs .active > a, .tabs-container .tabs-right > .nav-tabs .active > a:focus, .tabs-container .tabs-right > .nav-tabs .active > a:hover {\n  border-color: #e7eaec #e7eaec #e7eaec transparent;\n  *border-left-color: #fff;\n  z-index: 1\n}\n\n.onoffswitch {\n  position: relative;\n  width: 54px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none\n}\n\n.onoffswitch-checkbox {\n  display: none\n}\n\n.onoffswitch-label {\n  display: block;\n  overflow: hidden;\n  cursor: pointer;\n  border: 2px solid #1AB394;\n  border-radius: 3px\n}\n\n.onoffswitch-inner {\n  display: block;\n  width: 200%;\n  margin-left: -100%;\n  -webkit-transition: margin .3s ease-in 0s;\n  transition: margin .3s ease-in 0s\n}\n\n.onoffswitch-inner:after, .onoffswitch-inner:before {\n  display: block;\n  float: left;\n  width: 50%;\n  height: 16px;\n  padding: 0;\n  line-height: 16px;\n  font-size: 10px;\n  font-family: Trebuchet, Arial, sans-serif;\n  font-weight: 700;\n  box-sizing: border-box\n}\n\n.onoffswitch-inner:before {\n  content: \"ON\";\n  padding-left: 7px;\n  background-color: #1AB394;\n  color: #FFF\n}\n\n.onoffswitch-inner:after {\n  content: \"OFF\";\n  padding-right: 7px;\n  background-color: #FFF;\n  color: #919191;\n  text-align: right\n}\n\n.onoffswitch-switch {\n  display: block;\n  width: 18px;\n  margin: 0;\n  background: #FFF;\n  border: 2px solid #1AB394;\n  border-radius: 3px;\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  right: 36px;\n  -webkit-transition: all .3s ease-in 0s;\n  transition: all .3s ease-in 0s\n}\n\n.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-inner {\n  margin-left: 0\n}\n\n.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-switch {\n  right: 0\n}\n\n.dd {\n  position: relative;\n  display: block;\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  font-size: 13px;\n  line-height: 20px\n}\n\n.dd-list {\n  display: block;\n  position: relative;\n  margin: 0;\n  padding: 0;\n  list-style: none\n}\n\n.dd-list .dd-list {\n  padding-left: 30px\n}\n\n.dd-collapsed .dd-list {\n  display: none\n}\n\n.dd-empty, .dd-item, .dd-placeholder {\n  display: block;\n  position: relative;\n  margin: 0;\n  padding: 0;\n  min-height: 20px;\n  font-size: 13px;\n  line-height: 20px\n}\n\n.dd-handle {\n  display: block;\n  margin: 5px 0;\n  padding: 5px 10px;\n  color: #333;\n  text-decoration: none;\n  border: 1px solid #e7eaec;\n  background: #f5f5f5;\n  border-radius: 3px;\n  box-sizing: border-box;\n  -moz-box-sizing: border-box\n}\n\n.dd-handle span {\n  font-weight: 700\n}\n\n.dd-handle:hover {\n  background: #f0f0f0;\n  cursor: pointer;\n  font-weight: 700\n}\n\n.dd-item > button {\n  display: block;\n  position: relative;\n  cursor: pointer;\n  float: left;\n  width: 25px;\n  height: 20px;\n  margin: 5px 0;\n  padding: 0;\n  text-indent: 100%;\n  white-space: nowrap;\n  overflow: hidden;\n  border: 0;\n  background: 0 0;\n  font-size: 12px;\n  line-height: 1;\n  text-align: center;\n  font-weight: 700\n}\n\n.dd-item > button:before {\n  content: '+';\n  display: block;\n  position: absolute;\n  width: 100%;\n  text-align: center;\n  text-indent: 0\n}\n\n.dd-item > button[data-action=collapse]:before {\n  content: '-'\n}\n\n#nestable2 .dd-item > button {\n  font-family: FontAwesome;\n  height: 34px;\n  width: 33px;\n  color: #c1c1c1\n}\n\n#nestable2 .dd-item > button:before {\n  content: \"\\f067\"\n}\n\n#nestable2 .dd-item > button[data-action=collapse]:before {\n  content: \"\\f068\"\n}\n\n.dd-empty, .dd-placeholder {\n  margin: 5px 0;\n  padding: 0;\n  min-height: 30px;\n  background: #f2fbff;\n  border: 1px dashed #b6bcbf;\n  box-sizing: border-box;\n  -moz-box-sizing: border-box\n}\n\n.dd-empty {\n  border: 1px dashed #bbb;\n  min-height: 100px;\n  background-color: #e5e5e5;\n  background-image: -webkit-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff), -webkit-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff);\n  background-image: linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff), linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff);\n  background-size: 60px 60px;\n  background-position: 0 0, 30px 30px\n}\n\n.dd-dragel {\n  position: absolute;\n  z-index: 9999;\n  pointer-events: none\n}\n\n.dd-dragel > .dd-item .dd-handle {\n  margin-top: 0\n}\n\n.dd-dragel .dd-handle {\n  box-shadow: 2px 4px 6px 0 rgba(0, 0, 0, .1)\n}\n\n.nestable-lists {\n  display: block;\n  clear: both;\n  padding: 30px 0;\n  width: 100%;\n  border: 0;\n  border-top: 2px solid #ddd;\n  border-bottom: 2px solid #ddd\n}\n\n#nestable-menu {\n  padding: 0;\n  margin: 10px 0 20px\n}\n\n#nestable-output, #nestable2-output {\n  width: 100%;\n  line-height: 1.333333em;\n  font-family: lucida grande, lucida sans unicode, helvetica, arial, sans-serif\n}\n\n#nestable2 .dd-handle {\n  color: inherit;\n  border: 1px dashed #e7eaec;\n  background: #f3f3f4;\n  padding: 10px\n}\n\n#nestable2 span.label {\n  margin-right: 10px\n}\n\n#nestable-output, #nestable2-output {\n  font-size: 12px;\n  padding: 25px;\n  box-sizing: border-box;\n  -moz-box-sizing: border-box\n}\n\n.CodeMirror {\n  border: 1px solid #eee;\n  height: auto\n}\n\n.CodeMirror-scroll {\n  overflow-y: hidden;\n  overflow-x: auto\n}\n\n.google-map {\n  height: 300px\n}\n\nlabel.error {\n  color: #cc5965;\n  display: inline-block;\n  margin-left: 5px\n}\n\n.form-control.error {\n  border: 1px dotted #cc5965\n}\n\n.gridStyle {\n  border: 1px solid #d4d4d4;\n  width: 100%;\n  height: 400px\n}\n\n.gridStyle2 {\n  border: 1px solid #d4d4d4;\n  width: 500px;\n  height: 300px\n}\n\n.ngH eaderCell {\n  border-right: none;\n  border-bottom: 1px solid #e7eaec\n}\n\n.ngCell {\n  border-right: none\n}\n\n.ngTopPanel {\n  background: #F5F5F6\n}\n\n.ngRow.even {\n  background: #f9f9f9\n}\n\n.ngRow.selected {\n  background: #EBF2F1\n}\n\n.ngRow {\n  border-bottom: 1px solid #e7eaec\n}\n\n.ngCell {\n  background-color: transparent\n}\n\n.ngHeaderCell {\n  border-right: none\n}\n\n#toast-container > .toast { /* by cheng 2016年10月24日 14:54:38 */\n  /*background-image: none !important*/\n}\n\n#toast-container > .toast:before {\n  position: fixed;\n  font-family: FontAwesome;\n  font-size: 24px;\n  line-height: 24px;\n  float: left;\n  color: #FFF;\n  padding-right: .5em;\n  margin: auto .5em auto -1.5em\n}\n\n#toast-container > div {\n  box-shadow: 0 0 3px #999;\n  opacity: .9;\n  -ms-filter: alpha(opacity=90);\n  filter: alpha(opacity=90)\n}\n\n#toast-container > :hover {\n  box-shadow: 0 0 4px #999;\n  opacity: 1;\n  -ms-filter: alpha(opacity=100);\n  filter: alpha(opacity=100);\n  cursor: pointer\n}\n\n.toast, .toast-success {\n  background-color: #1ab394\n}\n\n.toast-error {\n  background-color: #ed5565\n}\n\n.toast-info {\n  background-color: #23c6c8\n}\n\n.toast-warning {\n  background-color: #f8ac59\n}\n\n.toast-top-full-width {\n  margin-top: 20px\n}\n\n.toast-bottom-full-width {\n  margin-bottom: 20px\n}\n\n.img-container, .img-preview {\n  overflow: hidden;\n  text-align: center;\n  width: 100%\n}\n\n.img-preview-sm {\n  height: 130px;\n  width: 200px\n}\n\n.forum-post-container .media {\n  margin: 10px;\n  padding: 20px 10px;\n  border-bottom: 1px solid #f1f1f1\n}\n\n.forum-avatar {\n  float: left;\n  margin-right: 20px;\n  text-align: center;\n  width: 110px\n}\n\n.forum-avatar .img-circle {\n  height: 48px;\n  width: 48px\n}\n\n.author-info {\n  color: #676a6c;\n  font-size: 11px;\n  margin-top: 5px;\n  text-align: center\n}\n\n.forum-post-info {\n  padding: 9px 12px 6px;\n  background: #f9f9f9;\n  border: 1px solid #f1f1f1\n}\n\n.media-body > .media {\n  background: #f9f9f9;\n  border-radius: 3px;\n  border: 1px solid #f1f1f1\n}\n\n.forum-post-container .media-body .photos {\n  margin: 10px 0\n}\n\n.forum-photo {\n  max-width: 140px;\n  border-radius: 3px\n}\n\n.media-body > .media .forum-avatar {\n  width: 70px;\n  margin-right: 10px\n}\n\n.media-body > .media .forum-avatar .img-circle {\n  height: 38px;\n  width: 38px\n}\n\n.mid-icon {\n  font-size: 66px\n}\n\n.forum-item {\n  margin: 10px 0;\n  padding: 10px 0 20px;\n  border-bottom: 1px solid #f1f1f1\n}\n\n.views-number {\n  font-size: 24px;\n  line-height: 18px;\n  font-weight: 400\n}\n\n.forum-container, .forum-post-container {\n  padding: 30px !important\n}\n\n.forum-item small {\n  color: #999\n}\n\n.forum-item .forum-sub-title {\n  color: #999;\n  margin-left: 50px\n}\n\n.forum-title {\n  margin: 15px 0\n}\n\n.forum-info {\n  text-align: center\n}\n\n.forum-desc {\n  color: #999\n}\n\n.forum-icon {\n  float: left;\n  width: 30px;\n  margin-right: 20px;\n  text-align: center\n}\n\na.forum-item-title {\n  color: inherit;\n  display: block;\n  font-size: 18px;\n  font-weight: 600\n}\n\na.forum-item-title:hover {\n  color: inherit\n}\n\n.forum-icon .fa {\n  font-size: 30px;\n  margin-top: 8px;\n  color: #9b9b9b\n}\n\n.forum-item.active .fa, .forum-item.active a.forum-item-title {\n  color: #1ab394\n}\n\n@media (max-width: 992px) {\n  .forum-info {\n    margin: 15px 0 10px;\n    display: none\n  }\n\n  .forum-desc {\n    float: none !important\n  }\n}\n\n.vertical-container {\n  width: 90%;\n  max-width: 1170px;\n  margin: 0 auto\n}\n\n.vertical-container::after {\n  content: '';\n  display: table;\n  clear: both\n}\n\n#vertical-timeline {\n  position: relative;\n  padding: 0;\n  margin-top: 2em;\n  margin-bottom: 2em\n}\n\n#vertical-timeline::before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 18px;\n  height: 100%;\n  width: 4px;\n  background: #f1f1f1\n}\n\n.vertical-timeline-content .btn {\n  float: right\n}\n\n#vertical-timeline.light-timeline:before {\n  background: #e7eaec\n}\n\n.dark-timeline .vertical-timeline-content:before {\n  border-color: transparent #f5f5f5 transparent transparent\n}\n\n.dark-timeline.center-orientation .vertical-timeline-content:before {\n  border-color: transparent transparent transparent #f5f5f5\n}\n\n.dark-timeline .vertical-timeline-block:nth-child(2n) .vertical-timeline-content:before, .dark-timeline.center-orientation .vertical-timeline-block:nth-child(2n) .vertical-timeline-content:before {\n  border-color: transparent #f5f5f5 transparent transparent\n}\n\n.dark-timeline .vertical-timeline-content, .dark-timeline.center-orientation .vertical-timeline-content {\n  background: #f5f5f5\n}\n\n@media only screen and (min-width: 1170px) {\n  #vertical-timeline.center-orientation {\n    margin-top: 3em;\n    margin-bottom: 3em\n  }\n\n  #vertical-timeline.center-orientation:before {\n    left: 50%;\n    margin-left: -2px\n  }\n}\n\n@media only screen and (max-width: 1170px) {\n  .center-orientation.dark-timeline .vertical-timeline-content:before {\n    border-color: transparent #f5f5f5 transparent transparent\n  }\n}\n\n.vertical-timeline-block {\n  position: relative;\n  margin: 2em 0\n}\n\n.vertical-timeline-block:after {\n  content: \"\";\n  display: table;\n  clear: both\n}\n\n.vertical-timeline-block:first-child {\n  margin-top: 0\n}\n\n.vertical-timeline-block:last-child {\n  margin-bottom: 0\n}\n\n@media only screen and (min-width: 1170px) {\n  .center-orientation .vertical-timeline-block {\n    margin: 4em 0\n  }\n\n  .center-orientation .vertical-timeline-block:first-child {\n    margin-top: 0\n  }\n\n  .center-orientation .vertical-timeline-block:last-child {\n    margin-bottom: 0\n  }\n}\n\n.vertical-timeline-icon {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 40px;\n  height: 40px;\n  border-radius: 50%;\n  font-size: 16px;\n  border: 3px solid #f1f1f1;\n  text-align: center\n}\n\n.vertical-timeline-icon i {\n  display: block;\n  width: 24px;\n  height: 24px;\n  position: relative;\n  left: 50%;\n  top: 50%;\n  margin-left: -12px;\n  margin-top: -9px\n}\n\n@media only screen and (min-width: 1170px) {\n  .center-orientation .vertical-timeline-icon {\n    width: 50px;\n    height: 50px;\n    left: 50%;\n    margin-left: -25px;\n    -webkit-transform: translateZ(0);\n    -webkit-backface-visibility: hidden;\n    font-size: 19px\n  }\n\n  .center-orientation .vertical-timeline-icon i {\n    margin-left: -12px;\n    margin-top: -10px\n  }\n\n  .center-orientation .cssanimations .vertical-timeline-icon.is-hidden {\n    visibility: hidden\n  }\n}\n\n.vertical-timeline-content {\n  position: relative;\n  margin-left: 60px;\n  background: #fff;\n  border-radius: .25em;\n  padding: 1em\n}\n\n.vertical-timeline-content:after {\n  content: \"\";\n  display: table;\n  clear: both\n}\n\n.vertical-timeline-content h2 {\n  font-weight: 400;\n  margin-top: 4px\n}\n\n.vertical-timeline-content p {\n  margin: 1em 0;\n  line-height: 1.6\n}\n\n.vertical-timeline-content .vertical-date {\n  float: left;\n  font-weight: 500\n}\n\n.vertical-date small {\n  color: #1ab394;\n  font-weight: 400\n}\n\n.vertical-timeline-content::before {\n  content: '';\n  position: absolute;\n  top: 16px;\n  right: 100%;\n  height: 0;\n  width: 0;\n  border: 7px solid transparent;\n  border-right: 7px solid #fff\n}\n\n@media only screen and (min-width: 768px) {\n  .vertical-timeline-content h2 {\n    font-size: 18px\n  }\n\n  .vertical-timeline-content p {\n    font-size: 13px\n  }\n}\n\n@media only screen and (min-width: 1170px) {\n  .center-orientation .vertical-timeline-content {\n    margin-left: 0;\n    padding: 1.6em;\n    width: 45%\n  }\n\n  .center-orientation .vertical-timeline-content::before {\n    top: 24px;\n    left: 100%;\n    border-color: transparent;\n    border-left-color: #fff\n  }\n\n  .center-orientation .vertical-timeline-content .btn {\n    float: left\n  }\n\n  .center-orientation .vertical-timeline-content .vertical-date {\n    position: absolute;\n    width: 100%;\n    left: 122%;\n    top: 2px;\n    font-size: 14px\n  }\n\n  .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content {\n    float: right\n  }\n\n  .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content::before {\n    top: 24px;\n    left: auto;\n    right: 100%;\n    border-color: transparent;\n    border-right-color: #fff\n  }\n\n  .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .btn {\n    float: right\n  }\n\n  .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .vertical-date {\n    left: auto;\n    right: 122%;\n    text-align: right\n  }\n\n  .center-orientation .cssanimations .vertical-timeline-content.is-hidden {\n    visibility: hidden\n  }\n}\n\n.sidebard-panel {\n  width: 220px;\n  background: #ebebed;\n  padding: 10px 20px;\n  position: absolute;\n  right: 0\n}\n\n.sidebard-panel .feed-element img.img-circle {\n  width: 32px;\n  height: 32px\n}\n\n.media-body, .sidebard-panel .feed-element, .sidebard-panel p {\n  font-size: 12px\n}\n\n.sidebard-panel .feed-element {\n  margin-top: 20px;\n  padding-bottom: 0\n}\n\n.sidebard-panel .list-group {\n  margin-bottom: 10px\n}\n\n.sidebard-panel .list-group .list-group-item {\n  padding: 5px 0;\n  font-size: 12px;\n  border: 0\n}\n\n.sidebar-content .wrapper, .wrapper.sidebar-content {\n  padding-right: 240px !important\n}\n\n#right-sidebar {\n  background-color: #fff;\n  border-left: 1px solid #e7eaec;\n  border-top: 1px solid #e7eaec;\n  overflow: hidden;\n  position: fixed;\n  top: 60px;\n  width: 260px !important;\n  z-index: 1009;\n  bottom: 0;\n  right: -260px\n}\n\n#right-sidebar.sidebar-open {\n  right: 0\n}\n\n#right-sidebar.sidebar-open.sidebar-top {\n  top: 0;\n  border-top: none\n}\n\n.sidebar-container ul.nav-tabs {\n  border: none\n}\n\n.sidebar-container ul.nav-tabs.navs-4 li {\n  width: 25%\n}\n\n.sidebar-container ul.nav-tabs.navs-3 li {\n  width: 33.3333%\n}\n\n.sidebar-container ul.nav-tabs.navs-2 li {\n  width: 50%\n}\n\n.sidebar-container ul.nav-tabs li {\n  border: none\n}\n\n.sidebar-container ul.nav-tabs li a {\n  border: none;\n  padding: 12px 10px;\n  margin: 0;\n  border-radius: 0;\n  background: #2f4050;\n  color: #fff;\n  text-align: center;\n  border-right: 1px solid #334556\n}\n\n.sidebar-container ul.nav-tabs li.active a {\n  border: none;\n  background: #f9f9f9;\n  color: #676a6c;\n  font-weight: 700\n}\n\n.sidebar-container .nav-tabs > li.active > a:focus, .sidebar-container .nav-tabs > li.active > a:hover {\n  border: none\n}\n\n.sidebar-container ul.sidebar-list {\n  margin: 0;\n  padding: 0\n}\n\n.sidebar-container ul.sidebar-list li {\n  border-bottom: 1px solid #e7eaec;\n  padding: 15px 20px;\n  list-style: none;\n  font-size: 12px\n}\n\n.sidebar-container .sidebar-message:nth-child(2n+2) {\n  background: #f9f9f9\n}\n\n.sidebar-container ul.sidebar-list li a {\n  text-decoration: none;\n  color: inherit\n}\n\n.sidebar-container .sidebar-content {\n  padding: 15px 20px;\n  font-size: 12px\n}\n\n.sidebar-container .sidebar-title {\n  background: #f9f9f9;\n  padding: 20px;\n  border-bottom: 1px solid #e7eaec\n}\n\n.sidebar-container .sidebar-title h3 {\n  margin-bottom: 3px;\n  padding-left: 2px\n}\n\n.sidebar-container .tab-content h4 {\n  margin-bottom: 5px\n}\n\n.sidebar-container .sidebar-message > a > .pull-left {\n  margin-right: 10px\n}\n\n.sidebar-container .sidebar-message > a {\n  text-decoration: none;\n  color: inherit\n}\n\n.sidebar-container .sidebar-message {\n  padding: 15px 20px\n}\n\n.sidebar-container .sidebar-message .message-avatar {\n  height: 38px;\n  width: 38px;\n  border-radius: 50%\n}\n\n.sidebar-container .setings-item {\n  padding: 15px 20px;\n  border-bottom: 1px solid #e7eaec\n}\n\nbody {\n  font-family: \"open sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 13px;\n  color: #676a6c;\n  overflow-x: hidden\n}\n\nbody, body.full-height-layout #page-wrapper, body.full-height-layout #wrapper, html {\n  height: 100%;\n}\n\n#page-wrapper {\n  min-height: auto\n}\n\nbody.boxed-layout {\n  background: url(patterns/shattered.png)\n}\n\nbody.boxed-layout #wrapper {\n  background-color: #2f4050;\n  max-width: 1200px;\n  margin: 0 auto\n}\n\n.boxed-layout #wrapper.top-navigation, .top-navigation.boxed-layout #wrapper {\n  max-width: 1300px !important\n}\n\n.block {\n  display: block\n}\n\n.clear {\n  display: block;\n  overflow: hidden\n}\n\na {\n  cursor: pointer\n}\n\na:focus, a:hover {\n  text-decoration: none\n}\n\n.border-bottom {\n  border-bottom: 1px solid #e7eaec !important\n}\n\n.font-bold {\n  font-weight: 600\n}\n\n.font-noraml {\n  font-weight: 400\n}\n\n.text-uppercase {\n  text-transform: uppercase\n}\n\n.b-r {\n  border-right: 1px solid #e7eaec\n}\n\n.hr-line-dashed {\n  border-top: 1px dashed #e7eaec;\n  color: #fff;\n  background-color: #fff;\n  height: 1px;\n  margin: 20px 0\n}\n\n.hr-line-solid {\n  border-bottom: 1px solid #e7eaec;\n  background-color: rgba(0, 0, 0, 0);\n  border-style: solid !important;\n  margin-top: 15px;\n  margin-bottom: 15px\n}\n\nvideo {\n  width: 100% !important;\n  height: auto !important\n}\n\n.gallery > .row > div {\n  margin-bottom: 15px\n}\n\n.fancybox img {\n  margin-bottom: 5px;\n  width: 24%\n}\n\n.note-editor {\n  height: auto !important;\n  min-height: 100px;\n  border: solid 1px #e5e6e7\n}\n\n.modal-content {\n  background-clip: padding-box;\n  background-color: #FFF;\n  border: 1px solid rgba(0, 0, 0, 0);\n  border-radius: 4px;\n  box-shadow: 0 1px 3px rgba(0, 0, 0, .3);\n  outline: 0 none\n}\n\n.modal-dialog {\n  z-index: 1200\n}\n\n.modal-body {\n  padding: 20px 30px 30px\n}\n\n.inmodal .modal-body {\n  background: #f8fafb\n}\n\n.inmodal .modal-header {\n  padding: 30px 15px;\n  text-align: center\n}\n\n.animated.modal.fade .modal-dialog {\n  -webkit-transform: none;\n  -ms-transform: none;\n  transform: none\n}\n\n.inmodal .modal-title {\n  font-size: 26px\n}\n\n.inmodal .modal-icon {\n  font-size: 84px;\n  color: #e2e3e3\n}\n\n.modal-footer {\n  margin-top: 0\n}\n\n#wrapper {\n  width: 100%;\n  overflow-x: hidden;\n  background-color: #2f4050\n}\n\n.wrapper {\n  padding: 0 20px\n}\n\n.wrapper-content {\n  padding: 20px\n}\n\n#page-wrapper {\n  padding: 0 15px;\n  position: inherit;\n  margin: 0 0 0 220px\n}\n\n.title-action {\n  text-align: right;\n  padding-top: 30px\n}\n\n.ibox-content h1, .ibox-content h2, .ibox-content h3, .ibox-content h4, .ibox-content h5, .ibox-title h1, .ibox-title h2, .ibox-title h3, .ibox-title h4, .ibox-title h5 {\n  margin-top: 5px\n}\n\nol.unstyled, ul.unstyled {\n  list-style: none outside none;\n  margin-left: 0\n}\n\n.big-icon {\n  font-size: 160px;\n  color: #e5e6e7\n}\n\n.footer {\n  background: none repeat scroll 0 0 #fff;\n  border-top: 1px solid #e7eaec;\n  overflow: hidden;\n  padding: 10px 20px;\n  margin: 0 -15px;\n  height: 36px\n}\n\n.footer.fixed_full {\n  position: fixed;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  z-index: 1000;\n  padding: 10px 20px;\n  background: #fff;\n  border-top: 1px solid #e7eaec\n}\n\n.footer.fixed {\n  position: fixed;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  z-index: 1000;\n  padding: 10px 20px;\n  background: #fff;\n  border-top: 1px solid #e7eaec;\n  margin-left: 220px\n}\n\nbody.body-small.mini-navbar .footer.fixed, body.mini-navbar .footer.fixed {\n  margin: 0 0 0 70px\n}\n\nbody.canvas-menu .footer.fixed, body.mini-navbar.canvas-menu .footer.fixed {\n  margin: 0 !important\n}\n\nbody.fixed-sidebar.body-small.mini-navbar .footer.fixed {\n  margin: 0 0 0 220px\n}\n\nbody.body-small .footer.fixed {\n  margin-left: 0\n}\n\n.page-heading {\n  border-top: 0;\n  padding: 0 20px 20px\n}\n\n.panel-heading h1, .panel-heading h2 {\n  margin-bottom: 5px\n}\n\n.content-tabs {\n  position: relative;\n  height: 42px;\n  background: #fafafa;\n  line-height: 40px\n}\n\n.content-tabs .roll-nav, .page-tabs-list {\n  position: absolute;\n  width: 40px;\n  height: 40px;\n  text-align: center;\n  color: #999;\n  z-index: 2;\n  top: 0\n}\n\n.content-tabs .roll-left {\n  left: 0;\n  border-right: solid 1px #eee\n}\n\n.content-tabs .roll-right {\n  right: 0;\n  border-left: solid 1px #eee\n}\n\n.content-tabs button {\n  background: #fff;\n  border: 0;\n  height: 40px;\n  width: 40px;\n  outline: 0\n}\n\n.content-tabs button:hover {\n  background: #fafafa\n}\n\nnav.page-tabs {\n  margin-left: 40px;\n  width: 100000px;\n  height: 40px;\n  overflow: hidden\n}\n\nnav.page-tabs .page-tabs-content {\n  float: left\n}\n\n.page-tabs a {\n  display: block;\n  float: left;\n  border-right: solid 1px #eee;\n  padding: 0 15px\n}\n\n.page-tabs a i:hover {\n  color: #c00\n}\n\n.content-tabs .roll-nav:hover, .page-tabs a:hover {\n  color: #777;\n  background: #f2f2f2;\n  cursor: pointer\n}\n\n.roll-right.J_tabRight {\n  right: 140px\n}\n\n.roll-right.btn-group {\n  right: 60px;\n  width: 80px;\n  padding: 0\n}\n\n.roll-right.btn-group button {\n  width: 80px\n}\n\n.roll-right.J_tabExit {\n  background: #fff;\n  height: 40px;\n  width: 60px;\n  outline: 0\n}\n\n.dropdown-menu-right {\n  left: auto\n}\n\n#content-main {\n  height: calc(100% - 140px);\n  overflow: hidden\n}\n\n.fixed-nav #content-main {\n  height: calc(100% - 80px);\n  overflow: hidden\n}\n\n.table-bordered {\n  border: 1px solid #EBEBEB\n}\n\n.table-bordered > thead > tr > td, .table-bordered > thead > tr > th {\n  background-color: #F5F5F6\n}\n\n.table-bordered > tbody > tr > td, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > td, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > thead > tr > th {\n  border: 1px solid #e7e7e7\n}\n\n.table > thead > tr > th {\n  border-bottom: 1px solid #DDD\n}\n\n.table > tbody > tr > td, .table > tbody > tr > th, .table > tfoot > tr > td, .table > tfoot > tr > th, .table > thead > tr > td, .table > thead > tr > th {\n  border-top: 1px solid #e7eaec;\n  line-height: 1.42857;\n  padding: 8px;\n  vertical-align: middle\n}\n\n.panel.blank-panel {\n  background: 0 0;\n  margin: 0\n}\n\n.blank-panel .panel-heading {\n  padding-bottom: 0\n}\n\n.nav-tabs > li.active > a, .nav-tabs > li.active > a:focus, .nav-tabs > li.active > a:hover {\n  -moz-border-bottom-colors: none;\n  -moz-border-left-colors: none;\n  -moz-border-right-colors: none;\n  -moz-border-top-colors: none;\n  background: 0 0;\n  border-color: #ddd #ddd rgba(0, 0, 0, 0);\n  border-bottom: #f3f3f4;\n  -webkit-border-image: none;\n  -o-border-image: none;\n  border-image: none;\n  border-style: solid;\n  border-width: 1px;\n  color: #555;\n  cursor: default\n}\n\n.nav.nav-tabs li {\n  background: 0 0;\n  border: none\n}\n\n.nav-tabs > li > a {\n  color: #A7B1C2;\n  font-weight: 600;\n  padding: 10px 20px 10px 25px\n}\n\n.nav-tabs > li > a:focus, .nav-tabs > li > a:hover {\n  background-color: #e6e6e6;\n  color: #676a6c\n}\n\n.ui-tab .tab-content {\n  padding: 20px 0\n}\n\n.no-padding {\n  padding: 0 !important\n}\n\n.no-borders {\n  border: none !important\n}\n\n.no-margins {\n  margin: 0 !important\n}\n\n.no-top-border {\n  border-top: 0 !important\n}\n\n.ibox-content.text-box {\n  padding-bottom: 0;\n  padding-top: 15px\n}\n\n.border-left-right {\n  border-left: 1px solid #e7eaec;\n  border-right: 1px solid #e7eaec;\n  border-top: none;\n  border-bottom: none\n}\n\n.border-left {\n  border-left: 1px solid #e7eaec;\n  border-right: none;\n  border-top: none;\n  border-bottom: none\n}\n\n.border-right {\n  border-left: none;\n  border-right: 1px solid #e7eaec;\n  border-top: none;\n  border-bottom: none\n}\n\n.full-width {\n  width: 100% !important\n}\n\n.link-block {\n  font-size: 12px;\n  padding: 10px\n}\n\n.nav.navbar-top-links .link-block a {\n  font-size: 12px\n}\n\n.link-block a {\n  font-size: 10px;\n  color: inherit\n}\n\nbody.mini-navbar .branding {\n  display: none\n}\n\nimg.circle-border {\n  border: 6px solid #FFF;\n  border-radius: 50%\n}\n\n.branding {\n  float: left;\n  color: #FFF;\n  font-size: 18px;\n  font-weight: 600;\n  padding: 17px 20px;\n  text-align: center;\n  background-color: #1ab394\n}\n\n.login-panel {\n  margin-top: 25%\n}\n\n.page-header {\n  padding: 20px 0 9px;\n  margin: 0 0 20px;\n  border-bottom: 1px solid #eee\n}\n\n.fontawesome-icon-list {\n  margin-top: 22px\n}\n\n.fontawesome-icon-list .fa-hover a {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  display: block;\n  color: #222;\n  line-height: 32px;\n  height: 32px;\n  padding-left: 10px;\n  border-radius: 4px\n}\n\n.fontawesome-icon-list .fa-hover a .fa {\n  width: 32px;\n  font-size: 14px;\n  display: inline-block;\n  text-align: right;\n  margin-right: 10px\n}\n\n.fontawesome-icon-list .fa-hover a:hover {\n  background-color: #1d9d74;\n  color: #fff;\n  text-decoration: none\n}\n\n.fontawesome-icon-list .fa-hover a:hover .fa {\n  font-size: 30px;\n  vertical-align: -6px\n}\n\n.fontawesome-icon-list .fa-hover a:hover .text-muted {\n  color: #bbe2d5\n}\n\n.feature-list .col-md-4 {\n  margin-bottom: 22px\n}\n\n.feature-list h4 .fa:before {\n  vertical-align: -10%;\n  font-size: 28px;\n  display: inline-block;\n  width: 1.07142857em;\n  text-align: center;\n  margin-right: 5px\n}\n\n.ui-draggable .ibox-title {\n  cursor: move\n}\n\n.breadcrumb {\n  background-color: #fff;\n  padding: 0;\n  margin-bottom: 0\n}\n\n.breadcrumb > .active, .breadcrumb > li a {\n  color: inherit\n}\n\ncode {\n  background-color: #F9F2F4;\n  border-radius: 4px;\n  color: #ca4440;\n  font-size: 90%;\n  padding: 2px 4px;\n  white-space: nowrap\n}\n\n.ibox {\n  clear: both;\n  margin-bottom: 25px;\n  margin-top: 0;\n  padding: 0\n}\n\n.ibox.collapsed .ibox-content {\n  display: none\n}\n\n.ibox.collapsed .fa.fa-chevron-up:before {\n  content: \"\\f078\"\n}\n\n.ibox.collapsed .fa.fa-chevron-down:before {\n  content: \"\\f077\"\n}\n\n.ibox:after, .ibox:before {\n  display: table\n}\n\n.ibox-title {\n  -moz-border-bottom-colors: none;\n  -moz-border-left-colors: none;\n  -moz-border-right-colors: none;\n  -moz-border-top-colors: none;\n  background-color: #fff;\n  border-color: #e7eaec;\n  -webkit-border-image: none;\n  -o-border-image: none;\n  border-image: none;\n  border-style: solid solid none;\n  border-width: 4px 0 0;\n  color: inherit;\n  margin-bottom: 0;\n  padding: 14px 15px 7px;\n  min-height: 48px\n}\n\n.ibox-content {\n  background-color: #fff;\n  color: inherit;\n  padding: 15px 20px 20px;\n  border-color: #e7eaec;\n  -webkit-border-image: none;\n  -o-border-image: none;\n  border-image: none;\n  border-style: solid solid none;\n  border-width: 1px 0\n}\n\ntable.table-mail tr td {\n  padding: 12px\n}\n\n.table-mail .check-mail {\n  padding-left: 20px\n}\n\n.table-mail .mail-date {\n  padding-right: 20px\n}\n\n.check-mail, .star-mail {\n  width: 40px\n}\n\n.unread td, .unread td a {\n  font-weight: 600;\n  color: inherit\n}\n\n.read td, .read td a {\n  font-weight: 400;\n  color: inherit\n}\n\n.unread td {\n  background-color: #f9f8f8\n}\n\n.ibox-content {\n  clear: both\n}\n\n.ibox-heading {\n  background-color: #f3f6fb;\n  border-bottom: none\n}\n\n.ibox-heading h3 {\n  font-weight: 200;\n  font-size: 24px\n}\n\n.ibox-title h5 {\n  display: inline-block;\n  font-size: 14px;\n  margin: 0 0 7px;\n  padding: 0;\n  text-overflow: ellipsis;\n  float: left\n}\n\n.ibox-title .label {\n  float: left;\n  margin-left: 4px\n}\n\n.ibox-tools {\n  display: inline-block;\n  float: right;\n  margin-top: 0;\n  position: relative;\n  padding: 0\n}\n\n.ibox-tools a {\n  cursor: pointer;\n  margin-left: 5px;\n  color: #c4c4c4\n}\n\n.ibox-tools a.btn-primary {\n  color: #fff\n}\n\n.ibox-tools .dropdown-menu > li > a {\n  padding: 4px 10px;\n  font-size: 12px\n}\n\n.ibox .open > .dropdown-menu {\n  left: auto;\n  right: 0\n}\n\n.gray-bg {\n  background-color: #f3f3f4\n}\n\n.white-bg {\n  background-color: #fff\n}\n\n.navy-bg {\n  background-color: #1ab394;\n  color: #fff\n}\n\n.blue-bg {\n  background-color: #1c84c6;\n  color: #fff\n}\n\n.lazur-bg {\n  background-color: #23c6c8;\n  color: #fff\n}\n\n.yellow-bg {\n  background-color: #f8ac59;\n  color: #fff\n}\n\n.red-bg {\n  background-color: #ed5565;\n  color: #fff\n}\n\n.black-bg {\n  background-color: #262626\n}\n\n.panel-primary {\n  border-color: #1ab394\n}\n\n.panel-primary > .panel-heading {\n  background-color: #1ab394;\n  border-color: #1ab394\n}\n\n.panel-success {\n  border-color: #1c84c6\n}\n\n.panel-success > .panel-heading {\n  background-color: #1c84c6;\n  border-color: #1c84c6;\n  color: #fff\n}\n\n.panel-info {\n  border-color: #23c6c8\n}\n\n.panel-info > .panel-heading {\n  background-color: #23c6c8;\n  border-color: #23c6c8;\n  color: #fff\n}\n\n.panel-warning {\n  border-color: #f8ac59\n}\n\n.panel-warning > .panel-heading {\n  background-color: #f8ac59;\n  border-color: #f8ac59;\n  color: #fff\n}\n\n.panel-danger {\n  border-color: #ed5565\n}\n\n.panel-danger > .panel-heading {\n  background-color: #ed5565;\n  border-color: #ed5565;\n  color: #fff\n}\n\n.progress-bar {\n  background-color: #1ab394\n}\n\n.progress-small, .progress-small .progress-bar {\n  height: 10px\n}\n\n.progress-mini, .progress-small {\n  margin-top: 5px\n}\n\n.progress-mini, .progress-mini .progress-bar {\n  height: 5px;\n  margin-bottom: 0\n}\n\n.progress-bar-navy-light {\n  background-color: #3dc7ab\n}\n\n.progress-bar-success {\n  background-color: #1c84c6\n}\n\n.progress-bar-info {\n  background-color: #23c6c8\n}\n\n.progress-bar-warning {\n  background-color: #f8ac59\n}\n\n.progress-bar-danger {\n  background-color: #ed5565\n}\n\n.panel-title {\n  font-size: inherit\n}\n\n.jumbotron {\n  border-radius: 6px;\n  padding: 40px\n}\n\n.jumbotron h1 {\n  margin-top: 0\n}\n\n.text-navy {\n  color: #1ab394\n}\n\n.text-primary {\n  color: inherit\n}\n\n.text-success {\n  color: #1c84c6\n}\n\n.text-info {\n  color: #23c6c8\n}\n\n.text-warning {\n  color: #f8ac59\n}\n\n.text-danger {\n  color: #ed5565\n}\n\n.text-muted {\n  color: #888\n}\n\n.simple_tag {\n  background-color: #f3f3f4;\n  border: 1px solid #e7eaec;\n  border-radius: 2px;\n  color: inherit;\n  font-size: 10px;\n  margin-right: 5px;\n  margin-top: 5px;\n  padding: 5px 12px;\n  display: inline-block\n}\n\n.img-shadow {\n  box-shadow: 0 0 3px 0 #919191\n}\n\n.ComposeEmail .navbar.navbar-static-top, .Dashboard_2 .navbar.navbar-static-top, .Dashboard_3 .navbar.navbar-static-top, .Dashboard_4_1 .navbar.navbar-static-top, .EmailView .navbar.navbar-static-top, .Inbox .navbar.navbar-static-top, .dashboards\\.dashboard_2 nav.navbar, .dashboards\\.dashboard_3 nav.navbar, .dashboards\\.dashboard_4_1 nav.navbar, .mailbox\\.email_compose nav.navbar, .mailbox\\.email_view nav.navbar, .mailbox\\.inbox nav.navbar {\n  background: #fff\n}\n\na.close-canvas-menu {\n  position: absolute;\n  top: 10px;\n  right: 15px;\n  z-index: 1011;\n  color: #a7b1c2\n}\n\na.close-canvas-menu:hover {\n  color: #fff\n}\n\n.full-height {\n  height: 100%\n}\n\n.fh-breadcrumb {\n  height: calc(100% - 196px);\n  margin: 0 -15px;\n  position: relative\n}\n\n.fh-no-breadcrumb {\n  height: calc(100% - 99px);\n  margin: 0 -15px;\n  position: relative\n}\n\n.fh-column {\n  background: #fff;\n  height: 100%;\n  width: 240px;\n  float: left\n}\n\n.modal-backdrop {\n  z-index: 2040 !important\n}\n\n.modal {\n  z-index: 2050 !important\n}\n\n.spiner-example {\n  height: 200px;\n  padding-top: 70px\n}\n\n.p-xxs {\n  padding: 5px\n}\n\n.p-xs {\n  padding: 10px\n}\n\n.p-sm {\n  padding: 15px\n}\n\n.p-m {\n  padding: 20px\n}\n\n.p-md {\n  padding: 25px\n}\n\n.p-lg {\n  padding: 30px\n}\n\n.p-xl {\n  padding: 40px\n}\n\n.m-xxs {\n  margin: 2px 4px\n}\n\n.m-xs {\n  margin: 5px\n}\n\n.m-sm {\n  margin: 10px\n}\n\n.m {\n  margin: 15px\n}\n\n.m-md {\n  margin: 20px\n}\n\n.m-lg {\n  margin: 30px\n}\n\n.m-xl {\n  margin: 50px\n}\n\n.m-n {\n  margin: 0 !important\n}\n\n.m-l-none {\n  margin-left: 0\n}\n\n.m-l-xs {\n  margin-left: 5px\n}\n\n.m-l-sm {\n  margin-left: 10px\n}\n\n.m-l {\n  margin-left: 15px\n}\n\n.m-l-md {\n  margin-left: 20px\n}\n\n.m-l-lg {\n  margin-left: 30px\n}\n\n.m-l-xl {\n  margin-left: 40px\n}\n\n.m-l-n-xxs {\n  margin-left: -1px\n}\n\n.m-l-n-xs {\n  margin-left: -5px\n}\n\n.m-l-n-sm {\n  margin-left: -10px\n}\n\n.m-l-n {\n  margin-left: -15px\n}\n\n.m-l-n-md {\n  margin-left: -20px\n}\n\n.m-l-n-lg {\n  margin-left: -30px\n}\n\n.m-l-n-xl {\n  margin-left: -40px\n}\n\n.m-t-none {\n  margin-top: 0\n}\n\n.m-t-xxs {\n  margin-top: 1px\n}\n\n.m-t-xs {\n  margin-top: 5px\n}\n\n.m-t-sm {\n  margin-top: 10px\n}\n\n.m-t {\n  margin-top: 15px\n}\n\n.m-t-md {\n  margin-top: 20px\n}\n\n.m-t-lg {\n  margin-top: 30px\n}\n\n.m-t-xl {\n  margin-top: 40px\n}\n\n.m-t-n-xxs {\n  margin-top: -1px\n}\n\n.m-t-n-xs {\n  margin-top: -5px\n}\n\n.m-t-n-sm {\n  margin-top: -10px\n}\n\n.m-t-n {\n  margin-top: -15px\n}\n\n.m-t-n-md {\n  margin-top: -20px\n}\n\n.m-t-n-lg {\n  margin-top: -30px\n}\n\n.m-t-n-xl {\n  margin-top: -40px\n}\n\n.m-r-none {\n  margin-right: 0\n}\n\n.m-r-xxs {\n  margin-right: 1px\n}\n\n.m-r-xs {\n  margin-right: 5px\n}\n\n.m-r-sm {\n  margin-right: 10px\n}\n\n.m-r {\n  margin-right: 15px\n}\n\n.m-r-md {\n  margin-right: 20px\n}\n\n.m-r-lg {\n  margin-right: 30px\n}\n\n.m-r-xl {\n  margin-right: 40px\n}\n\n.m-r-n-xxs {\n  margin-right: -1px\n}\n\n.m-r-n-xs {\n  margin-right: -5px\n}\n\n.m-r-n-sm {\n  margin-right: -10px\n}\n\n.m-r-n {\n  margin-right: -15px\n}\n\n.m-r-n-md {\n  margin-right: -20px\n}\n\n.m-r-n-lg {\n  margin-right: -30px\n}\n\n.m-r-n-xl {\n  margin-right: -40px\n}\n\n.m-b-none {\n  margin-bottom: 0\n}\n\n.m-b-xxs {\n  margin-bottom: 1px\n}\n\n.m-b-xs {\n  margin-bottom: 5px\n}\n\n.m-b-sm {\n  margin-bottom: 10px\n}\n\n.m-b {\n  margin-bottom: 15px\n}\n\n.m-b-md {\n  margin-bottom: 20px\n}\n\n.m-b-lg {\n  margin-bottom: 30px\n}\n\n.m-b-xl {\n  margin-bottom: 40px\n}\n\n.m-b-n-xxs {\n  margin-bottom: -1px\n}\n\n.m-b-n-xs {\n  margin-bottom: -5px\n}\n\n.m-b-n-sm {\n  margin-bottom: -10px\n}\n\n.m-b-n {\n  margin-bottom: -15px\n}\n\n.m-b-n-md {\n  margin-bottom: -20px\n}\n\n.m-b-n-lg {\n  margin-bottom: -30px\n}\n\n.m-b-n-xl {\n  margin-bottom: -40px\n}\n\n.space-15 {\n  margin: 15px 0\n}\n\n.space-20 {\n  margin: 20px 0\n}\n\n.space-25 {\n  margin: 25px 0\n}\n\n.space-30 {\n  margin: 30px 0\n}\n\nbody.modal-open {\n  padding-right: inherit !important\n}\n\n.search-form {\n  margin-top: 10px\n}\n\n.search-result h3 {\n  margin-bottom: 0;\n  color: #1E0FBE\n}\n\n.search-result .search-link {\n  color: #006621\n}\n\n.search-result p {\n  font-size: 12px;\n  margin-top: 5px\n}\n\n.contact-box {\n  background-color: #fff;\n  border: 1px solid #e7eaec;\n  padding: 20px;\n  margin-bottom: 20px\n}\n\n.contact-box a {\n  color: inherit\n}\n\n.invoice-table tbody > tr > td:last-child, .invoice-table tbody > tr > td:nth-child(2), .invoice-table tbody > tr > td:nth-child(3), .invoice-table tbody > tr > td:nth-child(4), .invoice-table thead > tr > th:last-child, .invoice-table thead > tr > th:nth-child(2), .invoice-table thead > tr > th:nth-child(3), .invoice-table thead > tr > th:nth-child(4), .invoice-total > tbody > tr > td:first-child {\n  text-align: right\n}\n\n.invoice-total > tbody > tr > td {\n  border: 0 none\n}\n\n.invoice-total > tbody > tr > td:last-child {\n  border-bottom: 1px solid #DDD;\n  text-align: right;\n  width: 15%\n}\n\n.middle-box {\n  max-width: 400px;\n  z-index: 100;\n  margin: 0 auto;\n  padding-top: 40px\n}\n\n.lockscreen.middle-box {\n  width: 200px;\n  padding-top: 110px\n}\n\n.loginscreen.middle-box {\n  width: 300px\n}\n\n.loginColumns {\n  max-width: 800px;\n  margin: 0 auto;\n  padding: 100px 20px 20px\n}\n\n.passwordBox {\n  max-width: 460px;\n  margin: 0 auto;\n  padding: 100px 20px 20px\n}\n\n.logo-name {\n  color: #e6e6e6;\n  font-size: 180px;\n  font-weight: 800;\n  letter-spacing: -10px;\n  margin-bottom: 0\n}\n\n.middle-box h1 {\n  font-size: 170px\n}\n\n.wrapper .middle-box {\n  margin-top: 140px\n}\n\n.lock-word {\n  z-index: 10;\n  position: absolute;\n  top: 110px;\n  left: 50%;\n  margin-left: -470px\n}\n\n.lock-word span {\n  font-size: 100px;\n  font-weight: 600;\n  color: #e9e9e9;\n  display: inline-block\n}\n\n.lock-word .first-word {\n  margin-right: 160px\n}\n\n.dashboard-header {\n  border-top: 0;\n  padding: 20px\n}\n\n.dashboard-header h2 {\n  margin-top: 10px;\n  font-size: 26px\n}\n\n.fist-item {\n  border-top: none !important\n}\n\n.statistic-box {\n  margin-top: 40px\n}\n\n.dashboard-header .list-group-item span.label {\n  margin-right: 10px\n}\n\n.list-group.clear-list .list-group-item {\n  border-top: 1px solid #e7eaec;\n  border-bottom: 0;\n  border-right: 0;\n  border-left: 0;\n  padding: 10px 0\n}\n\nul.clear-list:first-child {\n  border-top: none !important\n}\n\n.timeline-item .date i {\n  position: absolute;\n  top: 0;\n  right: 0;\n  padding: 5px;\n  width: 30px;\n  text-align: center;\n  border-top: 1px solid #e7eaec;\n  border-bottom: 1px solid #e7eaec;\n  border-left: 1px solid #e7eaec;\n  background: #f8f8f8\n}\n\n.timeline-item .date {\n  text-align: right;\n  width: 110px;\n  position: relative;\n  padding-top: 30px\n}\n\n.timeline-item .content {\n  border-left: 1px solid #e7eaec;\n  border-top: 1px solid #e7eaec;\n  padding-top: 10px;\n  min-height: 100px\n}\n\n.timeline-item .content:hover {\n  background: #f6f6f6\n}\n\nul.notes li, ul.tag-list li {\n  list-style: none\n}\n\nul.notes li h4 {\n  margin-top: 20px;\n  font-size: 16px\n}\n\nul.notes li div {\n  position: relative\n}\n\nul.notes li div small {\n  position: absolute;\n  top: 5px;\n  right: 5px;\n  font-size: 10px\n}\n\nul.notes li div a {\n  position: absolute;\n  right: 10px;\n  bottom: 10px;\n  color: inherit\n}\n\nul.notes li {\n  margin: 10px 40px 50px 0;\n  float: left\n}\n\nul.notes li div p {\n  font-size: 12px\n}\n\nul.notes li div {\n  -webkit-transform: rotate(-6deg);\n  -o-transform: rotate(-6deg);\n  -moz-transform: rotate(-6deg)\n}\n\nul.notes li:nth-child(even) div {\n  -o-transform: rotate(4deg);\n  -webkit-transform: rotate(4deg);\n  -moz-transform: rotate(4deg);\n  position: relative;\n  top: 5px\n}\n\nul.notes li:nth-child(3n) div {\n  -o-transform: rotate(-3deg);\n  -webkit-transform: rotate(-3deg);\n  -moz-transform: rotate(-3deg);\n  position: relative;\n  top: -5px\n}\n\nul.notes li:nth-child(5n) div {\n  -o-transform: rotate(5deg);\n  -webkit-transform: rotate(5deg);\n  -moz-transform: rotate(5deg);\n  position: relative;\n  top: -10px\n}\n\nul.notes li div:focus, ul.notes li div:hover {\n  -webkit-transform: scale(1.1);\n  -moz-transform: scale(1.1);\n  -o-transform: scale(1.1);\n  position: relative;\n  z-index: 5\n}\n\nul.notes li div {\n  text-decoration: none;\n  color: #000;\n  background: #ffc;\n  display: block;\n  height: 210px;\n  width: 210px;\n  padding: 1em;\n  box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);\n  -webkit-transition: -webkit-transform .15s linear\n}\n\n.file-box {\n  float: left;\n  width: 220px\n}\n\n.file-manager h5 {\n  text-transform: uppercase\n}\n\n.file-manager {\n  list-style: none outside none;\n  margin: 0;\n  padding: 0\n}\n\n.folder-list li a {\n  color: #666;\n  display: block;\n  padding: 5px 0\n}\n\n.folder-list li {\n  border-bottom: 1px solid #e7eaec;\n  display: block\n}\n\n.folder-list li i {\n  margin-right: 8px;\n  color: #3d4d5d\n}\n\n.category-list li a {\n  color: #666;\n  display: block;\n  padding: 5px 0\n}\n\n.category-list li {\n  display: block\n}\n\n.category-list li i {\n  margin-right: 8px;\n  color: #3d4d5d\n}\n\n.category-list li a .text-navy {\n  color: #1ab394\n}\n\n.category-list li a .text-primary {\n  color: #1c84c6\n}\n\n.category-list li a .text-info {\n  color: #23c6c8\n}\n\n.category-list li a .text-danger {\n  color: #EF5352\n}\n\n.category-list li a .text-warning {\n  color: #F8AC59\n}\n\n.file-manager h5.tag-title {\n  margin-top: 20px\n}\n\n.tag-list li {\n  float: left\n}\n\n.tag-list li a {\n  font-size: 10px;\n  background-color: #f3f3f4;\n  padding: 5px 12px;\n  color: inherit;\n  border-radius: 2px;\n  border: 1px solid #e7eaec;\n  margin-right: 5px;\n  margin-top: 5px;\n  display: block\n}\n\n.file {\n  border: 1px solid #e7eaec;\n  padding: 0;\n  background-color: #fff;\n  position: relative;\n  margin-bottom: 20px;\n  margin-right: 20px\n}\n\n.file-manager .hr-line-dashed {\n  margin: 15px 0\n}\n\n.file .icon, .file .image {\n  height: 100px;\n  overflow: hidden\n}\n\n.file .icon {\n  padding: 15px 10px;\n  text-align: center\n}\n\n.file-control {\n  color: inherit;\n  font-size: 11px;\n  margin-right: 10px\n}\n\n.file-control.active {\n  text-decoration: underline\n}\n\n.file .icon i {\n  font-size: 70px;\n  color: #dadada\n}\n\n.file .file-name {\n  padding: 10px;\n  background-color: #f8f8f8;\n  border-top: 1px solid #e7eaec\n}\n\n.file-name small {\n  color: #676a6c\n}\n\n.corner {\n  position: absolute;\n  display: inline-block;\n  width: 0;\n  height: 0;\n  line-height: 0;\n  border: .6em solid transparent;\n  border-right: .6em solid #f1f1f1;\n  border-bottom: .6em solid #f1f1f1;\n  right: 0;\n  bottom: 0\n}\n\na.compose-mail {\n  padding: 8px 10px\n}\n\n.mail-search {\n  max-width: 300px\n}\n\n.profile-content {\n  border-top: none !important\n}\n\n.feed-activity-list .feed-element {\n  border-bottom: 1px solid #e7eaec\n}\n\n.feed-element:first-child {\n  margin-top: 0\n}\n\n.feed-element {\n  padding-bottom: 15px\n}\n\n.feed-element, .feed-element .media {\n  margin-top: 15px\n}\n\n.feed-element, .media-body {\n  overflow: hidden\n}\n\n.feed-element > .pull-left {\n  margin-right: 10px\n}\n\n.dropdown-messages-box img.img-circle, .feed-element img.img-circle {\n  width: 38px;\n  height: 38px\n}\n\n.feed-element .well {\n  border: 1px solid #e7eaec;\n  box-shadow: none;\n  margin-top: 10px;\n  margin-bottom: 5px;\n  padding: 10px 20px;\n  font-size: 11px;\n  line-height: 16px\n}\n\n.feed-element .actions {\n  margin-top: 10px\n}\n\n.feed-element .photos {\n  margin: 10px 0\n}\n\n.feed-photo {\n  max-height: 180px;\n  border-radius: 4px;\n  overflow: hidden;\n  margin-right: 10px;\n  margin-bottom: 10px\n}\n\n.mail-box {\n  background-color: #fff;\n  border: 1px solid #e7eaec;\n  border-top: 0;\n  padding: 0;\n  margin-bottom: 20px\n}\n\n.mail-box-header {\n  background-color: #fff;\n  border: 1px solid #e7eaec;\n  border-bottom: 0;\n  padding: 30px 20px 20px\n}\n\n.mail-box-header h2 {\n  margin-top: 0\n}\n\n.mailbox-content .tag-list li a {\n  background: #fff\n}\n\n.mail-body {\n  border-top: 1px solid #e7eaec;\n  padding: 20px\n}\n\n.mail-text {\n  border-top: 1px solid #e7eaec\n}\n\n.mail-text .note-toolbar {\n  padding: 10px 15px\n}\n\n.mail-body .form-group {\n  margin-bottom: 5px\n}\n\n.mail-text .note-editor .note-toolbar {\n  background-color: #F9F8F8\n}\n\n.mail-attachment {\n  border-top: 1px solid #e7eaec;\n  padding: 20px;\n  font-size: 12px\n}\n\n.mailbox-content {\n  background: 0 0;\n  border: none;\n  padding: 10px\n}\n\n.mail-ontact {\n  width: 23%\n}\n\n.project-actions, .project-people {\n  text-align: right;\n  vertical-align: middle\n}\n\ndd.project-people {\n  text-align: left;\n  margin-top: 5px\n}\n\n.project-people img {\n  width: 32px;\n  height: 32px\n}\n\n.project-title a {\n  font-size: 14px;\n  color: #676a6c;\n  font-weight: 600\n}\n\n.project-list table tr td {\n  border-top: none;\n  border-bottom: 1px solid #e7eaec;\n  padding: 15px 10px;\n  vertical-align: middle\n}\n\n.project-manager .tag-list li a {\n  font-size: 10px;\n  background-color: #fff;\n  padding: 5px 12px;\n  color: inherit;\n  border-radius: 2px;\n  border: 1px solid #e7eaec;\n  margin-right: 5px;\n  margin-top: 5px;\n  display: block\n}\n\n.project-files li a {\n  font-size: 11px;\n  color: #676a6c;\n  margin-left: 10px;\n  line-height: 22px\n}\n\n.faq-item {\n  padding: 20px;\n  margin-bottom: 2px;\n  background: #fff\n}\n\n.faq-question {\n  font-size: 18px;\n  font-weight: 600;\n  color: #1ab394;\n  display: block\n}\n\n.faq-question:hover {\n  color: #179d82\n}\n\n.faq-answer {\n  margin-top: 10px;\n  background: #f3f3f4;\n  border: 1px solid #e7eaec;\n  border-radius: 3px;\n  padding: 15px\n}\n\n.faq-item .tag-item {\n  background: #f3f3f4;\n  padding: 2px 6px;\n  font-size: 10px;\n  text-transform: uppercase\n}\n\n.message-input {\n  height: 90px !important\n}\n\n.chat-avatar {\n  white: 36px;\n  height: 36px;\n  float: left;\n  margin-right: 10px\n}\n\n.chat-user-name {\n  padding: 10px\n}\n\n.chat-user {\n  padding: 8px 10px;\n  border-bottom: 1px solid #e7eaec\n}\n\n.chat-user a {\n  color: inherit\n}\n\n.chat-view {\n  z-index: 20012\n}\n\n.chat-statistic, .chat-users {\n  margin-left: -30px\n}\n\n@media (max-width: 992px) {\n  .chat-statistic, .chat-users {\n    margin-left: 0\n  }\n}\n\n.chat-view .ibox-content {\n  padding: 0\n}\n\n.chat-message {\n  padding: 10px 20px\n}\n\n.message-avatar {\n  height: 48px;\n  width: 48px;\n  border: 1px solid #e7eaec;\n  border-radius: 4px;\n  margin-top: 1px\n}\n\n.chat-discussion .chat-message:nth-child(2n+1) .message-avatar {\n  float: left;\n  margin-right: 10px\n}\n\n.chat-discussion .chat-message:nth-child(2n) .message-avatar {\n  float: right;\n  margin-left: 10px\n}\n\n.message {\n  background-color: #fff;\n  border: 1px solid #e7eaec;\n  text-align: left;\n  display: block;\n  padding: 10px 20px;\n  position: relative;\n  border-radius: 4px\n}\n\n.chat-discussion .chat-message:nth-child(2n+1) .message-date {\n  float: right\n}\n\n.chat-discussion .chat-message:nth-child(2n) .message-date {\n  float: left\n}\n\n.chat-discussion .chat-message:nth-child(2n+1) .message {\n  text-align: left;\n  margin-left: 55px\n}\n\n.chat-discussion .chat-message:nth-child(2n) .message {\n  text-align: right;\n  margin-right: 55px\n}\n\n.message-date {\n  font-size: 10px;\n  color: #888\n}\n\n.message-content {\n  display: block\n}\n\n.chat-discussion {\n  background: #eee;\n  padding: 15px;\n  height: 400px;\n  overflow-y: auto\n}\n\n.chat-users {\n  overflow-y: auto;\n  height: 400px\n}\n\n.chat-message-form .form-group {\n  margin-bottom: 0\n}\n\n.jstree-open > .jstree-anchor > .fa-folder:before {\n  content: \"\\f07c\"\n}\n\n.jstree-default .jstree-icon.none {\n  width: 0\n}\n\n.clients-list {\n  margin-top: 20px\n}\n\n.clients-list .tab-pane {\n  position: relative;\n  height: 600px\n}\n\n.client-detail {\n  position: relative;\n  height: 620px\n}\n\n.clients-list table tr td {\n  height: 46px;\n  vertical-align: middle;\n  border: none\n}\n\n.client-link {\n  font-weight: 600;\n  color: inherit\n}\n\n.client-link:hover {\n  color: inherit\n}\n\n.client-avatar {\n  width: 42px\n}\n\n.client-avatar img {\n  width: 28px;\n  height: 28px;\n  border-radius: 50%\n}\n\n.contact-type {\n  width: 20px;\n  color: #c1c3c4\n}\n\n.client-status {\n  text-align: left\n}\n\n.client-detail .vertical-timeline-content p {\n  margin: 0\n}\n\n.client-detail .vertical-timeline-icon.gray-bg {\n  color: #a7aaab\n}\n\n.clients-list .nav-tabs > li.active > a, .clients-list .nav-tabs > li.active > a:focus, .clients-list .nav-tabs > li.active > a:hover {\n  border-bottom: 1px solid #fff\n}\n\n.blog h2 {\n  font-weight: 700\n}\n\n.blog .btn, .blog h5 {\n  margin: 0 0 5px\n}\n\n.article h1 {\n  font-size: 48px;\n  font-weight: 700;\n  color: #2F4050\n}\n\n.article p {\n  font-size: 15px;\n  line-height: 26px\n}\n\n.article-title {\n  text-align: center;\n  margin: 60px 0 40px\n}\n\n.article .ibox-content {\n  padding: 40px\n}\n\n.issue-tracker .btn-link {\n  color: #1ab394\n}\n\ntable.issue-tracker tbody tr td {\n  vertical-align: middle;\n  height: 50px\n}\n\n.issue-info {\n  width: 50%\n}\n\n.issue-info a {\n  font-weight: 600;\n  color: #676a6c\n}\n\n.issue-info small {\n  display: block\n}\n\n.team-members {\n  margin: 10px 0\n}\n\n.team-members img.img-circle {\n  width: 42px;\n  height: 42px;\n  margin-bottom: 5px\n}\n\n.sortable-list {\n  padding: 10px 0\n}\n\n.agile-list {\n  list-style: none;\n  margin: 0\n}\n\n.agile-list li {\n  background: #FAFAFB;\n  border: 1px solid #e7eaec;\n  margin: 0 0 10px;\n  padding: 10px;\n  border-radius: 2px\n}\n\n.agile-list li:hover {\n  cursor: pointer;\n  background: #fff\n}\n\n.agile-list li.warning-element {\n  border-left: 3px solid #f8ac59\n}\n\n.agile-list li.danger-element {\n  border-left: 3px solid #ed5565\n}\n\n.agile-list li.info-element {\n  border-left: 3px solid #1c84c6\n}\n\n.agile-list li.success-element {\n  border-left: 3px solid #1ab394\n}\n\n.agile-detail {\n  margin-top: 5px;\n  font-size: 12px\n}\n\nins {\n  background-color: #c6ffc6;\n  text-decoration: none\n}\n\ndel {\n  background-color: #ffc6c6\n}\n\n#small-chat {\n  position: fixed;\n  bottom: 50px;\n  right: 26px;\n  z-index: 100\n}\n\n#small-chat .badge {\n  position: absolute;\n  top: -3px;\n  right: -4px\n}\n\n.open-small-chat {\n  height: 38px;\n  width: 38px;\n  display: block;\n  background: #1ab394;\n  padding: 9px 8px;\n  text-align: center;\n  color: #fff;\n  border-radius: 50%\n}\n\n.open-small-chat:hover {\n  color: #fff;\n  background: #1ab394\n}\n\n.small-chat-box {\n  display: none;\n  position: fixed;\n  bottom: 50px;\n  right: 80px;\n  background: #fff;\n  border: 1px solid #e7eaec;\n  width: 230px;\n  height: 320px;\n  border-radius: 4px\n}\n\n.small-chat-box.ng-small-chat {\n  display: block\n}\n\n.body-small .small-chat-box {\n  bottom: 70px;\n  right: 20px\n}\n\n.small-chat-box.active {\n  display: block\n}\n\n.small-chat-box .heading {\n  background: #2f4050;\n  padding: 8px 15px;\n  font-weight: 700;\n  color: #fff\n}\n\n.small-chat-box .chat-date {\n  opacity: .6;\n  font-size: 10px;\n  font-weight: 400\n}\n\n.small-chat-box .content {\n  padding: 15px\n}\n\n.small-chat-box .content .author-name {\n  font-weight: 700;\n  margin-bottom: 3px;\n  font-size: 11px\n}\n\n.small-chat-box .content > div {\n  padding-bottom: 20px\n}\n\n.small-chat-box .content .chat-message {\n  padding: 5px 10px;\n  border-radius: 6px;\n  font-size: 11px;\n  line-height: 14px;\n  max-width: 80%;\n  background: #f3f3f4;\n  margin-bottom: 10px\n}\n\n.small-chat-box .content .chat-message.active {\n  background: #1ab394;\n  color: #fff\n}\n\n.small-chat-box .content .left {\n  text-align: left;\n  clear: both\n}\n\n.small-chat-box .content .left .chat-message {\n  float: left\n}\n\n.small-chat-box .content .right {\n  text-align: right;\n  clear: both\n}\n\n.small-chat-box .content .right .chat-message {\n  float: right\n}\n\n.small-chat-box .form-chat {\n  padding: 10px\n}\n\n.sk-spinner-rotating-plane.sk-spinner {\n  width: 30px;\n  height: 30px;\n  background-color: #1ab394;\n  margin: 0 auto;\n  -webkit-animation: sk-rotatePlane 1.2s infinite ease-in-out;\n  animation: sk-rotatePlane 1.2s infinite ease-in-out\n}\n\n@-webkit-keyframes sk-rotatePlane {\n  0% {\n    -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg);\n    transform: perspective(120px) rotateX(0deg) rotateY(0deg)\n  }\n  50% {\n    -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);\n    transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg)\n  }\n  100% {\n    -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);\n    transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg)\n  }\n}\n\n@keyframes sk-rotatePlane {\n  0% {\n    -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg);\n    transform: perspective(120px) rotateX(0deg) rotateY(0deg)\n  }\n  50% {\n    -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);\n    transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg)\n  }\n  100% {\n    -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);\n    transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg)\n  }\n}\n\n.sk-spinner-double-bounce.sk-spinner {\n  width: 40px;\n  height: 40px;\n  position: relative;\n  margin: 0 auto\n}\n\n.sk-spinner-double-bounce .sk-double-bounce1, .sk-spinner-double-bounce .sk-double-bounce2 {\n  width: 100%;\n  height: 100%;\n  border-radius: 50%;\n  background-color: #1ab394;\n  opacity: .6;\n  position: absolute;\n  top: 0;\n  left: 0;\n  -webkit-animation: sk-doubleBounce 2s infinite ease-in-out;\n  animation: sk-doubleBounce 2s infinite ease-in-out\n}\n\n.sk-spinner-double-bounce .sk-double-bounce2 {\n  -webkit-animation-delay: -1s;\n  animation-delay: -1s\n}\n\n@-webkit-keyframes sk-doubleBounce {\n  0%, 100% {\n    -webkit-transform: scale(0);\n    transform: scale(0)\n  }\n  50% {\n    -webkit-transform: scale(1);\n    transform: scale(1)\n  }\n}\n\n@keyframes sk-doubleBounce {\n  0%, 100% {\n    -webkit-transform: scale(0);\n    transform: scale(0)\n  }\n  50% {\n    -webkit-transform: scale(1);\n    transform: scale(1)\n  }\n}\n\n.sk-spinner-wave.sk-spinner {\n  margin: 0 auto;\n  width: 50px;\n  height: 30px;\n  text-align: center;\n  font-size: 10px\n}\n\n.sk-spinner-wave div {\n  background-color: #1ab394;\n  height: 100%;\n  width: 6px;\n  display: inline-block;\n  -webkit-animation: sk-waveStretchDelay 1.2s infinite ease-in-out;\n  animation: sk-waveStretchDelay 1.2s infinite ease-in-out\n}\n\n.sk-spinner-wave .sk-rect2 {\n  -webkit-animation-delay: -1.1s;\n  animation-delay: -1.1s\n}\n\n.sk-spinner-wave .sk-rect3 {\n  -webkit-animation-delay: -1s;\n  animation-delay: -1s\n}\n\n.sk-spinner-wave .sk-rect4 {\n  -webkit-animation-delay: -.9s;\n  animation-delay: -.9s\n}\n\n.sk-spinner-wave .sk-rect5 {\n  -webkit-animation-delay: -.8s;\n  animation-delay: -.8s\n}\n\n@-webkit-keyframes sk-waveStretchDelay {\n  0%, 100%, 40% {\n    -webkit-transform: scaleY(0.4);\n    transform: scaleY(0.4)\n  }\n  20% {\n    -webkit-transform: scaleY(1);\n    transform: scaleY(1)\n  }\n}\n\n@keyframes sk-waveStretchDelay {\n  0%, 100%, 40% {\n    -webkit-transform: scaleY(0.4);\n    transform: scaleY(0.4)\n  }\n  20% {\n    -webkit-transform: scaleY(1);\n    transform: scaleY(1)\n  }\n}\n\n.sk-spinner-wandering-cubes.sk-spinner {\n  margin: 0 auto;\n  width: 32px;\n  height: 32px;\n  position: relative\n}\n\n.sk-spinner-wandering-cubes .sk-cube1, .sk-spinner-wandering-cubes .sk-cube2 {\n  background-color: #1ab394;\n  width: 10px;\n  height: 10px;\n  position: absolute;\n  top: 0;\n  left: 0;\n  -webkit-animation: sk-wanderingCubeMove 1.8s infinite ease-in-out;\n  animation: sk-wanderingCubeMove 1.8s infinite ease-in-out\n}\n\n.sk-spinner-wandering-cubes .sk-cube2 {\n  -webkit-animation-delay: -.9s;\n  animation-delay: -.9s\n}\n\n@-webkit-keyframes sk-wanderingCubeMove {\n  25% {\n    -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5);\n    transform: translateX(42px) rotate(-90deg) scale(0.5)\n  }\n  50% {\n    -webkit-transform: translateX(42px) translateY(42px) rotate(-179deg);\n    transform: translateX(42px) translateY(42px) rotate(-179deg)\n  }\n  50.1% {\n    -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg);\n    transform: translateX(42px) translateY(42px) rotate(-180deg)\n  }\n  75% {\n    -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5);\n    transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5)\n  }\n  100% {\n    -webkit-transform: rotate(-360deg);\n    transform: rotate(-360deg)\n  }\n}\n\n@keyframes sk-wanderingCubeMove {\n  25% {\n    -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5);\n    transform: translateX(42px) rotate(-90deg) scale(0.5)\n  }\n  50% {\n    -webkit-transform: translateX(42px) translateY(42px) rotate(-179deg);\n    transform: translateX(42px) translateY(42px) rotate(-179deg)\n  }\n  50.1% {\n    -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg);\n    transform: translateX(42px) translateY(42px) rotate(-180deg)\n  }\n  75% {\n    -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5);\n    transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5)\n  }\n  100% {\n    -webkit-transform: rotate(-360deg);\n    transform: rotate(-360deg)\n  }\n}\n\n.sk-spinner-pulse.sk-spinner {\n  width: 40px;\n  height: 40px;\n  margin: 0 auto;\n  background-color: #1ab394;\n  border-radius: 100%;\n  -webkit-animation: sk-pulseScaleOut 1s infinite ease-in-out;\n  animation: sk-pulseScaleOut 1s infinite ease-in-out\n}\n\n@-webkit-keyframes sk-pulseScaleOut {\n  0% {\n    -webkit-transform: scale(0);\n    transform: scale(0)\n  }\n  100% {\n    -webkit-transform: scale(1);\n    transform: scale(1);\n    opacity: 0\n  }\n}\n\n@keyframes sk-pulseScaleOut {\n  0% {\n    -webkit-transform: scale(0);\n    transform: scale(0)\n  }\n  100% {\n    -webkit-transform: scale(1);\n    transform: scale(1);\n    opacity: 0\n  }\n}\n\n.sk-spinner-chasing-dots.sk-spinner {\n  margin: 0 auto;\n  width: 40px;\n  height: 40px;\n  position: relative;\n  text-align: center;\n  -webkit-animation: sk-chasingDotsRotate 2s infinite linear;\n  animation: sk-chasingDotsRotate 2s infinite linear\n}\n\n.sk-spinner-chasing-dots .sk-dot1, .sk-spinner-chasing-dots .sk-dot2 {\n  width: 60%;\n  height: 60%;\n  display: inline-block;\n  position: absolute;\n  top: 0;\n  background-color: #1ab394;\n  border-radius: 100%;\n  -webkit-animation: sk-chasingDotsBounce 2s infinite ease-in-out;\n  animation: sk-chasingDotsBounce 2s infinite ease-in-out\n}\n\n.sk-spinner-chasing-dots .sk-dot2 {\n  top: auto;\n  bottom: 0;\n  -webkit-animation-delay: -1s;\n  animation-delay: -1s\n}\n\n@-webkit-keyframes sk-chasingDotsRotate {\n  100% {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg)\n  }\n}\n\n@keyframes sk-chasingDotsRotate {\n  100% {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg)\n  }\n}\n\n@-webkit-keyframes sk-chasingDotsBounce {\n  0%, 100% {\n    -webkit-transform: scale(0);\n    transform: scale(0)\n  }\n  50% {\n    -webkit-transform: scale(1);\n    transform: scale(1)\n  }\n}\n\n@keyframes sk-chasingDotsBounce {\n  0%, 100% {\n    -webkit-transform: scale(0);\n    transform: scale(0)\n  }\n  50% {\n    -webkit-transform: scale(1);\n    transform: scale(1)\n  }\n}\n\n.sk-spinner-three-bounce.sk-spinner {\n  margin: 0 auto;\n  width: 70px;\n  text-align: center\n}\n\n.sk-spinner-three-bounce div {\n  width: 18px;\n  height: 18px;\n  background-color: #1ab394;\n  border-radius: 100%;\n  display: inline-block;\n  -webkit-animation: sk-threeBounceDelay 1.4s infinite ease-in-out;\n  animation: sk-threeBounceDelay 1.4s infinite ease-in-out;\n  -webkit-animation-fill-mode: both;\n  animation-fill-mode: both\n}\n\n.sk-spinner-three-bounce .sk-bounce1 {\n  -webkit-animation-delay: -.32s;\n  animation-delay: -.32s\n}\n\n.sk-spinner-three-bounce .sk-bounce2 {\n  -webkit-animation-delay: -.16s;\n  animation-delay: -.16s\n}\n\n@-webkit-keyframes sk-threeBounceDelay {\n  0%, 100%, 80% {\n    -webkit-transform: scale(0);\n    transform: scale(0)\n  }\n  40% {\n    -webkit-transform: scale(1);\n    transform: scale(1)\n  }\n}\n\n@keyframes sk-threeBounceDelay {\n  0%, 100%, 80% {\n    -webkit-transform: scale(0);\n    transform: scale(0)\n  }\n  40% {\n    -webkit-transform: scale(1);\n    transform: scale(1)\n  }\n}\n\n.sk-spinner-circle.sk-spinner {\n  margin: 0 auto;\n  width: 22px;\n  height: 22px;\n  position: relative\n}\n\n.sk-spinner-circle .sk-circle {\n  width: 100%;\n  height: 100%;\n  position: absolute;\n  left: 0;\n  top: 0\n}\n\n.sk-spinner-circle .sk-circle:before {\n  content: '';\n  display: block;\n  margin: 0 auto;\n  width: 20%;\n  height: 20%;\n  background-color: #1ab394;\n  border-radius: 100%;\n  -webkit-animation: sk-circleBounceDelay 1.2s infinite ease-in-out;\n  animation: sk-circleBounceDelay 1.2s infinite ease-in-out;\n  -webkit-animation-fill-mode: both;\n  animation-fill-mode: both\n}\n\n.sk-spinner-circle .sk-circle2 {\n  -webkit-transform: rotate(30deg);\n  -ms-transform: rotate(30deg);\n  transform: rotate(30deg)\n}\n\n.sk-spinner-circle .sk-circle3 {\n  -webkit-transform: rotate(60deg);\n  -ms-transform: rotate(60deg);\n  transform: rotate(60deg)\n}\n\n.sk-spinner-circle .sk-circle4 {\n  -webkit-transform: rotate(90deg);\n  -ms-transform: rotate(90deg);\n  transform: rotate(90deg)\n}\n\n.sk-spinner-circle .sk-circle5 {\n  -webkit-transform: rotate(120deg);\n  -ms-transform: rotate(120deg);\n  transform: rotate(120deg)\n}\n\n.sk-spinner-circle .sk-circle6 {\n  -webkit-transform: rotate(150deg);\n  -ms-transform: rotate(150deg);\n  transform: rotate(150deg)\n}\n\n.sk-spinner-circle .sk-circle7 {\n  -webkit-transform: rotate(180deg);\n  -ms-transform: rotate(180deg);\n  transform: rotate(180deg)\n}\n\n.sk-spinner-circle .sk-circle8 {\n  -webkit-transform: rotate(210deg);\n  -ms-transform: rotate(210deg);\n  transform: rotate(210deg)\n}\n\n.sk-spinner-circle .sk-circle9 {\n  -webkit-transform: rotate(240deg);\n  -ms-transform: rotate(240deg);\n  transform: rotate(240deg)\n}\n\n.sk-spinner-circle .sk-circle10 {\n  -webkit-transform: rotate(270deg);\n  -ms-transform: rotate(270deg);\n  transform: rotate(270deg)\n}\n\n.sk-spinner-circle .sk-circle11 {\n  -webkit-transform: rotate(300deg);\n  -ms-transform: rotate(300deg);\n  transform: rotate(300deg)\n}\n\n.sk-spinner-circle .sk-circle12 {\n  -webkit-transform: rotate(330deg);\n  -ms-transform: rotate(330deg);\n  transform: rotate(330deg)\n}\n\n.sk-spinner-circle .sk-circle2:before {\n  -webkit-animation-delay: -1.1s;\n  animation-delay: -1.1s\n}\n\n.sk-spinner-circle .sk-circle3:before {\n  -webkit-animation-delay: -1s;\n  animation-delay: -1s\n}\n\n.sk-spinner-circle .sk-circle4:before {\n  -webkit-animation-delay: -.9s;\n  animation-delay: -.9s\n}\n\n.sk-spinner-circle .sk-circle5:before {\n  -webkit-animation-delay: -.8s;\n  animation-delay: -.8s\n}\n\n.sk-spinner-circle .sk-circle6:before {\n  -webkit-animation-delay: -.7s;\n  animation-delay: -.7s\n}\n\n.sk-spinner-circle .sk-circle7:before {\n  -webkit-animation-delay: -.6s;\n  animation-delay: -.6s\n}\n\n.sk-spinner-circle .sk-circle8:before {\n  -webkit-animation-delay: -.5s;\n  animation-delay: -.5s\n}\n\n.sk-spinner-circle .sk-circle9:before {\n  -webkit-animation-delay: -.4s;\n  animation-delay: -.4s\n}\n\n.sk-spinner-circle .sk-circle10:before {\n  -webkit-animation-delay: -.3s;\n  animation-delay: -.3s\n}\n\n.sk-spinner-circle .sk-circle11:before {\n  -webkit-animation-delay: -.2s;\n  animation-delay: -.2s\n}\n\n.sk-spinner-circle .sk-circle12:before {\n  -webkit-animation-delay: -.1s;\n  animation-delay: -.1s\n}\n\n@-webkit-keyframes sk-circleBounceDelay {\n  0%, 100%, 80% {\n    -webkit-transform: scale(0);\n    transform: scale(0)\n  }\n  40% {\n    -webkit-transform: scale(1);\n    transform: scale(1)\n  }\n}\n\n@keyframes sk-circleBounceDelay {\n  0%, 100%, 80% {\n    -webkit-transform: scale(0);\n    transform: scale(0)\n  }\n  40% {\n    -webkit-transform: scale(1);\n    transform: scale(1)\n  }\n}\n\n.sk-spinner-cube-grid.sk-spinner {\n  width: 30px;\n  height: 30px;\n  margin: 0 auto\n}\n\n.sk-spinner-cube-grid .sk-cube {\n  width: 33%;\n  height: 33%;\n  background-color: #1ab394;\n  float: left;\n  -webkit-animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out;\n  animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out\n}\n\n.sk-spinner-cube-grid .sk-cube:nth-child(1) {\n  -webkit-animation-delay: .2s;\n  animation-delay: .2s\n}\n\n.sk-spinner-cube-grid .sk-cube:nth-child(2) {\n  -webkit-animation-delay: .3s;\n  animation-delay: .3s\n}\n\n.sk-spinner-cube-grid .sk-cube:nth-child(3) {\n  -webkit-animation-delay: .4s;\n  animation-delay: .4s\n}\n\n.sk-spinner-cube-grid .sk-cube:nth-child(4) {\n  -webkit-animation-delay: .1s;\n  animation-delay: .1s\n}\n\n.sk-spinner-cube-grid .sk-cube:nth-child(5) {\n  -webkit-animation-delay: .2s;\n  animation-delay: .2s\n}\n\n.sk-spinner-cube-grid .sk-cube:nth-child(6) {\n  -webkit-animation-delay: .3s;\n  animation-delay: .3s\n}\n\n.sk-spinner-cube-grid .sk-cube:nth-child(7) {\n  -webkit-animation-delay: 0s;\n  animation-delay: 0s\n}\n\n.sk-spinner-cube-grid .sk-cube:nth-child(8) {\n  -webkit-animation-delay: .1s;\n  animation-delay: .1s\n}\n\n.sk-spinner-cube-grid .sk-cube:nth-child(9) {\n  -webkit-animation-delay: .2s;\n  animation-delay: .2s\n}\n\n@-webkit-keyframes sk-cubeGridScaleDelay {\n  0%, 100%, 70% {\n    -webkit-transform: scale3D(1, 1, 1);\n    transform: scale3D(1, 1, 1)\n  }\n  35% {\n    -webkit-transform: scale3D(0, 0, 1);\n    transform: scale3D(0, 0, 1)\n  }\n}\n\n@keyframes sk-cubeGridScaleDelay {\n  0%, 100%, 70% {\n    -webkit-transform: scale3D(1, 1, 1);\n    transform: scale3D(1, 1, 1)\n  }\n  35% {\n    -webkit-transform: scale3D(0, 0, 1);\n    transform: scale3D(0, 0, 1)\n  }\n}\n\n.sk-spinner-wordpress.sk-spinner {\n  background-color: #1ab394;\n  width: 30px;\n  height: 30px;\n  border-radius: 30px;\n  position: relative;\n  margin: 0 auto;\n  -webkit-animation: sk-innerCircle 1s linear infinite;\n  animation: sk-innerCircle 1s linear infinite\n}\n\n.sk-spinner-wordpress .sk-inner-circle {\n  display: block;\n  background-color: #fff;\n  width: 8px;\n  height: 8px;\n  position: absolute;\n  border-radius: 8px;\n  top: 5px;\n  left: 5px\n}\n\n@-webkit-keyframes sk-innerCircle {\n  0% {\n    -webkit-transform: rotate(0);\n    transform: rotate(0)\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg)\n  }\n}\n\n@keyframes sk-innerCircle {\n  0% {\n    -webkit-transform: rotate(0);\n    transform: rotate(0)\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg)\n  }\n}\n\n.sk-spinner-fading-circle.sk-spinner {\n  margin: 0 auto;\n  width: 22px;\n  height: 22px;\n  position: relative\n}\n\n.sk-spinner-fading-circle .sk-circle {\n  width: 100%;\n  height: 100%;\n  position: absolute;\n  left: 0;\n  top: 0\n}\n\n.sk-spinner-fading-circle .sk-circle:before {\n  content: '';\n  display: block;\n  margin: 0 auto;\n  width: 18%;\n  height: 18%;\n  background-color: #1ab394;\n  border-radius: 100%;\n  -webkit-animation: sk-circleFadeDelay 1.2s infinite ease-in-out;\n  animation: sk-circleFadeDelay 1.2s infinite ease-in-out;\n  -webkit-animation-fill-mode: both;\n  animation-fill-mode: both\n}\n\n.sk-spinner-fading-circle .sk-circle2 {\n  -webkit-transform: rotate(30deg);\n  -ms-transform: rotate(30deg);\n  transform: rotate(30deg)\n}\n\n.sk-spinner-fading-circle .sk-circle3 {\n  -webkit-transform: rotate(60deg);\n  -ms-transform: rotate(60deg);\n  transform: rotate(60deg)\n}\n\n.sk-spinner-fading-circle .sk-circle4 {\n  -webkit-transform: rotate(90deg);\n  -ms-transform: rotate(90deg);\n  transform: rotate(90deg)\n}\n\n.sk-spinner-fading-circle .sk-circle5 {\n  -webkit-transform: rotate(120deg);\n  -ms-transform: rotate(120deg);\n  transform: rotate(120deg)\n}\n\n.sk-spinner-fading-circle .sk-circle6 {\n  -webkit-transform: rotate(150deg);\n  -ms-transform: rotate(150deg);\n  transform: rotate(150deg)\n}\n\n.sk-spinner-fading-circle .sk-circle7 {\n  -webkit-transform: rotate(180deg);\n  -ms-transform: rotate(180deg);\n  transform: rotate(180deg)\n}\n\n.sk-spinner-fading-circle .sk-circle8 {\n  -webkit-transform: rotate(210deg);\n  -ms-transform: rotate(210deg);\n  transform: rotate(210deg)\n}\n\n.sk-spinner-fading-circle .sk-circle9 {\n  -webkit-transform: rotate(240deg);\n  -ms-transform: rotate(240deg);\n  transform: rotate(240deg)\n}\n\n.sk-spinner-fading-circle .sk-circle10 {\n  -webkit-transform: rotate(270deg);\n  -ms-transform: rotate(270deg);\n  transform: rotate(270deg)\n}\n\n.sk-spinner-fading-circle .sk-circle11 {\n  -webkit-transform: rotate(300deg);\n  -ms-transform: rotate(300deg);\n  transform: rotate(300deg)\n}\n\n.sk-spinner-fading-circle .sk-circle12 {\n  -webkit-transform: rotate(330deg);\n  -ms-transform: rotate(330deg);\n  transform: rotate(330deg)\n}\n\n.sk-spinner-fading-circle .sk-circle2:before {\n  -webkit-animation-delay: -1.1s;\n  animation-delay: -1.1s\n}\n\n.sk-spinner-fading-circle .sk-circle3:before {\n  -webkit-animation-delay: -1s;\n  animation-delay: -1s\n}\n\n.sk-spinner-fading-circle .sk-circle4:before {\n  -webkit-animation-delay: -.9s;\n  animation-delay: -.9s\n}\n\n.sk-spinner-fading-circle .sk-circle5:before {\n  -webkit-animation-delay: -.8s;\n  animation-delay: -.8s\n}\n\n.sk-spinner-fading-circle .sk-circle6:before {\n  -webkit-animation-delay: -.7s;\n  animation-delay: -.7s\n}\n\n.sk-spinner-fading-circle .sk-circle7:before {\n  -webkit-animation-delay: -.6s;\n  animation-delay: -.6s\n}\n\n.sk-spinner-fading-circle .sk-circle8:before {\n  -webkit-animation-delay: -.5s;\n  animation-delay: -.5s\n}\n\n.sk-spinner-fading-circle .sk-circle9:before {\n  -webkit-animation-delay: -.4s;\n  animation-delay: -.4s\n}\n\n.sk-spinner-fading-circle .sk-circle10:before {\n  -webkit-animation-delay: -.3s;\n  animation-delay: -.3s\n}\n\n.sk-spinner-fading-circle .sk-circle11:before {\n  -webkit-animation-delay: -.2s;\n  animation-delay: -.2s\n}\n\n.sk-spinner-fading-circle .sk-circle12:before {\n  -webkit-animation-delay: -.1s;\n  animation-delay: -.1s\n}\n\n@-webkit-keyframes sk-circleFadeDelay {\n  0%, 100%, 39% {\n    opacity: 0\n  }\n  40% {\n    opacity: 1\n  }\n}\n\n@keyframes sk-circleFadeDelay {\n  0%, 100%, 39% {\n    opacity: 0\n  }\n  40% {\n    opacity: 1\n  }\n}\n\nbody.rtls #page-wrapper {\n  margin: 0 220px 0 0\n}\n\nbody.rtls .nav-second-level li a {\n  padding: 7px 35px 7px 10px\n}\n\nbody.rtls .ibox-title h5 {\n  float: right\n}\n\nbody.rtls .pull-right {\n  float: left !important\n}\n\nbody.rtls .pull-left {\n  float: right !important\n}\n\nbody.rtls .ibox-tools, body.rtls .stat-percent {\n  float: left\n}\n\nbody.rtls .navbar-right {\n  float: left !important\n}\n\nbody.rtls .navbar-top-links li:last-child {\n  margin-right: 0\n}\n\nbody.rtls .minimalize-styl-2 {\n  float: right;\n  margin: 14px 20px 5px 5px\n}\n\nbody.rtls .feed-element > .pull-left {\n  margin-left: 10px;\n  margin-right: 0\n}\n\nbody.rtls .timeline-item .date {\n  text-align: left\n}\n\nbody.rtls .timeline-item .date i {\n  left: 0;\n  right: auto\n}\n\nbody.rtls .timeline-item .content {\n  border-right: 1px solid #e7eaec;\n  border-left: none\n}\n\nbody.rtls .toast-close-button {\n  float: left\n}\n\nbody.rtls #toast-container > .toast:before {\n  margin: auto -1.5em auto .5em\n}\n\nbody.rtls #toast-container > div {\n  padding: 15px 50px 15px 15px\n}\n\nbody.rtls .center-orientation .vertical-timeline-icon i {\n  margin-left: 0;\n  margin-right: -12px\n}\n\nbody.rtls .vertical-timeline-icon i {\n  right: 50%;\n  left: auto;\n  margin-left: auto;\n  margin-right: -12px\n}\n\nbody.rtls .file-box, body.rtls ul.notes li {\n  float: right\n}\n\nbody.rtls .chat-statistic, body.rtls .chat-users {\n  margin-right: -30px;\n  margin-left: auto\n}\n\nbody.rtls .dropdown-menu > li > a {\n  text-align: right\n}\n\nbody.rtls .b-r {\n  border-left: 1px solid #e7eaec;\n  border-right: none\n}\n\nbody.rtls .dd-list .dd-list {\n  padding-right: 30px;\n  padding-left: 0\n}\n\nbody.rtls .dd-item > button {\n  float: right\n}\n\nbody.rtls .skin-setttings {\n  margin-right: 40px;\n  margin-left: 0;\n  direction: ltr\n}\n\nbody.rtls .footer.fixed {\n  margin-right: 220px;\n  margin-left: 0\n}\n\n@media (max-width: 992px) {\n  body.rtls .chat-statistic, body.rtls .chat-users {\n    margin-right: 0\n  }\n}\n\nbody.body-small.mini-navbar .footer.fixed, body.rtls.mini-navbar .footer.fixed {\n  margin: 0 70px 0 0\n}\n\nbody.body-small.mini-navbar .footer.fixed, body.rtls.mini-navbar.fixed-sidebar .footer.fixed {\n  margin: 0\n}\n\nbody.rtls.top-navigation .navbar-toggle {\n  float: right;\n  margin-left: 15px;\n  margin-right: 15px\n}\n\n.body-small.rtls.top-navigation .navbar-header {\n  float: none\n}\n\nbody.rtls.top-navigation #page-wrapper {\n  margin: 0\n}\n\nbody.rtls.mini-navbar #page-wrapper {\n  margin: 0 70px 0 0\n}\n\nbody.rtls.mini-navbar.fixed-sidebar #page-wrapper {\n  margin: 0\n}\n\nbody.rtls.body-small.fixed-sidebar.mini-navbar #page-wrapper {\n  margin: 0 220px 0 0\n}\n\nbody.rtls.body-small.fixed-sidebar.mini-navbar .navbar-static-side {\n  width: 220px\n}\n\n.body-small.rtls .navbar-fixed-top {\n  margin-right: 0\n}\n\n.body-small.rtls .navbar-header {\n  float: right\n}\n\nbody.rtls .navbar-top-links li:last-child {\n  margin-left: 20px\n}\n\nbody.rtls .top-navigation #page-wrapper, body.rtls .top-navigation .footer.fixed, body.rtls.mini-navbar .top-navigation #page-wrapper, body.rtls.mini-navbar.top-navigation #page-wrapper, body.rtls.top-navigation .footer.fixed {\n  margin: 0\n}\n\n@media (max-width: 768px) {\n  body.rtls .navbar-top-links li:last-child {\n    margin-left: 20px\n  }\n\n  .body-small.rtls #page-wrapper {\n    position: inherit;\n    margin: 0;\n    min-height: 1000px\n  }\n\n  .body-small.rtls .navbar-static-side {\n    display: none;\n    z-index: 2001;\n    position: absolute;\n    width: 70px\n  }\n\n  .body-small.rtls.mini-navbar .navbar-static-side {\n    display: block\n  }\n\n  .rtls.fixed-sidebar.body-small .navbar-static-side {\n    display: none;\n    z-index: 2001;\n    position: fixed;\n    width: 220px\n  }\n\n  .rtls.fixed-sidebar.body-small.mini-navbar .navbar-static-side {\n    display: block\n  }\n}\n\n.rtls .ltr-support {\n  direction: ltr\n}\n\n.skin-setttings .title {\n  background: #efefef;\n  text-align: center;\n  text-transform: uppercase;\n  font-weight: 600;\n  display: block;\n  padding: 10px 15px;\n  font-size: 12px\n}\n\n.setings-item {\n  padding: 10px 30px\n}\n\n.setings-item.nb {\n  border: none\n}\n\n.setings-item.skin {\n  text-align: center\n}\n\n.setings-item .switch {\n  float: right\n}\n\n.skin-name a {\n  text-transform: uppercase\n}\n\n.setings-item a {\n  color: #fff\n}\n\n.blue-skin, .default-skin, .ultra-skin, .yellow-skin {\n  text-align: center\n}\n\n.default-skin {\n  font-weight: 600;\n  background: #1ab394\n}\n\n.default-skin:hover {\n  background: #199d82\n}\n\n.blue-skin {\n  font-weight: 600;\n  background: url(patterns/header-profile-skin-1.png) repeat scroll 0 0\n}\n\n.blue-skin:hover {\n  background: #0d8ddb\n}\n\n.yellow-skin {\n  font-weight: 600;\n  background: url(patterns/header-profile-skin-3.png) repeat scroll 0 100%\n}\n\n.yellow-skin:hover {\n  background: #ce8735\n}\n\n.content-tabs {\n  border-bottom: solid 2px #2f4050\n}\n\n.page-tabs a {\n  color: #999\n}\n\n.page-tabs a i {\n  color: #ccc\n}\n\n.page-tabs a.active {\n  background: #2f4050;\n  color: #a7b1c2\n}\n\n.page-tabs a.active i:hover, .page-tabs a.active:hover {\n  background: #293846;\n  color: #fff\n}\n\n.skin-1 .minimalize-styl-2 {\n  margin: 14px 5px 5px 30px\n}\n\n.skin-1 .navbar-top-links li:last-child {\n  margin-right: 30px\n}\n\n.skin-1.fixed-nav .minimalize-styl-2 {\n  margin: 14px 5px 5px 15px\n}\n\n.skin-1 .spin-icon {\n  background: #0e9aef !important\n}\n\n.skin-1 .nav-header {\n  background: #0e9aef;\n  background: url(patterns/header-profile-skin-1.png)\n}\n\n.skin-1.mini-navbar .nav-second-level {\n  background: #3e495f\n}\n\n.skin-1 .breadcrumb {\n  background: 0 0\n}\n\n.skin-1 .page-heading {\n  border: none\n}\n\n.skin-1 .nav > li.active {\n  background: #3a4459\n}\n\n.skin-1 .nav > li > a {\n  color: #9ea6b9\n}\n\n.skin-1 .nav > li.active > a {\n  color: #fff\n}\n\n.skin-1 .navbar-minimalize {\n  background: #0e9aef;\n  border-color: #0e9aef\n}\n\nbody.skin-1 {\n  background: #3e495f\n}\n\n.skin-1 .navbar-static-top {\n  background: #fff\n}\n\n.skin-1 .dashboard-header {\n  background: 0 0;\n  border-bottom: none !important;\n  border-top: none;\n  padding: 20px 30px 10px\n}\n\n.fixed-nav.skin-1 .navbar-fixed-top {\n  background: #fff\n}\n\n.skin-1 .wrapper-content {\n  padding: 30px 15px\n}\n\n.skin-1 #page-wrapper {\n  background: #f4f6fa\n}\n\n.skin-1 .ibox-content, .skin-1 .ibox-title {\n  border-width: 1px\n}\n\n.skin-1 .ibox-content:last-child {\n  border-style: solid\n}\n\n.skin-1 .nav > li.active {\n  border: none\n}\n\n.skin-1 .nav-header {\n  padding: 35px 25px 25px\n}\n\n.skin-1 .nav-header a.dropdown-toggle {\n  color: #fff;\n  margin-top: 10px\n}\n\n.skin-1 .nav-header a.dropdown-toggle .text-muted {\n  color: #fff;\n  opacity: .8\n}\n\n.skin-1 .profile-element {\n  text-align: center\n}\n\n.skin-1 .img-circle {\n  border-radius: 5px\n}\n\n.skin-1 .navbar-default .nav > li > a:focus, .skin-1 .navbar-default .nav > li > a:hover {\n  background: #39aef5;\n  color: #fff\n}\n\n.skin-1 .nav.nav-tabs > li.active > a {\n  color: #555\n}\n\n.skin-1 .content-tabs {\n  border-bottom: solid 2px #39aef5\n}\n\n.skin-1 .nav.nav-tabs > li.active {\n  background: 0 0\n}\n\n.skin-1 .page-tabs a.active {\n  background: #39aef5;\n  color: #fff\n}\n\n.skin-1 .page-tabs a.active i:hover, .skin-1 .page-tabs a.active:hover {\n  background: #0e9aef;\n  color: #fff\n}\n\n.skin-3 .minimalize-styl-2 {\n  margin: 14px 5px 5px 30px\n}\n\n.skin-3 .navbar-top-links li:last-child {\n  margin-right: 30px\n}\n\n.skin-3.fixed-nav .minimalize-styl-2 {\n  margin: 14px 5px 5px 15px\n}\n\n.skin-3 .spin-icon {\n  background: #ecba52 !important\n}\n\nbody.boxed-layout.skin-3 #wrapper {\n  background: #3e2c42\n}\n\n.skin-3 .nav-header {\n  background: #ecba52;\n  background: url(patterns/header-profile-skin-3.png)\n}\n\n.skin-3.mini-navbar .nav-second-level {\n  background: #3e2c42\n}\n\n.skin-3 .breadcrumb {\n  background: 0 0\n}\n\n.skin-3 .page-heading {\n  border: none\n}\n\n.skin-3 .nav > li.active {\n  background: #38283c\n}\n\n.fixed-nav.skin-3 .navbar-fixed-top {\n  background: #fff\n}\n\n.skin-3 .nav > li > a {\n  color: #948b96\n}\n\n.skin-3 .nav > li.active > a {\n  color: #fff\n}\n\n.skin-3 .navbar-minimalize {\n  background: #ecba52;\n  border-color: #ecba52\n}\n\nbody.skin-3 {\n  background: #3e2c42\n}\n\n.skin-3 .navbar-static-top {\n  background: #fff\n}\n\n.skin-3 .dashboard-header {\n  background: 0 0;\n  border-bottom: none !important;\n  border-top: none;\n  padding: 20px 30px 10px\n}\n\n.skin-3 .wrapper-content {\n  padding: 30px 15px\n}\n\n.skin-3 #page-wrapper {\n  background: #f4f6fa\n}\n\n.skin-3 .ibox-content, .skin-3 .ibox-title {\n  border-width: 1px\n}\n\n.skin-3 .ibox-content:last-child {\n  border-style: solid\n}\n\n.skin-3 .nav > li.active {\n  border: none\n}\n\n.skin-3 .nav-header {\n  padding: 35px 25px 25px\n}\n\n.skin-3 .nav-header a.dropdown-toggle {\n  color: #fff;\n  margin-top: 10px\n}\n\n.skin-3 .nav-header a.dropdown-toggle .text-muted {\n  color: #fff;\n  opacity: .8\n}\n\n.skin-3 .profile-element {\n  text-align: center\n}\n\n.skin-3 .img-circle {\n  border-radius: 5px\n}\n\n.skin-3 .navbar-default .nav > li > a:focus, .skin-3 .navbar-default .nav > li > a:hover {\n  background: #38283c;\n  color: #fff\n}\n\n.skin-3 .nav.nav-tabs > li.active > a {\n  color: #555\n}\n\n.skin-3 .content-tabs {\n  border-bottom: solid 2px #3e2c42\n}\n\n.skin-3 .nav.nav-tabs > li.active {\n  background: 0 0\n}\n\n.skin-3 .page-tabs a.active {\n  background: #3e2c42;\n  color: #fff\n}\n\n.skin-3 .page-tabs a.active i:hover, .skin-3 .page-tabs a.active:hover {\n  background: #38283c;\n  color: #fff\n}\n\n@media (min-width: 768px) {\n  .navbar-top-links .dropdown-alerts, .navbar-top-links .dropdown-messages, .navbar-top-links .dropdown-tasks {\n    margin-left: auto\n  }\n}\n\n@media (max-width: 768px) {\n  body.fixed-sidebar .navbar-static-side {\n    display: none\n  }\n\n  body.fixed-sidebar.mini-navbar .navbar-static-side {\n    width: 70px\n  }\n\n  .lock-word, .navbar-form-custom {\n    display: none\n  }\n\n  .navbar-header {\n    display: inline;\n    float: left\n  }\n\n  .sidebard-panel {\n    z-index: 2;\n    position: relative;\n    width: auto;\n    min-height: 100% !important\n  }\n\n  .sidebar-content .wrapper {\n    padding-right: 0;\n    z-index: 1\n  }\n\n  .fixed-sidebar.body-small .navbar-static-side {\n    display: none;\n    z-index: 2001;\n    position: fixed;\n    width: 220px\n  }\n\n  .fixed-sidebar.body-small.mini-navbar .navbar-static-side {\n    display: block\n  }\n\n  .ibox-tools {\n    float: none;\n    text-align: right;\n    display: block\n  }\n\n  .content-tabs {\n    display: none\n  }\n\n  #content-main {\n    height: calc(100% - 100px)\n  }\n\n  .fixed-nav #content-main {\n    height: calc(100% - 38px)\n  }\n}\n\n.navbar-static-side {\n  background: #2f4050\n}\n\n.nav-close {\n  padding: 10px;\n  position: absolute;\n  right: 5px;\n  top: 5px;\n  font-size: 1.4em;\n  cursor: pointer;\n  z-index: 10;\n  display: none;\n  color: rgba(255, 255, 255, .3)\n}\n\n@media (max-width: 350px) {\n  body.fixed-sidebar.mini-navbar .navbar-static-side {\n    width: 0\n  }\n\n  .nav-close {\n    display: block\n  }\n\n  #page-wrapper {\n    margin-left: 0 !important\n  }\n\n  .timeline-item .date {\n    text-align: left;\n    width: 110px;\n    position: relative;\n    padding-top: 30px\n  }\n\n  .timeline-item .date i {\n    position: absolute;\n    top: 0;\n    left: 15px;\n    padding: 5px;\n    width: 30px;\n    text-align: center;\n    border: 1px solid #e7eaec;\n    background: #f8f8f8\n  }\n\n  .timeline-item .content {\n    border-left: none;\n    border-top: 1px solid #e7eaec;\n    padding-top: 10px;\n    min-height: 100px\n  }\n\n  .nav.navbar-top-links li.dropdown {\n    display: none\n  }\n\n  .ibox-tools {\n    float: none;\n    text-align: left;\n    display: inline-block\n  }\n}\n\n.ui-jqgrid-titlebar {\n  height: 40px;\n  line-height: 24px;\n  color: #676a6c;\n  background-color: #F9F9F9;\n  text-shadow: 0 1px 0 rgba(255, 255, 255, .5)\n}\n\n.ui-jqgrid .ui-jqgrid-title {\n  float: left;\n  margin-left: 5px;\n  font-weight: 700\n}\n\n.ui-jqgrid .ui-jqgrid-titlebar {\n  position: relative;\n  border-left: 0 solid;\n  border-right: 0 solid;\n  border-top: 0 solid\n}\n\n.social-feed-separated .social-feed-box {\n  margin-left: 62px\n}\n\n.social-feed-separated .social-avatar {\n  float: left;\n  padding: 0\n}\n\n.social-feed-separated .social-avatar img {\n  width: 52px;\n  height: 52px;\n  border: 1px solid #e7eaec\n}\n\n.social-feed-separated .social-feed-box .social-avatar {\n  padding: 15px 15px 0;\n  float: none\n}\n\n.social-feed-box {\n  border: 1px solid #e7eaec;\n  background: #fff;\n  margin-bottom: 15px\n}\n\n.article .social-feed-box {\n  margin-bottom: 0;\n  border-bottom: none\n}\n\n.article .social-feed-box:last-child {\n  margin-bottom: 0;\n  border-bottom: 1px solid #e7eaec\n}\n\n.article .social-feed-box p {\n  font-size: 13px;\n  line-height: 18px\n}\n\n.social-action {\n  margin: 15px\n}\n\n.social-avatar {\n  padding: 15px 15px 0\n}\n\n.social-comment .social-comment {\n  margin-left: 45px\n}\n\n.social-avatar img {\n  height: 40px;\n  width: 40px;\n  margin-right: 10px\n}\n\n.social-avatar .media-body a {\n  font-size: 14px;\n  display: block\n}\n\n.social-body {\n  padding: 15px\n}\n\n.social-body img {\n  margin-bottom: 10px\n}\n\n.social-footer {\n  border-top: 1px solid #e7eaec;\n  padding: 10px 15px;\n  background: #f9f9f9\n}\n\n.social-footer .social-comment img {\n  width: 32px;\n  margin-right: 10px\n}\n\n.social-comment:first-child {\n  margin-top: 0\n}\n\n.social-comment {\n  margin-top: 15px\n}\n\n.social-comment textarea {\n  font-size: 12px\n}\n\n.checkbox input[type=checkbox], .checkbox-inline input[type=checkbox], .radio input[type=radio], .radio-inline input[type=radio] {\n  margin-top: -4px\n}\n\n@media (max-width: 1000px) {\n  .welcome-message {\n    display: none\n  }\n}\n\n.echarts {\n  height: 240px\n}\n\n.checkbox-inline, .checkbox-inline + .checkbox-inline, .radio-inline, .radio-inline + .radio-inline {\n  margin: 0 15px 0 0\n}\n\n.navbar-toggle {\n  background-color: #fff\n}\n\n.J_menuTab {\n  -webkit-transition: all .3s ease-out 0s;\n  transition: all .3s ease-out 0s\n}\n\n::-webkit-scrollbar-track {\n  background-color: #F5F5F5\n}\n\n::-webkit-scrollbar {\n  width: 6px;\n  background-color: #F5F5F5\n}\n\n::-webkit-scrollbar-thumb {\n  background-color: #999\n}\n\n.gohome {\n  position: fixed;\n  top: 20px;\n  right: 20px;\n  z-index: 100\n}\n\n.gohome a {\n  height: 38px;\n  width: 38px;\n  display: block;\n  background: #2f4050;\n  padding: 9px 8px;\n  text-align: center;\n  color: #fff;\n  border-radius: 50%;\n  opacity: .5\n}\n\n.gohome a:hover {\n  opacity: 1\n}\n\n@media only screen and (-webkit-min-device-pixel-ratio: 2) {\n  #content-main {\n    -webkit-overflow-scrolling: touch;\n  }\n}\n\n.navbar-header {\n  width: 60%\n}\n\n.bs-glyphicons {\n  margin: 0 -10px 20px;\n  overflow: hidden\n}\n\n.bs-glyphicons-list {\n  padding-left: 0;\n  list-style: none\n}\n\n.bs-glyphicons li {\n  float: left;\n  width: 25%;\n  height: 115px;\n  padding: 10px;\n  font-size: 10px;\n  line-height: 1.4;\n  text-align: center;\n  background-color: #f9f9f9;\n  border: 1px solid #fff\n}\n\n.bs-glyphicons .glyphicon {\n  margin-top: 5px;\n  margin-bottom: 10px;\n  font-size: 24px\n}\n\n.bs-glyphicons .glyphicon-class {\n  display: block;\n  text-align: center;\n  word-wrap: break-word\n}\n\n.bs-glyphicons li:hover {\n  color: #fff;\n  background-color: #1ab394\n}\n\n@media (min-width: 768px) {\n  .bs-glyphicons {\n    margin-right: 0;\n    margin-left: 0\n  }\n\n  .bs-glyphicons li {\n    width: 12.5%;\n    font-size: 12px\n  }\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/html/home.html",
    "content": "<!DOCTYPE html>\n<html lang=\"zh\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>微信管理后台 - 首页</title>\n    <meta name=\"keywords\" content=\"微信管理后台\">\n    <meta name=\"description\" content=\"基于电商平台\">\n    <link rel=\"shortcut icon\" href=\"favicon.ico\">\n    <link href=\"../css/bootstrap.min14ed.css?v=3.3.6\" rel=\"stylesheet\">\n    <link href=\"../css/font-awesome.min93e3.css?v=4.4.0\" rel=\"stylesheet\">\n    <!-- Gritter 提示牌-->\n    <link href=\"../js/plugins/gritter/jquery.gritter.css\" rel=\"stylesheet\">\n\n    <link href=\"../css/animate.min.css\" rel=\"stylesheet\">\n    <link href=\"../css/style.min862f.css?v=4.1.0\" rel=\"stylesheet\">\n</head>\n\n<body class=\"gray-bg\">\n    <div class=\"wrapper wrapper-content\">\n        <div class=\"row\">\n            <div class=\"col-sm-3\">\n                <div class=\"ibox float-e-margins\">\n                    <div class=\"ibox-title\">\n                        <span class=\"label label-success pull-right\">当月</span>\n                        <h5>收入</h5>\n                    </div>\n                    <div class=\"ibox-content\">\n                        <h1 class=\"no-margins\">6,226.5</h1>\n                        <div class=\"stat-percent font-bold text-success\">&yen;6,921 <i class=\"fa fa-bolt\"></i></div>\n                        <small>上月收入</small>\n                    </div>\n                </div>\n            </div>\n            <div class=\"col-sm-3\">\n                <div class=\"ibox float-e-margins\">\n                    <div class=\"ibox-title\">\n                        <span class=\"label label-info pull-right\">当月</span>\n                        <h5>订单</h5>\n                    </div>\n                    <div class=\"ibox-content\">\n                        <h1 class=\"no-margins\">156</h1>\n                        <div class=\"stat-percent font-bold text-info\">126 <i class=\"fa fa-level-up\"></i></div>\n                        <small>上月订单</small>\n                    </div>\n                </div>\n            </div>\n            <div class=\"col-sm-3\">\n                <div class=\"ibox float-e-margins\">\n                    <div class=\"ibox-title\">\n                        <span class=\"label label-primary pull-right\">今天</span>\n                        <h5>访客</h5>\n                    </div>\n                    <div class=\"ibox-content\">\n                        <h1 class=\"no-margins\">186</h1>\n                        <div class=\"stat-percent font-bold text-navy\">6 <i class=\"fa fa-level-up\"></i></div>\n                        <small>新访客</small>\n                    </div>\n                </div>\n            </div>\n            <div class=\"col-sm-3\">\n                <div class=\"ibox float-e-margins\">\n                    <div class=\"ibox-title\">\n                        <span class=\"label label-danger pull-right\">最近一个月</span>\n                        <h5>活跃用户</h5>\n                    </div>\n                    <div class=\"ibox-content\">\n                        <h1 class=\"no-margins\">368</h1>\n                        <div class=\"stat-percent font-bold text-danger\">2% <i class=\"fa fa-level-down\"></i></div>\n                        <small>9月</small>\n                    </div>\n                </div>\n            </div>\n        </div>\n        <div class=\"row\">\n            <div class=\"col-sm-12\">\n\n                <div class=\"animated fadeInUp\">\n                    <div class=\"ibox\">\n                        <div class=\"ibox-title\">\n                            <h5>实时订单</h5>\n                            <div class=\"msg\" style=\"margin-left: 40%; float: left\">更新于 10月25日14:35:17</div>\n                            <div class=\"ibox-tools\">\n                                <button type=\"button\" id=\"loading-example-btn\" class=\"btn btn-white btn-sm\"><i class=\"fa fa-refresh\"></i> 刷新</button>\n                                <a href=\"projects.html\" class=\"btn btn-primary btn-xs\">查看所有订单 &gt;&gt;</a>\n                            </div>\n                        </div>\n                        <div class=\"ibox-content\">\n                            <div class=\"project-list\">\n                                <table class=\"table table-hover\">\n                                    <tbody>\n                                        <tr>\n                                            <td class=\"project-status\">\n                                                <span class=\"label label-primary\">已付款</span>\n                                            </td>\n                                            <td class=\"project-title\">\n                                                <a href=\"project_detail.html\">张三 - 孙寺镇张楼村张三家 - 18600536683</a>\n                                                <br/>\n                                                <small><i class=\"fa fa-clock-o\"></i> 2014.08.15 11:25:16</small>\n                                            </td>\n                                            <td class=\"project-completion\">\n                                                6 件商品\n                                            </td>\n                                            <td class=\"project-people\">\n                                                <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"../img/a3.jpg\"></a>\n                                                <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"../img/a1.jpg\"></a>\n                                                <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"../img/a2.jpg\"></a>\n                                                <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"../img/a4.jpg\"></a>\n                                            </td>\n                                            <td class=\"project-actions\">\n                                                <a href=\"projects.html#\" class=\"btn btn-white btn-sm\"><i class=\"fa fa-folder\"></i> 查看 </a>\n                                            </td>\n                                        </tr>\n                                        <tr>\n                                            <td class=\"project-status\">\n                                                <span class=\"label label-primary\">已付款</span>\n                                            </td>\n                                            <td class=\"project-title\">\n                                                <a href=\"project_detail.html\">张三 - 孙寺镇张楼村张三家 - 18600536683</a>\n                                                <br/>\n                                                <small><i class=\"fa fa-clock-o\"></i> 2014.08.15 11:25:16</small>\n                                            </td>\n                                            <td class=\"project-completion\">\n                                                6 件商品\n                                            </td>\n                                            <td class=\"project-people\">\n                                                <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"../img/a3.jpg\"></a>\n                                                <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"../img/a1.jpg\"></a>\n                                                <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"../img/a1.jpg\"></a>\n                                                <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"../img/a2.jpg\"></a>\n                                                <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"../img/a4.jpg\"></a>\n                                                <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"../img/a4.jpg\"></a>\n                                            </td>\n                                            <td class=\"project-actions\">\n                                                <a href=\"projects.html#\" class=\"btn btn-white btn-sm\"><i class=\"fa fa-folder\"></i> 查看 </a>\n                                            </td>\n                                        </tr>\n                                        <tr>\n                                            <td class=\"project-status\">\n                                                <span class=\"label label-primary\">已付款</span>\n                                            </td>\n                                            <td class=\"project-title\">\n                                                <a href=\"project_detail.html\">张三 - 孙寺镇张楼村张三家 - 18600536683</a>\n                                                <br/>\n                                                <small><i class=\"fa fa-clock-o\"></i> 2014.08.15 11:25:16</small>\n                                            </td>\n                                            <td class=\"project-completion\">\n                                                6 件商品\n                                            </td>\n                                            <td class=\"project-people\">\n                                                <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"../img/a3.jpg\"></a>\n                                                <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"../img/a1.jpg\"></a>\n                                                <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"../img/a1.jpg\"></a>\n                                                <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"../img/a2.jpg\"></a>\n                                                <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"../img/a4.jpg\"></a>\n                                                <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"../img/a4.jpg\"></a>\n                                            </td>\n                                            <td class=\"project-actions\">\n                                                <a href=\"projects.html#\" class=\"btn btn-white btn-sm\"><i class=\"fa fa-folder\"></i> 查看 </a>\n                                            </td>\n                                        </tr>\n                                        <tr>\n                                            <td class=\"project-status\">\n                                                <span class=\"label label-warning\">货到付款</span>\n                                            </td>\n                                            <td class=\"project-title\">\n                                                <a href=\"project_detail.html\">李四 - 孙寺镇郑庄张三家 - 18600536683</a>\n                                                <br/>\n                                                <small><i class=\"fa fa-clock-o\"></i> 2014.08.15 11:25:16</small>\n                                            </td>\n                                            <td class=\"project-completion\">\n                                                2 件商品\n                                            </td>\n                                            <td class=\"project-people\">\n                                                <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"../img/a7.jpg\"></a>\n                                                <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"../img/a6.jpg\"></a>\n                                                <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"../img/a3.jpg\"></a>\n                                            </td>\n                                            <td class=\"project-actions\">\n                                                <a href=\"projects.html#\" class=\"btn btn-white btn-sm\"><i class=\"fa fa-folder\"></i> 查看 </a>\n                                            </td>\n                                        </tr>\n                                        <tr>\n                                            <td class=\"project-status\">\n                                                <span class=\"label label-default\">已取消</span>\n                                            </td>\n                                            <td class=\"project-title\">\n                                                <a href=\"project_detail.html\">张三 - 孙寺镇刘楼村张三家 - 18600536683</a>\n                                                <br/>\n                                                <small><i class=\"fa fa-clock-o\"></i> 2014.08.15 11:25:16</small>\n                                            </td>\n                                            <td class=\"project-completion\">\n                                                3 件商品\n                                            </td>\n                                            <td class=\"project-people\">\n                                                <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"../img/a1.jpg\"></a>\n                                                <a href=\"projects.html\"><img alt=\"image\" class=\"img-circle\" src=\"../img/a3.jpg\"></a>\n                                            </td>\n                                            <td class=\"project-actions\">\n                                                <a href=\"projects.html#\" class=\"btn btn-white btn-sm\"><i class=\"fa fa-folder\"></i> 查看 </a>\n                                            </td>\n                                        </tr>\n                                    </tbody>\n                                </table>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n\n            </div>\n        </div>\n        <div class=\"row\">\n            <div class=\"col-sm-4\">\n                <div class=\"ibox float-e-margins\">\n                    <div class=\"ibox-title\">\n                        <h5>消息</h5>\n                        <div class=\"ibox-tools\">\n                            <a class=\"collapse-link\"><i class=\"fa fa-chevron-up\"></i></a>\n                            <a class=\"close-link\"><i class=\"fa fa-times\"></i></a>\n                        </div>\n                    </div>\n                    <div class=\"ibox-content ibox-heading\">\n                        <h3><i class=\"fa fa-envelope-o\"></i> 新消息</h3>\n                        <small><i class=\"fa fa-tim\"></i> 您有22条未读消息</small>\n                    </div>\n                    <div class=\"ibox-content\">\n                        <div class=\"feed-activity-list\">\n                            <div class=\"feed-element\">\n                                <div>\n                                    <small class=\"pull-right text-navy\">1月前</small>\n                                    <strong>井幽幽</strong>\n                                    <div>有人说：“一辈子很长，要跟一个有趣的人在一起”。我想关注我的人，应该是那种喜欢找乐子也乐意分享乐趣的人，你们一定挺优秀的。所以单身的应该在这条留言，互相勾搭一下。特别有钱人又帅可以直接私信我！</div>\n                                    <small class=\"text-muted\">4月11日 00:00</small>\n                                </div>\n                            </div>\n                            <div class=\"feed-element\">\n                                <div>\n                                    <small class=\"pull-right\">2月前</small>\n                                    <strong>马伯庸 </strong>\n                                    <div>又方便，又防水，手感又好，还可以用手机遥控。简直是拍戏利器，由其是跟老师们搭戏的时候…想想还有点小激动啊，嘿嘿。</div>\n                                    <small class=\"text-muted\">11月8日 20:08 </small>\n                                </div>\n                            </div>\n                            <div class=\"feed-element\">\n                                <div>\n                                    <small class=\"pull-right\">5月前</small>\n                                    <strong>芒果宓 </strong>\n                                    <div>一个完整的梦。</div>\n                                    <small class=\"text-muted\">11月8日 20:08 </small>\n                                </div>\n                            </div>\n                            <div class=\"feed-element\">\n                                <div>\n                                    <small class=\"pull-right\">5月前</small>\n                                    <strong>刺猬尼克索</strong>\n                                    <div>哈哈哈哈 你卖什么萌啊! 蠢死了</div>\n                                    <small class=\"text-muted\">11月8日 20:08 </small>\n                                </div>\n                            </div>\n                            <div class=\"feed-element\">\n                                <div>\n                                    <small class=\"pull-right\">5月前</small>\n                                    <strong>老刀99</strong>\n                                    <div>昨天评论里你见过最“温暖和感人”的诗句，整理其中经典100首，值得你收下学习。</div>\n                                    <small class=\"text-muted\">11月8日 20:08 </small>\n                                </div>\n                            </div>\n                            <div class=\"feed-element\">\n                                <div>\n                                    <small class=\"pull-right\">5月前</small>\n                                    <strong>娱乐小主 </strong>\n                                    <div>你是否想过记录自己的梦？你是否想过有自己的一个记梦本？小时候写日记，没得写了就写昨晚的梦，后来变成了习惯………翻了一晚上自己做过的梦，想哭，想笑…</div>\n                                    <small class=\"text-muted\">11月8日 20:08 </small>\n                                </div>\n                            </div>\n                            <div class=\"feed-element\">\n                                <div>\n                                    <small class=\"pull-right\">5月前</small>\n                                    <strong>DMG电影 </strong>\n                                    <div>《和外国男票乘地铁，被中国大妈骂不要脸》妹子实在委屈到不行，中国妹子找外国男友很令人不能接受吗？大家都来说说自己的看法</div>\n                                    <small class=\"text-muted\">11月8日 20:08 </small>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n\n            <div class=\"col-sm-8\">\n                <div class=\"row\">\n                    <div class=\"col-sm-12\">\n                        <div class=\"ibox float-e-margins\">\n                            <div class=\"ibox-title\">\n                                <h5>交易地区</h5>\n                                <div class=\"ibox-tools\">\n                                    <a class=\"collapse-link\"><i class=\"fa fa-chevron-up\"></i></a>\n                                    <a class=\"close-link\"><i class=\"fa fa-times\"></i></a>\n                                </div>\n                            </div>\n                            <div class=\"ibox-content\">\n                                <div class=\"row\">\n                                    <div class=\"col-sm-12\">\n                                        <table class=\"table table-hover margin bottom\">\n                                            <thead>\n                                            <tr>\n                                                <th style=\"width: 12%\" class=\"text-center\">序号</th>\n                                                <th>交易</th>\n                                                <th class=\"text-center\">日期</th>\n                                                <th class=\"text-center\">销售额</th>\n                                            </tr>\n                                            </thead>\n                                            <tbody>\n                                            <tr>\n                                                <td class=\"text-center\">1</td>\n                                                <td>防盗门</td>\n                                                <td class=\"text-center small\">2014.9.15</td>\n                                                <td class=\"text-center\"><span class=\"label label-primary\">&yen;483.00</span></td>\n                                            </tr>\n                                            <tr>\n                                                <td class=\"text-center\">2</td>\n                                                <td>衣柜</td>\n                                                <td class=\"text-center small\">2014.9.15</td>\n                                                <td class=\"text-center\"><span class=\"label label-primary\">&yen;327.00</span></td>\n                                            </tr>\n                                            <tr>\n                                                <td class=\"text-center\">3</td>\n                                                <td>防盗门</td>\n                                                <td class=\"text-center small\">2014.9.15</td>\n                                                <td class=\"text-center\"><span class=\"label label-warning\">&yen;125.00</span></td>\n\n                                            </tr>\n                                            <tr>\n                                                <td class=\"text-center\">4</td>\n                                                <td>橱柜</td>\n                                                <td class=\"text-center small\">2014.9.15</td>\n                                                <td class=\"text-center\"><span class=\"label label-primary\">&yen;344.00</span></td>\n                                            </tr>\n                                            <tr>\n                                                <td class=\"text-center\">5</td>\n                                                <td>手机</td>\n                                                <td class=\"text-center small\">2014.9.15</td>\n                                                <td class=\"text-center\"><span class=\"label label-primary\">&yen;235.00</span></td>\n                                            </tr>\n                                            <tr>\n                                                <td class=\"text-center\">6</td>\n                                                <td>显示器</td>\n                                                <td class=\"text-center small\">2014.9.15</td>\n                                                <td class=\"text-center\"><span class=\"label label-primary\">&yen;100.00</span></td>\n                                            </tr>\n                                            </tbody>\n                                        </table>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n                <div class=\"row\">\n                    <div class=\"col-sm-6\">\n                        <div class=\"ibox float-e-margins\">\n                            <div class=\"ibox-title\">\n                                <h5>用户项目列表</h5>\n                                <div class=\"ibox-tools\">\n                                    <a class=\"collapse-link\"><i class=\"fa fa-chevron-up\"></i></a>\n                                    <a class=\"close-link\"><i class=\"fa fa-times\"></i></a>\n                                </div>\n                            </div>\n                            <div class=\"ibox-content\">\n                                <table class=\"table table-hover no-margins\">\n                                    <thead>\n                                        <tr>\n                                            <th>状态</th>\n                                            <th>日期</th>\n                                            <th>用户</th>\n                                            <th>值</th>\n                                        </tr>\n                                    </thead>\n                                    <tbody>\n                                        <tr>\n                                            <td><small>进行中...</small></td>\n                                            <td><i class=\"fa fa-clock-o\"></i> 11:20</td>\n                                            <td>青衣5858</td>\n                                            <td class=\"text-navy\"> <i class=\"fa fa-level-up\"></i> 24%</td>\n                                        </tr>\n                                        <tr>\n                                            <td><span class=\"label label-warning\">已取消</span></td>\n                                            <td><i class=\"fa fa-clock-o\"></i> 10:40</td>\n                                            <td>徐子崴</td>\n                                            <td class=\"text-navy\"> <i class=\"fa fa-level-up\"></i> 66%</td>\n                                        </tr>\n                                        <tr>\n                                            <td><small>进行中...</small></td>\n                                            <td><i class=\"fa fa-clock-o\"></i> 01:30</td>\n                                            <td>姜岚昕</td>\n                                            <td class=\"text-navy\"> <i class=\"fa fa-level-up\"></i> 54%</td>\n                                        </tr>\n                                        <tr>\n                                            <td><small>进行中...</small></td>\n                                            <td><i class=\"fa fa-clock-o\"></i> 02:20</td>\n                                            <td>武汉大兵哥</td>\n                                            <td class=\"text-navy\"> <i class=\"fa fa-level-up\"></i> 12%</td>\n                                        </tr>\n                                        <tr>\n                                            <td><small>进行中...</small></td>\n                                            <td><i class=\"fa fa-clock-o\"></i> 09:40</td>\n                                            <td>荆莹儿</td>\n                                            <td class=\"text-navy\"> <i class=\"fa fa-level-up\"></i> 22%</td>\n                                        </tr>\n                                        <tr>\n                                            <td><span class=\"label label-primary\">已完成</span></td>\n                                            <td><i class=\"fa fa-clock-o\"></i> 04:10</td>\n                                            <td>栾某某</td>\n                                            <td class=\"text-navy\"> <i class=\"fa fa-level-up\"></i> 66%</td>\n                                        </tr>\n                                        <tr>\n                                            <td><small>进行中...</small></td>\n                                            <td><i class=\"fa fa-clock-o\"></i> 12:08</td>\n                                            <td>范范范二妮</td>\n                                            <td class=\"text-navy\"> <i class=\"fa fa-level-up\"></i> 23%</td>\n                                        </tr>\n                                    </tbody>\n                                </table>\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"col-sm-6\">\n                        <div class=\"ibox float-e-margins\">\n                            <div class=\"ibox-title\">\n                                <h5>任务列表</h5>\n                                <div class=\"ibox-tools\">\n                                    <a class=\"collapse-link\"><i class=\"fa fa-chevron-up\"></i></a>\n                                    <a class=\"close-link\"><i class=\"fa fa-times\"></i></a>\n                                </div>\n                            </div>\n                            <div class=\"ibox-content\">\n                                <ul class=\"todo-list m-t small-list ui-sortable\">\n                                    <li>\n                                        <a href=\"widgets.html#\" class=\"check-link\"><i class=\"fa fa-check-square\"></i> </a>\n                                        <span class=\"m-l-xs todo-completed\">开会</span>\n                                    </li>\n                                    <li>\n                                        <a href=\"widgets.html#\" class=\"check-link\"><i class=\"fa fa-check-square\"></i> </a>\n                                        <span class=\"m-l-xs  todo-completed\">项目开发</span>\n                                    </li>\n                                    <li>\n                                        <a href=\"widgets.html#\" class=\"check-link\"><i class=\"fa fa-square-o\"></i> </a>\n                                        <span class=\"m-l-xs\">修改bug</span>\n                                        <small class=\"label label-primary\"><i class=\"fa fa-clock-o\"></i> 1小时</small>\n                                    </li>\n                                    <li>\n                                        <a href=\"widgets.html#\" class=\"check-link\"><i class=\"fa fa-square-o\"></i> </a>\n                                        <span class=\"m-l-xs\">修改bug</span>\n                                        <small class=\"label label-primary\"><i class=\"fa fa-clock-o\"></i> 1小时</small>\n                                    </li>\n                                    <li>\n                                        <a href=\"widgets.html#\" class=\"check-link\"><i class=\"fa fa-square-o\"></i> </a>\n                                        <span class=\"m-l-xs\">修改bug</span>\n                                        <small class=\"label label-primary\"><i class=\"fa fa-clock-o\"></i> 1小时</small>\n                                    </li>\n                                    <li>\n                                        <a href=\"widgets.html#\" class=\"check-link\"><i class=\"fa fa-square-o\"></i> </a>\n                                        <span class=\"m-l-xs\">修改bug</span>\n                                        <small class=\"label label-primary\"><i class=\"fa fa-clock-o\"></i> 1小时</small>\n                                    </li>\n                                    <li>\n                                        <a href=\"widgets.html#\" class=\"check-link\"><i class=\"fa fa-square-o\"></i> </a>\n                                        <span class=\"m-l-xs\">修改bug</span>\n                                        <small class=\"label label-primary\"><i class=\"fa fa-clock-o\"></i> 1小时</small>\n                                    </li>\n                                </ul>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n    <script src=\"../js/jquery.min.js?v=2.1.4\"></script>\n    <script src=\"../js/bootstrap.min.js?v=3.3.6\"></script>\n    <script src=\"../js/content.min.js?v=1.0.0\"></script>\n    <script src=\"../js/plugins/jquery-ui/jquery-ui.min.js\"></script>\n    <script>\n        $(document).ready(function(){\n\n        });\n    </script>\n</body>\n</html>\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/html/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"zh\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"renderer\" content=\"webkit\">\n    <meta http-equiv=\"Cache-Control\" content=\"no-siteapp\" />\n    <title>微信管理后台 - 主页</title>\n    <meta name=\"keywords\" content=\"微信管理后台\">\n    <meta name=\"description\" content=\"基于电商平台\">\n    <!--[if lt IE 9]>\n    <meta http-equiv=\"refresh\" content=\"0;ie.html\" />\n    <![endif]-->\n    <link rel=\"shortcut icon\" href=\"favicon.ico\">\n    <link href=\"../css/bootstrap.min14ed.css?v=3.3.6\" rel=\"stylesheet\">\n    <link href=\"../css/font-awesome.min93e3.css?v=4.4.0\" rel=\"stylesheet\">\n    <link href=\"../css/animate.min.css\" rel=\"stylesheet\">\n    <link href=\"../css/style.min862f.css?v=4.1.0\" rel=\"stylesheet\">\n</head>\n\n<body class=\"fixed-sidebar full-height-layout gray-bg\" style=\"overflow:hidden\">\n    <div id=\"wrapper\">\n        <!--左侧导航开始-->\n        <nav class=\"navbar-default navbar-static-side\" role=\"navigation\">\n            <div class=\"nav-close\"><i class=\"fa fa-times-circle\"></i>\n            </div>\n            <div class=\"sidebar-collapse\">\n                <ul class=\"nav\" id=\"side-menu\">\n                    <li class=\"nav-header\">\n                        <div class=\"dropdown profile-element\">\n                            <span><img alt=\"image\" class=\"img-circle\" src=\"../img/profile_small.jpg\" /></span>\n                            <a data-toggle=\"dropdown\" class=\"dropdown-toggle\" href=\"#\">\n                                <span class=\"clear\">\n                                    <span class=\"block m-t-xs\"><strong class=\"font-bold\">Cheng</strong></span>\n                                    <span class=\"text-muted text-xs block\">超级管理员<b class=\"caret\"></b></span>\n                                </span>\n                            </a>\n                            <ul class=\"dropdown-menu animated fadeInRight m-t-xs\">\n                                <li><a class=\"J_menuItem\" href=\"form_avatar.html\">修改头像</a></li>\n                                <li><a class=\"J_menuItem\" href=\"profile.html\">个人资料</a></li>\n                                <li class=\"divider\"></li>\n                                <li><a href=\"login.html\">安全退出</a></li>\n                            </ul>\n                        </div>\n                        <div class=\"logo-element\">Shop</div>\n                    </li>\n                    <li>\n                        <a class=\"J_menuItem\" href=\"home.html\">\n                            <i class=\"fa fa-home\"></i>\n                            <span class=\"nav-label\">主页</span>\n                        </a>\n                    </li>\n                </ul>\n            </div>\n        </nav>\n        <!--左侧导航结束-->\n\n        <!--右侧部分开始-->\n        <div id=\"page-wrapper\" class=\"gray-bg dashbard-1\">\n            <div class=\"row border-bottom\">\n                <nav class=\"navbar navbar-static-top\" role=\"navigation\" style=\"margin-bottom: 0\">\n                    <div class=\"navbar-header\">\n                        <a class=\"navbar-minimalize minimalize-styl-2 btn btn-primary \" href=\"#\"><i class=\"fa fa-bars\"></i></a>\n                        <form role=\"search\" class=\"navbar-form-custom\" method=\"post\" action=\"http://www.zi-han.net/theme/hplus/search_results.html\">\n                            <div class=\"form-group\">\n                                <input type=\"text\" placeholder=\"请输入您需要查找的内容 …\" class=\"form-control\" name=\"top-search\" id=\"top-search\">\n                            </div>\n                        </form>\n                    </div>\n                    <ul class=\"nav navbar-top-links navbar-right\">\n                        <li class=\"dropdown\">\n                            <a class=\"dropdown-toggle count-info\" data-toggle=\"dropdown\" href=\"#\">\n                                <i class=\"fa fa-envelope\"></i> <span class=\"label label-warning\">16</span>\n                            </a>\n                            <ul class=\"dropdown-menu dropdown-messages\">\n                                <li class=\"m-t-xs\">\n                                    <div class=\"dropdown-messages-box\">\n                                        <a href=\"profile.html\" class=\"pull-left\"><img alt=\"image\" class=\"img-circle\" src=\"img/a7.jpg\"></a>\n                                        <div class=\"media-body\">\n                                            <small class=\"pull-right\">46小时前</small>\n                                            <strong>小四</strong> 这个在日本投降书上签字的军官，建国后一定是个不小的干部吧？<br>\n                                            <small class=\"text-muted\">3天前 2014.11.8</small>\n                                        </div>\n                                    </div>\n                                </li>\n                                <li class=\"divider\"></li>\n                                <li>\n                                    <div class=\"dropdown-messages-box\">\n                                        <a href=\"profile.html\" class=\"pull-left\"><img alt=\"image\" class=\"img-circle\" src=\"img/a4.jpg\"></a>\n                                        <div class=\"media-body \">\n                                            <small class=\"pull-right text-navy\">25小时前</small>\n                                            <strong>国民岳父</strong> 如何看待“男子不满自己爱犬被称为狗，刺伤路人”？——这人比犬还凶<br>\n                                            <small class=\"text-muted\">昨天</small>\n                                        </div>\n                                    </div>\n                                </li>\n                                <li class=\"divider\"></li>\n                                <li>\n                                    <div class=\"text-center link-block\">\n                                        <a class=\"J_menuItem\" href=\"mailbox.html\">\n                                            <i class=\"fa fa-envelope\"></i><strong> 查看所有消息</strong>\n                                        </a>\n                                    </div>\n                                </li>\n                            </ul>\n                        </li>\n                        <li class=\"dropdown\">\n                            <a class=\"dropdown-toggle count-info\" data-toggle=\"dropdown\" href=\"#\">\n                                <i class=\"fa fa-bell\"></i> <span class=\"label label-primary\">8</span>\n                            </a>\n                            <ul class=\"dropdown-menu dropdown-alerts\">\n                                <li>\n                                    <a href=\"mailbox.html\">\n                                        <div>\n                                            <i class=\"fa fa-envelope fa-fw\"></i> 您有16条未读消息\n                                            <span class=\"pull-right text-muted small\">4分钟前</span>\n                                        </div>\n                                    </a>\n                                </li>\n                                <li class=\"divider\"></li>\n                                <li>\n                                    <a href=\"profile.html\">\n                                        <div>\n                                            <i class=\"fa fa-qq fa-fw\"></i> 3条新回复\n                                            <span class=\"pull-right text-muted small\">12分钟钱</span>\n                                        </div>\n                                    </a>\n                                </li>\n                                <li class=\"divider\"></li>\n                                <li>\n                                    <div class=\"text-center link-block\">\n                                        <a class=\"J_menuItem\" href=\"notifications.html\">\n                                            <strong>查看所有 </strong><i class=\"fa fa-angle-right\"></i>\n                                        </a>\n                                    </div>\n                                </li>\n                            </ul>\n                        </li>\n                        <li class=\"dropdown hidden-xs\">\n                            <a class=\"right-sidebar-toggle\" aria-expanded=\"false\"><i class=\"fa fa-tasks\"></i> 主题</a>\n                        </li>\n                    </ul>\n                </nav>\n            </div>\n            <div class=\"row content-tabs\">\n                <button class=\"roll-nav roll-left J_tabLeft\"><i class=\"fa fa-backward\"></i>\n                </button>\n                <nav class=\"page-tabs J_menuTabs\">\n                    <div class=\"page-tabs-content\">\n                        <a href=\"javascript:;\" class=\"active J_menuTab\" data-id=\"home.html\">首页</a>\n                    </div>\n                </nav>\n                <button class=\"roll-nav roll-right J_tabRight\"><i class=\"fa fa-forward\"></i>\n                </button>\n                <div class=\"btn-group roll-nav roll-right\">\n                    <button class=\"dropdown J_tabClose\" data-toggle=\"dropdown\">关闭操作<span class=\"caret\"></span></button>\n                    <ul role=\"menu\" class=\"dropdown-menu dropdown-menu-right\">\n                        <li class=\"J_tabShowActive\"><a>定位当前选项卡</a></li>\n                        <li class=\"divider\"></li>\n                        <li class=\"J_tabCloseAll\"><a>关闭全部选项卡</a></li>\n                        <li class=\"J_tabCloseOther\"><a>关闭其他选项卡</a></li>\n                    </ul>\n                </div>\n                <a href=\"login.html\" class=\"roll-nav roll-right J_tabExit\"><i class=\"fa fa fa-sign-out\"></i> 退出</a>\n            </div>\n            <div class=\"row J_mainContent\" id=\"content-main\">\n                <iframe class=\"J_iframe\" name=\"iframe0\" width=\"100%\" height=\"100%\" src=\"home.html?v=4.0\" frameborder=\"0\" data-id=\"home.html\" seamless></iframe>\n            </div>\n            <div class=\"footer\">\n                <div class=\"pull-right\">By Cheng &copy; 2015-2016</div>\n            </div>\n        </div>\n        <!--右侧部分结束-->\n\n        <!--右侧边栏开始-->\n        <div id=\"right-sidebar\">\n            <div class=\"sidebar-container\">\n                <ul class=\"nav nav-tabs navs-2\">\n                    <li class=\"active\"><a data-toggle=\"tab\" href=\"#tab-1\"><i class=\"fa fa-gear\"></i> 主题</a></li>\n                    <li class=\"\"><a data-toggle=\"tab\" href=\"#tab-2\">通知</a></li>\n                </ul>\n                <div class=\"tab-content\">\n                    <div id=\"tab-1\" class=\"tab-pane active\">\n                        <div class=\"sidebar-title\">\n                            <h3><i class=\"fa fa-comments-o\"></i> 主题设置</h3>\n                            <small><i class=\"fa fa-tim\"></i> 你可以从这里选择和预览主题的布局和样式，这些设置会被保存在本地，下次打开的时候会直接应用这些设置。</small>\n                        </div>\n                        <div class=\"skin-setttings\">\n                            <div class=\"title\">主题设置</div>\n                            <div class=\"setings-item\">\n                                <span>收起左侧菜单</span>\n                                <div class=\"switch\">\n                                    <div class=\"onoffswitch\">\n                                        <input type=\"checkbox\" name=\"collapsemenu\" class=\"onoffswitch-checkbox\" id=\"collapsemenu\">\n                                        <label class=\"onoffswitch-label\" for=\"collapsemenu\">\n                                            <span class=\"onoffswitch-inner\"></span>\n                                            <span class=\"onoffswitch-switch\"></span>\n                                        </label>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"setings-item\">\n                                <span>固定顶部</span>\n                                <div class=\"switch\">\n                                    <div class=\"onoffswitch\">\n                                        <input type=\"checkbox\" name=\"fixednavbar\" class=\"onoffswitch-checkbox\" id=\"fixednavbar\">\n                                        <label class=\"onoffswitch-label\" for=\"fixednavbar\">\n                                            <span class=\"onoffswitch-inner\"></span><span class=\"onoffswitch-switch\"></span>\n                                        </label>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"setings-item\">\n                                <span>固定宽度</span>\n                                <div class=\"switch\">\n                                    <div class=\"onoffswitch\">\n                                        <input type=\"checkbox\" name=\"boxedlayout\" class=\"onoffswitch-checkbox\" id=\"boxedlayout\">\n                                        <label class=\"onoffswitch-label\" for=\"boxedlayout\">\n                                            <span class=\"onoffswitch-inner\"></span><span class=\"onoffswitch-switch\"></span>\n                                        </label>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"title\">皮肤选择</div>\n                            <div class=\"setings-item default-skin nb\">\n                                <span class=\"skin-name \"><a href=\"#\" class=\"s-skin-0\">默认皮肤</a></span>\n                            </div>\n                            <div class=\"setings-item blue-skin nb\">\n                                <span class=\"skin-name \"><a href=\"#\" class=\"s-skin-1\">蓝色主题</a></span>\n                            </div>\n                            <div class=\"setings-item yellow-skin nb\">\n                                <span class=\"skin-name \"><a href=\"#\" class=\"s-skin-3\">黄色/紫色主题</a></span>\n                            </div>\n                        </div>\n                    </div>\n                    <div id=\"tab-2\" class=\"tab-pane\">\n                        <div class=\"sidebar-title\">\n                            <h3> <i class=\"fa fa-comments-o\"></i> 最新通知</h3>\n                            <small><i class=\"fa fa-tim\"></i> 您当前有2条未读信息</small>\n                        </div>\n                        <div>\n                            <div class=\"sidebar-message\">\n                                <a href=\"#\">\n                                    <div class=\"pull-left text-center\">\n                                        <img alt=\"image\" class=\"img-circle message-avatar\" src=\"../img/a1.jpg\">\n                                        <div class=\"m-t-xs\">\n                                            <i class=\"fa fa-star text-warning\"></i>\n                                            <i class=\"fa fa-star text-warning\"></i>\n                                        </div>\n                                    </div>\n                                    <div class=\"media-body\">\n                                        据天津日报报道：瑞海公司董事长于学伟，副董事长董社轩等10人在13日上午已被控制。<br>\n                                        <small class=\"text-muted\">今天 4:21</small>\n                                    </div>\n                                </a>\n                            </div>\n                            <div class=\"sidebar-message\">\n                                <a href=\"#\">\n                                    <div class=\"pull-left text-center\">\n                                        <img alt=\"image\" class=\"img-circle message-avatar\" src=\"../img/a2.jpg\">\n                                    </div>\n                                    <div class=\"media-body\">\n                                        HCY48之音乐大魔王会员专属皮肤已上线，快来一键换装拥有他，宣告你对华晨宇的爱吧！<br>\n                                        <small class=\"text-muted\">昨天 2:45</small>\n                                    </div>\n                                </a>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n        <!--右侧边栏结束-->\n    </div>\n    s\n    <script src=\"../js/jquery.min.js?v=2.1.4\"></script>\n    <script src=\"../js/bootstrap.min.js?v=3.3.6\"></script>\n    <script src=\"../js/plugins/metisMenu/jquery.metisMenu.js\"></script>\n    <script src=\"../js/plugins/slimscroll/jquery.slimscroll.min.js\"></script>\n    <script src=\"../js/plugins/layer/layer.min.js\"></script>\n    <script src=\"../js/hplus.min.js?v=4.1.0\"></script>\n    <script src=\"../js/contabs.min.js\" type=\"text/javascript\"></script>\n    <script src=\"../js/plugins/pace/pace.min.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/html/login.html",
    "content": "<!DOCTYPE html>\n<html lang=\"zh\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0\">\n    <title>微信管理后台 - 登录</title>\n    <meta name=\"keywords\" content=\"微信管理后台\">\n    <meta name=\"description\" content=\"基于电商平台\">\n    <link href=\"../css/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"../css/font-awesome.min93e3.css?v=4.4.0\" rel=\"stylesheet\">\n    <link href=\"../css/animate.min.css\" rel=\"stylesheet\">\n    <link href=\"../css/style.min.css\" rel=\"stylesheet\">\n    <link href=\"../css/login.min.css\" rel=\"stylesheet\">\n    <!--[if lt IE 9]>\n    <meta http-equiv=\"refresh\" content=\"0;ie.html\" />\n    <![endif]-->\n</head>\n\n<body class=\"signin\">\n    <div class=\"signinpanel\">\n        <div class=\"row\">\n            <div class=\"col-sm-7\">\n                <div class=\"signin-info\">\n                    <div class=\"logopanel m-b\">\n                        <h1>[ WeiXin-Shop ]</h1>\n                    </div>\n                    <div class=\"m-b\"></div>\n                    <h4>欢迎使用 <strong>微信管理后台</strong></h4>\n                    <ul class=\"m-b\">\n                        <li><i class=\"fa fa-arrow-circle-o-right m-r-xs\"></i> 优势一</li>\n                        <li><i class=\"fa fa-arrow-circle-o-right m-r-xs\"></i> 优势二</li>\n                        <li><i class=\"fa fa-arrow-circle-o-right m-r-xs\"></i> 优势三</li>\n                        <li><i class=\"fa fa-arrow-circle-o-right m-r-xs\"></i> 优势四</li>\n                        <li><i class=\"fa fa-arrow-circle-o-right m-r-xs\"></i> 优势五</li>\n                    </ul>\n                    <!--<strong>还没有账号？ <a href=\"#\">立即注册&raquo;</a></strong>-->\n                </div>\n            </div>\n            <div class=\"col-sm-5\">\n                <form method=\"post\" action=\"http://www.zi-han.net/theme/hplus/index.html\">\n                    <h4 class=\"no-margins\">登录：</h4>\n                    <p class=\"m-t-md\">登录到微信管理后台</p>\n                    <input type=\"text\" class=\"form-control m-b uname\" placeholder=\"用户名\" />\n                    <input type=\"password\" class=\"form-control m-b pword\" placeholder=\"密码\" />\n                    <div class=\"captcha-area m-b\">\n                        <input type=\"text\" class=\"form-control captcha\" placeholder=\"验证码\"/>\n                        <img src=\"http://www.aqd123.com/manage/drawCheckCode\" style=\"cursor:pointer;\">\n                    </div>\n                    <a href=\"#\">忘记密码了？</a>\n                    <button class=\"btn btn-success btn-block\">登录</button>\n                </form>\n            </div>\n        </div>\n        <div class=\"signup-footer\">\n            <div class=\"pull-left\">\n                Copyright &copy; 2015-2016 <a href=\"###\">微信管理后台</a> Powered By Wxin v0.1\n            </div>\n        </div>\n    </div>\n</body>\n</html>\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/html/w-index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"zh\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"renderer\" content=\"webkit\">\n    <meta http-equiv=\"Cache-Control\" content=\"no-siteapp\" />\n    <title>微信管理后台 - 主页</title>\n    <meta name=\"keywords\" content=\"微信管理后台\">\n    <meta name=\"description\" content=\"基于电商平台\">\n    <!--[if lt IE 9]>\n    <meta http-equiv=\"refresh\" content=\"0;ie.html\" />\n    <![endif]-->\n    <link rel=\"shortcut icon\" href=\"favicon.ico\">\n    <link href=\"../css/bootstrap.min14ed.css?v=3.3.6\" rel=\"stylesheet\">\n    <link href=\"../css/font-awesome.min93e3.css?v=4.4.0\" rel=\"stylesheet\">\n    <link href=\"../css/animate.min.css\" rel=\"stylesheet\">\n    <link href=\"../css/style.min862f.css?v=4.1.0\" rel=\"stylesheet\">\n</head>\n\n<body class=\"fixed-sidebar full-height-layout gray-bg\" style=\"overflow:hidden\">\n    <div id=\"wrapper\">\n        <!--左侧导航开始-->\n        <nav class=\"navbar-default navbar-static-side\" role=\"navigation\">\n            <div class=\"nav-close\"><i class=\"fa fa-times-circle\"></i>\n            </div>\n            <div class=\"sidebar-collapse\">\n                <ul class=\"nav\" id=\"side-menu\">\n                    <li class=\"nav-header\">\n                        <div class=\"dropdown profile-element\">\n                            <span><img alt=\"image\" class=\"img-circle\" src=\"../img/profile_small.jpg\" /></span>\n                            <a data-toggle=\"dropdown\" class=\"dropdown-toggle\" href=\"#\">\n                                <span class=\"clear\">\n                                    <span class=\"block m-t-xs\"><strong class=\"font-bold\">Cheng</strong></span>\n                                    <span class=\"text-muted text-xs block\">超级管理员<b class=\"caret\"></b></span>\n                                </span>\n                            </a>\n                            <ul class=\"dropdown-menu animated fadeInRight m-t-xs\">\n                                <li><a class=\"J_menuItem\" href=\"form_avatar.html\">修改头像</a></li>\n                                <li><a class=\"J_menuItem\" href=\"profile.html\">个人资料</a></li>\n                                <li class=\"divider\"></li>\n                                <li><a href=\"login.html\">安全退出</a></li>\n                            </ul>\n                        </div>\n                        <div class=\"logo-element\">Shop</div>\n                    </li>\n                    <li>\n                        <a class=\"J_menuItem\" href=\"home.html\">\n                            <i class=\"fa fa-home\"></i>\n                            <span class=\"nav-label\">主页</span>\n                        </a>\n                    </li>\n                </ul>\n            </div>\n        </nav>\n        <!--左侧导航结束-->\n\n        <!--右侧部分开始-->\n        <div id=\"page-wrapper\" class=\"gray-bg dashbard-1\">\n            <div class=\"row border-bottom\">\n                <nav class=\"navbar navbar-static-top\" role=\"navigation\" style=\"margin-bottom: 0\">\n                    <div class=\"navbar-header\">\n                        <a class=\"navbar-minimalize minimalize-styl-2 btn btn-primary \" href=\"#\"><i class=\"fa fa-bars\"></i></a>\n                        <form role=\"search\" class=\"navbar-form-custom\" method=\"post\" action=\"http://www.zi-han.net/theme/hplus/search_results.html\">\n                            <div class=\"form-group\">\n                                <input type=\"text\" placeholder=\"请输入您需要查找的内容 …\" class=\"form-control\" name=\"top-search\" id=\"top-search\">\n                            </div>\n                        </form>\n                    </div>\n                    <ul class=\"nav navbar-top-links navbar-right\">\n                        <li class=\"dropdown\">\n                            <a class=\"dropdown-toggle count-info\" data-toggle=\"dropdown\" href=\"#\">\n                                <i class=\"fa fa-envelope\"></i> <span class=\"label label-warning\">16</span>\n                            </a>\n                            <ul class=\"dropdown-menu dropdown-messages\">\n                                <li class=\"m-t-xs\">\n                                    <div class=\"dropdown-messages-box\">\n                                        <a href=\"profile.html\" class=\"pull-left\"><img alt=\"image\" class=\"img-circle\" src=\"img/a7.jpg\"></a>\n                                        <div class=\"media-body\">\n                                            <small class=\"pull-right\">46小时前</small>\n                                            <strong>小四</strong> 这个在日本投降书上签字的军官，建国后一定是个不小的干部吧？<br>\n                                            <small class=\"text-muted\">3天前 2014.11.8</small>\n                                        </div>\n                                    </div>\n                                </li>\n                                <li class=\"divider\"></li>\n                                <li>\n                                    <div class=\"dropdown-messages-box\">\n                                        <a href=\"profile.html\" class=\"pull-left\"><img alt=\"image\" class=\"img-circle\" src=\"img/a4.jpg\"></a>\n                                        <div class=\"media-body \">\n                                            <small class=\"pull-right text-navy\">25小时前</small>\n                                            <strong>国民岳父</strong> 如何看待“男子不满自己爱犬被称为狗，刺伤路人”？——这人比犬还凶<br>\n                                            <small class=\"text-muted\">昨天</small>\n                                        </div>\n                                    </div>\n                                </li>\n                                <li class=\"divider\"></li>\n                                <li>\n                                    <div class=\"text-center link-block\">\n                                        <a class=\"J_menuItem\" href=\"mailbox.html\">\n                                            <i class=\"fa fa-envelope\"></i><strong> 查看所有消息</strong>\n                                        </a>\n                                    </div>\n                                </li>\n                            </ul>\n                        </li>\n                        <li class=\"dropdown\">\n                            <a class=\"dropdown-toggle count-info\" data-toggle=\"dropdown\" href=\"#\">\n                                <i class=\"fa fa-bell\"></i> <span class=\"label label-primary\">8</span>\n                            </a>\n                            <ul class=\"dropdown-menu dropdown-alerts\">\n                                <li>\n                                    <a href=\"mailbox.html\">\n                                        <div>\n                                            <i class=\"fa fa-envelope fa-fw\"></i> 您有16条未读消息\n                                            <span class=\"pull-right text-muted small\">4分钟前</span>\n                                        </div>\n                                    </a>\n                                </li>\n                                <li class=\"divider\"></li>\n                                <li>\n                                    <a href=\"profile.html\">\n                                        <div>\n                                            <i class=\"fa fa-qq fa-fw\"></i> 3条新回复\n                                            <span class=\"pull-right text-muted small\">12分钟钱</span>\n                                        </div>\n                                    </a>\n                                </li>\n                                <li class=\"divider\"></li>\n                                <li>\n                                    <div class=\"text-center link-block\">\n                                        <a class=\"J_menuItem\" href=\"notifications.html\">\n                                            <strong>查看所有 </strong><i class=\"fa fa-angle-right\"></i>\n                                        </a>\n                                    </div>\n                                </li>\n                            </ul>\n                        </li>\n                        <li class=\"dropdown hidden-xs\">\n                            <a class=\"right-sidebar-toggle\" aria-expanded=\"false\"><i class=\"fa fa-tasks\"></i> 主题</a>\n                        </li>\n                    </ul>\n                </nav>\n            </div>\n            <div class=\"row content-tabs\">\n                <button class=\"roll-nav roll-left J_tabLeft\"><i class=\"fa fa-backward\"></i>\n                </button>\n                <nav class=\"page-tabs J_menuTabs\">\n                    <div class=\"page-tabs-content\">\n                        <a href=\"javascript:;\" class=\"active J_menuTab\" data-id=\"home.html\">首页</a>\n                    </div>\n                </nav>\n                <button class=\"roll-nav roll-right J_tabRight\"><i class=\"fa fa-forward\"></i>\n                </button>\n                <div class=\"btn-group roll-nav roll-right\">\n                    <button class=\"dropdown J_tabClose\" data-toggle=\"dropdown\">关闭操作<span class=\"caret\"></span></button>\n                    <ul role=\"menu\" class=\"dropdown-menu dropdown-menu-right\">\n                        <li class=\"J_tabShowActive\"><a>定位当前选项卡</a></li>\n                        <li class=\"divider\"></li>\n                        <li class=\"J_tabCloseAll\"><a>关闭全部选项卡</a></li>\n                        <li class=\"J_tabCloseOther\"><a>关闭其他选项卡</a></li>\n                    </ul>\n                </div>\n                <a href=\"login.html\" class=\"roll-nav roll-right J_tabExit\"><i class=\"fa fa fa-sign-out\"></i> 退出</a>\n            </div>\n            <div class=\"row J_mainContent\" id=\"content-main\">\n                <iframe class=\"J_iframe\" name=\"iframe0\" width=\"100%\" height=\"100%\" src=\"home.html?v=4.0\" frameborder=\"0\" data-id=\"home.html\" seamless></iframe>\n            </div>\n            <div class=\"footer\">\n                <div class=\"pull-right\">By Cheng &copy; 2015-2016</div>\n            </div>\n        </div>\n        <!--右侧部分结束-->\n\n        <!--右侧边栏开始-->\n        <div id=\"right-sidebar\">\n            <div class=\"sidebar-container\">\n                <ul class=\"nav nav-tabs navs-2\">\n                    <li class=\"active\"><a data-toggle=\"tab\" href=\"#tab-1\"><i class=\"fa fa-gear\"></i> 主题</a></li>\n                    <li class=\"\"><a data-toggle=\"tab\" href=\"#tab-2\">通知</a></li>\n                </ul>\n                <div class=\"tab-content\">\n                    <div id=\"tab-1\" class=\"tab-pane active\">\n                        <div class=\"sidebar-title\">\n                            <h3><i class=\"fa fa-comments-o\"></i> 主题设置</h3>\n                            <small><i class=\"fa fa-tim\"></i> 你可以从这里选择和预览主题的布局和样式，这些设置会被保存在本地，下次打开的时候会直接应用这些设置。</small>\n                        </div>\n                        <div class=\"skin-setttings\">\n                            <div class=\"title\">主题设置</div>\n                            <div class=\"setings-item\">\n                                <span>收起左侧菜单</span>\n                                <div class=\"switch\">\n                                    <div class=\"onoffswitch\">\n                                        <input type=\"checkbox\" name=\"collapsemenu\" class=\"onoffswitch-checkbox\" id=\"collapsemenu\">\n                                        <label class=\"onoffswitch-label\" for=\"collapsemenu\">\n                                            <span class=\"onoffswitch-inner\"></span>\n                                            <span class=\"onoffswitch-switch\"></span>\n                                        </label>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"setings-item\">\n                                <span>固定顶部</span>\n                                <div class=\"switch\">\n                                    <div class=\"onoffswitch\">\n                                        <input type=\"checkbox\" name=\"fixednavbar\" class=\"onoffswitch-checkbox\" id=\"fixednavbar\">\n                                        <label class=\"onoffswitch-label\" for=\"fixednavbar\">\n                                            <span class=\"onoffswitch-inner\"></span><span class=\"onoffswitch-switch\"></span>\n                                        </label>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"setings-item\">\n                                <span>固定宽度</span>\n                                <div class=\"switch\">\n                                    <div class=\"onoffswitch\">\n                                        <input type=\"checkbox\" name=\"boxedlayout\" class=\"onoffswitch-checkbox\" id=\"boxedlayout\">\n                                        <label class=\"onoffswitch-label\" for=\"boxedlayout\">\n                                            <span class=\"onoffswitch-inner\"></span><span class=\"onoffswitch-switch\"></span>\n                                        </label>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"title\">皮肤选择</div>\n                            <div class=\"setings-item default-skin nb\">\n                                <span class=\"skin-name \"><a href=\"#\" class=\"s-skin-0\">默认皮肤</a></span>\n                            </div>\n                            <div class=\"setings-item blue-skin nb\">\n                                <span class=\"skin-name \"><a href=\"#\" class=\"s-skin-1\">蓝色主题</a></span>\n                            </div>\n                            <div class=\"setings-item yellow-skin nb\">\n                                <span class=\"skin-name \"><a href=\"#\" class=\"s-skin-3\">黄色/紫色主题</a></span>\n                            </div>\n                        </div>\n                    </div>\n                    <div id=\"tab-2\" class=\"tab-pane\">\n                        <div class=\"sidebar-title\">\n                            <h3> <i class=\"fa fa-comments-o\"></i> 最新通知</h3>\n                            <small><i class=\"fa fa-tim\"></i> 您当前有2条未读信息</small>\n                        </div>\n                        <div>\n                            <div class=\"sidebar-message\">\n                                <a href=\"#\">\n                                    <div class=\"pull-left text-center\">\n                                        <img alt=\"image\" class=\"img-circle message-avatar\" src=\"../img/a1.jpg\">\n                                        <div class=\"m-t-xs\">\n                                            <i class=\"fa fa-star text-warning\"></i>\n                                            <i class=\"fa fa-star text-warning\"></i>\n                                        </div>\n                                    </div>\n                                    <div class=\"media-body\">\n                                        据天津日报报道：瑞海公司董事长于学伟，副董事长董社轩等10人在13日上午已被控制。<br>\n                                        <small class=\"text-muted\">今天 4:21</small>\n                                    </div>\n                                </a>\n                            </div>\n                            <div class=\"sidebar-message\">\n                                <a href=\"#\">\n                                    <div class=\"pull-left text-center\">\n                                        <img alt=\"image\" class=\"img-circle message-avatar\" src=\"../img/a2.jpg\">\n                                    </div>\n                                    <div class=\"media-body\">\n                                        HCY48之音乐大魔王会员专属皮肤已上线，快来一键换装拥有他，宣告你对华晨宇的爱吧！<br>\n                                        <small class=\"text-muted\">昨天 2:45</small>\n                                    </div>\n                                </a>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n        <!--右侧边栏结束-->\n    </div>\n    s\n    <script src=\"../js/jquery.min.js?v=2.1.4\"></script>\n    <script src=\"../js/bootstrap.min.js?v=3.3.6\"></script>\n    <script src=\"../js/plugins/metisMenu/jquery.metisMenu.js\"></script>\n    <script src=\"../js/plugins/slimscroll/jquery.slimscroll.min.js\"></script>\n    <script src=\"../js/plugins/layer/layer.min.js\"></script>\n    <script src=\"../js/hplus.min.js?v=4.1.0\"></script>\n    <script src=\"../js/contabs.min.js\" type=\"text/javascript\"></script>\n    <script src=\"../js/plugins/pace/pace.min.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/beautifyhtml/beautifyhtml.js",
    "content": "/*jshint curly:true, eqeqeq:true, laxbreak:true, noempty:false */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2013 Einar Lielmanis and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n\n\n Style HTML\n---------------\n\n  Written by Nochum Sossonko, (nsossonko@hotmail.com)\n\n  Based on code initially developed by: Einar Lielmanis, <elfz@laacz.lv>\n    http://jsbeautifier.org/\n\n  Usage:\n    style_html(html_source);\n\n    style_html(html_source, options);\n\n  The options are:\n    indent_size (default 4)          — indentation size,\n    indent_char (default space)      — character to indent with,\n    max_char (default 250)            -  maximum amount of characters per line (0 = disable)\n    brace_style (default \"collapse\") - \"collapse\" | \"expand\" | \"end-expand\"\n            put braces on the same line as control statements (default), or put braces on own line (Allman / ANSI style), or just put end braces on own line.\n    unformatted (defaults to inline tags) - list of tags, that shouldn't be reformatted\n    indent_scripts (default normal)  - \"keep\"|\"separate\"|\"normal\"\n\n    e.g.\n\n    style_html(html_source, {\n      'indent_size': 2,\n      'indent_char': ' ',\n      'max_char': 78,\n      'brace_style': 'expand',\n      'unformatted': ['a', 'sub', 'sup', 'b', 'i', 'u']\n    });\n*/\n\n(function() {\n\n    function style_html(html_source, options, js_beautify, css_beautify) {\n    //Wrapper function to invoke all the necessary constructors and deal with the output.\n\n      var multi_parser,\n          indent_size,\n          indent_character,\n          max_char,\n          brace_style,\n          unformatted;\n\n      options = options || {};\n      indent_size = options.indent_size || 4;\n      indent_character = options.indent_char || ' ';\n      brace_style = options.brace_style || 'collapse';\n      max_char = options.max_char === 0 ? Infinity : options.max_char || 250;\n      unformatted = options.unformatted || ['a', 'span', 'bdo', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'sub', 'sup', 'tt', 'i', 'b', 'big', 'small', 'u', 's', 'strike', 'font', 'ins', 'del', 'pre', 'address', 'dt', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\n\n      function Parser() {\n\n        this.pos = 0; //Parser position\n        this.token = '';\n        this.current_mode = 'CONTENT'; //reflects the current Parser mode: TAG/CONTENT\n        this.tags = { //An object to hold tags, their position, and their parent-tags, initiated with default values\n          parent: 'parent1',\n          parentcount: 1,\n          parent1: ''\n        };\n        this.tag_type = '';\n        this.token_text = this.last_token = this.last_text = this.token_type = '';\n\n        this.Utils = { //Uilities made available to the various functions\n          whitespace: \"\\n\\r\\t \".split(''),\n          single_token: 'br,input,link,meta,!doctype,basefont,base,area,hr,wbr,param,img,isindex,?xml,embed,?php,?,?='.split(','), //all the single tags for HTML\n          extra_liners: 'head,body,/html'.split(','), //for tags that need a line of whitespace before them\n          in_array: function (what, arr) {\n            for (var i=0; i<arr.length; i++) {\n              if (what === arr[i]) {\n                return true;\n              }\n            }\n            return false;\n          }\n        };\n\n        this.get_content = function () { //function to capture regular content between tags\n\n          var input_char = '',\n              content = [],\n              space = false; //if a space is needed\n\n          while (this.input.charAt(this.pos) !== '<') {\n            if (this.pos >= this.input.length) {\n              return content.length?content.join(''):['', 'TK_EOF'];\n            }\n\n            input_char = this.input.charAt(this.pos);\n            this.pos++;\n            this.line_char_count++;\n\n            if (this.Utils.in_array(input_char, this.Utils.whitespace)) {\n              if (content.length) {\n                space = true;\n              }\n              this.line_char_count--;\n              continue; //don't want to insert unnecessary space\n            }\n            else if (space) {\n              if (this.line_char_count >= this.max_char) { //insert a line when the max_char is reached\n                content.push('\\n');\n                for (var i=0; i<this.indent_level; i++) {\n                  content.push(this.indent_string);\n                }\n                this.line_char_count = 0;\n              }\n              else{\n                content.push(' ');\n                this.line_char_count++;\n              }\n              space = false;\n            }\n            content.push(input_char); //letter at-a-time (or string) inserted to an array\n          }\n          return content.length?content.join(''):'';\n        };\n\n        this.get_contents_to = function (name) { //get the full content of a script or style to pass to js_beautify\n          if (this.pos === this.input.length) {\n            return ['', 'TK_EOF'];\n          }\n          var input_char = '';\n          var content = '';\n          var reg_match = new RegExp('</' + name + '\\\\s*>', 'igm');\n          reg_match.lastIndex = this.pos;\n          var reg_array = reg_match.exec(this.input);\n          var end_script = reg_array?reg_array.index:this.input.length; //absolute end of script\n          if(this.pos < end_script) { //get everything in between the script tags\n            content = this.input.substring(this.pos, end_script);\n            this.pos = end_script;\n          }\n          return content;\n        };\n\n        this.record_tag = function (tag){ //function to record a tag and its parent in this.tags Object\n          if (this.tags[tag + 'count']) { //check for the existence of this tag type\n            this.tags[tag + 'count']++;\n            this.tags[tag + this.tags[tag + 'count']] = this.indent_level; //and record the present indent level\n          }\n          else { //otherwise initialize this tag type\n            this.tags[tag + 'count'] = 1;\n            this.tags[tag + this.tags[tag + 'count']] = this.indent_level; //and record the present indent level\n          }\n          this.tags[tag + this.tags[tag + 'count'] + 'parent'] = this.tags.parent; //set the parent (i.e. in the case of a div this.tags.div1parent)\n          this.tags.parent = tag + this.tags[tag + 'count']; //and make this the current parent (i.e. in the case of a div 'div1')\n        };\n\n        this.retrieve_tag = function (tag) { //function to retrieve the opening tag to the corresponding closer\n          if (this.tags[tag + 'count']) { //if the openener is not in the Object we ignore it\n            var temp_parent = this.tags.parent; //check to see if it's a closable tag.\n            while (temp_parent) { //till we reach '' (the initial value);\n              if (tag + this.tags[tag + 'count'] === temp_parent) { //if this is it use it\n                break;\n              }\n              temp_parent = this.tags[temp_parent + 'parent']; //otherwise keep on climbing up the DOM Tree\n            }\n            if (temp_parent) { //if we caught something\n              this.indent_level = this.tags[tag + this.tags[tag + 'count']]; //set the indent_level accordingly\n              this.tags.parent = this.tags[temp_parent + 'parent']; //and set the current parent\n            }\n            delete this.tags[tag + this.tags[tag + 'count'] + 'parent']; //delete the closed tags parent reference...\n            delete this.tags[tag + this.tags[tag + 'count']]; //...and the tag itself\n            if (this.tags[tag + 'count'] === 1) {\n              delete this.tags[tag + 'count'];\n            }\n            else {\n              this.tags[tag + 'count']--;\n            }\n          }\n        };\n\n        this.get_tag = function (peek) { //function to get a full tag and parse its type\n          var input_char = '',\n              content = [],\n              comment = '',\n              space = false,\n              tag_start, tag_end,\n              orig_pos = this.pos,\n              orig_line_char_count = this.line_char_count;\n\n          peek = peek !== undefined ? peek : false;\n\n          do {\n            if (this.pos >= this.input.length) {\n              if (peek) {\n                this.pos = orig_pos;\n                this.line_char_count = orig_line_char_count;\n              }\n              return content.length?content.join(''):['', 'TK_EOF'];\n            }\n\n            input_char = this.input.charAt(this.pos);\n            this.pos++;\n            this.line_char_count++;\n\n            if (this.Utils.in_array(input_char, this.Utils.whitespace)) { //don't want to insert unnecessary space\n              space = true;\n              this.line_char_count--;\n              continue;\n            }\n\n            if (input_char === \"'\" || input_char === '\"') {\n              if (!content[1] || content[1] !== '!') { //if we're in a comment strings don't get treated specially\n                input_char += this.get_unformatted(input_char);\n                space = true;\n              }\n            }\n\n            if (input_char === '=') { //no space before =\n              space = false;\n            }\n\n            if (content.length && content[content.length-1] !== '=' && input_char !== '>' && space) {\n                //no space after = or before >\n              if (this.line_char_count >= this.max_char) {\n                this.print_newline(false, content);\n                this.line_char_count = 0;\n              }\n              else {\n                content.push(' ');\n                this.line_char_count++;\n              }\n              space = false;\n            }\n            if (input_char === '<') {\n              tag_start = this.pos - 1;\n            }\n            content.push(input_char); //inserts character at-a-time (or string)\n          } while (input_char !== '>');\n\n          var tag_complete = content.join('');\n          var tag_index;\n          if (tag_complete.indexOf(' ') !== -1) { //if there's whitespace, thats where the tag name ends\n            tag_index = tag_complete.indexOf(' ');\n          }\n          else { //otherwise go with the tag ending\n            tag_index = tag_complete.indexOf('>');\n          }\n          var tag_check = tag_complete.substring(1, tag_index).toLowerCase();\n          if (tag_complete.charAt(tag_complete.length-2) === '/' ||\n            this.Utils.in_array(tag_check, this.Utils.single_token)) { //if this tag name is a single tag type (either in the list or has a closing /)\n            if ( ! peek) {\n              this.tag_type = 'SINGLE';\n            }\n          }\n          else if (tag_check === 'script') { //for later script handling\n            if ( ! peek) {\n              this.record_tag(tag_check);\n              this.tag_type = 'SCRIPT';\n            }\n          }\n          else if (tag_check === 'style') { //for future style handling (for now it justs uses get_content)\n            if ( ! peek) {\n              this.record_tag(tag_check);\n              this.tag_type = 'STYLE';\n            }\n          }\n          else if (this.is_unformatted(tag_check, unformatted)) { // do not reformat the \"unformatted\" tags\n            comment = this.get_unformatted('</'+tag_check+'>', tag_complete); //...delegate to get_unformatted function\n            content.push(comment);\n            // Preserve collapsed whitespace either before or after this tag.\n            if (tag_start > 0 && this.Utils.in_array(this.input.charAt(tag_start - 1), this.Utils.whitespace)){\n                content.splice(0, 0, this.input.charAt(tag_start - 1));\n            }\n            tag_end = this.pos - 1;\n            if (this.Utils.in_array(this.input.charAt(tag_end + 1), this.Utils.whitespace)){\n                content.push(this.input.charAt(tag_end + 1));\n            }\n            this.tag_type = 'SINGLE';\n          }\n          else if (tag_check.charAt(0) === '!') { //peek for <!-- comment\n            if (tag_check.indexOf('[if') !== -1) { //peek for <!--[if conditional comment\n              if (tag_complete.indexOf('!IE') !== -1) { //this type needs a closing --> so...\n                comment = this.get_unformatted('-->', tag_complete); //...delegate to get_unformatted\n                content.push(comment);\n              }\n              if ( ! peek) {\n                this.tag_type = 'START';\n              }\n            }\n            else if (tag_check.indexOf('[endif') !== -1) {//peek for <!--[endif end conditional comment\n              this.tag_type = 'END';\n              this.unindent();\n            }\n            else if (tag_check.indexOf('[cdata[') !== -1) { //if it's a <[cdata[ comment...\n              comment = this.get_unformatted(']]>', tag_complete); //...delegate to get_unformatted function\n              content.push(comment);\n              if ( ! peek) {\n                this.tag_type = 'SINGLE'; //<![CDATA[ comments are treated like single tags\n              }\n            }\n            else {\n              comment = this.get_unformatted('-->', tag_complete);\n              content.push(comment);\n              this.tag_type = 'SINGLE';\n            }\n          }\n          else if ( ! peek) {\n            if (tag_check.charAt(0) === '/') { //this tag is a double tag so check for tag-ending\n              this.retrieve_tag(tag_check.substring(1)); //remove it and all ancestors\n              this.tag_type = 'END';\n            }\n            else { //otherwise it's a start-tag\n              this.record_tag(tag_check); //push it on the tag stack\n              this.tag_type = 'START';\n            }\n            if (this.Utils.in_array(tag_check, this.Utils.extra_liners)) { //check if this double needs an extra line\n              this.print_newline(true, this.output);\n            }\n          }\n\n          if (peek) {\n            this.pos = orig_pos;\n            this.line_char_count = orig_line_char_count;\n          }\n\n          return content.join(''); //returns fully formatted tag\n        };\n\n        this.get_unformatted = function (delimiter, orig_tag) { //function to return unformatted content in its entirety\n\n          if (orig_tag && orig_tag.toLowerCase().indexOf(delimiter) !== -1) {\n            return '';\n          }\n          var input_char = '';\n          var content = '';\n          var space = true;\n          do {\n\n            if (this.pos >= this.input.length) {\n              return content;\n            }\n\n            input_char = this.input.charAt(this.pos);\n            this.pos++;\n\n            if (this.Utils.in_array(input_char, this.Utils.whitespace)) {\n              if (!space) {\n                this.line_char_count--;\n                continue;\n              }\n              if (input_char === '\\n' || input_char === '\\r') {\n                content += '\\n';\n                /*  Don't change tab indention for unformatted blocks.  If using code for html editing, this will greatly affect <pre> tags if they are specified in the 'unformatted array'\n                for (var i=0; i<this.indent_level; i++) {\n                  content += this.indent_string;\n                }\n                space = false; //...and make sure other indentation is erased\n                */\n                this.line_char_count = 0;\n                continue;\n              }\n            }\n            content += input_char;\n            this.line_char_count++;\n            space = true;\n\n\n          } while (content.toLowerCase().indexOf(delimiter) === -1);\n          return content;\n        };\n\n        this.get_token = function () { //initial handler for token-retrieval\n          var token;\n\n          if (this.last_token === 'TK_TAG_SCRIPT' || this.last_token === 'TK_TAG_STYLE') { //check if we need to format javascript\n           var type = this.last_token.substr(7);\n           token = this.get_contents_to(type);\n            if (typeof token !== 'string') {\n              return token;\n            }\n            return [token, 'TK_' + type];\n          }\n          if (this.current_mode === 'CONTENT') {\n            token = this.get_content();\n            if (typeof token !== 'string') {\n              return token;\n            }\n            else {\n              return [token, 'TK_CONTENT'];\n            }\n          }\n\n          if (this.current_mode === 'TAG') {\n            token = this.get_tag();\n            if (typeof token !== 'string') {\n              return token;\n            }\n            else {\n              var tag_name_type = 'TK_TAG_' + this.tag_type;\n              return [token, tag_name_type];\n            }\n          }\n        };\n\n        this.get_full_indent = function (level) {\n          level = this.indent_level + level || 0;\n          if (level < 1) {\n            return '';\n          }\n\n          return Array(level + 1).join(this.indent_string);\n        };\n\n        this.is_unformatted = function(tag_check, unformatted) {\n            //is this an HTML5 block-level link?\n            if (!this.Utils.in_array(tag_check, unformatted)){\n                return false;\n            }\n\n            if (tag_check.toLowerCase() !== 'a' || !this.Utils.in_array('a', unformatted)){\n                return true;\n            }\n\n            //at this point we have an  tag; is its first child something we want to remain\n            //unformatted?\n            var next_tag = this.get_tag(true /* peek. */);\n\n            // tets next_tag to see if it is just html tag (no external content)\n            var tag = (next_tag || \"\").match(/^\\s*<\\s*\\/?([a-z]*)\\s*[^>]*>\\s*$/);\n\n            // if next_tag comes back but is not an isolated tag, then\n            // let's treat the 'a' tag as having content\n            // and respect the unformatted option\n            if (!tag || this.Utils.in_array(tag, unformatted)){\n                return true;\n            } else {\n                return false;\n            }\n        };\n\n        this.printer = function (js_source, indent_character, indent_size, max_char, brace_style) { //handles input/output and some other printing functions\n\n          this.input = js_source || ''; //gets the input for the Parser\n          this.output = [];\n          this.indent_character = indent_character;\n          this.indent_string = '';\n          this.indent_size = indent_size;\n          this.brace_style = brace_style;\n          this.indent_level = 0;\n          this.max_char = max_char;\n          this.line_char_count = 0; //count to see if max_char was exceeded\n\n          for (var i=0; i<this.indent_size; i++) {\n            this.indent_string += this.indent_character;\n          }\n\n          this.print_newline = function (ignore, arr) {\n            this.line_char_count = 0;\n            if (!arr || !arr.length) {\n              return;\n            }\n            if (!ignore) { //we might want the extra line\n              while (this.Utils.in_array(arr[arr.length-1], this.Utils.whitespace)) {\n                arr.pop();\n              }\n            }\n            arr.push('\\n');\n            for (var i=0; i<this.indent_level; i++) {\n              arr.push(this.indent_string);\n            }\n          };\n\n          this.print_token = function (text) {\n            this.output.push(text);\n          };\n\n          this.indent = function () {\n            this.indent_level++;\n          };\n\n          this.unindent = function () {\n            if (this.indent_level > 0) {\n              this.indent_level--;\n            }\n          };\n        };\n        return this;\n      }\n\n      /*_____________________--------------------_____________________*/\n\n      multi_parser = new Parser(); //wrapping functions Parser\n      multi_parser.printer(html_source, indent_character, indent_size, max_char, brace_style); //initialize starting values\n\n      while (true) {\n          var t = multi_parser.get_token();\n          multi_parser.token_text = t[0];\n          multi_parser.token_type = t[1];\n\n        if (multi_parser.token_type === 'TK_EOF') {\n          break;\n        }\n\n        switch (multi_parser.token_type) {\n          case 'TK_TAG_START':\n            multi_parser.print_newline(false, multi_parser.output);\n            multi_parser.print_token(multi_parser.token_text);\n            multi_parser.indent();\n            multi_parser.current_mode = 'CONTENT';\n            break;\n          case 'TK_TAG_STYLE':\n          case 'TK_TAG_SCRIPT':\n            multi_parser.print_newline(false, multi_parser.output);\n            multi_parser.print_token(multi_parser.token_text);\n            multi_parser.current_mode = 'CONTENT';\n            break;\n          case 'TK_TAG_END':\n            //Print new line only if the tag has no content and has child\n            if (multi_parser.last_token === 'TK_CONTENT' && multi_parser.last_text === '') {\n                var tag_name = multi_parser.token_text.match(/\\w+/)[0];\n                var tag_extracted_from_last_output = multi_parser.output[multi_parser.output.length -1].match(/<\\s*(\\w+)/);\n                if (tag_extracted_from_last_output === null || tag_extracted_from_last_output[1] !== tag_name) {\n                    multi_parser.print_newline(true, multi_parser.output);\n                }\n            }\n            multi_parser.print_token(multi_parser.token_text);\n            multi_parser.current_mode = 'CONTENT';\n            break;\n          case 'TK_TAG_SINGLE':\n            // Don't add a newline before elements that should remain unformatted.\n            var tag_check = multi_parser.token_text.match(/^\\s*<([a-z]+)/i);\n            if (!tag_check || !multi_parser.Utils.in_array(tag_check[1], unformatted)){\n                multi_parser.print_newline(false, multi_parser.output);\n            }\n            multi_parser.print_token(multi_parser.token_text);\n            multi_parser.current_mode = 'CONTENT';\n            break;\n          case 'TK_CONTENT':\n            if (multi_parser.token_text !== '') {\n              multi_parser.print_token(multi_parser.token_text);\n            }\n            multi_parser.current_mode = 'TAG';\n            break;\n          case 'TK_STYLE':\n          case 'TK_SCRIPT':\n            if (multi_parser.token_text !== '') {\n              multi_parser.output.push('\\n');\n              var text = multi_parser.token_text,\n                  _beautifier,\n                  script_indent_level = 1;\n              if (multi_parser.token_type === 'TK_SCRIPT') {\n                _beautifier = typeof js_beautify === 'function' && js_beautify;\n              } else if (multi_parser.token_type === 'TK_STYLE') {\n                _beautifier = typeof css_beautify === 'function' && css_beautify;\n              }\n\n              if (options.indent_scripts === \"keep\") {\n                script_indent_level = 0;\n              } else if (options.indent_scripts === \"separate\") {\n                script_indent_level = -multi_parser.indent_level;\n              }\n\n              var indentation = multi_parser.get_full_indent(script_indent_level);\n              if (_beautifier) {\n                // call the Beautifier if avaliable\n                text = _beautifier(text.replace(/^\\s*/, indentation), options);\n              } else {\n                // simply indent the string otherwise\n                var white = text.match(/^\\s*/)[0];\n                var _level = white.match(/[^\\n\\r]*$/)[0].split(multi_parser.indent_string).length - 1;\n                var reindent = multi_parser.get_full_indent(script_indent_level -_level);\n                text = text.replace(/^\\s*/, indentation)\n                       .replace(/\\r\\n|\\r|\\n/g, '\\n' + reindent)\n                       .replace(/\\s*$/, '');\n              }\n              if (text) {\n                multi_parser.print_token(text);\n                multi_parser.print_newline(true, multi_parser.output);\n              }\n            }\n            multi_parser.current_mode = 'TAG';\n            break;\n        }\n        multi_parser.last_token = multi_parser.token_type;\n        multi_parser.last_text = multi_parser.token_text;\n      }\n      return multi_parser.output.join('');\n    }\n\n    // If we're running a web page and don't have either of the above, add our one global\n    window.html_beautify = function(html_source, options) {\n        return style_html(html_source, options, window.js_beautify, window.css_beautify);\n    };\n\n}());\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/chosen/chosen.jquery.js",
    "content": "/*!\n Chosen, a Select Box Enhancer for jQuery and Prototype\n by Patrick Filler for Harvest, http://getharvest.com\n\n Version 1.1.0\n Full source at https://github.com/harvesthq/chosen\n Copyright (c) 2011 Harvest http://getharvest.com\n\n MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md\n This file is generated by `grunt build`, do not edit it by hand.\n */\n\n(function() {\n    var $, AbstractChosen, Chosen, SelectParser, _ref,\n        __hasProp = {}.hasOwnProperty,\n        __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\n    SelectParser = (function() {\n        function SelectParser() {\n            this.options_index = 0;\n            this.parsed = [];\n        }\n\n        SelectParser.prototype.add_node = function(child) {\n            if (child.nodeName.toUpperCase() === \"OPTGROUP\") {\n                return this.add_group(child);\n            } else {\n                return this.add_option(child);\n            }\n        };\n\n        SelectParser.prototype.add_group = function(group) {\n            var group_position, option, _i, _len, _ref, _results;\n            group_position = this.parsed.length;\n            this.parsed.push({\n                array_index: group_position,\n                group: true,\n                label: this.escapeExpression(group.label),\n                children: 0,\n                disabled: group.disabled\n            });\n            _ref = group.childNodes;\n            _results = [];\n            for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n                option = _ref[_i];\n                _results.push(this.add_option(option, group_position, group.disabled));\n            }\n            return _results;\n        };\n\n        SelectParser.prototype.add_option = function(option, group_position, group_disabled) {\n            if (option.nodeName.toUpperCase() === \"OPTION\") {\n                if (option.text !== \"\") {\n                    if (group_position != null) {\n                        this.parsed[group_position].children += 1;\n                    }\n                    this.parsed.push({\n                        array_index: this.parsed.length,\n                        options_index: this.options_index,\n                        value: option.value,\n                        text: option.text,\n                        html: option.innerHTML,\n                        selected: option.selected,\n                        disabled: group_disabled === true ? group_disabled : option.disabled,\n                        group_array_index: group_position,\n                        classes: option.className,\n                        style: option.style.cssText\n                    });\n                } else {\n                    this.parsed.push({\n                        array_index: this.parsed.length,\n                        options_index: this.options_index,\n                        empty: true\n                    });\n                }\n                return this.options_index += 1;\n            }\n        };\n\n        SelectParser.prototype.escapeExpression = function(text) {\n            var map, unsafe_chars;\n            if ((text == null) || text === false) {\n                return \"\";\n            }\n            if (!/[\\&\\<\\>\\\"\\'\\`]/.test(text)) {\n                return text;\n            }\n            map = {\n                \"<\": \"&lt;\",\n                \">\": \"&gt;\",\n                '\"': \"&quot;\",\n                \"'\": \"&#x27;\",\n                \"`\": \"&#x60;\"\n            };\n            unsafe_chars = /&(?!\\w+;)|[\\<\\>\\\"\\'\\`]/g;\n            return text.replace(unsafe_chars, function(chr) {\n                return map[chr] || \"&amp;\";\n            });\n        };\n\n        return SelectParser;\n\n    })();\n\n    SelectParser.select_to_array = function(select) {\n        var child, parser, _i, _len, _ref;\n        parser = new SelectParser();\n        _ref = select.childNodes;\n        for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n            child = _ref[_i];\n            parser.add_node(child);\n        }\n        return parser.parsed;\n    };\n\n    AbstractChosen = (function() {\n        function AbstractChosen(form_field, options) {\n            this.form_field = form_field;\n            this.options = options != null ? options : {};\n            if (!AbstractChosen.browser_is_supported()) {\n                return;\n            }\n            this.is_multiple = this.form_field.multiple;\n            this.set_default_text();\n            this.set_default_values();\n            this.setup();\n            this.set_up_html();\n            this.register_observers();\n        }\n\n        AbstractChosen.prototype.set_default_values = function() {\n            var _this = this;\n            this.click_test_action = function(evt) {\n                return _this.test_active_click(evt);\n            };\n            this.activate_action = function(evt) {\n                return _this.activate_field(evt);\n            };\n            this.active_field = false;\n            this.mouse_on_container = false;\n            this.results_showing = false;\n            this.result_highlighted = null;\n            this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === \"\" ? this.options.allow_single_deselect : false;\n            this.disable_search_threshold = this.options.disable_search_threshold || 0;\n            this.disable_search = this.options.disable_search || false;\n            this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true;\n            this.group_search = this.options.group_search != null ? this.options.group_search : true;\n            this.search_contains = this.options.search_contains || false;\n            this.single_backstroke_delete = this.options.single_backstroke_delete != null ? this.options.single_backstroke_delete : true;\n            this.max_selected_options = this.options.max_selected_options || Infinity;\n            this.inherit_select_classes = this.options.inherit_select_classes || false;\n            this.display_selected_options = this.options.display_selected_options != null ? this.options.display_selected_options : true;\n            return this.display_disabled_options = this.options.display_disabled_options != null ? this.options.display_disabled_options : true;\n        };\n\n        AbstractChosen.prototype.set_default_text = function() {\n            if (this.form_field.getAttribute(\"data-placeholder\")) {\n                this.default_text = this.form_field.getAttribute(\"data-placeholder\");\n            } else if (this.is_multiple) {\n                this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text;\n            } else {\n                this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text;\n            }\n            return this.results_none_found = this.form_field.getAttribute(\"data-no_results_text\") || this.options.no_results_text || AbstractChosen.default_no_result_text;\n        };\n\n        AbstractChosen.prototype.mouse_enter = function() {\n            return this.mouse_on_container = true;\n        };\n\n        AbstractChosen.prototype.mouse_leave = function() {\n            return this.mouse_on_container = false;\n        };\n\n        AbstractChosen.prototype.input_focus = function(evt) {\n            var _this = this;\n            if (this.is_multiple) {\n                if (!this.active_field) {\n                    return setTimeout((function() {\n                        return _this.container_mousedown();\n                    }), 50);\n                }\n            } else {\n                if (!this.active_field) {\n                    return this.activate_field();\n                }\n            }\n        };\n\n        AbstractChosen.prototype.input_blur = function(evt) {\n            var _this = this;\n            if (!this.mouse_on_container) {\n                this.active_field = false;\n                return setTimeout((function() {\n                    return _this.blur_test();\n                }), 100);\n            }\n        };\n\n        AbstractChosen.prototype.results_option_build = function(options) {\n            var content, data, _i, _len, _ref;\n            content = '';\n            _ref = this.results_data;\n            for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n                data = _ref[_i];\n                if (data.group) {\n                    content += this.result_add_group(data);\n                } else {\n                    content += this.result_add_option(data);\n                }\n                if (options != null ? options.first : void 0) {\n                    if (data.selected && this.is_multiple) {\n                        this.choice_build(data);\n                    } else if (data.selected && !this.is_multiple) {\n                        this.single_set_selected_text(data.text);\n                    }\n                }\n            }\n            return content;\n        };\n\n        AbstractChosen.prototype.result_add_option = function(option) {\n            var classes, option_el;\n            if (!option.search_match) {\n                return '';\n            }\n            if (!this.include_option_in_results(option)) {\n                return '';\n            }\n            classes = [];\n            if (!option.disabled && !(option.selected && this.is_multiple)) {\n                classes.push(\"active-result\");\n            }\n            if (option.disabled && !(option.selected && this.is_multiple)) {\n                classes.push(\"disabled-result\");\n            }\n            if (option.selected) {\n                classes.push(\"result-selected\");\n            }\n            if (option.group_array_index != null) {\n                classes.push(\"group-option\");\n            }\n            if (option.classes !== \"\") {\n                classes.push(option.classes);\n            }\n            option_el = document.createElement(\"li\");\n            option_el.className = classes.join(\" \");\n            option_el.style.cssText = option.style;\n            option_el.setAttribute(\"data-option-array-index\", option.array_index);\n            option_el.innerHTML = option.search_text;\n            return this.outerHTML(option_el);\n        };\n\n        AbstractChosen.prototype.result_add_group = function(group) {\n            var group_el;\n            if (!(group.search_match || group.group_match)) {\n                return '';\n            }\n            if (!(group.active_options > 0)) {\n                return '';\n            }\n            group_el = document.createElement(\"li\");\n            group_el.className = \"group-result\";\n            group_el.innerHTML = group.search_text;\n            return this.outerHTML(group_el);\n        };\n\n        AbstractChosen.prototype.results_update_field = function() {\n            this.set_default_text();\n            if (!this.is_multiple) {\n                this.results_reset_cleanup();\n            }\n            this.result_clear_highlight();\n            this.results_build();\n            if (this.results_showing) {\n                return this.winnow_results();\n            }\n        };\n\n        AbstractChosen.prototype.reset_single_select_options = function() {\n            var result, _i, _len, _ref, _results;\n            _ref = this.results_data;\n            _results = [];\n            for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n                result = _ref[_i];\n                if (result.selected) {\n                    _results.push(result.selected = false);\n                } else {\n                    _results.push(void 0);\n                }\n            }\n            return _results;\n        };\n\n        AbstractChosen.prototype.results_toggle = function() {\n            if (this.results_showing) {\n                return this.results_hide();\n            } else {\n                return this.results_show();\n            }\n        };\n\n        AbstractChosen.prototype.results_search = function(evt) {\n            if (this.results_showing) {\n                return this.winnow_results();\n            } else {\n                return this.results_show();\n            }\n        };\n\n        AbstractChosen.prototype.winnow_results = function() {\n            var escapedSearchText, option, regex, regexAnchor, results, results_group, searchText, startpos, text, zregex, _i, _len, _ref;\n            this.no_results_clear();\n            results = 0;\n            searchText = this.get_search_text();\n            escapedSearchText = searchText.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, \"\\\\$&\");\n            regexAnchor = this.search_contains ? \"\" : \"^\";\n            regex = new RegExp(regexAnchor + escapedSearchText, 'i');\n            zregex = new RegExp(escapedSearchText, 'i');\n            _ref = this.results_data;\n            for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n                option = _ref[_i];\n                option.search_match = false;\n                results_group = null;\n                if (this.include_option_in_results(option)) {\n                    if (option.group) {\n                        option.group_match = false;\n                        option.active_options = 0;\n                    }\n                    if ((option.group_array_index != null) && this.results_data[option.group_array_index]) {\n                        results_group = this.results_data[option.group_array_index];\n                        if (results_group.active_options === 0 && results_group.search_match) {\n                            results += 1;\n                        }\n                        results_group.active_options += 1;\n                    }\n                    if (!(option.group && !this.group_search)) {\n                        option.search_text = option.group ? option.label : option.html;\n                        option.search_match = this.search_string_match(option.search_text, regex);\n                        if (option.search_match && !option.group) {\n                            results += 1;\n                        }\n                        if (option.search_match) {\n                            if (searchText.length) {\n                                startpos = option.search_text.search(zregex);\n                                text = option.search_text.substr(0, startpos + searchText.length) + '</em>' + option.search_text.substr(startpos + searchText.length);\n                                option.search_text = text.substr(0, startpos) + '<em>' + text.substr(startpos);\n                            }\n                            if (results_group != null) {\n                                results_group.group_match = true;\n                            }\n                        } else if ((option.group_array_index != null) && this.results_data[option.group_array_index].search_match) {\n                            option.search_match = true;\n                        }\n                    }\n                }\n            }\n            this.result_clear_highlight();\n            if (results < 1 && searchText.length) {\n                this.update_results_content(\"\");\n                return this.no_results(searchText);\n            } else {\n                this.update_results_content(this.results_option_build());\n                return this.winnow_results_set_highlight();\n            }\n        };\n\n        AbstractChosen.prototype.search_string_match = function(search_string, regex) {\n            var part, parts, _i, _len;\n            if (regex.test(search_string)) {\n                return true;\n            } else if (this.enable_split_word_search && (search_string.indexOf(\" \") >= 0 || search_string.indexOf(\"[\") === 0)) {\n                parts = search_string.replace(/\\[|\\]/g, \"\").split(\" \");\n                if (parts.length) {\n                    for (_i = 0, _len = parts.length; _i < _len; _i++) {\n                        part = parts[_i];\n                        if (regex.test(part)) {\n                            return true;\n                        }\n                    }\n                }\n            }\n        };\n\n        AbstractChosen.prototype.choices_count = function() {\n            var option, _i, _len, _ref;\n            if (this.selected_option_count != null) {\n                return this.selected_option_count;\n            }\n            this.selected_option_count = 0;\n            _ref = this.form_field.options;\n            for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n                option = _ref[_i];\n                if (option.selected) {\n                    this.selected_option_count += 1;\n                }\n            }\n            return this.selected_option_count;\n        };\n\n        AbstractChosen.prototype.choices_click = function(evt) {\n            evt.preventDefault();\n            if (!(this.results_showing || this.is_disabled)) {\n                return this.results_show();\n            }\n        };\n\n        AbstractChosen.prototype.keyup_checker = function(evt) {\n            var stroke, _ref;\n            stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;\n            this.search_field_scale();\n            switch (stroke) {\n                case 8:\n                    if (this.is_multiple && this.backstroke_length < 1 && this.choices_count() > 0) {\n                        return this.keydown_backstroke();\n                    } else if (!this.pending_backstroke) {\n                        this.result_clear_highlight();\n                        return this.results_search();\n                    }\n                    break;\n                case 13:\n                    evt.preventDefault();\n                    if (this.results_showing) {\n                        return this.result_select(evt);\n                    }\n                    break;\n                case 27:\n                    if (this.results_showing) {\n                        this.results_hide();\n                    }\n                    return true;\n                case 9:\n                case 38:\n                case 40:\n                case 16:\n                case 91:\n                case 17:\n                    break;\n                default:\n                    return this.results_search();\n            }\n        };\n\n        AbstractChosen.prototype.clipboard_event_checker = function(evt) {\n            var _this = this;\n            return setTimeout((function() {\n                return _this.results_search();\n            }), 50);\n        };\n\n        AbstractChosen.prototype.container_width = function() {\n            if (this.options.width != null) {\n                return this.options.width;\n            } else {\n                return \"\" + this.form_field.offsetWidth + \"px\";\n            }\n        };\n\n        AbstractChosen.prototype.include_option_in_results = function(option) {\n            if (this.is_multiple && (!this.display_selected_options && option.selected)) {\n                return false;\n            }\n            if (!this.display_disabled_options && option.disabled) {\n                return false;\n            }\n            if (option.empty) {\n                return false;\n            }\n            return true;\n        };\n\n        AbstractChosen.prototype.search_results_touchstart = function(evt) {\n            this.touch_started = true;\n            return this.search_results_mouseover(evt);\n        };\n\n        AbstractChosen.prototype.search_results_touchmove = function(evt) {\n            this.touch_started = false;\n            return this.search_results_mouseout(evt);\n        };\n\n        AbstractChosen.prototype.search_results_touchend = function(evt) {\n            if (this.touch_started) {\n                return this.search_results_mouseup(evt);\n            }\n        };\n\n        AbstractChosen.prototype.outerHTML = function(element) {\n            var tmp;\n            if (element.outerHTML) {\n                return element.outerHTML;\n            }\n            tmp = document.createElement(\"div\");\n            tmp.appendChild(element);\n            return tmp.innerHTML;\n        };\n\n        AbstractChosen.browser_is_supported = function() {\n            if (window.navigator.appName === \"Microsoft Internet Explorer\") {\n                return document.documentMode >= 8;\n            }\n            if (/iP(od|hone)/i.test(window.navigator.userAgent)) {\n                return false;\n            }\n            if (/Android/i.test(window.navigator.userAgent)) {\n                if (/Mobile/i.test(window.navigator.userAgent)) {\n                    return false;\n                }\n            }\n            return true;\n        };\n\n        AbstractChosen.default_multiple_text = \"Select Some Options\";\n\n        AbstractChosen.default_single_text = \"Select an Option\";\n\n        AbstractChosen.default_no_result_text = \"No results match\";\n\n        return AbstractChosen;\n\n    })();\n\n    $ = jQuery;\n\n    $.fn.extend({\n        chosen: function(options) {\n            if (!AbstractChosen.browser_is_supported()) {\n                return this;\n            }\n            return this.each(function(input_field) {\n                var $this, chosen;\n                $this = $(this);\n                chosen = $this.data('chosen');\n                if (options === 'destroy' && chosen) {\n                    chosen.destroy();\n                } else if (!chosen) {\n                    $this.data('chosen', new Chosen(this, options));\n                }\n            });\n        }\n    });\n\n    Chosen = (function(_super) {\n        __extends(Chosen, _super);\n\n        function Chosen() {\n            _ref = Chosen.__super__.constructor.apply(this, arguments);\n            return _ref;\n        }\n\n        Chosen.prototype.setup = function() {\n            this.form_field_jq = $(this.form_field);\n            this.current_selectedIndex = this.form_field.selectedIndex;\n            return this.is_rtl = this.form_field_jq.hasClass(\"chosen-rtl\");\n        };\n\n        Chosen.prototype.set_up_html = function() {\n            var container_classes, container_props;\n            container_classes = [\"chosen-container\"];\n            container_classes.push(\"chosen-container-\" + (this.is_multiple ? \"multi\" : \"single\"));\n            if (this.inherit_select_classes && this.form_field.className) {\n                container_classes.push(this.form_field.className);\n            }\n            if (this.is_rtl) {\n                container_classes.push(\"chosen-rtl\");\n            }\n            container_props = {\n                'class': container_classes.join(' '),\n                'style': \"width: \" + (this.container_width()) + \";\",\n                'title': this.form_field.title\n            };\n            if (this.form_field.id.length) {\n                container_props.id = this.form_field.id.replace(/[^\\w]/g, '_') + \"_chosen\";\n            }\n            this.container = $(\"<div />\", container_props);\n            if (this.is_multiple) {\n                this.container.html('<ul class=\"chosen-choices\"><li class=\"search-field\"><input type=\"text\" value=\"' + this.default_text + '\" class=\"default\" autocomplete=\"off\" style=\"width:25px;\" /></li></ul><div class=\"chosen-drop\"><ul class=\"chosen-results\"></ul></div>');\n            } else {\n                this.container.html('<a class=\"chosen-single chosen-default\" tabindex=\"-1\"><span>' + this.default_text + '</span><div><b></b></div></a><div class=\"chosen-drop\"><div class=\"chosen-search\"><input type=\"text\" autocomplete=\"off\" /></div><ul class=\"chosen-results\"></ul></div>');\n            }\n            this.form_field_jq.hide().after(this.container);\n            this.dropdown = this.container.find('div.chosen-drop').first();\n            this.search_field = this.container.find('input').first();\n            this.search_results = this.container.find('ul.chosen-results').first();\n            this.search_field_scale();\n            this.search_no_results = this.container.find('li.no-results').first();\n            if (this.is_multiple) {\n                this.search_choices = this.container.find('ul.chosen-choices').first();\n                this.search_container = this.container.find('li.search-field').first();\n            } else {\n                this.search_container = this.container.find('div.chosen-search').first();\n                this.selected_item = this.container.find('.chosen-single').first();\n            }\n            this.results_build();\n            this.set_tab_index();\n            this.set_label_behavior();\n            return this.form_field_jq.trigger(\"chosen:ready\", {\n                chosen: this\n            });\n        };\n\n        Chosen.prototype.register_observers = function() {\n            var _this = this;\n            this.container.bind('mousedown.chosen', function(evt) {\n                _this.container_mousedown(evt);\n            });\n            this.container.bind('mouseup.chosen', function(evt) {\n                _this.container_mouseup(evt);\n            });\n            this.container.bind('mouseenter.chosen', function(evt) {\n                _this.mouse_enter(evt);\n            });\n            this.container.bind('mouseleave.chosen', function(evt) {\n                _this.mouse_leave(evt);\n            });\n            this.search_results.bind('mouseup.chosen', function(evt) {\n                _this.search_results_mouseup(evt);\n            });\n            this.search_results.bind('mouseover.chosen', function(evt) {\n                _this.search_results_mouseover(evt);\n            });\n            this.search_results.bind('mouseout.chosen', function(evt) {\n                _this.search_results_mouseout(evt);\n            });\n            this.search_results.bind('mousewheel.chosen DOMMouseScroll.chosen', function(evt) {\n                _this.search_results_mousewheel(evt);\n            });\n            this.search_results.bind('touchstart.chosen', function(evt) {\n                _this.search_results_touchstart(evt);\n            });\n            this.search_results.bind('touchmove.chosen', function(evt) {\n                _this.search_results_touchmove(evt);\n            });\n            this.search_results.bind('touchend.chosen', function(evt) {\n                _this.search_results_touchend(evt);\n            });\n            this.form_field_jq.bind(\"chosen:updated.chosen\", function(evt) {\n                _this.results_update_field(evt);\n            });\n            this.form_field_jq.bind(\"chosen:activate.chosen\", function(evt) {\n                _this.activate_field(evt);\n            });\n            this.form_field_jq.bind(\"chosen:open.chosen\", function(evt) {\n                _this.container_mousedown(evt);\n            });\n            this.form_field_jq.bind(\"chosen:close.chosen\", function(evt) {\n                _this.input_blur(evt);\n            });\n            this.search_field.bind('blur.chosen', function(evt) {\n                _this.input_blur(evt);\n            });\n            this.search_field.bind('keyup.chosen', function(evt) {\n                _this.keyup_checker(evt);\n            });\n            this.search_field.bind('keydown.chosen', function(evt) {\n                _this.keydown_checker(evt);\n            });\n            this.search_field.bind('focus.chosen', function(evt) {\n                _this.input_focus(evt);\n            });\n            this.search_field.bind('cut.chosen', function(evt) {\n                _this.clipboard_event_checker(evt);\n            });\n            this.search_field.bind('paste.chosen', function(evt) {\n                _this.clipboard_event_checker(evt);\n            });\n            if (this.is_multiple) {\n                return this.search_choices.bind('click.chosen', function(evt) {\n                    _this.choices_click(evt);\n                });\n            } else {\n                return this.container.bind('click.chosen', function(evt) {\n                    evt.preventDefault();\n                });\n            }\n        };\n\n        Chosen.prototype.destroy = function() {\n            $(this.container[0].ownerDocument).unbind(\"click.chosen\", this.click_test_action);\n            if (this.search_field[0].tabIndex) {\n                this.form_field_jq[0].tabIndex = this.search_field[0].tabIndex;\n            }\n            this.container.remove();\n            this.form_field_jq.removeData('chosen');\n            return this.form_field_jq.show();\n        };\n\n        Chosen.prototype.search_field_disabled = function() {\n            this.is_disabled = this.form_field_jq[0].disabled;\n            if (this.is_disabled) {\n                this.container.addClass('chosen-disabled');\n                this.search_field[0].disabled = true;\n                if (!this.is_multiple) {\n                    this.selected_item.unbind(\"focus.chosen\", this.activate_action);\n                }\n                return this.close_field();\n            } else {\n                this.container.removeClass('chosen-disabled');\n                this.search_field[0].disabled = false;\n                if (!this.is_multiple) {\n                    return this.selected_item.bind(\"focus.chosen\", this.activate_action);\n                }\n            }\n        };\n\n        Chosen.prototype.container_mousedown = function(evt) {\n            if (!this.is_disabled) {\n                if (evt && evt.type === \"mousedown\" && !this.results_showing) {\n                    evt.preventDefault();\n                }\n                if (!((evt != null) && ($(evt.target)).hasClass(\"search-choice-close\"))) {\n                    if (!this.active_field) {\n                        if (this.is_multiple) {\n                            this.search_field.val(\"\");\n                        }\n                        $(this.container[0].ownerDocument).bind('click.chosen', this.click_test_action);\n                        this.results_show();\n                    } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents(\"a.chosen-single\").length)) {\n                        evt.preventDefault();\n                        this.results_toggle();\n                    }\n                    return this.activate_field();\n                }\n            }\n        };\n\n        Chosen.prototype.container_mouseup = function(evt) {\n            if (evt.target.nodeName === \"ABBR\" && !this.is_disabled) {\n                return this.results_reset(evt);\n            }\n        };\n\n        Chosen.prototype.search_results_mousewheel = function(evt) {\n            var delta;\n            if (evt.originalEvent) {\n                delta = -evt.originalEvent.wheelDelta || evt.originalEvent.detail;\n            }\n            if (delta != null) {\n                evt.preventDefault();\n                if (evt.type === 'DOMMouseScroll') {\n                    delta = delta * 40;\n                }\n                return this.search_results.scrollTop(delta + this.search_results.scrollTop());\n            }\n        };\n\n        Chosen.prototype.blur_test = function(evt) {\n            if (!this.active_field && this.container.hasClass(\"chosen-container-active\")) {\n                return this.close_field();\n            }\n        };\n\n        Chosen.prototype.close_field = function() {\n            $(this.container[0].ownerDocument).unbind(\"click.chosen\", this.click_test_action);\n            this.active_field = false;\n            this.results_hide();\n            this.container.removeClass(\"chosen-container-active\");\n            this.clear_backstroke();\n            this.show_search_field_default();\n            return this.search_field_scale();\n        };\n\n        Chosen.prototype.activate_field = function() {\n            this.container.addClass(\"chosen-container-active\");\n            this.active_field = true;\n            this.search_field.val(this.search_field.val());\n            return this.search_field.focus();\n        };\n\n        Chosen.prototype.test_active_click = function(evt) {\n            var active_container;\n            active_container = $(evt.target).closest('.chosen-container');\n            if (active_container.length && this.container[0] === active_container[0]) {\n                return this.active_field = true;\n            } else {\n                return this.close_field();\n            }\n        };\n\n        Chosen.prototype.results_build = function() {\n            this.parsing = true;\n            this.selected_option_count = null;\n            this.results_data = SelectParser.select_to_array(this.form_field);\n            if (this.is_multiple) {\n                this.search_choices.find(\"li.search-choice\").remove();\n            } else if (!this.is_multiple) {\n                this.single_set_selected_text();\n                if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) {\n                    this.search_field[0].readOnly = true;\n                    this.container.addClass(\"chosen-container-single-nosearch\");\n                } else {\n                    this.search_field[0].readOnly = false;\n                    this.container.removeClass(\"chosen-container-single-nosearch\");\n                }\n            }\n            this.update_results_content(this.results_option_build({\n                first: true\n            }));\n            this.search_field_disabled();\n            this.show_search_field_default();\n            this.search_field_scale();\n            return this.parsing = false;\n        };\n\n        Chosen.prototype.result_do_highlight = function(el) {\n            var high_bottom, high_top, maxHeight, visible_bottom, visible_top;\n            if (el.length) {\n                this.result_clear_highlight();\n                this.result_highlight = el;\n                this.result_highlight.addClass(\"highlighted\");\n                maxHeight = parseInt(this.search_results.css(\"maxHeight\"), 10);\n                visible_top = this.search_results.scrollTop();\n                visible_bottom = maxHeight + visible_top;\n                high_top = this.result_highlight.position().top + this.search_results.scrollTop();\n                high_bottom = high_top + this.result_highlight.outerHeight();\n                if (high_bottom >= visible_bottom) {\n                    return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0);\n                } else if (high_top < visible_top) {\n                    return this.search_results.scrollTop(high_top);\n                }\n            }\n        };\n\n        Chosen.prototype.result_clear_highlight = function() {\n            if (this.result_highlight) {\n                this.result_highlight.removeClass(\"highlighted\");\n            }\n            return this.result_highlight = null;\n        };\n\n        Chosen.prototype.results_show = function() {\n            if (this.is_multiple && this.max_selected_options <= this.choices_count()) {\n                this.form_field_jq.trigger(\"chosen:maxselected\", {\n                    chosen: this\n                });\n                return false;\n            }\n            this.container.addClass(\"chosen-with-drop\");\n            this.results_showing = true;\n            this.search_field.focus();\n            this.search_field.val(this.search_field.val());\n            this.winnow_results();\n            return this.form_field_jq.trigger(\"chosen:showing_dropdown\", {\n                chosen: this\n            });\n        };\n\n        Chosen.prototype.update_results_content = function(content) {\n            return this.search_results.html(content);\n        };\n\n        Chosen.prototype.results_hide = function() {\n            if (this.results_showing) {\n                this.result_clear_highlight();\n                this.container.removeClass(\"chosen-with-drop\");\n                this.form_field_jq.trigger(\"chosen:hiding_dropdown\", {\n                    chosen: this\n                });\n            }\n            return this.results_showing = false;\n        };\n\n        Chosen.prototype.set_tab_index = function(el) {\n            var ti;\n            if (this.form_field.tabIndex) {\n                ti = this.form_field.tabIndex;\n                this.form_field.tabIndex = -1;\n                return this.search_field[0].tabIndex = ti;\n            }\n        };\n\n        Chosen.prototype.set_label_behavior = function() {\n            var _this = this;\n            this.form_field_label = this.form_field_jq.parents(\"label\");\n            if (!this.form_field_label.length && this.form_field.id.length) {\n                this.form_field_label = $(\"label[for='\" + this.form_field.id + \"']\");\n            }\n            if (this.form_field_label.length > 0) {\n                return this.form_field_label.bind('click.chosen', function(evt) {\n                    if (_this.is_multiple) {\n                        return _this.container_mousedown(evt);\n                    } else {\n                        return _this.activate_field();\n                    }\n                });\n            }\n        };\n\n        Chosen.prototype.show_search_field_default = function() {\n            if (this.is_multiple && this.choices_count() < 1 && !this.active_field) {\n                this.search_field.val(this.default_text);\n                return this.search_field.addClass(\"default\");\n            } else {\n                this.search_field.val(\"\");\n                return this.search_field.removeClass(\"default\");\n            }\n        };\n\n        Chosen.prototype.search_results_mouseup = function(evt) {\n            var target;\n            target = $(evt.target).hasClass(\"active-result\") ? $(evt.target) : $(evt.target).parents(\".active-result\").first();\n            if (target.length) {\n                this.result_highlight = target;\n                this.result_select(evt);\n                return this.search_field.focus();\n            }\n        };\n\n        Chosen.prototype.search_results_mouseover = function(evt) {\n            var target;\n            target = $(evt.target).hasClass(\"active-result\") ? $(evt.target) : $(evt.target).parents(\".active-result\").first();\n            if (target) {\n                return this.result_do_highlight(target);\n            }\n        };\n\n        Chosen.prototype.search_results_mouseout = function(evt) {\n            if ($(evt.target).hasClass(\"active-result\" || $(evt.target).parents('.active-result').first())) {\n                return this.result_clear_highlight();\n            }\n        };\n\n        Chosen.prototype.choice_build = function(item) {\n            var choice, close_link,\n                _this = this;\n            choice = $('<li />', {\n                \"class\": \"search-choice\"\n            }).html(\"<span>\" + item.html + \"</span>\");\n            if (item.disabled) {\n                choice.addClass('search-choice-disabled');\n            } else {\n                close_link = $('<a />', {\n                    \"class\": 'search-choice-close',\n                    'data-option-array-index': item.array_index\n                });\n                close_link.bind('click.chosen', function(evt) {\n                    return _this.choice_destroy_link_click(evt);\n                });\n                choice.append(close_link);\n            }\n            return this.search_container.before(choice);\n        };\n\n        Chosen.prototype.choice_destroy_link_click = function(evt) {\n            evt.preventDefault();\n            evt.stopPropagation();\n            if (!this.is_disabled) {\n                return this.choice_destroy($(evt.target));\n            }\n        };\n\n        Chosen.prototype.choice_destroy = function(link) {\n            if (this.result_deselect(link[0].getAttribute(\"data-option-array-index\"))) {\n                this.show_search_field_default();\n                if (this.is_multiple && this.choices_count() > 0 && this.search_field.val().length < 1) {\n                    this.results_hide();\n                }\n                link.parents('li').first().remove();\n                return this.search_field_scale();\n            }\n        };\n\n        Chosen.prototype.results_reset = function() {\n            this.reset_single_select_options();\n            this.form_field.options[0].selected = true;\n            this.single_set_selected_text();\n            this.show_search_field_default();\n            this.results_reset_cleanup();\n            this.form_field_jq.trigger(\"change\");\n            if (this.active_field) {\n                return this.results_hide();\n            }\n        };\n\n        Chosen.prototype.results_reset_cleanup = function() {\n            this.current_selectedIndex = this.form_field.selectedIndex;\n            return this.selected_item.find(\"abbr\").remove();\n        };\n\n        Chosen.prototype.result_select = function(evt) {\n            var high, item;\n            if (this.result_highlight) {\n                high = this.result_highlight;\n                this.result_clear_highlight();\n                if (this.is_multiple && this.max_selected_options <= this.choices_count()) {\n                    this.form_field_jq.trigger(\"chosen:maxselected\", {\n                        chosen: this\n                    });\n                    return false;\n                }\n                if (this.is_multiple) {\n                    high.removeClass(\"active-result\");\n                } else {\n                    this.reset_single_select_options();\n                }\n                item = this.results_data[high[0].getAttribute(\"data-option-array-index\")];\n                item.selected = true;\n                this.form_field.options[item.options_index].selected = true;\n                this.selected_option_count = null;\n                if (this.is_multiple) {\n                    this.choice_build(item);\n                } else {\n                    this.single_set_selected_text(item.text);\n                }\n                if (!((evt.metaKey || evt.ctrlKey) && this.is_multiple)) {\n                    this.results_hide();\n                }\n                this.search_field.val(\"\");\n                if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) {\n                    this.form_field_jq.trigger(\"change\", {\n                        'selected': this.form_field.options[item.options_index].value\n                    });\n                }\n                this.current_selectedIndex = this.form_field.selectedIndex;\n                return this.search_field_scale();\n            }\n        };\n\n        Chosen.prototype.single_set_selected_text = function(text) {\n            if (text == null) {\n                text = this.default_text;\n            }\n            if (text === this.default_text) {\n                this.selected_item.addClass(\"chosen-default\");\n            } else {\n                this.single_deselect_control_build();\n                this.selected_item.removeClass(\"chosen-default\");\n            }\n            return this.selected_item.find(\"span\").text(text);\n        };\n\n        Chosen.prototype.result_deselect = function(pos) {\n            var result_data;\n            result_data = this.results_data[pos];\n            if (!this.form_field.options[result_data.options_index].disabled) {\n                result_data.selected = false;\n                this.form_field.options[result_data.options_index].selected = false;\n                this.selected_option_count = null;\n                this.result_clear_highlight();\n                if (this.results_showing) {\n                    this.winnow_results();\n                }\n                this.form_field_jq.trigger(\"change\", {\n                    deselected: this.form_field.options[result_data.options_index].value\n                });\n                this.search_field_scale();\n                return true;\n            } else {\n                return false;\n            }\n        };\n\n        Chosen.prototype.single_deselect_control_build = function() {\n            if (!this.allow_single_deselect) {\n                return;\n            }\n            if (!this.selected_item.find(\"abbr\").length) {\n                this.selected_item.find(\"span\").first().after(\"<abbr class=\\\"search-choice-close\\\"></abbr>\");\n            }\n            return this.selected_item.addClass(\"chosen-single-with-deselect\");\n        };\n\n        Chosen.prototype.get_search_text = function() {\n            if (this.search_field.val() === this.default_text) {\n                return \"\";\n            } else {\n                return $('<div/>').text($.trim(this.search_field.val())).html();\n            }\n        };\n\n        Chosen.prototype.winnow_results_set_highlight = function() {\n            var do_high, selected_results;\n            selected_results = !this.is_multiple ? this.search_results.find(\".result-selected.active-result\") : [];\n            do_high = selected_results.length ? selected_results.first() : this.search_results.find(\".active-result\").first();\n            if (do_high != null) {\n                return this.result_do_highlight(do_high);\n            }\n        };\n\n        Chosen.prototype.no_results = function(terms) {\n            var no_results_html;\n            no_results_html = $('<li class=\"no-results\">' + this.results_none_found + ' \"<span></span>\"</li>');\n            no_results_html.find(\"span\").first().html(terms);\n            this.search_results.append(no_results_html);\n            return this.form_field_jq.trigger(\"chosen:no_results\", {\n                chosen: this\n            });\n        };\n\n        Chosen.prototype.no_results_clear = function() {\n            return this.search_results.find(\".no-results\").remove();\n        };\n\n        Chosen.prototype.keydown_arrow = function() {\n            var next_sib;\n            if (this.results_showing && this.result_highlight) {\n                next_sib = this.result_highlight.nextAll(\"li.active-result\").first();\n                if (next_sib) {\n                    return this.result_do_highlight(next_sib);\n                }\n            } else {\n                return this.results_show();\n            }\n        };\n\n        Chosen.prototype.keyup_arrow = function() {\n            var prev_sibs;\n            if (!this.results_showing && !this.is_multiple) {\n                return this.results_show();\n            } else if (this.result_highlight) {\n                prev_sibs = this.result_highlight.prevAll(\"li.active-result\");\n                if (prev_sibs.length) {\n                    return this.result_do_highlight(prev_sibs.first());\n                } else {\n                    if (this.choices_count() > 0) {\n                        this.results_hide();\n                    }\n                    return this.result_clear_highlight();\n                }\n            }\n        };\n\n        Chosen.prototype.keydown_backstroke = function() {\n            var next_available_destroy;\n            if (this.pending_backstroke) {\n                this.choice_destroy(this.pending_backstroke.find(\"a\").first());\n                return this.clear_backstroke();\n            } else {\n                next_available_destroy = this.search_container.siblings(\"li.search-choice\").last();\n                if (next_available_destroy.length && !next_available_destroy.hasClass(\"search-choice-disabled\")) {\n                    this.pending_backstroke = next_available_destroy;\n                    if (this.single_backstroke_delete) {\n                        return this.keydown_backstroke();\n                    } else {\n                        return this.pending_backstroke.addClass(\"search-choice-focus\");\n                    }\n                }\n            }\n        };\n\n        Chosen.prototype.clear_backstroke = function() {\n            if (this.pending_backstroke) {\n                this.pending_backstroke.removeClass(\"search-choice-focus\");\n            }\n            return this.pending_backstroke = null;\n        };\n\n        Chosen.prototype.keydown_checker = function(evt) {\n            var stroke, _ref1;\n            stroke = (_ref1 = evt.which) != null ? _ref1 : evt.keyCode;\n            this.search_field_scale();\n            if (stroke !== 8 && this.pending_backstroke) {\n                this.clear_backstroke();\n            }\n            switch (stroke) {\n                case 8:\n                    this.backstroke_length = this.search_field.val().length;\n                    break;\n                case 9:\n                    if (this.results_showing && !this.is_multiple) {\n                        this.result_select(evt);\n                    }\n                    this.mouse_on_container = false;\n                    break;\n                case 13:\n                    evt.preventDefault();\n                    break;\n                case 38:\n                    evt.preventDefault();\n                    this.keyup_arrow();\n                    break;\n                case 40:\n                    evt.preventDefault();\n                    this.keydown_arrow();\n                    break;\n            }\n        };\n\n        Chosen.prototype.search_field_scale = function() {\n            var div, f_width, h, style, style_block, styles, w, _i, _len;\n            if (this.is_multiple) {\n                h = 0;\n                w = 0;\n                style_block = \"position:absolute; left: -1000px; top: -1000px; display:none;\";\n                styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing'];\n                for (_i = 0, _len = styles.length; _i < _len; _i++) {\n                    style = styles[_i];\n                    style_block += style + \":\" + this.search_field.css(style) + \";\";\n                }\n                div = $('<div />', {\n                    'style': style_block\n                });\n                div.text(this.search_field.val());\n                $('body').append(div);\n                w = div.width() + 25;\n                div.remove();\n                f_width = this.container.outerWidth();\n                if (w > f_width - 10) {\n                    w = f_width - 10;\n                }\n                return this.search_field.css({\n                    'width': w + 'px'\n                });\n            }\n        };\n\n        return Chosen;\n\n    })(AbstractChosen);\n\n}).call(this);\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/clockpicker/clockpicker.js",
    "content": "/*!\n * ClockPicker v{package.version} (http://weareoutman.github.io/clockpicker/)\n * Copyright 2014 Wang Shenwei.\n * Licensed under MIT (https://github.com/weareoutman/clockpicker/blob/gh-pages/LICENSE)\n */\n\n;(function(){\n\tvar $ = window.jQuery,\n\t\t$win = $(window),\n\t\t$doc = $(document),\n\t\t$body;\n\n\t// Can I use inline svg ?\n\tvar svgNS = 'http://www.w3.org/2000/svg',\n\t\tsvgSupported = 'SVGAngle' in window && (function(){\n\t\t\tvar supported,\n\t\t\t\tel = document.createElement('div');\n\t\t\tel.innerHTML = '<svg/>';\n\t\t\tsupported = (el.firstChild && el.firstChild.namespaceURI) == svgNS;\n\t\t\tel.innerHTML = '';\n\t\t\treturn supported;\n\t\t})();\n\n\t// Can I use transition ?\n\tvar transitionSupported = (function(){\n\t\tvar style = document.createElement('div').style;\n\t\treturn 'transition' in style ||\n\t\t\t'WebkitTransition' in style ||\n\t\t\t'MozTransition' in style ||\n\t\t\t'msTransition' in style ||\n\t\t\t'OTransition' in style;\n\t})();\n\n\t// Listen touch events in touch screen device, instead of mouse events in desktop.\n\tvar touchSupported = 'ontouchstart' in window,\n\t\tmousedownEvent = 'mousedown' + ( touchSupported ? ' touchstart' : ''),\n\t\tmousemoveEvent = 'mousemove.clockpicker' + ( touchSupported ? ' touchmove.clockpicker' : ''),\n\t\tmouseupEvent = 'mouseup.clockpicker' + ( touchSupported ? ' touchend.clockpicker' : '');\n\n\t// Vibrate the device if supported\n\tvar vibrate = navigator.vibrate ? 'vibrate' : navigator.webkitVibrate ? 'webkitVibrate' : null;\n\n\tfunction createSvgElement(name) {\n\t\treturn document.createElementNS(svgNS, name);\n\t}\n\n\tfunction leadingZero(num) {\n\t\treturn (num < 10 ? '0' : '') + num;\n\t}\n\n\t// Get a unique id\n\tvar idCounter = 0;\n\tfunction uniqueId(prefix) {\n\t\tvar id = ++idCounter + '';\n\t\treturn prefix ? prefix + id : id;\n\t}\n\n\t// Clock size\n\tvar dialRadius = 100,\n\t\touterRadius = 80,\n\t\t// innerRadius = 80 on 12 hour clock\n\t\tinnerRadius = 54,\n\t\ttickRadius = 13,\n\t\tdiameter = dialRadius * 2,\n\t\tduration = transitionSupported ? 350 : 1;\n\n\t// Popover template\n\tvar tpl = [\n\t\t'<div class=\"popover clockpicker-popover\">',\n\t\t\t'<div class=\"arrow\"></div>',\n\t\t\t'<div class=\"popover-title\">',\n\t\t\t\t'<span class=\"clockpicker-span-hours text-primary\"></span>',\n\t\t\t\t' : ',\n\t\t\t\t'<span class=\"clockpicker-span-minutes\"></span>',\n\t\t\t\t'<span class=\"clockpicker-span-am-pm\"></span>',\n\t\t\t'</div>',\n\t\t\t'<div class=\"popover-content\">',\n\t\t\t\t'<div class=\"clockpicker-plate\">',\n\t\t\t\t\t'<div class=\"clockpicker-canvas\"></div>',\n\t\t\t\t\t'<div class=\"clockpicker-dial clockpicker-hours\"></div>',\n\t\t\t\t\t'<div class=\"clockpicker-dial clockpicker-minutes clockpicker-dial-out\"></div>',\n\t\t\t\t'</div>',\n\t\t\t\t'<span class=\"clockpicker-am-pm-block\">',\n\t\t\t\t'</span>',\n\t\t\t'</div>',\n\t\t'</div>'\n\t].join('');\n\n\t// ClockPicker\n\tfunction ClockPicker(element, options) {\n\t\tvar popover = $(tpl),\n\t\t\tplate = popover.find('.clockpicker-plate'),\n\t\t\thoursView = popover.find('.clockpicker-hours'),\n\t\t\tminutesView = popover.find('.clockpicker-minutes'),\n\t\t\tamPmBlock = popover.find('.clockpicker-am-pm-block'),\n\t\t\tisInput = element.prop('tagName') === 'INPUT',\n\t\t\tinput = isInput ? element : element.find('input'),\n\t\t\taddon = element.find('.input-group-addon'),\n\t\t\tself = this,\n\t\t\ttimer;\n\n\t\tthis.id = uniqueId('cp');\n\t\tthis.element = element;\n\t\tthis.options = options;\n\t\tthis.isAppended = false;\n\t\tthis.isShown = false;\n\t\tthis.currentView = 'hours';\n\t\tthis.isInput = isInput;\n\t\tthis.input = input;\n\t\tthis.addon = addon;\n\t\tthis.popover = popover;\n\t\tthis.plate = plate;\n\t\tthis.hoursView = hoursView;\n\t\tthis.minutesView = minutesView;\n\t\tthis.amPmBlock = amPmBlock;\n\t\tthis.spanHours = popover.find('.clockpicker-span-hours');\n\t\tthis.spanMinutes = popover.find('.clockpicker-span-minutes');\n\t\tthis.spanAmPm = popover.find('.clockpicker-span-am-pm');\n\t\tthis.amOrPm = \"PM\";\n\n\t\t// Setup for for 12 hour clock if option is selected\n\t\tif (options.twelvehour) {\n\n\t\t\tvar  amPmButtonsTemplate = ['<div class=\"clockpicker-am-pm-block\">',\n\t\t\t\t'<button type=\"button\" class=\"btn btn-sm btn-default clockpicker-button clockpicker-am-button\">',\n\t\t\t\t'AM</button>',\n\t\t\t\t'<button type=\"button\" class=\"btn btn-sm btn-default clockpicker-button clockpicker-pm-button\">',\n\t\t\t\t'PM</button>',\n\t\t\t\t'</div>'].join('');\n\n\t\t\tvar amPmButtons = $(amPmButtonsTemplate);\n\t\t\t//amPmButtons.appendTo(plate);\n\n\t\t\t////Not working b/c they are not shown when this runs\n\t\t\t//$('clockpicker-am-button')\n\t\t\t//    .on(\"click\", function() {\n\t\t\t//        self.amOrPm = \"AM\";\n\t\t\t//        $('.clockpicker-span-am-pm').empty().append('AM');\n\t\t\t//    });\n\t\t\t//\n\t\t\t//$('clockpicker-pm-button')\n\t\t\t//    .on(\"click\", function() {\n\t\t\t//         self.amOrPm = \"PM\";\n\t\t\t//        $('.clockpicker-span-am-pm').empty().append('PM');\n\t\t\t//    });\n\n\t\t\t$('<button type=\"button\" class=\"btn btn-sm btn-default clockpicker-button am-button\">' + \"AM\" + '</button>')\n\t\t\t\t.on(\"click\", function() {\n\t\t\t\t\tself.amOrPm = \"AM\";\n\t\t\t\t\t$('.clockpicker-span-am-pm').empty().append('AM');\n\t\t\t\t}).appendTo(this.amPmBlock);\n\n\n\t\t\t$('<button type=\"button\" class=\"btn btn-sm btn-default clockpicker-button pm-button\">' + \"PM\" + '</button>')\n\t\t\t\t.on(\"click\", function() {\n\t\t\t\t\tself.amOrPm = 'PM';\n\t\t\t\t\t$('.clockpicker-span-am-pm').empty().append('PM');\n\t\t\t\t}).appendTo(this.amPmBlock);\n\n\t\t}\n\n\t\tif (! options.autoclose) {\n\t\t\t// If autoclose is not setted, append a button\n\t\t\t$('<button type=\"button\" class=\"btn btn-sm btn-default btn-block clockpicker-button\">' + options.donetext + '</button>')\n\t\t\t\t.click($.proxy(this.done, this))\n\t\t\t\t.appendTo(popover);\n\t\t}\n\n\t\t// Placement and arrow align - make sure they make sense.\n\t\tif ((options.placement === 'top' || options.placement === 'bottom') && (options.align === 'top' || options.align === 'bottom')) options.align = 'left';\n\t\tif ((options.placement === 'left' || options.placement === 'right') && (options.align === 'left' || options.align === 'right')) options.align = 'top';\n\n\t\tpopover.addClass(options.placement);\n\t\tpopover.addClass('clockpicker-align-' + options.align);\n\n\t\tthis.spanHours.click($.proxy(this.toggleView, this, 'hours'));\n\t\tthis.spanMinutes.click($.proxy(this.toggleView, this, 'minutes'));\n\n\t\t// Show or toggle\n\t\tinput.on('focus.clockpicker click.clockpicker', $.proxy(this.show, this));\n\t\taddon.on('click.clockpicker', $.proxy(this.toggle, this));\n\n\t\t// Build ticks\n\t\tvar tickTpl = $('<div class=\"clockpicker-tick\"></div>'),\n\t\t\ti, tick, radian, radius;\n\n\t\t// Hours view\n\t\tif (options.twelvehour) {\n\t\t\tfor (i = 1; i < 13; i += 1) {\n\t\t\t\ttick = tickTpl.clone();\n\t\t\t\tradian = i / 6 * Math.PI;\n\t\t\t\tradius = outerRadius;\n\t\t\t\ttick.css('font-size', '120%');\n\t\t\t\ttick.css({\n\t\t\t\t\tleft: dialRadius + Math.sin(radian) * radius - tickRadius,\n\t\t\t\t\ttop: dialRadius - Math.cos(radian) * radius - tickRadius\n\t\t\t\t});\n\t\t\t\ttick.html(i === 0 ? '00' : i);\n\t\t\t\thoursView.append(tick);\n\t\t\t\ttick.on(mousedownEvent, mousedown);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0; i < 24; i += 1) {\n\t\t\t\ttick = tickTpl.clone();\n\t\t\t\tradian = i / 6 * Math.PI;\n\t\t\t\tvar inner = i > 0 && i < 13;\n\t\t\t\tradius = inner ? innerRadius : outerRadius;\n\t\t\t\ttick.css({\n\t\t\t\t\tleft: dialRadius + Math.sin(radian) * radius - tickRadius,\n\t\t\t\t\ttop: dialRadius - Math.cos(radian) * radius - tickRadius\n\t\t\t\t});\n\t\t\t\tif (inner) {\n\t\t\t\t\ttick.css('font-size', '120%');\n\t\t\t\t}\n\t\t\t\ttick.html(i === 0 ? '00' : i);\n\t\t\t\thoursView.append(tick);\n\t\t\t\ttick.on(mousedownEvent, mousedown);\n\t\t\t}\n\t\t}\n\n\t\t// Minutes view\n\t\tfor (i = 0; i < 60; i += 5) {\n\t\t\ttick = tickTpl.clone();\n\t\t\tradian = i / 30 * Math.PI;\n\t\t\ttick.css({\n\t\t\t\tleft: dialRadius + Math.sin(radian) * outerRadius - tickRadius,\n\t\t\t\ttop: dialRadius - Math.cos(radian) * outerRadius - tickRadius\n\t\t\t});\n\t\t\ttick.css('font-size', '120%');\n\t\t\ttick.html(leadingZero(i));\n\t\t\tminutesView.append(tick);\n\t\t\ttick.on(mousedownEvent, mousedown);\n\t\t}\n\n\t\t// Clicking on minutes view space\n\t\tplate.on(mousedownEvent, function(e){\n\t\t\tif ($(e.target).closest('.clockpicker-tick').length === 0) {\n\t\t\t\tmousedown(e, true);\n\t\t\t}\n\t\t});\n\n\t\t// Mousedown or touchstart\n\t\tfunction mousedown(e, space) {\n\t\t\tvar offset = plate.offset(),\n\t\t\t\tisTouch = /^touch/.test(e.type),\n\t\t\t\tx0 = offset.left + dialRadius,\n\t\t\t\ty0 = offset.top + dialRadius,\n\t\t\t\tdx = (isTouch ? e.originalEvent.touches[0] : e).pageX - x0,\n\t\t\t\tdy = (isTouch ? e.originalEvent.touches[0] : e).pageY - y0,\n\t\t\t\tz = Math.sqrt(dx * dx + dy * dy),\n\t\t\t\tmoved = false;\n\n\t\t\t// When clicking on minutes view space, check the mouse position\n\t\t\tif (space && (z < outerRadius - tickRadius || z > outerRadius + tickRadius)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\te.preventDefault();\n\n\t\t\t// Set cursor style of body after 200ms\n\t\t\tvar movingTimer = setTimeout(function(){\n\t\t\t\t$body.addClass('clockpicker-moving');\n\t\t\t}, 200);\n\n\t\t\t// Place the canvas to top\n\t\t\tif (svgSupported) {\n\t\t\t\tplate.append(self.canvas);\n\t\t\t}\n\n\t\t\t// Clock\n\t\t\tself.setHand(dx, dy, ! space, true);\n\n\t\t\t// Mousemove on document\n\t\t\t$doc.off(mousemoveEvent).on(mousemoveEvent, function(e){\n\t\t\t\te.preventDefault();\n\t\t\t\tvar isTouch = /^touch/.test(e.type),\n\t\t\t\t\tx = (isTouch ? e.originalEvent.touches[0] : e).pageX - x0,\n\t\t\t\t\ty = (isTouch ? e.originalEvent.touches[0] : e).pageY - y0;\n\t\t\t\tif (! moved && x === dx && y === dy) {\n\t\t\t\t\t// Clicking in chrome on windows will trigger a mousemove event\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmoved = true;\n\t\t\t\tself.setHand(x, y, false, true);\n\t\t\t});\n\n\t\t\t// Mouseup on document\n\t\t\t$doc.off(mouseupEvent).on(mouseupEvent, function(e){\n\t\t\t\t$doc.off(mouseupEvent);\n\t\t\t\te.preventDefault();\n\t\t\t\tvar isTouch = /^touch/.test(e.type),\n\t\t\t\t\tx = (isTouch ? e.originalEvent.changedTouches[0] : e).pageX - x0,\n\t\t\t\t\ty = (isTouch ? e.originalEvent.changedTouches[0] : e).pageY - y0;\n\t\t\t\tif ((space || moved) && x === dx && y === dy) {\n\t\t\t\t\tself.setHand(x, y);\n\t\t\t\t}\n\t\t\t\tif (self.currentView === 'hours') {\n\t\t\t\t\tself.toggleView('minutes', duration / 2);\n\t\t\t\t} else {\n\t\t\t\t\tif (options.autoclose) {\n\t\t\t\t\t\tself.minutesView.addClass('clockpicker-dial-out');\n\t\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\t\tself.done();\n\t\t\t\t\t\t}, duration / 2);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tplate.prepend(canvas);\n\n\t\t\t\t// Reset cursor style of body\n\t\t\t\tclearTimeout(movingTimer);\n\t\t\t\t$body.removeClass('clockpicker-moving');\n\n\t\t\t\t// Unbind mousemove event\n\t\t\t\t$doc.off(mousemoveEvent);\n\t\t\t});\n\t\t}\n\n\t\tif (svgSupported) {\n\t\t\t// Draw clock hands and others\n\t\t\tvar canvas = popover.find('.clockpicker-canvas'),\n\t\t\t\tsvg = createSvgElement('svg');\n\t\t\tsvg.setAttribute('class', 'clockpicker-svg');\n\t\t\tsvg.setAttribute('width', diameter);\n\t\t\tsvg.setAttribute('height', diameter);\n\t\t\tvar g = createSvgElement('g');\n\t\t\tg.setAttribute('transform', 'translate(' + dialRadius + ',' + dialRadius + ')');\n\t\t\tvar bearing = createSvgElement('circle');\n\t\t\tbearing.setAttribute('class', 'clockpicker-canvas-bearing');\n\t\t\tbearing.setAttribute('cx', 0);\n\t\t\tbearing.setAttribute('cy', 0);\n\t\t\tbearing.setAttribute('r', 2);\n\t\t\tvar hand = createSvgElement('line');\n\t\t\thand.setAttribute('x1', 0);\n\t\t\thand.setAttribute('y1', 0);\n\t\t\tvar bg = createSvgElement('circle');\n\t\t\tbg.setAttribute('class', 'clockpicker-canvas-bg');\n\t\t\tbg.setAttribute('r', tickRadius);\n\t\t\tvar fg = createSvgElement('circle');\n\t\t\tfg.setAttribute('class', 'clockpicker-canvas-fg');\n\t\t\tfg.setAttribute('r', 3.5);\n\t\t\tg.appendChild(hand);\n\t\t\tg.appendChild(bg);\n\t\t\tg.appendChild(fg);\n\t\t\tg.appendChild(bearing);\n\t\t\tsvg.appendChild(g);\n\t\t\tcanvas.append(svg);\n\n\t\t\tthis.hand = hand;\n\t\t\tthis.bg = bg;\n\t\t\tthis.fg = fg;\n\t\t\tthis.bearing = bearing;\n\t\t\tthis.g = g;\n\t\t\tthis.canvas = canvas;\n\t\t}\n\n\t\traiseCallback(this.options.init);\n\t}\n\n\tfunction raiseCallback(callbackFunction) {\n\t\tif (callbackFunction && typeof callbackFunction === \"function\") {\n\t\t\tcallbackFunction();\n\t\t}\n\t}\n\n\t// Default options\n\tClockPicker.DEFAULTS = {\n\t\t'default': '',       // default time, 'now' or '13:14' e.g.\n\t\tfromnow: 0,          // set default time to * milliseconds from now (using with default = 'now')\n\t\tplacement: 'bottom', // clock popover placement\n\t\talign: 'left',       // popover arrow align\n\t\tdonetext: '完成',    // done button text\n\t\tautoclose: false,    // auto close when minute is selected\n\t\ttwelvehour: false, // change to 12 hour AM/PM clock from 24 hour\n\t\tvibrate: true        // vibrate the device when dragging clock hand\n\t};\n\n\t// Show or hide popover\n\tClockPicker.prototype.toggle = function(){\n\t\tthis[this.isShown ? 'hide' : 'show']();\n\t};\n\n\t// Set popover position\n\tClockPicker.prototype.locate = function(){\n\t\tvar element = this.element,\n\t\t\tpopover = this.popover,\n\t\t\toffset = element.offset(),\n\t\t\twidth = element.outerWidth(),\n\t\t\theight = element.outerHeight(),\n\t\t\tplacement = this.options.placement,\n\t\t\talign = this.options.align,\n\t\t\tstyles = {},\n\t\t\tself = this;\n\n\t\tpopover.show();\n\n\t\t// Place the popover\n\t\tswitch (placement) {\n\t\t\tcase 'bottom':\n\t\t\t\tstyles.top = offset.top + height;\n\t\t\t\tbreak;\n\t\t\tcase 'right':\n\t\t\t\tstyles.left = offset.left + width;\n\t\t\t\tbreak;\n\t\t\tcase 'top':\n\t\t\t\tstyles.top = offset.top - popover.outerHeight();\n\t\t\t\tbreak;\n\t\t\tcase 'left':\n\t\t\t\tstyles.left = offset.left - popover.outerWidth();\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Align the popover arrow\n\t\tswitch (align) {\n\t\t\tcase 'left':\n\t\t\t\tstyles.left = offset.left;\n\t\t\t\tbreak;\n\t\t\tcase 'right':\n\t\t\t\tstyles.left = offset.left + width - popover.outerWidth();\n\t\t\t\tbreak;\n\t\t\tcase 'top':\n\t\t\t\tstyles.top = offset.top;\n\t\t\t\tbreak;\n\t\t\tcase 'bottom':\n\t\t\t\tstyles.top = offset.top + height - popover.outerHeight();\n\t\t\t\tbreak;\n\t\t}\n\n\t\tpopover.css(styles);\n\t};\n\n\t// Show popover\n\tClockPicker.prototype.show = function(e){\n\t\t// Not show again\n\t\tif (this.isShown) {\n\t\t\treturn;\n\t\t}\n\n\t\traiseCallback(this.options.beforeShow);\n\n\t\tvar self = this;\n\n\t\t// Initialize\n\t\tif (! this.isAppended) {\n\t\t\t// Append popover to body\n\t\t\t$body = $(document.body).append(this.popover);\n\n\t\t\t// Reset position when resize\n\t\t\t$win.on('resize.clockpicker' + this.id, function(){\n\t\t\t\tif (self.isShown) {\n\t\t\t\t\tself.locate();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.isAppended = true;\n\t\t}\n\n\t\t// Get the time\n\t\tvar value = ((this.input.prop('value') || this.options['default'] || '') + '').split(':');\n\t\tif (value[0] === 'now') {\n\t\t\tvar now = new Date(+ new Date() + this.options.fromnow);\n\t\t\tvalue = [\n\t\t\t\tnow.getHours(),\n\t\t\t\tnow.getMinutes()\n\t\t\t];\n\t\t}\n\t\tthis.hours = + value[0] || 0;\n\t\tthis.minutes = + value[1] || 0;\n\t\tthis.spanHours.html(leadingZero(this.hours));\n\t\tthis.spanMinutes.html(leadingZero(this.minutes));\n\n\t\t// Toggle to hours view\n\t\tthis.toggleView('hours');\n\n\t\t// Set position\n\t\tthis.locate();\n\n\t\tthis.isShown = true;\n\n\t\t// Hide when clicking or tabbing on any element except the clock, input and addon\n\t\t$doc.on('click.clockpicker.' + this.id + ' focusin.clockpicker.' + this.id, function(e){\n\t\t\tvar target = $(e.target);\n\t\t\tif (target.closest(self.popover).length === 0 &&\n\t\t\t\t\ttarget.closest(self.addon).length === 0 &&\n\t\t\t\t\ttarget.closest(self.input).length === 0) {\n\t\t\t\tself.hide();\n\t\t\t}\n\t\t});\n\n\t\t// Hide when ESC is pressed\n\t\t$doc.on('keyup.clockpicker.' + this.id, function(e){\n\t\t\tif (e.keyCode === 27) {\n\t\t\t\tself.hide();\n\t\t\t}\n\t\t});\n\n\t\traiseCallback(this.options.afterShow);\n\t};\n\n\t// Hide popover\n\tClockPicker.prototype.hide = function(){\n\t\traiseCallback(this.options.beforeHide);\n\n\t\tthis.isShown = false;\n\n\t\t// Unbinding events on document\n\t\t$doc.off('click.clockpicker.' + this.id + ' focusin.clockpicker.' + this.id);\n\t\t$doc.off('keyup.clockpicker.' + this.id);\n\n\t\tthis.popover.hide();\n\n\t\traiseCallback(this.options.afterHide);\n\t};\n\n\t// Toggle to hours or minutes view\n\tClockPicker.prototype.toggleView = function(view, delay){\n\t\tvar raiseAfterHourSelect = false;\n\t\tif (view === 'minutes' && $(this.hoursView).css(\"visibility\") === \"visible\") {\n\t\t\traiseCallback(this.options.beforeHourSelect);\n\t\t\traiseAfterHourSelect = true;\n\t\t}\n\t\tvar isHours = view === 'hours',\n\t\t\tnextView = isHours ? this.hoursView : this.minutesView,\n\t\t\thideView = isHours ? this.minutesView : this.hoursView;\n\n\t\tthis.currentView = view;\n\n\t\tthis.spanHours.toggleClass('text-primary', isHours);\n\t\tthis.spanMinutes.toggleClass('text-primary', ! isHours);\n\n\t\t// Let's make transitions\n\t\thideView.addClass('clockpicker-dial-out');\n\t\tnextView.css('visibility', 'visible').removeClass('clockpicker-dial-out');\n\n\t\t// Reset clock hand\n\t\tthis.resetClock(delay);\n\n\t\t// After transitions ended\n\t\tclearTimeout(this.toggleViewTimer);\n\t\tthis.toggleViewTimer = setTimeout(function(){\n\t\t\thideView.css('visibility', 'hidden');\n\t\t}, duration);\n\n\t\tif (raiseAfterHourSelect) {\n\t\t\traiseCallback(this.options.afterHourSelect);\n\t\t}\n\t};\n\n\t// Reset clock hand\n\tClockPicker.prototype.resetClock = function(delay){\n\t\tvar view = this.currentView,\n\t\t\tvalue = this[view],\n\t\t\tisHours = view === 'hours',\n\t\t\tunit = Math.PI / (isHours ? 6 : 30),\n\t\t\tradian = value * unit,\n\t\t\tradius = isHours && value > 0 && value < 13 ? innerRadius : outerRadius,\n\t\t\tx = Math.sin(radian) * radius,\n\t\t\ty = - Math.cos(radian) * radius,\n\t\t\tself = this;\n\t\tif (svgSupported && delay) {\n\t\t\tself.canvas.addClass('clockpicker-canvas-out');\n\t\t\tsetTimeout(function(){\n\t\t\t\tself.canvas.removeClass('clockpicker-canvas-out');\n\t\t\t\tself.setHand(x, y);\n\t\t\t}, delay);\n\t\t} else {\n\t\t\tthis.setHand(x, y);\n\t\t}\n\t};\n\n\t// Set clock hand to (x, y)\n\tClockPicker.prototype.setHand = function(x, y, roundBy5, dragging){\n\t\tvar radian = Math.atan2(x, - y),\n\t\t\tisHours = this.currentView === 'hours',\n\t\t\tunit = Math.PI / (isHours || roundBy5 ? 6 : 30),\n\t\t\tz = Math.sqrt(x * x + y * y),\n\t\t\toptions = this.options,\n\t\t\tinner = isHours && z < (outerRadius + innerRadius) / 2,\n\t\t\tradius = inner ? innerRadius : outerRadius,\n\t\t\tvalue;\n\n\t\t\tif (options.twelvehour) {\n\t\t\t\tradius = outerRadius;\n\t\t\t}\n\n\t\t// Radian should in range [0, 2PI]\n\t\tif (radian < 0) {\n\t\t\tradian = Math.PI * 2 + radian;\n\t\t}\n\n\t\t// Get the round value\n\t\tvalue = Math.round(radian / unit);\n\n\t\t// Get the round radian\n\t\tradian = value * unit;\n\n\t\t// Correct the hours or minutes\n\t\tif (options.twelvehour) {\n\t\t\tif (isHours) {\n\t\t\t\tif (value === 0) {\n\t\t\t\t\tvalue = 12;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (roundBy5) {\n\t\t\t\t\tvalue *= 5;\n\t\t\t\t}\n\t\t\t\tif (value === 60) {\n\t\t\t\t\tvalue = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (isHours) {\n\t\t\t\tif (value === 12) {\n\t\t\t\t\tvalue = 0;\n\t\t\t\t}\n\t\t\t\tvalue = inner ? (value === 0 ? 12 : value) : value === 0 ? 0 : value + 12;\n\t\t\t} else {\n\t\t\t\tif (roundBy5) {\n\t\t\t\t\tvalue *= 5;\n\t\t\t\t}\n\t\t\t\tif (value === 60) {\n\t\t\t\t\tvalue = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Once hours or minutes changed, vibrate the device\n\t\tif (this[this.currentView] !== value) {\n\t\t\tif (vibrate && this.options.vibrate) {\n\t\t\t\t// Do not vibrate too frequently\n\t\t\t\tif (! this.vibrateTimer) {\n\t\t\t\t\tnavigator[vibrate](10);\n\t\t\t\t\tthis.vibrateTimer = setTimeout($.proxy(function(){\n\t\t\t\t\t\tthis.vibrateTimer = null;\n\t\t\t\t\t}, this), 100);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis[this.currentView] = value;\n\t\tthis[isHours ? 'spanHours' : 'spanMinutes'].html(leadingZero(value));\n\n\t\t// If svg is not supported, just add an active class to the tick\n\t\tif (! svgSupported) {\n\t\t\tthis[isHours ? 'hoursView' : 'minutesView'].find('.clockpicker-tick').each(function(){\n\t\t\t\tvar tick = $(this);\n\t\t\t\ttick.toggleClass('active', value === + tick.html());\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Place clock hand at the top when dragging\n\t\tif (dragging || (! isHours && value % 5)) {\n\t\t\tthis.g.insertBefore(this.hand, this.bearing);\n\t\t\tthis.g.insertBefore(this.bg, this.fg);\n\t\t\tthis.bg.setAttribute('class', 'clockpicker-canvas-bg clockpicker-canvas-bg-trans');\n\t\t} else {\n\t\t\t// Or place it at the bottom\n\t\t\tthis.g.insertBefore(this.hand, this.bg);\n\t\t\tthis.g.insertBefore(this.fg, this.bg);\n\t\t\tthis.bg.setAttribute('class', 'clockpicker-canvas-bg');\n\t\t}\n\n\t\t// Set clock hand and others' position\n\t\tvar cx = Math.sin(radian) * radius,\n\t\t\tcy = - Math.cos(radian) * radius;\n\t\tthis.hand.setAttribute('x2', cx);\n\t\tthis.hand.setAttribute('y2', cy);\n\t\tthis.bg.setAttribute('cx', cx);\n\t\tthis.bg.setAttribute('cy', cy);\n\t\tthis.fg.setAttribute('cx', cx);\n\t\tthis.fg.setAttribute('cy', cy);\n\t};\n\n\t// Hours and minutes are selected\n\tClockPicker.prototype.done = function() {\n\t\traiseCallback(this.options.beforeDone);\n\t\tthis.hide();\n\t\tvar last = this.input.prop('value'),\n\t\t\tvalue = leadingZero(this.hours) + ':' + leadingZero(this.minutes);\n\t\tif  (this.options.twelvehour) {\n\t\t\tvalue = value + this.amOrPm;\n\t\t}\n\n\t\tthis.input.prop('value', value);\n\t\tif (value !== last) {\n\t\t\tthis.input.triggerHandler('change');\n\t\t\tif (! this.isInput) {\n\t\t\t\tthis.element.trigger('change');\n\t\t\t}\n\t\t}\n\n\t\tif (this.options.autoclose) {\n\t\t\tthis.input.trigger('blur');\n\t\t}\n\n\t\traiseCallback(this.options.afterDone);\n\t};\n\n\t// Remove clockpicker from input\n\tClockPicker.prototype.remove = function() {\n\t\tthis.element.removeData('clockpicker');\n\t\tthis.input.off('focus.clockpicker click.clockpicker');\n\t\tthis.addon.off('click.clockpicker');\n\t\tif (this.isShown) {\n\t\t\tthis.hide();\n\t\t}\n\t\tif (this.isAppended) {\n\t\t\t$win.off('resize.clockpicker' + this.id);\n\t\t\tthis.popover.remove();\n\t\t}\n\t};\n\n\t// Extends $.fn.clockpicker\n\t$.fn.clockpicker = function(option){\n\t\tvar args = Array.prototype.slice.call(arguments, 1);\n\t\treturn this.each(function(){\n\t\t\tvar $this = $(this),\n\t\t\t\tdata = $this.data('clockpicker');\n\t\t\tif (! data) {\n\t\t\t\tvar options = $.extend({}, ClockPicker.DEFAULTS, $this.data(), typeof option == 'object' && option);\n\t\t\t\t$this.data('clockpicker', new ClockPicker($this, options));\n\t\t\t} else {\n\t\t\t\t// Manual operatsions. show, hide, remove, e.g.\n\t\t\t\tif (typeof data[option] === 'function') {\n\t\t\t\t\tdata[option].apply(data, args);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n}());\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/codemirror/codemirror.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n// This is CodeMirror (http://codemirror.net), a code editor\n// implemented in JavaScript on top of the browser's DOM.\n//\n// You can find some technical background for some of the code below\n// at http://marijnhaverbeke.nl/blog/#cm-internals .\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    module.exports = mod();\n  else if (typeof define == \"function\" && define.amd) // AMD\n    return define([], mod);\n  else // Plain browser env\n    this.CodeMirror = mod();\n})(function() {\n  \"use strict\";\n\n  // BROWSER SNIFFING\n\n  // Kludges for bugs and behavior differences that can't be feature\n  // detected are enabled based on userAgent etc sniffing.\n\n  var gecko = /gecko\\/\\d/i.test(navigator.userAgent);\n  // ie_uptoN means Internet Explorer version N or lower\n  var ie_upto10 = /MSIE \\d/.test(navigator.userAgent);\n  var ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent);\n  var ie = ie_upto10 || ie_11up;\n  var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : ie_11up[1]);\n  var webkit = /WebKit\\//.test(navigator.userAgent);\n  var qtwebkit = webkit && /Qt\\/\\d+\\.\\d+/.test(navigator.userAgent);\n  var chrome = /Chrome\\//.test(navigator.userAgent);\n  var presto = /Opera\\//.test(navigator.userAgent);\n  var safari = /Apple Computer/.test(navigator.vendor);\n  var khtml = /KHTML\\//.test(navigator.userAgent);\n  var mac_geMountainLion = /Mac OS X 1\\d\\D([8-9]|\\d\\d)\\D/.test(navigator.userAgent);\n  var phantom = /PhantomJS/.test(navigator.userAgent);\n\n  var ios = /AppleWebKit/.test(navigator.userAgent) && /Mobile\\/\\w+/.test(navigator.userAgent);\n  // This is woefully incomplete. Suggestions for alternative methods welcome.\n  var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent);\n  var mac = ios || /Mac/.test(navigator.platform);\n  var windows = /win/i.test(navigator.platform);\n\n  var presto_version = presto && navigator.userAgent.match(/Version\\/(\\d*\\.\\d*)/);\n  if (presto_version) presto_version = Number(presto_version[1]);\n  if (presto_version && presto_version >= 15) { presto = false; webkit = true; }\n  // Some browsers use the wrong event properties to signal cmd/ctrl on OS X\n  var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));\n  var captureRightClick = gecko || (ie && ie_version >= 9);\n\n  // Optimize some code when these features are not used.\n  var sawReadOnlySpans = false, sawCollapsedSpans = false;\n\n  // EDITOR CONSTRUCTOR\n\n  // A CodeMirror instance represents an editor. This is the object\n  // that user code is usually dealing with.\n\n  function CodeMirror(place, options) {\n    if (!(this instanceof CodeMirror)) return new CodeMirror(place, options);\n\n    this.options = options = options ? copyObj(options) : {};\n    // Determine effective options based on given values and defaults.\n    copyObj(defaults, options, false);\n    setGuttersForLineNumbers(options);\n\n    var doc = options.value;\n    if (typeof doc == \"string\") doc = new Doc(doc, options.mode);\n    this.doc = doc;\n\n    var display = this.display = new Display(place, doc);\n    display.wrapper.CodeMirror = this;\n    updateGutters(this);\n    themeChanged(this);\n    if (options.lineWrapping)\n      this.display.wrapper.className += \" CodeMirror-wrap\";\n    if (options.autofocus && !mobile) focusInput(this);\n\n    this.state = {\n      keyMaps: [],  // stores maps added by addKeyMap\n      overlays: [], // highlighting overlays, as added by addOverlay\n      modeGen: 0,   // bumped when mode/overlay changes, used to invalidate highlighting info\n      overwrite: false, focused: false,\n      suppressEdits: false, // used to disable editing during key handlers when in readOnly mode\n      pasteIncoming: false, cutIncoming: false, // help recognize paste/cut edits in readInput\n      draggingText: false,\n      highlight: new Delayed() // stores highlight worker timeout\n    };\n\n    // Override magic textarea content restore that IE sometimes does\n    // on our hidden textarea on reload\n    if (ie && ie_version < 11) setTimeout(bind(resetInput, this, true), 20);\n\n    registerEventHandlers(this);\n    ensureGlobalHandlers();\n\n    startOperation(this);\n    this.curOp.forceUpdate = true;\n    attachDoc(this, doc);\n\n    if ((options.autofocus && !mobile) || activeElt() == display.input)\n      setTimeout(bind(onFocus, this), 20);\n    else\n      onBlur(this);\n\n    for (var opt in optionHandlers) if (optionHandlers.hasOwnProperty(opt))\n      optionHandlers[opt](this, options[opt], Init);\n    maybeUpdateLineNumberWidth(this);\n    for (var i = 0; i < initHooks.length; ++i) initHooks[i](this);\n    endOperation(this);\n  }\n\n  // DISPLAY CONSTRUCTOR\n\n  // The display handles the DOM integration, both for input reading\n  // and content drawing. It holds references to DOM nodes and\n  // display-related state.\n\n  function Display(place, doc) {\n    var d = this;\n\n    // The semihidden textarea that is focused when the editor is\n    // focused, and receives input.\n    var input = d.input = elt(\"textarea\", null, null, \"position: absolute; padding: 0; width: 1px; height: 1em; outline: none\");\n    // The textarea is kept positioned near the cursor to prevent the\n    // fact that it'll be scrolled into view on input from scrolling\n    // our fake cursor out of view. On webkit, when wrap=off, paste is\n    // very slow. So make the area wide instead.\n    if (webkit) input.style.width = \"1000px\";\n    else input.setAttribute(\"wrap\", \"off\");\n    // If border: 0; -- iOS fails to open keyboard (issue #1287)\n    if (ios) input.style.border = \"1px solid black\";\n    input.setAttribute(\"autocorrect\", \"off\"); input.setAttribute(\"autocapitalize\", \"off\"); input.setAttribute(\"spellcheck\", \"false\");\n\n    // Wraps and hides input textarea\n    d.inputDiv = elt(\"div\", [input], null, \"overflow: hidden; position: relative; width: 3px; height: 0px;\");\n    // The fake scrollbar elements.\n    d.scrollbarH = elt(\"div\", [elt(\"div\", null, null, \"height: 100%; min-height: 1px\")], \"CodeMirror-hscrollbar\");\n    d.scrollbarV = elt(\"div\", [elt(\"div\", null, null, \"min-width: 1px\")], \"CodeMirror-vscrollbar\");\n    // Covers bottom-right square when both scrollbars are present.\n    d.scrollbarFiller = elt(\"div\", null, \"CodeMirror-scrollbar-filler\");\n    // Covers bottom of gutter when coverGutterNextToScrollbar is on\n    // and h scrollbar is present.\n    d.gutterFiller = elt(\"div\", null, \"CodeMirror-gutter-filler\");\n    // Will contain the actual code, positioned to cover the viewport.\n    d.lineDiv = elt(\"div\", null, \"CodeMirror-code\");\n    // Elements are added to these to represent selection and cursors.\n    d.selectionDiv = elt(\"div\", null, null, \"position: relative; z-index: 1\");\n    d.cursorDiv = elt(\"div\", null, \"CodeMirror-cursors\");\n    // A visibility: hidden element used to find the size of things.\n    d.measure = elt(\"div\", null, \"CodeMirror-measure\");\n    // When lines outside of the viewport are measured, they are drawn in this.\n    d.lineMeasure = elt(\"div\", null, \"CodeMirror-measure\");\n    // Wraps everything that needs to exist inside the vertically-padded coordinate system\n    d.lineSpace = elt(\"div\", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],\n                      null, \"position: relative; outline: none\");\n    // Moved around its parent to cover visible view.\n    d.mover = elt(\"div\", [elt(\"div\", [d.lineSpace], \"CodeMirror-lines\")], null, \"position: relative\");\n    // Set to the height of the document, allowing scrolling.\n    d.sizer = elt(\"div\", [d.mover], \"CodeMirror-sizer\");\n    // Behavior of elts with overflow: auto and padding is\n    // inconsistent across browsers. This is used to ensure the\n    // scrollable area is big enough.\n    d.heightForcer = elt(\"div\", null, null, \"position: absolute; height: \" + scrollerCutOff + \"px; width: 1px;\");\n    // Will contain the gutters, if any.\n    d.gutters = elt(\"div\", null, \"CodeMirror-gutters\");\n    d.lineGutter = null;\n    // Actual scrollable element.\n    d.scroller = elt(\"div\", [d.sizer, d.heightForcer, d.gutters], \"CodeMirror-scroll\");\n    d.scroller.setAttribute(\"tabIndex\", \"-1\");\n    // The element in which the editor lives.\n    d.wrapper = elt(\"div\", [d.inputDiv, d.scrollbarH, d.scrollbarV,\n                            d.scrollbarFiller, d.gutterFiller, d.scroller], \"CodeMirror\");\n\n    // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)\n    if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }\n    // Needed to hide big blue blinking cursor on Mobile Safari\n    if (ios) input.style.width = \"0px\";\n    if (!webkit) d.scroller.draggable = true;\n    // Needed to handle Tab key in KHTML\n    if (khtml) { d.inputDiv.style.height = \"1px\"; d.inputDiv.style.position = \"absolute\"; }\n    // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).\n    if (ie && ie_version < 8) d.scrollbarH.style.minHeight = d.scrollbarV.style.minWidth = \"18px\";\n\n    if (place.appendChild) place.appendChild(d.wrapper);\n    else place(d.wrapper);\n\n    // Current rendered range (may be bigger than the view window).\n    d.viewFrom = d.viewTo = doc.first;\n    // Information about the rendered lines.\n    d.view = [];\n    // Holds info about a single rendered line when it was rendered\n    // for measurement, while not in view.\n    d.externalMeasured = null;\n    // Empty space (in pixels) above the view\n    d.viewOffset = 0;\n    d.lastSizeC = 0;\n    d.updateLineNumbers = null;\n\n    // Used to only resize the line number gutter when necessary (when\n    // the amount of lines crosses a boundary that makes its width change)\n    d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;\n    // See readInput and resetInput\n    d.prevInput = \"\";\n    // Set to true when a non-horizontal-scrolling line widget is\n    // added. As an optimization, line widget aligning is skipped when\n    // this is false.\n    d.alignWidgets = false;\n    // Flag that indicates whether we expect input to appear real soon\n    // now (after some event like 'keypress' or 'input') and are\n    // polling intensively.\n    d.pollingFast = false;\n    // Self-resetting timeout for the poller\n    d.poll = new Delayed();\n\n    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;\n\n    // Tracks when resetInput has punted to just putting a short\n    // string into the textarea instead of the full selection.\n    d.inaccurateSelection = false;\n\n    // Tracks the maximum line length so that the horizontal scrollbar\n    // can be kept static when scrolling.\n    d.maxLine = null;\n    d.maxLineLength = 0;\n    d.maxLineChanged = false;\n\n    // Used for measuring wheel scrolling granularity\n    d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;\n\n    // True when shift is held down.\n    d.shift = false;\n\n    // Used to track whether anything happened since the context menu\n    // was opened.\n    d.selForContextMenu = null;\n  }\n\n  // STATE UPDATES\n\n  // Used to get the editor into a consistent state again when options change.\n\n  function loadMode(cm) {\n    cm.doc.mode = CodeMirror.getMode(cm.options, cm.doc.modeOption);\n    resetModeState(cm);\n  }\n\n  function resetModeState(cm) {\n    cm.doc.iter(function(line) {\n      if (line.stateAfter) line.stateAfter = null;\n      if (line.styles) line.styles = null;\n    });\n    cm.doc.frontier = cm.doc.first;\n    startWorker(cm, 100);\n    cm.state.modeGen++;\n    if (cm.curOp) regChange(cm);\n  }\n\n  function wrappingChanged(cm) {\n    if (cm.options.lineWrapping) {\n      addClass(cm.display.wrapper, \"CodeMirror-wrap\");\n      cm.display.sizer.style.minWidth = \"\";\n    } else {\n      rmClass(cm.display.wrapper, \"CodeMirror-wrap\");\n      findMaxLine(cm);\n    }\n    estimateLineHeights(cm);\n    regChange(cm);\n    clearCaches(cm);\n    setTimeout(function(){updateScrollbars(cm);}, 100);\n  }\n\n  // Returns a function that estimates the height of a line, to use as\n  // first approximation until the line becomes visible (and is thus\n  // properly measurable).\n  function estimateHeight(cm) {\n    var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;\n    var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);\n    return function(line) {\n      if (lineIsHidden(cm.doc, line)) return 0;\n\n      var widgetsHeight = 0;\n      if (line.widgets) for (var i = 0; i < line.widgets.length; i++) {\n        if (line.widgets[i].height) widgetsHeight += line.widgets[i].height;\n      }\n\n      if (wrapping)\n        return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th;\n      else\n        return widgetsHeight + th;\n    };\n  }\n\n  function estimateLineHeights(cm) {\n    var doc = cm.doc, est = estimateHeight(cm);\n    doc.iter(function(line) {\n      var estHeight = est(line);\n      if (estHeight != line.height) updateLineHeight(line, estHeight);\n    });\n  }\n\n  function keyMapChanged(cm) {\n    var map = keyMap[cm.options.keyMap], style = map.style;\n    cm.display.wrapper.className = cm.display.wrapper.className.replace(/\\s*cm-keymap-\\S+/g, \"\") +\n      (style ? \" cm-keymap-\" + style : \"\");\n  }\n\n  function themeChanged(cm) {\n    cm.display.wrapper.className = cm.display.wrapper.className.replace(/\\s*cm-s-\\S+/g, \"\") +\n      cm.options.theme.replace(/(^|\\s)\\s*/g, \" cm-s-\");\n    clearCaches(cm);\n  }\n\n  function guttersChanged(cm) {\n    updateGutters(cm);\n    regChange(cm);\n    setTimeout(function(){alignHorizontally(cm);}, 20);\n  }\n\n  // Rebuild the gutter elements, ensure the margin to the left of the\n  // code matches their width.\n  function updateGutters(cm) {\n    var gutters = cm.display.gutters, specs = cm.options.gutters;\n    removeChildren(gutters);\n    for (var i = 0; i < specs.length; ++i) {\n      var gutterClass = specs[i];\n      var gElt = gutters.appendChild(elt(\"div\", null, \"CodeMirror-gutter \" + gutterClass));\n      if (gutterClass == \"CodeMirror-linenumbers\") {\n        cm.display.lineGutter = gElt;\n        gElt.style.width = (cm.display.lineNumWidth || 1) + \"px\";\n      }\n    }\n    gutters.style.display = i ? \"\" : \"none\";\n    updateGutterSpace(cm);\n  }\n\n  function updateGutterSpace(cm) {\n    var width = cm.display.gutters.offsetWidth;\n    cm.display.sizer.style.marginLeft = width + \"px\";\n    cm.display.scrollbarH.style.left = cm.options.fixedGutter ? width + \"px\" : 0;\n  }\n\n  // Compute the character length of a line, taking into account\n  // collapsed ranges (see markText) that might hide parts, and join\n  // other lines onto it.\n  function lineLength(line) {\n    if (line.height == 0) return 0;\n    var len = line.text.length, merged, cur = line;\n    while (merged = collapsedSpanAtStart(cur)) {\n      var found = merged.find(0, true);\n      cur = found.from.line;\n      len += found.from.ch - found.to.ch;\n    }\n    cur = line;\n    while (merged = collapsedSpanAtEnd(cur)) {\n      var found = merged.find(0, true);\n      len -= cur.text.length - found.from.ch;\n      cur = found.to.line;\n      len += cur.text.length - found.to.ch;\n    }\n    return len;\n  }\n\n  // Find the longest line in the document.\n  function findMaxLine(cm) {\n    var d = cm.display, doc = cm.doc;\n    d.maxLine = getLine(doc, doc.first);\n    d.maxLineLength = lineLength(d.maxLine);\n    d.maxLineChanged = true;\n    doc.iter(function(line) {\n      var len = lineLength(line);\n      if (len > d.maxLineLength) {\n        d.maxLineLength = len;\n        d.maxLine = line;\n      }\n    });\n  }\n\n  // Make sure the gutters options contains the element\n  // \"CodeMirror-linenumbers\" when the lineNumbers option is true.\n  function setGuttersForLineNumbers(options) {\n    var found = indexOf(options.gutters, \"CodeMirror-linenumbers\");\n    if (found == -1 && options.lineNumbers) {\n      options.gutters = options.gutters.concat([\"CodeMirror-linenumbers\"]);\n    } else if (found > -1 && !options.lineNumbers) {\n      options.gutters = options.gutters.slice(0);\n      options.gutters.splice(found, 1);\n    }\n  }\n\n  // SCROLLBARS\n\n  function hScrollbarTakesSpace(cm) {\n    return cm.display.scroller.clientHeight - cm.display.wrapper.clientHeight < scrollerCutOff - 3;\n  }\n\n  // Prepare DOM reads needed to update the scrollbars. Done in one\n  // shot to minimize update/measure roundtrips.\n  function measureForScrollbars(cm) {\n    var scroll = cm.display.scroller;\n    return {\n      clientHeight: scroll.clientHeight,\n      barHeight: cm.display.scrollbarV.clientHeight,\n      scrollWidth: scroll.scrollWidth, clientWidth: scroll.clientWidth,\n      hScrollbarTakesSpace: hScrollbarTakesSpace(cm),\n      barWidth: cm.display.scrollbarH.clientWidth,\n      docHeight: Math.round(cm.doc.height + paddingVert(cm.display))\n    };\n  }\n\n  // Re-synchronize the fake scrollbars with the actual size of the\n  // content.\n  function updateScrollbars(cm, measure) {\n    if (!measure) measure = measureForScrollbars(cm);\n    var d = cm.display, sWidth = scrollbarWidth(d.measure);\n    var scrollHeight = measure.docHeight + scrollerCutOff;\n    var needsH = measure.scrollWidth > measure.clientWidth;\n    if (needsH && measure.scrollWidth <= measure.clientWidth + 1 &&\n        sWidth > 0 && !measure.hScrollbarTakesSpace)\n      needsH = false; // (Issue #2562)\n    var needsV = scrollHeight > measure.clientHeight;\n\n    if (needsV) {\n      d.scrollbarV.style.display = \"block\";\n      d.scrollbarV.style.bottom = needsH ? sWidth + \"px\" : \"0\";\n      // A bug in IE8 can cause this value to be negative, so guard it.\n      d.scrollbarV.firstChild.style.height =\n        Math.max(0, scrollHeight - measure.clientHeight + (measure.barHeight || d.scrollbarV.clientHeight)) + \"px\";\n    } else {\n      d.scrollbarV.style.display = \"\";\n      d.scrollbarV.firstChild.style.height = \"0\";\n    }\n    if (needsH) {\n      d.scrollbarH.style.display = \"block\";\n      d.scrollbarH.style.right = needsV ? sWidth + \"px\" : \"0\";\n      d.scrollbarH.firstChild.style.width =\n        (measure.scrollWidth - measure.clientWidth + (measure.barWidth || d.scrollbarH.clientWidth)) + \"px\";\n    } else {\n      d.scrollbarH.style.display = \"\";\n      d.scrollbarH.firstChild.style.width = \"0\";\n    }\n    if (needsH && needsV) {\n      d.scrollbarFiller.style.display = \"block\";\n      d.scrollbarFiller.style.height = d.scrollbarFiller.style.width = sWidth + \"px\";\n    } else d.scrollbarFiller.style.display = \"\";\n    if (needsH && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {\n      d.gutterFiller.style.display = \"block\";\n      d.gutterFiller.style.height = sWidth + \"px\";\n      d.gutterFiller.style.width = d.gutters.offsetWidth + \"px\";\n    } else d.gutterFiller.style.display = \"\";\n\n    if (!cm.state.checkedOverlayScrollbar && measure.clientHeight > 0) {\n      if (sWidth === 0) {\n        var w = mac && !mac_geMountainLion ? \"12px\" : \"18px\";\n        d.scrollbarV.style.minWidth = d.scrollbarH.style.minHeight = w;\n        var barMouseDown = function(e) {\n          if (e_target(e) != d.scrollbarV && e_target(e) != d.scrollbarH)\n            operation(cm, onMouseDown)(e);\n        };\n        on(d.scrollbarV, \"mousedown\", barMouseDown);\n        on(d.scrollbarH, \"mousedown\", barMouseDown);\n      }\n      cm.state.checkedOverlayScrollbar = true;\n    }\n  }\n\n  // Compute the lines that are visible in a given viewport (defaults\n  // the the current scroll position). viewport may contain top,\n  // height, and ensure (see op.scrollToPos) properties.\n  function visibleLines(display, doc, viewport) {\n    var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop;\n    top = Math.floor(top - paddingTop(display));\n    var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight;\n\n    var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom);\n    // Ensure is a {from: {line, ch}, to: {line, ch}} object, and\n    // forces those lines into the viewport (if possible).\n    if (viewport && viewport.ensure) {\n      var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line;\n      if (ensureFrom < from)\n        return {from: ensureFrom,\n                to: lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight)};\n      if (Math.min(ensureTo, doc.lastLine()) >= to)\n        return {from: lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight),\n                to: ensureTo};\n    }\n    return {from: from, to: Math.max(to, from + 1)};\n  }\n\n  // LINE NUMBERS\n\n  // Re-align line numbers and gutter marks to compensate for\n  // horizontal scrolling.\n  function alignHorizontally(cm) {\n    var display = cm.display, view = display.view;\n    if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return;\n    var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;\n    var gutterW = display.gutters.offsetWidth, left = comp + \"px\";\n    for (var i = 0; i < view.length; i++) if (!view[i].hidden) {\n      if (cm.options.fixedGutter && view[i].gutter)\n        view[i].gutter.style.left = left;\n      var align = view[i].alignable;\n      if (align) for (var j = 0; j < align.length; j++)\n        align[j].style.left = left;\n    }\n    if (cm.options.fixedGutter)\n      display.gutters.style.left = (comp + gutterW) + \"px\";\n  }\n\n  // Used to ensure that the line number gutter is still the right\n  // size for the current document size. Returns true when an update\n  // is needed.\n  function maybeUpdateLineNumberWidth(cm) {\n    if (!cm.options.lineNumbers) return false;\n    var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;\n    if (last.length != display.lineNumChars) {\n      var test = display.measure.appendChild(elt(\"div\", [elt(\"div\", last)],\n                                                 \"CodeMirror-linenumber CodeMirror-gutter-elt\"));\n      var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;\n      display.lineGutter.style.width = \"\";\n      display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding);\n      display.lineNumWidth = display.lineNumInnerWidth + padding;\n      display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;\n      display.lineGutter.style.width = display.lineNumWidth + \"px\";\n      updateGutterSpace(cm);\n      return true;\n    }\n    return false;\n  }\n\n  function lineNumberFor(options, i) {\n    return String(options.lineNumberFormatter(i + options.firstLineNumber));\n  }\n\n  // Computes display.scroller.scrollLeft + display.gutters.offsetWidth,\n  // but using getBoundingClientRect to get a sub-pixel-accurate\n  // result.\n  function compensateForHScroll(display) {\n    return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left;\n  }\n\n  // DISPLAY DRAWING\n\n  function DisplayUpdate(cm, viewport, force) {\n    var display = cm.display;\n\n    this.viewport = viewport;\n    // Store some values that we'll need later (but don't want to force a relayout for)\n    this.visible = visibleLines(display, cm.doc, viewport);\n    this.editorIsHidden = !display.wrapper.offsetWidth;\n    this.wrapperHeight = display.wrapper.clientHeight;\n    this.oldViewFrom = display.viewFrom; this.oldViewTo = display.viewTo;\n    this.oldScrollerWidth = display.scroller.clientWidth;\n    this.force = force;\n    this.dims = getDimensions(cm);\n  }\n\n  // Does the actual updating of the line display. Bails out\n  // (returning false) when there is nothing to be done and forced is\n  // false.\n  function updateDisplayIfNeeded(cm, update) {\n    var display = cm.display, doc = cm.doc;\n    if (update.editorIsHidden) {\n      resetView(cm);\n      return false;\n    }\n\n    // Bail out if the visible area is already rendered and nothing changed.\n    if (!update.force &&\n        update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo &&\n        (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) &&\n        countDirtyView(cm) == 0)\n      return false;\n\n    if (maybeUpdateLineNumberWidth(cm)) {\n      resetView(cm);\n      update.dims = getDimensions(cm);\n    }\n\n    // Compute a suitable new viewport (from & to)\n    var end = doc.first + doc.size;\n    var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first);\n    var to = Math.min(end, update.visible.to + cm.options.viewportMargin);\n    if (display.viewFrom < from && from - display.viewFrom < 20) from = Math.max(doc.first, display.viewFrom);\n    if (display.viewTo > to && display.viewTo - to < 20) to = Math.min(end, display.viewTo);\n    if (sawCollapsedSpans) {\n      from = visualLineNo(cm.doc, from);\n      to = visualLineEndNo(cm.doc, to);\n    }\n\n    var different = from != display.viewFrom || to != display.viewTo ||\n      display.lastSizeC != update.wrapperHeight;\n    adjustView(cm, from, to);\n\n    display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom));\n    // Position the mover div to align with the current scroll position\n    cm.display.mover.style.top = display.viewOffset + \"px\";\n\n    var toUpdate = countDirtyView(cm);\n    if (!different && toUpdate == 0 && !update.force &&\n        (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo))\n      return false;\n\n    // For big changes, we hide the enclosing element during the\n    // update, since that speeds up the operations on most browsers.\n    var focused = activeElt();\n    if (toUpdate > 4) display.lineDiv.style.display = \"none\";\n    patchDisplay(cm, display.updateLineNumbers, update.dims);\n    if (toUpdate > 4) display.lineDiv.style.display = \"\";\n    // There might have been a widget with a focused element that got\n    // hidden or updated, if so re-focus it.\n    if (focused && activeElt() != focused && focused.offsetHeight) focused.focus();\n\n    // Prevent selection and cursors from interfering with the scroll\n    // width.\n    removeChildren(display.cursorDiv);\n    removeChildren(display.selectionDiv);\n\n    if (different) {\n      display.lastSizeC = update.wrapperHeight;\n      startWorker(cm, 400);\n    }\n\n    display.updateLineNumbers = null;\n\n    return true;\n  }\n\n  function postUpdateDisplay(cm, update) {\n    var force = update.force, viewport = update.viewport;\n    for (var first = true;; first = false) {\n      if (first && cm.options.lineWrapping && update.oldScrollerWidth != cm.display.scroller.clientWidth) {\n        force = true;\n      } else {\n        force = false;\n        // Clip forced viewport to actual scrollable area.\n        if (viewport && viewport.top != null)\n          viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - scrollerCutOff -\n                                    cm.display.scroller.clientHeight, viewport.top)};\n        // Updated line heights might result in the drawn area not\n        // actually covering the viewport. Keep looping until it does.\n        update.visible = visibleLines(cm.display, cm.doc, viewport);\n        if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo)\n          break;\n      }\n      if (!updateDisplayIfNeeded(cm, update)) break;\n      updateHeightsInViewport(cm);\n      var barMeasure = measureForScrollbars(cm);\n      updateSelection(cm);\n      setDocumentHeight(cm, barMeasure);\n      updateScrollbars(cm, barMeasure);\n    }\n\n    signalLater(cm, \"update\", cm);\n    if (cm.display.viewFrom != update.oldViewFrom || cm.display.viewTo != update.oldViewTo)\n      signalLater(cm, \"viewportChange\", cm, cm.display.viewFrom, cm.display.viewTo);\n  }\n\n  function updateDisplaySimple(cm, viewport) {\n    var update = new DisplayUpdate(cm, viewport);\n    if (updateDisplayIfNeeded(cm, update)) {\n      updateHeightsInViewport(cm);\n      postUpdateDisplay(cm, update);\n      var barMeasure = measureForScrollbars(cm);\n      updateSelection(cm);\n      setDocumentHeight(cm, barMeasure);\n      updateScrollbars(cm, barMeasure);\n    }\n  }\n\n  function setDocumentHeight(cm, measure) {\n    cm.display.sizer.style.minHeight = cm.display.heightForcer.style.top = measure.docHeight + \"px\";\n    cm.display.gutters.style.height = Math.max(measure.docHeight, measure.clientHeight - scrollerCutOff) + \"px\";\n  }\n\n  function checkForWebkitWidthBug(cm, measure) {\n    // Work around Webkit bug where it sometimes reserves space for a\n    // non-existing phantom scrollbar in the scroller (Issue #2420)\n    if (cm.display.sizer.offsetWidth + cm.display.gutters.offsetWidth < cm.display.scroller.clientWidth - 1) {\n      cm.display.sizer.style.minHeight = cm.display.heightForcer.style.top = \"0px\";\n      cm.display.gutters.style.height = measure.docHeight + \"px\";\n    }\n  }\n\n  // Read the actual heights of the rendered lines, and update their\n  // stored heights to match.\n  function updateHeightsInViewport(cm) {\n    var display = cm.display;\n    var prevBottom = display.lineDiv.offsetTop;\n    for (var i = 0; i < display.view.length; i++) {\n      var cur = display.view[i], height;\n      if (cur.hidden) continue;\n      if (ie && ie_version < 8) {\n        var bot = cur.node.offsetTop + cur.node.offsetHeight;\n        height = bot - prevBottom;\n        prevBottom = bot;\n      } else {\n        var box = cur.node.getBoundingClientRect();\n        height = box.bottom - box.top;\n      }\n      var diff = cur.line.height - height;\n      if (height < 2) height = textHeight(display);\n      if (diff > .001 || diff < -.001) {\n        updateLineHeight(cur.line, height);\n        updateWidgetHeight(cur.line);\n        if (cur.rest) for (var j = 0; j < cur.rest.length; j++)\n          updateWidgetHeight(cur.rest[j]);\n      }\n    }\n  }\n\n  // Read and store the height of line widgets associated with the\n  // given line.\n  function updateWidgetHeight(line) {\n    if (line.widgets) for (var i = 0; i < line.widgets.length; ++i)\n      line.widgets[i].height = line.widgets[i].node.offsetHeight;\n  }\n\n  // Do a bulk-read of the DOM positions and sizes needed to draw the\n  // view, so that we don't interleave reading and writing to the DOM.\n  function getDimensions(cm) {\n    var d = cm.display, left = {}, width = {};\n    var gutterLeft = d.gutters.clientLeft;\n    for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {\n      left[cm.options.gutters[i]] = n.offsetLeft + n.clientLeft + gutterLeft;\n      width[cm.options.gutters[i]] = n.clientWidth;\n    }\n    return {fixedPos: compensateForHScroll(d),\n            gutterTotalWidth: d.gutters.offsetWidth,\n            gutterLeft: left,\n            gutterWidth: width,\n            wrapperWidth: d.wrapper.clientWidth};\n  }\n\n  // Sync the actual display DOM structure with display.view, removing\n  // nodes for lines that are no longer in view, and creating the ones\n  // that are not there yet, and updating the ones that are out of\n  // date.\n  function patchDisplay(cm, updateNumbersFrom, dims) {\n    var display = cm.display, lineNumbers = cm.options.lineNumbers;\n    var container = display.lineDiv, cur = container.firstChild;\n\n    function rm(node) {\n      var next = node.nextSibling;\n      // Works around a throw-scroll bug in OS X Webkit\n      if (webkit && mac && cm.display.currentWheelTarget == node)\n        node.style.display = \"none\";\n      else\n        node.parentNode.removeChild(node);\n      return next;\n    }\n\n    var view = display.view, lineN = display.viewFrom;\n    // Loop over the elements in the view, syncing cur (the DOM nodes\n    // in display.lineDiv) with the view as we go.\n    for (var i = 0; i < view.length; i++) {\n      var lineView = view[i];\n      if (lineView.hidden) {\n      } else if (!lineView.node) { // Not drawn yet\n        var node = buildLineElement(cm, lineView, lineN, dims);\n        container.insertBefore(node, cur);\n      } else { // Already drawn\n        while (cur != lineView.node) cur = rm(cur);\n        var updateNumber = lineNumbers && updateNumbersFrom != null &&\n          updateNumbersFrom <= lineN && lineView.lineNumber;\n        if (lineView.changes) {\n          if (indexOf(lineView.changes, \"gutter\") > -1) updateNumber = false;\n          updateLineForChanges(cm, lineView, lineN, dims);\n        }\n        if (updateNumber) {\n          removeChildren(lineView.lineNumber);\n          lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)));\n        }\n        cur = lineView.node.nextSibling;\n      }\n      lineN += lineView.size;\n    }\n    while (cur) cur = rm(cur);\n  }\n\n  // When an aspect of a line changes, a string is added to\n  // lineView.changes. This updates the relevant part of the line's\n  // DOM structure.\n  function updateLineForChanges(cm, lineView, lineN, dims) {\n    for (var j = 0; j < lineView.changes.length; j++) {\n      var type = lineView.changes[j];\n      if (type == \"text\") updateLineText(cm, lineView);\n      else if (type == \"gutter\") updateLineGutter(cm, lineView, lineN, dims);\n      else if (type == \"class\") updateLineClasses(lineView);\n      else if (type == \"widget\") updateLineWidgets(lineView, dims);\n    }\n    lineView.changes = null;\n  }\n\n  // Lines with gutter elements, widgets or a background class need to\n  // be wrapped, and have the extra elements added to the wrapper div\n  function ensureLineWrapped(lineView) {\n    if (lineView.node == lineView.text) {\n      lineView.node = elt(\"div\", null, null, \"position: relative\");\n      if (lineView.text.parentNode)\n        lineView.text.parentNode.replaceChild(lineView.node, lineView.text);\n      lineView.node.appendChild(lineView.text);\n      if (ie && ie_version < 8) lineView.node.style.zIndex = 2;\n    }\n    return lineView.node;\n  }\n\n  function updateLineBackground(lineView) {\n    var cls = lineView.bgClass ? lineView.bgClass + \" \" + (lineView.line.bgClass || \"\") : lineView.line.bgClass;\n    if (cls) cls += \" CodeMirror-linebackground\";\n    if (lineView.background) {\n      if (cls) lineView.background.className = cls;\n      else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }\n    } else if (cls) {\n      var wrap = ensureLineWrapped(lineView);\n      lineView.background = wrap.insertBefore(elt(\"div\", null, cls), wrap.firstChild);\n    }\n  }\n\n  // Wrapper around buildLineContent which will reuse the structure\n  // in display.externalMeasured when possible.\n  function getLineContent(cm, lineView) {\n    var ext = cm.display.externalMeasured;\n    if (ext && ext.line == lineView.line) {\n      cm.display.externalMeasured = null;\n      lineView.measure = ext.measure;\n      return ext.built;\n    }\n    return buildLineContent(cm, lineView);\n  }\n\n  // Redraw the line's text. Interacts with the background and text\n  // classes because the mode may output tokens that influence these\n  // classes.\n  function updateLineText(cm, lineView) {\n    var cls = lineView.text.className;\n    var built = getLineContent(cm, lineView);\n    if (lineView.text == lineView.node) lineView.node = built.pre;\n    lineView.text.parentNode.replaceChild(built.pre, lineView.text);\n    lineView.text = built.pre;\n    if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {\n      lineView.bgClass = built.bgClass;\n      lineView.textClass = built.textClass;\n      updateLineClasses(lineView);\n    } else if (cls) {\n      lineView.text.className = cls;\n    }\n  }\n\n  function updateLineClasses(lineView) {\n    updateLineBackground(lineView);\n    if (lineView.line.wrapClass)\n      ensureLineWrapped(lineView).className = lineView.line.wrapClass;\n    else if (lineView.node != lineView.text)\n      lineView.node.className = \"\";\n    var textClass = lineView.textClass ? lineView.textClass + \" \" + (lineView.line.textClass || \"\") : lineView.line.textClass;\n    lineView.text.className = textClass || \"\";\n  }\n\n  function updateLineGutter(cm, lineView, lineN, dims) {\n    if (lineView.gutter) {\n      lineView.node.removeChild(lineView.gutter);\n      lineView.gutter = null;\n    }\n    var markers = lineView.line.gutterMarkers;\n    if (cm.options.lineNumbers || markers) {\n      var wrap = ensureLineWrapped(lineView);\n      var gutterWrap = lineView.gutter =\n        wrap.insertBefore(elt(\"div\", null, \"CodeMirror-gutter-wrapper\", \"position: absolute; left: \" +\n                              (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + \"px\"),\n                          lineView.text);\n      if (cm.options.lineNumbers && (!markers || !markers[\"CodeMirror-linenumbers\"]))\n        lineView.lineNumber = gutterWrap.appendChild(\n          elt(\"div\", lineNumberFor(cm.options, lineN),\n              \"CodeMirror-linenumber CodeMirror-gutter-elt\",\n              \"left: \" + dims.gutterLeft[\"CodeMirror-linenumbers\"] + \"px; width: \"\n              + cm.display.lineNumInnerWidth + \"px\"));\n      if (markers) for (var k = 0; k < cm.options.gutters.length; ++k) {\n        var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id];\n        if (found)\n          gutterWrap.appendChild(elt(\"div\", [found], \"CodeMirror-gutter-elt\", \"left: \" +\n                                     dims.gutterLeft[id] + \"px; width: \" + dims.gutterWidth[id] + \"px\"));\n      }\n    }\n  }\n\n  function updateLineWidgets(lineView, dims) {\n    if (lineView.alignable) lineView.alignable = null;\n    for (var node = lineView.node.firstChild, next; node; node = next) {\n      var next = node.nextSibling;\n      if (node.className == \"CodeMirror-linewidget\")\n        lineView.node.removeChild(node);\n    }\n    insertLineWidgets(lineView, dims);\n  }\n\n  // Build a line's DOM representation from scratch\n  function buildLineElement(cm, lineView, lineN, dims) {\n    var built = getLineContent(cm, lineView);\n    lineView.text = lineView.node = built.pre;\n    if (built.bgClass) lineView.bgClass = built.bgClass;\n    if (built.textClass) lineView.textClass = built.textClass;\n\n    updateLineClasses(lineView);\n    updateLineGutter(cm, lineView, lineN, dims);\n    insertLineWidgets(lineView, dims);\n    return lineView.node;\n  }\n\n  // A lineView may contain multiple logical lines (when merged by\n  // collapsed spans). The widgets for all of them need to be drawn.\n  function insertLineWidgets(lineView, dims) {\n    insertLineWidgetsFor(lineView.line, lineView, dims, true);\n    if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++)\n      insertLineWidgetsFor(lineView.rest[i], lineView, dims, false);\n  }\n\n  function insertLineWidgetsFor(line, lineView, dims, allowAbove) {\n    if (!line.widgets) return;\n    var wrap = ensureLineWrapped(lineView);\n    for (var i = 0, ws = line.widgets; i < ws.length; ++i) {\n      var widget = ws[i], node = elt(\"div\", [widget.node], \"CodeMirror-linewidget\");\n      if (!widget.handleMouseEvents) node.ignoreEvents = true;\n      positionLineWidget(widget, node, lineView, dims);\n      if (allowAbove && widget.above)\n        wrap.insertBefore(node, lineView.gutter || lineView.text);\n      else\n        wrap.appendChild(node);\n      signalLater(widget, \"redraw\");\n    }\n  }\n\n  function positionLineWidget(widget, node, lineView, dims) {\n    if (widget.noHScroll) {\n      (lineView.alignable || (lineView.alignable = [])).push(node);\n      var width = dims.wrapperWidth;\n      node.style.left = dims.fixedPos + \"px\";\n      if (!widget.coverGutter) {\n        width -= dims.gutterTotalWidth;\n        node.style.paddingLeft = dims.gutterTotalWidth + \"px\";\n      }\n      node.style.width = width + \"px\";\n    }\n    if (widget.coverGutter) {\n      node.style.zIndex = 5;\n      node.style.position = \"relative\";\n      if (!widget.noHScroll) node.style.marginLeft = -dims.gutterTotalWidth + \"px\";\n    }\n  }\n\n  // POSITION OBJECT\n\n  // A Pos instance represents a position within the text.\n  var Pos = CodeMirror.Pos = function(line, ch) {\n    if (!(this instanceof Pos)) return new Pos(line, ch);\n    this.line = line; this.ch = ch;\n  };\n\n  // Compare two positions, return 0 if they are the same, a negative\n  // number when a is less, and a positive number otherwise.\n  var cmp = CodeMirror.cmpPos = function(a, b) { return a.line - b.line || a.ch - b.ch; };\n\n  function copyPos(x) {return Pos(x.line, x.ch);}\n  function maxPos(a, b) { return cmp(a, b) < 0 ? b : a; }\n  function minPos(a, b) { return cmp(a, b) < 0 ? a : b; }\n\n  // SELECTION / CURSOR\n\n  // Selection objects are immutable. A new one is created every time\n  // the selection changes. A selection is one or more non-overlapping\n  // (and non-touching) ranges, sorted, and an integer that indicates\n  // which one is the primary selection (the one that's scrolled into\n  // view, that getCursor returns, etc).\n  function Selection(ranges, primIndex) {\n    this.ranges = ranges;\n    this.primIndex = primIndex;\n  }\n\n  Selection.prototype = {\n    primary: function() { return this.ranges[this.primIndex]; },\n    equals: function(other) {\n      if (other == this) return true;\n      if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) return false;\n      for (var i = 0; i < this.ranges.length; i++) {\n        var here = this.ranges[i], there = other.ranges[i];\n        if (cmp(here.anchor, there.anchor) != 0 || cmp(here.head, there.head) != 0) return false;\n      }\n      return true;\n    },\n    deepCopy: function() {\n      for (var out = [], i = 0; i < this.ranges.length; i++)\n        out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head));\n      return new Selection(out, this.primIndex);\n    },\n    somethingSelected: function() {\n      for (var i = 0; i < this.ranges.length; i++)\n        if (!this.ranges[i].empty()) return true;\n      return false;\n    },\n    contains: function(pos, end) {\n      if (!end) end = pos;\n      for (var i = 0; i < this.ranges.length; i++) {\n        var range = this.ranges[i];\n        if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)\n          return i;\n      }\n      return -1;\n    }\n  };\n\n  function Range(anchor, head) {\n    this.anchor = anchor; this.head = head;\n  }\n\n  Range.prototype = {\n    from: function() { return minPos(this.anchor, this.head); },\n    to: function() { return maxPos(this.anchor, this.head); },\n    empty: function() {\n      return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch;\n    }\n  };\n\n  // Take an unsorted, potentially overlapping set of ranges, and\n  // build a selection out of it. 'Consumes' ranges array (modifying\n  // it).\n  function normalizeSelection(ranges, primIndex) {\n    var prim = ranges[primIndex];\n    ranges.sort(function(a, b) { return cmp(a.from(), b.from()); });\n    primIndex = indexOf(ranges, prim);\n    for (var i = 1; i < ranges.length; i++) {\n      var cur = ranges[i], prev = ranges[i - 1];\n      if (cmp(prev.to(), cur.from()) >= 0) {\n        var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to());\n        var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head;\n        if (i <= primIndex) --primIndex;\n        ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to));\n      }\n    }\n    return new Selection(ranges, primIndex);\n  }\n\n  function simpleSelection(anchor, head) {\n    return new Selection([new Range(anchor, head || anchor)], 0);\n  }\n\n  // Most of the external API clips given positions to make sure they\n  // actually exist within the document.\n  function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1));}\n  function clipPos(doc, pos) {\n    if (pos.line < doc.first) return Pos(doc.first, 0);\n    var last = doc.first + doc.size - 1;\n    if (pos.line > last) return Pos(last, getLine(doc, last).text.length);\n    return clipToLen(pos, getLine(doc, pos.line).text.length);\n  }\n  function clipToLen(pos, linelen) {\n    var ch = pos.ch;\n    if (ch == null || ch > linelen) return Pos(pos.line, linelen);\n    else if (ch < 0) return Pos(pos.line, 0);\n    else return pos;\n  }\n  function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size;}\n  function clipPosArray(doc, array) {\n    for (var out = [], i = 0; i < array.length; i++) out[i] = clipPos(doc, array[i]);\n    return out;\n  }\n\n  // SELECTION UPDATES\n\n  // The 'scroll' parameter given to many of these indicated whether\n  // the new cursor position should be scrolled into view after\n  // modifying the selection.\n\n  // If shift is held or the extend flag is set, extends a range to\n  // include a given position (and optionally a second position).\n  // Otherwise, simply returns the range between the given positions.\n  // Used for cursor motion and such.\n  function extendRange(doc, range, head, other) {\n    if (doc.cm && doc.cm.display.shift || doc.extend) {\n      var anchor = range.anchor;\n      if (other) {\n        var posBefore = cmp(head, anchor) < 0;\n        if (posBefore != (cmp(other, anchor) < 0)) {\n          anchor = head;\n          head = other;\n        } else if (posBefore != (cmp(head, other) < 0)) {\n          head = other;\n        }\n      }\n      return new Range(anchor, head);\n    } else {\n      return new Range(other || head, head);\n    }\n  }\n\n  // Extend the primary selection range, discard the rest.\n  function extendSelection(doc, head, other, options) {\n    setSelection(doc, new Selection([extendRange(doc, doc.sel.primary(), head, other)], 0), options);\n  }\n\n  // Extend all selections (pos is an array of selections with length\n  // equal the number of selections)\n  function extendSelections(doc, heads, options) {\n    for (var out = [], i = 0; i < doc.sel.ranges.length; i++)\n      out[i] = extendRange(doc, doc.sel.ranges[i], heads[i], null);\n    var newSel = normalizeSelection(out, doc.sel.primIndex);\n    setSelection(doc, newSel, options);\n  }\n\n  // Updates a single range in the selection.\n  function replaceOneSelection(doc, i, range, options) {\n    var ranges = doc.sel.ranges.slice(0);\n    ranges[i] = range;\n    setSelection(doc, normalizeSelection(ranges, doc.sel.primIndex), options);\n  }\n\n  // Reset the selection to a single range.\n  function setSimpleSelection(doc, anchor, head, options) {\n    setSelection(doc, simpleSelection(anchor, head), options);\n  }\n\n  // Give beforeSelectionChange handlers a change to influence a\n  // selection update.\n  function filterSelectionChange(doc, sel) {\n    var obj = {\n      ranges: sel.ranges,\n      update: function(ranges) {\n        this.ranges = [];\n        for (var i = 0; i < ranges.length; i++)\n          this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),\n                                     clipPos(doc, ranges[i].head));\n      }\n    };\n    signal(doc, \"beforeSelectionChange\", doc, obj);\n    if (doc.cm) signal(doc.cm, \"beforeSelectionChange\", doc.cm, obj);\n    if (obj.ranges != sel.ranges) return normalizeSelection(obj.ranges, obj.ranges.length - 1);\n    else return sel;\n  }\n\n  function setSelectionReplaceHistory(doc, sel, options) {\n    var done = doc.history.done, last = lst(done);\n    if (last && last.ranges) {\n      done[done.length - 1] = sel;\n      setSelectionNoUndo(doc, sel, options);\n    } else {\n      setSelection(doc, sel, options);\n    }\n  }\n\n  // Set a new selection.\n  function setSelection(doc, sel, options) {\n    setSelectionNoUndo(doc, sel, options);\n    addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);\n  }\n\n  function setSelectionNoUndo(doc, sel, options) {\n    if (hasHandler(doc, \"beforeSelectionChange\") || doc.cm && hasHandler(doc.cm, \"beforeSelectionChange\"))\n      sel = filterSelectionChange(doc, sel);\n\n    var bias = options && options.bias ||\n      (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1);\n    setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));\n\n    if (!(options && options.scroll === false) && doc.cm)\n      ensureCursorVisible(doc.cm);\n  }\n\n  function setSelectionInner(doc, sel) {\n    if (sel.equals(doc.sel)) return;\n\n    doc.sel = sel;\n\n    if (doc.cm) {\n      doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged = true;\n      signalCursorActivity(doc.cm);\n    }\n    signalLater(doc, \"cursorActivity\", doc);\n  }\n\n  // Verify that the selection does not partially select any atomic\n  // marked ranges.\n  function reCheckSelection(doc) {\n    setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false), sel_dontScroll);\n  }\n\n  // Return a selection that does not partially select any atomic\n  // ranges.\n  function skipAtomicInSelection(doc, sel, bias, mayClear) {\n    var out;\n    for (var i = 0; i < sel.ranges.length; i++) {\n      var range = sel.ranges[i];\n      var newAnchor = skipAtomic(doc, range.anchor, bias, mayClear);\n      var newHead = skipAtomic(doc, range.head, bias, mayClear);\n      if (out || newAnchor != range.anchor || newHead != range.head) {\n        if (!out) out = sel.ranges.slice(0, i);\n        out[i] = new Range(newAnchor, newHead);\n      }\n    }\n    return out ? normalizeSelection(out, sel.primIndex) : sel;\n  }\n\n  // Ensure a given position is not inside an atomic range.\n  function skipAtomic(doc, pos, bias, mayClear) {\n    var flipped = false, curPos = pos;\n    var dir = bias || 1;\n    doc.cantEdit = false;\n    search: for (;;) {\n      var line = getLine(doc, curPos.line);\n      if (line.markedSpans) {\n        for (var i = 0; i < line.markedSpans.length; ++i) {\n          var sp = line.markedSpans[i], m = sp.marker;\n          if ((sp.from == null || (m.inclusiveLeft ? sp.from <= curPos.ch : sp.from < curPos.ch)) &&\n              (sp.to == null || (m.inclusiveRight ? sp.to >= curPos.ch : sp.to > curPos.ch))) {\n            if (mayClear) {\n              signal(m, \"beforeCursorEnter\");\n              if (m.explicitlyCleared) {\n                if (!line.markedSpans) break;\n                else {--i; continue;}\n              }\n            }\n            if (!m.atomic) continue;\n            var newPos = m.find(dir < 0 ? -1 : 1);\n            if (cmp(newPos, curPos) == 0) {\n              newPos.ch += dir;\n              if (newPos.ch < 0) {\n                if (newPos.line > doc.first) newPos = clipPos(doc, Pos(newPos.line - 1));\n                else newPos = null;\n              } else if (newPos.ch > line.text.length) {\n                if (newPos.line < doc.first + doc.size - 1) newPos = Pos(newPos.line + 1, 0);\n                else newPos = null;\n              }\n              if (!newPos) {\n                if (flipped) {\n                  // Driven in a corner -- no valid cursor position found at all\n                  // -- try again *with* clearing, if we didn't already\n                  if (!mayClear) return skipAtomic(doc, pos, bias, true);\n                  // Otherwise, turn off editing until further notice, and return the start of the doc\n                  doc.cantEdit = true;\n                  return Pos(doc.first, 0);\n                }\n                flipped = true; newPos = pos; dir = -dir;\n              }\n            }\n            curPos = newPos;\n            continue search;\n          }\n        }\n      }\n      return curPos;\n    }\n  }\n\n  // SELECTION DRAWING\n\n  // Redraw the selection and/or cursor\n  function drawSelection(cm) {\n    var display = cm.display, doc = cm.doc, result = {};\n    var curFragment = result.cursors = document.createDocumentFragment();\n    var selFragment = result.selection = document.createDocumentFragment();\n\n    for (var i = 0; i < doc.sel.ranges.length; i++) {\n      var range = doc.sel.ranges[i];\n      var collapsed = range.empty();\n      if (collapsed || cm.options.showCursorWhenSelecting)\n        drawSelectionCursor(cm, range, curFragment);\n      if (!collapsed)\n        drawSelectionRange(cm, range, selFragment);\n    }\n\n    // Move the hidden textarea near the cursor to prevent scrolling artifacts\n    if (cm.options.moveInputWithCursor) {\n      var headPos = cursorCoords(cm, doc.sel.primary().head, \"div\");\n      var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect();\n      result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10,\n                                          headPos.top + lineOff.top - wrapOff.top));\n      result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10,\n                                           headPos.left + lineOff.left - wrapOff.left));\n    }\n\n    return result;\n  }\n\n  function showSelection(cm, drawn) {\n    removeChildrenAndAdd(cm.display.cursorDiv, drawn.cursors);\n    removeChildrenAndAdd(cm.display.selectionDiv, drawn.selection);\n    if (drawn.teTop != null) {\n      cm.display.inputDiv.style.top = drawn.teTop + \"px\";\n      cm.display.inputDiv.style.left = drawn.teLeft + \"px\";\n    }\n  }\n\n  function updateSelection(cm) {\n    showSelection(cm, drawSelection(cm));\n  }\n\n  // Draws a cursor for the given range\n  function drawSelectionCursor(cm, range, output) {\n    var pos = cursorCoords(cm, range.head, \"div\", null, null, !cm.options.singleCursorHeightPerLine);\n\n    var cursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor\"));\n    cursor.style.left = pos.left + \"px\";\n    cursor.style.top = pos.top + \"px\";\n    cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + \"px\";\n\n    if (pos.other) {\n      // Secondary cursor, shown when on a 'jump' in bi-directional text\n      var otherCursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor CodeMirror-secondarycursor\"));\n      otherCursor.style.display = \"\";\n      otherCursor.style.left = pos.other.left + \"px\";\n      otherCursor.style.top = pos.other.top + \"px\";\n      otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + \"px\";\n    }\n  }\n\n  // Draws the given range as a highlighted selection\n  function drawSelectionRange(cm, range, output) {\n    var display = cm.display, doc = cm.doc;\n    var fragment = document.createDocumentFragment();\n    var padding = paddingH(cm.display), leftSide = padding.left, rightSide = display.lineSpace.offsetWidth - padding.right;\n\n    function add(left, top, width, bottom) {\n      if (top < 0) top = 0;\n      top = Math.round(top);\n      bottom = Math.round(bottom);\n      fragment.appendChild(elt(\"div\", null, \"CodeMirror-selected\", \"position: absolute; left: \" + left +\n                               \"px; top: \" + top + \"px; width: \" + (width == null ? rightSide - left : width) +\n                               \"px; height: \" + (bottom - top) + \"px\"));\n    }\n\n    function drawForLine(line, fromArg, toArg) {\n      var lineObj = getLine(doc, line);\n      var lineLen = lineObj.text.length;\n      var start, end;\n      function coords(ch, bias) {\n        return charCoords(cm, Pos(line, ch), \"div\", lineObj, bias);\n      }\n\n      iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) {\n        var leftPos = coords(from, \"left\"), rightPos, left, right;\n        if (from == to) {\n          rightPos = leftPos;\n          left = right = leftPos.left;\n        } else {\n          rightPos = coords(to - 1, \"right\");\n          if (dir == \"rtl\") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp; }\n          left = leftPos.left;\n          right = rightPos.right;\n        }\n        if (fromArg == null && from == 0) left = leftSide;\n        if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part\n          add(left, leftPos.top, null, leftPos.bottom);\n          left = leftSide;\n          if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top);\n        }\n        if (toArg == null && to == lineLen) right = rightSide;\n        if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left)\n          start = leftPos;\n        if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right)\n          end = rightPos;\n        if (left < leftSide + 1) left = leftSide;\n        add(left, rightPos.top, right - left, rightPos.bottom);\n      });\n      return {start: start, end: end};\n    }\n\n    var sFrom = range.from(), sTo = range.to();\n    if (sFrom.line == sTo.line) {\n      drawForLine(sFrom.line, sFrom.ch, sTo.ch);\n    } else {\n      var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line);\n      var singleVLine = visualLine(fromLine) == visualLine(toLine);\n      var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end;\n      var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start;\n      if (singleVLine) {\n        if (leftEnd.top < rightStart.top - 2) {\n          add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);\n          add(leftSide, rightStart.top, rightStart.left, rightStart.bottom);\n        } else {\n          add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);\n        }\n      }\n      if (leftEnd.bottom < rightStart.top)\n        add(leftSide, leftEnd.bottom, null, rightStart.top);\n    }\n\n    output.appendChild(fragment);\n  }\n\n  // Cursor-blinking\n  function restartBlink(cm) {\n    if (!cm.state.focused) return;\n    var display = cm.display;\n    clearInterval(display.blinker);\n    var on = true;\n    display.cursorDiv.style.visibility = \"\";\n    if (cm.options.cursorBlinkRate > 0)\n      display.blinker = setInterval(function() {\n        display.cursorDiv.style.visibility = (on = !on) ? \"\" : \"hidden\";\n      }, cm.options.cursorBlinkRate);\n    else if (cm.options.cursorBlinkRate < 0)\n      display.cursorDiv.style.visibility = \"hidden\";\n  }\n\n  // HIGHLIGHT WORKER\n\n  function startWorker(cm, time) {\n    if (cm.doc.mode.startState && cm.doc.frontier < cm.display.viewTo)\n      cm.state.highlight.set(time, bind(highlightWorker, cm));\n  }\n\n  function highlightWorker(cm) {\n    var doc = cm.doc;\n    if (doc.frontier < doc.first) doc.frontier = doc.first;\n    if (doc.frontier >= cm.display.viewTo) return;\n    var end = +new Date + cm.options.workTime;\n    var state = copyState(doc.mode, getStateBefore(cm, doc.frontier));\n    var changedLines = [];\n\n    doc.iter(doc.frontier, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function(line) {\n      if (doc.frontier >= cm.display.viewFrom) { // Visible\n        var oldStyles = line.styles;\n        var highlighted = highlightLine(cm, line, state, true);\n        line.styles = highlighted.styles;\n        var oldCls = line.styleClasses, newCls = highlighted.classes;\n        if (newCls) line.styleClasses = newCls;\n        else if (oldCls) line.styleClasses = null;\n        var ischange = !oldStyles || oldStyles.length != line.styles.length ||\n          oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass);\n        for (var i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i];\n        if (ischange) changedLines.push(doc.frontier);\n        line.stateAfter = copyState(doc.mode, state);\n      } else {\n        processLine(cm, line.text, state);\n        line.stateAfter = doc.frontier % 5 == 0 ? copyState(doc.mode, state) : null;\n      }\n      ++doc.frontier;\n      if (+new Date > end) {\n        startWorker(cm, cm.options.workDelay);\n        return true;\n      }\n    });\n    if (changedLines.length) runInOp(cm, function() {\n      for (var i = 0; i < changedLines.length; i++)\n        regLineChange(cm, changedLines[i], \"text\");\n    });\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(cm, n, precise) {\n    var minindent, minline, doc = cm.doc;\n    var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);\n    for (var search = n; search > lim; --search) {\n      if (search <= doc.first) return doc.first;\n      var line = getLine(doc, search - 1);\n      if (line.stateAfter && (!precise || search <= doc.frontier)) return search;\n      var indented = countColumn(line.text, null, cm.options.tabSize);\n      if (minline == null || minindent > indented) {\n        minline = search - 1;\n        minindent = indented;\n      }\n    }\n    return minline;\n  }\n\n  function getStateBefore(cm, n, precise) {\n    var doc = cm.doc, display = cm.display;\n    if (!doc.mode.startState) return true;\n    var pos = findStartLine(cm, n, precise), state = pos > doc.first && getLine(doc, pos-1).stateAfter;\n    if (!state) state = startState(doc.mode);\n    else state = copyState(doc.mode, state);\n    doc.iter(pos, n, function(line) {\n      processLine(cm, line.text, state);\n      var save = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo;\n      line.stateAfter = save ? copyState(doc.mode, state) : null;\n      ++pos;\n    });\n    if (precise) doc.frontier = pos;\n    return state;\n  }\n\n  // POSITION MEASUREMENT\n\n  function paddingTop(display) {return display.lineSpace.offsetTop;}\n  function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight;}\n  function paddingH(display) {\n    if (display.cachedPaddingH) return display.cachedPaddingH;\n    var e = removeChildrenAndAdd(display.measure, elt(\"pre\", \"x\"));\n    var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;\n    var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};\n    if (!isNaN(data.left) && !isNaN(data.right)) display.cachedPaddingH = data;\n    return data;\n  }\n\n  // Ensure the lineView.wrapping.heights array is populated. This is\n  // an array of bottom offsets for the lines that make up a drawn\n  // line. When lineWrapping is on, there might be more than one\n  // height.\n  function ensureLineHeights(cm, lineView, rect) {\n    var wrapping = cm.options.lineWrapping;\n    var curWidth = wrapping && cm.display.scroller.clientWidth;\n    if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {\n      var heights = lineView.measure.heights = [];\n      if (wrapping) {\n        lineView.measure.width = curWidth;\n        var rects = lineView.text.firstChild.getClientRects();\n        for (var i = 0; i < rects.length - 1; i++) {\n          var cur = rects[i], next = rects[i + 1];\n          if (Math.abs(cur.bottom - next.bottom) > 2)\n            heights.push((cur.bottom + next.top) / 2 - rect.top);\n        }\n      }\n      heights.push(rect.bottom - rect.top);\n    }\n  }\n\n  // Find a line map (mapping character offsets to text nodes) and a\n  // measurement cache for the given line number. (A line view might\n  // contain multiple lines when collapsed ranges are present.)\n  function mapFromLineView(lineView, line, lineN) {\n    if (lineView.line == line)\n      return {map: lineView.measure.map, cache: lineView.measure.cache};\n    for (var i = 0; i < lineView.rest.length; i++)\n      if (lineView.rest[i] == line)\n        return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]};\n    for (var i = 0; i < lineView.rest.length; i++)\n      if (lineNo(lineView.rest[i]) > lineN)\n        return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i], before: true};\n  }\n\n  // Render a line into the hidden node display.externalMeasured. Used\n  // when measurement is needed for a line that's not in the viewport.\n  function updateExternalMeasurement(cm, line) {\n    line = visualLine(line);\n    var lineN = lineNo(line);\n    var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN);\n    view.lineN = lineN;\n    var built = view.built = buildLineContent(cm, view);\n    view.text = built.pre;\n    removeChildrenAndAdd(cm.display.lineMeasure, built.pre);\n    return view;\n  }\n\n  // Get a {top, bottom, left, right} box (in line-local coordinates)\n  // for a given character.\n  function measureChar(cm, line, ch, bias) {\n    return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias);\n  }\n\n  // Find a line view that corresponds to the given line number.\n  function findViewForLine(cm, lineN) {\n    if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)\n      return cm.display.view[findViewIndex(cm, lineN)];\n    var ext = cm.display.externalMeasured;\n    if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)\n      return ext;\n  }\n\n  // Measurement can be split in two steps, the set-up work that\n  // applies to the whole line, and the measurement of the actual\n  // character. Functions like coordsChar, that need to do a lot of\n  // measurements in a row, can thus ensure that the set-up work is\n  // only done once.\n  function prepareMeasureForLine(cm, line) {\n    var lineN = lineNo(line);\n    var view = findViewForLine(cm, lineN);\n    if (view && !view.text)\n      view = null;\n    else if (view && view.changes)\n      updateLineForChanges(cm, view, lineN, getDimensions(cm));\n    if (!view)\n      view = updateExternalMeasurement(cm, line);\n\n    var info = mapFromLineView(view, line, lineN);\n    return {\n      line: line, view: view, rect: null,\n      map: info.map, cache: info.cache, before: info.before,\n      hasHeights: false\n    };\n  }\n\n  // Given a prepared measurement object, measures the position of an\n  // actual character (or fetches it from the cache).\n  function measureCharPrepared(cm, prepared, ch, bias, varHeight) {\n    if (prepared.before) ch = -1;\n    var key = ch + (bias || \"\"), found;\n    if (prepared.cache.hasOwnProperty(key)) {\n      found = prepared.cache[key];\n    } else {\n      if (!prepared.rect)\n        prepared.rect = prepared.view.text.getBoundingClientRect();\n      if (!prepared.hasHeights) {\n        ensureLineHeights(cm, prepared.view, prepared.rect);\n        prepared.hasHeights = true;\n      }\n      found = measureCharInner(cm, prepared, ch, bias);\n      if (!found.bogus) prepared.cache[key] = found;\n    }\n    return {left: found.left, right: found.right,\n            top: varHeight ? found.rtop : found.top,\n            bottom: varHeight ? found.rbottom : found.bottom};\n  }\n\n  var nullRect = {left: 0, right: 0, top: 0, bottom: 0};\n\n  function measureCharInner(cm, prepared, ch, bias) {\n    var map = prepared.map;\n\n    var node, start, end, collapse;\n    // First, search the line map for the text node corresponding to,\n    // or closest to, the target character.\n    for (var i = 0; i < map.length; i += 3) {\n      var mStart = map[i], mEnd = map[i + 1];\n      if (ch < mStart) {\n        start = 0; end = 1;\n        collapse = \"left\";\n      } else if (ch < mEnd) {\n        start = ch - mStart;\n        end = start + 1;\n      } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) {\n        end = mEnd - mStart;\n        start = end - 1;\n        if (ch >= mEnd) collapse = \"right\";\n      }\n      if (start != null) {\n        node = map[i + 2];\n        if (mStart == mEnd && bias == (node.insertLeft ? \"left\" : \"right\"))\n          collapse = bias;\n        if (bias == \"left\" && start == 0)\n          while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {\n            node = map[(i -= 3) + 2];\n            collapse = \"left\";\n          }\n        if (bias == \"right\" && start == mEnd - mStart)\n          while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {\n            node = map[(i += 3) + 2];\n            collapse = \"right\";\n          }\n        break;\n      }\n    }\n\n    var rect;\n    if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.\n      for (var i = 0; i < 4; i++) { // Retry a maximum of 4 times when nonsense rectangles are returned\n        while (start && isExtendingChar(prepared.line.text.charAt(mStart + start))) --start;\n        while (mStart + end < mEnd && isExtendingChar(prepared.line.text.charAt(mStart + end))) ++end;\n        if (ie && ie_version < 9 && start == 0 && end == mEnd - mStart) {\n          rect = node.parentNode.getBoundingClientRect();\n        } else if (ie && cm.options.lineWrapping) {\n          var rects = range(node, start, end).getClientRects();\n          if (rects.length)\n            rect = rects[bias == \"right\" ? rects.length - 1 : 0];\n          else\n            rect = nullRect;\n        } else {\n          rect = range(node, start, end).getBoundingClientRect() || nullRect;\n        }\n        if (rect.left || rect.right || start == 0) break;\n        end = start;\n        start = start - 1;\n        collapse = \"right\";\n      }\n      if (ie && ie_version < 11) rect = maybeUpdateRectForZooming(cm.display.measure, rect);\n    } else { // If it is a widget, simply get the box for the whole widget.\n      if (start > 0) collapse = bias = \"right\";\n      var rects;\n      if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)\n        rect = rects[bias == \"right\" ? rects.length - 1 : 0];\n      else\n        rect = node.getBoundingClientRect();\n    }\n    if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {\n      var rSpan = node.parentNode.getClientRects()[0];\n      if (rSpan)\n        rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom};\n      else\n        rect = nullRect;\n    }\n\n    var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top;\n    var mid = (rtop + rbot) / 2;\n    var heights = prepared.view.measure.heights;\n    for (var i = 0; i < heights.length - 1; i++)\n      if (mid < heights[i]) break;\n    var top = i ? heights[i - 1] : 0, bot = heights[i];\n    var result = {left: (collapse == \"right\" ? rect.right : rect.left) - prepared.rect.left,\n                  right: (collapse == \"left\" ? rect.left : rect.right) - prepared.rect.left,\n                  top: top, bottom: bot};\n    if (!rect.left && !rect.right) result.bogus = true;\n    if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; }\n\n    return result;\n  }\n\n  // Work around problem with bounding client rects on ranges being\n  // returned incorrectly when zoomed on IE10 and below.\n  function maybeUpdateRectForZooming(measure, rect) {\n    if (!window.screen || screen.logicalXDPI == null ||\n        screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))\n      return rect;\n    var scaleX = screen.logicalXDPI / screen.deviceXDPI;\n    var scaleY = screen.logicalYDPI / screen.deviceYDPI;\n    return {left: rect.left * scaleX, right: rect.right * scaleX,\n            top: rect.top * scaleY, bottom: rect.bottom * scaleY};\n  }\n\n  function clearLineMeasurementCacheFor(lineView) {\n    if (lineView.measure) {\n      lineView.measure.cache = {};\n      lineView.measure.heights = null;\n      if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++)\n        lineView.measure.caches[i] = {};\n    }\n  }\n\n  function clearLineMeasurementCache(cm) {\n    cm.display.externalMeasure = null;\n    removeChildren(cm.display.lineMeasure);\n    for (var i = 0; i < cm.display.view.length; i++)\n      clearLineMeasurementCacheFor(cm.display.view[i]);\n  }\n\n  function clearCaches(cm) {\n    clearLineMeasurementCache(cm);\n    cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;\n    if (!cm.options.lineWrapping) cm.display.maxLineChanged = true;\n    cm.display.lineNumChars = null;\n  }\n\n  function pageScrollX() { return window.pageXOffset || (document.documentElement || document.body).scrollLeft; }\n  function pageScrollY() { return window.pageYOffset || (document.documentElement || document.body).scrollTop; }\n\n  // Converts a {top, bottom, left, right} box from line-local\n  // coordinates into another coordinate system. Context may be one of\n  // \"line\", \"div\" (display.lineDiv), \"local\"/null (editor), or \"page\".\n  function intoCoordSystem(cm, lineObj, rect, context) {\n    if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) {\n      var size = widgetHeight(lineObj.widgets[i]);\n      rect.top += size; rect.bottom += size;\n    }\n    if (context == \"line\") return rect;\n    if (!context) context = \"local\";\n    var yOff = heightAtLine(lineObj);\n    if (context == \"local\") yOff += paddingTop(cm.display);\n    else yOff -= cm.display.viewOffset;\n    if (context == \"page\" || context == \"window\") {\n      var lOff = cm.display.lineSpace.getBoundingClientRect();\n      yOff += lOff.top + (context == \"window\" ? 0 : pageScrollY());\n      var xOff = lOff.left + (context == \"window\" ? 0 : pageScrollX());\n      rect.left += xOff; rect.right += xOff;\n    }\n    rect.top += yOff; rect.bottom += yOff;\n    return rect;\n  }\n\n  // Coverts a box from \"div\" coords to another coordinate system.\n  // Context may be \"window\", \"page\", \"div\", or \"local\"/null.\n  function fromCoordSystem(cm, coords, context) {\n    if (context == \"div\") return coords;\n    var left = coords.left, top = coords.top;\n    // First move into \"page\" coordinate system\n    if (context == \"page\") {\n      left -= pageScrollX();\n      top -= pageScrollY();\n    } else if (context == \"local\" || !context) {\n      var localBox = cm.display.sizer.getBoundingClientRect();\n      left += localBox.left;\n      top += localBox.top;\n    }\n\n    var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect();\n    return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top};\n  }\n\n  function charCoords(cm, pos, context, lineObj, bias) {\n    if (!lineObj) lineObj = getLine(cm.doc, pos.line);\n    return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context);\n  }\n\n  // Returns a box for a given cursor position, which may have an\n  // 'other' property containing the position of the secondary cursor\n  // on a bidi boundary.\n  function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {\n    lineObj = lineObj || getLine(cm.doc, pos.line);\n    if (!preparedMeasure) preparedMeasure = prepareMeasureForLine(cm, lineObj);\n    function get(ch, right) {\n      var m = measureCharPrepared(cm, preparedMeasure, ch, right ? \"right\" : \"left\", varHeight);\n      if (right) m.left = m.right; else m.right = m.left;\n      return intoCoordSystem(cm, lineObj, m, context);\n    }\n    function getBidi(ch, partPos) {\n      var part = order[partPos], right = part.level % 2;\n      if (ch == bidiLeft(part) && partPos && part.level < order[partPos - 1].level) {\n        part = order[--partPos];\n        ch = bidiRight(part) - (part.level % 2 ? 0 : 1);\n        right = true;\n      } else if (ch == bidiRight(part) && partPos < order.length - 1 && part.level < order[partPos + 1].level) {\n        part = order[++partPos];\n        ch = bidiLeft(part) - part.level % 2;\n        right = false;\n      }\n      if (right && ch == part.to && ch > part.from) return get(ch - 1);\n      return get(ch, right);\n    }\n    var order = getOrder(lineObj), ch = pos.ch;\n    if (!order) return get(ch);\n    var partPos = getBidiPartAt(order, ch);\n    var val = getBidi(ch, partPos);\n    if (bidiOther != null) val.other = getBidi(ch, bidiOther);\n    return val;\n  }\n\n  // Used to cheaply estimate the coordinates for a position. Used for\n  // intermediate scroll updates.\n  function estimateCoords(cm, pos) {\n    var left = 0, pos = clipPos(cm.doc, pos);\n    if (!cm.options.lineWrapping) left = charWidth(cm.display) * pos.ch;\n    var lineObj = getLine(cm.doc, pos.line);\n    var top = heightAtLine(lineObj) + paddingTop(cm.display);\n    return {left: left, right: left, top: top, bottom: top + lineObj.height};\n  }\n\n  // Positions returned by coordsChar contain some extra information.\n  // xRel is the relative x position of the input coordinates compared\n  // to the found position (so xRel > 0 means the coordinates are to\n  // the right of the character position, for example). When outside\n  // is true, that means the coordinates lie outside the line's\n  // vertical range.\n  function PosWithInfo(line, ch, outside, xRel) {\n    var pos = Pos(line, ch);\n    pos.xRel = xRel;\n    if (outside) pos.outside = true;\n    return pos;\n  }\n\n  // Compute the character position closest to the given coordinates.\n  // Input must be lineSpace-local (\"div\" coordinate system).\n  function coordsChar(cm, x, y) {\n    var doc = cm.doc;\n    y += cm.display.viewOffset;\n    if (y < 0) return PosWithInfo(doc.first, 0, true, -1);\n    var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;\n    if (lineN > last)\n      return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, true, 1);\n    if (x < 0) x = 0;\n\n    var lineObj = getLine(doc, lineN);\n    for (;;) {\n      var found = coordsCharInner(cm, lineObj, lineN, x, y);\n      var merged = collapsedSpanAtEnd(lineObj);\n      var mergedPos = merged && merged.find(0, true);\n      if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0))\n        lineN = lineNo(lineObj = mergedPos.to.line);\n      else\n        return found;\n    }\n  }\n\n  function coordsCharInner(cm, lineObj, lineNo, x, y) {\n    var innerOff = y - heightAtLine(lineObj);\n    var wrongLine = false, adjust = 2 * cm.display.wrapper.clientWidth;\n    var preparedMeasure = prepareMeasureForLine(cm, lineObj);\n\n    function getX(ch) {\n      var sp = cursorCoords(cm, Pos(lineNo, ch), \"line\", lineObj, preparedMeasure);\n      wrongLine = true;\n      if (innerOff > sp.bottom) return sp.left - adjust;\n      else if (innerOff < sp.top) return sp.left + adjust;\n      else wrongLine = false;\n      return sp.left;\n    }\n\n    var bidi = getOrder(lineObj), dist = lineObj.text.length;\n    var from = lineLeft(lineObj), to = lineRight(lineObj);\n    var fromX = getX(from), fromOutside = wrongLine, toX = getX(to), toOutside = wrongLine;\n\n    if (x > toX) return PosWithInfo(lineNo, to, toOutside, 1);\n    // Do a binary search between these bounds.\n    for (;;) {\n      if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) {\n        var ch = x < fromX || x - fromX <= toX - x ? from : to;\n        var xDiff = x - (ch == from ? fromX : toX);\n        while (isExtendingChar(lineObj.text.charAt(ch))) ++ch;\n        var pos = PosWithInfo(lineNo, ch, ch == from ? fromOutside : toOutside,\n                              xDiff < -1 ? -1 : xDiff > 1 ? 1 : 0);\n        return pos;\n      }\n      var step = Math.ceil(dist / 2), middle = from + step;\n      if (bidi) {\n        middle = from;\n        for (var i = 0; i < step; ++i) middle = moveVisually(lineObj, middle, 1);\n      }\n      var middleX = getX(middle);\n      if (middleX > x) {to = middle; toX = middleX; if (toOutside = wrongLine) toX += 1000; dist = step;}\n      else {from = middle; fromX = middleX; fromOutside = wrongLine; dist -= step;}\n    }\n  }\n\n  var measureText;\n  // Compute the default text height.\n  function textHeight(display) {\n    if (display.cachedTextHeight != null) return display.cachedTextHeight;\n    if (measureText == null) {\n      measureText = elt(\"pre\");\n      // Measure a bunch of lines, for browsers that compute\n      // fractional heights.\n      for (var i = 0; i < 49; ++i) {\n        measureText.appendChild(document.createTextNode(\"x\"));\n        measureText.appendChild(elt(\"br\"));\n      }\n      measureText.appendChild(document.createTextNode(\"x\"));\n    }\n    removeChildrenAndAdd(display.measure, measureText);\n    var height = measureText.offsetHeight / 50;\n    if (height > 3) display.cachedTextHeight = height;\n    removeChildren(display.measure);\n    return height || 1;\n  }\n\n  // Compute the default character width.\n  function charWidth(display) {\n    if (display.cachedCharWidth != null) return display.cachedCharWidth;\n    var anchor = elt(\"span\", \"xxxxxxxxxx\");\n    var pre = elt(\"pre\", [anchor]);\n    removeChildrenAndAdd(display.measure, pre);\n    var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10;\n    if (width > 2) display.cachedCharWidth = width;\n    return width || 10;\n  }\n\n  // OPERATIONS\n\n  // Operations are used to wrap a series of changes to the editor\n  // state in such a way that each change won't have to update the\n  // cursor and display (which would be awkward, slow, and\n  // error-prone). Instead, display updates are batched and then all\n  // combined and executed at once.\n\n  var operationGroup = null;\n\n  var nextOpId = 0;\n  // Start a new operation.\n  function startOperation(cm) {\n    cm.curOp = {\n      cm: cm,\n      viewChanged: false,      // Flag that indicates that lines might need to be redrawn\n      startHeight: cm.doc.height, // Used to detect need to update scrollbar\n      forceUpdate: false,      // Used to force a redraw\n      updateInput: null,       // Whether to reset the input textarea\n      typing: false,           // Whether this reset should be careful to leave existing text (for compositing)\n      changeObjs: null,        // Accumulated changes, for firing change events\n      cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on\n      cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already\n      selectionChanged: false, // Whether the selection needs to be redrawn\n      updateMaxLine: false,    // Set when the widest line needs to be determined anew\n      scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet\n      scrollToPos: null,       // Used to scroll to a specific position\n      id: ++nextOpId           // Unique ID\n    };\n    if (operationGroup) {\n      operationGroup.ops.push(cm.curOp);\n    } else {\n      cm.curOp.ownsGroup = operationGroup = {\n        ops: [cm.curOp],\n        delayedCallbacks: []\n      };\n    }\n  }\n\n  function fireCallbacksForOps(group) {\n    // Calls delayed callbacks and cursorActivity handlers until no\n    // new ones appear\n    var callbacks = group.delayedCallbacks, i = 0;\n    do {\n      for (; i < callbacks.length; i++)\n        callbacks[i]();\n      for (var j = 0; j < group.ops.length; j++) {\n        var op = group.ops[j];\n        if (op.cursorActivityHandlers)\n          while (op.cursorActivityCalled < op.cursorActivityHandlers.length)\n            op.cursorActivityHandlers[op.cursorActivityCalled++](op.cm);\n      }\n    } while (i < callbacks.length);\n  }\n\n  // Finish an operation, updating the display and signalling delayed events\n  function endOperation(cm) {\n    var op = cm.curOp, group = op.ownsGroup;\n    if (!group) return;\n\n    try { fireCallbacksForOps(group); }\n    finally {\n      operationGroup = null;\n      for (var i = 0; i < group.ops.length; i++)\n        group.ops[i].cm.curOp = null;\n      endOperations(group);\n    }\n  }\n\n  // The DOM updates done when an operation finishes are batched so\n  // that the minimum number of relayouts are required.\n  function endOperations(group) {\n    var ops = group.ops;\n    for (var i = 0; i < ops.length; i++) // Read DOM\n      endOperation_R1(ops[i]);\n    for (var i = 0; i < ops.length; i++) // Write DOM (maybe)\n      endOperation_W1(ops[i]);\n    for (var i = 0; i < ops.length; i++) // Read DOM\n      endOperation_R2(ops[i]);\n    for (var i = 0; i < ops.length; i++) // Write DOM (maybe)\n      endOperation_W2(ops[i]);\n    for (var i = 0; i < ops.length; i++) // Read DOM\n      endOperation_finish(ops[i]);\n  }\n\n  function endOperation_R1(op) {\n    var cm = op.cm, display = cm.display;\n    if (op.updateMaxLine) findMaxLine(cm);\n\n    op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null ||\n      op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||\n                         op.scrollToPos.to.line >= display.viewTo) ||\n      display.maxLineChanged && cm.options.lineWrapping;\n    op.update = op.mustUpdate &&\n      new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate);\n  }\n\n  function endOperation_W1(op) {\n    op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update);\n  }\n\n  function endOperation_R2(op) {\n    var cm = op.cm, display = cm.display;\n    if (op.updatedDisplay) updateHeightsInViewport(cm);\n\n    op.barMeasure = measureForScrollbars(cm);\n\n    // If the max line changed since it was last measured, measure it,\n    // and ensure the document's width matches it.\n    // updateDisplay_W2 will use these properties to do the actual resizing\n    if (display.maxLineChanged && !cm.options.lineWrapping) {\n      op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3;\n      op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo +\n                                  scrollerCutOff - display.scroller.clientWidth);\n    }\n\n    if (op.updatedDisplay || op.selectionChanged)\n      op.newSelectionNodes = drawSelection(cm);\n  }\n\n  function endOperation_W2(op) {\n    var cm = op.cm;\n\n    if (op.adjustWidthTo != null) {\n      cm.display.sizer.style.minWidth = op.adjustWidthTo + \"px\";\n      if (op.maxScrollLeft < cm.doc.scrollLeft)\n        setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true);\n      cm.display.maxLineChanged = false;\n    }\n\n    if (op.newSelectionNodes)\n      showSelection(cm, op.newSelectionNodes);\n    if (op.updatedDisplay)\n      setDocumentHeight(cm, op.barMeasure);\n    if (op.updatedDisplay || op.startHeight != cm.doc.height)\n      updateScrollbars(cm, op.barMeasure);\n\n    if (op.selectionChanged) restartBlink(cm);\n\n    if (cm.state.focused && op.updateInput)\n      resetInput(cm, op.typing);\n  }\n\n  function endOperation_finish(op) {\n    var cm = op.cm, display = cm.display, doc = cm.doc;\n\n    if (op.adjustWidthTo != null && Math.abs(op.barMeasure.scrollWidth - cm.display.scroller.scrollWidth) > 1)\n      updateScrollbars(cm);\n\n    if (op.updatedDisplay) postUpdateDisplay(cm, op.update);\n\n    // Abort mouse wheel delta measurement, when scrolling explicitly\n    if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos))\n      display.wheelStartX = display.wheelStartY = null;\n\n    // Propagate the scroll position to the actual DOM scroller\n    if (op.scrollTop != null && (display.scroller.scrollTop != op.scrollTop || op.forceScroll)) {\n      var top = Math.max(0, Math.min(display.scroller.scrollHeight - display.scroller.clientHeight, op.scrollTop));\n      display.scroller.scrollTop = display.scrollbarV.scrollTop = doc.scrollTop = top;\n    }\n    if (op.scrollLeft != null && (display.scroller.scrollLeft != op.scrollLeft || op.forceScroll)) {\n      var left = Math.max(0, Math.min(display.scroller.scrollWidth - display.scroller.clientWidth, op.scrollLeft));\n      display.scroller.scrollLeft = display.scrollbarH.scrollLeft = doc.scrollLeft = left;\n      alignHorizontally(cm);\n    }\n    // If we need to scroll a specific position into view, do so.\n    if (op.scrollToPos) {\n      var coords = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),\n                                     clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin);\n      if (op.scrollToPos.isCursor && cm.state.focused) maybeScrollWindow(cm, coords);\n    }\n\n    // Fire events for markers that are hidden/unidden by editing or\n    // undoing\n    var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;\n    if (hidden) for (var i = 0; i < hidden.length; ++i)\n      if (!hidden[i].lines.length) signal(hidden[i], \"hide\");\n    if (unhidden) for (var i = 0; i < unhidden.length; ++i)\n      if (unhidden[i].lines.length) signal(unhidden[i], \"unhide\");\n\n    if (display.wrapper.offsetHeight)\n      doc.scrollTop = cm.display.scroller.scrollTop;\n\n    // Apply workaround for two webkit bugs\n    if (op.updatedDisplay && webkit) {\n      if (cm.options.lineWrapping)\n        checkForWebkitWidthBug(cm, op.barMeasure); // (Issue #2420)\n      if (op.barMeasure.scrollWidth > op.barMeasure.clientWidth &&\n          op.barMeasure.scrollWidth < op.barMeasure.clientWidth + 1 &&\n          !hScrollbarTakesSpace(cm))\n        updateScrollbars(cm); // (Issue #2562)\n    }\n\n    // Fire change events, and delayed event handlers\n    if (op.changeObjs)\n      signal(cm, \"changes\", cm, op.changeObjs);\n  }\n\n  // Run the given function in an operation\n  function runInOp(cm, f) {\n    if (cm.curOp) return f();\n    startOperation(cm);\n    try { return f(); }\n    finally { endOperation(cm); }\n  }\n  // Wraps a function in an operation. Returns the wrapped function.\n  function operation(cm, f) {\n    return function() {\n      if (cm.curOp) return f.apply(cm, arguments);\n      startOperation(cm);\n      try { return f.apply(cm, arguments); }\n      finally { endOperation(cm); }\n    };\n  }\n  // Used to add methods to editor and doc instances, wrapping them in\n  // operations.\n  function methodOp(f) {\n    return function() {\n      if (this.curOp) return f.apply(this, arguments);\n      startOperation(this);\n      try { return f.apply(this, arguments); }\n      finally { endOperation(this); }\n    };\n  }\n  function docMethodOp(f) {\n    return function() {\n      var cm = this.cm;\n      if (!cm || cm.curOp) return f.apply(this, arguments);\n      startOperation(cm);\n      try { return f.apply(this, arguments); }\n      finally { endOperation(cm); }\n    };\n  }\n\n  // VIEW TRACKING\n\n  // These objects are used to represent the visible (currently drawn)\n  // part of the document. A LineView may correspond to multiple\n  // logical lines, if those are connected by collapsed ranges.\n  function LineView(doc, line, lineN) {\n    // The starting line\n    this.line = line;\n    // Continuing lines, if any\n    this.rest = visualLineContinued(line);\n    // Number of logical lines in this visual line\n    this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1;\n    this.node = this.text = null;\n    this.hidden = lineIsHidden(doc, line);\n  }\n\n  // Create a range of LineView objects for the given lines.\n  function buildViewArray(cm, from, to) {\n    var array = [], nextPos;\n    for (var pos = from; pos < to; pos = nextPos) {\n      var view = new LineView(cm.doc, getLine(cm.doc, pos), pos);\n      nextPos = pos + view.size;\n      array.push(view);\n    }\n    return array;\n  }\n\n  // Updates the display.view data structure for a given change to the\n  // document. From and to are in pre-change coordinates. Lendiff is\n  // the amount of lines added or subtracted by the change. This is\n  // used for changes that span multiple lines, or change the way\n  // lines are divided into visual lines. regLineChange (below)\n  // registers single-line changes.\n  function regChange(cm, from, to, lendiff) {\n    if (from == null) from = cm.doc.first;\n    if (to == null) to = cm.doc.first + cm.doc.size;\n    if (!lendiff) lendiff = 0;\n\n    var display = cm.display;\n    if (lendiff && to < display.viewTo &&\n        (display.updateLineNumbers == null || display.updateLineNumbers > from))\n      display.updateLineNumbers = from;\n\n    cm.curOp.viewChanged = true;\n\n    if (from >= display.viewTo) { // Change after\n      if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo)\n        resetView(cm);\n    } else if (to <= display.viewFrom) { // Change before\n      if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) {\n        resetView(cm);\n      } else {\n        display.viewFrom += lendiff;\n        display.viewTo += lendiff;\n      }\n    } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap\n      resetView(cm);\n    } else if (from <= display.viewFrom) { // Top overlap\n      var cut = viewCuttingPoint(cm, to, to + lendiff, 1);\n      if (cut) {\n        display.view = display.view.slice(cut.index);\n        display.viewFrom = cut.lineN;\n        display.viewTo += lendiff;\n      } else {\n        resetView(cm);\n      }\n    } else if (to >= display.viewTo) { // Bottom overlap\n      var cut = viewCuttingPoint(cm, from, from, -1);\n      if (cut) {\n        display.view = display.view.slice(0, cut.index);\n        display.viewTo = cut.lineN;\n      } else {\n        resetView(cm);\n      }\n    } else { // Gap in the middle\n      var cutTop = viewCuttingPoint(cm, from, from, -1);\n      var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1);\n      if (cutTop && cutBot) {\n        display.view = display.view.slice(0, cutTop.index)\n          .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))\n          .concat(display.view.slice(cutBot.index));\n        display.viewTo += lendiff;\n      } else {\n        resetView(cm);\n      }\n    }\n\n    var ext = display.externalMeasured;\n    if (ext) {\n      if (to < ext.lineN)\n        ext.lineN += lendiff;\n      else if (from < ext.lineN + ext.size)\n        display.externalMeasured = null;\n    }\n  }\n\n  // Register a change to a single line. Type must be one of \"text\",\n  // \"gutter\", \"class\", \"widget\"\n  function regLineChange(cm, line, type) {\n    cm.curOp.viewChanged = true;\n    var display = cm.display, ext = cm.display.externalMeasured;\n    if (ext && line >= ext.lineN && line < ext.lineN + ext.size)\n      display.externalMeasured = null;\n\n    if (line < display.viewFrom || line >= display.viewTo) return;\n    var lineView = display.view[findViewIndex(cm, line)];\n    if (lineView.node == null) return;\n    var arr = lineView.changes || (lineView.changes = []);\n    if (indexOf(arr, type) == -1) arr.push(type);\n  }\n\n  // Clear the view.\n  function resetView(cm) {\n    cm.display.viewFrom = cm.display.viewTo = cm.doc.first;\n    cm.display.view = [];\n    cm.display.viewOffset = 0;\n  }\n\n  // Find the view element corresponding to a given line. Return null\n  // when the line isn't visible.\n  function findViewIndex(cm, n) {\n    if (n >= cm.display.viewTo) return null;\n    n -= cm.display.viewFrom;\n    if (n < 0) return null;\n    var view = cm.display.view;\n    for (var i = 0; i < view.length; i++) {\n      n -= view[i].size;\n      if (n < 0) return i;\n    }\n  }\n\n  function viewCuttingPoint(cm, oldN, newN, dir) {\n    var index = findViewIndex(cm, oldN), diff, view = cm.display.view;\n    if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size)\n      return {index: index, lineN: newN};\n    for (var i = 0, n = cm.display.viewFrom; i < index; i++)\n      n += view[i].size;\n    if (n != oldN) {\n      if (dir > 0) {\n        if (index == view.length - 1) return null;\n        diff = (n + view[index].size) - oldN;\n        index++;\n      } else {\n        diff = n - oldN;\n      }\n      oldN += diff; newN += diff;\n    }\n    while (visualLineNo(cm.doc, newN) != newN) {\n      if (index == (dir < 0 ? 0 : view.length - 1)) return null;\n      newN += dir * view[index - (dir < 0 ? 1 : 0)].size;\n      index += dir;\n    }\n    return {index: index, lineN: newN};\n  }\n\n  // Force the view to cover a given range, adding empty view element\n  // or clipping off existing ones as needed.\n  function adjustView(cm, from, to) {\n    var display = cm.display, view = display.view;\n    if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) {\n      display.view = buildViewArray(cm, from, to);\n      display.viewFrom = from;\n    } else {\n      if (display.viewFrom > from)\n        display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view);\n      else if (display.viewFrom < from)\n        display.view = display.view.slice(findViewIndex(cm, from));\n      display.viewFrom = from;\n      if (display.viewTo < to)\n        display.view = display.view.concat(buildViewArray(cm, display.viewTo, to));\n      else if (display.viewTo > to)\n        display.view = display.view.slice(0, findViewIndex(cm, to));\n    }\n    display.viewTo = to;\n  }\n\n  // Count the number of lines in the view whose DOM representation is\n  // out of date (or nonexistent).\n  function countDirtyView(cm) {\n    var view = cm.display.view, dirty = 0;\n    for (var i = 0; i < view.length; i++) {\n      var lineView = view[i];\n      if (!lineView.hidden && (!lineView.node || lineView.changes)) ++dirty;\n    }\n    return dirty;\n  }\n\n  // INPUT HANDLING\n\n  // Poll for input changes, using the normal rate of polling. This\n  // runs as long as the editor is focused.\n  function slowPoll(cm) {\n    if (cm.display.pollingFast) return;\n    cm.display.poll.set(cm.options.pollInterval, function() {\n      readInput(cm);\n      if (cm.state.focused) slowPoll(cm);\n    });\n  }\n\n  // When an event has just come in that is likely to add or change\n  // something in the input textarea, we poll faster, to ensure that\n  // the change appears on the screen quickly.\n  function fastPoll(cm) {\n    var missed = false;\n    cm.display.pollingFast = true;\n    function p() {\n      var changed = readInput(cm);\n      if (!changed && !missed) {missed = true; cm.display.poll.set(60, p);}\n      else {cm.display.pollingFast = false; slowPoll(cm);}\n    }\n    cm.display.poll.set(20, p);\n  }\n\n  // This will be set to an array of strings when copying, so that,\n  // when pasting, we know what kind of selections the copied text\n  // was made out of.\n  var lastCopied = null;\n\n  // Read input from the textarea, and update the document to match.\n  // When something is selected, it is present in the textarea, and\n  // selected (unless it is huge, in which case a placeholder is\n  // used). When nothing is selected, the cursor sits after previously\n  // seen text (can be empty), which is stored in prevInput (we must\n  // not reset the textarea when typing, because that breaks IME).\n  function readInput(cm) {\n    var input = cm.display.input, prevInput = cm.display.prevInput, doc = cm.doc;\n    // Since this is called a *lot*, try to bail out as cheaply as\n    // possible when it is clear that nothing happened. hasSelection\n    // will be the case when there is a lot of text in the textarea,\n    // in which case reading its value would be expensive.\n    if (!cm.state.focused || (hasSelection(input) && !prevInput) || isReadOnly(cm) || cm.options.disableInput)\n      return false;\n    // See paste handler for more on the fakedLastChar kludge\n    if (cm.state.pasteIncoming && cm.state.fakedLastChar) {\n      input.value = input.value.substring(0, input.value.length - 1);\n      cm.state.fakedLastChar = false;\n    }\n    var text = input.value;\n    // If nothing changed, bail.\n    if (text == prevInput && !cm.somethingSelected()) return false;\n    // Work around nonsensical selection resetting in IE9/10, and\n    // inexplicable appearance of private area unicode characters on\n    // some key combos in Mac (#2689).\n    if (ie && ie_version >= 9 && cm.display.inputHasSelection === text ||\n        mac && /[\\uf700-\\uf7ff]/.test(text)) {\n      resetInput(cm);\n      return false;\n    }\n\n    var withOp = !cm.curOp;\n    if (withOp) startOperation(cm);\n    cm.display.shift = false;\n\n    if (text.charCodeAt(0) == 0x200b && doc.sel == cm.display.selForContextMenu && !prevInput)\n      prevInput = \"\\u200b\";\n    // Find the part of the input that is actually new\n    var same = 0, l = Math.min(prevInput.length, text.length);\n    while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) ++same;\n    var inserted = text.slice(same), textLines = splitLines(inserted);\n\n    // When pasing N lines into N selections, insert one line per selection\n    var multiPaste = null;\n    if (cm.state.pasteIncoming && doc.sel.ranges.length > 1) {\n      if (lastCopied && lastCopied.join(\"\\n\") == inserted)\n        multiPaste = doc.sel.ranges.length % lastCopied.length == 0 && map(lastCopied, splitLines);\n      else if (textLines.length == doc.sel.ranges.length)\n        multiPaste = map(textLines, function(l) { return [l]; });\n    }\n\n    // Normal behavior is to insert the new text into every selection\n    for (var i = doc.sel.ranges.length - 1; i >= 0; i--) {\n      var range = doc.sel.ranges[i];\n      var from = range.from(), to = range.to();\n      // Handle deletion\n      if (same < prevInput.length)\n        from = Pos(from.line, from.ch - (prevInput.length - same));\n      // Handle overwrite\n      else if (cm.state.overwrite && range.empty() && !cm.state.pasteIncoming)\n        to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length));\n      var updateInput = cm.curOp.updateInput;\n      var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i % multiPaste.length] : textLines,\n                         origin: cm.state.pasteIncoming ? \"paste\" : cm.state.cutIncoming ? \"cut\" : \"+input\"};\n      makeChange(cm.doc, changeEvent);\n      signalLater(cm, \"inputRead\", cm, changeEvent);\n      // When an 'electric' character is inserted, immediately trigger a reindent\n      if (inserted && !cm.state.pasteIncoming && cm.options.electricChars &&\n          cm.options.smartIndent && range.head.ch < 100 &&\n          (!i || doc.sel.ranges[i - 1].head.line != range.head.line)) {\n        var mode = cm.getModeAt(range.head);\n        var end = changeEnd(changeEvent);\n        if (mode.electricChars) {\n          for (var j = 0; j < mode.electricChars.length; j++)\n            if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {\n              indentLine(cm, end.line, \"smart\");\n              break;\n            }\n        } else if (mode.electricInput) {\n          if (mode.electricInput.test(getLine(doc, end.line).text.slice(0, end.ch)))\n            indentLine(cm, end.line, \"smart\");\n        }\n      }\n    }\n    ensureCursorVisible(cm);\n    cm.curOp.updateInput = updateInput;\n    cm.curOp.typing = true;\n\n    // Don't leave long text in the textarea, since it makes further polling slow\n    if (text.length > 1000 || text.indexOf(\"\\n\") > -1) input.value = cm.display.prevInput = \"\";\n    else cm.display.prevInput = text;\n    if (withOp) endOperation(cm);\n    cm.state.pasteIncoming = cm.state.cutIncoming = false;\n    return true;\n  }\n\n  // Reset the input to correspond to the selection (or to be empty,\n  // when not typing and nothing is selected)\n  function resetInput(cm, typing) {\n    var minimal, selected, doc = cm.doc;\n    if (cm.somethingSelected()) {\n      cm.display.prevInput = \"\";\n      var range = doc.sel.primary();\n      minimal = hasCopyEvent &&\n        (range.to().line - range.from().line > 100 || (selected = cm.getSelection()).length > 1000);\n      var content = minimal ? \"-\" : selected || cm.getSelection();\n      cm.display.input.value = content;\n      if (cm.state.focused) selectInput(cm.display.input);\n      if (ie && ie_version >= 9) cm.display.inputHasSelection = content;\n    } else if (!typing) {\n      cm.display.prevInput = cm.display.input.value = \"\";\n      if (ie && ie_version >= 9) cm.display.inputHasSelection = null;\n    }\n    cm.display.inaccurateSelection = minimal;\n  }\n\n  function focusInput(cm) {\n    if (cm.options.readOnly != \"nocursor\" && (!mobile || activeElt() != cm.display.input))\n      cm.display.input.focus();\n  }\n\n  function ensureFocus(cm) {\n    if (!cm.state.focused) { focusInput(cm); onFocus(cm); }\n  }\n\n  function isReadOnly(cm) {\n    return cm.options.readOnly || cm.doc.cantEdit;\n  }\n\n  // EVENT HANDLERS\n\n  // Attach the necessary event handlers when initializing the editor\n  function registerEventHandlers(cm) {\n    var d = cm.display;\n    on(d.scroller, \"mousedown\", operation(cm, onMouseDown));\n    // Older IE's will not fire a second mousedown for a double click\n    if (ie && ie_version < 11)\n      on(d.scroller, \"dblclick\", operation(cm, function(e) {\n        if (signalDOMEvent(cm, e)) return;\n        var pos = posFromMouse(cm, e);\n        if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return;\n        e_preventDefault(e);\n        var word = cm.findWordAt(pos);\n        extendSelection(cm.doc, word.anchor, word.head);\n      }));\n    else\n      on(d.scroller, \"dblclick\", function(e) { signalDOMEvent(cm, e) || e_preventDefault(e); });\n    // Prevent normal selection in the editor (we handle our own)\n    on(d.lineSpace, \"selectstart\", function(e) {\n      if (!eventInWidget(d, e)) e_preventDefault(e);\n    });\n    // Some 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 these browsers.\n    if (!captureRightClick) on(d.scroller, \"contextmenu\", function(e) {onContextMenu(cm, e);});\n\n    // Sync scrolling between fake scrollbars and real scrollable\n    // area, ensure viewport is updated when scrolling.\n    on(d.scroller, \"scroll\", function() {\n      if (d.scroller.clientHeight) {\n        setScrollTop(cm, d.scroller.scrollTop);\n        setScrollLeft(cm, d.scroller.scrollLeft, true);\n        signal(cm, \"scroll\", cm);\n      }\n    });\n    on(d.scrollbarV, \"scroll\", function() {\n      if (d.scroller.clientHeight) setScrollTop(cm, d.scrollbarV.scrollTop);\n    });\n    on(d.scrollbarH, \"scroll\", function() {\n      if (d.scroller.clientHeight) setScrollLeft(cm, d.scrollbarH.scrollLeft);\n    });\n\n    // Listen to wheel events in order to try and update the viewport on time.\n    on(d.scroller, \"mousewheel\", function(e){onScrollWheel(cm, e);});\n    on(d.scroller, \"DOMMouseScroll\", function(e){onScrollWheel(cm, e);});\n\n    // Prevent clicks in the scrollbars from killing focus\n    function reFocus() { if (cm.state.focused) setTimeout(bind(focusInput, cm), 0); }\n    on(d.scrollbarH, \"mousedown\", reFocus);\n    on(d.scrollbarV, \"mousedown\", reFocus);\n    // Prevent wrapper from ever scrolling\n    on(d.wrapper, \"scroll\", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });\n\n    on(d.input, \"keyup\", function(e) { onKeyUp.call(cm, e); });\n    on(d.input, \"input\", function() {\n      if (ie && ie_version >= 9 && cm.display.inputHasSelection) cm.display.inputHasSelection = null;\n      fastPoll(cm);\n    });\n    on(d.input, \"keydown\", operation(cm, onKeyDown));\n    on(d.input, \"keypress\", operation(cm, onKeyPress));\n    on(d.input, \"focus\", bind(onFocus, cm));\n    on(d.input, \"blur\", bind(onBlur, cm));\n\n    function drag_(e) {\n      if (!signalDOMEvent(cm, e)) e_stop(e);\n    }\n    if (cm.options.dragDrop) {\n      on(d.scroller, \"dragstart\", function(e){onDragStart(cm, e);});\n      on(d.scroller, \"dragenter\", drag_);\n      on(d.scroller, \"dragover\", drag_);\n      on(d.scroller, \"drop\", operation(cm, onDrop));\n    }\n    on(d.scroller, \"paste\", function(e) {\n      if (eventInWidget(d, e)) return;\n      cm.state.pasteIncoming = true;\n      focusInput(cm);\n      fastPoll(cm);\n    });\n    on(d.input, \"paste\", function() {\n      // Workaround for webkit bug https://bugs.webkit.org/show_bug.cgi?id=90206\n      // Add a char to the end of textarea before paste occur so that\n      // selection doesn't span to the end of textarea.\n      if (webkit && !cm.state.fakedLastChar && !(new Date - cm.state.lastMiddleDown < 200)) {\n        var start = d.input.selectionStart, end = d.input.selectionEnd;\n        d.input.value += \"$\";\n        // The selection end needs to be set before the start, otherwise there\n        // can be an intermediate non-empty selection between the two, which\n        // can override the middle-click paste buffer on linux and cause the\n        // wrong thing to get pasted.\n        d.input.selectionEnd = end;\n        d.input.selectionStart = start;\n        cm.state.fakedLastChar = true;\n      }\n      cm.state.pasteIncoming = true;\n      fastPoll(cm);\n    });\n\n    function prepareCopyCut(e) {\n      if (cm.somethingSelected()) {\n        lastCopied = cm.getSelections();\n        if (d.inaccurateSelection) {\n          d.prevInput = \"\";\n          d.inaccurateSelection = false;\n          d.input.value = lastCopied.join(\"\\n\");\n          selectInput(d.input);\n        }\n      } else {\n        var text = [], ranges = [];\n        for (var i = 0; i < cm.doc.sel.ranges.length; i++) {\n          var line = cm.doc.sel.ranges[i].head.line;\n          var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)};\n          ranges.push(lineRange);\n          text.push(cm.getRange(lineRange.anchor, lineRange.head));\n        }\n        if (e.type == \"cut\") {\n          cm.setSelections(ranges, null, sel_dontScroll);\n        } else {\n          d.prevInput = \"\";\n          d.input.value = text.join(\"\\n\");\n          selectInput(d.input);\n        }\n        lastCopied = text;\n      }\n      if (e.type == \"cut\") cm.state.cutIncoming = true;\n    }\n    on(d.input, \"cut\", prepareCopyCut);\n    on(d.input, \"copy\", prepareCopyCut);\n\n    // Needed to handle Tab key in KHTML\n    if (khtml) on(d.sizer, \"mouseup\", function() {\n      if (activeElt() == d.input) d.input.blur();\n      focusInput(cm);\n    });\n  }\n\n  // Called when the window resizes\n  function onResize(cm) {\n    // Might be a text scaling operation, clear size caches.\n    var d = cm.display;\n    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;\n    cm.setSize();\n  }\n\n  // MOUSE EVENTS\n\n  // Return true when the given mouse event happened in a widget\n  function eventInWidget(display, e) {\n    for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {\n      if (!n || n.ignoreEvents || n.parentNode == display.sizer && n != display.mover) return true;\n    }\n  }\n\n  // Given a mouse event, find the corresponding position. If liberal\n  // is false, it checks whether a gutter or scrollbar was clicked,\n  // and returns null if it was. forRect is used by rectangular\n  // selections, and tries to estimate a character position even for\n  // coordinates beyond the right of the text.\n  function posFromMouse(cm, e, liberal, forRect) {\n    var display = cm.display;\n    if (!liberal) {\n      var target = e_target(e);\n      if (target == display.scrollbarH || target == display.scrollbarV ||\n          target == display.scrollbarFiller || target == display.gutterFiller) return null;\n    }\n    var x, y, space = display.lineSpace.getBoundingClientRect();\n    // Fails unpredictably on IE[67] when mouse is dragged around quickly.\n    try { x = e.clientX - space.left; y = e.clientY - space.top; }\n    catch (e) { return null; }\n    var coords = coordsChar(cm, x, y), line;\n    if (forRect && coords.xRel == 1 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {\n      var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;\n      coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));\n    }\n    return coords;\n  }\n\n  // A mouse down can be a single click, double click, triple click,\n  // start of selection drag, start of text drag, new cursor\n  // (ctrl-click), rectangle drag (alt-drag), or xwin\n  // middle-click-paste. Or it might be a click on something we should\n  // not interfere with, such as a scrollbar or widget.\n  function onMouseDown(e) {\n    if (signalDOMEvent(this, e)) return;\n    var cm = this, display = cm.display;\n    display.shift = e.shiftKey;\n\n    if (eventInWidget(display, e)) {\n      if (!webkit) {\n        // Briefly turn off draggability, to allow widgets to do\n        // normal dragging things.\n        display.scroller.draggable = false;\n        setTimeout(function(){display.scroller.draggable = true;}, 100);\n      }\n      return;\n    }\n    if (clickInGutter(cm, e)) return;\n    var start = posFromMouse(cm, e);\n    window.focus();\n\n    switch (e_button(e)) {\n    case 1:\n      if (start)\n        leftButtonDown(cm, e, start);\n      else if (e_target(e) == display.scroller)\n        e_preventDefault(e);\n      break;\n    case 2:\n      if (webkit) cm.state.lastMiddleDown = +new Date;\n      if (start) extendSelection(cm.doc, start);\n      setTimeout(bind(focusInput, cm), 20);\n      e_preventDefault(e);\n      break;\n    case 3:\n      if (captureRightClick) onContextMenu(cm, e);\n      break;\n    }\n  }\n\n  var lastClick, lastDoubleClick;\n  function leftButtonDown(cm, e, start) {\n    setTimeout(bind(ensureFocus, cm), 0);\n\n    var now = +new Date, type;\n    if (lastDoubleClick && lastDoubleClick.time > now - 400 && cmp(lastDoubleClick.pos, start) == 0) {\n      type = \"triple\";\n    } else if (lastClick && lastClick.time > now - 400 && cmp(lastClick.pos, start) == 0) {\n      type = \"double\";\n      lastDoubleClick = {time: now, pos: start};\n    } else {\n      type = \"single\";\n      lastClick = {time: now, pos: start};\n    }\n\n    var sel = cm.doc.sel, modifier = mac ? e.metaKey : e.ctrlKey;\n    if (cm.options.dragDrop && dragAndDrop && !isReadOnly(cm) &&\n        type == \"single\" && sel.contains(start) > -1 && sel.somethingSelected())\n      leftButtonStartDrag(cm, e, start, modifier);\n    else\n      leftButtonSelect(cm, e, start, type, modifier);\n  }\n\n  // Start a text drag. When it ends, see if any dragging actually\n  // happen, and treat as a click if it didn't.\n  function leftButtonStartDrag(cm, e, start, modifier) {\n    var display = cm.display;\n    var dragEnd = operation(cm, function(e2) {\n      if (webkit) display.scroller.draggable = false;\n      cm.state.draggingText = false;\n      off(document, \"mouseup\", dragEnd);\n      off(display.scroller, \"drop\", dragEnd);\n      if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) {\n        e_preventDefault(e2);\n        if (!modifier)\n          extendSelection(cm.doc, start);\n        focusInput(cm);\n        // Work around unexplainable focus problem in IE9 (#2127)\n        if (ie && ie_version == 9)\n          setTimeout(function() {document.body.focus(); focusInput(cm);}, 20);\n      }\n    });\n    // Let the drag handler handle this.\n    if (webkit) display.scroller.draggable = true;\n    cm.state.draggingText = dragEnd;\n    // IE's approach to draggable\n    if (display.scroller.dragDrop) display.scroller.dragDrop();\n    on(document, \"mouseup\", dragEnd);\n    on(display.scroller, \"drop\", dragEnd);\n  }\n\n  // Normal selection, as opposed to text dragging.\n  function leftButtonSelect(cm, e, start, type, addNew) {\n    var display = cm.display, doc = cm.doc;\n    e_preventDefault(e);\n\n    var ourRange, ourIndex, startSel = doc.sel;\n    if (addNew && !e.shiftKey) {\n      ourIndex = doc.sel.contains(start);\n      if (ourIndex > -1)\n        ourRange = doc.sel.ranges[ourIndex];\n      else\n        ourRange = new Range(start, start);\n    } else {\n      ourRange = doc.sel.primary();\n    }\n\n    if (e.altKey) {\n      type = \"rect\";\n      if (!addNew) ourRange = new Range(start, start);\n      start = posFromMouse(cm, e, true, true);\n      ourIndex = -1;\n    } else if (type == \"double\") {\n      var word = cm.findWordAt(start);\n      if (cm.display.shift || doc.extend)\n        ourRange = extendRange(doc, ourRange, word.anchor, word.head);\n      else\n        ourRange = word;\n    } else if (type == \"triple\") {\n      var line = new Range(Pos(start.line, 0), clipPos(doc, Pos(start.line + 1, 0)));\n      if (cm.display.shift || doc.extend)\n        ourRange = extendRange(doc, ourRange, line.anchor, line.head);\n      else\n        ourRange = line;\n    } else {\n      ourRange = extendRange(doc, ourRange, start);\n    }\n\n    if (!addNew) {\n      ourIndex = 0;\n      setSelection(doc, new Selection([ourRange], 0), sel_mouse);\n      startSel = doc.sel;\n    } else if (ourIndex > -1) {\n      replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);\n    } else {\n      ourIndex = doc.sel.ranges.length;\n      setSelection(doc, normalizeSelection(doc.sel.ranges.concat([ourRange]), ourIndex),\n                   {scroll: false, origin: \"*mouse\"});\n    }\n\n    var lastPos = start;\n    function extendTo(pos) {\n      if (cmp(lastPos, pos) == 0) return;\n      lastPos = pos;\n\n      if (type == \"rect\") {\n        var ranges = [], tabSize = cm.options.tabSize;\n        var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize);\n        var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize);\n        var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol);\n        for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));\n             line <= end; line++) {\n          var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize);\n          if (left == right)\n            ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos)));\n          else if (text.length > leftPos)\n            ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize))));\n        }\n        if (!ranges.length) ranges.push(new Range(start, start));\n        setSelection(doc, normalizeSelection(startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),\n                     {origin: \"*mouse\", scroll: false});\n        cm.scrollIntoView(pos);\n      } else {\n        var oldRange = ourRange;\n        var anchor = oldRange.anchor, head = pos;\n        if (type != \"single\") {\n          if (type == \"double\")\n            var range = cm.findWordAt(pos);\n          else\n            var range = new Range(Pos(pos.line, 0), clipPos(doc, Pos(pos.line + 1, 0)));\n          if (cmp(range.anchor, anchor) > 0) {\n            head = range.head;\n            anchor = minPos(oldRange.from(), range.anchor);\n          } else {\n            head = range.anchor;\n            anchor = maxPos(oldRange.to(), range.head);\n          }\n        }\n        var ranges = startSel.ranges.slice(0);\n        ranges[ourIndex] = new Range(clipPos(doc, anchor), head);\n        setSelection(doc, normalizeSelection(ranges, ourIndex), sel_mouse);\n      }\n    }\n\n    var editorSize = display.wrapper.getBoundingClientRect();\n    // Used to ensure timeout re-tries don't fire when another extend\n    // happened in the meantime (clearTimeout isn't reliable -- at\n    // least on Chrome, the timeouts still happen even when cleared,\n    // if the clear happens after their scheduled firing time).\n    var counter = 0;\n\n    function extend(e) {\n      var curCount = ++counter;\n      var cur = posFromMouse(cm, e, true, type == \"rect\");\n      if (!cur) return;\n      if (cmp(cur, lastPos) != 0) {\n        ensureFocus(cm);\n        extendTo(cur);\n        var visible = visibleLines(display, doc);\n        if (cur.line >= visible.to || cur.line < visible.from)\n          setTimeout(operation(cm, function(){if (counter == curCount) extend(e);}), 150);\n      } else {\n        var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;\n        if (outside) setTimeout(operation(cm, function() {\n          if (counter != curCount) return;\n          display.scroller.scrollTop += outside;\n          extend(e);\n        }), 50);\n      }\n    }\n\n    function done(e) {\n      counter = Infinity;\n      e_preventDefault(e);\n      focusInput(cm);\n      off(document, \"mousemove\", move);\n      off(document, \"mouseup\", up);\n      doc.history.lastSelOrigin = null;\n    }\n\n    var move = operation(cm, function(e) {\n      if (!e_button(e)) done(e);\n      else extend(e);\n    });\n    var up = operation(cm, done);\n    on(document, \"mousemove\", move);\n    on(document, \"mouseup\", up);\n  }\n\n  // Determines whether an event happened in the gutter, and fires the\n  // handlers for the corresponding event.\n  function gutterEvent(cm, e, type, prevent, signalfn) {\n    try { var mX = e.clientX, mY = e.clientY; }\n    catch(e) { return false; }\n    if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) return false;\n    if (prevent) e_preventDefault(e);\n\n    var display = cm.display;\n    var lineBox = display.lineDiv.getBoundingClientRect();\n\n    if (mY > lineBox.bottom || !hasHandler(cm, type)) return e_defaultPrevented(e);\n    mY -= lineBox.top - display.viewOffset;\n\n    for (var i = 0; i < cm.options.gutters.length; ++i) {\n      var g = display.gutters.childNodes[i];\n      if (g && g.getBoundingClientRect().right >= mX) {\n        var line = lineAtHeight(cm.doc, mY);\n        var gutter = cm.options.gutters[i];\n        signalfn(cm, type, cm, line, gutter, e);\n        return e_defaultPrevented(e);\n      }\n    }\n  }\n\n  function clickInGutter(cm, e) {\n    return gutterEvent(cm, e, \"gutterClick\", true, signalLater);\n  }\n\n  // Kludge to work around strange IE behavior where it'll sometimes\n  // re-fire a series of drag-related events right after the drop (#1551)\n  var lastDrop = 0;\n\n  function onDrop(e) {\n    var cm = this;\n    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))\n      return;\n    e_preventDefault(e);\n    if (ie) lastDrop = +new Date;\n    var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;\n    if (!pos || isReadOnly(cm)) return;\n    // Might be a file drop, in which case we simply extract the text\n    // and insert it.\n    if (files && files.length && window.FileReader && window.File) {\n      var n = files.length, text = Array(n), read = 0;\n      var loadFile = function(file, i) {\n        var reader = new FileReader;\n        reader.onload = operation(cm, function() {\n          text[i] = reader.result;\n          if (++read == n) {\n            pos = clipPos(cm.doc, pos);\n            var change = {from: pos, to: pos, text: splitLines(text.join(\"\\n\")), origin: \"paste\"};\n            makeChange(cm.doc, change);\n            setSelectionReplaceHistory(cm.doc, simpleSelection(pos, changeEnd(change)));\n          }\n        });\n        reader.readAsText(file);\n      };\n      for (var i = 0; i < n; ++i) loadFile(files[i], i);\n    } else { // Normal drop\n      // Don't do a replace if the drop happened inside of the selected text.\n      if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {\n        cm.state.draggingText(e);\n        // Ensure the editor is re-focused\n        setTimeout(bind(focusInput, cm), 20);\n        return;\n      }\n      try {\n        var text = e.dataTransfer.getData(\"Text\");\n        if (text) {\n          if (cm.state.draggingText && !(mac ? e.metaKey : e.ctrlKey))\n            var selected = cm.listSelections();\n          setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));\n          if (selected) for (var i = 0; i < selected.length; ++i)\n            replaceRange(cm.doc, \"\", selected[i].anchor, selected[i].head, \"drag\");\n          cm.replaceSelection(text, \"around\", \"paste\");\n          focusInput(cm);\n        }\n      }\n      catch(e){}\n    }\n  }\n\n  function onDragStart(cm, e) {\n    if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return; }\n    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return;\n\n    e.dataTransfer.setData(\"Text\", cm.getSelection());\n\n    // Use dummy image instead of default browsers image.\n    // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.\n    if (e.dataTransfer.setDragImage && !safari) {\n      var img = elt(\"img\", null, null, \"position: fixed; left: 0; top: 0;\");\n      img.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n      if (presto) {\n        img.width = img.height = 1;\n        cm.display.wrapper.appendChild(img);\n        // Force a relayout, or Opera won't use our image for some obscure reason\n        img._top = img.offsetTop;\n      }\n      e.dataTransfer.setDragImage(img, 0, 0);\n      if (presto) img.parentNode.removeChild(img);\n    }\n  }\n\n  // SCROLL EVENTS\n\n  // Sync the scrollable area and scrollbars, ensure the viewport\n  // covers the visible area.\n  function setScrollTop(cm, val) {\n    if (Math.abs(cm.doc.scrollTop - val) < 2) return;\n    cm.doc.scrollTop = val;\n    if (!gecko) updateDisplaySimple(cm, {top: val});\n    if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val;\n    if (cm.display.scrollbarV.scrollTop != val) cm.display.scrollbarV.scrollTop = val;\n    if (gecko) updateDisplaySimple(cm);\n    startWorker(cm, 100);\n  }\n  // Sync scroller and scrollbar, ensure the gutter elements are\n  // aligned.\n  function setScrollLeft(cm, val, isScroller) {\n    if (isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) return;\n    val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth);\n    cm.doc.scrollLeft = val;\n    alignHorizontally(cm);\n    if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val;\n    if (cm.display.scrollbarH.scrollLeft != val) cm.display.scrollbarH.scrollLeft = val;\n  }\n\n  // Since the delta values reported on mouse wheel events are\n  // unstandardized between browsers and even browser versions, and\n  // generally horribly unpredictable, this code starts by measuring\n  // the scroll effect that the first few mouse wheel events have,\n  // and, from that, detects the way it can convert deltas to pixel\n  // offsets afterwards.\n  //\n  // The reason we want to know the amount a wheel event will scroll\n  // is that it gives us a chance to update the display before the\n  // actual scrolling happens, reducing flickering.\n\n  var wheelSamples = 0, wheelPixelsPerUnit = null;\n  // Fill in a browser-detected starting value on browsers where we\n  // know one. These don't have to be accurate -- the result of them\n  // being wrong would just be a slight flicker on the first wheel\n  // scroll (if it is large enough).\n  if (ie) wheelPixelsPerUnit = -.53;\n  else if (gecko) wheelPixelsPerUnit = 15;\n  else if (chrome) wheelPixelsPerUnit = -.7;\n  else if (safari) wheelPixelsPerUnit = -1/3;\n\n  function onScrollWheel(cm, e) {\n    var dx = e.wheelDeltaX, dy = e.wheelDeltaY;\n    if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail;\n    if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail;\n    else if (dy == null) dy = e.wheelDelta;\n\n    var display = cm.display, scroll = display.scroller;\n    // Quit if there's nothing to scroll here\n    if (!(dx && scroll.scrollWidth > scroll.clientWidth ||\n          dy && scroll.scrollHeight > scroll.clientHeight)) return;\n\n    // Webkit browsers on OS X abort momentum scrolls when the target\n    // of the scroll event is removed from the scrollable element.\n    // This hack (see related code in patchDisplay) makes sure the\n    // element is kept around.\n    if (dy && mac && webkit) {\n      outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {\n        for (var i = 0; i < view.length; i++) {\n          if (view[i].node == cur) {\n            cm.display.currentWheelTarget = cur;\n            break outer;\n          }\n        }\n      }\n    }\n\n    // On some browsers, horizontal scrolling will cause redraws to\n    // happen before the gutter has been realigned, causing it to\n    // wriggle around in a most unseemly way. When we have an\n    // estimated pixels/delta value, we just handle horizontal\n    // scrolling entirely here. It'll be slightly off from native, but\n    // better than glitching out.\n    if (dx && !gecko && !presto && wheelPixelsPerUnit != null) {\n      if (dy)\n        setScrollTop(cm, Math.max(0, Math.min(scroll.scrollTop + dy * wheelPixelsPerUnit, scroll.scrollHeight - scroll.clientHeight)));\n      setScrollLeft(cm, Math.max(0, Math.min(scroll.scrollLeft + dx * wheelPixelsPerUnit, scroll.scrollWidth - scroll.clientWidth)));\n      e_preventDefault(e);\n      display.wheelStartX = null; // Abort measurement, if in progress\n      return;\n    }\n\n    // 'Project' the visible viewport to cover the area that is being\n    // scrolled into view (if we know enough to estimate it).\n    if (dy && wheelPixelsPerUnit != null) {\n      var pixels = dy * wheelPixelsPerUnit;\n      var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;\n      if (pixels < 0) top = Math.max(0, top + pixels - 50);\n      else bot = Math.min(cm.doc.height, bot + pixels + 50);\n      updateDisplaySimple(cm, {top: top, bottom: bot});\n    }\n\n    if (wheelSamples < 20) {\n      if (display.wheelStartX == null) {\n        display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;\n        display.wheelDX = dx; display.wheelDY = dy;\n        setTimeout(function() {\n          if (display.wheelStartX == null) return;\n          var movedX = scroll.scrollLeft - display.wheelStartX;\n          var movedY = scroll.scrollTop - display.wheelStartY;\n          var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||\n            (movedX && display.wheelDX && movedX / display.wheelDX);\n          display.wheelStartX = display.wheelStartY = null;\n          if (!sample) return;\n          wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);\n          ++wheelSamples;\n        }, 200);\n      } else {\n        display.wheelDX += dx; display.wheelDY += dy;\n      }\n    }\n  }\n\n  // KEY EVENTS\n\n  // Run a handler that was bound to a key.\n  function doHandleBinding(cm, bound, dropShift) {\n    if (typeof bound == \"string\") {\n      bound = commands[bound];\n      if (!bound) return false;\n    }\n    // Ensure previous input has been read, so that the handler sees a\n    // consistent view of the document\n    if (cm.display.pollingFast && readInput(cm)) cm.display.pollingFast = false;\n    var prevShift = cm.display.shift, done = false;\n    try {\n      if (isReadOnly(cm)) cm.state.suppressEdits = true;\n      if (dropShift) cm.display.shift = false;\n      done = bound(cm) != Pass;\n    } finally {\n      cm.display.shift = prevShift;\n      cm.state.suppressEdits = false;\n    }\n    return done;\n  }\n\n  // Collect the currently active keymaps.\n  function allKeyMaps(cm) {\n    var maps = cm.state.keyMaps.slice(0);\n    if (cm.options.extraKeys) maps.push(cm.options.extraKeys);\n    maps.push(cm.options.keyMap);\n    return maps;\n  }\n\n  var maybeTransition;\n  // Handle a key from the keydown event.\n  function handleKeyBinding(cm, e) {\n    // Handle automatic keymap transitions\n    var startMap = getKeyMap(cm.options.keyMap), next = startMap.auto;\n    clearTimeout(maybeTransition);\n    if (next && !isModifierKey(e)) maybeTransition = setTimeout(function() {\n      if (getKeyMap(cm.options.keyMap) == startMap) {\n        cm.options.keyMap = (next.call ? next.call(null, cm) : next);\n        keyMapChanged(cm);\n      }\n    }, 50);\n\n    var name = keyName(e, true), handled = false;\n    if (!name) return false;\n    var keymaps = allKeyMaps(cm);\n\n    if (e.shiftKey) {\n      // First try to resolve full name (including 'Shift-'). Failing\n      // that, see if there is a cursor-motion command (starting with\n      // 'go') bound to the keyname without 'Shift-'.\n      handled = lookupKey(\"Shift-\" + name, keymaps, function(b) {return doHandleBinding(cm, b, true);})\n             || lookupKey(name, keymaps, function(b) {\n                  if (typeof b == \"string\" ? /^go[A-Z]/.test(b) : b.motion)\n                    return doHandleBinding(cm, b);\n                });\n    } else {\n      handled = lookupKey(name, keymaps, function(b) { return doHandleBinding(cm, b); });\n    }\n\n    if (handled) {\n      e_preventDefault(e);\n      restartBlink(cm);\n      signalLater(cm, \"keyHandled\", cm, name, e);\n    }\n    return handled;\n  }\n\n  // Handle a key from the keypress event\n  function handleCharBinding(cm, e, ch) {\n    var handled = lookupKey(\"'\" + ch + \"'\", allKeyMaps(cm),\n                            function(b) { return doHandleBinding(cm, b, true); });\n    if (handled) {\n      e_preventDefault(e);\n      restartBlink(cm);\n      signalLater(cm, \"keyHandled\", cm, \"'\" + ch + \"'\", e);\n    }\n    return handled;\n  }\n\n  var lastStoppedKey = null;\n  function onKeyDown(e) {\n    var cm = this;\n    ensureFocus(cm);\n    if (signalDOMEvent(cm, e)) return;\n    // IE does strange things with escape.\n    if (ie && ie_version < 11 && e.keyCode == 27) e.returnValue = false;\n    var code = e.keyCode;\n    cm.display.shift = code == 16 || e.shiftKey;\n    var handled = handleKeyBinding(cm, e);\n    if (presto) {\n      lastStoppedKey = handled ? code : null;\n      // Opera has no cut event... we try to at least catch the key combo\n      if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))\n        cm.replaceSelection(\"\", null, \"cut\");\n    }\n\n    // Turn mouse into crosshair when Alt is held on Mac.\n    if (code == 18 && !/\\bCodeMirror-crosshair\\b/.test(cm.display.lineDiv.className))\n      showCrossHair(cm);\n  }\n\n  function showCrossHair(cm) {\n    var lineDiv = cm.display.lineDiv;\n    addClass(lineDiv, \"CodeMirror-crosshair\");\n\n    function up(e) {\n      if (e.keyCode == 18 || !e.altKey) {\n        rmClass(lineDiv, \"CodeMirror-crosshair\");\n        off(document, \"keyup\", up);\n        off(document, \"mouseover\", up);\n      }\n    }\n    on(document, \"keyup\", up);\n    on(document, \"mouseover\", up);\n  }\n\n  function onKeyUp(e) {\n    if (e.keyCode == 16) this.doc.sel.shift = false;\n    signalDOMEvent(this, e);\n  }\n\n  function onKeyPress(e) {\n    var cm = this;\n    if (signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) return;\n    var keyCode = e.keyCode, charCode = e.charCode;\n    if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;}\n    if (((presto && (!e.which || e.which < 10)) || khtml) && handleKeyBinding(cm, e)) return;\n    var ch = String.fromCharCode(charCode == null ? keyCode : charCode);\n    if (handleCharBinding(cm, e, ch)) return;\n    if (ie && ie_version >= 9) cm.display.inputHasSelection = null;\n    fastPoll(cm);\n  }\n\n  // FOCUS/BLUR EVENTS\n\n  function onFocus(cm) {\n    if (cm.options.readOnly == \"nocursor\") return;\n    if (!cm.state.focused) {\n      signal(cm, \"focus\", cm);\n      cm.state.focused = true;\n      addClass(cm.display.wrapper, \"CodeMirror-focused\");\n      // The prevInput test prevents this from firing when a context\n      // menu is closed (since the resetInput would kill the\n      // select-all detection hack)\n      if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {\n        resetInput(cm);\n        if (webkit) setTimeout(bind(resetInput, cm, true), 0); // Issue #1730\n      }\n    }\n    slowPoll(cm);\n    restartBlink(cm);\n  }\n  function onBlur(cm) {\n    if (cm.state.focused) {\n      signal(cm, \"blur\", cm);\n      cm.state.focused = false;\n      rmClass(cm.display.wrapper, \"CodeMirror-focused\");\n    }\n    clearInterval(cm.display.blinker);\n    setTimeout(function() {if (!cm.state.focused) cm.display.shift = false;}, 150);\n  }\n\n  // CONTEXT MENU HANDLING\n\n  // To make the context menu work, we need to briefly unhide the\n  // textarea (making it as unobtrusive as possible) to let the\n  // right-click take effect on it.\n  function onContextMenu(cm, e) {\n    if (signalDOMEvent(cm, e, \"contextmenu\")) return;\n    var display = cm.display;\n    if (eventInWidget(display, e) || contextMenuInGutter(cm, e)) return;\n\n    var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;\n    if (!pos || presto) return; // Opera is difficult.\n\n    // Reset the current text selection only if the click is done outside of the selection\n    // and 'resetSelectionOnContextMenu' option is true.\n    var reset = cm.options.resetSelectionOnContextMenu;\n    if (reset && cm.doc.sel.contains(pos) == -1)\n      operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll);\n\n    var oldCSS = display.input.style.cssText;\n    display.inputDiv.style.position = \"absolute\";\n    display.input.style.cssText = \"position: fixed; width: 30px; height: 30px; top: \" + (e.clientY - 5) +\n      \"px; left: \" + (e.clientX - 5) + \"px; z-index: 1000; background: \" +\n      (ie ? \"rgba(255, 255, 255, .05)\" : \"transparent\") +\n      \"; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);\";\n    if (webkit) var oldScrollY = window.scrollY; // Work around Chrome issue (#2712)\n    focusInput(cm);\n    if (webkit) window.scrollTo(null, oldScrollY);\n    resetInput(cm);\n    // Adds \"Select all\" to context menu in FF\n    if (!cm.somethingSelected()) display.input.value = display.prevInput = \" \";\n    display.selForContextMenu = cm.doc.sel;\n    clearTimeout(display.detectingSelectAll);\n\n    // Select-all will be greyed out if there's nothing to select, so\n    // this adds a zero-width space so that we can later check whether\n    // it got selected.\n    function prepareSelectAllHack() {\n      if (display.input.selectionStart != null) {\n        var selected = cm.somethingSelected();\n        var extval = display.input.value = \"\\u200b\" + (selected ? display.input.value : \"\");\n        display.prevInput = selected ? \"\" : \"\\u200b\";\n        display.input.selectionStart = 1; display.input.selectionEnd = extval.length;\n        // Re-set this, in case some other handler touched the\n        // selection in the meantime.\n        display.selForContextMenu = cm.doc.sel;\n      }\n    }\n    function rehide() {\n      display.inputDiv.style.position = \"relative\";\n      display.input.style.cssText = oldCSS;\n      if (ie && ie_version < 9) display.scrollbarV.scrollTop = display.scroller.scrollTop = scrollPos;\n      slowPoll(cm);\n\n      // Try to detect the user choosing select-all\n      if (display.input.selectionStart != null) {\n        if (!ie || (ie && ie_version < 9)) prepareSelectAllHack();\n        var i = 0, poll = function() {\n          if (display.selForContextMenu == cm.doc.sel && display.input.selectionStart == 0)\n            operation(cm, commands.selectAll)(cm);\n          else if (i++ < 10) display.detectingSelectAll = setTimeout(poll, 500);\n          else resetInput(cm);\n        };\n        display.detectingSelectAll = setTimeout(poll, 200);\n      }\n    }\n\n    if (ie && ie_version >= 9) prepareSelectAllHack();\n    if (captureRightClick) {\n      e_stop(e);\n      var mouseup = function() {\n        off(window, \"mouseup\", mouseup);\n        setTimeout(rehide, 20);\n      };\n      on(window, \"mouseup\", mouseup);\n    } else {\n      setTimeout(rehide, 50);\n    }\n  }\n\n  function contextMenuInGutter(cm, e) {\n    if (!hasHandler(cm, \"gutterContextMenu\")) return false;\n    return gutterEvent(cm, e, \"gutterContextMenu\", false, signal);\n  }\n\n  // UPDATING\n\n  // Compute the position of the end of a change (its 'to' property\n  // refers to the pre-change end).\n  var changeEnd = CodeMirror.changeEnd = function(change) {\n    if (!change.text) return change.to;\n    return Pos(change.from.line + change.text.length - 1,\n               lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0));\n  };\n\n  // Adjust a position to refer to the post-change position of the\n  // same text, or the end of the change if the change covers it.\n  function adjustForChange(pos, change) {\n    if (cmp(pos, change.from) < 0) return pos;\n    if (cmp(pos, change.to) <= 0) return changeEnd(change);\n\n    var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;\n    if (pos.line == change.to.line) ch += changeEnd(change).ch - change.to.ch;\n    return Pos(line, ch);\n  }\n\n  function computeSelAfterChange(doc, change) {\n    var out = [];\n    for (var i = 0; i < doc.sel.ranges.length; i++) {\n      var range = doc.sel.ranges[i];\n      out.push(new Range(adjustForChange(range.anchor, change),\n                         adjustForChange(range.head, change)));\n    }\n    return normalizeSelection(out, doc.sel.primIndex);\n  }\n\n  function offsetPos(pos, old, nw) {\n    if (pos.line == old.line)\n      return Pos(nw.line, pos.ch - old.ch + nw.ch);\n    else\n      return Pos(nw.line + (pos.line - old.line), pos.ch);\n  }\n\n  // Used by replaceSelections to allow moving the selection to the\n  // start or around the replaced test. Hint may be \"start\" or \"around\".\n  function computeReplacedSel(doc, changes, hint) {\n    var out = [];\n    var oldPrev = Pos(doc.first, 0), newPrev = oldPrev;\n    for (var i = 0; i < changes.length; i++) {\n      var change = changes[i];\n      var from = offsetPos(change.from, oldPrev, newPrev);\n      var to = offsetPos(changeEnd(change), oldPrev, newPrev);\n      oldPrev = change.to;\n      newPrev = to;\n      if (hint == \"around\") {\n        var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0;\n        out[i] = new Range(inv ? to : from, inv ? from : to);\n      } else {\n        out[i] = new Range(from, from);\n      }\n    }\n    return new Selection(out, doc.sel.primIndex);\n  }\n\n  // Allow \"beforeChange\" event handlers to influence a change\n  function filterChange(doc, change, update) {\n    var obj = {\n      canceled: false,\n      from: change.from,\n      to: change.to,\n      text: change.text,\n      origin: change.origin,\n      cancel: function() { this.canceled = true; }\n    };\n    if (update) obj.update = function(from, to, text, origin) {\n      if (from) this.from = clipPos(doc, from);\n      if (to) this.to = clipPos(doc, to);\n      if (text) this.text = text;\n      if (origin !== undefined) this.origin = origin;\n    };\n    signal(doc, \"beforeChange\", doc, obj);\n    if (doc.cm) signal(doc.cm, \"beforeChange\", doc.cm, obj);\n\n    if (obj.canceled) return null;\n    return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin};\n  }\n\n  // Apply a change to a document, and add it to the document's\n  // history, and propagating it to all linked documents.\n  function makeChange(doc, change, ignoreReadOnly) {\n    if (doc.cm) {\n      if (!doc.cm.curOp) return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly);\n      if (doc.cm.state.suppressEdits) return;\n    }\n\n    if (hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\")) {\n      change = filterChange(doc, change, true);\n      if (!change) return;\n    }\n\n    // Possibly split or suppress the update based on the presence\n    // of read-only spans in its range.\n    var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);\n    if (split) {\n      for (var i = split.length - 1; i >= 0; --i)\n        makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [\"\"] : change.text});\n    } else {\n      makeChangeInner(doc, change);\n    }\n  }\n\n  function makeChangeInner(doc, change) {\n    if (change.text.length == 1 && change.text[0] == \"\" && cmp(change.from, change.to) == 0) return;\n    var selAfter = computeSelAfterChange(doc, change);\n    addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);\n\n    makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));\n    var rebased = [];\n\n    linkedDocs(doc, function(doc, sharedHist) {\n      if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n        rebaseHist(doc.history, change);\n        rebased.push(doc.history);\n      }\n      makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));\n    });\n  }\n\n  // Revert a change stored in a document's history.\n  function makeChangeFromHistory(doc, type, allowSelectionOnly) {\n    if (doc.cm && doc.cm.state.suppressEdits) return;\n\n    var hist = doc.history, event, selAfter = doc.sel;\n    var source = type == \"undo\" ? hist.done : hist.undone, dest = type == \"undo\" ? hist.undone : hist.done;\n\n    // Verify that there is a useable event (so that ctrl-z won't\n    // needlessly clear selection events)\n    for (var i = 0; i < source.length; i++) {\n      event = source[i];\n      if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)\n        break;\n    }\n    if (i == source.length) return;\n    hist.lastOrigin = hist.lastSelOrigin = null;\n\n    for (;;) {\n      event = source.pop();\n      if (event.ranges) {\n        pushSelectionToHistory(event, dest);\n        if (allowSelectionOnly && !event.equals(doc.sel)) {\n          setSelection(doc, event, {clearRedo: false});\n          return;\n        }\n        selAfter = event;\n      }\n      else break;\n    }\n\n    // Build up a reverse change object to add to the opposite history\n    // stack (redo when undoing, and vice versa).\n    var antiChanges = [];\n    pushSelectionToHistory(selAfter, dest);\n    dest.push({changes: antiChanges, generation: hist.generation});\n    hist.generation = event.generation || ++hist.maxGeneration;\n\n    var filter = hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\");\n\n    for (var i = event.changes.length - 1; i >= 0; --i) {\n      var change = event.changes[i];\n      change.origin = type;\n      if (filter && !filterChange(doc, change, false)) {\n        source.length = 0;\n        return;\n      }\n\n      antiChanges.push(historyChangeFromChange(doc, change));\n\n      var after = i ? computeSelAfterChange(doc, change) : lst(source);\n      makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));\n      if (!i && doc.cm) doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)});\n      var rebased = [];\n\n      // Propagate to the linked documents\n      linkedDocs(doc, function(doc, sharedHist) {\n        if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n          rebaseHist(doc.history, change);\n          rebased.push(doc.history);\n        }\n        makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));\n      });\n    }\n  }\n\n  // Sub-views need their line numbers shifted when text is added\n  // above or below them in the parent document.\n  function shiftDoc(doc, distance) {\n    if (distance == 0) return;\n    doc.first += distance;\n    doc.sel = new Selection(map(doc.sel.ranges, function(range) {\n      return new Range(Pos(range.anchor.line + distance, range.anchor.ch),\n                       Pos(range.head.line + distance, range.head.ch));\n    }), doc.sel.primIndex);\n    if (doc.cm) {\n      regChange(doc.cm, doc.first, doc.first - distance, distance);\n      for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)\n        regLineChange(doc.cm, l, \"gutter\");\n    }\n  }\n\n  // More lower-level change function, handling only a single document\n  // (not linked ones).\n  function makeChangeSingleDoc(doc, change, selAfter, spans) {\n    if (doc.cm && !doc.cm.curOp)\n      return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans);\n\n    if (change.to.line < doc.first) {\n      shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));\n      return;\n    }\n    if (change.from.line > doc.lastLine()) return;\n\n    // Clip the change to the size of this doc\n    if (change.from.line < doc.first) {\n      var shift = change.text.length - 1 - (doc.first - change.from.line);\n      shiftDoc(doc, shift);\n      change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),\n                text: [lst(change.text)], origin: change.origin};\n    }\n    var last = doc.lastLine();\n    if (change.to.line > last) {\n      change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),\n                text: [change.text[0]], origin: change.origin};\n    }\n\n    change.removed = getBetween(doc, change.from, change.to);\n\n    if (!selAfter) selAfter = computeSelAfterChange(doc, change);\n    if (doc.cm) makeChangeSingleDocInEditor(doc.cm, change, spans);\n    else updateDoc(doc, change, spans);\n    setSelectionNoUndo(doc, selAfter, sel_dontScroll);\n  }\n\n  // Handle the interaction of a change to a document with the editor\n  // that this document is part of.\n  function makeChangeSingleDocInEditor(cm, change, spans) {\n    var doc = cm.doc, display = cm.display, from = change.from, to = change.to;\n\n    var recomputeMaxLength = false, checkWidthStart = from.line;\n    if (!cm.options.lineWrapping) {\n      checkWidthStart = lineNo(visualLine(getLine(doc, from.line)));\n      doc.iter(checkWidthStart, to.line + 1, function(line) {\n        if (line == display.maxLine) {\n          recomputeMaxLength = true;\n          return true;\n        }\n      });\n    }\n\n    if (doc.sel.contains(change.from, change.to) > -1)\n      signalCursorActivity(cm);\n\n    updateDoc(doc, change, spans, estimateHeight(cm));\n\n    if (!cm.options.lineWrapping) {\n      doc.iter(checkWidthStart, from.line + change.text.length, function(line) {\n        var len = lineLength(line);\n        if (len > display.maxLineLength) {\n          display.maxLine = line;\n          display.maxLineLength = len;\n          display.maxLineChanged = true;\n          recomputeMaxLength = false;\n        }\n      });\n      if (recomputeMaxLength) cm.curOp.updateMaxLine = true;\n    }\n\n    // Adjust frontier, schedule worker\n    doc.frontier = Math.min(doc.frontier, from.line);\n    startWorker(cm, 400);\n\n    var lendiff = change.text.length - (to.line - from.line) - 1;\n    // Remember that these lines changed, for updating the display\n    if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))\n      regLineChange(cm, from.line, \"text\");\n    else\n      regChange(cm, from.line, to.line + 1, lendiff);\n\n    var changesHandler = hasHandler(cm, \"changes\"), changeHandler = hasHandler(cm, \"change\");\n    if (changeHandler || changesHandler) {\n      var obj = {\n        from: from, to: to,\n        text: change.text,\n        removed: change.removed,\n        origin: change.origin\n      };\n      if (changeHandler) signalLater(cm, \"change\", cm, obj);\n      if (changesHandler) (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj);\n    }\n    cm.display.selForContextMenu = null;\n  }\n\n  function replaceRange(doc, code, from, to, origin) {\n    if (!to) to = from;\n    if (cmp(to, from) < 0) { var tmp = to; to = from; from = tmp; }\n    if (typeof code == \"string\") code = splitLines(code);\n    makeChange(doc, {from: from, to: to, text: code, origin: origin});\n  }\n\n  // SCROLLING THINGS INTO VIEW\n\n  // If an editor sits on the top or bottom of the window, partially\n  // scrolled out of view, this ensures that the cursor is visible.\n  function maybeScrollWindow(cm, coords) {\n    var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null;\n    if (coords.top + box.top < 0) doScroll = true;\n    else if (coords.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false;\n    if (doScroll != null && !phantom) {\n      var scrollNode = elt(\"div\", \"\\u200b\", null, \"position: absolute; top: \" +\n                           (coords.top - display.viewOffset - paddingTop(cm.display)) + \"px; height: \" +\n                           (coords.bottom - coords.top + scrollerCutOff) + \"px; left: \" +\n                           coords.left + \"px; width: 2px;\");\n      cm.display.lineSpace.appendChild(scrollNode);\n      scrollNode.scrollIntoView(doScroll);\n      cm.display.lineSpace.removeChild(scrollNode);\n    }\n  }\n\n  // Scroll a given position into view (immediately), verifying that\n  // it actually became visible (as line heights are accurately\n  // measured, the position of something may 'drift' during drawing).\n  function scrollPosIntoView(cm, pos, end, margin) {\n    if (margin == null) margin = 0;\n    for (var limit = 0; limit < 5; limit++) {\n      var changed = false, coords = cursorCoords(cm, pos);\n      var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);\n      var scrollPos = calculateScrollPos(cm, Math.min(coords.left, endCoords.left),\n                                         Math.min(coords.top, endCoords.top) - margin,\n                                         Math.max(coords.left, endCoords.left),\n                                         Math.max(coords.bottom, endCoords.bottom) + margin);\n      var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;\n      if (scrollPos.scrollTop != null) {\n        setScrollTop(cm, scrollPos.scrollTop);\n        if (Math.abs(cm.doc.scrollTop - startTop) > 1) changed = true;\n      }\n      if (scrollPos.scrollLeft != null) {\n        setScrollLeft(cm, scrollPos.scrollLeft);\n        if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) changed = true;\n      }\n      if (!changed) return coords;\n    }\n  }\n\n  // Scroll a given set of coordinates into view (immediately).\n  function scrollIntoView(cm, x1, y1, x2, y2) {\n    var scrollPos = calculateScrollPos(cm, x1, y1, x2, y2);\n    if (scrollPos.scrollTop != null) setScrollTop(cm, scrollPos.scrollTop);\n    if (scrollPos.scrollLeft != null) setScrollLeft(cm, scrollPos.scrollLeft);\n  }\n\n  // Calculate a new scroll position needed to scroll the given\n  // rectangle into view. Returns an object with scrollTop and\n  // scrollLeft properties. When these are undefined, the\n  // vertical/horizontal position does not need to be adjusted.\n  function calculateScrollPos(cm, x1, y1, x2, y2) {\n    var display = cm.display, snapMargin = textHeight(cm.display);\n    if (y1 < 0) y1 = 0;\n    var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;\n    var screen = display.scroller.clientHeight - scrollerCutOff, result = {};\n    if (y2 - y1 > screen) y2 = y1 + screen;\n    var docBottom = cm.doc.height + paddingVert(display);\n    var atTop = y1 < snapMargin, atBottom = y2 > docBottom - snapMargin;\n    if (y1 < screentop) {\n      result.scrollTop = atTop ? 0 : y1;\n    } else if (y2 > screentop + screen) {\n      var newTop = Math.min(y1, (atBottom ? docBottom : y2) - screen);\n      if (newTop != screentop) result.scrollTop = newTop;\n    }\n\n    var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft;\n    var screenw = display.scroller.clientWidth - scrollerCutOff - display.gutters.offsetWidth;\n    var tooWide = x2 - x1 > screenw;\n    if (tooWide) x2 = x1 + screenw;\n    if (x1 < 10)\n      result.scrollLeft = 0;\n    else if (x1 < screenleft)\n      result.scrollLeft = Math.max(0, x1 - (tooWide ? 0 : 10));\n    else if (x2 > screenw + screenleft - 3)\n      result.scrollLeft = x2 + (tooWide ? 0 : 10) - screenw;\n\n    return result;\n  }\n\n  // Store a relative adjustment to the scroll position in the current\n  // operation (to be applied when the operation finishes).\n  function addToScrollPos(cm, left, top) {\n    if (left != null || top != null) resolveScrollToPos(cm);\n    if (left != null)\n      cm.curOp.scrollLeft = (cm.curOp.scrollLeft == null ? cm.doc.scrollLeft : cm.curOp.scrollLeft) + left;\n    if (top != null)\n      cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top;\n  }\n\n  // Make sure that at the end of the operation the current cursor is\n  // shown.\n  function ensureCursorVisible(cm) {\n    resolveScrollToPos(cm);\n    var cur = cm.getCursor(), from = cur, to = cur;\n    if (!cm.options.lineWrapping) {\n      from = cur.ch ? Pos(cur.line, cur.ch - 1) : cur;\n      to = Pos(cur.line, cur.ch + 1);\n    }\n    cm.curOp.scrollToPos = {from: from, to: to, margin: cm.options.cursorScrollMargin, isCursor: true};\n  }\n\n  // When an operation has its scrollToPos property set, and another\n  // scroll action is applied before the end of the operation, this\n  // 'simulates' scrolling that position into view in a cheap way, so\n  // that the effect of intermediate scroll commands is not ignored.\n  function resolveScrollToPos(cm) {\n    var range = cm.curOp.scrollToPos;\n    if (range) {\n      cm.curOp.scrollToPos = null;\n      var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to);\n      var sPos = calculateScrollPos(cm, Math.min(from.left, to.left),\n                                    Math.min(from.top, to.top) - range.margin,\n                                    Math.max(from.right, to.right),\n                                    Math.max(from.bottom, to.bottom) + range.margin);\n      cm.scrollTo(sPos.scrollLeft, sPos.scrollTop);\n    }\n  }\n\n  // API UTILITIES\n\n  // Indent the given line. The how parameter can be \"smart\",\n  // \"add\"/null, \"subtract\", or \"prev\". When aggressive is false\n  // (typically set to true for forced single-line indents), empty\n  // lines are not indented, and places where the mode returns Pass\n  // are left alone.\n  function indentLine(cm, n, how, aggressive) {\n    var doc = cm.doc, state;\n    if (how == null) how = \"add\";\n    if (how == \"smart\") {\n      // Fall back to \"prev\" when the mode doesn't have an indentation\n      // method.\n      if (!doc.mode.indent) how = \"prev\";\n      else state = getStateBefore(cm, n);\n    }\n\n    var tabSize = cm.options.tabSize;\n    var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);\n    if (line.stateAfter) line.stateAfter = null;\n    var curSpaceString = line.text.match(/^\\s*/)[0], indentation;\n    if (!aggressive && !/\\S/.test(line.text)) {\n      indentation = 0;\n      how = \"not\";\n    } else if (how == \"smart\") {\n      indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);\n      if (indentation == Pass || indentation > 150) {\n        if (!aggressive) return;\n        how = \"prev\";\n      }\n    }\n    if (how == \"prev\") {\n      if (n > doc.first) indentation = countColumn(getLine(doc, n-1).text, null, tabSize);\n      else indentation = 0;\n    } else if (how == \"add\") {\n      indentation = curSpace + cm.options.indentUnit;\n    } else if (how == \"subtract\") {\n      indentation = curSpace - cm.options.indentUnit;\n    } else if (typeof how == \"number\") {\n      indentation = curSpace + how;\n    }\n    indentation = Math.max(0, indentation);\n\n    var indentString = \"\", pos = 0;\n    if (cm.options.indentWithTabs)\n      for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += \"\\t\";}\n    if (pos < indentation) indentString += spaceStr(indentation - pos);\n\n    if (indentString != curSpaceString) {\n      replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), \"+input\");\n    } else {\n      // Ensure that, if the cursor was in the whitespace at the start\n      // of the line, it is moved to the end of that space.\n      for (var i = 0; i < doc.sel.ranges.length; i++) {\n        var range = doc.sel.ranges[i];\n        if (range.head.line == n && range.head.ch < curSpaceString.length) {\n          var pos = Pos(n, curSpaceString.length);\n          replaceOneSelection(doc, i, new Range(pos, pos));\n          break;\n        }\n      }\n    }\n    line.stateAfter = null;\n  }\n\n  // Utility for applying a change to a line by handle or number,\n  // returning the number and optionally registering the line as\n  // changed.\n  function changeLine(doc, handle, changeType, op) {\n    var no = handle, line = handle;\n    if (typeof handle == \"number\") line = getLine(doc, clipLine(doc, handle));\n    else no = lineNo(handle);\n    if (no == null) return null;\n    if (op(line, no) && doc.cm) regLineChange(doc.cm, no, changeType);\n    return line;\n  }\n\n  // Helper for deleting text near the selection(s), used to implement\n  // backspace, delete, and similar functionality.\n  function deleteNearSelection(cm, compute) {\n    var ranges = cm.doc.sel.ranges, kill = [];\n    // Build up a set of ranges to kill first, merging overlapping\n    // ranges.\n    for (var i = 0; i < ranges.length; i++) {\n      var toKill = compute(ranges[i]);\n      while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {\n        var replaced = kill.pop();\n        if (cmp(replaced.from, toKill.from) < 0) {\n          toKill.from = replaced.from;\n          break;\n        }\n      }\n      kill.push(toKill);\n    }\n    // Next, remove those actual ranges.\n    runInOp(cm, function() {\n      for (var i = kill.length - 1; i >= 0; i--)\n        replaceRange(cm.doc, \"\", kill[i].from, kill[i].to, \"+delete\");\n      ensureCursorVisible(cm);\n    });\n  }\n\n  // Used for horizontal relative motion. Dir is -1 or 1 (left or\n  // right), unit can be \"char\", \"column\" (like char, but doesn't\n  // cross line boundaries), \"word\" (across next word), or \"group\" (to\n  // the start of next group of word or non-word-non-whitespace\n  // chars). The visually param controls whether, in right-to-left\n  // text, direction 1 means to move towards the next index in the\n  // string, or towards the character to the right of the current\n  // position. The resulting position will have a hitSide=true\n  // property if it reached the end of the document.\n  function findPosH(doc, pos, dir, unit, visually) {\n    var line = pos.line, ch = pos.ch, origDir = dir;\n    var lineObj = getLine(doc, line);\n    var possible = true;\n    function findNextLine() {\n      var l = line + dir;\n      if (l < doc.first || l >= doc.first + doc.size) return (possible = false);\n      line = l;\n      return lineObj = getLine(doc, l);\n    }\n    function moveOnce(boundToLine) {\n      var next = (visually ? moveVisually : moveLogically)(lineObj, ch, dir, true);\n      if (next == null) {\n        if (!boundToLine && findNextLine()) {\n          if (visually) ch = (dir < 0 ? lineRight : lineLeft)(lineObj);\n          else ch = dir < 0 ? lineObj.text.length : 0;\n        } else return (possible = false);\n      } else ch = next;\n      return true;\n    }\n\n    if (unit == \"char\") moveOnce();\n    else if (unit == \"column\") moveOnce(true);\n    else if (unit == \"word\" || unit == \"group\") {\n      var sawType = null, group = unit == \"group\";\n      var helper = doc.cm && doc.cm.getHelper(pos, \"wordChars\");\n      for (var first = true;; first = false) {\n        if (dir < 0 && !moveOnce(!first)) break;\n        var cur = lineObj.text.charAt(ch) || \"\\n\";\n        var type = isWordChar(cur, helper) ? \"w\"\n          : group && cur == \"\\n\" ? \"n\"\n          : !group || /\\s/.test(cur) ? null\n          : \"p\";\n        if (group && !first && !type) type = \"s\";\n        if (sawType && sawType != type) {\n          if (dir < 0) {dir = 1; moveOnce();}\n          break;\n        }\n\n        if (type) sawType = type;\n        if (dir > 0 && !moveOnce(!first)) break;\n      }\n    }\n    var result = skipAtomic(doc, Pos(line, ch), origDir, true);\n    if (!possible) result.hitSide = true;\n    return result;\n  }\n\n  // For relative vertical movement. Dir may be -1 or 1. Unit can be\n  // \"page\" or \"line\". The resulting position will have a hitSide=true\n  // property if it reached the end of the document.\n  function findPosV(cm, pos, dir, unit) {\n    var doc = cm.doc, x = pos.left, y;\n    if (unit == \"page\") {\n      var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);\n      y = pos.top + dir * (pageSize - (dir < 0 ? 1.5 : .5) * textHeight(cm.display));\n    } else if (unit == \"line\") {\n      y = dir > 0 ? pos.bottom + 3 : pos.top - 3;\n    }\n    for (;;) {\n      var target = coordsChar(cm, x, y);\n      if (!target.outside) break;\n      if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break; }\n      y += dir * 5;\n    }\n    return target;\n  }\n\n  // EDITOR METHODS\n\n  // The publicly visible API. Note that methodOp(f) means\n  // 'wrap f in an operation, performed on its `this` parameter'.\n\n  // This is not the complete set of editor methods. Most of the\n  // methods defined on the Doc type are also injected into\n  // CodeMirror.prototype, for backwards compatibility and\n  // convenience.\n\n  CodeMirror.prototype = {\n    constructor: CodeMirror,\n    focus: function(){window.focus(); focusInput(this); fastPoll(this);},\n\n    setOption: function(option, value) {\n      var options = this.options, old = options[option];\n      if (options[option] == value && option != \"mode\") return;\n      options[option] = value;\n      if (optionHandlers.hasOwnProperty(option))\n        operation(this, optionHandlers[option])(this, value, old);\n    },\n\n    getOption: function(option) {return this.options[option];},\n    getDoc: function() {return this.doc;},\n\n    addKeyMap: function(map, bottom) {\n      this.state.keyMaps[bottom ? \"push\" : \"unshift\"](map);\n    },\n    removeKeyMap: function(map) {\n      var maps = this.state.keyMaps;\n      for (var i = 0; i < maps.length; ++i)\n        if (maps[i] == map || (typeof maps[i] != \"string\" && maps[i].name == map)) {\n          maps.splice(i, 1);\n          return true;\n        }\n    },\n\n    addOverlay: methodOp(function(spec, options) {\n      var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);\n      if (mode.startState) throw new Error(\"Overlays may not be stateful.\");\n      this.state.overlays.push({mode: mode, modeSpec: spec, opaque: options && options.opaque});\n      this.state.modeGen++;\n      regChange(this);\n    }),\n    removeOverlay: methodOp(function(spec) {\n      var overlays = this.state.overlays;\n      for (var i = 0; i < overlays.length; ++i) {\n        var cur = overlays[i].modeSpec;\n        if (cur == spec || typeof spec == \"string\" && cur.name == spec) {\n          overlays.splice(i, 1);\n          this.state.modeGen++;\n          regChange(this);\n          return;\n        }\n      }\n    }),\n\n    indentLine: methodOp(function(n, dir, aggressive) {\n      if (typeof dir != \"string\" && typeof dir != \"number\") {\n        if (dir == null) dir = this.options.smartIndent ? \"smart\" : \"prev\";\n        else dir = dir ? \"add\" : \"subtract\";\n      }\n      if (isLine(this.doc, n)) indentLine(this, n, dir, aggressive);\n    }),\n    indentSelection: methodOp(function(how) {\n      var ranges = this.doc.sel.ranges, end = -1;\n      for (var i = 0; i < ranges.length; i++) {\n        var range = ranges[i];\n        if (!range.empty()) {\n          var from = range.from(), to = range.to();\n          var start = Math.max(end, from.line);\n          end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1;\n          for (var j = start; j < end; ++j)\n            indentLine(this, j, how);\n          var newRanges = this.doc.sel.ranges;\n          if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0)\n            replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll);\n        } else if (range.head.line > end) {\n          indentLine(this, range.head.line, how, true);\n          end = range.head.line;\n          if (i == this.doc.sel.primIndex) ensureCursorVisible(this);\n        }\n      }\n    }),\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(pos, precise) {\n      var doc = this.doc;\n      pos = clipPos(doc, pos);\n      var state = getStateBefore(this, pos.line, precise), mode = this.doc.mode;\n      var line = getLine(doc, pos.line);\n      var stream = new StringStream(line.text, this.options.tabSize);\n      while (stream.pos < pos.ch && !stream.eol()) {\n        stream.start = stream.pos;\n        var style = readToken(mode, stream, state);\n      }\n      return {start: stream.start,\n              end: stream.pos,\n              string: stream.current(),\n              type: style || null,\n              state: state};\n    },\n\n    getTokenTypeAt: function(pos) {\n      pos = clipPos(this.doc, pos);\n      var styles = getLineStyles(this, getLine(this.doc, pos.line));\n      var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;\n      var type;\n      if (ch == 0) type = styles[2];\n      else for (;;) {\n        var mid = (before + after) >> 1;\n        if ((mid ? styles[mid * 2 - 1] : 0) >= ch) after = mid;\n        else if (styles[mid * 2 + 1] < ch) before = mid + 1;\n        else { type = styles[mid * 2 + 2]; break; }\n      }\n      var cut = type ? type.indexOf(\"cm-overlay \") : -1;\n      return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1);\n    },\n\n    getModeAt: function(pos) {\n      var mode = this.doc.mode;\n      if (!mode.innerMode) return mode;\n      return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode;\n    },\n\n    getHelper: function(pos, type) {\n      return this.getHelpers(pos, type)[0];\n    },\n\n    getHelpers: function(pos, type) {\n      var found = [];\n      if (!helpers.hasOwnProperty(type)) return helpers;\n      var help = helpers[type], mode = this.getModeAt(pos);\n      if (typeof mode[type] == \"string\") {\n        if (help[mode[type]]) found.push(help[mode[type]]);\n      } else if (mode[type]) {\n        for (var i = 0; i < mode[type].length; i++) {\n          var val = help[mode[type][i]];\n          if (val) found.push(val);\n        }\n      } else if (mode.helperType && help[mode.helperType]) {\n        found.push(help[mode.helperType]);\n      } else if (help[mode.name]) {\n        found.push(help[mode.name]);\n      }\n      for (var i = 0; i < help._global.length; i++) {\n        var cur = help._global[i];\n        if (cur.pred(mode, this) && indexOf(found, cur.val) == -1)\n          found.push(cur.val);\n      }\n      return found;\n    },\n\n    getStateAfter: function(line, precise) {\n      var doc = this.doc;\n      line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);\n      return getStateBefore(this, line + 1, precise);\n    },\n\n    cursorCoords: function(start, mode) {\n      var pos, range = this.doc.sel.primary();\n      if (start == null) pos = range.head;\n      else if (typeof start == \"object\") pos = clipPos(this.doc, start);\n      else pos = start ? range.from() : range.to();\n      return cursorCoords(this, pos, mode || \"page\");\n    },\n\n    charCoords: function(pos, mode) {\n      return charCoords(this, clipPos(this.doc, pos), mode || \"page\");\n    },\n\n    coordsChar: function(coords, mode) {\n      coords = fromCoordSystem(this, coords, mode || \"page\");\n      return coordsChar(this, coords.left, coords.top);\n    },\n\n    lineAtHeight: function(height, mode) {\n      height = fromCoordSystem(this, {top: height, left: 0}, mode || \"page\").top;\n      return lineAtHeight(this.doc, height + this.display.viewOffset);\n    },\n    heightAtLine: function(line, mode) {\n      var end = false, last = this.doc.first + this.doc.size - 1;\n      if (line < this.doc.first) line = this.doc.first;\n      else if (line > last) { line = last; end = true; }\n      var lineObj = getLine(this.doc, line);\n      return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || \"page\").top +\n        (end ? this.doc.height - heightAtLine(lineObj) : 0);\n    },\n\n    defaultTextHeight: function() { return textHeight(this.display); },\n    defaultCharWidth: function() { return charWidth(this.display); },\n\n    setGutterMarker: methodOp(function(line, gutterID, value) {\n      return changeLine(this.doc, line, \"gutter\", function(line) {\n        var markers = line.gutterMarkers || (line.gutterMarkers = {});\n        markers[gutterID] = value;\n        if (!value && isEmpty(markers)) line.gutterMarkers = null;\n        return true;\n      });\n    }),\n\n    clearGutter: methodOp(function(gutterID) {\n      var cm = this, doc = cm.doc, i = doc.first;\n      doc.iter(function(line) {\n        if (line.gutterMarkers && line.gutterMarkers[gutterID]) {\n          line.gutterMarkers[gutterID] = null;\n          regLineChange(cm, i, \"gutter\");\n          if (isEmpty(line.gutterMarkers)) line.gutterMarkers = null;\n        }\n        ++i;\n      });\n    }),\n\n    addLineWidget: methodOp(function(handle, node, options) {\n      return addLineWidget(this, handle, node, options);\n    }),\n\n    removeLineWidget: function(widget) { widget.clear(); },\n\n    lineInfo: function(line) {\n      if (typeof line == \"number\") {\n        if (!isLine(this.doc, line)) return null;\n        var n = line;\n        line = getLine(this.doc, line);\n        if (!line) return null;\n      } else {\n        var n = lineNo(line);\n        if (n == null) return null;\n      }\n      return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,\n              textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,\n              widgets: line.widgets};\n    },\n\n    getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo};},\n\n    addWidget: function(pos, node, scroll, vert, horiz) {\n      var display = this.display;\n      pos = cursorCoords(this, clipPos(this.doc, pos));\n      var top = pos.bottom, left = pos.left;\n      node.style.position = \"absolute\";\n      display.sizer.appendChild(node);\n      if (vert == \"over\") {\n        top = pos.top;\n      } else if (vert == \"above\" || vert == \"near\") {\n        var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),\n        hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);\n        // Default to positioning above (if specified and possible); otherwise default to positioning below\n        if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)\n          top = pos.top - node.offsetHeight;\n        else if (pos.bottom + node.offsetHeight <= vspace)\n          top = pos.bottom;\n        if (left + node.offsetWidth > hspace)\n          left = hspace - node.offsetWidth;\n      }\n      node.style.top = top + \"px\";\n      node.style.left = node.style.right = \"\";\n      if (horiz == \"right\") {\n        left = display.sizer.clientWidth - node.offsetWidth;\n        node.style.right = \"0px\";\n      } else {\n        if (horiz == \"left\") left = 0;\n        else if (horiz == \"middle\") left = (display.sizer.clientWidth - node.offsetWidth) / 2;\n        node.style.left = left + \"px\";\n      }\n      if (scroll)\n        scrollIntoView(this, left, top, left + node.offsetWidth, top + node.offsetHeight);\n    },\n\n    triggerOnKeyDown: methodOp(onKeyDown),\n    triggerOnKeyPress: methodOp(onKeyPress),\n    triggerOnKeyUp: onKeyUp,\n\n    execCommand: function(cmd) {\n      if (commands.hasOwnProperty(cmd))\n        return commands[cmd](this);\n    },\n\n    findPosH: function(from, amount, unit, visually) {\n      var dir = 1;\n      if (amount < 0) { dir = -1; amount = -amount; }\n      for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {\n        cur = findPosH(this.doc, cur, dir, unit, visually);\n        if (cur.hitSide) break;\n      }\n      return cur;\n    },\n\n    moveH: methodOp(function(dir, unit) {\n      var cm = this;\n      cm.extendSelectionsBy(function(range) {\n        if (cm.display.shift || cm.doc.extend || range.empty())\n          return findPosH(cm.doc, range.head, dir, unit, cm.options.rtlMoveVisually);\n        else\n          return dir < 0 ? range.from() : range.to();\n      }, sel_move);\n    }),\n\n    deleteH: methodOp(function(dir, unit) {\n      var sel = this.doc.sel, doc = this.doc;\n      if (sel.somethingSelected())\n        doc.replaceSelection(\"\", null, \"+delete\");\n      else\n        deleteNearSelection(this, function(range) {\n          var other = findPosH(doc, range.head, dir, unit, false);\n          return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other};\n        });\n    }),\n\n    findPosV: function(from, amount, unit, goalColumn) {\n      var dir = 1, x = goalColumn;\n      if (amount < 0) { dir = -1; amount = -amount; }\n      for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {\n        var coords = cursorCoords(this, cur, \"div\");\n        if (x == null) x = coords.left;\n        else coords.left = x;\n        cur = findPosV(this, coords, dir, unit);\n        if (cur.hitSide) break;\n      }\n      return cur;\n    },\n\n    moveV: methodOp(function(dir, unit) {\n      var cm = this, doc = this.doc, goals = [];\n      var collapse = !cm.display.shift && !doc.extend && doc.sel.somethingSelected();\n      doc.extendSelectionsBy(function(range) {\n        if (collapse)\n          return dir < 0 ? range.from() : range.to();\n        var headPos = cursorCoords(cm, range.head, \"div\");\n        if (range.goalColumn != null) headPos.left = range.goalColumn;\n        goals.push(headPos.left);\n        var pos = findPosV(cm, headPos, dir, unit);\n        if (unit == \"page\" && range == doc.sel.primary())\n          addToScrollPos(cm, null, charCoords(cm, pos, \"div\").top - headPos.top);\n        return pos;\n      }, sel_move);\n      if (goals.length) for (var i = 0; i < doc.sel.ranges.length; i++)\n        doc.sel.ranges[i].goalColumn = goals[i];\n    }),\n\n    // Find the word at the given position (as returned by coordsChar).\n    findWordAt: function(pos) {\n      var doc = this.doc, line = getLine(doc, pos.line).text;\n      var start = pos.ch, end = pos.ch;\n      if (line) {\n        var helper = this.getHelper(pos, \"wordChars\");\n        if ((pos.xRel < 0 || end == line.length) && start) --start; else ++end;\n        var startChar = line.charAt(start);\n        var check = isWordChar(startChar, helper)\n          ? function(ch) { return isWordChar(ch, helper); }\n          : /\\s/.test(startChar) ? function(ch) {return /\\s/.test(ch);}\n          : function(ch) {return !/\\s/.test(ch) && !isWordChar(ch);};\n        while (start > 0 && check(line.charAt(start - 1))) --start;\n        while (end < line.length && check(line.charAt(end))) ++end;\n      }\n      return new Range(Pos(pos.line, start), Pos(pos.line, end));\n    },\n\n    toggleOverwrite: function(value) {\n      if (value != null && value == this.state.overwrite) return;\n      if (this.state.overwrite = !this.state.overwrite)\n        addClass(this.display.cursorDiv, \"CodeMirror-overwrite\");\n      else\n        rmClass(this.display.cursorDiv, \"CodeMirror-overwrite\");\n\n      signal(this, \"overwriteToggle\", this, this.state.overwrite);\n    },\n    hasFocus: function() { return activeElt() == this.display.input; },\n\n    scrollTo: methodOp(function(x, y) {\n      if (x != null || y != null) resolveScrollToPos(this);\n      if (x != null) this.curOp.scrollLeft = x;\n      if (y != null) this.curOp.scrollTop = y;\n    }),\n    getScrollInfo: function() {\n      var scroller = this.display.scroller, co = scrollerCutOff;\n      return {left: scroller.scrollLeft, top: scroller.scrollTop,\n              height: scroller.scrollHeight - co, width: scroller.scrollWidth - co,\n              clientHeight: scroller.clientHeight - co, clientWidth: scroller.clientWidth - co};\n    },\n\n    scrollIntoView: methodOp(function(range, margin) {\n      if (range == null) {\n        range = {from: this.doc.sel.primary().head, to: null};\n        if (margin == null) margin = this.options.cursorScrollMargin;\n      } else if (typeof range == \"number\") {\n        range = {from: Pos(range, 0), to: null};\n      } else if (range.from == null) {\n        range = {from: range, to: null};\n      }\n      if (!range.to) range.to = range.from;\n      range.margin = margin || 0;\n\n      if (range.from.line != null) {\n        resolveScrollToPos(this);\n        this.curOp.scrollToPos = range;\n      } else {\n        var sPos = calculateScrollPos(this, Math.min(range.from.left, range.to.left),\n                                      Math.min(range.from.top, range.to.top) - range.margin,\n                                      Math.max(range.from.right, range.to.right),\n                                      Math.max(range.from.bottom, range.to.bottom) + range.margin);\n        this.scrollTo(sPos.scrollLeft, sPos.scrollTop);\n      }\n    }),\n\n    setSize: methodOp(function(width, height) {\n      var cm = this;\n      function interpret(val) {\n        return typeof val == \"number\" || /^\\d+$/.test(String(val)) ? val + \"px\" : val;\n      }\n      if (width != null) cm.display.wrapper.style.width = interpret(width);\n      if (height != null) cm.display.wrapper.style.height = interpret(height);\n      if (cm.options.lineWrapping) clearLineMeasurementCache(this);\n      var lineNo = cm.display.viewFrom;\n      cm.doc.iter(lineNo, cm.display.viewTo, function(line) {\n        if (line.widgets) for (var i = 0; i < line.widgets.length; i++)\n          if (line.widgets[i].noHScroll) { regLineChange(cm, lineNo, \"widget\"); break; }\n        ++lineNo;\n      });\n      cm.curOp.forceUpdate = true;\n      signal(cm, \"refresh\", this);\n    }),\n\n    operation: function(f){return runInOp(this, f);},\n\n    refresh: methodOp(function() {\n      var oldHeight = this.display.cachedTextHeight;\n      regChange(this);\n      this.curOp.forceUpdate = true;\n      clearCaches(this);\n      this.scrollTo(this.doc.scrollLeft, this.doc.scrollTop);\n      updateGutterSpace(this);\n      if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5)\n        estimateLineHeights(this);\n      signal(this, \"refresh\", this);\n    }),\n\n    swapDoc: methodOp(function(doc) {\n      var old = this.doc;\n      old.cm = null;\n      attachDoc(this, doc);\n      clearCaches(this);\n      resetInput(this);\n      this.scrollTo(doc.scrollLeft, doc.scrollTop);\n      this.curOp.forceScroll = true;\n      signalLater(this, \"swapDoc\", this, old);\n      return old;\n    }),\n\n    getInputField: function(){return this.display.input;},\n    getWrapperElement: function(){return this.display.wrapper;},\n    getScrollerElement: function(){return this.display.scroller;},\n    getGutterElement: function(){return this.display.gutters;}\n  };\n  eventMixin(CodeMirror);\n\n  // OPTION DEFAULTS\n\n  // The default configuration options.\n  var defaults = CodeMirror.defaults = {};\n  // Functions to run when options are changed.\n  var optionHandlers = CodeMirror.optionHandlers = {};\n\n  function option(name, deflt, handle, notOnInit) {\n    CodeMirror.defaults[name] = deflt;\n    if (handle) optionHandlers[name] =\n      notOnInit ? function(cm, val, old) {if (old != Init) handle(cm, val, old);} : handle;\n  }\n\n  // Passed to option handlers when there is no old value.\n  var Init = CodeMirror.Init = {toString: function(){return \"CodeMirror.Init\";}};\n\n  // These two are, on init, called from the constructor because they\n  // have to be initialized before the editor can start at all.\n  option(\"value\", \"\", function(cm, val) {\n    cm.setValue(val);\n  }, true);\n  option(\"mode\", null, function(cm, val) {\n    cm.doc.modeOption = val;\n    loadMode(cm);\n  }, true);\n\n  option(\"indentUnit\", 2, loadMode, true);\n  option(\"indentWithTabs\", false);\n  option(\"smartIndent\", true);\n  option(\"tabSize\", 4, function(cm) {\n    resetModeState(cm);\n    clearCaches(cm);\n    regChange(cm);\n  }, true);\n  option(\"specialChars\", /[\\t\\u0000-\\u0019\\u00ad\\u200b-\\u200f\\u2028\\u2029\\ufeff]/g, function(cm, val) {\n    cm.options.specialChars = new RegExp(val.source + (val.test(\"\\t\") ? \"\" : \"|\\t\"), \"g\");\n    cm.refresh();\n  }, true);\n  option(\"specialCharPlaceholder\", defaultSpecialCharPlaceholder, function(cm) {cm.refresh();}, true);\n  option(\"electricChars\", true);\n  option(\"rtlMoveVisually\", !windows);\n  option(\"wholeLineUpdateBefore\", true);\n\n  option(\"theme\", \"default\", function(cm) {\n    themeChanged(cm);\n    guttersChanged(cm);\n  }, true);\n  option(\"keyMap\", \"default\", keyMapChanged);\n  option(\"extraKeys\", null);\n\n  option(\"lineWrapping\", false, wrappingChanged, true);\n  option(\"gutters\", [], function(cm) {\n    setGuttersForLineNumbers(cm.options);\n    guttersChanged(cm);\n  }, true);\n  option(\"fixedGutter\", true, function(cm, val) {\n    cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + \"px\" : \"0\";\n    cm.refresh();\n  }, true);\n  option(\"coverGutterNextToScrollbar\", false, updateScrollbars, true);\n  option(\"lineNumbers\", false, function(cm) {\n    setGuttersForLineNumbers(cm.options);\n    guttersChanged(cm);\n  }, true);\n  option(\"firstLineNumber\", 1, guttersChanged, true);\n  option(\"lineNumberFormatter\", function(integer) {return integer;}, guttersChanged, true);\n  option(\"showCursorWhenSelecting\", false, updateSelection, true);\n\n  option(\"resetSelectionOnContextMenu\", true);\n\n  option(\"readOnly\", false, function(cm, val) {\n    if (val == \"nocursor\") {\n      onBlur(cm);\n      cm.display.input.blur();\n      cm.display.disabled = true;\n    } else {\n      cm.display.disabled = false;\n      if (!val) resetInput(cm);\n    }\n  });\n  option(\"disableInput\", false, function(cm, val) {if (!val) resetInput(cm);}, true);\n  option(\"dragDrop\", true);\n\n  option(\"cursorBlinkRate\", 530);\n  option(\"cursorScrollMargin\", 0);\n  option(\"cursorHeight\", 1, updateSelection, true);\n  option(\"singleCursorHeightPerLine\", true, updateSelection, true);\n  option(\"workTime\", 100);\n  option(\"workDelay\", 100);\n  option(\"flattenSpans\", true, resetModeState, true);\n  option(\"addModeClass\", false, resetModeState, true);\n  option(\"pollInterval\", 100);\n  option(\"undoDepth\", 200, function(cm, val){cm.doc.history.undoDepth = val;});\n  option(\"historyEventDelay\", 1250);\n  option(\"viewportMargin\", 10, function(cm){cm.refresh();}, true);\n  option(\"maxHighlightLength\", 10000, resetModeState, true);\n  option(\"moveInputWithCursor\", true, function(cm, val) {\n    if (!val) cm.display.inputDiv.style.top = cm.display.inputDiv.style.left = 0;\n  });\n\n  option(\"tabindex\", null, function(cm, val) {\n    cm.display.input.tabIndex = val || \"\";\n  });\n  option(\"autofocus\", null);\n\n  // MODE DEFINITION AND QUERYING\n\n  // Known modes, by name and by MIME\n  var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {};\n\n  // Extra arguments are stored as the mode's dependencies, which is\n  // used by (legacy) mechanisms like loadmode.js to automatically\n  // load a mode. (Preferred mechanism is the require/define calls.)\n  CodeMirror.defineMode = function(name, mode) {\n    if (!CodeMirror.defaults.mode && name != \"null\") CodeMirror.defaults.mode = name;\n    if (arguments.length > 2)\n      mode.dependencies = Array.prototype.slice.call(arguments, 2);\n    modes[name] = mode;\n  };\n\n  CodeMirror.defineMIME = function(mime, spec) {\n    mimeModes[mime] = spec;\n  };\n\n  // Given a MIME type, a {name, ...options} config object, or a name\n  // string, return a mode config object.\n  CodeMirror.resolveMode = function(spec) {\n    if (typeof spec == \"string\" && mimeModes.hasOwnProperty(spec)) {\n      spec = mimeModes[spec];\n    } else if (spec && typeof spec.name == \"string\" && mimeModes.hasOwnProperty(spec.name)) {\n      var found = mimeModes[spec.name];\n      if (typeof found == \"string\") found = {name: found};\n      spec = createObj(found, spec);\n      spec.name = found.name;\n    } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+xml$/.test(spec)) {\n      return CodeMirror.resolveMode(\"application/xml\");\n    }\n    if (typeof spec == \"string\") return {name: spec};\n    else return spec || {name: \"null\"};\n  };\n\n  // Given a mode spec (anything that resolveMode accepts), find and\n  // initialize an actual mode object.\n  CodeMirror.getMode = function(options, spec) {\n    var spec = CodeMirror.resolveMode(spec);\n    var mfactory = modes[spec.name];\n    if (!mfactory) return CodeMirror.getMode(options, \"text/plain\");\n    var modeObj = mfactory(options, spec);\n    if (modeExtensions.hasOwnProperty(spec.name)) {\n      var exts = modeExtensions[spec.name];\n      for (var prop in exts) {\n        if (!exts.hasOwnProperty(prop)) continue;\n        if (modeObj.hasOwnProperty(prop)) modeObj[\"_\" + prop] = modeObj[prop];\n        modeObj[prop] = exts[prop];\n      }\n    }\n    modeObj.name = spec.name;\n    if (spec.helperType) modeObj.helperType = spec.helperType;\n    if (spec.modeProps) for (var prop in spec.modeProps)\n      modeObj[prop] = spec.modeProps[prop];\n\n    return modeObj;\n  };\n\n  // Minimal default mode.\n  CodeMirror.defineMode(\"null\", function() {\n    return {token: function(stream) {stream.skipToEnd();}};\n  });\n  CodeMirror.defineMIME(\"text/plain\", \"null\");\n\n  // This can be used to attach properties to mode objects from\n  // outside the actual mode definition.\n  var modeExtensions = CodeMirror.modeExtensions = {};\n  CodeMirror.extendMode = function(mode, properties) {\n    var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});\n    copyObj(properties, exts);\n  };\n\n  // EXTENSIONS\n\n  CodeMirror.defineExtension = function(name, func) {\n    CodeMirror.prototype[name] = func;\n  };\n  CodeMirror.defineDocExtension = function(name, func) {\n    Doc.prototype[name] = func;\n  };\n  CodeMirror.defineOption = option;\n\n  var initHooks = [];\n  CodeMirror.defineInitHook = function(f) {initHooks.push(f);};\n\n  var helpers = CodeMirror.helpers = {};\n  CodeMirror.registerHelper = function(type, name, value) {\n    if (!helpers.hasOwnProperty(type)) helpers[type] = CodeMirror[type] = {_global: []};\n    helpers[type][name] = value;\n  };\n  CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {\n    CodeMirror.registerHelper(type, name, value);\n    helpers[type]._global.push({pred: predicate, val: value});\n  };\n\n  // MODE STATE HANDLING\n\n  // Utility functions for working with state. Exported because nested\n  // modes need to do this for their inner modes.\n\n  var copyState = CodeMirror.copyState = function(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\n  var startState = CodeMirror.startState = function(mode, a1, a2) {\n    return mode.startState ? mode.startState(a1, a2) : true;\n  };\n\n  // Given a mode and a state (for that mode), find the inner mode and\n  // state at the position that the state refers to.\n  CodeMirror.innerMode = function(mode, state) {\n    while (mode.innerMode) {\n      var info = mode.innerMode(state);\n      if (!info || info.mode == mode) break;\n      state = info.state;\n      mode = info.mode;\n    }\n    return info || {mode: mode, state: state};\n  };\n\n  // STANDARD COMMANDS\n\n  // Commands are parameter-less actions that can be performed on an\n  // editor, mostly used for keybindings.\n  var commands = CodeMirror.commands = {\n    selectAll: function(cm) {cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);},\n    singleSelection: function(cm) {\n      cm.setSelection(cm.getCursor(\"anchor\"), cm.getCursor(\"head\"), sel_dontScroll);\n    },\n    killLine: function(cm) {\n      deleteNearSelection(cm, function(range) {\n        if (range.empty()) {\n          var len = getLine(cm.doc, range.head.line).text.length;\n          if (range.head.ch == len && range.head.line < cm.lastLine())\n            return {from: range.head, to: Pos(range.head.line + 1, 0)};\n          else\n            return {from: range.head, to: Pos(range.head.line, len)};\n        } else {\n          return {from: range.from(), to: range.to()};\n        }\n      });\n    },\n    deleteLine: function(cm) {\n      deleteNearSelection(cm, function(range) {\n        return {from: Pos(range.from().line, 0),\n                to: clipPos(cm.doc, Pos(range.to().line + 1, 0))};\n      });\n    },\n    delLineLeft: function(cm) {\n      deleteNearSelection(cm, function(range) {\n        return {from: Pos(range.from().line, 0), to: range.from()};\n      });\n    },\n    delWrappedLineLeft: function(cm) {\n      deleteNearSelection(cm, function(range) {\n        var top = cm.charCoords(range.head, \"div\").top + 5;\n        var leftPos = cm.coordsChar({left: 0, top: top}, \"div\");\n        return {from: leftPos, to: range.from()};\n      });\n    },\n    delWrappedLineRight: function(cm) {\n      deleteNearSelection(cm, function(range) {\n        var top = cm.charCoords(range.head, \"div\").top + 5;\n        var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\");\n        return {from: range.from(), to: rightPos };\n      });\n    },\n    undo: function(cm) {cm.undo();},\n    redo: function(cm) {cm.redo();},\n    undoSelection: function(cm) {cm.undoSelection();},\n    redoSelection: function(cm) {cm.redoSelection();},\n    goDocStart: function(cm) {cm.extendSelection(Pos(cm.firstLine(), 0));},\n    goDocEnd: function(cm) {cm.extendSelection(Pos(cm.lastLine()));},\n    goLineStart: function(cm) {\n      cm.extendSelectionsBy(function(range) { return lineStart(cm, range.head.line); },\n                            {origin: \"+move\", bias: 1});\n    },\n    goLineStartSmart: function(cm) {\n      cm.extendSelectionsBy(function(range) {\n        return lineStartSmart(cm, range.head);\n      }, {origin: \"+move\", bias: 1});\n    },\n    goLineEnd: function(cm) {\n      cm.extendSelectionsBy(function(range) { return lineEnd(cm, range.head.line); },\n                            {origin: \"+move\", bias: -1});\n    },\n    goLineRight: function(cm) {\n      cm.extendSelectionsBy(function(range) {\n        var top = cm.charCoords(range.head, \"div\").top + 5;\n        return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\");\n      }, sel_move);\n    },\n    goLineLeft: function(cm) {\n      cm.extendSelectionsBy(function(range) {\n        var top = cm.charCoords(range.head, \"div\").top + 5;\n        return cm.coordsChar({left: 0, top: top}, \"div\");\n      }, sel_move);\n    },\n    goLineLeftSmart: function(cm) {\n      cm.extendSelectionsBy(function(range) {\n        var top = cm.charCoords(range.head, \"div\").top + 5;\n        var pos = cm.coordsChar({left: 0, top: top}, \"div\");\n        if (pos.ch < cm.getLine(pos.line).search(/\\S/)) return lineStartSmart(cm, range.head);\n        return pos;\n      }, sel_move);\n    },\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    goGroupRight: function(cm) {cm.moveH(1, \"group\");},\n    goGroupLeft: function(cm) {cm.moveH(-1, \"group\");},\n    goWordRight: function(cm) {cm.moveH(1, \"word\");},\n    delCharBefore: function(cm) {cm.deleteH(-1, \"char\");},\n    delCharAfter: function(cm) {cm.deleteH(1, \"char\");},\n    delWordBefore: function(cm) {cm.deleteH(-1, \"word\");},\n    delWordAfter: function(cm) {cm.deleteH(1, \"word\");},\n    delGroupBefore: function(cm) {cm.deleteH(-1, \"group\");},\n    delGroupAfter: function(cm) {cm.deleteH(1, \"group\");},\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\");},\n    insertSoftTab: function(cm) {\n      var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize;\n      for (var i = 0; i < ranges.length; i++) {\n        var pos = ranges[i].from();\n        var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);\n        spaces.push(new Array(tabSize - col % tabSize + 1).join(\" \"));\n      }\n      cm.replaceSelections(spaces);\n    },\n    defaultTab: function(cm) {\n      if (cm.somethingSelected()) cm.indentSelection(\"add\");\n      else cm.execCommand(\"insertTab\");\n    },\n    transposeChars: function(cm) {\n      runInOp(cm, function() {\n        var ranges = cm.listSelections(), newSel = [];\n        for (var i = 0; i < ranges.length; i++) {\n          var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text;\n          if (line) {\n            if (cur.ch == line.length) cur = new Pos(cur.line, cur.ch - 1);\n            if (cur.ch > 0) {\n              cur = new Pos(cur.line, cur.ch + 1);\n              cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),\n                              Pos(cur.line, cur.ch - 2), cur, \"+transpose\");\n            } else if (cur.line > cm.doc.first) {\n              var prev = getLine(cm.doc, cur.line - 1).text;\n              if (prev)\n                cm.replaceRange(line.charAt(0) + \"\\n\" + prev.charAt(prev.length - 1),\n                                Pos(cur.line - 1, prev.length - 1), Pos(cur.line, 1), \"+transpose\");\n            }\n          }\n          newSel.push(new Range(cur, cur));\n        }\n        cm.setSelections(newSel);\n      });\n    },\n    newlineAndIndent: function(cm) {\n      runInOp(cm, function() {\n        var len = cm.listSelections().length;\n        for (var i = 0; i < len; i++) {\n          var range = cm.listSelections()[i];\n          cm.replaceRange(\"\\n\", range.anchor, range.head, \"+input\");\n          cm.indentLine(range.from().line + 1, null, true);\n          ensureCursorVisible(cm);\n        }\n      });\n    },\n    toggleOverwrite: function(cm) {cm.toggleOverwrite();}\n  };\n\n  // STANDARD KEYMAPS\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\": \"delCharAfter\", \"Backspace\": \"delCharBefore\", \"Shift-Backspace\": \"delCharBefore\",\n    \"Tab\": \"defaultTab\", \"Shift-Tab\": \"indentAuto\",\n    \"Enter\": \"newlineAndIndent\", \"Insert\": \"toggleOverwrite\",\n    \"Esc\": \"singleSelection\"\n  };\n  // Note that the save and find-related commands aren't defined by\n  // default. User code or addons can define them. Unknown commands\n  // 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\", \"Ctrl-End\": \"goDocEnd\", \"Ctrl-Up\": \"goLineUp\", \"Ctrl-Down\": \"goLineDown\",\n    \"Ctrl-Left\": \"goGroupLeft\", \"Ctrl-Right\": \"goGroupRight\", \"Alt-Left\": \"goLineStart\", \"Alt-Right\": \"goLineEnd\",\n    \"Ctrl-Backspace\": \"delGroupBefore\", \"Ctrl-Delete\": \"delGroupAfter\", \"Ctrl-S\": \"save\", \"Ctrl-F\": \"find\",\n    \"Ctrl-G\": \"findNext\", \"Shift-Ctrl-G\": \"findPrev\", \"Shift-Ctrl-F\": \"replace\", \"Shift-Ctrl-R\": \"replaceAll\",\n    \"Ctrl-[\": \"indentLess\", \"Ctrl-]\": \"indentMore\",\n    \"Ctrl-U\": \"undoSelection\", \"Shift-Ctrl-U\": \"redoSelection\", \"Alt-U\": \"redoSelection\",\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-Home\": \"goDocStart\", \"Cmd-Up\": \"goDocStart\", \"Cmd-End\": \"goDocEnd\", \"Cmd-Down\": \"goDocEnd\", \"Alt-Left\": \"goGroupLeft\",\n    \"Alt-Right\": \"goGroupRight\", \"Cmd-Left\": \"goLineLeft\", \"Cmd-Right\": \"goLineRight\", \"Alt-Backspace\": \"delGroupBefore\",\n    \"Ctrl-Alt-Backspace\": \"delGroupAfter\", \"Alt-Delete\": \"delGroupAfter\", \"Cmd-S\": \"save\", \"Cmd-F\": \"find\",\n    \"Cmd-G\": \"findNext\", \"Shift-Cmd-G\": \"findPrev\", \"Cmd-Alt-F\": \"replace\", \"Shift-Cmd-Alt-F\": \"replaceAll\",\n    \"Cmd-[\": \"indentLess\", \"Cmd-]\": \"indentMore\", \"Cmd-Backspace\": \"delWrappedLineLeft\", \"Cmd-Delete\": \"delWrappedLineRight\",\n    \"Cmd-U\": \"undoSelection\", \"Shift-Cmd-U\": \"redoSelection\", \"Ctrl-Up\": \"goDocStart\", \"Ctrl-Down\": \"goDocEnd\",\n    fallthrough: [\"basic\", \"emacsy\"]\n  };\n  // Very basic readline/emacs-style bindings, which are standard on Mac.\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\": \"goPageDown\", \"Shift-Ctrl-V\": \"goPageUp\", \"Ctrl-D\": \"delCharAfter\", \"Ctrl-H\": \"delCharBefore\",\n    \"Alt-D\": \"delWordAfter\", \"Alt-Backspace\": \"delWordBefore\", \"Ctrl-K\": \"killLine\", \"Ctrl-T\": \"transposeChars\"\n  };\n  keyMap[\"default\"] = mac ? keyMap.macDefault : keyMap.pcDefault;\n\n  // KEYMAP DISPATCH\n\n  function getKeyMap(val) {\n    if (typeof val == \"string\") return keyMap[val];\n    else return val;\n  }\n\n  // Given an array of keymaps and a key name, call handle on any\n  // bindings found, until that returns a truthy value, at which point\n  // we consider the key handled. Implements things like binding a key\n  // to false stopping further handling and keymap fallthrough.\n  var lookupKey = CodeMirror.lookupKey = function(name, maps, handle) {\n    function lookup(map) {\n      map = getKeyMap(map);\n      var found = map[name];\n      if (found === false) return \"stop\";\n      if (found != null && handle(found)) return true;\n      if (map.nofallthrough) return \"stop\";\n\n      var fallthrough = map.fallthrough;\n      if (fallthrough == null) return false;\n      if (Object.prototype.toString.call(fallthrough) != \"[object Array]\")\n        return lookup(fallthrough);\n      for (var i = 0; i < fallthrough.length; ++i) {\n        var done = lookup(fallthrough[i]);\n        if (done) return done;\n      }\n      return false;\n    }\n\n    for (var i = 0; i < maps.length; ++i) {\n      var done = lookup(maps[i]);\n      if (done) return done != \"stop\";\n    }\n  };\n\n  // Modifier key presses don't count as 'real' key presses for the\n  // purpose of keymap fallthrough.\n  var isModifierKey = CodeMirror.isModifierKey = function(event) {\n    var name = keyNames[event.keyCode];\n    return name == \"Ctrl\" || name == \"Alt\" || name == \"Shift\" || name == \"Mod\";\n  };\n\n  // Look up the name of a key as indicated by an event object.\n  var keyName = CodeMirror.keyName = function(event, noShift) {\n    if (presto && event.keyCode == 34 && event[\"char\"]) return false;\n    var name = keyNames[event.keyCode];\n    if (name == null || event.altGraphKey) return false;\n    if (event.altKey) name = \"Alt-\" + name;\n    if (flipCtrlCmd ? event.metaKey : event.ctrlKey) name = \"Ctrl-\" + name;\n    if (flipCtrlCmd ? event.ctrlKey : event.metaKey) name = \"Cmd-\" + name;\n    if (!noShift && event.shiftKey) name = \"Shift-\" + name;\n    return name;\n  };\n\n  // FROMTEXTAREA\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    if (!options.placeholder && textarea.placeholder)\n      options.placeholder = textarea.placeholder;\n    // Set autofocus to true if this textarea is focused, or if it has\n    // autofocus and no other element is focused.\n    if (options.autofocus == null) {\n      var hasFocus = activeElt();\n      options.autofocus = hasFocus == textarea ||\n        textarea.getAttribute(\"autofocus\") != null && hasFocus == document.body;\n    }\n\n    function save() {textarea.value = cm.getValue();}\n    if (textarea.form) {\n      on(textarea.form, \"submit\", save);\n      // Deplorable hack to make the submit method do the right thing.\n      if (!options.leaveSubmitMethodAlone) {\n        var form = textarea.form, realSubmit = form.submit;\n        try {\n          var wrappedSubmit = form.submit = function() {\n            save();\n            form.submit = realSubmit;\n            form.submit();\n            form.submit = wrappedSubmit;\n          };\n        } catch(e) {}\n      }\n    }\n\n    textarea.style.display = \"none\";\n    var cm = CodeMirror(function(node) {\n      textarea.parentNode.insertBefore(node, textarea.nextSibling);\n    }, options);\n    cm.save = save;\n    cm.getTextArea = function() { return textarea; };\n    cm.toTextArea = function() {\n      cm.toTextArea = isNaN; // Prevent this from being ran twice\n      save();\n      textarea.parentNode.removeChild(cm.getWrapperElement());\n      textarea.style.display = \"\";\n      if (textarea.form) {\n        off(textarea.form, \"submit\", save);\n        if (typeof textarea.form.submit == \"function\")\n          textarea.form.submit = realSubmit;\n      }\n    };\n    return cm;\n  };\n\n  // STRING STREAM\n\n  // Fed to the mode parsers, provides helper functions to make\n  // parsers more succinct.\n\n  var StringStream = CodeMirror.StringStream = function(string, tabSize) {\n    this.pos = this.start = 0;\n    this.string = string;\n    this.tabSize = tabSize || 8;\n    this.lastColumnPos = this.lastColumnValue = 0;\n    this.lineStart = 0;\n  };\n\n  StringStream.prototype = {\n    eol: function() {return this.pos >= this.string.length;},\n    sol: function() {return this.pos == this.lineStart;},\n    peek: function() {return this.string.charAt(this.pos) || undefined;},\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() {\n      if (this.lastColumnPos < this.start) {\n        this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);\n        this.lastColumnPos = this.start;\n      }\n      return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0);\n    },\n    indentation: function() {\n      return countColumn(this.string, null, this.tabSize) -\n        (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0);\n    },\n    match: function(pattern, consume, caseInsensitive) {\n      if (typeof pattern == \"string\") {\n        var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;};\n        var substr = this.string.substr(this.pos, pattern.length);\n        if (cased(substr) == cased(pattern)) {\n          if (consume !== false) this.pos += pattern.length;\n          return true;\n        }\n      } else {\n        var match = this.string.slice(this.pos).match(pattern);\n        if (match && match.index > 0) return null;\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    hideFirstChars: function(n, inner) {\n      this.lineStart += n;\n      try { return inner(); }\n      finally { this.lineStart -= n; }\n    }\n  };\n\n  // TEXTMARKERS\n\n  // Created with markText and setBookmark methods. A TextMarker is a\n  // handle that can be used to clear or find a marked position in the\n  // document. Line objects hold arrays (markedSpans) containing\n  // {from, to, marker} object pointing to such marker objects, and\n  // indicating that such a marker is present on that line. Multiple\n  // lines may point to the same marker when it spans across lines.\n  // The spans will have null for their from/to properties when the\n  // marker continues beyond the start/end of the line. Markers have\n  // links back to the lines they currently touch.\n\n  var TextMarker = CodeMirror.TextMarker = function(doc, type) {\n    this.lines = [];\n    this.type = type;\n    this.doc = doc;\n  };\n  eventMixin(TextMarker);\n\n  // Clear the marker.\n  TextMarker.prototype.clear = function() {\n    if (this.explicitlyCleared) return;\n    var cm = this.doc.cm, withOp = cm && !cm.curOp;\n    if (withOp) startOperation(cm);\n    if (hasHandler(this, \"clear\")) {\n      var found = this.find();\n      if (found) signalLater(this, \"clear\", found.from, found.to);\n    }\n    var min = null, max = null;\n    for (var i = 0; i < this.lines.length; ++i) {\n      var line = this.lines[i];\n      var span = getMarkedSpanFor(line.markedSpans, this);\n      if (cm && !this.collapsed) regLineChange(cm, lineNo(line), \"text\");\n      else if (cm) {\n        if (span.to != null) max = lineNo(line);\n        if (span.from != null) min = lineNo(line);\n      }\n      line.markedSpans = removeMarkedSpan(line.markedSpans, span);\n      if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm)\n        updateLineHeight(line, textHeight(cm.display));\n    }\n    if (cm && this.collapsed && !cm.options.lineWrapping) for (var i = 0; i < this.lines.length; ++i) {\n      var visual = visualLine(this.lines[i]), len = lineLength(visual);\n      if (len > cm.display.maxLineLength) {\n        cm.display.maxLine = visual;\n        cm.display.maxLineLength = len;\n        cm.display.maxLineChanged = true;\n      }\n    }\n\n    if (min != null && cm && this.collapsed) regChange(cm, min, max + 1);\n    this.lines.length = 0;\n    this.explicitlyCleared = true;\n    if (this.atomic && this.doc.cantEdit) {\n      this.doc.cantEdit = false;\n      if (cm) reCheckSelection(cm.doc);\n    }\n    if (cm) signalLater(cm, \"markerCleared\", cm, this);\n    if (withOp) endOperation(cm);\n    if (this.parent) this.parent.clear();\n  };\n\n  // Find the position of the marker in the document. Returns a {from,\n  // to} object by default. Side can be passed to get a specific side\n  // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the\n  // Pos objects returned contain a line object, rather than a line\n  // number (used to prevent looking up the same line twice).\n  TextMarker.prototype.find = function(side, lineObj) {\n    if (side == null && this.type == \"bookmark\") side = 1;\n    var from, to;\n    for (var i = 0; i < this.lines.length; ++i) {\n      var line = this.lines[i];\n      var span = getMarkedSpanFor(line.markedSpans, this);\n      if (span.from != null) {\n        from = Pos(lineObj ? line : lineNo(line), span.from);\n        if (side == -1) return from;\n      }\n      if (span.to != null) {\n        to = Pos(lineObj ? line : lineNo(line), span.to);\n        if (side == 1) return to;\n      }\n    }\n    return from && {from: from, to: to};\n  };\n\n  // Signals that the marker's widget changed, and surrounding layout\n  // should be recomputed.\n  TextMarker.prototype.changed = function() {\n    var pos = this.find(-1, true), widget = this, cm = this.doc.cm;\n    if (!pos || !cm) return;\n    runInOp(cm, function() {\n      var line = pos.line, lineN = lineNo(pos.line);\n      var view = findViewForLine(cm, lineN);\n      if (view) {\n        clearLineMeasurementCacheFor(view);\n        cm.curOp.selectionChanged = cm.curOp.forceUpdate = true;\n      }\n      cm.curOp.updateMaxLine = true;\n      if (!lineIsHidden(widget.doc, line) && widget.height != null) {\n        var oldHeight = widget.height;\n        widget.height = null;\n        var dHeight = widgetHeight(widget) - oldHeight;\n        if (dHeight)\n          updateLineHeight(line, line.height + dHeight);\n      }\n    });\n  };\n\n  TextMarker.prototype.attachLine = function(line) {\n    if (!this.lines.length && this.doc.cm) {\n      var op = this.doc.cm.curOp;\n      if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)\n        (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this);\n    }\n    this.lines.push(line);\n  };\n  TextMarker.prototype.detachLine = function(line) {\n    this.lines.splice(indexOf(this.lines, line), 1);\n    if (!this.lines.length && this.doc.cm) {\n      var op = this.doc.cm.curOp;\n      (op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);\n    }\n  };\n\n  // Collapsed markers have unique ids, in order to be able to order\n  // them, which is needed for uniquely determining an outer marker\n  // when they overlap (they may nest, but not partially overlap).\n  var nextMarkerId = 0;\n\n  // Create a marker, wire it up to the right lines, and\n  function markText(doc, from, to, options, type) {\n    // Shared markers (across linked documents) are handled separately\n    // (markTextShared will call out to this again, once per\n    // document).\n    if (options && options.shared) return markTextShared(doc, from, to, options, type);\n    // Ensure we are in an operation.\n    if (doc.cm && !doc.cm.curOp) return operation(doc.cm, markText)(doc, from, to, options, type);\n\n    var marker = new TextMarker(doc, type), diff = cmp(from, to);\n    if (options) copyObj(options, marker, false);\n    // Don't connect empty markers unless clearWhenEmpty is false\n    if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)\n      return marker;\n    if (marker.replacedWith) {\n      // Showing up as a widget implies collapsed (widget replaces text)\n      marker.collapsed = true;\n      marker.widgetNode = elt(\"span\", [marker.replacedWith], \"CodeMirror-widget\");\n      if (!options.handleMouseEvents) marker.widgetNode.ignoreEvents = true;\n      if (options.insertLeft) marker.widgetNode.insertLeft = true;\n    }\n    if (marker.collapsed) {\n      if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||\n          from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))\n        throw new Error(\"Inserting collapsed marker partially overlapping an existing one\");\n      sawCollapsedSpans = true;\n    }\n\n    if (marker.addToHistory)\n      addChangeToHistory(doc, {from: from, to: to, origin: \"markText\"}, doc.sel, NaN);\n\n    var curLine = from.line, cm = doc.cm, updateMaxLine;\n    doc.iter(curLine, to.line + 1, function(line) {\n      if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)\n        updateMaxLine = true;\n      if (marker.collapsed && curLine != from.line) updateLineHeight(line, 0);\n      addMarkedSpan(line, new MarkedSpan(marker,\n                                         curLine == from.line ? from.ch : null,\n                                         curLine == to.line ? to.ch : null));\n      ++curLine;\n    });\n    // lineIsHidden depends on the presence of the spans, so needs a second pass\n    if (marker.collapsed) doc.iter(from.line, to.line + 1, function(line) {\n      if (lineIsHidden(doc, line)) updateLineHeight(line, 0);\n    });\n\n    if (marker.clearOnEnter) on(marker, \"beforeCursorEnter\", function() { marker.clear(); });\n\n    if (marker.readOnly) {\n      sawReadOnlySpans = true;\n      if (doc.history.done.length || doc.history.undone.length)\n        doc.clearHistory();\n    }\n    if (marker.collapsed) {\n      marker.id = ++nextMarkerId;\n      marker.atomic = true;\n    }\n    if (cm) {\n      // Sync editor state\n      if (updateMaxLine) cm.curOp.updateMaxLine = true;\n      if (marker.collapsed)\n        regChange(cm, from.line, to.line + 1);\n      else if (marker.className || marker.title || marker.startStyle || marker.endStyle)\n        for (var i = from.line; i <= to.line; i++) regLineChange(cm, i, \"text\");\n      if (marker.atomic) reCheckSelection(cm.doc);\n      signalLater(cm, \"markerAdded\", cm, marker);\n    }\n    return marker;\n  }\n\n  // SHARED TEXTMARKERS\n\n  // A shared marker spans multiple linked documents. It is\n  // implemented as a meta-marker-object controlling multiple normal\n  // markers.\n  var SharedTextMarker = CodeMirror.SharedTextMarker = function(markers, primary) {\n    this.markers = markers;\n    this.primary = primary;\n    for (var i = 0; i < markers.length; ++i)\n      markers[i].parent = this;\n  };\n  eventMixin(SharedTextMarker);\n\n  SharedTextMarker.prototype.clear = function() {\n    if (this.explicitlyCleared) return;\n    this.explicitlyCleared = true;\n    for (var i = 0; i < this.markers.length; ++i)\n      this.markers[i].clear();\n    signalLater(this, \"clear\");\n  };\n  SharedTextMarker.prototype.find = function(side, lineObj) {\n    return this.primary.find(side, lineObj);\n  };\n\n  function markTextShared(doc, from, to, options, type) {\n    options = copyObj(options);\n    options.shared = false;\n    var markers = [markText(doc, from, to, options, type)], primary = markers[0];\n    var widget = options.widgetNode;\n    linkedDocs(doc, function(doc) {\n      if (widget) options.widgetNode = widget.cloneNode(true);\n      markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));\n      for (var i = 0; i < doc.linked.length; ++i)\n        if (doc.linked[i].isParent) return;\n      primary = lst(markers);\n    });\n    return new SharedTextMarker(markers, primary);\n  }\n\n  function findSharedMarkers(doc) {\n    return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())),\n                         function(m) { return m.parent; });\n  }\n\n  function copySharedMarkers(doc, markers) {\n    for (var i = 0; i < markers.length; i++) {\n      var marker = markers[i], pos = marker.find();\n      var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to);\n      if (cmp(mFrom, mTo)) {\n        var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type);\n        marker.markers.push(subMark);\n        subMark.parent = marker;\n      }\n    }\n  }\n\n  function detachSharedMarkers(markers) {\n    for (var i = 0; i < markers.length; i++) {\n      var marker = markers[i], linked = [marker.primary.doc];;\n      linkedDocs(marker.primary.doc, function(d) { linked.push(d); });\n      for (var j = 0; j < marker.markers.length; j++) {\n        var subMarker = marker.markers[j];\n        if (indexOf(linked, subMarker.doc) == -1) {\n          subMarker.parent = null;\n          marker.markers.splice(j--, 1);\n        }\n      }\n    }\n  }\n\n  // TEXTMARKER SPANS\n\n  function MarkedSpan(marker, from, to) {\n    this.marker = marker;\n    this.from = from; this.to = to;\n  }\n\n  // Search an array of spans for a span matching the given marker.\n  function getMarkedSpanFor(spans, marker) {\n    if (spans) for (var i = 0; i < spans.length; ++i) {\n      var span = spans[i];\n      if (span.marker == marker) return span;\n    }\n  }\n  // Remove a span from an array, returning undefined if no spans are\n  // left (we don't store arrays for lines without spans).\n  function removeMarkedSpan(spans, span) {\n    for (var r, i = 0; i < spans.length; ++i)\n      if (spans[i] != span) (r || (r = [])).push(spans[i]);\n    return r;\n  }\n  // Add a span to a line.\n  function addMarkedSpan(line, span) {\n    line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];\n    span.marker.attachLine(line);\n  }\n\n  // Used for the algorithm that adjusts markers for a change in the\n  // document. These functions cut an array of spans at a given\n  // character position, returning an array of remaining chunks (or\n  // undefined if nothing remains).\n  function markedSpansBefore(old, startCh, isInsert) {\n    if (old) for (var i = 0, nw; i < old.length; ++i) {\n      var span = old[i], marker = span.marker;\n      var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);\n      if (startsBefore || span.from == startCh && marker.type == \"bookmark\" && (!isInsert || !span.marker.insertLeft)) {\n        var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh);\n        (nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));\n      }\n    }\n    return nw;\n  }\n  function markedSpansAfter(old, endCh, isInsert) {\n    if (old) for (var i = 0, nw; i < old.length; ++i) {\n      var span = old[i], marker = span.marker;\n      var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);\n      if (endsAfter || span.from == endCh && marker.type == \"bookmark\" && (!isInsert || span.marker.insertLeft)) {\n        var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh);\n        (nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,\n                                              span.to == null ? null : span.to - endCh));\n      }\n    }\n    return nw;\n  }\n\n  // Given a change object, compute the new set of marker spans that\n  // cover the line in which the change took place. Removes spans\n  // entirely within the change, reconnects spans belonging to the\n  // same marker that appear on both sides of the change, and cuts off\n  // spans partially within the change. Returns an array of span\n  // arrays with one element for each line in (after) the change.\n  function stretchSpansOverChange(doc, change) {\n    var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;\n    var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;\n    if (!oldFirst && !oldLast) return null;\n\n    var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0;\n    // Get the spans that 'stick out' on both sides\n    var first = markedSpansBefore(oldFirst, startCh, isInsert);\n    var last = markedSpansAfter(oldLast, endCh, isInsert);\n\n    // Next, merge those two ends\n    var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);\n    if (first) {\n      // Fix up .to properties of first\n      for (var i = 0; i < first.length; ++i) {\n        var span = first[i];\n        if (span.to == null) {\n          var found = getMarkedSpanFor(last, span.marker);\n          if (!found) span.to = startCh;\n          else if (sameLine) span.to = found.to == null ? null : found.to + offset;\n        }\n      }\n    }\n    if (last) {\n      // Fix up .from in last (or move them into first in case of sameLine)\n      for (var i = 0; i < last.length; ++i) {\n        var span = last[i];\n        if (span.to != null) span.to += offset;\n        if (span.from == null) {\n          var found = getMarkedSpanFor(first, span.marker);\n          if (!found) {\n            span.from = offset;\n            if (sameLine) (first || (first = [])).push(span);\n          }\n        } else {\n          span.from += offset;\n          if (sameLine) (first || (first = [])).push(span);\n        }\n      }\n    }\n    // Make sure we didn't create any zero-length spans\n    if (first) first = clearEmptySpans(first);\n    if (last && last != first) last = clearEmptySpans(last);\n\n    var newMarkers = [first];\n    if (!sameLine) {\n      // Fill gap with whole-line-spans\n      var gap = change.text.length - 2, gapMarkers;\n      if (gap > 0 && first)\n        for (var i = 0; i < first.length; ++i)\n          if (first[i].to == null)\n            (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i].marker, null, null));\n      for (var i = 0; i < gap; ++i)\n        newMarkers.push(gapMarkers);\n      newMarkers.push(last);\n    }\n    return newMarkers;\n  }\n\n  // Remove spans that are empty and don't have a clearWhenEmpty\n  // option of false.\n  function clearEmptySpans(spans) {\n    for (var i = 0; i < spans.length; ++i) {\n      var span = spans[i];\n      if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)\n        spans.splice(i--, 1);\n    }\n    if (!spans.length) return null;\n    return spans;\n  }\n\n  // Used for un/re-doing changes from the history. Combines the\n  // result of computing the existing spans with the set of spans that\n  // existed in the history (so that deleting around a span and then\n  // undoing brings back the span).\n  function mergeOldSpans(doc, change) {\n    var old = getOldSpans(doc, change);\n    var stretched = stretchSpansOverChange(doc, change);\n    if (!old) return stretched;\n    if (!stretched) return old;\n\n    for (var i = 0; i < old.length; ++i) {\n      var oldCur = old[i], stretchCur = stretched[i];\n      if (oldCur && stretchCur) {\n        spans: for (var j = 0; j < stretchCur.length; ++j) {\n          var span = stretchCur[j];\n          for (var k = 0; k < oldCur.length; ++k)\n            if (oldCur[k].marker == span.marker) continue spans;\n          oldCur.push(span);\n        }\n      } else if (stretchCur) {\n        old[i] = stretchCur;\n      }\n    }\n    return old;\n  }\n\n  // Used to 'clip' out readOnly ranges when making a change.\n  function removeReadOnlyRanges(doc, from, to) {\n    var markers = null;\n    doc.iter(from.line, to.line + 1, function(line) {\n      if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) {\n        var mark = line.markedSpans[i].marker;\n        if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))\n          (markers || (markers = [])).push(mark);\n      }\n    });\n    if (!markers) return null;\n    var parts = [{from: from, to: to}];\n    for (var i = 0; i < markers.length; ++i) {\n      var mk = markers[i], m = mk.find(0);\n      for (var j = 0; j < parts.length; ++j) {\n        var p = parts[j];\n        if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) continue;\n        var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to);\n        if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)\n          newParts.push({from: p.from, to: m.from});\n        if (dto > 0 || !mk.inclusiveRight && !dto)\n          newParts.push({from: m.to, to: p.to});\n        parts.splice.apply(parts, newParts);\n        j += newParts.length - 1;\n      }\n    }\n    return parts;\n  }\n\n  // Connect or disconnect spans from a line.\n  function detachMarkedSpans(line) {\n    var spans = line.markedSpans;\n    if (!spans) return;\n    for (var i = 0; i < spans.length; ++i)\n      spans[i].marker.detachLine(line);\n    line.markedSpans = null;\n  }\n  function attachMarkedSpans(line, spans) {\n    if (!spans) return;\n    for (var i = 0; i < spans.length; ++i)\n      spans[i].marker.attachLine(line);\n    line.markedSpans = spans;\n  }\n\n  // Helpers used when computing which overlapping collapsed span\n  // counts as the larger one.\n  function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0; }\n  function extraRight(marker) { return marker.inclusiveRight ? 1 : 0; }\n\n  // Returns a number indicating which of two overlapping collapsed\n  // spans is larger (and thus includes the other). Falls back to\n  // comparing ids when the spans cover exactly the same range.\n  function compareCollapsedMarkers(a, b) {\n    var lenDiff = a.lines.length - b.lines.length;\n    if (lenDiff != 0) return lenDiff;\n    var aPos = a.find(), bPos = b.find();\n    var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);\n    if (fromCmp) return -fromCmp;\n    var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);\n    if (toCmp) return toCmp;\n    return b.id - a.id;\n  }\n\n  // Find out whether a line ends or starts in a collapsed span. If\n  // so, return the marker for that span.\n  function collapsedSpanAtSide(line, start) {\n    var sps = sawCollapsedSpans && line.markedSpans, found;\n    if (sps) for (var sp, i = 0; i < sps.length; ++i) {\n      sp = sps[i];\n      if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&\n          (!found || compareCollapsedMarkers(found, sp.marker) < 0))\n        found = sp.marker;\n    }\n    return found;\n  }\n  function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true); }\n  function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false); }\n\n  // Test whether there exists a collapsed span that partially\n  // overlaps (covers the start or end, but not both) of a new span.\n  // Such overlap is not allowed.\n  function conflictingCollapsedRange(doc, lineNo, from, to, marker) {\n    var line = getLine(doc, lineNo);\n    var sps = sawCollapsedSpans && line.markedSpans;\n    if (sps) for (var i = 0; i < sps.length; ++i) {\n      var sp = sps[i];\n      if (!sp.marker.collapsed) continue;\n      var found = sp.marker.find(0);\n      var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);\n      var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);\n      if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) continue;\n      if (fromCmp <= 0 && (cmp(found.to, from) > 0 || (sp.marker.inclusiveRight && marker.inclusiveLeft)) ||\n          fromCmp >= 0 && (cmp(found.from, to) < 0 || (sp.marker.inclusiveLeft && marker.inclusiveRight)))\n        return true;\n    }\n  }\n\n  // A visual line is a line as drawn on the screen. Folding, for\n  // example, can cause multiple logical lines to appear on the same\n  // visual line. This finds the start of the visual line that the\n  // given line is part of (usually that is the line itself).\n  function visualLine(line) {\n    var merged;\n    while (merged = collapsedSpanAtStart(line))\n      line = merged.find(-1, true).line;\n    return line;\n  }\n\n  // Returns an array of logical lines that continue the visual line\n  // started by the argument, or undefined if there are no such lines.\n  function visualLineContinued(line) {\n    var merged, lines;\n    while (merged = collapsedSpanAtEnd(line)) {\n      line = merged.find(1, true).line;\n      (lines || (lines = [])).push(line);\n    }\n    return lines;\n  }\n\n  // Get the line number of the start of the visual line that the\n  // given line number is part of.\n  function visualLineNo(doc, lineN) {\n    var line = getLine(doc, lineN), vis = visualLine(line);\n    if (line == vis) return lineN;\n    return lineNo(vis);\n  }\n  // Get the line number of the start of the next visual line after\n  // the given line.\n  function visualLineEndNo(doc, lineN) {\n    if (lineN > doc.lastLine()) return lineN;\n    var line = getLine(doc, lineN), merged;\n    if (!lineIsHidden(doc, line)) return lineN;\n    while (merged = collapsedSpanAtEnd(line))\n      line = merged.find(1, true).line;\n    return lineNo(line) + 1;\n  }\n\n  // Compute whether a line is hidden. Lines count as hidden when they\n  // are part of a visual line that starts with another line, or when\n  // they are entirely covered by collapsed, non-widget span.\n  function lineIsHidden(doc, line) {\n    var sps = sawCollapsedSpans && line.markedSpans;\n    if (sps) for (var sp, i = 0; i < sps.length; ++i) {\n      sp = sps[i];\n      if (!sp.marker.collapsed) continue;\n      if (sp.from == null) return true;\n      if (sp.marker.widgetNode) continue;\n      if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))\n        return true;\n    }\n  }\n  function lineIsHiddenInner(doc, line, span) {\n    if (span.to == null) {\n      var end = span.marker.find(1, true);\n      return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker));\n    }\n    if (span.marker.inclusiveRight && span.to == line.text.length)\n      return true;\n    for (var sp, i = 0; i < line.markedSpans.length; ++i) {\n      sp = line.markedSpans[i];\n      if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&\n          (sp.to == null || sp.to != span.from) &&\n          (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&\n          lineIsHiddenInner(doc, line, sp)) return true;\n    }\n  }\n\n  // LINE WIDGETS\n\n  // Line widgets are block elements displayed above or below a line.\n\n  var LineWidget = CodeMirror.LineWidget = function(cm, node, options) {\n    if (options) for (var opt in options) if (options.hasOwnProperty(opt))\n      this[opt] = options[opt];\n    this.cm = cm;\n    this.node = node;\n  };\n  eventMixin(LineWidget);\n\n  function adjustScrollWhenAboveVisible(cm, line, diff) {\n    if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))\n      addToScrollPos(cm, null, diff);\n  }\n\n  LineWidget.prototype.clear = function() {\n    var cm = this.cm, ws = this.line.widgets, line = this.line, no = lineNo(line);\n    if (no == null || !ws) return;\n    for (var i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1);\n    if (!ws.length) line.widgets = null;\n    var height = widgetHeight(this);\n    runInOp(cm, function() {\n      adjustScrollWhenAboveVisible(cm, line, -height);\n      regLineChange(cm, no, \"widget\");\n      updateLineHeight(line, Math.max(0, line.height - height));\n    });\n  };\n  LineWidget.prototype.changed = function() {\n    var oldH = this.height, cm = this.cm, line = this.line;\n    this.height = null;\n    var diff = widgetHeight(this) - oldH;\n    if (!diff) return;\n    runInOp(cm, function() {\n      cm.curOp.forceUpdate = true;\n      adjustScrollWhenAboveVisible(cm, line, diff);\n      updateLineHeight(line, line.height + diff);\n    });\n  };\n\n  function widgetHeight(widget) {\n    if (widget.height != null) return widget.height;\n    if (!contains(document.body, widget.node)) {\n      var parentStyle = \"position: relative;\";\n      if (widget.coverGutter)\n        parentStyle += \"margin-left: -\" + widget.cm.getGutterElement().offsetWidth + \"px;\";\n      removeChildrenAndAdd(widget.cm.display.measure, elt(\"div\", [widget.node], null, parentStyle));\n    }\n    return widget.height = widget.node.offsetHeight;\n  }\n\n  function addLineWidget(cm, handle, node, options) {\n    var widget = new LineWidget(cm, node, options);\n    if (widget.noHScroll) cm.display.alignWidgets = true;\n    changeLine(cm.doc, handle, \"widget\", function(line) {\n      var widgets = line.widgets || (line.widgets = []);\n      if (widget.insertAt == null) widgets.push(widget);\n      else widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget);\n      widget.line = line;\n      if (!lineIsHidden(cm.doc, line)) {\n        var aboveVisible = heightAtLine(line) < cm.doc.scrollTop;\n        updateLineHeight(line, line.height + widgetHeight(widget));\n        if (aboveVisible) addToScrollPos(cm, null, widget.height);\n        cm.curOp.forceUpdate = true;\n      }\n      return true;\n    });\n    return widget;\n  }\n\n  // LINE DATA STRUCTURE\n\n  // Line objects. These hold state related to a line, including\n  // highlighting info (the styles array).\n  var Line = CodeMirror.Line = function(text, markedSpans, estimateHeight) {\n    this.text = text;\n    attachMarkedSpans(this, markedSpans);\n    this.height = estimateHeight ? estimateHeight(this) : 1;\n  };\n  eventMixin(Line);\n  Line.prototype.lineNo = function() { return lineNo(this); };\n\n  // Change the content (text, markers) of a line. Automatically\n  // invalidates cached information and tries to re-estimate the\n  // line's height.\n  function updateLine(line, text, markedSpans, estimateHeight) {\n    line.text = text;\n    if (line.stateAfter) line.stateAfter = null;\n    if (line.styles) line.styles = null;\n    if (line.order != null) line.order = null;\n    detachMarkedSpans(line);\n    attachMarkedSpans(line, markedSpans);\n    var estHeight = estimateHeight ? estimateHeight(line) : 1;\n    if (estHeight != line.height) updateLineHeight(line, estHeight);\n  }\n\n  // Detach a line from the document tree and its markers.\n  function cleanUpLine(line) {\n    line.parent = null;\n    detachMarkedSpans(line);\n  }\n\n  function extractLineClasses(type, output) {\n    if (type) for (;;) {\n      var lineClass = type.match(/(?:^|\\s+)line-(background-)?(\\S+)/);\n      if (!lineClass) break;\n      type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);\n      var prop = lineClass[1] ? \"bgClass\" : \"textClass\";\n      if (output[prop] == null)\n        output[prop] = lineClass[2];\n      else if (!(new RegExp(\"(?:^|\\s)\" + lineClass[2] + \"(?:$|\\s)\")).test(output[prop]))\n        output[prop] += \" \" + lineClass[2];\n    }\n    return type;\n  }\n\n  function callBlankLine(mode, state) {\n    if (mode.blankLine) return mode.blankLine(state);\n    if (!mode.innerMode) return;\n    var inner = CodeMirror.innerMode(mode, state);\n    if (inner.mode.blankLine) return inner.mode.blankLine(inner.state);\n  }\n\n  function readToken(mode, stream, state) {\n    for (var i = 0; i < 10; i++) {\n      var style = mode.token(stream, state);\n      if (stream.pos > stream.start) return style;\n    }\n    throw new Error(\"Mode \" + mode.name + \" failed to advance stream.\");\n  }\n\n  // Run the given mode's parser over a line, calling f for each token.\n  function runMode(cm, text, mode, state, f, lineClasses, forceToEnd) {\n    var flattenSpans = mode.flattenSpans;\n    if (flattenSpans == null) flattenSpans = cm.options.flattenSpans;\n    var curStart = 0, curStyle = null;\n    var stream = new StringStream(text, cm.options.tabSize), style;\n    if (text == \"\") extractLineClasses(callBlankLine(mode, state), lineClasses);\n    while (!stream.eol()) {\n      if (stream.pos > cm.options.maxHighlightLength) {\n        flattenSpans = false;\n        if (forceToEnd) processLine(cm, text, state, stream.pos);\n        stream.pos = text.length;\n        style = null;\n      } else {\n        style = extractLineClasses(readToken(mode, stream, state), lineClasses);\n      }\n      if (cm.options.addModeClass) {\n        var mName = CodeMirror.innerMode(mode, state).mode.name;\n        if (mName) style = \"m-\" + (style ? mName + \" \" + style : mName);\n      }\n      if (!flattenSpans || curStyle != style) {\n        if (curStart < stream.start) f(stream.start, curStyle);\n        curStart = stream.start; curStyle = style;\n      }\n      stream.start = stream.pos;\n    }\n    while (curStart < stream.pos) {\n      // Webkit seems to refuse to render text nodes longer than 57444 characters\n      var pos = Math.min(stream.pos, curStart + 50000);\n      f(pos, curStyle);\n      curStart = pos;\n    }\n  }\n\n  // Compute a style array (an array starting with a mode generation\n  // -- for invalidation -- followed by pairs of end positions and\n  // style strings), which is used to highlight the tokens on the\n  // line.\n  function highlightLine(cm, line, state, forceToEnd) {\n    // A styles array always starts with a number identifying the\n    // mode/overlays that it is based on (for easy invalidation).\n    var st = [cm.state.modeGen], lineClasses = {};\n    // Compute the base array of styles\n    runMode(cm, line.text, cm.doc.mode, state, function(end, style) {\n      st.push(end, style);\n    }, lineClasses, forceToEnd);\n\n    // Run overlays, adjust style array.\n    for (var o = 0; o < cm.state.overlays.length; ++o) {\n      var overlay = cm.state.overlays[o], i = 1, at = 0;\n      runMode(cm, line.text, overlay.mode, true, function(end, style) {\n        var start = i;\n        // Ensure there's a token end at the current position, and that i points at it\n        while (at < end) {\n          var i_end = st[i];\n          if (i_end > end)\n            st.splice(i, 1, end, st[i+1], i_end);\n          i += 2;\n          at = Math.min(end, i_end);\n        }\n        if (!style) return;\n        if (overlay.opaque) {\n          st.splice(start, i - start, end, \"cm-overlay \" + style);\n          i = start + 2;\n        } else {\n          for (; start < i; start += 2) {\n            var cur = st[start+1];\n            st[start+1] = (cur ? cur + \" \" : \"\") + \"cm-overlay \" + style;\n          }\n        }\n      }, lineClasses);\n    }\n\n    return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null};\n  }\n\n  function getLineStyles(cm, line) {\n    if (!line.styles || line.styles[0] != cm.state.modeGen) {\n      var result = highlightLine(cm, line, line.stateAfter = getStateBefore(cm, lineNo(line)));\n      line.styles = result.styles;\n      if (result.classes) line.styleClasses = result.classes;\n      else if (line.styleClasses) line.styleClasses = null;\n    }\n    return line.styles;\n  }\n\n  // Lightweight form of highlight -- proceed over this line and\n  // update state, but don't save a style array. Used for lines that\n  // aren't currently visible.\n  function processLine(cm, text, state, startAt) {\n    var mode = cm.doc.mode;\n    var stream = new StringStream(text, cm.options.tabSize);\n    stream.start = stream.pos = startAt || 0;\n    if (text == \"\") callBlankLine(mode, state);\n    while (!stream.eol() && stream.pos <= cm.options.maxHighlightLength) {\n      readToken(mode, stream, state);\n      stream.start = stream.pos;\n    }\n  }\n\n  // Convert a style as returned by a mode (either null, or a string\n  // containing one or more styles) to a CSS style. This is cached,\n  // and also looks for line-wide styles.\n  var styleToClassCache = {}, styleToClassCacheWithMode = {};\n  function interpretTokenStyle(style, options) {\n    if (!style || /^\\s*$/.test(style)) return null;\n    var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;\n    return cache[style] ||\n      (cache[style] = style.replace(/\\S+/g, \"cm-$&\"));\n  }\n\n  // Render the DOM representation of the text of a line. Also builds\n  // up a 'line map', which points at the DOM nodes that represent\n  // specific stretches of text, and is used by the measuring code.\n  // The returned object contains the DOM node, this map, and\n  // information about line-wide styles that were set by the mode.\n  function buildLineContent(cm, lineView) {\n    // The padding-right forces the element to have a 'border', which\n    // is needed on Webkit to be able to get line-level bounding\n    // rectangles for it (in measureChar).\n    var content = elt(\"span\", null, null, webkit ? \"padding-right: .1px\" : null);\n    var builder = {pre: elt(\"pre\", [content]), content: content, col: 0, pos: 0, cm: cm};\n    lineView.measure = {};\n\n    // Iterate over the logical lines that make up this visual line.\n    for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {\n      var line = i ? lineView.rest[i - 1] : lineView.line, order;\n      builder.pos = 0;\n      builder.addToken = buildToken;\n      // Optionally wire in some hacks into the token-rendering\n      // algorithm, to deal with browser quirks.\n      if ((ie || webkit) && cm.getOption(\"lineWrapping\"))\n        builder.addToken = buildTokenSplitSpaces(builder.addToken);\n      if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line)))\n        builder.addToken = buildTokenBadBidi(builder.addToken, order);\n      builder.map = [];\n      insertLineContent(line, builder, getLineStyles(cm, line));\n      if (line.styleClasses) {\n        if (line.styleClasses.bgClass)\n          builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || \"\");\n        if (line.styleClasses.textClass)\n          builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || \"\");\n      }\n\n      // Ensure at least a single node is present, for measuring.\n      if (builder.map.length == 0)\n        builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure)));\n\n      // Store the map and a cache object for the current logical line\n      if (i == 0) {\n        lineView.measure.map = builder.map;\n        lineView.measure.cache = {};\n      } else {\n        (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map);\n        (lineView.measure.caches || (lineView.measure.caches = [])).push({});\n      }\n    }\n\n    signal(cm, \"renderLine\", cm, lineView.line, builder.pre);\n    if (builder.pre.className)\n      builder.textClass = joinClasses(builder.pre.className, builder.textClass || \"\");\n    return builder;\n  }\n\n  function defaultSpecialCharPlaceholder(ch) {\n    var token = elt(\"span\", \"\\u2022\", \"cm-invalidchar\");\n    token.title = \"\\\\u\" + ch.charCodeAt(0).toString(16);\n    return token;\n  }\n\n  // Build up the DOM representation for a single token, and add it to\n  // the line map. Takes care to render special characters separately.\n  function buildToken(builder, text, style, startStyle, endStyle, title) {\n    if (!text) return;\n    var special = builder.cm.options.specialChars, mustWrap = false;\n    if (!special.test(text)) {\n      builder.col += text.length;\n      var content = document.createTextNode(text);\n      builder.map.push(builder.pos, builder.pos + text.length, content);\n      if (ie && ie_version < 9) mustWrap = true;\n      builder.pos += text.length;\n    } else {\n      var content = document.createDocumentFragment(), pos = 0;\n      while (true) {\n        special.lastIndex = pos;\n        var m = special.exec(text);\n        var skipped = m ? m.index - pos : text.length - pos;\n        if (skipped) {\n          var txt = document.createTextNode(text.slice(pos, pos + skipped));\n          if (ie && ie_version < 9) content.appendChild(elt(\"span\", [txt]));\n          else content.appendChild(txt);\n          builder.map.push(builder.pos, builder.pos + skipped, txt);\n          builder.col += skipped;\n          builder.pos += skipped;\n        }\n        if (!m) break;\n        pos += skipped + 1;\n        if (m[0] == \"\\t\") {\n          var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;\n          var txt = content.appendChild(elt(\"span\", spaceStr(tabWidth), \"cm-tab\"));\n          builder.col += tabWidth;\n        } else {\n          var txt = builder.cm.options.specialCharPlaceholder(m[0]);\n          if (ie && ie_version < 9) content.appendChild(elt(\"span\", [txt]));\n          else content.appendChild(txt);\n          builder.col += 1;\n        }\n        builder.map.push(builder.pos, builder.pos + 1, txt);\n        builder.pos++;\n      }\n    }\n    if (style || startStyle || endStyle || mustWrap) {\n      var fullStyle = style || \"\";\n      if (startStyle) fullStyle += startStyle;\n      if (endStyle) fullStyle += endStyle;\n      var token = elt(\"span\", [content], fullStyle);\n      if (title) token.title = title;\n      return builder.content.appendChild(token);\n    }\n    builder.content.appendChild(content);\n  }\n\n  function buildTokenSplitSpaces(inner) {\n    function split(old) {\n      var out = \" \";\n      for (var i = 0; i < old.length - 2; ++i) out += i % 2 ? \" \" : \"\\u00a0\";\n      out += \" \";\n      return out;\n    }\n    return function(builder, text, style, startStyle, endStyle, title) {\n      inner(builder, text.replace(/ {3,}/g, split), style, startStyle, endStyle, title);\n    };\n  }\n\n  // Work around nonsense dimensions being reported for stretches of\n  // right-to-left text.\n  function buildTokenBadBidi(inner, order) {\n    return function(builder, text, style, startStyle, endStyle, title) {\n      style = style ? style + \" cm-force-border\" : \"cm-force-border\";\n      var start = builder.pos, end = start + text.length;\n      for (;;) {\n        // Find the part that overlaps with the start of this text\n        for (var i = 0; i < order.length; i++) {\n          var part = order[i];\n          if (part.to > start && part.from <= start) break;\n        }\n        if (part.to >= end) return inner(builder, text, style, startStyle, endStyle, title);\n        inner(builder, text.slice(0, part.to - start), style, startStyle, null, title);\n        startStyle = null;\n        text = text.slice(part.to - start);\n        start = part.to;\n      }\n    };\n  }\n\n  function buildCollapsedSpan(builder, size, marker, ignoreWidget) {\n    var widget = !ignoreWidget && marker.widgetNode;\n    if (widget) {\n      builder.map.push(builder.pos, builder.pos + size, widget);\n      builder.content.appendChild(widget);\n    }\n    builder.pos += size;\n  }\n\n  // Outputs a number of spans to make up a line, taking highlighting\n  // and marked text into account.\n  function insertLineContent(line, builder, styles) {\n    var spans = line.markedSpans, allText = line.text, at = 0;\n    if (!spans) {\n      for (var i = 1; i < styles.length; i+=2)\n        builder.addToken(builder, allText.slice(at, at = styles[i]), interpretTokenStyle(styles[i+1], builder.cm.options));\n      return;\n    }\n\n    var len = allText.length, pos = 0, i = 1, text = \"\", style;\n    var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, title, collapsed;\n    for (;;) {\n      if (nextChange == pos) { // Update current marker set\n        spanStyle = spanEndStyle = spanStartStyle = title = \"\";\n        collapsed = null; nextChange = Infinity;\n        var foundBookmarks = [];\n        for (var j = 0; j < spans.length; ++j) {\n          var sp = spans[j], m = sp.marker;\n          if (sp.from <= pos && (sp.to == null || sp.to > pos)) {\n            if (sp.to != null && nextChange > sp.to) { nextChange = sp.to; spanEndStyle = \"\"; }\n            if (m.className) spanStyle += \" \" + m.className;\n            if (m.startStyle && sp.from == pos) spanStartStyle += \" \" + m.startStyle;\n            if (m.endStyle && sp.to == nextChange) spanEndStyle += \" \" + m.endStyle;\n            if (m.title && !title) title = m.title;\n            if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))\n              collapsed = sp;\n          } else if (sp.from > pos && nextChange > sp.from) {\n            nextChange = sp.from;\n          }\n          if (m.type == \"bookmark\" && sp.from == pos && m.widgetNode) foundBookmarks.push(m);\n        }\n        if (collapsed && (collapsed.from || 0) == pos) {\n          buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,\n                             collapsed.marker, collapsed.from == null);\n          if (collapsed.to == null) return;\n        }\n        if (!collapsed && foundBookmarks.length) for (var j = 0; j < foundBookmarks.length; ++j)\n          buildCollapsedSpan(builder, 0, foundBookmarks[j]);\n      }\n      if (pos >= len) break;\n\n      var upto = Math.min(len, nextChange);\n      while (true) {\n        if (text) {\n          var end = pos + text.length;\n          if (!collapsed) {\n            var tokenText = end > upto ? text.slice(0, upto - pos) : text;\n            builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,\n                             spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : \"\", title);\n          }\n          if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;}\n          pos = end;\n          spanStartStyle = \"\";\n        }\n        text = allText.slice(at, at = styles[i++]);\n        style = interpretTokenStyle(styles[i++], builder.cm.options);\n      }\n    }\n  }\n\n  // DOCUMENT DATA STRUCTURE\n\n  // By default, updates that start and end at the beginning of a line\n  // are treated specially, in order to make the association of line\n  // widgets and marker elements with the text behave more intuitive.\n  function isWholeLineUpdate(doc, change) {\n    return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == \"\" &&\n      (!doc.cm || doc.cm.options.wholeLineUpdateBefore);\n  }\n\n  // Perform a change on the document data structure.\n  function updateDoc(doc, change, markedSpans, estimateHeight) {\n    function spansFor(n) {return markedSpans ? markedSpans[n] : null;}\n    function update(line, text, spans) {\n      updateLine(line, text, spans, estimateHeight);\n      signalLater(line, \"change\", line, change);\n    }\n\n    var from = change.from, to = change.to, text = change.text;\n    var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);\n    var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;\n\n    // Adjust the line structure\n    if (isWholeLineUpdate(doc, change)) {\n      // This is a whole-line replace. Treated specially to make\n      // sure line objects move the way they are supposed to.\n      for (var i = 0, added = []; i < text.length - 1; ++i)\n        added.push(new Line(text[i], spansFor(i), estimateHeight));\n      update(lastLine, lastLine.text, lastSpans);\n      if (nlines) doc.remove(from.line, nlines);\n      if (added.length) doc.insert(from.line, added);\n    } else if (firstLine == lastLine) {\n      if (text.length == 1) {\n        update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);\n      } else {\n        for (var added = [], i = 1; i < text.length - 1; ++i)\n          added.push(new Line(text[i], spansFor(i), estimateHeight));\n        added.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight));\n        update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n        doc.insert(from.line + 1, added);\n      }\n    } else if (text.length == 1) {\n      update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));\n      doc.remove(from.line + 1, nlines);\n    } else {\n      update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n      update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);\n      for (var i = 1, added = []; i < text.length - 1; ++i)\n        added.push(new Line(text[i], spansFor(i), estimateHeight));\n      if (nlines > 1) doc.remove(from.line + 1, nlines - 1);\n      doc.insert(from.line + 1, added);\n    }\n\n    signalLater(doc, \"change\", doc, change);\n  }\n\n  // The document is represented as a BTree consisting of leaves, with\n  // chunk of lines in them, and branches, with up to ten leaves or\n  // other branch nodes below them. The top node is always a branch\n  // node, and is the document object itself (meaning it has\n  // additional methods and properties).\n  //\n  // All nodes have parent links. The tree is used both to go from\n  // line numbers to line objects, and to go from objects to numbers.\n  // It also indexes by height, and is used to convert between height\n  // and line object, and to find the total height of the document.\n  //\n  // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html\n\n  function LeafChunk(lines) {\n    this.lines = lines;\n    this.parent = null;\n    for (var i = 0, height = 0; i < lines.length; ++i) {\n      lines[i].parent = this;\n      height += lines[i].height;\n    }\n    this.height = height;\n  }\n\n  LeafChunk.prototype = {\n    chunkSize: function() { return this.lines.length; },\n    // Remove the n lines at offset 'at'.\n    removeInner: function(at, n) {\n      for (var i = at, e = at + n; i < e; ++i) {\n        var line = this.lines[i];\n        this.height -= line.height;\n        cleanUpLine(line);\n        signalLater(line, \"delete\");\n      }\n      this.lines.splice(at, n);\n    },\n    // Helper used to collapse a small branch into a single leaf.\n    collapse: function(lines) {\n      lines.push.apply(lines, this.lines);\n    },\n    // Insert the given array of lines at offset 'at', count them as\n    // having the given height.\n    insertInner: function(at, lines, height) {\n      this.height += height;\n      this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));\n      for (var i = 0; i < lines.length; ++i) lines[i].parent = this;\n    },\n    // Used to iterate over a part of the tree.\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\n  function BranchChunk(children) {\n    this.children = children;\n    var size = 0, height = 0;\n    for (var i = 0; i < children.length; ++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\n  BranchChunk.prototype = {\n    chunkSize: function() { return this.size; },\n    removeInner: function(at, n) {\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.removeInner(at, rm);\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 the result is smaller than 25 lines, ensure that it is a\n      // single leaf node.\n      if (this.size - n < 25 &&\n          (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) {\n        var lines = [];\n        this.collapse(lines);\n        this.children = [new LeafChunk(lines)];\n        this.children[0].parent = this;\n      }\n    },\n    collapse: function(lines) {\n      for (var i = 0; i < this.children.length; ++i) this.children[i].collapse(lines);\n    },\n    insertInner: function(at, lines, height) {\n      this.size += lines.length;\n      this.height += height;\n      for (var i = 0; i < this.children.length; ++i) {\n        var child = this.children[i], sz = child.chunkSize();\n        if (at <= sz) {\n          child.insertInner(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    // When a node has grown, check whether it should be split.\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    iterN: function(at, n, op) {\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 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  var nextDocId = 0;\n  var Doc = CodeMirror.Doc = function(text, mode, firstLine) {\n    if (!(this instanceof Doc)) return new Doc(text, mode, firstLine);\n    if (firstLine == null) firstLine = 0;\n\n    BranchChunk.call(this, [new LeafChunk([new Line(\"\", null)])]);\n    this.first = firstLine;\n    this.scrollTop = this.scrollLeft = 0;\n    this.cantEdit = false;\n    this.cleanGeneration = 1;\n    this.frontier = firstLine;\n    var start = Pos(firstLine, 0);\n    this.sel = simpleSelection(start);\n    this.history = new History(null);\n    this.id = ++nextDocId;\n    this.modeOption = mode;\n\n    if (typeof text == \"string\") text = splitLines(text);\n    updateDoc(this, {from: start, to: start, text: text});\n    setSelection(this, simpleSelection(start), sel_dontScroll);\n  };\n\n  Doc.prototype = createObj(BranchChunk.prototype, {\n    constructor: Doc,\n    // Iterate over the document. Supports two forms -- with only one\n    // argument, it calls that for each line in the document. With\n    // three, it iterates over the range given by the first two (with\n    // the second being non-inclusive).\n    iter: function(from, to, op) {\n      if (op) this.iterN(from - this.first, to - from, op);\n      else this.iterN(this.first, this.first + this.size, from);\n    },\n\n    // Non-public interface for adding and removing lines.\n    insert: function(at, lines) {\n      var height = 0;\n      for (var i = 0; i < lines.length; ++i) height += lines[i].height;\n      this.insertInner(at - this.first, lines, height);\n    },\n    remove: function(at, n) { this.removeInner(at - this.first, n); },\n\n    // From here, the methods are part of the public interface. Most\n    // are also available from CodeMirror (editor) instances.\n\n    getValue: function(lineSep) {\n      var lines = getLines(this, this.first, this.first + this.size);\n      if (lineSep === false) return lines;\n      return lines.join(lineSep || \"\\n\");\n    },\n    setValue: docMethodOp(function(code) {\n      var top = Pos(this.first, 0), last = this.first + this.size - 1;\n      makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),\n                        text: splitLines(code), origin: \"setValue\"}, true);\n      setSelection(this, simpleSelection(top));\n    }),\n    replaceRange: function(code, from, to, origin) {\n      from = clipPos(this, from);\n      to = to ? clipPos(this, to) : from;\n      replaceRange(this, code, from, to, origin);\n    },\n    getRange: function(from, to, lineSep) {\n      var lines = getBetween(this, clipPos(this, from), clipPos(this, to));\n      if (lineSep === false) return lines;\n      return lines.join(lineSep || \"\\n\");\n    },\n\n    getLine: function(line) {var l = this.getLineHandle(line); return l && l.text;},\n\n    getLineHandle: function(line) {if (isLine(this, line)) return getLine(this, line);},\n    getLineNumber: function(line) {return lineNo(line);},\n\n    getLineHandleVisualStart: function(line) {\n      if (typeof line == \"number\") line = getLine(this, line);\n      return visualLine(line);\n    },\n\n    lineCount: function() {return this.size;},\n    firstLine: function() {return this.first;},\n    lastLine: function() {return this.first + this.size - 1;},\n\n    clipPos: function(pos) {return clipPos(this, pos);},\n\n    getCursor: function(start) {\n      var range = this.sel.primary(), pos;\n      if (start == null || start == \"head\") pos = range.head;\n      else if (start == \"anchor\") pos = range.anchor;\n      else if (start == \"end\" || start == \"to\" || start === false) pos = range.to();\n      else pos = range.from();\n      return pos;\n    },\n    listSelections: function() { return this.sel.ranges; },\n    somethingSelected: function() {return this.sel.somethingSelected();},\n\n    setCursor: docMethodOp(function(line, ch, options) {\n      setSimpleSelection(this, clipPos(this, typeof line == \"number\" ? Pos(line, ch || 0) : line), null, options);\n    }),\n    setSelection: docMethodOp(function(anchor, head, options) {\n      setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options);\n    }),\n    extendSelection: docMethodOp(function(head, other, options) {\n      extendSelection(this, clipPos(this, head), other && clipPos(this, other), options);\n    }),\n    extendSelections: docMethodOp(function(heads, options) {\n      extendSelections(this, clipPosArray(this, heads, options));\n    }),\n    extendSelectionsBy: docMethodOp(function(f, options) {\n      extendSelections(this, map(this.sel.ranges, f), options);\n    }),\n    setSelections: docMethodOp(function(ranges, primary, options) {\n      if (!ranges.length) return;\n      for (var i = 0, out = []; i < ranges.length; i++)\n        out[i] = new Range(clipPos(this, ranges[i].anchor),\n                           clipPos(this, ranges[i].head));\n      if (primary == null) primary = Math.min(ranges.length - 1, this.sel.primIndex);\n      setSelection(this, normalizeSelection(out, primary), options);\n    }),\n    addSelection: docMethodOp(function(anchor, head, options) {\n      var ranges = this.sel.ranges.slice(0);\n      ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)));\n      setSelection(this, normalizeSelection(ranges, ranges.length - 1), options);\n    }),\n\n    getSelection: function(lineSep) {\n      var ranges = this.sel.ranges, lines;\n      for (var i = 0; i < ranges.length; i++) {\n        var sel = getBetween(this, ranges[i].from(), ranges[i].to());\n        lines = lines ? lines.concat(sel) : sel;\n      }\n      if (lineSep === false) return lines;\n      else return lines.join(lineSep || \"\\n\");\n    },\n    getSelections: function(lineSep) {\n      var parts = [], ranges = this.sel.ranges;\n      for (var i = 0; i < ranges.length; i++) {\n        var sel = getBetween(this, ranges[i].from(), ranges[i].to());\n        if (lineSep !== false) sel = sel.join(lineSep || \"\\n\");\n        parts[i] = sel;\n      }\n      return parts;\n    },\n    replaceSelection: function(code, collapse, origin) {\n      var dup = [];\n      for (var i = 0; i < this.sel.ranges.length; i++)\n        dup[i] = code;\n      this.replaceSelections(dup, collapse, origin || \"+input\");\n    },\n    replaceSelections: docMethodOp(function(code, collapse, origin) {\n      var changes = [], sel = this.sel;\n      for (var i = 0; i < sel.ranges.length; i++) {\n        var range = sel.ranges[i];\n        changes[i] = {from: range.from(), to: range.to(), text: splitLines(code[i]), origin: origin};\n      }\n      var newSel = collapse && collapse != \"end\" && computeReplacedSel(this, changes, collapse);\n      for (var i = changes.length - 1; i >= 0; i--)\n        makeChange(this, changes[i]);\n      if (newSel) setSelectionReplaceHistory(this, newSel);\n      else if (this.cm) ensureCursorVisible(this.cm);\n    }),\n    undo: docMethodOp(function() {makeChangeFromHistory(this, \"undo\");}),\n    redo: docMethodOp(function() {makeChangeFromHistory(this, \"redo\");}),\n    undoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"undo\", true);}),\n    redoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"redo\", true);}),\n\n    setExtending: function(val) {this.extend = val;},\n    getExtending: function() {return this.extend;},\n\n    historySize: function() {\n      var hist = this.history, done = 0, undone = 0;\n      for (var i = 0; i < hist.done.length; i++) if (!hist.done[i].ranges) ++done;\n      for (var i = 0; i < hist.undone.length; i++) if (!hist.undone[i].ranges) ++undone;\n      return {undo: done, redo: undone};\n    },\n    clearHistory: function() {this.history = new History(this.history.maxGeneration);},\n\n    markClean: function() {\n      this.cleanGeneration = this.changeGeneration(true);\n    },\n    changeGeneration: function(forceSplit) {\n      if (forceSplit)\n        this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null;\n      return this.history.generation;\n    },\n    isClean: function (gen) {\n      return this.history.generation == (gen || this.cleanGeneration);\n    },\n\n    getHistory: function() {\n      return {done: copyHistoryArray(this.history.done),\n              undone: copyHistoryArray(this.history.undone)};\n    },\n    setHistory: function(histData) {\n      var hist = this.history = new History(this.history.maxGeneration);\n      hist.done = copyHistoryArray(histData.done.slice(0), null, true);\n      hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);\n    },\n\n    addLineClass: docMethodOp(function(handle, where, cls) {\n      return changeLine(this, handle, \"class\", function(line) {\n        var prop = where == \"text\" ? \"textClass\" : where == \"background\" ? \"bgClass\" : \"wrapClass\";\n        if (!line[prop]) line[prop] = cls;\n        else if (new RegExp(\"(?:^|\\\\s)\" + cls + \"(?:$|\\\\s)\").test(line[prop])) return false;\n        else line[prop] += \" \" + cls;\n        return true;\n      });\n    }),\n    removeLineClass: docMethodOp(function(handle, where, cls) {\n      return changeLine(this, handle, \"class\", function(line) {\n        var prop = where == \"text\" ? \"textClass\" : where == \"background\" ? \"bgClass\" : \"wrapClass\";\n        var cur = line[prop];\n        if (!cur) return false;\n        else if (cls == null) line[prop] = null;\n        else {\n          var found = cur.match(new RegExp(\"(?:^|\\\\s+)\" + cls + \"(?:$|\\\\s+)\"));\n          if (!found) return false;\n          var end = found.index + found[0].length;\n          line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? \"\" : \" \") + cur.slice(end) || null;\n        }\n        return true;\n      });\n    }),\n\n    markText: function(from, to, options) {\n      return markText(this, clipPos(this, from), clipPos(this, to), options, \"range\");\n    },\n    setBookmark: function(pos, options) {\n      var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),\n                      insertLeft: options && options.insertLeft,\n                      clearWhenEmpty: false, shared: options && options.shared};\n      pos = clipPos(this, pos);\n      return markText(this, pos, pos, realOpts, \"bookmark\");\n    },\n    findMarksAt: function(pos) {\n      pos = clipPos(this, pos);\n      var markers = [], spans = getLine(this, pos.line).markedSpans;\n      if (spans) for (var i = 0; i < spans.length; ++i) {\n        var span = spans[i];\n        if ((span.from == null || span.from <= pos.ch) &&\n            (span.to == null || span.to >= pos.ch))\n          markers.push(span.marker.parent || span.marker);\n      }\n      return markers;\n    },\n    findMarks: function(from, to, filter) {\n      from = clipPos(this, from); to = clipPos(this, to);\n      var found = [], lineNo = from.line;\n      this.iter(from.line, to.line + 1, function(line) {\n        var spans = line.markedSpans;\n        if (spans) for (var i = 0; i < spans.length; i++) {\n          var span = spans[i];\n          if (!(lineNo == from.line && from.ch > span.to ||\n                span.from == null && lineNo != from.line||\n                lineNo == to.line && span.from > to.ch) &&\n              (!filter || filter(span.marker)))\n            found.push(span.marker.parent || span.marker);\n        }\n        ++lineNo;\n      });\n      return found;\n    },\n    getAllMarks: function() {\n      var markers = [];\n      this.iter(function(line) {\n        var sps = line.markedSpans;\n        if (sps) for (var i = 0; i < sps.length; ++i)\n          if (sps[i].from != null) markers.push(sps[i].marker);\n      });\n      return markers;\n    },\n\n    posFromIndex: function(off) {\n      var ch, lineNo = this.first;\n      this.iter(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(this, Pos(lineNo, ch));\n    },\n    indexFromPos: function (coords) {\n      coords = clipPos(this, coords);\n      var index = coords.ch;\n      if (coords.line < this.first || coords.ch < 0) return 0;\n      this.iter(this.first, coords.line, function (line) {\n        index += line.text.length + 1;\n      });\n      return index;\n    },\n\n    copy: function(copyHistory) {\n      var doc = new Doc(getLines(this, this.first, this.first + this.size), this.modeOption, this.first);\n      doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;\n      doc.sel = this.sel;\n      doc.extend = false;\n      if (copyHistory) {\n        doc.history.undoDepth = this.history.undoDepth;\n        doc.setHistory(this.getHistory());\n      }\n      return doc;\n    },\n\n    linkedDoc: function(options) {\n      if (!options) options = {};\n      var from = this.first, to = this.first + this.size;\n      if (options.from != null && options.from > from) from = options.from;\n      if (options.to != null && options.to < to) to = options.to;\n      var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from);\n      if (options.sharedHist) copy.history = this.history;\n      (this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});\n      copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];\n      copySharedMarkers(copy, findSharedMarkers(this));\n      return copy;\n    },\n    unlinkDoc: function(other) {\n      if (other instanceof CodeMirror) other = other.doc;\n      if (this.linked) for (var i = 0; i < this.linked.length; ++i) {\n        var link = this.linked[i];\n        if (link.doc != other) continue;\n        this.linked.splice(i, 1);\n        other.unlinkDoc(this);\n        detachSharedMarkers(findSharedMarkers(this));\n        break;\n      }\n      // If the histories were shared, split them again\n      if (other.history == this.history) {\n        var splitIds = [other.id];\n        linkedDocs(other, function(doc) {splitIds.push(doc.id);}, true);\n        other.history = new History(null);\n        other.history.done = copyHistoryArray(this.history.done, splitIds);\n        other.history.undone = copyHistoryArray(this.history.undone, splitIds);\n      }\n    },\n    iterLinkedDocs: function(f) {linkedDocs(this, f);},\n\n    getMode: function() {return this.mode;},\n    getEditor: function() {return this.cm;}\n  });\n\n  // Public alias.\n  Doc.prototype.eachLine = Doc.prototype.iter;\n\n  // Set up methods on CodeMirror's prototype to redirect to the editor's document.\n  var dontDelegate = \"iter insert remove copy getEditor\".split(\" \");\n  for (var prop in Doc.prototype) if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)\n    CodeMirror.prototype[prop] = (function(method) {\n      return function() {return method.apply(this.doc, arguments);};\n    })(Doc.prototype[prop]);\n\n  eventMixin(Doc);\n\n  // Call f for all linked documents.\n  function linkedDocs(doc, f, sharedHistOnly) {\n    function propagate(doc, skip, sharedHist) {\n      if (doc.linked) for (var i = 0; i < doc.linked.length; ++i) {\n        var rel = doc.linked[i];\n        if (rel.doc == skip) continue;\n        var shared = sharedHist && rel.sharedHist;\n        if (sharedHistOnly && !shared) continue;\n        f(rel.doc, shared);\n        propagate(rel.doc, doc, shared);\n      }\n    }\n    propagate(doc, null, true);\n  }\n\n  // Attach a document to an editor.\n  function attachDoc(cm, doc) {\n    if (doc.cm) throw new Error(\"This document is already in use.\");\n    cm.doc = doc;\n    doc.cm = cm;\n    estimateLineHeights(cm);\n    loadMode(cm);\n    if (!cm.options.lineWrapping) findMaxLine(cm);\n    cm.options.mode = doc.modeOption;\n    regChange(cm);\n  }\n\n  // LINE UTILITIES\n\n  // Find the line object corresponding to the given line number.\n  function getLine(doc, n) {\n    n -= doc.first;\n    if (n < 0 || n >= doc.size) throw new Error(\"There is no line \" + (n + doc.first) + \" in the document.\");\n    for (var chunk = doc; !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\n  // Get the part of a document between two positions, as an array of\n  // strings.\n  function getBetween(doc, start, end) {\n    var out = [], n = start.line;\n    doc.iter(start.line, end.line + 1, function(line) {\n      var text = line.text;\n      if (n == end.line) text = text.slice(0, end.ch);\n      if (n == start.line) text = text.slice(start.ch);\n      out.push(text);\n      ++n;\n    });\n    return out;\n  }\n  // Get the lines between from and to, as array of strings.\n  function getLines(doc, from, to) {\n    var out = [];\n    doc.iter(from, to, function(line) { out.push(line.text); });\n    return out;\n  }\n\n  // Update the height of a line, propagating the height change\n  // upwards to parent nodes.\n  function updateLineHeight(line, height) {\n    var diff = height - line.height;\n    if (diff) for (var n = line; n; n = n.parent) n.height += diff;\n  }\n\n  // Given a line object, find its line number by walking up through\n  // its parent links.\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;; ++i) {\n        if (chunk.children[i] == cur) break;\n        no += chunk.children[i].chunkSize();\n      }\n    }\n    return no + cur.first;\n  }\n\n  // Find the line at the given vertical position, using the height\n  // information in the document tree.\n  function lineAtHeight(chunk, h) {\n    var n = chunk.first;\n    outer: do {\n      for (var i = 0; i < chunk.children.length; ++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; i < chunk.lines.length; ++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\n\n  // Find the height above the given line.\n  function heightAtLine(lineObj) {\n    lineObj = visualLine(lineObj);\n\n    var h = 0, chunk = lineObj.parent;\n    for (var i = 0; i < chunk.lines.length; ++i) {\n      var line = chunk.lines[i];\n      if (line == lineObj) break;\n      else h += line.height;\n    }\n    for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {\n      for (var i = 0; i < p.children.length; ++i) {\n        var cur = p.children[i];\n        if (cur == chunk) break;\n        else h += cur.height;\n      }\n    }\n    return h;\n  }\n\n  // Get the bidi ordering for the given line (and cache it). Returns\n  // false for lines that are fully left-to-right, and an array of\n  // BidiSpan objects otherwise.\n  function getOrder(line) {\n    var order = line.order;\n    if (order == null) order = line.order = bidiOrdering(line.text);\n    return order;\n  }\n\n  // HISTORY\n\n  function History(startGen) {\n    // Arrays of change events and selections. Doing something adds an\n    // event to done and clears undo. Undoing moves events from done\n    // to undone, redoing moves them in the other direction.\n    this.done = []; this.undone = [];\n    this.undoDepth = Infinity;\n    // Used to track when changes can be merged into a single undo\n    // event\n    this.lastModTime = this.lastSelTime = 0;\n    this.lastOp = this.lastSelOp = null;\n    this.lastOrigin = this.lastSelOrigin = null;\n    // Used by the isClean() method\n    this.generation = this.maxGeneration = startGen || 1;\n  }\n\n  // Create a history change event from an updateDoc-style change\n  // object.\n  function historyChangeFromChange(doc, change) {\n    var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)};\n    attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);\n    linkedDocs(doc, function(doc) {attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);}, true);\n    return histChange;\n  }\n\n  // Pop all selection events off the end of a history array. Stop at\n  // a change event.\n  function clearSelectionEvents(array) {\n    while (array.length) {\n      var last = lst(array);\n      if (last.ranges) array.pop();\n      else break;\n    }\n  }\n\n  // Find the top change event in the history. Pop off selection\n  // events that are in the way.\n  function lastChangeEvent(hist, force) {\n    if (force) {\n      clearSelectionEvents(hist.done);\n      return lst(hist.done);\n    } else if (hist.done.length && !lst(hist.done).ranges) {\n      return lst(hist.done);\n    } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {\n      hist.done.pop();\n      return lst(hist.done);\n    }\n  }\n\n  // Register a change in the history. Merges changes that are within\n  // a single operation, ore are close together with an origin that\n  // allows merging (starting with \"+\") into a single event.\n  function addChangeToHistory(doc, change, selAfter, opId) {\n    var hist = doc.history;\n    hist.undone.length = 0;\n    var time = +new Date, cur;\n\n    if ((hist.lastOp == opId ||\n         hist.lastOrigin == change.origin && change.origin &&\n         ((change.origin.charAt(0) == \"+\" && doc.cm && hist.lastModTime > time - doc.cm.options.historyEventDelay) ||\n          change.origin.charAt(0) == \"*\")) &&\n        (cur = lastChangeEvent(hist, hist.lastOp == opId))) {\n      // Merge this change into the last event\n      var last = lst(cur.changes);\n      if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {\n        // Optimized case for simple insertion -- don't want to add\n        // new changesets for every character typed\n        last.to = changeEnd(change);\n      } else {\n        // Add new sub-event\n        cur.changes.push(historyChangeFromChange(doc, change));\n      }\n    } else {\n      // Can not be merged, start a new event.\n      var before = lst(hist.done);\n      if (!before || !before.ranges)\n        pushSelectionToHistory(doc.sel, hist.done);\n      cur = {changes: [historyChangeFromChange(doc, change)],\n             generation: hist.generation};\n      hist.done.push(cur);\n      while (hist.done.length > hist.undoDepth) {\n        hist.done.shift();\n        if (!hist.done[0].ranges) hist.done.shift();\n      }\n    }\n    hist.done.push(selAfter);\n    hist.generation = ++hist.maxGeneration;\n    hist.lastModTime = hist.lastSelTime = time;\n    hist.lastOp = hist.lastSelOp = opId;\n    hist.lastOrigin = hist.lastSelOrigin = change.origin;\n\n    if (!last) signal(doc, \"historyAdded\");\n  }\n\n  function selectionEventCanBeMerged(doc, origin, prev, sel) {\n    var ch = origin.charAt(0);\n    return ch == \"*\" ||\n      ch == \"+\" &&\n      prev.ranges.length == sel.ranges.length &&\n      prev.somethingSelected() == sel.somethingSelected() &&\n      new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500);\n  }\n\n  // Called whenever the selection changes, sets the new selection as\n  // the pending selection in the history, and pushes the old pending\n  // selection into the 'done' array when it was significantly\n  // different (in number of selected ranges, emptiness, or time).\n  function addSelectionToHistory(doc, sel, opId, options) {\n    var hist = doc.history, origin = options && options.origin;\n\n    // A new event is started when the previous origin does not match\n    // the current, or the origins don't allow matching. Origins\n    // starting with * are always merged, those starting with + are\n    // merged when similar and close together in time.\n    if (opId == hist.lastSelOp ||\n        (origin && hist.lastSelOrigin == origin &&\n         (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||\n          selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))\n      hist.done[hist.done.length - 1] = sel;\n    else\n      pushSelectionToHistory(sel, hist.done);\n\n    hist.lastSelTime = +new Date;\n    hist.lastSelOrigin = origin;\n    hist.lastSelOp = opId;\n    if (options && options.clearRedo !== false)\n      clearSelectionEvents(hist.undone);\n  }\n\n  function pushSelectionToHistory(sel, dest) {\n    var top = lst(dest);\n    if (!(top && top.ranges && top.equals(sel)))\n      dest.push(sel);\n  }\n\n  // Used to store marked span information in the history.\n  function attachLocalSpans(doc, change, from, to) {\n    var existing = change[\"spans_\" + doc.id], n = 0;\n    doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function(line) {\n      if (line.markedSpans)\n        (existing || (existing = change[\"spans_\" + doc.id] = {}))[n] = line.markedSpans;\n      ++n;\n    });\n  }\n\n  // When un/re-doing restores text containing marked spans, those\n  // that have been explicitly cleared should not be restored.\n  function removeClearedSpans(spans) {\n    if (!spans) return null;\n    for (var i = 0, out; i < spans.length; ++i) {\n      if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i); }\n      else if (out) out.push(spans[i]);\n    }\n    return !out ? spans : out.length ? out : null;\n  }\n\n  // Retrieve and filter the old marked spans stored in a change event.\n  function getOldSpans(doc, change) {\n    var found = change[\"spans_\" + doc.id];\n    if (!found) return null;\n    for (var i = 0, nw = []; i < change.text.length; ++i)\n      nw.push(removeClearedSpans(found[i]));\n    return nw;\n  }\n\n  // Used both to provide a JSON-safe object in .getHistory, and, when\n  // detaching a document, to split the history in two\n  function copyHistoryArray(events, newGroup, instantiateSel) {\n    for (var i = 0, copy = []; i < events.length; ++i) {\n      var event = events[i];\n      if (event.ranges) {\n        copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event);\n        continue;\n      }\n      var changes = event.changes, newChanges = [];\n      copy.push({changes: newChanges});\n      for (var j = 0; j < changes.length; ++j) {\n        var change = changes[j], m;\n        newChanges.push({from: change.from, to: change.to, text: change.text});\n        if (newGroup) for (var prop in change) if (m = prop.match(/^spans_(\\d+)$/)) {\n          if (indexOf(newGroup, Number(m[1])) > -1) {\n            lst(newChanges)[prop] = change[prop];\n            delete change[prop];\n          }\n        }\n      }\n    }\n    return copy;\n  }\n\n  // Rebasing/resetting history to deal with externally-sourced changes\n\n  function rebaseHistSelSingle(pos, from, to, diff) {\n    if (to < pos.line) {\n      pos.line += diff;\n    } else if (from < pos.line) {\n      pos.line = from;\n      pos.ch = 0;\n    }\n  }\n\n  // Tries to rebase an array of history events given a change in the\n  // document. If the change touches the same lines as the event, the\n  // event, and everything 'behind' it, is discarded. If the change is\n  // before the event, the event's positions are updated. Uses a\n  // copy-on-write scheme for the positions, to avoid having to\n  // reallocate them all on every rebase, but also avoid problems with\n  // shared position objects being unsafely updated.\n  function rebaseHistArray(array, from, to, diff) {\n    for (var i = 0; i < array.length; ++i) {\n      var sub = array[i], ok = true;\n      if (sub.ranges) {\n        if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; }\n        for (var j = 0; j < sub.ranges.length; j++) {\n          rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff);\n          rebaseHistSelSingle(sub.ranges[j].head, from, to, diff);\n        }\n        continue;\n      }\n      for (var j = 0; j < sub.changes.length; ++j) {\n        var cur = sub.changes[j];\n        if (to < cur.from.line) {\n          cur.from = Pos(cur.from.line + diff, cur.from.ch);\n          cur.to = Pos(cur.to.line + diff, cur.to.ch);\n        } else if (from <= cur.to.line) {\n          ok = false;\n          break;\n        }\n      }\n      if (!ok) {\n        array.splice(0, i + 1);\n        i = 0;\n      }\n    }\n  }\n\n  function rebaseHist(hist, change) {\n    var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1;\n    rebaseHistArray(hist.done, from, to, diff);\n    rebaseHistArray(hist.undone, from, to, diff);\n  }\n\n  // EVENT UTILITIES\n\n  // Due to the fact that we still support jurassic IE versions, some\n  // compatibility wrappers are needed.\n\n  var e_preventDefault = CodeMirror.e_preventDefault = function(e) {\n    if (e.preventDefault) e.preventDefault();\n    else e.returnValue = false;\n  };\n  var e_stopPropagation = CodeMirror.e_stopPropagation = function(e) {\n    if (e.stopPropagation) e.stopPropagation();\n    else e.cancelBubble = true;\n  };\n  function e_defaultPrevented(e) {\n    return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false;\n  }\n  var e_stop = CodeMirror.e_stop = function(e) {e_preventDefault(e); e_stopPropagation(e);};\n\n  function e_target(e) {return e.target || e.srcElement;}\n  function e_button(e) {\n    var b = e.which;\n    if (b == null) {\n      if (e.button & 1) b = 1;\n      else if (e.button & 2) b = 3;\n      else if (e.button & 4) b = 2;\n    }\n    if (mac && e.ctrlKey && b == 1) b = 3;\n    return b;\n  }\n\n  // EVENT HANDLING\n\n  // Lightweight event framework. on/off also work on DOM nodes,\n  // registering native DOM handlers.\n\n  var on = CodeMirror.on = function(emitter, type, f) {\n    if (emitter.addEventListener)\n      emitter.addEventListener(type, f, false);\n    else if (emitter.attachEvent)\n      emitter.attachEvent(\"on\" + type, f);\n    else {\n      var map = emitter._handlers || (emitter._handlers = {});\n      var arr = map[type] || (map[type] = []);\n      arr.push(f);\n    }\n  };\n\n  var off = CodeMirror.off = function(emitter, type, f) {\n    if (emitter.removeEventListener)\n      emitter.removeEventListener(type, f, false);\n    else if (emitter.detachEvent)\n      emitter.detachEvent(\"on\" + type, f);\n    else {\n      var arr = emitter._handlers && emitter._handlers[type];\n      if (!arr) return;\n      for (var i = 0; i < arr.length; ++i)\n        if (arr[i] == f) { arr.splice(i, 1); break; }\n    }\n  };\n\n  var signal = CodeMirror.signal = function(emitter, type /*, values...*/) {\n    var arr = emitter._handlers && emitter._handlers[type];\n    if (!arr) return;\n    var args = Array.prototype.slice.call(arguments, 2);\n    for (var i = 0; i < arr.length; ++i) arr[i].apply(null, args);\n  };\n\n  var orphanDelayedCallbacks = null;\n\n  // Often, we want to signal events at a point where we are in the\n  // middle of some work, but don't want the handler to start calling\n  // other methods on the editor, which might be in an inconsistent\n  // state or simply not expect any other events to happen.\n  // signalLater looks whether there are any handlers, and schedules\n  // them to be executed when the last operation ends, or, if no\n  // operation is active, when a timeout fires.\n  function signalLater(emitter, type /*, values...*/) {\n    var arr = emitter._handlers && emitter._handlers[type];\n    if (!arr) return;\n    var args = Array.prototype.slice.call(arguments, 2), list;\n    if (operationGroup) {\n      list = operationGroup.delayedCallbacks;\n    } else if (orphanDelayedCallbacks) {\n      list = orphanDelayedCallbacks;\n    } else {\n      list = orphanDelayedCallbacks = [];\n      setTimeout(fireOrphanDelayed, 0);\n    }\n    function bnd(f) {return function(){f.apply(null, args);};};\n    for (var i = 0; i < arr.length; ++i)\n      list.push(bnd(arr[i]));\n  }\n\n  function fireOrphanDelayed() {\n    var delayed = orphanDelayedCallbacks;\n    orphanDelayedCallbacks = null;\n    for (var i = 0; i < delayed.length; ++i) delayed[i]();\n  }\n\n  // The DOM events that CodeMirror handles can be overridden by\n  // registering a (non-DOM) handler on the editor for the event name,\n  // and preventDefault-ing the event in that handler.\n  function signalDOMEvent(cm, e, override) {\n    signal(cm, override || e.type, cm, e);\n    return e_defaultPrevented(e) || e.codemirrorIgnore;\n  }\n\n  function signalCursorActivity(cm) {\n    var arr = cm._handlers && cm._handlers.cursorActivity;\n    if (!arr) return;\n    var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);\n    for (var i = 0; i < arr.length; ++i) if (indexOf(set, arr[i]) == -1)\n      set.push(arr[i]);\n  }\n\n  function hasHandler(emitter, type) {\n    var arr = emitter._handlers && emitter._handlers[type];\n    return arr && arr.length > 0;\n  }\n\n  // Add on and off methods to a constructor's prototype, to make\n  // registering events on such objects more convenient.\n  function eventMixin(ctor) {\n    ctor.prototype.on = function(type, f) {on(this, type, f);};\n    ctor.prototype.off = function(type, f) {off(this, type, f);};\n  }\n\n  // MISC UTILITIES\n\n  // Number of pixels added to scroller and sizer to hide scrollbar\n  var scrollerCutOff = 30;\n\n  // Returned or thrown by various protocols to signal 'I'm not\n  // handling this'.\n  var Pass = CodeMirror.Pass = {toString: function(){return \"CodeMirror.Pass\";}};\n\n  // Reused option objects for setSelection & friends\n  var sel_dontScroll = {scroll: false}, sel_mouse = {origin: \"*mouse\"}, sel_move = {origin: \"+move\"};\n\n  function Delayed() {this.id = null;}\n  Delayed.prototype.set = function(ms, f) {\n    clearTimeout(this.id);\n    this.id = setTimeout(f, ms);\n  };\n\n  // Counts the column offset in a string, taking tabs into account.\n  // Used mostly to find indentation.\n  var countColumn = CodeMirror.countColumn = function(string, end, tabSize, startIndex, startValue) {\n    if (end == null) {\n      end = string.search(/[^\\s\\u00a0]/);\n      if (end == -1) end = string.length;\n    }\n    for (var i = startIndex || 0, n = startValue || 0;;) {\n      var nextTab = string.indexOf(\"\\t\", i);\n      if (nextTab < 0 || nextTab >= end)\n        return n + (end - i);\n      n += nextTab - i;\n      n += tabSize - (n % tabSize);\n      i = nextTab + 1;\n    }\n  };\n\n  // The inverse of countColumn -- find the offset that corresponds to\n  // a particular column.\n  function findColumn(string, goal, tabSize) {\n    for (var pos = 0, col = 0;;) {\n      var nextTab = string.indexOf(\"\\t\", pos);\n      if (nextTab == -1) nextTab = string.length;\n      var skipped = nextTab - pos;\n      if (nextTab == string.length || col + skipped >= goal)\n        return pos + Math.min(skipped, goal - col);\n      col += nextTab - pos;\n      col += tabSize - (col % tabSize);\n      pos = nextTab + 1;\n      if (col >= goal) return pos;\n    }\n  }\n\n  var spaceStrs = [\"\"];\n  function spaceStr(n) {\n    while (spaceStrs.length <= n)\n      spaceStrs.push(lst(spaceStrs) + \" \");\n    return spaceStrs[n];\n  }\n\n  function lst(arr) { return arr[arr.length-1]; }\n\n  var selectInput = function(node) { node.select(); };\n  if (ios) // Mobile Safari apparently has a bug where select() is broken.\n    selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; };\n  else if (ie) // Suppress mysterious IE10 errors\n    selectInput = function(node) { try { node.select(); } catch(_e) {} };\n\n  function indexOf(array, elt) {\n    for (var i = 0; i < array.length; ++i)\n      if (array[i] == elt) return i;\n    return -1;\n  }\n  if ([].indexOf) indexOf = function(array, elt) { return array.indexOf(elt); };\n  function map(array, f) {\n    var out = [];\n    for (var i = 0; i < array.length; i++) out[i] = f(array[i], i);\n    return out;\n  }\n  if ([].map) map = function(array, f) { return array.map(f); };\n\n  function createObj(base, props) {\n    var inst;\n    if (Object.create) {\n      inst = Object.create(base);\n    } else {\n      var ctor = function() {};\n      ctor.prototype = base;\n      inst = new ctor();\n    }\n    if (props) copyObj(props, inst);\n    return inst;\n  };\n\n  function copyObj(obj, target, overwrite) {\n    if (!target) target = {};\n    for (var prop in obj)\n      if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))\n        target[prop] = obj[prop];\n    return target;\n  }\n\n  function bind(f) {\n    var args = Array.prototype.slice.call(arguments, 1);\n    return function(){return f.apply(null, args);};\n  }\n\n  var nonASCIISingleCaseWordChar = /[\\u00df\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/;\n  var isWordCharBasic = CodeMirror.isWordChar = function(ch) {\n    return /\\w/.test(ch) || ch > \"\\x80\" &&\n      (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch));\n  };\n  function isWordChar(ch, helper) {\n    if (!helper) return isWordCharBasic(ch);\n    if (helper.source.indexOf(\"\\\\w\") > -1 && isWordCharBasic(ch)) return true;\n    return helper.test(ch);\n  }\n\n  function isEmpty(obj) {\n    for (var n in obj) if (obj.hasOwnProperty(n) && obj[n]) return false;\n    return true;\n  }\n\n  // Extending unicode characters. A series of a non-extending char +\n  // any number of extending chars is treated as a single unit as far\n  // as editing and measuring is concerned. This is not fully correct,\n  // since some scripts/fonts/browsers also treat other configurations\n  // of code points as a group.\n  var extendingChars = /[\\u0300-\\u036f\\u0483-\\u0489\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u065e\\u0670\\u06d6-\\u06dc\\u06de-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07eb-\\u07f3\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0900-\\u0902\\u093c\\u0941-\\u0948\\u094d\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09bc\\u09be\\u09c1-\\u09c4\\u09cd\\u09d7\\u09e2\\u09e3\\u0a01\\u0a02\\u0a3c\\u0a41\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a70\\u0a71\\u0a75\\u0a81\\u0a82\\u0abc\\u0ac1-\\u0ac5\\u0ac7\\u0ac8\\u0acd\\u0ae2\\u0ae3\\u0b01\\u0b3c\\u0b3e\\u0b3f\\u0b41-\\u0b44\\u0b4d\\u0b56\\u0b57\\u0b62\\u0b63\\u0b82\\u0bbe\\u0bc0\\u0bcd\\u0bd7\\u0c3e-\\u0c40\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0cbc\\u0cbf\\u0cc2\\u0cc6\\u0ccc\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0d3e\\u0d41-\\u0d44\\u0d4d\\u0d57\\u0d62\\u0d63\\u0dca\\u0dcf\\u0dd2-\\u0dd4\\u0dd6\\u0ddf\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9\\u0ebb\\u0ebc\\u0ec8-\\u0ecd\\u0f18\\u0f19\\u0f35\\u0f37\\u0f39\\u0f71-\\u0f7e\\u0f80-\\u0f84\\u0f86\\u0f87\\u0f90-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102d-\\u1030\\u1032-\\u1037\\u1039\\u103a\\u103d\\u103e\\u1058\\u1059\\u105e-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108d\\u109d\\u135f\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b7-\\u17bd\\u17c6\\u17c9-\\u17d3\\u17dd\\u180b-\\u180d\\u18a9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193b\\u1a17\\u1a18\\u1a56\\u1a58-\\u1a5e\\u1a60\\u1a62\\u1a65-\\u1a6c\\u1a73-\\u1a7c\\u1a7f\\u1b00-\\u1b03\\u1b34\\u1b36-\\u1b3a\\u1b3c\\u1b42\\u1b6b-\\u1b73\\u1b80\\u1b81\\u1ba2-\\u1ba5\\u1ba8\\u1ba9\\u1c2c-\\u1c33\\u1c36\\u1c37\\u1cd0-\\u1cd2\\u1cd4-\\u1ce0\\u1ce2-\\u1ce8\\u1ced\\u1dc0-\\u1de6\\u1dfd-\\u1dff\\u200c\\u200d\\u20d0-\\u20f0\\u2cef-\\u2cf1\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\ua66f-\\ua672\\ua67c\\ua67d\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua825\\ua826\\ua8c4\\ua8e0-\\ua8f1\\ua926-\\ua92d\\ua947-\\ua951\\ua980-\\ua982\\ua9b3\\ua9b6-\\ua9b9\\ua9bc\\uaa29-\\uaa2e\\uaa31\\uaa32\\uaa35\\uaa36\\uaa43\\uaa4c\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uabe5\\uabe8\\uabed\\udc00-\\udfff\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe26\\uff9e\\uff9f]/;\n  function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch); }\n\n  // DOM UTILITIES\n\n  function elt(tag, content, className, style) {\n    var e = document.createElement(tag);\n    if (className) e.className = className;\n    if (style) e.style.cssText = style;\n    if (typeof content == \"string\") e.appendChild(document.createTextNode(content));\n    else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]);\n    return e;\n  }\n\n  var range;\n  if (document.createRange) range = function(node, start, end) {\n    var r = document.createRange();\n    r.setEnd(node, end);\n    r.setStart(node, start);\n    return r;\n  };\n  else range = function(node, start, end) {\n    var r = document.body.createTextRange();\n    r.moveToElementText(node.parentNode);\n    r.collapse(true);\n    r.moveEnd(\"character\", end);\n    r.moveStart(\"character\", start);\n    return r;\n  };\n\n  function removeChildren(e) {\n    for (var count = e.childNodes.length; count > 0; --count)\n      e.removeChild(e.firstChild);\n    return e;\n  }\n\n  function removeChildrenAndAdd(parent, e) {\n    return removeChildren(parent).appendChild(e);\n  }\n\n  function contains(parent, child) {\n    if (parent.contains)\n      return parent.contains(child);\n    while (child = child.parentNode)\n      if (child == parent) return true;\n  }\n\n  function activeElt() { return document.activeElement; }\n  // Older versions of IE throws unspecified error when touching\n  // document.activeElement in some cases (during loading, in iframe)\n  if (ie && ie_version < 11) activeElt = function() {\n    try { return document.activeElement; }\n    catch(e) { return document.body; }\n  };\n\n  function classTest(cls) { return new RegExp(\"\\\\b\" + cls + \"\\\\b\\\\s*\"); }\n  function rmClass(node, cls) {\n    var test = classTest(cls);\n    if (test.test(node.className)) node.className = node.className.replace(test, \"\");\n  }\n  function addClass(node, cls) {\n    if (!classTest(cls).test(node.className)) node.className += \" \" + cls;\n  }\n  function joinClasses(a, b) {\n    var as = a.split(\" \");\n    for (var i = 0; i < as.length; i++)\n      if (as[i] && !classTest(as[i]).test(b)) b += \" \" + as[i];\n    return b;\n  }\n\n  // WINDOW-WIDE EVENTS\n\n  // These must be handled carefully, because naively registering a\n  // handler for each editor will cause the editors to never be\n  // garbage collected.\n\n  function forEachCodeMirror(f) {\n    if (!document.body.getElementsByClassName) return;\n    var byClass = document.body.getElementsByClassName(\"CodeMirror\");\n    for (var i = 0; i < byClass.length; i++) {\n      var cm = byClass[i].CodeMirror;\n      if (cm) f(cm);\n    }\n  }\n\n  var globalsRegistered = false;\n  function ensureGlobalHandlers() {\n    if (globalsRegistered) return;\n    registerGlobalHandlers();\n    globalsRegistered = true;\n  }\n  function registerGlobalHandlers() {\n    // When the window resizes, we need to refresh active editors.\n    var resizeTimer;\n    on(window, \"resize\", function() {\n      if (resizeTimer == null) resizeTimer = setTimeout(function() {\n        resizeTimer = null;\n        knownScrollbarWidth = null;\n        forEachCodeMirror(onResize);\n      }, 100);\n    });\n    // When the window loses focus, we want to show the editor as blurred\n    on(window, \"blur\", function() {\n      forEachCodeMirror(onBlur);\n    });\n  }\n\n  // FEATURE DETECTION\n\n  // Detect drag-and-drop\n  var dragAndDrop = function() {\n    // There is *some* kind of drag-and-drop support in IE6-8, but I\n    // couldn't get it to work yet.\n    if (ie && ie_version < 9) return false;\n    var div = elt('div');\n    return \"draggable\" in div || \"dragDrop\" in div;\n  }();\n\n  var knownScrollbarWidth;\n  function scrollbarWidth(measure) {\n    if (knownScrollbarWidth != null) return knownScrollbarWidth;\n    var test = elt(\"div\", null, null, \"width: 50px; height: 50px; overflow-x: scroll\");\n    removeChildrenAndAdd(measure, test);\n    if (test.offsetWidth)\n      knownScrollbarWidth = test.offsetHeight - test.clientHeight;\n    return knownScrollbarWidth || 0;\n  }\n\n  var zwspSupported;\n  function zeroWidthElement(measure) {\n    if (zwspSupported == null) {\n      var test = elt(\"span\", \"\\u200b\");\n      removeChildrenAndAdd(measure, elt(\"span\", [test, document.createTextNode(\"x\")]));\n      if (measure.firstChild.offsetHeight != 0)\n        zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8);\n    }\n    if (zwspSupported) return elt(\"span\", \"\\u200b\");\n    else return elt(\"span\", \"\\u00a0\", null, \"display: inline-block; width: 1px; margin-right: -1px\");\n  }\n\n  // Feature-detect IE's crummy client rect reporting for bidi text\n  var badBidiRects;\n  function hasBadBidiRects(measure) {\n    if (badBidiRects != null) return badBidiRects;\n    var txt = removeChildrenAndAdd(measure, document.createTextNode(\"A\\u062eA\"));\n    var r0 = range(txt, 0, 1).getBoundingClientRect();\n    if (!r0 || r0.left == r0.right) return false; // Safari returns null in some cases (#2780)\n    var r1 = range(txt, 1, 2).getBoundingClientRect();\n    return badBidiRects = (r1.right - r0.right < 3);\n  }\n\n  // See if \"\".split is the broken IE version, if so, provide an\n  // alternative way to split lines.\n  var splitLines = CodeMirror.splitLines = \"\\n\\nb\".split(/\\n/).length != 3 ? function(string) {\n    var pos = 0, result = [], l = string.length;\n    while (pos <= l) {\n      var nl = string.indexOf(\"\\n\", pos);\n      if (nl == -1) nl = string.length;\n      var line = string.slice(pos, string.charAt(nl - 1) == \"\\r\" ? nl - 1 : nl);\n      var rt = line.indexOf(\"\\r\");\n      if (rt != -1) {\n        result.push(line.slice(0, rt));\n        pos += rt + 1;\n      } else {\n        result.push(line);\n        pos = nl + 1;\n      }\n    }\n    return result;\n  } : function(string){return string.split(/\\r\\n?|\\n/);};\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  var hasCopyEvent = (function() {\n    var e = elt(\"div\");\n    if (\"oncopy\" in e) return true;\n    e.setAttribute(\"oncopy\", \"return;\");\n    return typeof e.oncopy == \"function\";\n  })();\n\n  var badZoomedRects = null;\n  function hasBadZoomedRects(measure) {\n    if (badZoomedRects != null) return badZoomedRects;\n    var node = removeChildrenAndAdd(measure, elt(\"span\", \"x\"));\n    var normal = node.getBoundingClientRect();\n    var fromRange = range(node, 0, 1).getBoundingClientRect();\n    return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1;\n  }\n\n  // KEY NAMES\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: \";\", 61: \"=\", 91: \"Mod\", 92: \"Mod\", 93: \"Mod\", 107: \"=\", 109: \"-\", 127: \"Delete\",\n                  173: \"-\", 186: \";\", 187: \"=\", 188: \",\", 189: \"-\", 190: \".\", 191: \"/\", 192: \"`\", 219: \"[\", 220: \"\\\\\",\n                  221: \"]\", 222: \"'\", 63232: \"Up\", 63233: \"Down\", 63234: \"Left\", 63235: \"Right\", 63272: \"Delete\",\n                  63273: \"Home\", 63275: \"End\", 63276: \"PageUp\", 63277: \"PageDown\", 63302: \"Insert\"};\n  CodeMirror.keyNames = keyNames;\n  (function() {\n    // Number keys\n    for (var i = 0; i < 10; i++) keyNames[i + 48] = keyNames[i + 96] = 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  // BIDI HELPERS\n\n  function iterateBidiSections(order, from, to, f) {\n    if (!order) return f(from, to, \"ltr\");\n    var found = false;\n    for (var i = 0; i < order.length; ++i) {\n      var part = order[i];\n      if (part.from < to && part.to > from || from == to && part.to == from) {\n        f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? \"rtl\" : \"ltr\");\n        found = true;\n      }\n    }\n    if (!found) f(from, to, \"ltr\");\n  }\n\n  function bidiLeft(part) { return part.level % 2 ? part.to : part.from; }\n  function bidiRight(part) { return part.level % 2 ? part.from : part.to; }\n\n  function lineLeft(line) { var order = getOrder(line); return order ? bidiLeft(order[0]) : 0; }\n  function lineRight(line) {\n    var order = getOrder(line);\n    if (!order) return line.text.length;\n    return bidiRight(lst(order));\n  }\n\n  function lineStart(cm, lineN) {\n    var line = getLine(cm.doc, lineN);\n    var visual = visualLine(line);\n    if (visual != line) lineN = lineNo(visual);\n    var order = getOrder(visual);\n    var ch = !order ? 0 : order[0].level % 2 ? lineRight(visual) : lineLeft(visual);\n    return Pos(lineN, ch);\n  }\n  function lineEnd(cm, lineN) {\n    var merged, line = getLine(cm.doc, lineN);\n    while (merged = collapsedSpanAtEnd(line)) {\n      line = merged.find(1, true).line;\n      lineN = null;\n    }\n    var order = getOrder(line);\n    var ch = !order ? line.text.length : order[0].level % 2 ? lineLeft(line) : lineRight(line);\n    return Pos(lineN == null ? lineNo(line) : lineN, ch);\n  }\n  function lineStartSmart(cm, pos) {\n    var start = lineStart(cm, pos.line);\n    var line = getLine(cm.doc, start.line);\n    var order = getOrder(line);\n    if (!order || order[0].level == 0) {\n      var firstNonWS = Math.max(0, line.text.search(/\\S/));\n      var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch;\n      return Pos(start.line, inWS ? 0 : firstNonWS);\n    }\n    return start;\n  }\n\n  function compareBidiLevel(order, a, b) {\n    var linedir = order[0].level;\n    if (a == linedir) return true;\n    if (b == linedir) return false;\n    return a < b;\n  }\n  var bidiOther;\n  function getBidiPartAt(order, pos) {\n    bidiOther = null;\n    for (var i = 0, found; i < order.length; ++i) {\n      var cur = order[i];\n      if (cur.from < pos && cur.to > pos) return i;\n      if ((cur.from == pos || cur.to == pos)) {\n        if (found == null) {\n          found = i;\n        } else if (compareBidiLevel(order, cur.level, order[found].level)) {\n          if (cur.from != cur.to) bidiOther = found;\n          return i;\n        } else {\n          if (cur.from != cur.to) bidiOther = i;\n          return found;\n        }\n      }\n    }\n    return found;\n  }\n\n  function moveInLine(line, pos, dir, byUnit) {\n    if (!byUnit) return pos + dir;\n    do pos += dir;\n    while (pos > 0 && isExtendingChar(line.text.charAt(pos)));\n    return pos;\n  }\n\n  // This is needed in order to move 'visually' through bi-directional\n  // text -- i.e., pressing left should make the cursor go left, even\n  // when in RTL text. The tricky part is the 'jumps', where RTL and\n  // LTR text touch each other. This often requires the cursor offset\n  // to move more than one unit, in order to visually move one unit.\n  function moveVisually(line, start, dir, byUnit) {\n    var bidi = getOrder(line);\n    if (!bidi) return moveLogically(line, start, dir, byUnit);\n    var pos = getBidiPartAt(bidi, start), part = bidi[pos];\n    var target = moveInLine(line, start, part.level % 2 ? -dir : dir, byUnit);\n\n    for (;;) {\n      if (target > part.from && target < part.to) return target;\n      if (target == part.from || target == part.to) {\n        if (getBidiPartAt(bidi, target) == pos) return target;\n        part = bidi[pos += dir];\n        return (dir > 0) == part.level % 2 ? part.to : part.from;\n      } else {\n        part = bidi[pos += dir];\n        if (!part) return null;\n        if ((dir > 0) == part.level % 2)\n          target = moveInLine(line, part.to, -1, byUnit);\n        else\n          target = moveInLine(line, part.from, 1, byUnit);\n      }\n    }\n  }\n\n  function moveLogically(line, start, dir, byUnit) {\n    var target = start + dir;\n    if (byUnit) while (target > 0 && isExtendingChar(line.text.charAt(target))) target += dir;\n    return target < 0 || target > line.text.length ? null : target;\n  }\n\n  // Bidirectional ordering algorithm\n  // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm\n  // that this (partially) implements.\n\n  // One-char codes used for character types:\n  // L (L):   Left-to-Right\n  // R (R):   Right-to-Left\n  // r (AL):  Right-to-Left Arabic\n  // 1 (EN):  European Number\n  // + (ES):  European Number Separator\n  // % (ET):  European Number Terminator\n  // n (AN):  Arabic Number\n  // , (CS):  Common Number Separator\n  // m (NSM): Non-Spacing Mark\n  // b (BN):  Boundary Neutral\n  // s (B):   Paragraph Separator\n  // t (S):   Segment Separator\n  // w (WS):  Whitespace\n  // N (ON):  Other Neutrals\n\n  // Returns null if characters are ordered as they appear\n  // (left-to-right), or an array of sections ({from, to, level}\n  // objects) in the order in which they occur visually.\n  var bidiOrdering = (function() {\n    // Character types for codepoints 0 to 0xff\n    var lowTypes = \"bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN\";\n    // Character types for codepoints 0x600 to 0x6ff\n    var arabicTypes = \"rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm\";\n    function charType(code) {\n      if (code <= 0xf7) return lowTypes.charAt(code);\n      else if (0x590 <= code && code <= 0x5f4) return \"R\";\n      else if (0x600 <= code && code <= 0x6ed) return arabicTypes.charAt(code - 0x600);\n      else if (0x6ee <= code && code <= 0x8ac) return \"r\";\n      else if (0x2000 <= code && code <= 0x200b) return \"w\";\n      else if (code == 0x200c) return \"b\";\n      else return \"L\";\n    }\n\n    var bidiRE = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n    var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;\n    // Browsers seem to always treat the boundaries of block elements as being L.\n    var outerType = \"L\";\n\n    function BidiSpan(level, from, to) {\n      this.level = level;\n      this.from = from; this.to = to;\n    }\n\n    return function(str) {\n      if (!bidiRE.test(str)) return false;\n      var len = str.length, types = [];\n      for (var i = 0, type; i < len; ++i)\n        types.push(type = charType(str.charCodeAt(i)));\n\n      // W1. Examine each non-spacing mark (NSM) in the level run, and\n      // change the type of the NSM to the type of the previous\n      // character. If the NSM is at the start of the level run, it will\n      // get the type of sor.\n      for (var i = 0, prev = outerType; i < len; ++i) {\n        var type = types[i];\n        if (type == \"m\") types[i] = prev;\n        else prev = type;\n      }\n\n      // W2. Search backwards from each instance of a European number\n      // until the first strong type (R, L, AL, or sor) is found. If an\n      // AL is found, change the type of the European number to Arabic\n      // number.\n      // W3. Change all ALs to R.\n      for (var i = 0, cur = outerType; i < len; ++i) {\n        var type = types[i];\n        if (type == \"1\" && cur == \"r\") types[i] = \"n\";\n        else if (isStrong.test(type)) { cur = type; if (type == \"r\") types[i] = \"R\"; }\n      }\n\n      // W4. A single European separator between two European numbers\n      // changes to a European number. A single common separator between\n      // two numbers of the same type changes to that type.\n      for (var i = 1, prev = types[0]; i < len - 1; ++i) {\n        var type = types[i];\n        if (type == \"+\" && prev == \"1\" && types[i+1] == \"1\") types[i] = \"1\";\n        else if (type == \",\" && prev == types[i+1] &&\n                 (prev == \"1\" || prev == \"n\")) types[i] = prev;\n        prev = type;\n      }\n\n      // W5. A sequence of European terminators adjacent to European\n      // numbers changes to all European numbers.\n      // W6. Otherwise, separators and terminators change to Other\n      // Neutral.\n      for (var i = 0; i < len; ++i) {\n        var type = types[i];\n        if (type == \",\") types[i] = \"N\";\n        else if (type == \"%\") {\n          for (var end = i + 1; end < len && types[end] == \"%\"; ++end) {}\n          var replace = (i && types[i-1] == \"!\") || (end < len && types[end] == \"1\") ? \"1\" : \"N\";\n          for (var j = i; j < end; ++j) types[j] = replace;\n          i = end - 1;\n        }\n      }\n\n      // W7. Search backwards from each instance of a European number\n      // until the first strong type (R, L, or sor) is found. If an L is\n      // found, then change the type of the European number to L.\n      for (var i = 0, cur = outerType; i < len; ++i) {\n        var type = types[i];\n        if (cur == \"L\" && type == \"1\") types[i] = \"L\";\n        else if (isStrong.test(type)) cur = type;\n      }\n\n      // N1. A sequence of neutrals takes the direction of the\n      // surrounding strong text if the text on both sides has the same\n      // direction. European and Arabic numbers act as if they were R in\n      // terms of their influence on neutrals. Start-of-level-run (sor)\n      // and end-of-level-run (eor) are used at level run boundaries.\n      // N2. Any remaining neutrals take the embedding direction.\n      for (var i = 0; i < len; ++i) {\n        if (isNeutral.test(types[i])) {\n          for (var end = i + 1; end < len && isNeutral.test(types[end]); ++end) {}\n          var before = (i ? types[i-1] : outerType) == \"L\";\n          var after = (end < len ? types[end] : outerType) == \"L\";\n          var replace = before || after ? \"L\" : \"R\";\n          for (var j = i; j < end; ++j) types[j] = replace;\n          i = end - 1;\n        }\n      }\n\n      // Here we depart from the documented algorithm, in order to avoid\n      // building up an actual levels array. Since there are only three\n      // levels (0, 1, 2) in an implementation that doesn't take\n      // explicit embedding into account, we can build up the order on\n      // the fly, without following the level-based algorithm.\n      var order = [], m;\n      for (var i = 0; i < len;) {\n        if (countsAsLeft.test(types[i])) {\n          var start = i;\n          for (++i; i < len && countsAsLeft.test(types[i]); ++i) {}\n          order.push(new BidiSpan(0, start, i));\n        } else {\n          var pos = i, at = order.length;\n          for (++i; i < len && types[i] != \"L\"; ++i) {}\n          for (var j = pos; j < i;) {\n            if (countsAsNum.test(types[j])) {\n              if (pos < j) order.splice(at, 0, new BidiSpan(1, pos, j));\n              var nstart = j;\n              for (++j; j < i && countsAsNum.test(types[j]); ++j) {}\n              order.splice(at, 0, new BidiSpan(2, nstart, j));\n              pos = j;\n            } else ++j;\n          }\n          if (pos < i) order.splice(at, 0, new BidiSpan(1, pos, i));\n        }\n      }\n      if (order[0].level == 1 && (m = str.match(/^\\s+/))) {\n        order[0].from = m[0].length;\n        order.unshift(new BidiSpan(0, 0, m[0].length));\n      }\n      if (lst(order).level == 1 && (m = str.match(/\\s+$/))) {\n        lst(order).to -= m[0].length;\n        order.push(new BidiSpan(0, len - m[0].length, len));\n      }\n      if (order[0].level != lst(order).level)\n        order.push(new BidiSpan(order[0].level, len, len));\n\n      return order;\n    };\n  })();\n\n  // THE END\n\n  CodeMirror.version = \"4.7.0\";\n\n  return CodeMirror;\n});\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/codemirror/mode/javascript/javascript.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n// TODO actually recognize syntax of TypeScript constructs\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"javascript\", function(config, parserConfig) {\n  var indentUnit = config.indentUnit;\n  var statementIndent = parserConfig.statementIndent;\n  var jsonldMode = parserConfig.jsonld;\n  var jsonMode = parserConfig.json || jsonldMode;\n  var isTS = parserConfig.typescript;\n  var wordRE = parserConfig.wordCharacters || /[\\w$\\xa1-\\uffff]/;\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\n    var jsKeywords = {\n      \"if\": kw(\"if\"), \"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, \"debugger\": 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      \"this\": kw(\"this\"), \"module\": kw(\"module\"), \"class\": kw(\"class\"), \"super\": kw(\"atom\"),\n      \"yield\": C, \"export\": kw(\"export\"), \"import\": kw(\"import\"), \"extends\": C\n    };\n\n    // Extend the 'normal' keywords with the TypeScript language extensions\n    if (isTS) {\n      var type = {type: \"variable\", style: \"variable-3\"};\n      var tsKeywords = {\n        // object-like things\n        \"interface\": kw(\"interface\"),\n        \"extends\": kw(\"extends\"),\n        \"constructor\": kw(\"constructor\"),\n\n        // scope modifiers\n        \"public\": kw(\"public\"),\n        \"private\": kw(\"private\"),\n        \"protected\": kw(\"protected\"),\n        \"static\": kw(\"static\"),\n\n        // types\n        \"string\": type, \"number\": type, \"bool\": type, \"any\": type\n      };\n\n      for (var attr in tsKeywords) {\n        jsKeywords[attr] = tsKeywords[attr];\n      }\n    }\n\n    return jsKeywords;\n  }();\n\n  var isOperatorChar = /[+\\-*&%=<>!?|~^]/;\n  var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)\"/;\n\n  function readRegexp(stream) {\n    var escaped = false, next, inSet = false;\n    while ((next = stream.next()) != null) {\n      if (!escaped) {\n        if (next == \"/\" && !inSet) return;\n        if (next == \"[\") inSet = true;\n        else if (inSet && next == \"]\") inSet = false;\n      }\n      escaped = !escaped && next == \"\\\\\";\n    }\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  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (ch == '\"' || ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    } else if (ch == \".\" && stream.match(/^\\d+(?:[eE][+\\-]?\\d+)?/)) {\n      return ret(\"number\", \"number\");\n    } else if (ch == \".\" && stream.match(\"..\")) {\n      return ret(\"spread\", \"meta\");\n    } else if (/[\\[\\]{}\\(\\),;\\:\\.]/.test(ch)) {\n      return ret(ch);\n    } else if (ch == \"=\" && stream.eat(\">\")) {\n      return ret(\"=>\", \"operator\");\n    } else if (ch == \"0\" && stream.eat(/x/i)) {\n      stream.eatWhile(/[\\da-f]/i);\n      return ret(\"number\", \"number\");\n    } else if (/\\d/.test(ch)) {\n      stream.match(/^\\d*(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/);\n      return ret(\"number\", \"number\");\n    } else if (ch == \"/\") {\n      if (stream.eat(\"*\")) {\n        state.tokenize = tokenComment;\n        return tokenComment(stream, state);\n      } else if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return ret(\"comment\", \"comment\");\n      } else if (state.lastType == \"operator\" || state.lastType == \"keyword c\" ||\n               state.lastType == \"sof\" || /^[\\[{}\\(,;:]$/.test(state.lastType)) {\n        readRegexp(stream);\n        stream.eatWhile(/[gimy]/); // 'y' is \"sticky\" option in Mozilla\n        return ret(\"regexp\", \"string-2\");\n      } else {\n        stream.eatWhile(isOperatorChar);\n        return ret(\"operator\", \"operator\", stream.current());\n      }\n    } else if (ch == \"`\") {\n      state.tokenize = tokenQuasi;\n      return tokenQuasi(stream, state);\n    } else if (ch == \"#\") {\n      stream.skipToEnd();\n      return ret(\"error\", \"error\");\n    } else if (isOperatorChar.test(ch)) {\n      stream.eatWhile(isOperatorChar);\n      return ret(\"operator\", \"operator\", stream.current());\n    } else if (wordRE.test(ch)) {\n      stream.eatWhile(wordRE);\n      var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];\n      return (known && state.lastType != \".\") ? ret(known.type, known.style, word) :\n                     ret(\"variable\", \"variable\", word);\n    }\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next;\n      if (jsonldMode && stream.peek() == \"@\" && stream.match(isJsonldKeyword)){\n        state.tokenize = tokenBase;\n        return ret(\"jsonld-keyword\", \"meta\");\n      }\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) break;\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (!escaped) state.tokenize = tokenBase;\n      return ret(\"string\", \"string\");\n    };\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return ret(\"comment\", \"comment\");\n  }\n\n  function tokenQuasi(stream, state) {\n    var escaped = false, next;\n    while ((next = stream.next()) != null) {\n      if (!escaped && (next == \"`\" || next == \"$\" && stream.eat(\"{\"))) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      escaped = !escaped && next == \"\\\\\";\n    }\n    return ret(\"quasi\", \"string-2\", stream.current());\n  }\n\n  var brackets = \"([{}])\";\n  // This is a crude lookahead trick to try and notice that we're\n  // parsing the argument patterns for a fat-arrow function before we\n  // actually hit the arrow token. It only works if the arrow is on\n  // the same line as the arguments and there's no strange noise\n  // (comments) in between. Fallback is to only notice when we hit the\n  // arrow, and not declare the arguments as locals for the arrow\n  // body.\n  function findFatArrow(stream, state) {\n    if (state.fatArrowAt) state.fatArrowAt = null;\n    var arrow = stream.string.indexOf(\"=>\", stream.start);\n    if (arrow < 0) return;\n\n    var depth = 0, sawSomething = false;\n    for (var pos = arrow - 1; pos >= 0; --pos) {\n      var ch = stream.string.charAt(pos);\n      var bracket = brackets.indexOf(ch);\n      if (bracket >= 0 && bracket < 3) {\n        if (!depth) { ++pos; break; }\n        if (--depth == 0) break;\n      } else if (bracket >= 3 && bracket < 6) {\n        ++depth;\n      } else if (wordRE.test(ch)) {\n        sawSomething = true;\n      } else if (/[\"'\\/]/.test(ch)) {\n        return;\n      } else if (sawSomething && !depth) {\n        ++pos;\n        break;\n      }\n    }\n    if (sawSomething && !depth) state.fatArrowAt = pos;\n  }\n\n  // Parser\n\n  var atomicTypes = {\"atom\": true, \"number\": true, \"variable\": true, \"string\": true, \"regexp\": true, \"this\": true, \"jsonld-keyword\": 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    for (var cx = state.context; cx; cx = cx.prev) {\n      for (var v = cx.vars; v; v = v.next)\n        if (v.name == varname) return true;\n    }\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; cx.style = style;\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    function inList(list) {\n      for (var v = list; v; v = v.next)\n        if (v.name == varname) return true;\n      return false;\n    }\n    var state = cx.state;\n    if (state.context) {\n      cx.marked = \"def\";\n      if (inList(state.localVars)) return;\n      state.localVars = {name: varname, next: state.localVars};\n    } else {\n      if (inList(state.globalVars)) return;\n      if (parserConfig.globalVars)\n        state.globalVars = {name: varname, next: state.globalVars};\n    }\n  }\n\n  // Combinators\n\n  var defaultVars = {name: \"this\", next: {name: \"arguments\"}};\n  function pushcontext() {\n    cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};\n    cx.state.localVars = defaultVars;\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, indent = state.indented;\n      if (state.lexical.type == \"stat\") indent = state.lexical.indented;\n      else for (var outer = state.lexical; outer && outer.type == \")\" && outer.align; outer = outer.prev)\n        indent = outer.indented;\n      state.lexical = new JSLexical(indent, 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    function exp(type) {\n      if (type == wanted) return cont();\n      else if (wanted == \";\") return pass();\n      else return cont(exp);\n    };\n    return exp;\n  }\n\n  function statement(type, value) {\n    if (type == \"var\") return cont(pushlex(\"vardef\", value.length), vardef, 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 == \"if\") {\n      if (cx.state.lexical.info == \"else\" && cx.state.cc[cx.state.cc.length - 1] == poplex)\n        cx.state.cc.pop()();\n      return cont(pushlex(\"form\"), expression, statement, poplex, maybeelse);\n    }\n    if (type == \"function\") return cont(functiondef);\n    if (type == \"for\") return cont(pushlex(\"form\"), forspec, 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    if (type == \"module\") return cont(pushlex(\"form\"), pushcontext, afterModule, popcontext, poplex);\n    if (type == \"class\") return cont(pushlex(\"form\"), className, poplex);\n    if (type == \"export\") return cont(pushlex(\"form\"), afterExport, poplex);\n    if (type == \"import\") return cont(pushlex(\"form\"), afterImport, poplex);\n    return pass(pushlex(\"stat\"), expression, expect(\";\"), poplex);\n  }\n  function expression(type) {\n    return expressionInner(type, false);\n  }\n  function expressionNoComma(type) {\n    return expressionInner(type, true);\n  }\n  function expressionInner(type, noComma) {\n    if (cx.state.fatArrowAt == cx.stream.start) {\n      var body = noComma ? arrowBodyNoComma : arrowBody;\n      if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(pattern, \")\"), poplex, expect(\"=>\"), body, popcontext);\n      else if (type == \"variable\") return pass(pushcontext, pattern, expect(\"=>\"), body, popcontext);\n    }\n\n    var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma;\n    if (atomicTypes.hasOwnProperty(type)) return cont(maybeop);\n    if (type == \"function\") return cont(functiondef, maybeop);\n    if (type == \"keyword c\") return cont(noComma ? maybeexpressionNoComma : maybeexpression);\n    if (type == \"(\") return cont(pushlex(\")\"), maybeexpression, comprehension, expect(\")\"), poplex, maybeop);\n    if (type == \"operator\" || type == \"spread\") return cont(noComma ? expressionNoComma : expression);\n    if (type == \"[\") return cont(pushlex(\"]\"), arrayLiteral, poplex, maybeop);\n    if (type == \"{\") return contCommasep(objprop, \"}\", null, maybeop);\n    if (type == \"quasi\") { return pass(quasi, maybeop); }\n    return cont();\n  }\n  function maybeexpression(type) {\n    if (type.match(/[;\\}\\)\\],]/)) return pass();\n    return pass(expression);\n  }\n  function maybeexpressionNoComma(type) {\n    if (type.match(/[;\\}\\)\\],]/)) return pass();\n    return pass(expressionNoComma);\n  }\n\n  function maybeoperatorComma(type, value) {\n    if (type == \",\") return cont(expression);\n    return maybeoperatorNoComma(type, value, false);\n  }\n  function maybeoperatorNoComma(type, value, noComma) {\n    var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma;\n    var expr = noComma == false ? expression : expressionNoComma;\n    if (type == \"=>\") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext);\n    if (type == \"operator\") {\n      if (/\\+\\+|--/.test(value)) return cont(me);\n      if (value == \"?\") return cont(expression, expect(\":\"), expr);\n      return cont(expr);\n    }\n    if (type == \"quasi\") { return pass(quasi, me); }\n    if (type == \";\") return;\n    if (type == \"(\") return contCommasep(expressionNoComma, \")\", \"call\", me);\n    if (type == \".\") return cont(property, me);\n    if (type == \"[\") return cont(pushlex(\"]\"), maybeexpression, expect(\"]\"), poplex, me);\n  }\n  function quasi(type, value) {\n    if (type != \"quasi\") return pass();\n    if (value.slice(value.length - 2) != \"${\") return cont(quasi);\n    return cont(expression, continueQuasi);\n  }\n  function continueQuasi(type) {\n    if (type == \"}\") {\n      cx.marked = \"string-2\";\n      cx.state.tokenize = tokenQuasi;\n      return cont(quasi);\n    }\n  }\n  function arrowBody(type) {\n    findFatArrow(cx.stream, cx.state);\n    return pass(type == \"{\" ? statement : expression);\n  }\n  function arrowBodyNoComma(type) {\n    findFatArrow(cx.stream, cx.state);\n    return pass(type == \"{\" ? statement : expressionNoComma);\n  }\n  function maybelabel(type) {\n    if (type == \":\") return cont(poplex, statement);\n    return pass(maybeoperatorComma, expect(\";\"), poplex);\n  }\n  function property(type) {\n    if (type == \"variable\") {cx.marked = \"property\"; return cont();}\n  }\n  function objprop(type, value) {\n    if (type == \"variable\" || cx.style == \"keyword\") {\n      cx.marked = \"property\";\n      if (value == \"get\" || value == \"set\") return cont(getterSetter);\n      return cont(afterprop);\n    } else if (type == \"number\" || type == \"string\") {\n      cx.marked = jsonldMode ? \"property\" : (cx.style + \" property\");\n      return cont(afterprop);\n    } else if (type == \"jsonld-keyword\") {\n      return cont(afterprop);\n    } else if (type == \"[\") {\n      return cont(expression, expect(\"]\"), afterprop);\n    }\n  }\n  function getterSetter(type) {\n    if (type != \"variable\") return pass(afterprop);\n    cx.marked = \"property\";\n    return cont(functiondef);\n  }\n  function afterprop(type) {\n    if (type == \":\") return cont(expressionNoComma);\n    if (type == \"(\") return pass(functiondef);\n  }\n  function commasep(what, end) {\n    function proceed(type) {\n      if (type == \",\") {\n        var lex = cx.state.lexical;\n        if (lex.info == \"call\") lex.pos = (lex.pos || 0) + 1;\n        return cont(what, proceed);\n      }\n      if (type == end) return cont();\n      return cont(expect(end));\n    }\n    return function(type) {\n      if (type == end) return cont();\n      return pass(what, proceed);\n    };\n  }\n  function contCommasep(what, end, info) {\n    for (var i = 3; i < arguments.length; i++)\n      cx.cc.push(arguments[i]);\n    return cont(pushlex(end, info), commasep(what, end), poplex);\n  }\n  function block(type) {\n    if (type == \"}\") return cont();\n    return pass(statement, block);\n  }\n  function maybetype(type) {\n    if (isTS && type == \":\") return cont(typedef);\n  }\n  function typedef(type) {\n    if (type == \"variable\"){cx.marked = \"variable-3\"; return cont();}\n  }\n  function vardef() {\n    return pass(pattern, maybetype, maybeAssign, vardefCont);\n  }\n  function pattern(type, value) {\n    if (type == \"variable\") { register(value); return cont(); }\n    if (type == \"[\") return contCommasep(pattern, \"]\");\n    if (type == \"{\") return contCommasep(proppattern, \"}\");\n  }\n  function proppattern(type, value) {\n    if (type == \"variable\" && !cx.stream.match(/^\\s*:/, false)) {\n      register(value);\n      return cont(maybeAssign);\n    }\n    if (type == \"variable\") cx.marked = \"property\";\n    return cont(expect(\":\"), pattern, maybeAssign);\n  }\n  function maybeAssign(_type, value) {\n    if (value == \"=\") return cont(expressionNoComma);\n  }\n  function vardefCont(type) {\n    if (type == \",\") return cont(vardef);\n  }\n  function maybeelse(type, value) {\n    if (type == \"keyword b\" && value == \"else\") return cont(pushlex(\"form\", \"else\"), statement, poplex);\n  }\n  function forspec(type) {\n    if (type == \"(\") return cont(pushlex(\")\"), forspec1, expect(\")\"), poplex);\n  }\n  function forspec1(type) {\n    if (type == \"var\") return cont(vardef, expect(\";\"), forspec2);\n    if (type == \";\") return cont(forspec2);\n    if (type == \"variable\") return cont(formaybeinof);\n    return pass(expression, expect(\";\"), forspec2);\n  }\n  function formaybeinof(_type, value) {\n    if (value == \"in\" || value == \"of\") { cx.marked = \"keyword\"; return cont(expression); }\n    return cont(maybeoperatorComma, forspec2);\n  }\n  function forspec2(type, value) {\n    if (type == \";\") return cont(forspec3);\n    if (value == \"in\" || value == \"of\") { cx.marked = \"keyword\"; return cont(expression); }\n    return pass(expression, expect(\";\"), forspec3);\n  }\n  function forspec3(type) {\n    if (type != \")\") cont(expression);\n  }\n  function functiondef(type, value) {\n    if (value == \"*\") {cx.marked = \"keyword\"; return cont(functiondef);}\n    if (type == \"variable\") {register(value); return cont(functiondef);}\n    if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(funarg, \")\"), poplex, statement, popcontext);\n  }\n  function funarg(type) {\n    if (type == \"spread\") return cont(funarg);\n    return pass(pattern, maybetype);\n  }\n  function className(type, value) {\n    if (type == \"variable\") {register(value); return cont(classNameAfter);}\n  }\n  function classNameAfter(type, value) {\n    if (value == \"extends\") return cont(expression, classNameAfter);\n    if (type == \"{\") return cont(pushlex(\"}\"), classBody, poplex);\n  }\n  function classBody(type, value) {\n    if (type == \"variable\" || cx.style == \"keyword\") {\n      cx.marked = \"property\";\n      if (value == \"get\" || value == \"set\") return cont(classGetterSetter, functiondef, classBody);\n      return cont(functiondef, classBody);\n    }\n    if (value == \"*\") {\n      cx.marked = \"keyword\";\n      return cont(classBody);\n    }\n    if (type == \";\") return cont(classBody);\n    if (type == \"}\") return cont();\n  }\n  function classGetterSetter(type) {\n    if (type != \"variable\") return pass();\n    cx.marked = \"property\";\n    return cont();\n  }\n  function afterModule(type, value) {\n    if (type == \"string\") return cont(statement);\n    if (type == \"variable\") { register(value); return cont(maybeFrom); }\n  }\n  function afterExport(_type, value) {\n    if (value == \"*\") { cx.marked = \"keyword\"; return cont(maybeFrom, expect(\";\")); }\n    if (value == \"default\") { cx.marked = \"keyword\"; return cont(expression, expect(\";\")); }\n    return pass(statement);\n  }\n  function afterImport(type) {\n    if (type == \"string\") return cont();\n    return pass(importSpec, maybeFrom);\n  }\n  function importSpec(type, value) {\n    if (type == \"{\") return contCommasep(importSpec, \"}\");\n    if (type == \"variable\") register(value);\n    return cont();\n  }\n  function maybeFrom(_type, value) {\n    if (value == \"from\") { cx.marked = \"keyword\"; return cont(expression); }\n  }\n  function arrayLiteral(type) {\n    if (type == \"]\") return cont();\n    return pass(expressionNoComma, maybeArrayComprehension);\n  }\n  function maybeArrayComprehension(type) {\n    if (type == \"for\") return pass(comprehension, expect(\"]\"));\n    if (type == \",\") return cont(commasep(maybeexpressionNoComma, \"]\"));\n    return pass(commasep(expressionNoComma, \"]\"));\n  }\n  function comprehension(type) {\n    if (type == \"for\") return cont(forspec, comprehension);\n    if (type == \"if\") return cont(expression, comprehension);\n  }\n\n  function isContinuedStatement(state, textAfter) {\n    return state.lastType == \"operator\" || state.lastType == \",\" ||\n      isOperatorChar.test(textAfter.charAt(0)) ||\n      /[,.]/.test(textAfter.charAt(0));\n  }\n\n  // Interface\n\n  return {\n    startState: function(basecolumn) {\n      var state = {\n        tokenize: tokenBase,\n        lastType: \"sof\",\n        cc: [],\n        lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, \"block\", false),\n        localVars: parserConfig.localVars,\n        context: parserConfig.localVars && {vars: parserConfig.localVars},\n        indented: 0\n      };\n      if (parserConfig.globalVars && typeof parserConfig.globalVars == \"object\")\n        state.globalVars = parserConfig.globalVars;\n      return state;\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        findFatArrow(stream, state);\n      }\n      if (state.tokenize != tokenComment && stream.eatSpace()) return null;\n      var style = state.tokenize(stream, state);\n      if (type == \"comment\") return style;\n      state.lastType = type == \"operator\" && (content == \"++\" || content == \"--\") ? \"incdec\" : type;\n      return parseJS(state, style, type, content, stream);\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize == tokenComment) return CodeMirror.Pass;\n      if (state.tokenize != tokenBase) return 0;\n      var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical;\n      // Kludge to prevent 'maybelse' from blocking lexical scope pops\n      if (!/^\\s*else\\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) {\n        var c = state.cc[i];\n        if (c == poplex) lexical = lexical.prev;\n        else if (c != maybeelse) break;\n      }\n      if (lexical.type == \"stat\" && firstChar == \"}\") lexical = lexical.prev;\n      if (statementIndent && lexical.type == \")\" && lexical.prev.type == \"stat\")\n        lexical = lexical.prev;\n      var type = lexical.type, closing = firstChar == type;\n\n      if (type == \"vardef\") return lexical.indented + (state.lastType == \"operator\" || state.lastType == \",\" ? lexical.info + 1 : 0);\n      else if (type == \"form\" && firstChar == \"{\") return lexical.indented;\n      else if (type == \"form\") return lexical.indented + indentUnit;\n      else if (type == \"stat\")\n        return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0);\n      else if (lexical.info == \"switch\" && !closing && parserConfig.doubleIndentSwitch != false)\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    electricInput: /^\\s*(?:case .*?:|default:|\\{|\\})$/,\n    blockCommentStart: jsonMode ? null : \"/*\",\n    blockCommentEnd: jsonMode ? null : \"*/\",\n    lineComment: jsonMode ? null : \"//\",\n    fold: \"brace\",\n\n    helperType: jsonMode ? \"json\" : \"javascript\",\n    jsonldMode: jsonldMode,\n    jsonMode: jsonMode\n  };\n});\n\nCodeMirror.registerHelper(\"wordChars\", \"javascript\", /[\\w$]/);\n\nCodeMirror.defineMIME(\"text/javascript\", \"javascript\");\nCodeMirror.defineMIME(\"text/ecmascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/javascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/x-javascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/ecmascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/json\", {name: \"javascript\", json: true});\nCodeMirror.defineMIME(\"application/x-json\", {name: \"javascript\", json: true});\nCodeMirror.defineMIME(\"application/ld+json\", {name: \"javascript\", jsonld: true});\nCodeMirror.defineMIME(\"text/typescript\", { name: \"javascript\", typescript: true });\nCodeMirror.defineMIME(\"application/typescript\", { name: \"javascript\", typescript: true });\n\n});\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/dataTables/dataTables.bootstrap.js",
    "content": "/* Set the defaults for DataTables initialisation */\n$.extend(true, $.fn.dataTable.defaults, {\n    \"sDom\": \"<'row'<'col-sm-6'l><'col-sm-6'f>r>\" + \"t\" + \"<'row'<'col-sm-6'i><'col-sm-6'p>>\",\n    \"oLanguage\": {\n        \"sLengthMenu\": \"每页 _MENU_ 条记录\"\n    }\n});\n\n\n/* Default class modification */\n$.extend($.fn.dataTableExt.oStdClasses, {\n    \"sWrapper\": \"dataTables_wrapper form-inline\",\n    \"sFilterInput\": \"form-control input-sm\",\n    \"sLengthSelect\": \"form-control input-sm\"\n});\n\n// In 1.10 we use the pagination renderers to draw the Bootstrap paging,\n// rather than  custom plug-in\nif ($.fn.dataTable.Api) {\n    $.fn.dataTable.defaults.renderer = 'bootstrap';\n    $.fn.dataTable.ext.renderer.pageButton.bootstrap = function(settings, host, idx, buttons, page, pages) {\n        var api = new $.fn.dataTable.Api(settings);\n        var classes = settings.oClasses;\n        var lang = settings.oLanguage.oPaginate;\n        var btnDisplay, btnClass;\n\n        var attach = function(container, buttons) {\n            var i, ien, node, button;\n            var clickHandler = function(e) {\n                e.preventDefault();\n                if (e.data.action !== 'ellipsis') {\n                    api.page(e.data.action).draw(false);\n                }\n            };\n\n            for (i = 0, ien = buttons.length; i < ien; i++) {\n                button = buttons[i];\n\n                if ($.isArray(button)) {\n                    attach(container, button);\n                } else {\n                    btnDisplay = '';\n                    btnClass = '';\n\n                    switch (button) {\n                        case 'ellipsis':\n                            btnDisplay = '&hellip;';\n                            btnClass = 'disabled';\n                            break;\n\n                        case 'first':\n                            btnDisplay = lang.sFirst;\n                            btnClass = button + (page > 0 ?\n                                '' : ' disabled');\n                            break;\n\n                        case 'previous':\n                            btnDisplay = lang.sPrevious;\n                            btnClass = button + (page > 0 ?\n                                '' : ' disabled');\n                            break;\n\n                        case 'next':\n                            btnDisplay = lang.sNext;\n                            btnClass = button + (page < pages - 1 ?\n                                '' : ' disabled');\n                            break;\n\n                        case 'last':\n                            btnDisplay = lang.sLast;\n                            btnClass = button + (page < pages - 1 ?\n                                '' : ' disabled');\n                            break;\n\n                        default:\n                            btnDisplay = button + 1;\n                            btnClass = page === button ?\n                                'active' : '';\n                            break;\n                    }\n\n                    if (btnDisplay) {\n                        node = $('<li>', {\n                            'class': classes.sPageButton + ' ' + btnClass,\n                            'aria-controls': settings.sTableId,\n                            'tabindex': settings.iTabIndex,\n                            'id': idx === 0 && typeof button === 'string' ? settings.sTableId + '_' + button : null\n                        })\n                            .append($('<a>', {\n                                    'href': '#'\n                                })\n                                .html(btnDisplay)\n                        )\n                            .appendTo(container);\n\n                        settings.oApi._fnBindAction(\n                            node, {\n                                action: button\n                            }, clickHandler\n                        );\n                    }\n                }\n            }\n        };\n\n        attach(\n            $(host).empty().html('<ul class=\"pagination\"/>').children('ul'),\n            buttons\n        );\n    }\n} else {\n    // Integration for 1.9-\n    $.fn.dataTable.defaults.sPaginationType = 'bootstrap';\n\n    /* API method to get paging information */\n    $.fn.dataTableExt.oApi.fnPagingInfo = function(oSettings) {\n        return {\n            \"iStart\": oSettings._iDisplayStart,\n            \"iEnd\": oSettings.fnDisplayEnd(),\n            \"iLength\": oSettings._iDisplayLength,\n            \"iTotal\": oSettings.fnRecordsTotal(),\n            \"iFilteredTotal\": oSettings.fnRecordsDisplay(),\n            \"iPage\": oSettings._iDisplayLength === -1 ? 0 : Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength),\n            \"iTotalPages\": oSettings._iDisplayLength === -1 ? 0 : Math.ceil(oSettings.fnRecordsDisplay() / oSettings._iDisplayLength)\n        };\n    };\n\n    /* Bootstrap style pagination control */\n    $.extend($.fn.dataTableExt.oPagination, {\n        \"bootstrap\": {\n            \"fnInit\": function(oSettings, nPaging, fnDraw) {\n                var oLang = oSettings.oLanguage.oPaginate;\n                var fnClickHandler = function(e) {\n                    e.preventDefault();\n                    if (oSettings.oApi._fnPageChange(oSettings, e.data.action)) {\n                        fnDraw(oSettings);\n                    }\n                };\n\n                $(nPaging).append(\n                    '<ul class=\"pagination\">' +\n                    '<li class=\"prev disabled\"><a href=\"#\">&larr; ' + oLang.sPrevious + '</a></li>' +\n                    '<li class=\"next disabled\"><a href=\"#\">' + oLang.sNext + ' &rarr; </a></li>' +\n                    '</ul>'\n                );\n                var els = $('a', nPaging);\n                $(els[0]).bind('click.DT', {\n                    action: \"previous\"\n                }, fnClickHandler);\n                $(els[1]).bind('click.DT', {\n                    action: \"next\"\n                }, fnClickHandler);\n            },\n\n            \"fnUpdate\": function(oSettings, fnDraw) {\n                var iListLength = 5;\n                var oPaging = oSettings.oInstance.fnPagingInfo();\n                var an = oSettings.aanFeatures.p;\n                var i, ien, j, sClass, iStart, iEnd, iHalf = Math.floor(iListLength / 2);\n\n                if (oPaging.iTotalPages < iListLength) {\n                    iStart = 1;\n                    iEnd = oPaging.iTotalPages;\n                } else if (oPaging.iPage <= iHalf) {\n                    iStart = 1;\n                    iEnd = iListLength;\n                } else if (oPaging.iPage >= (oPaging.iTotalPages - iHalf)) {\n                    iStart = oPaging.iTotalPages - iListLength + 1;\n                    iEnd = oPaging.iTotalPages;\n                } else {\n                    iStart = oPaging.iPage - iHalf + 1;\n                    iEnd = iStart + iListLength - 1;\n                }\n\n                for (i = 0, ien = an.length; i < ien; i++) {\n                    // Remove the middle elements\n                    $('li:gt(0)', an[i]).filter(':not(:last)').remove();\n\n                    // Add the new list items and their event handlers\n                    for (j = iStart; j <= iEnd; j++) {\n                        sClass = (j == oPaging.iPage + 1) ? 'class=\"active\"' : '';\n                        $('<li ' + sClass + '><a href=\"#\">' + j + '</a></li>')\n                            .insertBefore($('li:last', an[i])[0])\n                            .bind('click', function(e) {\n                                e.preventDefault();\n                                oSettings._iDisplayStart = (parseInt($('a', this).text(), 10) - 1) * oPaging.iLength;\n                                fnDraw(oSettings);\n                            });\n                    }\n\n                    // Add / remove disabled classes from the static elements\n                    if (oPaging.iPage === 0) {\n                        $('li:first', an[i]).addClass('disabled');\n                    } else {\n                        $('li:first', an[i]).removeClass('disabled');\n                    }\n\n                    if (oPaging.iPage === oPaging.iTotalPages - 1 || oPaging.iTotalPages === 0) {\n                        $('li:last', an[i]).addClass('disabled');\n                    } else {\n                        $('li:last', an[i]).removeClass('disabled');\n                    }\n                }\n            }\n        }\n    });\n}\n\n\n/*\n * TableTools Bootstrap compatibility\n * Required TableTools 2.1+\n */\nif ($.fn.DataTable.TableTools) {\n    // Set the classes that TableTools uses to something suitable for Bootstrap\n    $.extend(true, $.fn.DataTable.TableTools.classes, {\n        \"container\": \"DTTT btn-group\",\n        \"buttons\": {\n            \"normal\": \"btn btn-default\",\n            \"disabled\": \"disabled\"\n        },\n        \"collection\": {\n            \"container\": \"DTTT_dropdown dropdown-menu\",\n            \"buttons\": {\n                \"normal\": \"\",\n                \"disabled\": \"disabled\"\n            }\n        },\n        \"print\": {\n            \"info\": \"DTTT_print_info modal\"\n        },\n        \"select\": {\n            \"row\": \"active\"\n        }\n    });\n\n    // Have the collection use a bootstrap compatible dropdown\n    $.extend(true, $.fn.DataTable.TableTools.DEFAULTS.oTags, {\n        \"collection\": {\n            \"container\": \"ul\",\n            \"button\": \"li\",\n            \"liner\": \"a\"\n        }\n    });\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/dataTables/jquery.dataTables.js",
    "content": "/*! DataTables 1.10.0-dev\n * ©2008-2013 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * @summary     DataTables\n * @description Paginate, search and order HTML tables\n * @version     1.10.0-dev\n * @file        jquery.dataTables.js\n * @author      SpryMedia Ltd (www.sprymedia.co.uk)\n * @contact     www.sprymedia.co.uk/contact\n * @copyright   Copyright 2008-2013 SpryMedia Ltd.\n *\n * This source file is free software, available under the following license:\n *   MIT license - http://datatables.net/license\n *\n * This source file is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.\n *\n * For details please refer to: http://www.datatables.net\n */\n\n/*jslint evil: true, undef: true, browser: true */\n/*globals $,require,jQuery,define,_selector_run,_selector_opts,_selector_first,_selector_row_indexes,_ext,_Api,_api_register,_api_registerPlural,_re_new_lines,_re_html,_re_formatted_numeric,_empty,_intVal,_isNumber,_isHtml,_htmlNumeric,_pluck,_pluck_order,_range,_stripHtml,_unique,_fnBuildAjax,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnAjaxDataSrc,_fnAddColumn,_fnColumnOptions,_fnAdjustColumnSizing,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnVisbleColumns,_fnGetColumns,_fnColumnTypes,_fnApplyColumnDefs,_fnHungarianMap,_fnCamelToHungarian,_fnLanguageCompat,_fnBrowserDetect,_fnAddData,_fnAddTr,_fnNodeToDataIndex,_fnNodeToColumnIndex,_fnGetRowData,_fnGetCellData,_fnSetCellData,_fnSplitObjNotation,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnGetDataMaster,_fnClearTable,_fnDeleteIndex,_fnInvalidateRow,_fnGetRowElements,_fnCreateTr,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAddOptionsHtml,_fnDetectHeader,_fnGetUniqueThs,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnFilterCreateSearch,_fnEscapeRegex,_fnFilterData,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnInfoMacros,_fnInitialise,_fnInitComplete,_fnLengthChange,_fnFeatureHtmlLength,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnFeatureHtmlTable,_fnScrollDraw,_fnApplyToChildren,_fnCalculateColumnWidths,_fnThrottle,_fnConvertToWidth,_fnScrollingWidthAdjust,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnScrollBarWidth,_fnSortFlatten,_fnSort,_fnSortAria,_fnSortListener,_fnSortAttachListener,_fnSortingClasses,_fnSortData,_fnSaveState,_fnLoadState,_fnSettingsFromNode,_fnLog,_fnMap,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnLengthOverflow,_fnRenderer,_fnDataSource,_fnRowAttributes*/\n\n(/** @lends <global> */function( window, document, $, undefined ) {\n\n(function( factory ) {\n\t\"use strict\";\n\n\t// Define as an AMD module if possible\n\tif ( typeof define === 'function' && define.amd )\n\t{\n\t\tdefine( 'datatables', ['jquery'], factory );\n\t}\n\t/* Define using browser globals otherwise\n\t * Prevent multiple instantiations if the script is loaded twice\n\t */\n\telse if ( jQuery && !jQuery.fn.dataTable )\n\t{\n\t\tfactory( jQuery );\n\t}\n}\n(/** @lends <global> */function( $ ) {\n\t\"use strict\";\n\n\t/**\n\t * DataTables is a plug-in for the jQuery Javascript library. It is a highly\n\t * flexible tool, based upon the foundations of progressive enhancement,\n\t * which will add advanced interaction controls to any HTML table. For a\n\t * full list of features please refer to\n\t * [DataTables.net](href=\"http://datatables.net).\n\t *\n\t * Note that the `DataTable` object is not a global variable but is aliased\n\t * to `jQuery.fn.DataTable` and `jQuery.fn.dataTable` through which it may\n\t * be  accessed.\n\t *\n\t *  @class\n\t *  @param {object} [init={}] Configuration object for DataTables. Options\n\t *    are defined by {@link DataTable.defaults}\n\t *  @requires jQuery 1.3+\n\t *\n\t *  @example\n\t *    // Basic initialisation\n\t *    $(document).ready( function {\n\t *      $('#example').dataTable();\n\t *    } );\n\t *\n\t *  @example\n\t *    // Initialisation with configuration options - in this case, disable\n\t *    // pagination and sorting.\n\t *    $(document).ready( function {\n\t *      $('#example').dataTable( {\n\t *        \"paginate\": false,\n\t *        \"sort\": false\n\t *      } );\n\t *    } );\n\t */\n\tvar DataTable;\n\n\n\t/*\n\t * It is useful to have variables which are scoped locally so only the\n\t * DataTables functions can access them and they don't leak into global space.\n\t * At the same time these functions are often useful over multiple files in the\n\t * core and API, so we list, or at least document, all variables which are used\n\t * by DataTables as private variables here. This also ensures that there is no\n\t * clashing of variable names and that they can easily referenced for reuse.\n\t */\n\n\n\t// Defined else where\n\t//  _selector_run\n\t//  _selector_opts\n\t//  _selector_first\n\t//  _selector_row_indexes\n\n\tvar _ext; // DataTable.ext\n\tvar _Api; // DataTable.Api\n\tvar _api_register; // DataTable.Api.register\n\tvar _api_registerPlural; // DataTable.Api.registerPlural\n\n\tvar _re_new_lines = /[\\r\\n]/g;\n\tvar _re_html = /<.*?>/g;\n\tvar _re_formatted_numeric = /[',$£€¥%]/g;\n\tvar _re_date_start = /^[\\d\\+\\-a-zA-Z]/;\n\n\n\n\n\tvar _empty = function ( d ) {\n\t\treturn !d || d === '-' ? true : false;\n\t};\n\n\n\tvar _intVal = function ( s ) {\n\t\tvar integer = parseInt( s, 10 );\n\t\treturn !isNaN(integer) && isFinite(s) ? integer : null;\n\t};\n\n\n\tvar _isNumber = function ( d, formatted ) {\n\t\tif ( formatted && typeof d === 'string' ) {\n\t\t\td = d.replace( _re_formatted_numeric, '' );\n\t\t}\n\n\t\treturn !d || d==='-' || (!isNaN( parseFloat(d) ) && isFinite( d ));\n\t};\n\n\n\t// A string without HTML in it can be considered to be HTML still\n\tvar _isHtml = function ( d ) {\n\t\treturn !d || typeof d === 'string';\n\t};\n\n\n\tvar _htmlNumeric = function ( d, formatted ) {\n\t\tif ( _empty( d ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tvar html = _isHtml( d );\n\t\treturn ! html ?\n\t\t\tnull :\n\t\t\t_isNumber( _stripHtml( d ), formatted ) ?\n\t\t\t\ttrue :\n\t\t\t\tnull;\n\t};\n\n\n\tvar _pluck = function ( a, prop, prop2 ) {\n\t\tvar out = [];\n\t\tvar i=0, ien=a.length;\n\n\t\t// Could have the test in the loop for slightly smaller code, but speed\n\t\t// is essential here\n\t\tif ( prop2 !== undefined ) {\n\t\t\tfor ( ; i<ien ; i++ ) {\n\t\t\t\tif ( a[i] && a[i][ prop ] ) {\n\t\t\t\t\tout.push( a[i][ prop ][ prop2 ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tfor ( ; i<ien ; i++ ) {\n\t\t\t\tif ( a[i] ) {\n\t\t\t\t\tout.push( a[i][ prop ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn out;\n\t};\n\n\n\t// Basically the same as _pluck, but rather than looping over `a` we use `order`\n\t// as the indexes to pick from `a`\n\tvar _pluck_order = function ( a, order, prop, prop2 )\n\t{\n\t\tvar out = [];\n\t\tvar i=0, ien=order.length;\n\n\t\t// Could have the test in the loop for slightly smaller code, but speed\n\t\t// is essential here\n\t\tif ( prop2 !== undefined ) {\n\t\t\tfor ( ; i<ien ; i++ ) {\n\t\t\t\tout.push( a[ order[i] ][ prop ][ prop2 ] );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tfor ( ; i<ien ; i++ ) {\n\t\t\t\tout.push( a[ order[i] ][ prop ] );\n\t\t\t}\n\t\t}\n\n\t\treturn out;\n\t};\n\n\n\tvar _range = function ( len, start )\n\t{\n\t\tvar out = [];\n\t\tvar end;\n\n\t\tif ( start === undefined ) {\n\t\t\tstart = 0;\n\t\t\tend = len;\n\t\t}\n\t\telse {\n\t\t\tend = start;\n\t\t\tstart = len;\n\t\t}\n\n\t\tfor ( var i=start ; i<end ; i++ ) {\n\t\t\tout.push( i );\n\t\t}\n\n\t\treturn out;\n\t};\n\n\n\tvar _stripHtml = function ( d ) {\n\t\treturn d.replace( _re_html, '' );\n\t};\n\n\n\t/**\n\t * Find the unique elements in a source array.\n\t *\n\t * @param  {array} src Source array\n\t * @return {array} Array of unique items\n\t * @ignore\n\t */\n\tvar _unique = function ( src )\n\t{\n\t\t// A faster unique method is to use object keys to identify used values,\n\t\t// but this doesn't work with arrays or objects, which we must also\n\t\t// consider. See jsperf.com/compare-array-unique-versions/4 for more\n\t\t// information.\n\t\tvar\n\t\t\tout = [],\n\t\t\tval,\n\t\t\ti, ien=src.length,\n\t\t\tj, k=0;\n\n\t\tagain: for ( i=0 ; i<ien ; i++ ) {\n\t\t\tval = src[i];\n\n\t\t\tfor ( j=0 ; j<k ; j++ ) {\n\t\t\t\tif ( out[j] === val ) {\n\t\t\t\t\tcontinue again;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tout.push( val );\n\t\t\tk++;\n\t\t}\n\n\t\treturn out;\n\t};\n\n\n\n\t/**\n\t * Create a mapping object that allows camel case parameters to be looked up\n\t * for their Hungarian counterparts. The mapping is stored in a private\n\t * parameter called `_hungarianMap` which can be accessed on the source object.\n\t *  @param {object} o\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnHungarianMap ( o )\n\t{\n\t\tvar\n\t\t\thungarian = 'a aa ao as b fn i m o s ',\n\t\t\tmatch,\n\t\t\tnewKey,\n\t\t\tmap = {};\n\n\t\t$.each( o, function (key, val) {\n\t\t\tmatch = key.match(/^([^A-Z]+?)([A-Z])/);\n\n\t\t\tif ( match && hungarian.indexOf(match[1]+' ') !== -1 )\n\t\t\t{\n\t\t\t\tnewKey = key.replace( match[0], match[2].toLowerCase() );\n\t\t\t\tmap[ newKey ] = key;\n\n\t\t\t\tif ( match[1] === 'o' )\n\t\t\t\t{\n\t\t\t\t\t_fnHungarianMap( o[key] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\to._hungarianMap = map;\n\t}\n\n\n\t/**\n\t * Convert from camel case parameters to Hungarian, based on a Hungarian map\n\t * created by _fnHungarianMap.\n\t *  @param {object} src The model object which holds all parameters that can be\n\t *    mapped.\n\t *  @param {object} user The object to convert from camel case to Hungarian.\n\t *  @param {boolean} force When set to `true`, properties which already have a\n\t *    Hungarian value in the `user` object will be overwritten. Otherwise they\n\t *    won't be.\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnCamelToHungarian ( src, user, force )\n\t{\n\t\tif ( ! src._hungarianMap )\n\t\t{\n\t\t\t_fnHungarianMap( src );\n\t\t}\n\n\t\tvar hungarianKey;\n\n\t\t$.each( user, function (key, val) {\n\t\t\thungarianKey = src._hungarianMap[ key ];\n\n\t\t\tif ( hungarianKey !== undefined && (force || user[hungarianKey] === undefined) )\n\t\t\t{\n\t\t\t\tuser[hungarianKey] = user[ key ];\n\n\t\t\t\tif ( hungarianKey.charAt(0) === 'o' )\n\t\t\t\t{\n\t\t\t\t\t_fnCamelToHungarian( src[hungarianKey], user[key] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n\n\n\t/**\n\t * Language compatibility - when certain options are given, and others aren't, we\n\t * need to duplicate the values over, in order to provide backwards compatibility\n\t * with older language files.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnLanguageCompat( oLanguage )\n\t{\n\t\tvar oDefaults = DataTable.defaults.oLanguage;\n\t\tvar zeroRecords = oLanguage.sZeroRecords;\n\n\t\t/* Backwards compatibility - if there is no sEmptyTable given, then use the same as\n\t\t * sZeroRecords - assuming that is given.\n\t\t */\n\t\tif ( !oLanguage.sEmptyTable && zeroRecords &&\n\t\t\toDefaults.sEmptyTable === \"没有数据\" )\n\t\t{\n\t\t\t_fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sEmptyTable' );\n\t\t}\n\n\t\t/* Likewise with loading records */\n\t\tif ( !oLanguage.sLoadingRecords && zeroRecords &&\n\t\t\toDefaults.sLoadingRecords === \"加载中…\" )\n\t\t{\n\t\t\t_fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sLoadingRecords' );\n\t\t}\n\t}\n\n\n\t/**\n\t * Map one parameter onto another\n\t *  @param {object} o Object to map\n\t *  @param {*} knew The new parameter name\n\t *  @param {*} old The old parameter name\n\t */\n\tvar _fnCompatMap = function ( o, knew, old ) {\n\t\tif ( o[ knew ] !== undefined ) {\n\t\t\to[ old ] = o[ knew ];\n\t\t}\n\t};\n\n\n\t/**\n\t * Provide backwards compatibility for the main DT options. Note that the new\n\t * options are mapped onto the old parameters, so this is an external interface\n\t * change only.\n\t *  @param {object} init Object to map\n\t */\n\tfunction _fnCompatOpts ( init )\n\t{\n\t\t_fnCompatMap( init, 'ordering',      'bSort' );\n\t\t_fnCompatMap( init, 'orderMulti',    'bSortMulti' );\n\t\t_fnCompatMap( init, 'orderClasses',  'bSortClasses' );\n\t\t_fnCompatMap( init, 'orderCellsTop', 'bSortCellsTop' );\n\t\t_fnCompatMap( init, 'order',         'aaSorting' );\n\t\t_fnCompatMap( init, 'orderFixed',    'aaSortingFixed' );\n\t\t_fnCompatMap( init, 'paging',        'bPaginate' );\n\t\t_fnCompatMap( init, 'pagingType',    'sPaginationType' );\n\t\t_fnCompatMap( init, 'pageLength',    'iDisplayLength' );\n\t\t_fnCompatMap( init, 'searching',     'bFilter' );\n\t}\n\n\n\t/**\n\t * Provide backwards compatibility for column options. Note that the new options\n\t * are mapped onto the old parameters, so this is an external interface change\n\t * only.\n\t *  @param {object} init Object to map\n\t */\n\tfunction _fnCompatCols ( init )\n\t{\n\t\t_fnCompatMap( init, 'orderable',     'bSortable' );\n\t\t_fnCompatMap( init, 'orderData',     'aDataSort' );\n\t\t_fnCompatMap( init, 'orderSequence', 'asSorting' );\n\t\t_fnCompatMap( init, 'orderDataType', 'sortDataType' );\n\t}\n\n\n\t/**\n\t * Browser feature detection for capabilities, quirks\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnBrowserDetect( settings )\n\t{\n\t\tvar browser = settings.oBrowser;\n\n\t\t// Scrolling feature / quirks detection\n\t\tvar n = $('<div/>')\n\t\t\t.css( {\n\t\t\t\tposition: 'absolute',\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0,\n\t\t\t\theight: 1,\n\t\t\t\twidth: 1,\n\t\t\t\toverflow: 'hidden'\n\t\t\t} )\n\t\t\t.append(\n\t\t\t\t$('<div/>')\n\t\t\t\t\t.css( {\n\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\ttop: 1,\n\t\t\t\t\t\tleft: 1,\n\t\t\t\t\t\twidth: 100,\n\t\t\t\t\t\toverflow: 'scroll'\n\t\t\t\t\t} )\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$('<div class=\"test\"/>')\n\t\t\t\t\t\t\t.css( {\n\t\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\t\theight: 10\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t)\n\t\t\t)\n\t\t\t.appendTo( 'body' );\n\n\t\tvar test = n.find('.test');\n\n\t\t// IE6/7 will oversize a width 100% element inside a scrolling element, to\n\t\t// include the width of the scrollbar, while other browsers ensure the inner\n\t\t// element is contained without forcing scrolling\n\t\tbrowser.bScrollOversize = test[0].offsetWidth === 100;\n\n\t\t// In rtl text layout, some browsers (most, but not all) will place the\n\t\t// scrollbar on the left, rather than the right.\n\t\tbrowser.bScrollbarLeft = test.offset().left !== 1;\n\n\t\tn.remove();\n\t}\n\n\t/**\n\t * Add a column to the list used for the table with default values\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {node} nTh The th element for this column\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAddColumn( oSettings, nTh )\n\t{\n\t\tvar oDefaults = DataTable.defaults.column;\n\t\tvar iCol = oSettings.aoColumns.length;\n\t\tvar oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {\n\t\t\t\"sSortingClass\": oSettings.oClasses.sSortable,\n\t\t\t\"sSortingClassJUI\": oSettings.oClasses.sSortJUI,\n\t\t\t\"nTh\": nTh ? nTh : document.createElement('th'),\n\t\t\t\"sTitle\":    oDefaults.sTitle    ? oDefaults.sTitle    : nTh ? nTh.innerHTML : '',\n\t\t\t\"aDataSort\": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],\n\t\t\t\"mData\": oDefaults.mData ? oDefaults.mData : iCol\n\t\t} );\n\t\toSettings.aoColumns.push( oCol );\n\n\t\t/* Add a column specific filter */\n\t\tif ( oSettings.aoPreSearchCols[ iCol ] === undefined || oSettings.aoPreSearchCols[ iCol ] === null )\n\t\t{\n\t\t\toSettings.aoPreSearchCols[ iCol ] = $.extend( true, {}, DataTable.models.oSearch );\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar oPre = oSettings.aoPreSearchCols[ iCol ];\n\n\t\t\t/* Don't require that the user must specify bRegex, bSmart or bCaseInsensitive */\n\t\t\tif ( oPre.bRegex === undefined )\n\t\t\t{\n\t\t\t\toPre.bRegex = true;\n\t\t\t}\n\n\t\t\tif ( oPre.bSmart === undefined )\n\t\t\t{\n\t\t\t\toPre.bSmart = true;\n\t\t\t}\n\n\t\t\tif ( oPre.bCaseInsensitive === undefined )\n\t\t\t{\n\t\t\t\toPre.bCaseInsensitive = true;\n\t\t\t}\n\t\t}\n\n\t\t/* Use the column options function to initialise classes etc */\n\t\t_fnColumnOptions( oSettings, iCol, null );\n\t}\n\n\n\t/**\n\t * Apply options for a column\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {int} iCol column index to consider\n\t *  @param {object} oOptions object with sType, bVisible and bSearchable etc\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnColumnOptions( oSettings, iCol, oOptions )\n\t{\n\t\tvar oCol = oSettings.aoColumns[ iCol ];\n\t\tvar oClasses = oSettings.oClasses;\n\n\t\t/* User specified column options */\n\t\tif ( oOptions !== undefined && oOptions !== null )\n\t\t{\n\t\t\t// Backwards compatibility\n\t\t\t_fnCompatCols( oOptions );\n\n\t\t\t// Map camel case parameters to their Hungarian counterparts\n\t\t\t_fnCamelToHungarian( DataTable.defaults.column, oOptions );\n\n\t\t\t/* Backwards compatibility for mDataProp */\n\t\t\tif ( oOptions.mDataProp !== undefined && !oOptions.mData )\n\t\t\t{\n\t\t\t\toOptions.mData = oOptions.mDataProp;\n\t\t\t}\n\n\t\t\toCol._sManualType = oOptions.sType;\n\n\t\t\t// `class` is a reserved word in Javascript, so we need to provide\n\t\t\t// the ability to use a valid name for the camel case input\n\t\t\tif ( oOptions.className && ! oOptions.sClass )\n\t\t\t{\n\t\t\t\toOptions.sClass = oOptions.className;\n\t\t\t}\n\n\t\t\t$.extend( oCol, oOptions );\n\t\t\t_fnMap( oCol, oOptions, \"sWidth\", \"sWidthOrig\" );\n\n\t\t\t/* iDataSort to be applied (backwards compatibility), but aDataSort will take\n\t\t\t * priority if defined\n\t\t\t */\n\t\t\tif ( typeof oOptions.iDataSort === 'number' )\n\t\t\t{\n\t\t\t\toCol.aDataSort = [ oOptions.iDataSort ];\n\t\t\t}\n\t\t\t_fnMap( oCol, oOptions, \"aDataSort\" );\n\t\t}\n\n\t\t/* Cache the data get and set functions for speed */\n\t\tvar mDataSrc = oCol.mData;\n\t\tvar mData = _fnGetObjectDataFn( mDataSrc );\n\t\tvar mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;\n\n\t\tvar attrTest = function( src ) {\n\t\t\treturn typeof src === 'string' && src.indexOf('@') !== -1;\n\t\t};\n\t\toCol._bAttrSrc = $.isPlainObject( mDataSrc ) && (\n\t\t\tattrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter)\n\t\t);\n\n\t\toCol.fnGetData = function (oData, sSpecific) {\n\t\t\tvar innerData = mData( oData, sSpecific );\n\n\t\t\tif ( oCol.mRender && (sSpecific && sSpecific !== '') )\n\t\t\t{\n\t\t\t\treturn mRender( innerData, sSpecific, oData );\n\t\t\t}\n\t\t\treturn innerData;\n\t\t};\n\t\toCol.fnSetData = _fnSetObjectDataFn( mDataSrc );\n\n\t\t/* Feature sorting overrides column specific when off */\n\t\tif ( !oSettings.oFeatures.bSort )\n\t\t{\n\t\t\toCol.bSortable = false;\n\t\t}\n\n\t\t/* Check that the class assignment is correct for sorting */\n\t\tvar bAsc = $.inArray('asc', oCol.asSorting) !== -1;\n\t\tvar bDesc = $.inArray('desc', oCol.asSorting) !== -1;\n\t\tif ( !oCol.bSortable || (!bAsc && !bDesc) )\n\t\t{\n\t\t\toCol.sSortingClass = oClasses.sSortableNone;\n\t\t\toCol.sSortingClassJUI = \"\";\n\t\t}\n\t\telse if ( bAsc && !bDesc )\n\t\t{\n\t\t\toCol.sSortingClass = oClasses.sSortableAsc;\n\t\t\toCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed;\n\t\t}\n\t\telse if ( !bAsc && bDesc )\n\t\t{\n\t\t\toCol.sSortingClass = oClasses.sSortableDesc;\n\t\t\toCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed;\n\t\t}\n\t}\n\n\n\t/**\n\t * Adjust the table column widths for new data. Note: you would probably want to\n\t * do a redraw after calling this function!\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAdjustColumnSizing ( settings )\n\t{\n\t\t/* Not interested in doing column width calculation if auto-width is disabled */\n\t\tif ( settings.oFeatures.bAutoWidth !== false )\n\t\t{\n\t\t\tvar columns = settings.aoColumns;\n\n\t\t\t_fnCalculateColumnWidths( settings );\n\t\t\tfor ( var i=0 , iLen=columns.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tcolumns[i].nTh.style.width = columns[i].sWidth;\n\t\t\t}\n\t\t}\n\n\t\tvar scroll = settings.oScroll;\n\t\tif ( scroll.sY !== '' || scroll.sX !== '')\n\t\t{\n\t\t\t_fnScrollDraw( settings );\n\t\t}\n\n\t\t_fnCallbackFire( settings, null, 'column-sizing', [settings] );\n\t}\n\n\n\t/**\n\t * Covert the index of a visible column to the index in the data array (take account\n\t * of hidden columns)\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {int} iMatch Visible column index to lookup\n\t *  @returns {int} i the data index\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnVisibleToColumnIndex( oSettings, iMatch )\n\t{\n\t\tvar aiVis = _fnGetColumns( oSettings, 'bVisible' );\n\n\t\treturn typeof aiVis[iMatch] === 'number' ?\n\t\t\taiVis[iMatch] :\n\t\t\tnull;\n\t}\n\n\n\t/**\n\t * Covert the index of an index in the data array and convert it to the visible\n\t *   column index (take account of hidden columns)\n\t *  @param {int} iMatch Column index to lookup\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {int} i the data index\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnColumnIndexToVisible( oSettings, iMatch )\n\t{\n\t\tvar aiVis = _fnGetColumns( oSettings, 'bVisible' );\n\t\tvar iPos = $.inArray( iMatch, aiVis );\n\n\t\treturn iPos !== -1 ? iPos : null;\n\t}\n\n\n\t/**\n\t * Get the number of visible columns\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {int} i the number of visible columns\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnVisbleColumns( oSettings )\n\t{\n\t\treturn _fnGetColumns( oSettings, 'bVisible' ).length;\n\t}\n\n\n\t/**\n\t * Get an array of column indexes that match a given property\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {string} sParam Parameter in aoColumns to look for - typically\n\t *    bVisible or bSearchable\n\t *  @returns {array} Array of indexes with matched properties\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetColumns( oSettings, sParam )\n\t{\n\t\tvar a = [];\n\n\t\t$.map( oSettings.aoColumns, function(val, i) {\n\t\t\tif ( val[sParam] ) {\n\t\t\t\ta.push( i );\n\t\t\t}\n\t\t} );\n\n\t\treturn a;\n\t}\n\n\n\tfunction _fnColumnTypes ( settings )\n\t{\n\t\tvar columns = settings.aoColumns;\n\t\tvar data = settings.aoData;\n\t\tvar types = DataTable.ext.type.detect;\n\t\tvar i, ien, j, jen, k, ken;\n\t\tvar col, cell, detectedType, cache;\n\n\t\t// For each column, spin over the\n\t\tfor ( i=0, ien=columns.length ; i<ien ; i++ ) {\n\t\t\tcol = columns[i];\n\t\t\tcache = [];\n\n\t\t\tif ( ! col.sType && col._sManualType ) {\n\t\t\t\tcol.sType = col._sManualType;\n\t\t\t}\n\t\t\telse if ( ! col.sType ) {\n\t\t\t\tfor ( j=0, jen=types.length ; j<jen ; j++ ) {\n\t\t\t\t\tfor ( k=0, ken=data.length ; k<ken ; k++ ) {\n\t\t\t\t\t\t// Use a cache array so we only need to get the type data\n\t\t\t\t\t\t// from the formatter once (when using multiple detectors)\n\t\t\t\t\t\tif ( cache[k] === undefined ) {\n\t\t\t\t\t\t\tcache[k] = _fnGetCellData( settings, k, i, 'type' );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdetectedType = types[j]( cache[k] );\n\n\t\t\t\t\t\t// Doesn't match, so break early, since this type can't\n\t\t\t\t\t\t// apply to this column. Also, HTML is a special case since\n\t\t\t\t\t\t// it is so similar to `string`. Just a single match is\n\t\t\t\t\t\t// needed for a column to be html type\n\t\t\t\t\t\tif ( ! detectedType || detectedType === 'html' ) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Type is valid for all data points in the column - use this\n\t\t\t\t\t// type\n\t\t\t\t\tif ( detectedType ) {\n\t\t\t\t\t\tcol.sType = detectedType;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Fall back - if no type was detected, always use string\n\t\t\t\tif ( ! col.sType ) {\n\t\t\t\t\tcol.sType = 'string';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\t/**\n\t * Take the column definitions and static columns arrays and calculate how\n\t * they relate to column indexes. The callback function will then apply the\n\t * definition found for a column to a suitable configuration object.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {array} aoColDefs The aoColumnDefs array that is to be applied\n\t *  @param {array} aoCols The aoColumns array that defines columns individually\n\t *  @param {function} fn Callback function - takes two parameters, the calculated\n\t *    column index and the definition for that column.\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )\n\t{\n\t\tvar i, iLen, j, jLen, k, kLen, def;\n\n\t\t// Column definitions with aTargets\n\t\tif ( aoColDefs )\n\t\t{\n\t\t\t/* Loop over the definitions array - loop in reverse so first instance has priority */\n\t\t\tfor ( i=aoColDefs.length-1 ; i>=0 ; i-- )\n\t\t\t{\n\t\t\t\tdef = aoColDefs[i];\n\n\t\t\t\t/* Each definition can target multiple columns, as it is an array */\n\t\t\t\tvar aTargets = def.targets !== undefined ?\n\t\t\t\t\tdef.targets :\n\t\t\t\t\tdef.aTargets;\n\n\t\t\t\tif ( ! $.isArray( aTargets ) )\n\t\t\t\t{\n\t\t\t\t\taTargets = [ aTargets ];\n\t\t\t\t}\n\n\t\t\t\tfor ( j=0, jLen=aTargets.length ; j<jLen ; j++ )\n\t\t\t\t{\n\t\t\t\t\tif ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Add columns that we don't yet know about */\n\t\t\t\t\t\twhile( oSettings.aoColumns.length <= aTargets[j] )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_fnAddColumn( oSettings );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t/* Integer, basic index */\n\t\t\t\t\t\tfn( aTargets[j], def );\n\t\t\t\t\t}\n\t\t\t\t\telse if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Negative integer, right to left column counting */\n\t\t\t\t\t\tfn( oSettings.aoColumns.length+aTargets[j], def );\n\t\t\t\t\t}\n\t\t\t\t\telse if ( typeof aTargets[j] === 'string' )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Class name matching on TH element */\n\t\t\t\t\t\tfor ( k=0, kLen=oSettings.aoColumns.length ; k<kLen ; k++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ( aTargets[j] == \"_all\" ||\n\t\t\t\t\t\t\t     $(oSettings.aoColumns[k].nTh).hasClass( aTargets[j] ) )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfn( k, def );\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\t\t// Statically defined columns array\n\t\tif ( aoCols )\n\t\t{\n\t\t\tfor ( i=0, iLen=aoCols.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tfn( i, aoCols[i] );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Add a data array to the table, creating DOM node etc. This is the parallel to\n\t * _fnGatherData, but for adding rows from a Javascript source, rather than a\n\t * DOM source.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {array} aData data array to be added\n\t *  @param {node} [nTr] TR element to add to the table - optional. If not given,\n\t *    DataTables will create a row automatically\n\t *  @param {array} [anTds] Array of TD|TH elements for the row - must be given\n\t *    if nTr is.\n\t *  @returns {int} >=0 if successful (index of new aoData entry), -1 if failed\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAddData ( oSettings, aDataIn, nTr, anTds )\n\t{\n\t\t/* Create the object for storing information about this new row */\n\t\tvar iRow = oSettings.aoData.length;\n\t\tvar oData = $.extend( true, {}, DataTable.models.oRow, {\n\t\t\tsrc: nTr ? 'dom' : 'data'\n\t\t} );\n\n\t\toData._aData = aDataIn;\n\t\toSettings.aoData.push( oData );\n\n\t\t/* Create the cells */\n\t\tvar nTd, sThisType;\n\t\tvar columns = oSettings.aoColumns;\n\t\tfor ( var i=0, iLen=columns.length ; i<iLen ; i++ )\n\t\t{\n\t\t\t// When working with a row, the data source object must be populated. In\n\t\t\t// all other cases, the data source object is already populated, so we\n\t\t\t// don't overwrite it, which might break bindings etc\n\t\t\tif ( nTr ) {\n\t\t\t\t_fnSetCellData( oSettings, iRow, i, _fnGetCellData( oSettings, iRow, i ) );\n\t\t\t}\n\t\t\tcolumns[i].sType = null;\n\t\t}\n\n\t\t/* Add to the display array */\n\t\toSettings.aiDisplayMaster.push( iRow );\n\n\t\t/* Create the DOM information */\n\t\tif ( !oSettings.oFeatures.bDeferRender )\n\t\t{\n\t\t\t_fnCreateTr( oSettings, iRow, nTr, anTds );\n\t\t}\n\n\t\treturn iRow;\n\t}\n\n\n\t/**\n\t * Add one or more TR elements to the table. Generally we'd expect to\n\t * use this for reading data from a DOM sourced table, but it could be\n\t * used for an TR element. Note that if a TR is given, it is used (i.e.\n\t * it is not cloned).\n\t *  @param {object} settings dataTables settings object\n\t *  @param {array|node|jQuery} trs The TR element(s) to add to the table\n\t *  @returns {array} Array of indexes for the added rows\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAddTr( settings, trs )\n\t{\n\t\tvar row;\n\n\t\t// Allow an individual node to be passed in\n\t\tif ( ! (trs instanceof $) ) {\n\t\t\ttrs = $(trs);\n\t\t}\n\n\t\treturn trs.map( function (i, el) {\n\t\t\trow = _fnGetRowElements( settings, el );\n\t\t\treturn _fnAddData( settings, row.data, el, row.cells );\n\t\t} );\n\t}\n\n\n\t/**\n\t * Take a TR element and convert it to an index in aoData\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {node} n the TR element to find\n\t *  @returns {int} index if the node is found, null if not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnNodeToDataIndex( oSettings, n )\n\t{\n\t\treturn (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null;\n\t}\n\n\n\t/**\n\t * Take a TD element and convert it into a column data index (not the visible index)\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {int} iRow The row number the TD/TH can be found in\n\t *  @param {node} n The TD/TH element to find\n\t *  @returns {int} index if the node is found, -1 if not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnNodeToColumnIndex( oSettings, iRow, n )\n\t{\n\t\treturn $.inArray( n, oSettings.aoData[ iRow ].anCells );\n\t}\n\n\n\t/**\n\t * Get an array of data for a given row from the internal data cache\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {int} iRow aoData row id\n\t *  @param {string} sSpecific data get type ('type' 'filter' 'sort')\n\t *  @param {array} aiColumns Array of column indexes to get data from\n\t *  @returns {array} Data array\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetRowData( oSettings, iRow, sSpecific, aiColumns )\n\t{\n\t\tvar out = [];\n\t\tfor ( var i=0, iLen=aiColumns.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tout.push( _fnGetCellData( oSettings, iRow, aiColumns[i], sSpecific ) );\n\t\t}\n\t\treturn out;\n\t}\n\n\n\t/**\n\t * Get the data for a given cell from the internal cache, taking into account data mapping\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {int} iRow aoData row id\n\t *  @param {int} iCol Column index\n\t *  @param {string} sSpecific data get type ('display', 'type' 'filter' 'sort')\n\t *  @returns {*} Cell data\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetCellData( oSettings, iRow, iCol, sSpecific )\n\t{\n\t\tvar oCol = oSettings.aoColumns[iCol];\n\t\tvar oData = oSettings.aoData[iRow]._aData;\n\t\tvar sData = oCol.fnGetData( oData, sSpecific );\n\n\t\tif ( sData === undefined )\n\t\t{\n\t\t\tif ( oSettings.iDrawError != oSettings.iDraw && oCol.sDefaultContent === null )\n\t\t\t{\n\t\t\t\t_fnLog( oSettings, 0, \"Requested unknown parameter \"+\n\t\t\t\t\t(typeof oCol.mData=='function' ? '{function}' : \"'\"+oCol.mData+\"'\")+\n\t\t\t\t\t\" for row \"+iRow, 4 );\n\t\t\t\toSettings.iDrawError = oSettings.iDraw;\n\t\t\t}\n\t\t\treturn oCol.sDefaultContent;\n\t\t}\n\n\t\t/* When the data source is null, we can use default column data */\n\t\tif ( (sData === oData || sData === null) && oCol.sDefaultContent !== null )\n\t\t{\n\t\t\tsData = oCol.sDefaultContent;\n\t\t}\n\t\telse if ( typeof sData === 'function' )\n\t\t{\n\t\t\t// If the data source is a function, then we run it and use the return\n\t\t\treturn sData();\n\t\t}\n\n\t\tif ( sData === null && sSpecific == 'display' )\n\t\t{\n\t\t\treturn '';\n\t\t}\n\t\treturn sData;\n\t}\n\n\n\t/**\n\t * Set the value for a specific cell, into the internal data cache\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {int} iRow aoData row id\n\t *  @param {int} iCol Column index\n\t *  @param {*} val Value to set\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSetCellData( oSettings, iRow, iCol, val )\n\t{\n\t\tvar oCol = oSettings.aoColumns[iCol];\n\t\tvar oData = oSettings.aoData[iRow]._aData;\n\n\t\toCol.fnSetData( oData, val );\n\t}\n\n\n\t// Private variable that is used to match action syntax in the data property object\n\tvar __reArray = /\\[.*?\\]$/;\n\tvar __reFn = /\\(\\)$/;\n\n\t/**\n\t * Split string on periods, taking into account escaped periods\n\t * @param  {string} str String to split\n\t * @return {array} Split string\n\t */\n\tfunction _fnSplitObjNotation( str )\n\t{\n\t\treturn $.map( str.match(/(\\\\.|[^\\.])+/g), function ( s ) {\n\t\t\treturn s.replace('\\\\.', '.');\n\t\t} );\n\t}\n\n\n\t/**\n\t * Return a function that can be used to get data from a source object, taking\n\t * into account the ability to use nested objects as a source\n\t *  @param {string|int|function} mSource The data source for the object\n\t *  @returns {function} Data get function\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetObjectDataFn( mSource )\n\t{\n\t\tif ( $.isPlainObject( mSource ) )\n\t\t{\n\t\t\t/* Build an object of get functions, and wrap them in a single call */\n\t\t\tvar o = {};\n\t\t\t$.each( mSource, function (key, val) {\n\t\t\t\tif ( val ) {\n\t\t\t\t\to[key] = _fnGetObjectDataFn( val );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\treturn function (data, type, extra) {\n\t\t\t\treturn o[ o[type] !== undefined ? type : '_' ](data, type, extra);\n\t\t\t};\n\t\t}\n\t\telse if ( mSource === null )\n\t\t{\n\t\t\t/* Give an empty string for rendering / sorting etc */\n\t\t\treturn function (data, type) {\n\t\t\t\treturn data;\n\t\t\t};\n\t\t}\n\t\telse if ( typeof mSource === 'function' )\n\t\t{\n\t\t\treturn function (data, type, extra) {\n\t\t\t\treturn mSource( data, type, extra );\n\t\t\t};\n\t\t}\n\t\telse if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||\n\t\t\t      mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) )\n\t\t{\n\t\t\t/* If there is a . in the source string then the data source is in a\n\t\t\t * nested object so we loop over the data for each level to get the next\n\t\t\t * level down. On each loop we test for undefined, and if found immediately\n\t\t\t * return. This allows entire objects to be missing and sDefaultContent to\n\t\t\t * be used if defined, rather than throwing an error\n\t\t\t */\n\t\t\tvar fetchData = function (data, type, src) {\n\t\t\t\tvar arrayNotation, funcNotation, out, innerSrc;\n\n\t\t\t\tif ( src !== \"\" )\n\t\t\t\t{\n\t\t\t\t\tvar a = _fnSplitObjNotation( src );\n\n\t\t\t\t\tfor ( var i=0, iLen=a.length ; i<iLen ; i++ )\n\t\t\t\t\t{\n\t\t\t\t\t\t// Check if we are dealing with special notation\n\t\t\t\t\t\tarrayNotation = a[i].match(__reArray);\n\t\t\t\t\t\tfuncNotation = a[i].match(__reFn);\n\n\t\t\t\t\t\tif ( arrayNotation )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Array notation\n\t\t\t\t\t\t\ta[i] = a[i].replace(__reArray, '');\n\n\t\t\t\t\t\t\t// Condition allows simply [] to be passed in\n\t\t\t\t\t\t\tif ( a[i] !== \"\" ) {\n\t\t\t\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tout = [];\n\n\t\t\t\t\t\t\t// Get the remainder of the nested object to get\n\t\t\t\t\t\t\ta.splice( 0, i+1 );\n\t\t\t\t\t\t\tinnerSrc = a.join('.');\n\n\t\t\t\t\t\t\t// Traverse each entry in the array getting the properties requested\n\t\t\t\t\t\t\tfor ( var j=0, jLen=data.length ; j<jLen ; j++ ) {\n\t\t\t\t\t\t\t\tout.push( fetchData( data[j], type, innerSrc ) );\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// If a string is given in between the array notation indicators, that\n\t\t\t\t\t\t\t// is used to join the strings together, otherwise an array is returned\n\t\t\t\t\t\t\tvar join = arrayNotation[0].substring(1, arrayNotation[0].length-1);\n\t\t\t\t\t\t\tdata = (join===\"\") ? out : out.join(join);\n\n\t\t\t\t\t\t\t// The inner call to fetchData has already traversed through the remainder\n\t\t\t\t\t\t\t// of the source requested, so we exit from the loop\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ( funcNotation )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Function call\n\t\t\t\t\t\t\ta[i] = a[i].replace(__reFn, '');\n\t\t\t\t\t\t\tdata = data[ a[i] ]();\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( data === null || data[ a[i] ] === undefined )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\t\t\t};\n\n\t\t\treturn function (data, type) {\n\t\t\t\treturn fetchData( data, type, mSource );\n\t\t\t};\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* Array or flat object mapping */\n\t\t\treturn function (data, type) {\n\t\t\t\treturn data[mSource];\n\t\t\t};\n\t\t}\n\t}\n\n\n\t/**\n\t * Return a function that can be used to set data from a source object, taking\n\t * into account the ability to use nested objects as a source\n\t *  @param {string|int|function} mSource The data source for the object\n\t *  @returns {function} Data set function\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSetObjectDataFn( mSource )\n\t{\n\t\tif ( $.isPlainObject( mSource ) )\n\t\t{\n\t\t\t/* Unlike get, only the underscore (global) option is used for for\n\t\t\t * setting data since we don't know the type here. This is why an object\n\t\t\t * option is not documented for `mData` (which is read/write), but it is\n\t\t\t * for `mRender` which is read only.\n\t\t\t */\n\t\t\treturn _fnSetObjectDataFn( mSource._ );\n\t\t}\n\t\telse if ( mSource === null )\n\t\t{\n\t\t\t/* Nothing to do when the data source is null */\n\t\t\treturn function (data, val) {};\n\t\t}\n\t\telse if ( typeof mSource === 'function' )\n\t\t{\n\t\t\treturn function (data, val) {\n\t\t\t\tmSource( data, 'set', val );\n\t\t\t};\n\t\t}\n\t\telse if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||\n\t\t\t      mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) )\n\t\t{\n\t\t\t/* Like the get, we need to get data from a nested object */\n\t\t\tvar setData = function (data, val, src) {\n\t\t\t\tvar a = _fnSplitObjNotation( src ), b;\n\t\t\t\tvar aLast = a[a.length-1];\n\t\t\t\tvar arrayNotation, funcNotation, o, innerSrc;\n\n\t\t\t\tfor ( var i=0, iLen=a.length-1 ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\t// Check if we are dealing with an array notation request\n\t\t\t\t\tarrayNotation = a[i].match(__reArray);\n\t\t\t\t\tfuncNotation = a[i].match(__reFn);\n\n\t\t\t\t\tif ( arrayNotation )\n\t\t\t\t\t{\n\t\t\t\t\t\ta[i] = a[i].replace(__reArray, '');\n\t\t\t\t\t\tdata[ a[i] ] = [];\n\n\t\t\t\t\t\t// Get the remainder of the nested object to set so we can recurse\n\t\t\t\t\t\tb = a.slice();\n\t\t\t\t\t\tb.splice( 0, i+1 );\n\t\t\t\t\t\tinnerSrc = b.join('.');\n\n\t\t\t\t\t\t// Traverse each entry in the array setting the properties requested\n\t\t\t\t\t\tfor ( var j=0, jLen=val.length ; j<jLen ; j++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\to = {};\n\t\t\t\t\t\t\tsetData( o, val[j], innerSrc );\n\t\t\t\t\t\t\tdata[ a[i] ].push( o );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// The inner call to setData has already traversed through the remainder\n\t\t\t\t\t\t// of the source and has set the data, thus we can exit here\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\telse if ( funcNotation )\n\t\t\t\t\t{\n\t\t\t\t\t\t// Function call\n\t\t\t\t\t\ta[i] = a[i].replace(__reFn, '');\n\t\t\t\t\t\tdata = data[ a[i] ]( val );\n\t\t\t\t\t}\n\n\t\t\t\t\t// If the nested object doesn't currently exist - since we are\n\t\t\t\t\t// trying to set the value - create it\n\t\t\t\t\tif ( data[ a[i] ] === null || data[ a[i] ] === undefined )\n\t\t\t\t\t{\n\t\t\t\t\t\tdata[ a[i] ] = {};\n\t\t\t\t\t}\n\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t}\n\n\t\t\t\t// Last item in the input - i.e, the actual set\n\t\t\t\tif ( aLast.match(__reFn ) )\n\t\t\t\t{\n\t\t\t\t\t// Function call\n\t\t\t\t\tdata = data[ aLast.replace(__reFn, '') ]( val );\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// If array notation is used, we just want to strip it and use the property name\n\t\t\t\t\t// and assign the value. If it isn't used, then we get the result we want anyway\n\t\t\t\t\tdata[ aLast.replace(__reArray, '') ] = val;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\treturn function (data, val) {\n\t\t\t\treturn setData( data, val, mSource );\n\t\t\t};\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* Array or flat object mapping */\n\t\t\treturn function (data, val) {\n\t\t\t\tdata[mSource] = val;\n\t\t\t};\n\t\t}\n\t}\n\n\n\t/**\n\t * Return an array with the full table data\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns array {array} aData Master data array\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetDataMaster ( settings )\n\t{\n\t\treturn _pluck( settings.aoData, '_aData' );\n\t}\n\n\n\t/**\n\t * Nuke the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnClearTable( settings )\n\t{\n\t\tsettings.aoData.length = 0;\n\t\tsettings.aiDisplayMaster.length = 0;\n\t\tsettings.aiDisplay.length = 0;\n\t}\n\n\n\t /**\n\t * Take an array of integers (index array) and remove a target integer (value - not\n\t * the key!)\n\t *  @param {array} a Index array to target\n\t *  @param {int} iTarget value to find\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnDeleteIndex( a, iTarget, splice )\n\t{\n\t\tvar iTargetIndex = -1;\n\n\t\tfor ( var i=0, iLen=a.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tif ( a[i] == iTarget )\n\t\t\t{\n\t\t\t\tiTargetIndex = i;\n\t\t\t}\n\t\t\telse if ( a[i] > iTarget )\n\t\t\t{\n\t\t\t\ta[i]--;\n\t\t\t}\n\t\t}\n\n\t\tif ( iTargetIndex != -1 && splice === undefined )\n\t\t{\n\t\t\ta.splice( iTargetIndex, 1 );\n\t\t}\n\t}\n\n\n\t/**\n\t * Mark cached data as invalid such that a re-read of the data will occur when\n\t * the cached data is next requested. Also update from the data source object.\n\t *\n\t * @param {object} settings DataTables settings object\n\t * @param  {int}    rowIdx   Row index to invalidate\n\t * @memberof DataTable#oApi\n\t *\n\t * @todo For the modularisation of v1.11 this will need to become a callback, so\n\t *   the sort and filter methods can subscribe to it. That will required\n\t *   initialisation options for sorting, which is why it is not already baked in\n\t */\n\tfunction _fnInvalidateRow( settings, rowIdx, src, column )\n\t{\n\t\tvar row = settings.aoData[ rowIdx ];\n\t\tvar i, ien;\n\n\t\t// Are we reading last data from DOM or the data object?\n\t\tif ( src === 'dom' || ((! src || src === 'auto') && row.src === 'dom') ) {\n\t\t\t// Read the data from the DOM\n\t\t\trow._aData = _fnGetRowElements( settings, row.nTr ).data;\n\t\t}\n\t\telse {\n\t\t\t// Reading from data object, update the DOM\n\t\t\tvar cells = row.anCells;\n\n\t\t\tfor ( i=0, ien=cells.length ; i<ien ; i++ ) {\n\t\t\t\tcells[i].innerHTML = _fnGetCellData( settings, rowIdx, i, 'display' );\n\t\t\t}\n\t\t}\n\n\t\trow._aSortData = null;\n\t\trow._aFilterData = null;\n\n\t\t// Invalidate the type for a specific column (if given) or all columns since\n\t\t// the data might have changed\n\t\tvar cols = settings.aoColumns;\n\t\tif ( column !== undefined ) {\n\t\t\tcols[ column ].sType = null;\n\t\t}\n\t\telse {\n\t\t\tfor ( i=0, ien=cols.length ; i<ien ; i++ ) {\n\t\t\t\tcols[i].sType = null;\n\t\t\t}\n\t\t}\n\n\t\t// Update DataTables special `DT_*` attributes for the row\n\t\t_fnRowAttributes( row );\n\t}\n\n\n\t/**\n\t * Build a data source object from an HTML row, reading the contents of the\n\t * cells that are in the row.\n\t *\n\t * @param {object} settings DataTables settings object\n\t * @param {node} TR element from which to read data\n\t * @returns {object} Object with two parameters: `data` the data read, in\n\t *   document order, and `cells` and array of nodes (they can be useful to the\n\t *   caller, so rather than needing a second traversal to get them, just return\n\t *   them from here).\n\t * @memberof DataTable#oApi\n\t */\n\tfunction _fnGetRowElements( settings, row )\n\t{\n\t\tvar\n\t\t\td = [],\n\t\t\ttds = [],\n\t\t\ttd = row.firstChild,\n\t\t\tname, col, o, i=0, contents,\n\t\t\tcolumns = settings.aoColumns;\n\n\t\tvar attr = function ( str, data, td  ) {\n\t\t\tif ( typeof str === 'string' ) {\n\t\t\t\tvar idx = str.indexOf('@');\n\n\t\t\t\tif ( idx !== -1 ) {\n\t\t\t\t\tvar src = str.substring( idx+1 );\n\t\t\t\t\to[ '@'+src ] = td.getAttribute( src );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\twhile ( td ) {\n\t\t\tname = td.nodeName.toUpperCase();\n\n\t\t\tif ( name == \"TD\" || name == \"TH\" ) {\n\t\t\t\tcol = columns[i];\n\t\t\t\tcontents = $.trim(td.innerHTML);\n\n\t\t\t\tif ( col && col._bAttrSrc ) {\n\t\t\t\t\to = {\n\t\t\t\t\t\tdisplay: contents\n\t\t\t\t\t};\n\n\t\t\t\t\tattr( col.mData.sort, o, td );\n\t\t\t\t\tattr( col.mData.type, o, td );\n\t\t\t\t\tattr( col.mData.filter, o, td );\n\n\t\t\t\t\td.push( o );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\td.push( contents );\n\t\t\t\t}\n\n\t\t\t\ttds.push( td );\n\t\t\t\ti++;\n\t\t\t}\n\n\t\t\ttd = td.nextSibling;\n\t\t}\n\n\t\treturn {\n\t\t\tdata: d,\n\t\t\tcells: tds\n\t\t};\n\t}\n\t/**\n\t * Create a new TR element (and it's TD children) for a row\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {int} iRow Row to consider\n\t *  @param {node} [nTrIn] TR element to add to the table - optional. If not given,\n\t *    DataTables will create a row automatically\n\t *  @param {array} [anTds] Array of TD|TH elements for the row - must be given\n\t *    if nTr is.\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnCreateTr ( oSettings, iRow, nTrIn, anTds )\n\t{\n\t\tvar\n\t\t\trow = oSettings.aoData[iRow],\n\t\t\trowData = row._aData,\n\t\t\tcells = [],\n\t\t\tnTr, nTd, oCol,\n\t\t\ti, iLen;\n\n\t\tif ( row.nTr === null )\n\t\t{\n\t\t\tnTr = nTrIn || document.createElement('tr');\n\n\t\t\trow.nTr = nTr;\n\t\t\trow.anCells = cells;\n\n\t\t\t/* Use a private property on the node to allow reserve mapping from the node\n\t\t\t * to the aoData array for fast look up\n\t\t\t */\n\t\t\tnTr._DT_RowIndex = iRow;\n\n\t\t\t/* Special parameters can be given by the data source to be used on the row */\n\t\t\t_fnRowAttributes( row );\n\n\t\t\t/* Process each column */\n\t\t\tfor ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\toCol = oSettings.aoColumns[i];\n\n\t\t\t\tnTd = nTrIn ? anTds[i] : document.createElement( oCol.sCellType );\n\t\t\t\tcells.push( nTd );\n\n\t\t\t\t// Need to create the HTML if new, or if a rendering function is defined\n\t\t\t\tif ( !nTrIn || oCol.mRender || oCol.mData !== i )\n\t\t\t\t{\n\t\t\t\t\tnTd.innerHTML = _fnGetCellData( oSettings, iRow, i, 'display' );\n\t\t\t\t}\n\n\t\t\t\t/* Add user defined class */\n\t\t\t\tif ( oCol.sClass !== null )\n\t\t\t\t{\n\t\t\t\t\tnTd.className += ' '+oCol.sClass;\n\t\t\t\t}\n\n\t\t\t\t// Visibility - add or remove as required\n\t\t\t\tif ( oCol.bVisible && ! nTrIn )\n\t\t\t\t{\n\t\t\t\t\tnTr.appendChild( nTd );\n\t\t\t\t}\n\t\t\t\telse if ( ! oCol.bVisible && nTrIn )\n\t\t\t\t{\n\t\t\t\t\tnTd.parentNode.removeChild( nTd );\n\t\t\t\t}\n\n\t\t\t\tif ( oCol.fnCreatedCell )\n\t\t\t\t{\n\t\t\t\t\toCol.fnCreatedCell.call( oSettings.oInstance,\n\t\t\t\t\t\tnTd, _fnGetCellData( oSettings, iRow, i, 'display' ), rowData, iRow, i\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow] );\n\t\t}\n\t}\n\n\n\t/**\n\t * Add attributes to a row based on the special `DT_*` parameters in a data\n\t * source object.\n\t *  @param {object} DataTables row object for the row to be modified\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnRowAttributes( row )\n\t{\n\t\tvar tr = row.nTr;\n\t\tvar data = row._aData;\n\n\t\tif ( tr ) {\n\t\t\tif ( data.DT_RowId ) {\n\t\t\t\ttr.id = data.DT_RowId;\n\t\t\t}\n\n\t\t\tif ( data.DT_RowClass ) {\n\t\t\t\t// Remove any classes added by DT_RowClass before\n\t\t\t\tvar a = data.DT_RowClass.split(' ');\n\t\t\t\trow.__rowc = row.__rowc ?\n\t\t\t\t\t_unique( row.__rowc.concat( a ) ) :\n\t\t\t\t\ta;\n\n\t\t\t\t$(tr)\n\t\t\t\t\t.removeClass( row.__rowc.join(' ') )\n\t\t\t\t\t.addClass( data.DT_RowClass );\n\t\t\t}\n\n\t\t\tif ( data.DT_RowData ) {\n\t\t\t\t$(tr).data( data.DT_RowData );\n\t\t\t}\n\t\t}\n\t}\n\n\n\t/**\n\t * Create the HTML header for the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnBuildHead( oSettings )\n\t{\n\t\tvar i, ien, cell, row, column;\n\t\tvar thead = oSettings.nTHead;\n\t\tvar tfoot = oSettings.nTFoot;\n\t\tvar createHeader = $('th, td', thead).length === 0;\n\t\tvar classes = oSettings.oClasses;\n\t\tvar columns = oSettings.aoColumns;\n\n\t\tif ( createHeader ) {\n\t\t\trow = $('<tr/>').appendTo( thead );\n\t\t}\n\n\t\tfor ( i=0, ien=columns.length ; i<ien ; i++ ) {\n\t\t\tcolumn = columns[i];\n\t\t\tcell = $( column.nTh ).addClass( column.sClass );\n\n\t\t\tif ( createHeader ) {\n\t\t\t\tcell.appendTo( row );\n\t\t\t}\n\n\t\t\t// 1.11 move into sorting\n\t\t\tif ( oSettings.oFeatures.bSort ) {\n\t\t\t\tcell.addClass( column.sSortingClass );\n\n\t\t\t\tif ( column.bSortable !== false ) {\n\t\t\t\t\tcell\n\t\t\t\t\t\t.attr( 'tabindex', oSettings.iTabIndex )\n\t\t\t\t\t\t.attr( 'aria-controls', oSettings.sTableId );\n\n\t\t\t\t\t_fnSortAttachListener( oSettings, column.nTh, i );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( column.sTitle != cell.html() ) {\n\t\t\t\tcell.html( column.sTitle );\n\t\t\t}\n\n\t\t\t_fnRenderer( oSettings, 'header' )(\n\t\t\t\toSettings, cell, column, i, classes\n\t\t\t);\n\t\t}\n\n\t\tif ( createHeader ) {\n\t\t\t_fnDetectHeader( oSettings.aoHeader, thead );\n\t\t}\n\n\t\t/* ARIA role for the rows */\n\t\t$(thead).find('>tr').attr('role', 'row');\n\n\t\t/* Deal with the footer - add classes if required */\n\t\t$(thead).find('>tr>th, >tr>td').addClass( classes.sHeaderTH );\n\t\t$(tfoot).find('>tr>th, >tr>td').addClass( classes.sFooterTH );\n\n\t\t// Cache the footer cells. Note that we only take the cells from the first\n\t\t// row in the footer. If there is more than one row the user wants to\n\t\t// interact with, they need to use the table().foot() method. Note also this\n\t\t// allows cells to be used for multiple columns using colspan\n\t\tif ( tfoot !== null ) {\n\t\t\tvar cells = oSettings.aoFooter[0];\n\n\t\t\tfor ( i=0, ien=cells.length ; i<ien ; i++ ) {\n\t\t\t\tcolumn = columns[i];\n\t\t\t\tcolumn.nTf = cells[i].cell;\n\n\t\t\t\tif ( column.sClass ) {\n\t\t\t\t\t$(column.nTf).addClass( column.sClass );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\t/**\n\t * Draw the header (or footer) element based on the column visibility states. The\n\t * methodology here is to use the layout array from _fnDetectHeader, modified for\n\t * the instantaneous column visibility, to construct the new layout. The grid is\n\t * traversed over cell at a time in a rows x columns grid fashion, although each\n\t * cell insert can cover multiple elements in the grid - which is tracks using the\n\t * aApplied array. Cell inserts in the grid will only occur where there isn't\n\t * already a cell in that position.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param array {objects} aoSource Layout array from _fnDetectHeader\n\t *  @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc,\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnDrawHead( oSettings, aoSource, bIncludeHidden )\n\t{\n\t\tvar i, iLen, j, jLen, k, kLen, n, nLocalTr;\n\t\tvar aoLocal = [];\n\t\tvar aApplied = [];\n\t\tvar iColumns = oSettings.aoColumns.length;\n\t\tvar iRowspan, iColspan;\n\n\t\tif ( ! aoSource )\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (  bIncludeHidden === undefined )\n\t\t{\n\t\t\tbIncludeHidden = false;\n\t\t}\n\n\t\t/* Make a copy of the master layout array, but without the visible columns in it */\n\t\tfor ( i=0, iLen=aoSource.length ; i<iLen ; i++ )\n\t\t{\n\t\t\taoLocal[i] = aoSource[i].slice();\n\t\t\taoLocal[i].nTr = aoSource[i].nTr;\n\n\t\t\t/* Remove any columns which are currently hidden */\n\t\t\tfor ( j=iColumns-1 ; j>=0 ; j-- )\n\t\t\t{\n\t\t\t\tif ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )\n\t\t\t\t{\n\t\t\t\t\taoLocal[i].splice( j, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* Prep the applied array - it needs an element for each row */\n\t\t\taApplied.push( [] );\n\t\t}\n\n\t\tfor ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tnLocalTr = aoLocal[i].nTr;\n\n\t\t\t/* All cells are going to be replaced, so empty out the row */\n\t\t\tif ( nLocalTr )\n\t\t\t{\n\t\t\t\twhile( (n = nLocalTr.firstChild) )\n\t\t\t\t{\n\t\t\t\t\tnLocalTr.removeChild( n );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )\n\t\t\t{\n\t\t\t\tiRowspan = 1;\n\t\t\t\tiColspan = 1;\n\n\t\t\t\t/* Check to see if there is already a cell (row/colspan) covering our target\n\t\t\t\t * insert point. If there is, then there is nothing to do.\n\t\t\t\t */\n\t\t\t\tif ( aApplied[i][j] === undefined )\n\t\t\t\t{\n\t\t\t\t\tnLocalTr.appendChild( aoLocal[i][j].cell );\n\t\t\t\t\taApplied[i][j] = 1;\n\n\t\t\t\t\t/* Expand the cell to cover as many rows as needed */\n\t\t\t\t\twhile ( aoLocal[i+iRowspan] !== undefined &&\n\t\t\t\t\t        aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )\n\t\t\t\t\t{\n\t\t\t\t\t\taApplied[i+iRowspan][j] = 1;\n\t\t\t\t\t\tiRowspan++;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* Expand the cell to cover as many columns as needed */\n\t\t\t\t\twhile ( aoLocal[i][j+iColspan] !== undefined &&\n\t\t\t\t\t        aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Must update the applied array over the rows for the columns */\n\t\t\t\t\t\tfor ( k=0 ; k<iRowspan ; k++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\taApplied[i+k][j+iColspan] = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tiColspan++;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* Do the actual expansion in the DOM */\n\t\t\t\t\taoLocal[i][j].cell.rowSpan = iRowspan;\n\t\t\t\t\taoLocal[i][j].cell.colSpan = iColspan;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\t/**\n\t * Insert the required TR nodes into the table for display\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnDraw( oSettings )\n\t{\n\t\t/* Provide a pre-callback function which can be used to cancel the draw is false is returned */\n\t\tvar aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );\n\t\tif ( $.inArray( false, aPreDraw ) !== -1 )\n\t\t{\n\t\t\t_fnProcessingDisplay( oSettings, false );\n\t\t\treturn;\n\t\t}\n\n\t\tvar i, iLen, n;\n\t\tvar anRows = [];\n\t\tvar iRowCount = 0;\n\t\tvar asStripeClasses = oSettings.asStripeClasses;\n\t\tvar iStripes = asStripeClasses.length;\n\t\tvar iOpenRows = oSettings.aoOpenRows.length;\n\t\tvar oLang = oSettings.oLanguage;\n\t\tvar iInitDisplayStart = oSettings.iInitDisplayStart;\n\t\tvar bServerSide = _fnDataSource( oSettings ) == 'ssp';\n\t\tvar aiDisplay = oSettings.aiDisplay;\n\n\t\toSettings.bDrawing = true;\n\n\t\t/* Check and see if we have an initial draw position from state saving */\n\t\tif ( iInitDisplayStart !== undefined && iInitDisplayStart !== -1 )\n\t\t{\n\t\t\toSettings._iDisplayStart = bServerSide ?\n\t\t\t\tiInitDisplayStart :\n\t\t\t\tiInitDisplayStart >= oSettings.fnRecordsDisplay() ?\n\t\t\t\t\t0 :\n\t\t\t\t\tiInitDisplayStart;\n\n\t\t\toSettings.iInitDisplayStart = -1;\n\t\t}\n\n\t\tvar iDisplayStart = oSettings._iDisplayStart;\n\t\tvar iDisplayEnd = oSettings.fnDisplayEnd();\n\n\t\t/* Server-side processing draw intercept */\n\t\tif ( oSettings.bDeferLoading )\n\t\t{\n\t\t\toSettings.bDeferLoading = false;\n\t\t\toSettings.iDraw++;\n\t\t\t_fnProcessingDisplay( oSettings, false );\n\t\t}\n\t\telse if ( !bServerSide )\n\t\t{\n\t\t\toSettings.iDraw++;\n\t\t}\n\t\telse if ( !oSettings.bDestroying && !_fnAjaxUpdate( oSettings ) )\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif ( aiDisplay.length !== 0 )\n\t\t{\n\t\t\tvar iStart = bServerSide ? 0 : iDisplayStart;\n\t\t\tvar iEnd = bServerSide ? oSettings.aoData.length : iDisplayEnd;\n\n\t\t\tfor ( var j=iStart ; j<iEnd ; j++ )\n\t\t\t{\n\t\t\t\tvar iDataIndex = aiDisplay[j];\n\t\t\t\tvar aoData = oSettings.aoData[ iDataIndex ];\n\t\t\t\tif ( aoData.nTr === null )\n\t\t\t\t{\n\t\t\t\t\t_fnCreateTr( oSettings, iDataIndex );\n\t\t\t\t}\n\n\t\t\t\tvar nRow = aoData.nTr;\n\n\t\t\t\t/* Remove the old striping classes and then add the new one */\n\t\t\t\tif ( iStripes !== 0 )\n\t\t\t\t{\n\t\t\t\t\tvar sStripe = asStripeClasses[ iRowCount % iStripes ];\n\t\t\t\t\tif ( aoData._sRowStripe != sStripe )\n\t\t\t\t\t{\n\t\t\t\t\t\t$(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe );\n\t\t\t\t\t\taoData._sRowStripe = sStripe;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/* Row callback functions - might want to manipulate the row */\n\t\t\t\t_fnCallbackFire( oSettings, 'aoRowCallback', null,\n\t\t\t\t\t[nRow, aoData._aData, iRowCount, j] );\n\n\t\t\t\tanRows.push( nRow );\n\t\t\t\tiRowCount++;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* Table is empty - create a row with an empty message in it */\n\t\t\tvar sZero = oLang.sZeroRecords;\n\t\t\tif ( oSettings.iDraw == 1 &&  _fnDataSource( oSettings ) == 'ajax' )\n\t\t\t{\n\t\t\t\tsZero = oLang.sLoadingRecords;\n\t\t\t}\n\t\t\telse if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 )\n\t\t\t{\n\t\t\t\tsZero = oLang.sEmptyTable;\n\t\t\t}\n\n\t\t\tanRows[ 0 ] = $( '<tr/>', { 'class': iStripes ? asStripeClasses[0] : '' } )\n\t\t\t\t.append( $('<td />', {\n\t\t\t\t\t'valign':  'top',\n\t\t\t\t\t'colSpan': _fnVisbleColumns( oSettings ),\n\t\t\t\t\t'class':   oSettings.oClasses.sRowEmpty\n\t\t\t\t} ).html( sZero ) )[0];\n\t\t}\n\n\t\t/* Header and footer callbacks */\n\t\t_fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0],\n\t\t\t_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );\n\n\t\t_fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0],\n\t\t\t_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );\n\n\t\tvar body = $(oSettings.nTBody);\n\n\t\tbody.children().detach();\n\t\tbody.append( $(anRows) );\n\n\t\t/* Call all required callback functions for the end of a draw */\n\t\t_fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] );\n\n\t\t/* Draw is complete, sorting and filtering must be as well */\n\t\toSettings.bSorted = false;\n\t\toSettings.bFiltered = false;\n\t\toSettings.bDrawing = false;\n\t}\n\n\n\t/**\n\t * Redraw the table - taking account of the various features which are enabled\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {boolean} [holdPosition] Keep the current paging position. By default\n\t *    the paging is reset to the first page\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnReDraw( settings, holdPosition )\n\t{\n\t\tvar\n\t\t\tfeatures = settings.oFeatures,\n\t\t\tsort     = features.bSort,\n\t\t\tfilter   = features.bFilter;\n\n\t\tif ( sort ) {\n\t\t\t_fnSort( settings );\n\t\t}\n\n\t\tif ( filter ) {\n\t\t\t_fnFilterComplete( settings, settings.oPreviousSearch );\n\t\t}\n\t\telse {\n\t\t\t// No filtering, so we want to just use the display master\n\t\t\tsettings.aiDisplay = settings.aiDisplayMaster.slice();\n\t\t}\n\n\t\tif ( holdPosition !== true ) {\n\t\t\tsettings._iDisplayStart = 0;\n\t\t}\n\n\t\t_fnDraw( settings );\n\t}\n\n\n\t/**\n\t * Add the options to the page HTML for the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAddOptionsHtml ( oSettings )\n\t{\n\t\t/*\n\t\t * Create a temporary, empty, div which we can later on replace with what we have generated\n\t\t * we do it this way to rendering the 'options' html offline - speed :-)\n\t\t */\n\t\tvar nHolding = $('<div></div>')[0];\n\t\toSettings.nTable.parentNode.insertBefore( nHolding, oSettings.nTable );\n\n\t\t/*\n\t\t * All DataTables are wrapped in a div\n\t\t */\n\t\toSettings.nTableWrapper = $('<div id=\"'+oSettings.sTableId+'_wrapper\" class=\"'+oSettings.oClasses.sWrapper+'\" role=\"grid\"></div>')[0];\n\t\toSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;\n\n\t\t/* Track where we want to insert the option */\n\t\tvar nInsertNode = oSettings.nTableWrapper;\n\n\t\t/* Loop over the user set positioning and place the elements as needed */\n\t\tvar aDom = oSettings.sDom.split('');\n\t\tvar nTmp, iPushFeature, cOption, nNewNode, cNext, sAttr, j;\n\t\tfor ( var i=0 ; i<aDom.length ; i++ )\n\t\t{\n\t\t\tiPushFeature = 0;\n\t\t\tcOption = aDom[i];\n\n\t\t\tif ( cOption == '<' )\n\t\t\t{\n\t\t\t\t/* New container div */\n\t\t\t\tnNewNode = $('<div></div>')[0];\n\n\t\t\t\t/* Check to see if we should append an id and/or a class name to the container */\n\t\t\t\tcNext = aDom[i+1];\n\t\t\t\tif ( cNext == \"'\" || cNext == '\"' )\n\t\t\t\t{\n\t\t\t\t\tsAttr = \"\";\n\t\t\t\t\tj = 2;\n\t\t\t\t\twhile ( aDom[i+j] != cNext )\n\t\t\t\t\t{\n\t\t\t\t\t\tsAttr += aDom[i+j];\n\t\t\t\t\t\tj++;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* Replace jQuery UI constants @todo depreciated */\n\t\t\t\t\tif ( sAttr == \"H\" )\n\t\t\t\t\t{\n\t\t\t\t\t\tsAttr = oSettings.oClasses.sJUIHeader;\n\t\t\t\t\t}\n\t\t\t\t\telse if ( sAttr == \"F\" )\n\t\t\t\t\t{\n\t\t\t\t\t\tsAttr = oSettings.oClasses.sJUIFooter;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* The attribute can be in the format of \"#id.class\", \"#id\" or \"class\" This logic\n\t\t\t\t\t * breaks the string into parts and applies them as needed\n\t\t\t\t\t */\n\t\t\t\t\tif ( sAttr.indexOf('.') != -1 )\n\t\t\t\t\t{\n\t\t\t\t\t\tvar aSplit = sAttr.split('.');\n\t\t\t\t\t\tnNewNode.id = aSplit[0].substr(1, aSplit[0].length-1);\n\t\t\t\t\t\tnNewNode.className = aSplit[1];\n\t\t\t\t\t}\n\t\t\t\t\telse if ( sAttr.charAt(0) == \"#\" )\n\t\t\t\t\t{\n\t\t\t\t\t\tnNewNode.id = sAttr.substr(1, sAttr.length-1);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tnNewNode.className = sAttr;\n\t\t\t\t\t}\n\n\t\t\t\t\ti += j; /* Move along the position array */\n\t\t\t\t}\n\n\t\t\t\tnInsertNode.appendChild( nNewNode );\n\t\t\t\tnInsertNode = nNewNode;\n\t\t\t}\n\t\t\telse if ( cOption == '>' )\n\t\t\t{\n\t\t\t\t/* End container div */\n\t\t\t\tnInsertNode = nInsertNode.parentNode;\n\t\t\t}\n\t\t\t// @todo Move options into their own plugins?\n\t\t\telse if ( cOption == 'l' && oSettings.oFeatures.bPaginate && oSettings.oFeatures.bLengthChange )\n\t\t\t{\n\t\t\t\t/* Length */\n\t\t\t\tnTmp = _fnFeatureHtmlLength( oSettings );\n\t\t\t\tiPushFeature = 1;\n\t\t\t}\n\t\t\telse if ( cOption == 'f' && oSettings.oFeatures.bFilter )\n\t\t\t{\n\t\t\t\t/* Filter */\n\t\t\t\tnTmp = _fnFeatureHtmlFilter( oSettings );\n\t\t\t\tiPushFeature = 1;\n\t\t\t}\n\t\t\telse if ( cOption == 'r' && oSettings.oFeatures.bProcessing )\n\t\t\t{\n\t\t\t\t/* pRocessing */\n\t\t\t\tnTmp = _fnFeatureHtmlProcessing( oSettings );\n\t\t\t\tiPushFeature = 1;\n\t\t\t}\n\t\t\telse if ( cOption == 't' )\n\t\t\t{\n\t\t\t\t/* Table */\n\t\t\t\tnTmp = _fnFeatureHtmlTable( oSettings );\n\t\t\t\tiPushFeature = 1;\n\t\t\t}\n\t\t\telse if ( cOption ==  'i' && oSettings.oFeatures.bInfo )\n\t\t\t{\n\t\t\t\t/* Info */\n\t\t\t\tnTmp = _fnFeatureHtmlInfo( oSettings );\n\t\t\t\tiPushFeature = 1;\n\t\t\t}\n\t\t\telse if ( cOption == 'p' && oSettings.oFeatures.bPaginate )\n\t\t\t{\n\t\t\t\t/* Pagination */\n\t\t\t\tnTmp = _fnFeatureHtmlPaginate( oSettings );\n\t\t\t\tiPushFeature = 1;\n\t\t\t}\n\t\t\telse if ( DataTable.ext.feature.length !== 0 )\n\t\t\t{\n\t\t\t\t/* Plug-in features */\n\t\t\t\tvar aoFeatures = DataTable.ext.feature;\n\t\t\t\tfor ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )\n\t\t\t\t{\n\t\t\t\t\tif ( cOption == aoFeatures[k].cFeature )\n\t\t\t\t\t{\n\t\t\t\t\t\tnTmp = aoFeatures[k].fnInit( oSettings );\n\t\t\t\t\t\tif ( nTmp )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tiPushFeature = 1;\n\t\t\t\t\t\t}\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\t/* Add to the 2D features array */\n\t\t\tif ( iPushFeature == 1 && nTmp !== null )\n\t\t\t{\n\t\t\t\tif ( typeof oSettings.aanFeatures[cOption] !== 'object' )\n\t\t\t\t{\n\t\t\t\t\toSettings.aanFeatures[cOption] = [];\n\t\t\t\t}\n\t\t\t\toSettings.aanFeatures[cOption].push( nTmp );\n\t\t\t\tnInsertNode.appendChild( nTmp );\n\t\t\t}\n\t\t}\n\n\t\t/* Built our DOM structure - replace the holding div with what we want */\n\t\tnHolding.parentNode.replaceChild( oSettings.nTableWrapper, nHolding );\n\t}\n\n\n\t/**\n\t * Use the DOM source to create up an array of header cells. The idea here is to\n\t * create a layout grid (array) of rows x columns, which contains a reference\n\t * to the cell that that point in the grid (regardless of col/rowspan), such that\n\t * any column / row could be removed and the new grid constructed\n\t *  @param array {object} aLayout Array to store the calculated layout in\n\t *  @param {node} nThead The header/footer element for the table\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnDetectHeader ( aLayout, nThead )\n\t{\n\t\tvar nTrs = $(nThead).children('tr');\n\t\tvar nTr, nCell;\n\t\tvar i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;\n\t\tvar bUnique;\n\t\tvar fnShiftCol = function ( a, i, j ) {\n\t\t\tvar k = a[i];\n\t                while ( k[j] ) {\n\t\t\t\tj++;\n\t\t\t}\n\t\t\treturn j;\n\t\t};\n\n\t\taLayout.splice( 0, aLayout.length );\n\n\t\t/* We know how many rows there are in the layout - so prep it */\n\t\tfor ( i=0, iLen=nTrs.length ; i<iLen ; i++ )\n\t\t{\n\t\t\taLayout.push( [] );\n\t\t}\n\n\t\t/* Calculate a layout array */\n\t\tfor ( i=0, iLen=nTrs.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tnTr = nTrs[i];\n\t\t\tiColumn = 0;\n\n\t\t\t/* For every cell in the row... */\n\t\t\tnCell = nTr.firstChild;\n\t\t\twhile ( nCell ) {\n\t\t\t\tif ( nCell.nodeName.toUpperCase() == \"TD\" ||\n\t\t\t\t     nCell.nodeName.toUpperCase() == \"TH\" )\n\t\t\t\t{\n\t\t\t\t\t/* Get the col and rowspan attributes from the DOM and sanitise them */\n\t\t\t\t\tiColspan = nCell.getAttribute('colspan') * 1;\n\t\t\t\t\tiRowspan = nCell.getAttribute('rowspan') * 1;\n\t\t\t\t\tiColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;\n\t\t\t\t\tiRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;\n\n\t\t\t\t\t/* There might be colspan cells already in this row, so shift our target\n\t\t\t\t\t * accordingly\n\t\t\t\t\t */\n\t\t\t\t\tiColShifted = fnShiftCol( aLayout, i, iColumn );\n\n\t\t\t\t\t/* Cache calculation for unique columns */\n\t\t\t\t\tbUnique = iColspan === 1 ? true : false;\n\n\t\t\t\t\t/* If there is col / rowspan, copy the information into the layout grid */\n\t\t\t\t\tfor ( l=0 ; l<iColspan ; l++ )\n\t\t\t\t\t{\n\t\t\t\t\t\tfor ( k=0 ; k<iRowspan ; k++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\taLayout[i+k][iColShifted+l] = {\n\t\t\t\t\t\t\t\t\"cell\": nCell,\n\t\t\t\t\t\t\t\t\"unique\": bUnique\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\taLayout[i+k].nTr = nTr;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tnCell = nCell.nextSibling;\n\t\t\t}\n\t\t}\n\t}\n\n\n\t/**\n\t * Get an array of unique th elements, one for each column\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {node} nHeader automatically detect the layout from this node - optional\n\t *  @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional\n\t *  @returns array {node} aReturn list of unique th's\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetUniqueThs ( oSettings, nHeader, aLayout )\n\t{\n\t\tvar aReturn = [];\n\t\tif ( !aLayout )\n\t\t{\n\t\t\taLayout = oSettings.aoHeader;\n\t\t\tif ( nHeader )\n\t\t\t{\n\t\t\t\taLayout = [];\n\t\t\t\t_fnDetectHeader( aLayout, nHeader );\n\t\t\t}\n\t\t}\n\n\t\tfor ( var i=0, iLen=aLayout.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tfor ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ )\n\t\t\t{\n\t\t\t\tif ( aLayout[i][j].unique &&\n\t\t\t\t\t (!aReturn[j] || !oSettings.bSortCellsTop) )\n\t\t\t\t{\n\t\t\t\t\taReturn[j] = aLayout[i][j].cell;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn aReturn;\n\t}\n\n\n\n\t/**\n\t * Create an Ajax call based on the table's settings, taking into account that\n\t * parameters can have multiple forms, and backwards compatibility.\n\t *\n\t * @param {object} oSettings dataTables settings object\n\t * @param {array} data Data to send to the server, required by\n\t *     DataTables - may be augmented by developer callbacks\n\t * @param {function} fn Callback function to run when data is obtained\n\t */\n\tfunction _fnBuildAjax( oSettings, data, fn )\n\t{\n\t\t// Compatibility with 1.9-, allow fnServerData and event to manipulate\n\t\t_fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [data] );\n\n\t\t// Convert to object based for 1.10+ if using the old scheme\n\t\tif ( data && data.__legacy ) {\n\t\t\tvar tmp = {};\n\t\t\tvar rbracket = /(.*?)\\[\\]$/;\n\n\t\t\t$.each( data, function (key, val) {\n\t\t\t\tvar match = val.name.match(rbracket);\n\n\t\t\t\tif ( match ) {\n\t\t\t\t\t// Support for arrays\n\t\t\t\t\tvar name = match[0];\n\n\t\t\t\t\tif ( ! tmp[ name ] ) {\n\t\t\t\t\t\ttmp[ name ] = [];\n\t\t\t\t\t}\n\t\t\t\t\ttmp[ name ].push( val.value );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttmp[val.name] = val.value;\n\t\t\t\t}\n\t\t\t} );\n\t\t\tdata = tmp;\n\t\t}\n\n\t\tvar ajaxData;\n\t\tvar ajax = oSettings.ajax;\n\t\tvar instance = oSettings.oInstance;\n\n\t\tif ( $.isPlainObject( ajax ) && ajax.data )\n\t\t{\n\t\t\tajaxData = ajax.data;\n\n\t\t\tvar newData = $.isFunction( ajaxData ) ?\n\t\t\t\tajaxData( data ) :  // fn can manipulate data or return an object\n\t\t\t\tajaxData;           // object or array to merge\n\n\t\t\t// If the function returned an object, use that alone\n\t\t\tdata = $.isFunction( ajaxData ) && newData ?\n\t\t\t\tnewData :\n\t\t\t\t$.extend( true, data, newData );\n\n\t\t\t// Remove the data property as we've resolved it already and don't want\n\t\t\t// jQuery to do it again (it is restored at the end of the function)\n\t\t\tdelete ajax.data;\n\t\t}\n\n\t\tvar baseAjax = {\n\t\t\t\"data\": data,\n\t\t\t\"success\": function (json) {\n\t\t\t\tvar error = json.error || json.sError;\n\t\t\t\tif ( error ) {\n\t\t\t\t\toSettings.oApi._fnLog( oSettings, 0, error );\n\t\t\t\t}\n\n\t\t\t\toSettings.json = json;\n\t\t\t\t_fnCallbackFire( oSettings, null, 'xhr', [oSettings, json] );\n\t\t\t\tfn( json );\n\t\t\t},\n\t\t\t\"dataType\": \"json\",\n\t\t\t\"cache\": false,\n\t\t\t\"type\": oSettings.sServerMethod,\n\t\t\t\"error\": function (xhr, error, thrown) {\n\t\t\t\tvar log = oSettings.oApi._fnLog;\n\n\t\t\t\tif ( error == \"parsererror\" ) {\n\t\t\t\t\tlog( oSettings, 0, 'Invalid JSON response', 1 );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlog( oSettings, 0, 'Ajax error', 7 );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tif ( oSettings.fnServerData )\n\t\t{\n\t\t\t// DataTables 1.9- compatibility\n\t\t\toSettings.fnServerData.call( instance,\n\t\t\t\toSettings.sAjaxSource, data, fn, oSettings\n\t\t\t);\n\t\t}\n\t\telse if ( oSettings.sAjaxSource || typeof ajax === 'string' )\n\t\t{\n\t\t\t// DataTables 1.9- compatibility\n\t\t\toSettings.jqXHR = $.ajax( $.extend( baseAjax, {\n\t\t\t\turl: ajax || oSettings.sAjaxSource\n\t\t\t} ) );\n\t\t}\n\t\telse if ( $.isFunction( ajax ) )\n\t\t{\n\t\t\t// Is a function - let the caller define what needs to be done\n\t\t\toSettings.jqXHR = ajax.call( instance, data, fn, oSettings );\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Object to extend the base settings\n\t\t\toSettings.jqXHR = $.ajax( $.extend( baseAjax, ajax ) );\n\n\t\t\t// Restore for next time around\n\t\t\tajax.data = ajaxData;\n\t\t}\n\t}\n\n\n\t/**\n\t * Update the table using an Ajax call\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {boolean} Block the table drawing or not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAjaxUpdate( oSettings )\n\t{\n\t\tif ( oSettings.bAjaxDataGet )\n\t\t{\n\t\t\toSettings.iDraw++;\n\t\t\t_fnProcessingDisplay( oSettings, true );\n\t\t\tvar iColumns = oSettings.aoColumns.length;\n\t\t\tvar aoData = _fnAjaxParameters( oSettings );\n\n\t\t\t_fnBuildAjax( oSettings, aoData, function(json) {\n\t\t\t\t_fnAjaxUpdateDraw( oSettings, json );\n\t\t\t}, oSettings );\n\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\n\t/**\n\t * Build up the parameters in an object needed for a server-side processing\n\t * request. Note that this is basically done twice, is different ways - a modern\n\t * method which is used by default in DataTables 1.10 which uses objects and\n\t * arrays, or the 1.9- method with is name / value pairs. 1.9 method is used if\n\t * the sAjaxSource option is used in the initialisation, or the legacyAjax\n\t * option is set.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {bool} block the table drawing or not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAjaxParameters( settings )\n\t{\n\t\tvar\n\t\t\tcolumns = settings.aoColumns,\n\t\t\tcolumnCount = columns.length,\n\t\t\tfeatures = settings.oFeatures,\n\t\t\tpreSearch = settings.oPreviousSearch,\n\t\t\tpreColSearch = settings.aoPreSearchCols,\n\t\t\ti, data = [], dataProp, column, columnSearch,\n\t\t\tsort = _fnSortFlatten( settings ),\n\t\t\tdisplayStart = settings._iDisplayStart,\n\t\t\tdisplayLength = features.bPaginate !== false ?\n\t\t\t\tsettings._iDisplayLength :\n\t\t\t\t-1;\n\n\t\tvar param = function ( name, value ) {\n\t\t\tdata.push( { 'name': name, 'value': value } );\n\t\t};\n\n\t\t// DataTables 1.9- compatible method\n\t\tparam( 'sEcho',          settings.iDraw );\n\t\tparam( 'iColumns',       columnCount );\n\t\tparam( 'sColumns',       _pluck( columns, 'sName' ).join(',') );\n\t\tparam( 'iDisplayStart',  displayStart );\n\t\tparam( 'iDisplayLength', displayLength );\n\n\t\t// DataTables 1.10+ method\n\t\tvar d = {\n\t\t\tdraw:    settings.iDraw,\n\t\t\tcolumns: [],\n\t\t\torder:   [],\n\t\t\tstart:   displayStart,\n\t\t\tlength:  displayLength,\n\t\t\tsearch:  {\n\t\t\t\tvalue: preSearch.sSearch,\n\t\t\t\tregex: preSearch.bRegex\n\t\t\t}\n\t\t};\n\n\t\tfor ( i=0 ; i<columnCount ; i++ ) {\n\t\t\tcolumn = columns[i];\n\t\t\tcolumnSearch = preColSearch[i];\n\t\t\tdataProp = typeof column.mData==\"function\" ? 'function' : column.mData ;\n\n\t\t\td.columns.push( {\n\t\t\t\tdata:       dataProp,\n\t\t\t\tname:       column.sName,\n\t\t\t\tsearchable: column.bSearchable,\n\t\t\t\torderable:  column.bSortable,\n\t\t\t\tsearch:     {\n\t\t\t\t\tvalue: columnSearch.sSearch,\n\t\t\t\t\tregex: columnSearch.bRegex\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tparam( \"mDataProp_\"+i, dataProp );\n\n\t\t\tif ( features.bFilter ) {\n\t\t\t\tparam( 'sSearch_'+i,     columnSearch.sSearch );\n\t\t\t\tparam( 'bRegex_'+i,      columnSearch.bRegex );\n\t\t\t\tparam( 'bSearchable_'+i, column.bSearchable );\n\t\t\t}\n\n\t\t\tif ( features.bSort ) {\n\t\t\t\tparam( 'bSortable_'+i, column.bSortable );\n\t\t\t}\n\t\t}\n\n\t\t$.each( sort, function ( i, val ) {\n\t\t\td.order.push( { column: val.col, dir: val.dir } );\n\n\t\t\tparam( 'iSortCol_'+i, val.col );\n\t\t\tparam( 'sSortDir_'+i, val.dir );\n\t\t} );\n\n\t\tif ( features.bFilter ) {\n\t\t\tparam( 'sSearch', preSearch.sSearch );\n\t\t\tparam( 'bRegex', preSearch.bRegex );\n\t\t}\n\n\t\tif ( features.bSort ) {\n\t\t\tparam( 'iSortingCols', sort.length );\n\t\t}\n\n\t\tdata.__legacy = true;\n\t\treturn settings.sAjaxSource || DataTable.ext.legacy.ajax ?\n\t\t\tdata : d;\n\t}\n\n\n\t/**\n\t * Data the data from the server (nuking the old) and redraw the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {object} json json data return from the server.\n\t *  @param {string} json.sEcho Tracking flag for DataTables to match requests\n\t *  @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering\n\t *  @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering\n\t *  @param {array} json.aaData The data to display on this page\n\t *  @param {string} [json.sColumns] Column ordering (sName, comma separated)\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAjaxUpdateDraw ( settings, json )\n\t{\n\t\t// v1.10 uses camelCase variables, while 1.9 uses Hungarian notation.\n\t\t// Support both\n\t\tvar compat = function ( old, modern ) {\n\t\t\treturn json[old] !== undefined ? json[old] : json[modern];\n\t\t};\n\n\t\tvar draw            = compat( 'sEcho',                'draw' );\n\t\tvar recordsTotal    = compat( 'iTotalRecords',        'recordsTotal' );\n\t\tvar rocordsFiltered = compat( 'iTotalDisplayRecords', 'recordsFiltered' );\n\n\t\tif ( draw ) {\n\t\t\t// Protect against out of sequence returns\n\t\t\tif ( draw*1 < settings.iDraw ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsettings.iDraw = draw * 1;\n\t\t}\n\n\t\t_fnClearTable( settings );\n\t\tsettings._iRecordsTotal   = parseInt(recordsTotal, 10);\n\t\tsettings._iRecordsDisplay = parseInt(rocordsFiltered, 10);\n\n\t\tvar data = _fnAjaxDataSrc( settings, json );\n\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t_fnAddData( settings, data[i] );\n\t\t}\n\t\tsettings.aiDisplay = settings.aiDisplayMaster.slice();\n\n\t\tsettings.bAjaxDataGet = false;\n\t\t_fnDraw( settings );\n\n\t\tif ( ! settings._bInitComplete ) {\n\t\t\t_fnInitComplete( settings, json );\n\t\t}\n\n\t\tsettings.bAjaxDataGet = true;\n\t\t_fnProcessingDisplay( settings, false );\n\t}\n\n\n\t/**\n\t * Get the data from the JSON data source to use for drawing a table. Using\n\t * `_fnGetObjectDataFn` allows the data to be sourced from a property of the\n\t * source object, or from a processing function.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param  {object} json Data source object / array from the server\n\t *  @return {array} Array of data to use\n\t */\n\tfunction _fnAjaxDataSrc ( oSettings, json )\n\t{\n\t\tvar dataSrc = $.isPlainObject( oSettings.ajax ) && oSettings.ajax.dataSrc !== undefined ?\n\t\t\toSettings.ajax.dataSrc :\n\t\t\toSettings.sAjaxDataProp; // Compatibility with 1.9-.\n\n\t\t// Compatibility with 1.9-. In order to read from aaData, check if the\n\t\t// default has been changed, if not, check for aaData\n\t\tif ( dataSrc === 'data' ) {\n\t\t\treturn json.aaData || json[dataSrc];\n\t\t}\n\n\t\treturn dataSrc !== \"\" ?\n\t\t\t_fnGetObjectDataFn( dataSrc )( json ) :\n\t\t\tjson;\n\t}\n\n\n\t/**\n\t * Generate the node required for filtering text\n\t *  @returns {node} Filter control element\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlFilter ( settings )\n\t{\n\t\tvar classes = settings.oClasses;\n\t\tvar tableId = settings.sTableId;\n\t\tvar previousSearch = settings.oPreviousSearch;\n\t\tvar features = settings.aanFeatures;\n\t\tvar input = '<input type=\"search\" class=\"'+classes.sFilterInput+'\"/>';\n\n\t\tvar str = settings.oLanguage.sSearch;\n\t\tstr = str.match(/_INPUT_/) ?\n\t\t\tstr.replace('_INPUT_', input) :\n\t\t\tstr+input;\n\n\t\tvar filter = $('<div/>', {\n\t\t\t\t'id': ! features.f ? tableId+'_filter' : null,\n\t\t\t\t'class': classes.sFilter\n\t\t\t} )\n\t\t\t.append( $('<label/>' ).append( str ) );\n\n\t\tvar jqFilter = $('input[type=\"search\"]', filter)\n\t\t\t.val( previousSearch.sSearch.replace('\"','&quot;') )\n\t\t\t.bind( 'keyup.DT search.DT input.DT paste.DT cut.DT', function(e) {\n\t\t\t\t/* Update all other filter input elements for the new display */\n\t\t\t\tvar n = features.f;\n\t\t\t\tvar val = !this.value ? \"\" : this.value; // mental IE8 fix :-(\n\n\t\t\t\t/* Now do the filter */\n\t\t\t\tif ( val != previousSearch.sSearch ) {\n\t\t\t\t\t_fnFilterComplete( settings, {\n\t\t\t\t\t\t\"sSearch\": val,\n\t\t\t\t\t\t\"bRegex\": previousSearch.bRegex,\n\t\t\t\t\t\t\"bSmart\": previousSearch.bSmart ,\n\t\t\t\t\t\t\"bCaseInsensitive\": previousSearch.bCaseInsensitive\n\t\t\t\t\t} );\n\n\t\t\t\t\t// Need to redraw, without resorting\n\t\t\t\t\tsettings._iDisplayStart = 0;\n\t\t\t\t\t_fnDraw( settings );\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.bind( 'keypress.DT', function(e) {\n\t\t\t\t/* Prevent form submission */\n\t\t\t\tif ( e.keyCode == 13 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.attr('aria-controls', tableId);\n\n\t\t// Update the input elements whenever the table is filtered\n\t\t$(settings.nTable).on( 'filter.DT', function () {\n\t\t\t// IE9 throws an 'unknown error' if document.activeElement is used\n\t\t\t// inside an iframe or frame...\n\t\t\ttry {\n\t\t\t\tif ( jqFilter[0] !== document.activeElement ) {\n\t\t\t\t\tjqFilter.val( previousSearch.sSearch );\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch ( e ) {}\n\t\t} );\n\n\t\treturn filter[0];\n\t}\n\n\n\t/**\n\t * Filter the table using both the global filter and column based filtering\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {object} oSearch search information\n\t *  @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFilterComplete ( oSettings, oInput, iForce )\n\t{\n\t\tvar oPrevSearch = oSettings.oPreviousSearch;\n\t\tvar aoPrevSearch = oSettings.aoPreSearchCols;\n\t\tvar fnSaveFilter = function ( oFilter ) {\n\t\t\t/* Save the filtering values */\n\t\t\toPrevSearch.sSearch = oFilter.sSearch;\n\t\t\toPrevSearch.bRegex = oFilter.bRegex;\n\t\t\toPrevSearch.bSmart = oFilter.bSmart;\n\t\t\toPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;\n\t\t};\n\n\t\t// Resolve any column types that are unknown due to addition or invalidation\n\t\t// @todo As per sort - can this be moved into an event handler?\n\t\t_fnColumnTypes( oSettings );\n\n\t\t/* In server-side processing all filtering is done by the server, so no point hanging around here */\n\t\tif ( _fnDataSource( oSettings ) != 'ssp' )\n\t\t{\n\t\t\t/* Global filter */\n\t\t\t_fnFilter( oSettings, oInput.sSearch, iForce, oInput.bRegex, oInput.bSmart, oInput.bCaseInsensitive );\n\t\t\tfnSaveFilter( oInput );\n\n\t\t\t/* Now do the individual column filter */\n\t\t\tfor ( var i=0 ; i<aoPrevSearch.length ; i++ )\n\t\t\t{\n\t\t\t\t_fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, aoPrevSearch[i].bRegex,\n\t\t\t\t\taoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive );\n\t\t\t}\n\n\t\t\t/* Custom filtering */\n\t\t\t_fnFilterCustom( oSettings );\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfnSaveFilter( oInput );\n\t\t}\n\n\t\t/* Tell the draw function we have been filtering */\n\t\toSettings.bFiltered = true;\n\t\t_fnCallbackFire( oSettings, null, 'search', [oSettings] );\n\t}\n\n\n\t/**\n\t * Apply custom filtering functions\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFilterCustom( oSettings )\n\t{\n\t\tvar afnFilters = DataTable.ext.search;\n\t\tvar aiFilterColumns = _fnGetColumns( oSettings, 'bSearchable' );\n\n\t\tfor ( var i=0, iLen=afnFilters.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tvar iCorrector = 0;\n\t\t\tfor ( var j=0, jLen=oSettings.aiDisplay.length ; j<jLen ; j++ )\n\t\t\t{\n\t\t\t\tvar iDisIndex = oSettings.aiDisplay[j-iCorrector];\n\t\t\t\tvar bTest = afnFilters[i](\n\t\t\t\t\toSettings,\n\t\t\t\t\t_fnGetRowData( oSettings, iDisIndex, 'filter', aiFilterColumns ),\n\t\t\t\t\tiDisIndex\n\t\t\t\t);\n\n\t\t\t\t/* Check if we should use this row based on the filtering function */\n\t\t\t\tif ( !bTest )\n\t\t\t\t{\n\t\t\t\t\toSettings.aiDisplay.splice( j-iCorrector, 1 );\n\t\t\t\t\tiCorrector++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\t/**\n\t * Filter the table on a per-column basis\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {string} sInput string to filter on\n\t *  @param {int} iColumn column to filter\n\t *  @param {bool} bRegex treat search string as a regular expression or not\n\t *  @param {bool} bSmart use smart filtering or not\n\t *  @param {bool} bCaseInsensitive Do case insenstive matching or not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFilterColumn ( settings, searchStr, colIdx, regex, smart, caseInsensitive )\n\t{\n\t\tif ( searchStr === '' ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar data;\n\t\tvar display = settings.aiDisplay;\n\t\tvar rpSearch = _fnFilterCreateSearch( searchStr, regex, smart, caseInsensitive );\n\n\t\tfor ( var i=display.length-1 ; i>=0 ; i-- ) {\n\t\t\tdata = settings.aoData[ display[i] ]._aFilterData[ colIdx ];\n\n\t\t\tif ( ! rpSearch.test( data ) ) {\n\t\t\t\tdisplay.splice( i, 1 );\n\t\t\t}\n\t\t}\n\t}\n\n\n\t/**\n\t * Filter the data table based on user input and draw the table\n\t *  @param {object} settings dataTables settings object\n\t *  @param {string} input string to filter on\n\t *  @param {int} force optional - force a research of the master array (1) or not (undefined or 0)\n\t *  @param {bool} regex treat as a regular expression or not\n\t *  @param {bool} smart perform smart filtering or not\n\t *  @param {bool} caseInsensitive Do case insenstive matching or not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFilter( settings, input, force, regex, smart, caseInsensitive )\n\t{\n\t\tvar rpSearch = _fnFilterCreateSearch( input, regex, smart, caseInsensitive );\n\t\tvar prevSearch = settings.oPreviousSearch.sSearch;\n\t\tvar displayMaster = settings.aiDisplayMaster;\n\t\tvar display, invalidated, i;\n\n\t\t// Need to take account of custom filtering functions - always filter\n\t\tif ( DataTable.ext.search.length !== 0 ) {\n\t\t\tforce = true;\n\t\t}\n\n\t\t// Check if any of the rows were invalidated\n\t\tinvalidated = _fnFilterData( settings );\n\n\t\t// If the input is blank - we just want the full data set\n\t\tif ( input.length <= 0 ) {\n\t\t\tsettings.aiDisplay = displayMaster.slice();\n\t\t}\n\t\telse {\n\t\t\t// New search - start from the master array\n\t\t\tif ( invalidated ||\n\t\t\t\t force ||\n\t\t\t\t prevSearch.length > input.length ||\n\t\t\t\t input.indexOf(prevSearch) !== 0 ||\n\t\t\t\t settings.bSorted // On resort, the display master needs to be\n\t\t\t\t                  // re-filtered since indexes will have changed\n\t\t\t) {\n\t\t\t\tsettings.aiDisplay = displayMaster.slice();\n\t\t\t}\n\n\t\t\t// Search the display array\n\t\t\tdisplay = settings.aiDisplay;\n\n\t\t\tfor ( i=display.length-1 ; i>=0 ; i-- ) {\n\t\t\t\tif ( ! rpSearch.test( settings.aoData[ display[i] ]._sFilterRow ) ) {\n\t\t\t\t\tdisplay.splice( i, 1 );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\t/**\n\t * Build a regular expression object suitable for searching a table\n\t *  @param {string} sSearch string to search for\n\t *  @param {bool} bRegex treat as a regular expression or not\n\t *  @param {bool} bSmart perform smart filtering or not\n\t *  @param {bool} bCaseInsensitive Do case insensitive matching or not\n\t *  @returns {RegExp} constructed object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFilterCreateSearch( sSearch, bRegex, bSmart, bCaseInsensitive )\n\t{\n\t\tvar asSearch,\n\t\t\tsRegExpString = bRegex ? sSearch : _fnEscapeRegex( sSearch );\n\n\t\tif ( bSmart )\n\t\t{\n\t\t\t/* Generate the regular expression to use. Something along the lines of:\n\t\t\t * ^(?=.*?\\bone\\b)(?=.*?\\btwo\\b)(?=.*?\\bthree\\b).*$\n\t\t\t */\n\t\t\tasSearch = sRegExpString.split( ' ' );\n\t\t\tsRegExpString = '^(?=.*?'+asSearch.join( ')(?=.*?' )+').*$';\n\t\t}\n\n\t\treturn new RegExp( sRegExpString, bCaseInsensitive ? \"i\" : \"\" );\n\t}\n\n\n\t/**\n\t * scape a string such that it can be used in a regular expression\n\t *  @param {string} sVal string to escape\n\t *  @returns {string} escaped string\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnEscapeRegex ( sVal )\n\t{\n\t\tvar acEscape = [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\\\', '$', '^', '-' ];\n\t\tvar reReplace = new RegExp( '(\\\\' + acEscape.join('|\\\\') + ')', 'g' );\n\t\treturn sVal.replace(reReplace, '\\\\$1');\n\t}\n\n\n\n\tvar __filter_div = $('<div>')[0];\n\tvar __filter_div_textContent = __filter_div.textContent !== undefined;\n\n\t// Update the filtering data for each row if needed (by invalidation or first run)\n\tfunction _fnFilterData ( settings )\n\t{\n\t\tvar columns = settings.aoColumns;\n\t\tvar column;\n\t\tvar i, j, ien, jen, filterData, cellData, row;\n\t\tvar fomatters = DataTable.ext.type.search;\n\t\tvar wasInvalidated = false;\n\n\t\tfor ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\trow = settings.aoData[i];\n\n\t\t\tif ( ! row._aFilterData ) {\n\t\t\t\tfilterData = [];\n\n\t\t\t\tfor ( j=0, jen=columns.length ; j<jen ; j++ ) {\n\t\t\t\t\tcolumn = columns[j];\n\n\t\t\t\t\tif ( column.bSearchable ) {\n\t\t\t\t\t\tcellData = _fnGetCellData( settings, i, j, 'filter' );\n\n\t\t\t\t\t\tcellData = fomatters[ column.sType ] ?\n\t\t\t\t\t\t\tfomatters[ column.sType ]( cellData ) :\n\t\t\t\t\t\t\tcellData !== null ?\n\t\t\t\t\t\t\t\tcellData :\n\t\t\t\t\t\t\t\t'';\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tcellData = '';\n\t\t\t\t\t}\n\n\t\t\t\t\t// If it looks like there is an HTML entity in the string,\n\t\t\t\t\t// attempt to decode it so sorting works as expected. Note that\n\t\t\t\t\t// we could use a single line of jQuery to do this, but the DOM\n\t\t\t\t\t// method used here is much faster http://jsperf.com/html-decode\n\t\t\t\t\tif ( cellData.indexOf && cellData.indexOf('&') !== -1 ) {\n\t\t\t\t\t\t__filter_div.innerHTML = cellData;\n\t\t\t\t\t\tcellData = __filter_div_textContent ?\n\t\t\t\t\t\t\t__filter_div.textContent :\n\t\t\t\t\t\t\t__filter_div.innerText;\n\t\t\t\t\t\tcellData = cellData.replace(/[\\r\\n]/g, '');\n\t\t\t\t\t}\n\n\t\t\t\t\tfilterData.push( cellData );\n\t\t\t\t}\n\n\t\t\t\trow._aFilterData = filterData;\n\t\t\t\trow._sFilterRow = filterData.join('  ');\n\t\t\t\twasInvalidated = true;\n\t\t\t}\n\t\t}\n\n\t\treturn wasInvalidated;\n\t}\n\n\t/**\n\t * Generate the node required for the info display\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {node} Information element\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlInfo ( settings )\n\t{\n\t\tvar\n\t\t\ttid = settings.sTableId,\n\t\t\tnodes = settings.aanFeatures.i,\n\t\t\tn = $('<div/>', {\n\t\t\t\t'class': settings.oClasses.sInfo,\n\t\t\t\t'id': ! nodes ? tid+'_info' : null\n\t\t\t} );\n\n\t\tif ( ! nodes ) {\n\t\t\t// Update display on each draw\n\t\t\tsettings.aoDrawCallback.push( {\n\t\t\t\t\"fn\": _fnUpdateInfo,\n\t\t\t\t\"sName\": \"information\"\n\t\t\t} );\n\n\t\t\tn\n\t\t\t\t.attr( 'role', 'alert' )\n\t\t\t\t.attr( 'aria-live', 'polite' )\n\t\t\t\t.attr( 'aria-relevant', 'all' );\n\n\t\t\t// Table is described by our info div\n\t\t\t$(settings.nTable).attr( 'aria-describedby', tid+'_info' );\n\t\t}\n\n\t\treturn n[0];\n\t}\n\n\n\t/**\n\t * Update the information elements in the display\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnUpdateInfo ( settings )\n\t{\n\t\t/* Show information about the table */\n\t\tvar nodes = settings.aanFeatures.i;\n\t\tif ( nodes.length === 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar\n\t\t\tlang  = settings.oLanguage,\n\t\t\tstart = settings._iDisplayStart+1,\n\t\t\tend   = settings.fnDisplayEnd(),\n\t\t\tmax   = settings.fnRecordsTotal(),\n\t\t\ttotal = settings.fnRecordsDisplay(),\n\t\t\tout   = total ?\n\t\t\t\tlang.sInfo :\n\t\t\t\tlang.sInfoEmpty;\n\n\t\tif ( total !== max ) {\n\t\t\t/* Record set after filtering */\n\t\t\tout += ' ' + lang.sInfoFiltered;\n\t\t}\n\n\t\t// Convert the macros\n\t\tout += lang.sInfoPostFix;\n\t\tout = _fnInfoMacros( settings, out );\n\n\t\tvar callback = lang.fnInfoCallback;\n\t\tif ( callback !== null ) {\n\t\t\tout = callback.call( settings.oInstance,\n\t\t\t\tsettings, start, end, max, total, out\n\t\t\t);\n\t\t}\n\n\t\t$(nodes).html( out );\n\t}\n\n\n\tfunction _fnInfoMacros ( settings, str )\n\t{\n\t\t// When infinite scrolling, we are always starting at 1. _iDisplayStart is used only\n\t\t// internally\n\t\tvar\n\t\t\tformatter  = settings.fnFormatNumber,\n\t\t\tstart      = settings._iDisplayStart+1,\n\t\t\tlen        = settings._iDisplayLength,\n\t\t\tvis        = settings.fnRecordsDisplay(),\n\t\t\tall        = len === -1;\n\n\t\treturn str.\n\t\t\treplace(/_START_/g, formatter.call( settings, start ) ).\n\t\t\treplace(/_END_/g,   formatter.call( settings, settings.fnDisplayEnd() ) ).\n\t\t\treplace(/_MAX_/g,   formatter.call( settings, settings.fnRecordsTotal() ) ).\n\t\t\treplace(/_TOTAL_/g, formatter.call( settings, vis ) ).\n\t\t\treplace(/_PAGE_/g,  formatter.call( settings, all ? 1 : Math.ceil( start / len ) ) ).\n\t\t\treplace(/_PAGES_/g, formatter.call( settings, all ? 1 : Math.ceil( vis / len ) ) );\n\t}\n\n\n\n\t/**\n\t * Draw the table for the first time, adding all required features\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnInitialise ( settings )\n\t{\n\t\tvar i, iLen, iAjaxStart=settings.iInitDisplayStart;\n\t\tvar columns = settings.aoColumns, column;\n\t\tvar features = settings.oFeatures;\n\n\t\t/* Ensure that the table data is fully initialised */\n\t\tif ( ! settings.bInitialised ) {\n\t\t\tsetTimeout( function(){ _fnInitialise( settings ); }, 200 );\n\t\t\treturn;\n\t\t}\n\n\t\t/* Show the display HTML options */\n\t\t_fnAddOptionsHtml( settings );\n\n\t\t/* Build and draw the header / footer for the table */\n\t\t_fnBuildHead( settings );\n\t\t_fnDrawHead( settings, settings.aoHeader );\n\t\t_fnDrawHead( settings, settings.aoFooter );\n\n\t\t/* Okay to show that something is going on now */\n\t\t_fnProcessingDisplay( settings, true );\n\n\t\t/* Calculate sizes for columns */\n\t\tif ( features.bAutoWidth ) {\n\t\t\t_fnCalculateColumnWidths( settings );\n\t\t}\n\n\t\tfor ( i=0, iLen=columns.length ; i<iLen ; i++ ) {\n\t\t\tcolumn = columns[i];\n\n\t\t\tif ( column.sWidth ) {\n\t\t\t\tcolumn.nTh.style.width = _fnStringToCss( column.sWidth );\n\t\t\t}\n\t\t}\n\n\t\t// If there is default sorting required - let's do it. The sort function\n\t\t// will do the drawing for us. Otherwise we draw the table regardless of the\n\t\t// Ajax source - this allows the table to look initialised for Ajax sourcing\n\t\t// data (show 'loading' message possibly)\n\t\t_fnReDraw( settings );\n\n\t\t// Server-side processing init complete is done by _fnAjaxUpdateDraw\n\t\tvar dataSrc = _fnDataSource( settings );\n\t\tif ( dataSrc != 'ssp' ) {\n\t\t\t// if there is an ajax source load the data\n\t\t\tif ( dataSrc == 'ajax' ) {\n\t\t\t\t_fnBuildAjax( settings, [], function(json) {\n\t\t\t\t\tvar aData = _fnAjaxDataSrc( settings, json );\n\n\t\t\t\t\t// Got the data - add it to the table\n\t\t\t\t\tfor ( i=0 ; i<aData.length ; i++ ) {\n\t\t\t\t\t\t_fnAddData( settings, aData[i] );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Reset the init display for cookie saving. We've already done\n\t\t\t\t\t// a filter, and therefore cleared it before. So we need to make\n\t\t\t\t\t// it appear 'fresh'\n\t\t\t\t\tsettings.iInitDisplayStart = iAjaxStart;\n\n\t\t\t\t\t_fnReDraw( settings );\n\n\t\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t\t\t_fnInitComplete( settings, json );\n\t\t\t\t}, settings );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t\t_fnInitComplete( settings );\n\t\t\t}\n\t\t}\n\t}\n\n\n\t/**\n\t * Draw the table for the first time, adding all required features\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {object} [json] JSON from the server that completed the table, if using Ajax source\n\t *    with client-side processing (optional)\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnInitComplete ( settings, json )\n\t{\n\t\tsettings._bInitComplete = true;\n\n\t\t// On an Ajax load we now have data and therefore want to apply the column\n\t\t// sizing\n\t\tif ( json ) {\n\t\t\t_fnAdjustColumnSizing( settings );\n\t\t}\n\n\t\t_fnCallbackFire( settings, 'aoInitComplete', 'init', [settings, json] );\n\t}\n\n\n\tfunction _fnLengthChange ( settings, val )\n\t{\n\t\tvar len = parseInt( val, 10 );\n\t\tsettings._iDisplayLength = len;\n\n\t\t_fnLengthOverflow( settings );\n\n\t\t// Fire length change event\n\t\t_fnCallbackFire( settings, null, 'length', [settings, len] );\n\t}\n\n\n\t/**\n\t * Generate the node required for user display length changing\n\t *  @param {object} settings dataTables settings object\n\t *  @returns {node} Display length feature node\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlLength ( settings )\n\t{\n\t\tvar\n\t\t\tclasses  = settings.oClasses,\n\t\t\ttableId  = settings.sTableId,\n\t\t\tmenu     = settings.aLengthMenu,\n\t\t\td2       = $.isArray( menu[0] ),\n\t\t\tlengths  = d2 ? menu[0] : menu,\n\t\t\tlanguage = d2 ? menu[1] : menu;\n\n\t\tvar select = $('<select/>', {\n\t\t\t'name':          tableId+'_length',\n\t\t\t'aria-controls': tableId,\n\t\t\t'class':         classes.sLengthSelect\n\t\t} );\n\n\t\tfor ( var i=0, ien=lengths.length ; i<ien ; i++ ) {\n\t\t\tselect[0][ i ] = new Option( language[i], lengths[i] );\n\t\t}\n\n\t\tvar div = $('<div><label/></div>').addClass( classes.sLength );\n\t\tif ( ! settings.aanFeatures.l ) {\n\t\t\tdiv[0].id = tableId+'_length';\n\t\t}\n\n\t\t// This split doesn't matter where _MENU_ is, we get three items back from it\n\t\tvar a = settings.oLanguage.sLengthMenu.split(/(_MENU_)/);\n\t\tdiv.children()\n\t\t\t.append( a[0] )\n\t\t\t.append( select )\n\t\t\t.append( a[2] );\n\n\t\tselect\n\t\t\t.val( settings._iDisplayLength )\n\t\t\t.bind( 'change.DT', function(e) {\n\t\t\t\t_fnLengthChange( settings, $(this).val() );\n\t\t\t\t_fnDraw( settings );\n\t\t\t} );\n\n\t\t// Update node value whenever anything changes the table's length\n\t\t$(settings.nTable).bind( 'length', function (e, s, len) {\n\t\t\tselect.val( len );\n\t\t} );\n\n\t\treturn div[0];\n\t}\n\n\n\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Note that most of the paging logic is done in\n\t * DataTable.ext.pager\n\t */\n\n\t/**\n\t * Generate the node required for default pagination\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {node} Pagination feature node\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlPaginate ( settings )\n\t{\n\t\tvar\n\t\t\ttype   = settings.sPaginationType,\n\t\t\tplugin = DataTable.ext.pager[ type ],\n\t\t\tmodern = typeof plugin === 'function',\n\t\t\tredraw = function( settings ) {\n\t\t\t\t_fnDraw( settings );\n\t\t\t},\n\t\t\tnode = $('<div/>').addClass( settings.oClasses.sPaging + type )[0],\n\t\t\tfeatures = settings.aanFeatures;\n\n\t\tif ( ! modern ) {\n\t\t\tplugin.fnInit( settings, node, redraw );\n\t\t}\n\n\t\t/* Add a draw callback for the pagination on first instance, to update the paging display */\n\t\tif ( ! features.p )\n\t\t{\n\t\t\tnode.id = settings.sTableId+'_paginate';\n\n\t\t\tsettings.aoDrawCallback.push( {\n\t\t\t\t\"fn\": function( settings ) {\n\t\t\t\t\tif ( modern ) {\n\t\t\t\t\t\tvar\n\t\t\t\t\t\t\tstart      = settings._iDisplayStart,\n\t\t\t\t\t\t\tlen        = settings._iDisplayLength,\n\t\t\t\t\t\t\tvisRecords = settings.fnRecordsDisplay(),\n\t\t\t\t\t\t\tall        = len === -1,\n\t\t\t\t\t\t\tpage = all ? 0 : Math.ceil( start / len ),\n\t\t\t\t\t\t\tpages = all ? 1 : Math.ceil( visRecords / len ),\n\t\t\t\t\t\t\tbuttons = plugin(page, pages),\n\t\t\t\t\t\t\ti, ien;\n\n\t\t\t\t\t\tfor ( i=0, ien=features.p.length ; i<ien ; i++ ) {\n\t\t\t\t\t\t\t_fnRenderer( settings, 'pageButton' )(\n\t\t\t\t\t\t\t\tsettings, features.p[i], i, buttons, page, pages\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\telse {\n\t\t\t\t\t\tplugin.fnUpdate( settings, redraw );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t\"sName\": \"pagination\"\n\t\t\t} );\n\t\t}\n\n\t\treturn node;\n\t}\n\n\n\t/**\n\t * Alter the display settings to change the page\n\t *  @param {object} settings DataTables settings object\n\t *  @param {string|int} action Paging action to take: \"first\", \"previous\",\n\t *    \"next\" or \"last\" or page number to jump to (integer)\n\t *  @param [bool] redraw Automatically draw the update or not\n\t *  @returns {bool} true page has changed, false - no change\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnPageChange ( settings, action, redraw )\n\t{\n\t\tvar\n\t\t\tstart     = settings._iDisplayStart,\n\t\t\tlen       = settings._iDisplayLength,\n\t\t\trecords   = settings.fnRecordsDisplay();\n\n\t\tif ( records === 0 || len === -1 )\n\t\t{\n\t\t\tstart = 0;\n\t\t}\n\t\telse if ( typeof action === \"number\" )\n\t\t{\n\t\t\tstart = action * len;\n\n\t\t\tif ( start > records )\n\t\t\t{\n\t\t\t\tstart = 0;\n\t\t\t}\n\t\t}\n\t\telse if ( action == \"first\" )\n\t\t{\n\t\t\tstart = 0;\n\t\t}\n\t\telse if ( action == \"previous\" )\n\t\t{\n\t\t\tstart = len >= 0 ?\n\t\t\t\tstart - len :\n\t\t\t\t0;\n\n\t\t\tif ( start < 0 )\n\t\t\t{\n\t\t\t  start = 0;\n\t\t\t}\n\t\t}\n\t\telse if ( action == \"next\" )\n\t\t{\n\t\t\tif ( start + len < records )\n\t\t\t{\n\t\t\t\tstart += len;\n\t\t\t}\n\t\t}\n\t\telse if ( action == \"last\" )\n\t\t{\n\t\t\tstart = Math.floor( (records-1) / len) * len;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t_fnLog( settings, 0, \"Unknown paging action: \"+action, 5 );\n\t\t}\n\n\t\tvar changed = settings._iDisplayStart !== start;\n\t\tsettings._iDisplayStart = start;\n\n\t\t_fnCallbackFire( settings, null, 'page', [settings] );\n\n\t\tif ( redraw ) {\n\t\t\t_fnDraw( settings );\n\t\t}\n\n\t\treturn changed;\n\t}\n\n\n\n\t/**\n\t * Generate the node required for the processing node\n\t *  @param {object} settings dataTables settings object\n\t *  @returns {node} Processing element\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlProcessing ( settings )\n\t{\n\t\treturn $('<div/>', {\n\t\t\t\t'id': ! settings.aanFeatures.r ? settings.sTableId+'_processing' : null,\n\t\t\t\t'class': settings.oClasses.sProcessing\n\t\t\t} )\n\t\t\t.html( settings.oLanguage.sProcessing )\n\t\t\t.insertBefore( settings.nTable )[0];\n\t}\n\n\n\t/**\n\t * Display or hide the processing indicator\n\t *  @param {object} settings dataTables settings object\n\t *  @param {bool} show Show the processing indicator (true) or not (false)\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnProcessingDisplay ( settings, show )\n\t{\n\t\tif ( settings.oFeatures.bProcessing ) {\n\t\t\t$(settings.aanFeatures.r).css( 'visibility', show ? 'visible' : 'hidden' );\n\t\t}\n\n\t\t_fnCallbackFire( settings, null, 'processing', [settings, show] );\n\t}\n\n\t/**\n\t * Add any control elements for the table - specifically scrolling\n\t *  @param {object} settings dataTables settings object\n\t *  @returns {node} Node to add to the DOM\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlTable ( settings )\n\t{\n\t\tvar scroll = settings.oScroll;\n\n\t\tif ( scroll.sX === '' && scroll.sY === '' ) {\n\t\t\treturn settings.nTable;\n\t\t}\n\n\t\tvar scrollX = scroll.sX;\n\t\tvar scrollY = scroll.sY;\n\t\tvar classes = settings.oClasses;\n\t\tvar table = $(settings.nTable);\n\t\tvar caption = table.children('caption');\n\t\tvar captionSide = caption.length ? caption[0]._captionSide : null;\n\t\tvar headerClone = $( table[0].cloneNode(false) );\n\t\tvar footerClone = $( table[0].cloneNode(false) );\n\t\tvar footer = table.children('tfoot');\n\t\tvar _div = '<div/>';\n\t\tvar size = function ( s ) {\n\t\t\treturn !s ? null : _fnStringToCss( s );\n\t\t};\n\n\t\tif ( ! footer.length ) {\n\t\t\tfooter = null;\n\t\t}\n\n\t\t/*\n\t\t * The HTML structure that we want to generate in this function is:\n\t\t *  div - scroller\n\t\t *    div - scroll head\n\t\t *      div - scroll head inner\n\t\t *        table - scroll head table\n\t\t *          thead - thead\n\t\t *    div - scroll body\n\t\t *      table - table (master table)\n\t\t *        thead - thead clone for sizing\n\t\t *        tbody - tbody\n\t\t *    div - scroll foot\n\t\t *      div - scroll foot inner\n\t\t *        table - scroll foot table\n\t\t *          tfoot - tfoot\n\t\t */\n\t\tvar scroller = $( _div, { 'class': classes.sScrollWrapper } )\n\t\t\t.append(\n\t\t\t\t$(_div, { 'class': classes.sScrollHead } )\n\t\t\t\t\t.css( {\n\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\tposition: 'relative',\n\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\twidth: scrollX ? size(scrollX) : '100%'\n\t\t\t\t\t} )\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$(_div, { 'class': classes.sScrollHeadInner } )\n\t\t\t\t\t\t\t.css( {\n\t\t\t\t\t\t\t\t'box-sizing': 'content-box',\n\t\t\t\t\t\t\t\twidth: scroll.sXInner || '100%'\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\theaderClone\n\t\t\t\t\t\t\t\t\t.removeAttr('id')\n\t\t\t\t\t\t\t\t\t.css( 'margin-left', 0 )\n\t\t\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\t\t\ttable.children('thead')\n\t\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.append( captionSide === 'top' ? caption : null )\n\t\t\t)\n\t\t\t.append(\n\t\t\t\t$(_div, { 'class': classes.sScrollBody } )\n\t\t\t\t\t.css( {\n\t\t\t\t\t\toverflow: 'auto',\n\t\t\t\t\t\theight: size( scrollY ),\n\t\t\t\t\t\twidth: size( scrollX )\n\t\t\t\t\t} )\n\t\t\t\t\t.append( table )\n\t\t\t);\n\n\t\tif ( footer ) {\n\t\t\tscroller.append(\n\t\t\t\t$(_div, { 'class': classes.sScrollFoot } )\n\t\t\t\t\t.css( {\n\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\twidth: scrollX ? size(scrollX) : '100%'\n\t\t\t\t\t} )\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$(_div, { 'class': classes.sScrollFootInner } )\n\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\tfooterClone\n\t\t\t\t\t\t\t\t\t.removeAttr('id')\n\t\t\t\t\t\t\t\t\t.css( 'margin-left', 0 )\n\t\t\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\t\t\ttable.children('tfoot')\n\t\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.append( captionSide === 'bottom' ? caption : null )\n\t\t\t);\n\t\t}\n\n\t\tvar children = scroller.children();\n\t\tvar scrollHead = children[0];\n\t\tvar scrollBody = children[1];\n\t\tvar scrollFoot = footer ? children[2] : null;\n\n\t\t// When the body is scrolled, then we also want to scroll the headers\n\t\tif ( scrollX ) {\n\t\t\t$(scrollBody).scroll( function (e) {\n\t\t\t\tvar scrollLeft = this.scrollLeft;\n\n\t\t\t\tscrollHead.scrollLeft = scrollLeft;\n\n\t\t\t\tif ( footer ) {\n\t\t\t\t\tscrollFoot.scrollLeft = scrollLeft;\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\tsettings.nScrollHead = scrollHead;\n\t\tsettings.nScrollBody = scrollBody;\n\t\tsettings.nScrollFoot = scrollFoot;\n\n\t\t// On redraw - align columns\n\t\tsettings.aoDrawCallback.push( {\n\t\t\t\"fn\": _fnScrollDraw,\n\t\t\t\"sName\": \"scrolling\"\n\t\t} );\n\n\t\treturn scroller[0];\n\t}\n\n\n\n\t/**\n\t * Update the header, footer and body tables for resizing - i.e. column\n\t * alignment.\n\t *\n\t * Welcome to the most horrible function DataTables. The process that this\n\t * function follows is basically:\n\t *   1. Re-create the table inside the scrolling div\n\t *   2. Take live measurements from the DOM\n\t *   3. Apply the measurements to align the columns\n\t *   4. Clean up\n\t *\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnScrollDraw ( settings )\n\t{\n\t\t// Given that this is such a monster function, a lot of variables are use\n\t\t// to try and keep the minimised size as small as possible\n\t\tvar\n\t\t\tscroll         = settings.oScroll,\n\t\t\tscrollX        = scroll.sX,\n\t\t\tscrollXInner   = scroll.sXInner,\n\t\t\tscrollY        = scroll.sY,\n\t\t\tbarWidth       = scroll.iBarWidth,\n\t\t\tdivHeader      = $(settings.nScrollHead),\n\t\t\tdivHeaderStyle = divHeader[0].style,\n\t\t\tdivHeaderInner = divHeader.children('div'),\n\t\t\tdivHeaderInnerStyle = divHeaderInner[0].style,\n\t\t\tdivHeaderTable = divHeaderInner.children('table'),\n\t\t\tdivBodyEl      = settings.nScrollBody,\n\t\t\tdivBody        = $(divBodyEl),\n\t\t\tdivBodyStyle   = divBodyEl.style,\n\t\t\tdivFooter      = $(settings.nScrollFoot),\n\t\t\tdivFooterInner = divFooter.children('div'),\n\t\t\tdivFooterTable = divFooterInner.children('table'),\n\t\t\theader         = $(settings.nTHead),\n\t\t\ttable          = $(settings.nTable),\n\t\t\ttableEl        = table[0],\n\t\t\ttableStyle     = tableEl.style,\n\t\t\tfooter         = settings.nTFoot ? $(settings.nTFoot) : null,\n\t\t\tbrowser        = settings.oBrowser,\n\t\t\tie67           = browser.bScrollOversize,\n\t\t\theaderTrgEls, footerTrgEls,\n\t\t\theaderSrcEls, footerSrcEls,\n\t\t\theaderCopy, footerCopy,\n\t\t\theaderWidths=[], footerWidths=[],\n\t\t\tidx, correction, sanityWidth,\n\t\t\tzeroOut = function(nSizer) {\n\t\t\t\tvar style = nSizer.style;\n\t\t\t\tstyle.paddingTop = \"0\";\n\t\t\t\tstyle.paddingBottom = \"0\";\n\t\t\t\tstyle.borderTopWidth = \"0\";\n\t\t\t\tstyle.borderBottomWidth = \"0\";\n\t\t\t\tstyle.height = 0;\n\t\t\t};\n\n\t\t/*\n\t\t * 1. Re-create the table inside the scrolling div\n\t\t */\n\n\t\t// Remove the old minimised thead and tfoot elements in the inner table\n\t\ttable.children('thead, tfoot').remove();\n\n\t\t// Clone the current header and footer elements and then place it into the inner table\n\t\theaderCopy = header.clone().prependTo( table );\n\t\theaderTrgEls = header.find('tr'); // original header is in its own table\n\t\theaderSrcEls = headerCopy.find('tr');\n\t\theaderCopy.find('th, td').removeAttr('tabindex');\n\n\t\tif ( footer ) {\n\t\t\tfooterCopy = footer.clone().prependTo( table );\n\t\t\tfooterTrgEls = footer.find('tr'); // the original tfoot is in its own table and must be sized\n\t\t\tfooterSrcEls = footerCopy.find('tr');\n\t\t}\n\n\n\t\t/*\n\t\t * 2. Take live measurements from the DOM - do not alter the DOM itself!\n\t\t */\n\n\t\t// Remove old sizing and apply the calculated column widths\n\t\t// Get the unique column headers in the newly created (cloned) header. We want to apply the\n\t\t// calculated sizes to this header\n\t\tif ( ! scrollX )\n\t\t{\n\t\t\tdivBodyStyle.width = '100%';\n\t\t\tdivHeader[0].style.width = '100%';\n\t\t}\n\n\t\t$.each( _fnGetUniqueThs( settings, headerCopy ), function ( i, el ) {\n\t\t\tidx = _fnVisibleToColumnIndex( settings, i );\n\t\t\tel.style.width = settings.aoColumns[idx].sWidth;\n\t\t} );\n\n\t\tif ( footer ) {\n\t\t\t_fnApplyToChildren( function(n) {\n\t\t\t\tn.style.width = \"\";\n\t\t\t}, footerSrcEls );\n\t\t}\n\n\t\t// If scroll collapse is enabled, when we put the headers back into the body for sizing, we\n\t\t// will end up forcing the scrollbar to appear, making our measurements wrong for when we\n\t\t// then hide it (end of this function), so add the header height to the body scroller.\n\t\tif ( scroll.bCollapse && scrollY !== \"\" ) {\n\t\t\tdivBodyStyle.height = (divBody.offsetHeight + header[0].offsetHeight)+\"px\";\n\t\t}\n\n\t\t// Size the table as a whole\n\t\tsanityWidth = table.outerWidth();\n\t\tif ( scrollX === \"\" ) {\n\t\t\t// No x scrolling\n\t\t\ttableStyle.width = \"100%\";\n\n\t\t\t// IE7 will make the width of the table when 100% include the scrollbar\n\t\t\t// - which is shouldn't. When there is a scrollbar we need to take this\n\t\t\t// into account.\n\t\t\tif ( ie67 && (table.find('tbody').height() > divBodyEl.offsetHeight ||\n\t\t\t\tdivBody.css('overflow-y') == \"scroll\")\n\t\t\t) {\n\t\t\t\ttableStyle.width = _fnStringToCss( table.outerWidth() - barWidth);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// x scrolling\n\t\t\tif ( scrollXInner !== \"\" ) {\n\t\t\t\t// x scroll inner has been given - use it\n\t\t\t\ttableStyle.width = _fnStringToCss(scrollXInner);\n\t\t\t}\n\t\t\telse if ( sanityWidth == divBody.width() && divBody.height() < table.height() ) {\n\t\t\t\t// There is y-scrolling - try to take account of the y scroll bar\n\t\t\t\ttableStyle.width = _fnStringToCss( sanityWidth-barWidth );\n\t\t\t\tif ( table.outerWidth() > sanityWidth-barWidth ) {\n\t\t\t\t\t// Not possible to take account of it\n\t\t\t\t\ttableStyle.width = _fnStringToCss( sanityWidth );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// When all else fails\n\t\t\t\ttableStyle.width = _fnStringToCss( sanityWidth );\n\t\t\t}\n\t\t}\n\n\t\t// Recalculate the sanity width - now that we've applied the required width,\n\t\t// before it was a temporary variable. This is required because the column\n\t\t// width calculation is done before this table DOM is created.\n\t\tsanityWidth = table.outerWidth();\n\n\t\t// Hidden header should have zero height, so remove padding and borders. Then\n\t\t// set the width based on the real headers\n\n\t\t// Apply all styles in one pass\n\t\t_fnApplyToChildren( zeroOut, headerSrcEls );\n\n\t\t// Read all widths in next pass\n\t\t_fnApplyToChildren( function(nSizer) {\n\t\t\theaderWidths.push( _fnStringToCss( $(nSizer).css('width') ) );\n\t\t}, headerSrcEls );\n\n\t\t// Apply all widths in final pass\n\t\t_fnApplyToChildren( function(nToSize, i) {\n\t\t\tnToSize.style.width = headerWidths[i];\n\t\t}, headerTrgEls );\n\n\t\t$(headerSrcEls).height(0);\n\n\t\t/* Same again with the footer if we have one */\n\t\tif ( footer )\n\t\t{\n\t\t\t_fnApplyToChildren( zeroOut, footerSrcEls );\n\n\t\t\t_fnApplyToChildren( function(nSizer) {\n\t\t\t\tfooterWidths.push( _fnStringToCss( $(nSizer).css('width') ) );\n\t\t\t}, footerSrcEls );\n\n\t\t\t_fnApplyToChildren( function(nToSize, i) {\n\t\t\t\tnToSize.style.width = footerWidths[i];\n\t\t\t}, footerTrgEls );\n\n\t\t\t$(footerSrcEls).height(0);\n\t\t}\n\n\n\t\t/*\n\t\t * 3. Apply the measurements\n\t\t */\n\n\t\t// \"Hide\" the header and footer that we used for the sizing. We want to also fix their width\n\t\t// to what they currently are\n\t\t_fnApplyToChildren( function(nSizer, i) {\n\t\t\tnSizer.innerHTML = \"\";\n\t\t\tnSizer.style.width = headerWidths[i];\n\t\t}, headerSrcEls );\n\n\t\tif ( footer )\n\t\t{\n\t\t\t_fnApplyToChildren( function(nSizer, i) {\n\t\t\t\tnSizer.innerHTML = \"\";\n\t\t\t\tnSizer.style.width = footerWidths[i];\n\t\t\t}, footerSrcEls );\n\t\t}\n\n\t\t// Sanity check that the table is of a sensible width. If not then we are going to get\n\t\t// misalignment - try to prevent this by not allowing the table to shrink below its min width\n\t\tif ( table.outerWidth() < sanityWidth )\n\t\t{\n\t\t\t// The min width depends upon if we have a vertical scrollbar visible or not */\n\t\t\tcorrection = ((divBodyEl.scrollHeight > divBodyEl.offsetHeight ||\n\t\t\t\tdivBody.css('overflow-y') == \"scroll\")) ?\n\t\t\t\t\tsanityWidth+barWidth :\n\t\t\t\t\tsanityWidth;\n\n\t\t\t// IE6/7 are a law unto themselves...\n\t\t\tif ( ie67 && (divBodyEl.scrollHeight >\n\t\t\t\tdivBodyEl.offsetHeight || divBody.css('overflow-y') == \"scroll\")\n\t\t\t) {\n\t\t\t\ttableStyle.width = _fnStringToCss( correction-barWidth );\n\t\t\t}\n\n\t\t\t// And give the user a warning that we've stopped the table getting too small\n\t\t\tif ( scrollX === \"\" || scrollXInner !== \"\" ) {\n\t\t\t\t_fnLog( settings, 1, 'Possible column misalignment', 6 );\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcorrection = '100%';\n\t\t}\n\n\t\t// Apply to the container elements\n\t\tdivBodyStyle.width = _fnStringToCss( correction );\n\t\tdivHeaderStyle.width = _fnStringToCss( correction );\n\n\t\tif ( footer ) {\n\t\t\tsettings.nScrollFoot.style.width = _fnStringToCss( correction );\n\t\t}\n\n\n\t\t/*\n\t\t * 4. Clean up\n\t\t */\n\t\tif ( ! scrollY ) {\n\t\t\t/* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting\n\t\t\t * the scrollbar height from the visible display, rather than adding it on. We need to\n\t\t\t * set the height in order to sort this. Don't want to do it in any other browsers.\n\t\t\t */\n\t\t\tif ( ie67 ) {\n\t\t\t\tdivBodyStyle.height = _fnStringToCss( tableEl.offsetHeight+barWidth );\n\t\t\t}\n\t\t}\n\n\t\tif ( scrollY && scroll.bCollapse ) {\n\t\t\tdivBodyStyle.height = _fnStringToCss( scrollY );\n\n\t\t\tvar iExtra = (scrollX && tableEl.offsetWidth > divBodyEl.offsetWidth) ?\n\t\t\t\tbarWidth :\n\t\t\t\t0;\n\n\t\t\tif ( tableEl.offsetHeight < divBodyEl.offsetHeight ) {\n\t\t\t\tdivBodyStyle.height = _fnStringToCss( tableEl.offsetHeight+iExtra );\n\t\t\t}\n\t\t}\n\n\t\t/* Finally set the width's of the header and footer tables */\n\t\tvar iOuterWidth = table.outerWidth();\n\t\tdivHeaderTable[0].style.width = _fnStringToCss( iOuterWidth );\n\t\tdivHeaderInnerStyle.width = _fnStringToCss( iOuterWidth );\n\n\t\t// Figure out if there are scrollbar present - if so then we need a the header and footer to\n\t\t// provide a bit more space to allow \"overflow\" scrolling (i.e. past the scrollbar)\n\t\tvar bScrolling = table.height() > divBodyEl.clientHeight || divBody.css('overflow-y') == \"scroll\";\n\t\tvar padding = 'padding' + (browser.bScrollbarLeft ? 'Left' : 'Right' );\n\t\tdivHeaderInnerStyle[ padding ] = bScrolling ? barWidth+\"px\" : \"0px\";\n\n\t\tif ( footer ) {\n\t\t\tdivFooterTable[0].style.width = _fnStringToCss( iOuterWidth );\n\t\t\tdivFooterInner[0].style.width = _fnStringToCss( iOuterWidth );\n\t\t\tdivFooterInner[0].style[padding] = bScrolling ? barWidth+\"px\" : \"0px\";\n\t\t}\n\n\t\t/* Adjust the position of the header in case we loose the y-scrollbar */\n\t\tdivBody.scroll();\n\n\t\t/* If sorting or filtering has occurred, jump the scrolling back to the top */\n\t\tif ( settings.bSorted || settings.bFiltered ) {\n\t\t\tdivBodyEl.scrollTop = 0;\n\t\t}\n\t}\n\n\n\n\t/**\n\t * Apply a given function to the display child nodes of an element array (typically\n\t * TD children of TR rows\n\t *  @param {function} fn Method to apply to the objects\n\t *  @param array {nodes} an1 List of elements to look through for display children\n\t *  @param array {nodes} an2 Another list (identical structure to the first) - optional\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnApplyToChildren( fn, an1, an2 )\n\t{\n\t\tvar index=0, i=0, iLen=an1.length;\n\t\tvar nNode1, nNode2;\n\n\t\twhile ( i < iLen ) {\n\t\t\tnNode1 = an1[i].firstChild;\n\t\t\tnNode2 = an2 ? an2[i].firstChild : null;\n\n\t\t\twhile ( nNode1 ) {\n\t\t\t\tif ( nNode1.nodeType === 1 ) {\n\t\t\t\t\tif ( an2 ) {\n\t\t\t\t\t\tfn( nNode1, nNode2, index );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfn( nNode1, index );\n\t\t\t\t\t}\n\n\t\t\t\t\tindex++;\n\t\t\t\t}\n\n\t\t\t\tnNode1 = nNode1.nextSibling;\n\t\t\t\tnNode2 = an2 ? nNode2.nextSibling : null;\n\t\t\t}\n\n\t\t\ti++;\n\t\t}\n\t}\n\n\n\n\tvar __re_html_remove = /<.*?>/g;\n\n\n\t/**\n\t * Calculate the width of columns for the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnCalculateColumnWidths ( oSettings )\n\t{\n\t\tvar\n\t\t\ttable = oSettings.nTable,\n\t\t\tcolumns = oSettings.aoColumns,\n\t\t\tscroll = oSettings.oScroll,\n\t\t\tscrollY = scroll.sY,\n\t\t\tscrollX = scroll.sX,\n\t\t\tscrollXInner = scroll.sXInner,\n\t\t\tcolumnCount = columns.length,\n\t\t\tvisibleColumns = _fnGetColumns( oSettings, 'bVisible' ),\n\t\t\theaderCells = $('th', oSettings.nTHead),\n\t\t\ttableWidthAttr = table.getAttribute('width'),\n\t\t\ttableContainer = table.parentNode,\n\t\t\tuserInputs = false,\n\t\t\ti, column, columnIdx, width, outerWidth;\n\n\t\t/* Convert any user input sizes into pixel sizes */\n\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\tcolumn = columns[ visibleColumns[i] ];\n\n\t\t\tif ( column.sWidth !== null ) {\n\t\t\t\tcolumn.sWidth = _fnConvertToWidth( column.sWidthOrig, tableContainer );\n\n\t\t\t\tuserInputs = true;\n\t\t\t}\n\t\t}\n\n\t\t/* If the number of columns in the DOM equals the number that we have to\n\t\t * process in DataTables, then we can use the offsets that are created by\n\t\t * the web- browser. No custom sizes can be set in order for this to happen,\n\t\t * nor scrolling used\n\t\t */\n\t\tif ( ! userInputs && ! scrollX && ! scrollY &&\n\t\t    columnCount == _fnVisbleColumns( oSettings ) &&\n\t\t\tcolumnCount == headerCells.length\n\t\t) {\n\t\t\tfor ( i=0 ; i<columnCount ; i++ ) {\n\t\t\t\tcolumns[i].sWidth = _fnStringToCss( headerCells.eq(i).width() );\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Otherwise construct a single row table with the widest node in the\n\t\t\t// data, assign any user defined widths, then insert it into the DOM and\n\t\t\t// allow the browser to do all the hard work of calculating table widths\n\t\t\tvar tmpTable = $( table.cloneNode( false ) )\n\t\t\t\t.css( 'visibility', 'hidden' )\n\t\t\t\t.removeAttr( 'id' )\n\t\t\t\t.append( $(oSettings.nTHead).clone( false ) )\n\t\t\t\t.append( $(oSettings.nTFoot).clone( false ) )\n\t\t\t\t.append( $('<tbody><tr/></tbody>') );\n\n\t\t\t// Remove any assigned widths from the footer (from scrolling)\n\t\t\ttmpTable.find('tfoot th, tfoot td').css('width', '');\n\n\t\t\tvar tr = tmpTable.find( 'tbody tr' );\n\n\t\t\t// Apply custom sizing to the cloned header\n\t\t\theaderCells = _fnGetUniqueThs( oSettings, tmpTable.find('thead')[0] );\n\n\t\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\t\tcolumn = columns[ visibleColumns[i] ];\n\n\t\t\t\theaderCells[i].style.width = column.sWidthOrig !== null && column.sWidthOrig !== '' ?\n\t\t\t\t\t_fnStringToCss( column.sWidthOrig ) :\n\t\t\t\t\t'';\n\t\t\t}\n\n\t\t\t// Find the widest cell for each column and put it into the table\n\t\t\tif ( oSettings.aoData.length ) {\n\t\t\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\t\t\tcolumnIdx = visibleColumns[i];\n\t\t\t\t\tcolumn = columns[ columnIdx ];\n\n\t\t\t\t\t$( _fnGetWidestNode( oSettings, columnIdx ) )\n\t\t\t\t\t\t.clone( false )\n\t\t\t\t\t\t.append( column.sContentPadding )\n\t\t\t\t\t\t.appendTo( tr );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Table has been built, attach to the document so we can work with it\n\t\t\ttmpTable.appendTo( tableContainer );\n\n\t\t\t// When scrolling (X or Y) we want to set the width of the table as\n\t\t\t// appropriate. However, when not scrolling leave the table width as it\n\t\t\t// is. This results in slightly different, but I think correct behaviour\n\t\t\tif ( scrollX && scrollXInner ) {\n\t\t\t\ttmpTable.width( scrollXInner );\n\t\t\t}\n\t\t\telse if ( scrollX ) {\n\t\t\t\ttmpTable.css( 'width', 'auto' );\n\n\t\t\t\tif ( tmpTable.width() < tableContainer.offsetWidth ) {\n\t\t\t\t\ttmpTable.width( tableContainer.offsetWidth );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( scrollY ) {\n\t\t\t\ttmpTable.width( tableContainer.offsetWidth );\n\t\t\t}\n\t\t\telse if ( tableWidthAttr ) {\n\t\t\t\ttmpTable.width( tableWidthAttr );\n\t\t\t}\n\n\t\t\t// Take into account the y scrollbar\n\t\t\t_fnScrollingWidthAdjust( oSettings, tmpTable[0] );\n\n\t\t\t// Browsers need a bit of a hand when a width is assigned to any columns\n\t\t\t// when x-scrolling as they tend to collapse the table to the min-width,\n\t\t\t// even if we sent the column widths. So we need to keep track of what\n\t\t\t// the table width should be by summing the user given values, and the\n\t\t\t// automatic values\n\t\t\tif ( scrollX )\n\t\t\t{\n\t\t\t\tvar total = 0;\n\n\t\t\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\t\t\tcolumn = columns[ visibleColumns[i] ];\n\t\t\t\t\touterWidth = $(headerCells[i]).outerWidth();\n\n\t\t\t\t\ttotal += column.sWidthOrig === null ?\n\t\t\t\t\t\touterWidth :\n\t\t\t\t\t\tparseInt( column.sWidth, 10 ) + outerWidth - $(headerCells[i]).width();\n\t\t\t\t}\n\n\t\t\t\ttmpTable.width( _fnStringToCss( total ) );\n\t\t\t\ttable.style.width = _fnStringToCss( total );\n\t\t\t}\n\n\t\t\t// Get the width of each column in the constructed table\n\t\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\t\tcolumn = columns[ visibleColumns[i] ];\n\t\t\t\twidth = $(headerCells[i]).width();\n\n\t\t\t\tif ( width ) {\n\t\t\t\t\tcolumn.sWidth = _fnStringToCss( width );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttable.style.width = _fnStringToCss( tmpTable.css('width') );\n\n\t\t\t// Finished with the table - ditch it\n\t\t\ttmpTable.remove();\n\t\t}\n\n\t\t// If there is a width attr, we want to attach an event listener which\n\t\t// allows the table sizing to automatically adjust when the window is\n\t\t// resized. Use the width attr rather than CSS, since we can't know if the\n\t\t// CSS is a relative value or absolute - DOM read is always px.\n\t\tif ( tableWidthAttr ) {\n\t\t\ttable.style.width = _fnStringToCss( tableWidthAttr );\n\n\t\t\tif ( ! oSettings._reszEvt ) {\n\t\t\t\t$(window).bind('resize.DT-'+oSettings.sInstance, _fnThrottle( function () {\n\t\t\t\t\t_fnAdjustColumnSizing( oSettings );\n\t\t\t\t} ) );\n\n\t\t\t\toSettings._reszEvt = true;\n\t\t\t}\n\t\t}\n\t}\n\n\n\tfunction _fnThrottle( fn ) {\n\t\tvar\n\t\t\tfrequency = 200,\n\t\t\tlast,\n\t\t\ttimer;\n\n\t\treturn function () {\n\t\t\tvar\n\t\t\t\tnow = +new Date(),\n\t\t\t\targs = arguments;\n\n\t\t\tif ( last && now < last + frequency ) {\n\t\t\t\tclearTimeout( timer );\n\n\t\t\t\ttimer = setTimeout( function () {\n\t\t\t\t\tlast = now;\n\t\t\t\t\tfn();\n\t\t\t\t}, frequency );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlast = now;\n\t\t\t\tfn();\n\t\t\t}\n\t\t};\n\t}\n\n\n\t/**\n\t * Convert a CSS unit width to pixels (e.g. 2em)\n\t *  @param {string} width width to be converted\n\t *  @param {node} parent parent to get the with for (required for relative widths) - optional\n\t *  @returns {int} width in pixels\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnConvertToWidth ( width, parent )\n\t{\n\t\tif ( ! width ) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar n = $('<div/>')\n\t\t\t.css( 'width', _fnStringToCss( width ) )\n\t\t\t.appendTo( parent || document.body );\n\n\t\tvar val = n[0].offsetWidth;\n\t\tn.remove();\n\n\t\treturn val;\n\t}\n\n\n\t/**\n\t * Adjust a table's width to take account of vertical scroll bar\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {node} n table node\n\t *  @memberof DataTable#oApi\n\t */\n\n\tfunction _fnScrollingWidthAdjust ( settings, n )\n\t{\n\t\tvar scroll = settings.oScroll;\n\n\t\tif ( scroll.sX || scroll.sY ) {\n\t\t\t// When y-scrolling only, we want to remove the width of the scroll bar\n\t\t\t// so the table + scroll bar will fit into the area available, otherwise\n\t\t\t// we fix the table at its current size with no adjustment\n\t\t\tvar correction = ! scroll.sX ? scroll.iBarWidth : 0;\n\t\t\tn.style.width = _fnStringToCss( $(n).outerWidth() - correction );\n\t\t}\n\t}\n\n\n\t/**\n\t * Get the widest node\n\t *  @param {object} settings dataTables settings object\n\t *  @param {int} colIdx column of interest\n\t *  @returns {node} widest table node\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetWidestNode( settings, colIdx )\n\t{\n\t\tvar idx = _fnGetMaxLenString( settings, colIdx );\n\t\tif ( idx < 0 ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar data = settings.aoData[ idx ];\n\t\treturn ! data.nTr ? // Might not have been created when deferred rendering\n\t\t\t$('<td/>').html( _fnGetCellData( settings, idx, colIdx, 'display' ) )[0] :\n\t\t\tdata.anCells[ colIdx ];\n\t}\n\n\n\t/**\n\t * Get the maximum strlen for each data column\n\t *  @param {object} settings dataTables settings object\n\t *  @param {int} colIdx column of interest\n\t *  @returns {string} max string length for each column\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetMaxLenString( settings, colIdx )\n\t{\n\t\tvar s, max=-1, maxIdx = -1;\n\n\t\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\ts = _fnGetCellData( settings, i, colIdx, 'display' )+'';\n\t\t\ts = s.replace( __re_html_remove, '' );\n\n\t\t\tif ( s.length > max ) {\n\t\t\t\tmax = s.length;\n\t\t\t\tmaxIdx = i;\n\t\t\t}\n\t\t}\n\n\t\treturn maxIdx;\n\t}\n\n\n\t/**\n\t * Append a CSS unit (only if required) to a string\n\t *  @param {string} value to css-ify\n\t *  @returns {string} value with css unit\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnStringToCss( s )\n\t{\n\t\tif ( s === null ) {\n\t\t\treturn '0px';\n\t\t}\n\n\t\tif ( typeof s == 'number' ) {\n\t\t\treturn s < 0 ?\n\t\t\t\t'0px' :\n\t\t\t\ts+'px';\n\t\t}\n\n\t\t// Check it has a unit character already\n\t\treturn s.match(/\\d$/) ?\n\t\t\ts+'px' :\n\t\t\ts;\n\t}\n\n\n\t/**\n\t * Get the width of a scroll bar in this browser being used\n\t *  @returns {int} width in pixels\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnScrollBarWidth ()\n\t{\n\t\t// On first run a static variable is set, since this is only needed once.\n\t\t// Subsequent runs will just use the previously calculated value\n\t\tif ( ! DataTable.__scrollbarWidth ) {\n\t\t\tvar inner = $('<p/>').css( {\n\t\t\t\twidth: '100%',\n\t\t\t\theight: 200,\n\t\t\t\tpadding: 0\n\t\t\t} )[0];\n\n\t\t\tvar outer = $('<div/>')\n\t\t\t\t.css( {\n\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\twidth: 200,\n\t\t\t\t\theight: 150,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\tvisibility: 'hidden'\n\t\t\t\t} )\n\t\t\t\t.append( inner )\n\t\t\t\t.appendTo( 'body' );\n\n\t\t\tvar w1 = inner.offsetWidth;\n\t\t\touter.css( 'overflow', 'scroll' );\n\t\t\tvar w2 = inner.offsetWidth;\n\n\t\t\tif ( w1 === w2 ) {\n\t\t\t\tw2 = outer[0].clientWidth;\n\t\t\t}\n\n\t\t\touter.remove();\n\n\t\t\tDataTable.__scrollbarWidth = w1 - w2;\n\t\t}\n\n\t\treturn DataTable.__scrollbarWidth;\n\t}\n\n\n\n\tfunction _fnSortFlatten ( settings )\n\t{\n\t\tvar\n\t\t\ti, iLen, k, kLen,\n\t\t\taSort = [],\n\t\t\taiOrig = [],\n\t\t\taoColumns = settings.aoColumns,\n\t\t\taDataSort, iCol, sType, srcCol,\n\t\t\tfixed = settings.aaSortingFixed,\n\t\t\tfixedObj = $.isPlainObject( fixed ),\n\t\t\tnestedSort = [],\n\t\t\tadd = function ( a ) {\n\t\t\t\tif ( a.length && ! $.isArray( a[0] ) ) {\n\t\t\t\t\t// 1D array\n\t\t\t\t\tnestedSort.push( a );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// 2D array\n\t\t\t\t\tnestedSort.push.apply( nestedSort, a );\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Build the sort array, with pre-fix and post-fix options if they have been\n\t\t// specified\n\t\tif ( $.isArray( fixed ) ) {\n\t\t\tadd( fixed );\n\t\t}\n\n\t\tif ( fixedObj && fixed.pre ) {\n\t\t\tadd( fixed.pre );\n\t\t}\n\n\t\tadd( settings.aaSorting );\n\n\t\tif (fixedObj && fixed.post ) {\n\t\t\tadd( fixed.post );\n\t\t}\n\n\t\tfor ( i=0 ; i<nestedSort.length ; i++ )\n\t\t{\n\t\t\tsrcCol = nestedSort[i][0];\n\t\t\taDataSort = aoColumns[ srcCol ].aDataSort;\n\n\t\t\tfor ( k=0, kLen=aDataSort.length ; k<kLen ; k++ )\n\t\t\t{\n\t\t\t\tiCol = aDataSort[k];\n\t\t\t\tsType = aoColumns[ iCol ].sType || 'string';\n\n\t\t\t\taSort.push( {\n\t\t\t\t\tsrc:       srcCol,\n\t\t\t\t\tcol:       iCol,\n\t\t\t\t\tdir:       nestedSort[i][1],\n\t\t\t\t\tindex:     nestedSort[i][2],\n\t\t\t\t\ttype:      sType,\n\t\t\t\t\tformatter: DataTable.ext.type.order[ sType+\"-pre\" ]\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t\treturn aSort;\n\t}\n\n\t/**\n\t * Change the order of the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t *  @todo This really needs split up!\n\t */\n\tfunction _fnSort ( oSettings )\n\t{\n\t\tvar\n\t\t\ti, ien, iLen, j, jLen, k, kLen,\n\t\t\tsDataType, nTh,\n\t\t\taiOrig = [],\n\t\t\toExtSort = DataTable.ext.type.order,\n\t\t\taoData = oSettings.aoData,\n\t\t\taoColumns = oSettings.aoColumns,\n\t\t\taDataSort, data, iCol, sType, oSort,\n\t\t\tformatters = 0,\n\t\t\tsortCol,\n\t\t\tdisplayMaster = oSettings.aiDisplayMaster,\n\t\t\taSort = _fnSortFlatten( oSettings );\n\n\t\t// Resolve any column types that are unknown due to addition or invalidation\n\t\t// @todo Can this be moved into a 'data-ready' handler which is called when\n\t\t//   data is going to be used in the table?\n\t\t_fnColumnTypes( oSettings );\n\n\t\tfor ( i=0, ien=aSort.length ; i<ien ; i++ ) {\n\t\t\tsortCol = aSort[i];\n\n\t\t\t// Track if we can use the fast sort algorithm\n\t\t\tif ( sortCol.formatter ) {\n\t\t\t\tformatters++;\n\t\t\t}\n\n\t\t\t// Load the data needed for the sort, for each cell\n\t\t\t_fnSortData( oSettings, sortCol.col );\n\t\t}\n\n\t\t/* No sorting required if server-side or no sorting array */\n\t\tif ( _fnDataSource( oSettings ) != 'ssp' && aSort.length !== 0 )\n\t\t{\n\t\t\t// Create a value - key array of the current row positions such that we can use their\n\t\t\t// current position during the sort, if values match, in order to perform stable sorting\n\t\t\tfor ( i=0, iLen=displayMaster.length ; i<iLen ; i++ ) {\n\t\t\t\taiOrig[ displayMaster[i] ] = i;\n\t\t\t}\n\n\t\t\t/* Do the sort - here we want multi-column sorting based on a given data source (column)\n\t\t\t * and sorting function (from oSort) in a certain direction. It's reasonably complex to\n\t\t\t * follow on it's own, but this is what we want (example two column sorting):\n\t\t\t *  fnLocalSorting = function(a,b){\n\t\t\t *    var iTest;\n\t\t\t *    iTest = oSort['string-asc']('data11', 'data12');\n\t\t\t *      if (iTest !== 0)\n\t\t\t *        return iTest;\n\t\t\t *    iTest = oSort['numeric-desc']('data21', 'data22');\n\t\t\t *    if (iTest !== 0)\n\t\t\t *      return iTest;\n\t\t\t *    return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );\n\t\t\t *  }\n\t\t\t * Basically we have a test for each sorting column, if the data in that column is equal,\n\t\t\t * test the next column. If all columns match, then we use a numeric sort on the row\n\t\t\t * positions in the original data array to provide a stable sort.\n\t\t\t *\n\t\t\t * Note - I know it seems excessive to have two sorting methods, but the first is around\n\t\t\t * 15% faster, so the second is only maintained for backwards compatibility with sorting\n\t\t\t * methods which do not have a pre-sort formatting function.\n\t\t\t */\n\t\t\tif ( formatters === aSort.length ) {\n\t\t\t\t// All sort types have formatting functions\n\t\t\t\tdisplayMaster.sort( function ( a, b ) {\n\t\t\t\t\tvar\n\t\t\t\t\t\tx, y, k, test, sort,\n\t\t\t\t\t\tlen=aSort.length,\n\t\t\t\t\t\tdataA = aoData[a]._aSortData,\n\t\t\t\t\t\tdataB = aoData[b]._aSortData;\n\n\t\t\t\t\tfor ( k=0 ; k<len ; k++ ) {\n\t\t\t\t\t\tsort = aSort[k];\n\n\t\t\t\t\t\tx = dataA[ sort.col ];\n\t\t\t\t\t\ty = dataB[ sort.col ];\n\n\t\t\t\t\t\ttest = x<y ? -1 : x>y ? 1 : 0;\n\t\t\t\t\t\tif ( test !== 0 ) {\n\t\t\t\t\t\t\treturn sort.dir === 'asc' ? test : -test;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tx = aiOrig[a];\n\t\t\t\t\ty = aiOrig[b];\n\t\t\t\t\treturn x<y ? -1 : x>y ? 1 : 0;\n\t\t\t\t} );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Depreciated - remove in 1.11 (providing a plug-in option)\n\t\t\t\t// Not all sort types have formatting methods, so we have to call their sorting\n\t\t\t\t// methods.\n\t\t\t\tdisplayMaster.sort( function ( a, b ) {\n\t\t\t\t\tvar\n\t\t\t\t\t\tx, y, k, l, test, sort, fn,\n\t\t\t\t\t\tlen=aSort.length,\n\t\t\t\t\t\tdataA = aoData[a]._aSortData,\n\t\t\t\t\t\tdataB = aoData[b]._aSortData;\n\n\t\t\t\t\tfor ( k=0 ; k<len ; k++ ) {\n\t\t\t\t\t\tsort = aSort[k];\n\n\t\t\t\t\t\tx = dataA[ sort.col ];\n\t\t\t\t\t\ty = dataB[ sort.col ];\n\n\t\t\t\t\t\tfn = oExtSort[ sort.type+\"-\"+sort.dir ] || oExtSort[ \"string-\"+sort.dir ];\n\t\t\t\t\t\ttest = fn( x, y );\n\t\t\t\t\t\tif ( test !== 0 ) {\n\t\t\t\t\t\t\treturn test;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tx = aiOrig[a];\n\t\t\t\t\ty = aiOrig[b];\n\t\t\t\t\treturn x<y ? -1 : x>y ? 1 : 0;\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t\t/* Tell the draw function that we have sorted the data */\n\t\toSettings.bSorted = true;\n\t}\n\n\n\tfunction _fnSortAria ( settings )\n\t{\n\t\tvar label;\n\t\tvar nextSort;\n\t\tvar columns = settings.aoColumns;\n\t\tvar aSort = _fnSortFlatten( settings );\n\t\tvar oAria = settings.oLanguage.oAria;\n\n\t\t// ARIA attributes - need to loop all columns, to update all (removing old\n\t\t// attributes as needed)\n\t\tfor ( var i=0, iLen=columns.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tvar col = columns[i];\n\t\t\tvar asSorting = col.asSorting;\n\t\t\tvar sTitle = col.sTitle.replace( /<.*?>/g, \"\" );\n\t\t\tvar jqTh = $(col.nTh).removeAttr('aria-sort');\n\n\t\t\t/* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */\n\t\t\tif ( col.bSortable ) {\n\t\t\t\tif ( aSort.length > 0 && aSort[0].col == i ) {\n\t\t\t\t\tjqTh.attr('aria-sort', aSort[0].dir==\"asc\" ? \"ascending\" : \"descending\" );\n\t\t\t\t\tnextSort = asSorting[ aSort[0].index+1 ] || asSorting[0];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tnextSort = asSorting[0];\n\t\t\t\t}\n\n\t\t\t\tlabel = sTitle + ( nextSort === \"asc\" ?\n\t\t\t\t\toAria.sSortAscending :\n\t\t\t\t\toAria.sSortDescending\n\t\t\t\t);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlabel = sTitle;\n\t\t\t}\n\n\t\t\tjqTh.attr('aria-label', label);\n\t\t}\n\t}\n\n\n\t/**\n\t * Function to run on user sort request\n\t *  @param {object} settings dataTables settings object\n\t *  @param {node} attachTo node to attach the handler to\n\t *  @param {int} colIdx column sorting index\n\t *  @param {boolean} [append=false] Append the requested sort to the existing\n\t *    sort if true (i.e. multi-column sort)\n\t *  @param {function} [callback] callback function\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSortListener ( settings, colIdx, append, callback )\n\t{\n\t\tvar col = settings.aoColumns[ colIdx ];\n\t\tvar sorting = settings.aaSorting;\n\t\tvar asSorting = col.asSorting;\n\t\tvar nextSortIdx;\n\t\tvar next = function ( a ) {\n\t\t\tvar idx = a._idx;\n\t\t\tif ( idx === undefined ) {\n\t\t\t\tidx = $.inArray( a[1], asSorting );\n\t\t\t}\n\n\t\t\treturn idx+1 >= asSorting.length ? 0 : idx+1;\n\t\t};\n\n\t\t// If appending the sort then we are multi-column sorting\n\t\tif ( append && settings.oFeatures.bSortMulti ) {\n\t\t\t// Are we already doing some kind of sort on this column?\n\t\t\tvar sortIdx = $.inArray( colIdx, _pluck(sorting, '0') );\n\n\t\t\tif ( sortIdx !== -1 ) {\n\t\t\t\t// Yes, modify the sort\n\t\t\t\tnextSortIdx = next( sorting[sortIdx] );\n\n\t\t\t\tsorting[sortIdx][1] = asSorting[ nextSortIdx ];\n\t\t\t\tsorting[sortIdx]._idx = nextSortIdx;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// No sort on this column yet\n\t\t\t\tsorting.push( [ colIdx, asSorting[0], 0 ] );\n\t\t\t\tsorting[sorting.length-1]._idx = 0;\n\t\t\t}\n\t\t}\n\t\telse if ( sorting.length && sorting[0][0] == colIdx ) {\n\t\t\t// Single column - already sorting on this column, modify the sort\n\t\t\tnextSortIdx = next( sorting[0] );\n\n\t\t\tsorting.length = 1;\n\t\t\tsorting[0][1] = asSorting[ nextSortIdx ];\n\t\t\tsorting[0]._idx = nextSortIdx;\n\t\t}\n\t\telse {\n\t\t\t// Single column - sort only on this column\n\t\t\tsorting.length = 0;\n\t\t\tsorting.push( [ colIdx, asSorting[0] ] );\n\t\t\tsorting[0]._idx = 0;\n\t\t}\n\n\t\t// Run the sort by calling a full redraw\n\t\t_fnReDraw( settings );\n\n\t\t// callback used for async user interaction\n\t\tif ( typeof callback == 'function' ) {\n\t\t\tcallback( settings );\n\t\t}\n\t}\n\n\n\t/**\n\t * Attach a sort handler (click) to a node\n\t *  @param {object} settings dataTables settings object\n\t *  @param {node} attachTo node to attach the handler to\n\t *  @param {int} colIdx column sorting index\n\t *  @param {function} [callback] callback function\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSortAttachListener ( settings, attachTo, colIdx, callback )\n\t{\n\t\tvar col = settings.aoColumns[ colIdx ];\n\n\t\t_fnBindAction( attachTo, {}, function (e) {\n\t\t\t/* If the column is not sortable - don't to anything */\n\t\t\tif ( col.bSortable === false ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_fnProcessingDisplay( settings, true );\n\n\t\t\t// Use a timeout to allow the processing display to be shown.\n\t\t\tsetTimeout( function() {\n\t\t\t\t_fnSortListener( settings, colIdx, e.shiftKey, callback );\n\n\t\t\t\t// In server-side processing, the draw callback will remove the\n\t\t\t\t// processing display\n\t\t\t\tif ( _fnDataSource( settings ) !== 'ssp' ) {\n\t\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t\t}\n\t\t\t}, 0 );\n\t\t} );\n\t}\n\n\n\t/**\n\t * Set the sorting classes on table's body, Note: it is safe to call this function\n\t * when bSort and bSortClasses are false\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSortingClasses( settings )\n\t{\n\t\tvar oldSort = settings.aLastSort;\n\t\tvar sortClass = settings.oClasses.sSortColumn;\n\t\tvar sort = _fnSortFlatten( settings );\n\t\tvar features = settings.oFeatures;\n\t\tvar i, ien, colIdx;\n\n\t\tif ( features.bSort && features.bSortClasses ) {\n\t\t\t// Remove old sorting classes\n\t\t\tfor ( i=0, ien=oldSort.length ; i<ien ; i++ ) {\n\t\t\t\tcolIdx = oldSort[i].src;\n\n\t\t\t\t// Remove column sorting\n\t\t\t\t$( _pluck( settings.aoData, 'anCells', colIdx ) )\n\t\t\t\t\t.removeClass( sortClass + (i<2 ? i+1 : 3) );\n\t\t\t}\n\n\t\t\t// Add new column sorting\n\t\t\tfor ( i=0, ien=sort.length ; i<ien ; i++ ) {\n\t\t\t\tcolIdx = sort[i].src;\n\n\t\t\t\t$( _pluck( settings.aoData, 'anCells', colIdx ) )\n\t\t\t\t\t.addClass( sortClass + (i<2 ? i+1 : 3) );\n\t\t\t}\n\t\t}\n\n\t\tsettings.aLastSort = sort;\n\t}\n\n\n\t// Get the data to sort a column, be it from cache, fresh (populating the\n\t// cache), or from a sort formatter\n\tfunction _fnSortData( settings, idx )\n\t{\n\t\t// Custom sorting function - provided by the sort data type\n\t\tvar column = settings.aoColumns[ idx ];\n\t\tvar customSort = DataTable.ext.order[ column.sSortDataType ];\n\t\tvar customData;\n\n\t\tif ( customSort ) {\n\t\t\tcustomData = customSort.call( settings.oInstance, settings, idx,\n\t\t\t\t_fnColumnIndexToVisible( settings, idx )\n\t\t\t);\n\t\t}\n\n\t\t// Use / populate cache\n\t\tvar row, cellData;\n\t\tvar formatter = DataTable.ext.type.order[ column.sType+\"-pre\" ];\n\n\t\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\trow = settings.aoData[i];\n\n\t\t\tif ( ! row._aSortData ) {\n\t\t\t\trow._aSortData = [];\n\t\t\t}\n\n\t\t\tif ( ! row._aSortData[idx] || customSort ) {\n\t\t\t\tcellData = customSort ?\n\t\t\t\t\tcustomData[i] : // If there was a custom sort function, use data from there\n\t\t\t\t\t_fnGetCellData( settings, i, idx, 'sort' );\n\n\t\t\t\trow._aSortData[ idx ] = formatter ?\n\t\t\t\t\tformatter( cellData ) :\n\t\t\t\t\tcellData;\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\t/**\n\t * Save the state of a table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSaveState ( oSettings )\n\t{\n\t\tif ( !oSettings.oFeatures.bStateSave || oSettings.bDestroying )\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t/* Store the interesting variables */\n\t\tvar i, iLen;\n\t\tvar oState = {\n\t\t\t\"iCreate\":      new Date().getTime(),\n\t\t\t\"iStart\":       oSettings._iDisplayStart,\n\t\t\t\"iLength\":      oSettings._iDisplayLength,\n\t\t\t\"aaSorting\":    $.extend( true, [], oSettings.aaSorting ),\n\t\t\t\"oSearch\":      $.extend( true, {}, oSettings.oPreviousSearch ),\n\t\t\t\"aoSearchCols\": $.extend( true, [], oSettings.aoPreSearchCols ),\n\t\t\t\"abVisCols\":    []\n\t\t};\n\n\t\tfor ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )\n\t\t{\n\t\t\toState.abVisCols.push( oSettings.aoColumns[i].bVisible );\n\t\t}\n\n\t\t_fnCallbackFire( oSettings, \"aoStateSaveParams\", 'stateSaveParams', [oSettings, oState] );\n\n\t\toSettings.fnStateSaveCallback.call( oSettings.oInstance, oSettings, oState );\n\t}\n\n\n\t/**\n\t * Attempt to load a saved table state\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {object} oInit DataTables init object so we can override settings\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnLoadState ( oSettings, oInit )\n\t{\n\t\tvar i, ien;\n\t\tvar columns = oSettings.aoColumns;\n\n\t\tif ( !oSettings.oFeatures.bStateSave )\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tvar oData = oSettings.fnStateLoadCallback.call( oSettings.oInstance, oSettings );\n\t\tif ( !oData )\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t/* Allow custom and plug-in manipulation functions to alter the saved data set and\n\t\t * cancelling of loading by returning false\n\t\t */\n\t\tvar abStateLoad = _fnCallbackFire( oSettings, 'aoStateLoadParams', 'stateLoadParams', [oSettings, oData] );\n\t\tif ( $.inArray( false, abStateLoad ) !== -1 )\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t/* Reject old data */\n\t\tif ( oData.iCreate < new Date().getTime() - (oSettings.iStateDuration*1000) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Number of columns have changed - all bets are off, no restore of settings\n\t\tif ( columns.length !== oData.aoSearchCols.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\t/* Store the saved state so it might be accessed at any time */\n\t\toSettings.oLoadedState = $.extend( true, {}, oData );\n\n\t\t/* Restore key features */\n\t\toSettings._iDisplayStart    = oData.iStart;\n\t\toSettings.iInitDisplayStart = oData.iStart;\n\t\toSettings._iDisplayLength   = oData.iLength;\n\t\toSettings.aaSorting         = [];\n\n\t\tvar savedSort = oData.aaSorting;\n\t\tfor ( i=0, ien=savedSort.length ; i<ien ; i++ ) {\n\t\t\toSettings.aaSorting.push( savedSort[i][0] >= columns.length ?\n\t\t\t\t[ 0, savedSort[i][1] ] :\n\t\t\t\tsavedSort[i]\n\t\t\t);\n\t\t}\n\n\t\t/* Search filtering  */\n\t\t$.extend( oSettings.oPreviousSearch, oData.oSearch );\n\t\t$.extend( true, oSettings.aoPreSearchCols, oData.aoSearchCols );\n\n\t\t/* Column visibility state */\n\t\tfor ( i=0, ien=oData.abVisCols.length ; i<ien ; i++ ) {\n\t\t\tcolumns[i].bVisible = oData.abVisCols[i];\n\t\t}\n\n\t\t_fnCallbackFire( oSettings, 'aoStateLoaded', 'stateLoaded', [oSettings, oData] );\n\t}\n\n\n\n\t/**\n\t * Return the settings object for a particular table\n\t *  @param {node} table table we are using as a dataTable\n\t *  @returns {object} Settings object - or null if not found\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSettingsFromNode ( table )\n\t{\n\t\tvar settings = DataTable.settings;\n\t\tvar idx = $.inArray( table, _pluck( settings, 'nTable' ) );\n\n\t\treturn idx !== -1 ?\n\t\t\tsettings[ idx ] :\n\t\t\tnull;\n\t}\n\n\n\t/**\n\t * Log an error message\n\t *  @param {object} settings dataTables settings object\n\t *  @param {int} level log error messages, or display them to the user\n\t *  @param {string} msg error message\n\t *  @param {int} tn Technical note id to get more information about the error.\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnLog( settings, level, msg, tn )\n\t{\n\t\tmsg = 'DataTables warning: '+\n\t\t\t(settings!==null ? 'table id='+settings.sTableId+' - ' : '')+msg;\n\n\t\tif ( tn ) {\n\t\t\tmsg += '. For more information about this error, please see '+\n\t\t\t'http://datatables.net/tn/'+tn;\n\t\t}\n\n\t\tif ( ! level  ) {\n\t\t\t// Backwards compatibility pre 1.10\n\t\t\tvar ext = DataTable.ext;\n\t\t\tvar type = ext.sErrMode || ext.errMode;\n\n\t\t\tif ( type == 'alert' ) {\n\t\t\t\talert( msg );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthrow new Error(msg);\n\t\t\t}\n\t\t}\n\t\telse if ( window.console && console.log ) {\n\t\t\tconsole.log( msg );\n\t\t}\n\t}\n\n\n\t/**\n\t * See if a property is defined on one object, if so assign it to the other object\n\t *  @param {object} ret target object\n\t *  @param {object} src source object\n\t *  @param {string} name property\n\t *  @param {string} [mappedName] name to map too - optional, name used if not given\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnMap( ret, src, name, mappedName )\n\t{\n\t\tif ( $.isArray( name ) ) {\n\t\t\t$.each( name, function (i, val) {\n\t\t\t\tif ( $.isArray( val ) ) {\n\t\t\t\t\t_fnMap( ret, src, val[0], val[1] );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t_fnMap( ret, src, val );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\treturn;\n\t\t}\n\n\t\tif ( mappedName === undefined ) {\n\t\t\tmappedName = name;\n\t\t}\n\n\t\tif ( src[name] !== undefined ) {\n\t\t\tret[mappedName] = src[name];\n\t\t}\n\t}\n\n\n\t/**\n\t * Extend objects - very similar to jQuery.extend, but deep copy objects, and\n\t * shallow copy arrays. The reason we need to do this, is that we don't want to\n\t * deep copy array init values (such as aaSorting) since the dev wouldn't be\n\t * able to override them, but we do want to deep copy arrays.\n\t *  @param {object} out Object to extend\n\t *  @param {object} extender Object from which the properties will be applied to\n\t *      out\n\t *  @param {boolean} breakRefs If true, then arrays will be sliced to take an\n\t *      independent copy with the exception of the `data` or `aaData` parameters\n\t *      if they are present. This is so you can pass in a collection to\n\t *      DataTables and have that used as your data source without breaking the\n\t *      references\n\t *  @returns {object} out Reference, just for convenience - out === the return.\n\t *  @memberof DataTable#oApi\n\t *  @todo This doesn't take account of arrays inside the deep copied objects.\n\t */\n\tfunction _fnExtend( out, extender, breakRefs )\n\t{\n\t\tvar val;\n\n\t\tfor ( var prop in extender ) {\n\t\t\tif ( extender.hasOwnProperty(prop) ) {\n\t\t\t\tval = extender[prop];\n\n\t\t\t\tif ( $.isPlainObject( val ) ) {\n\t\t\t\t\tif ( ! $.isPlainObject( out[prop] ) ) {\n\t\t\t\t\t\tout[prop] = {};\n\t\t\t\t\t}\n\t\t\t\t\t$.extend( true, out[prop], val );\n\t\t\t\t}\n\t\t\t\telse if ( breakRefs && prop !== 'data' && prop !== 'aaData' && $.isArray(val) ) {\n\t\t\t\t\tout[prop] = val.slice();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tout[prop] = val;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn out;\n\t}\n\n\n\t/**\n\t * Bind an event handers to allow a click or return key to activate the callback.\n\t * This is good for accessibility since a return on the keyboard will have the\n\t * same effect as a click, if the element has focus.\n\t *  @param {element} n Element to bind the action to\n\t *  @param {object} oData Data object to pass to the triggered function\n\t *  @param {function} fn Callback function for when the event is triggered\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnBindAction( n, oData, fn )\n\t{\n\t\t$(n)\n\t\t\t.bind( 'click.DT', oData, function (e) {\n\t\t\t\t\tn.blur(); // Remove focus outline for mouse users\n\t\t\t\t\tfn(e);\n\t\t\t\t} )\n\t\t\t.bind( 'keypress.DT', oData, function (e){\n\t\t\t\tif ( e.which === 13 ) {\n\t\t\t\t\tfn(e);\n\t\t\t\t} } )\n\t\t\t.bind( 'selectstart.DT', function () {\n\t\t\t\t/* Take the brutal approach to cancelling text selection */\n\t\t\t\treturn false;\n\t\t\t\t} );\n\t}\n\n\n\t/**\n\t * Register a callback function. Easily allows a callback function to be added to\n\t * an array store of callback functions that can then all be called together.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {string} sStore Name of the array storage for the callbacks in oSettings\n\t *  @param {function} fn Function to be called back\n\t *  @param {string} sName Identifying name for the callback (i.e. a label)\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnCallbackReg( oSettings, sStore, fn, sName )\n\t{\n\t\tif ( fn )\n\t\t{\n\t\t\toSettings[sStore].push( {\n\t\t\t\t\"fn\": fn,\n\t\t\t\t\"sName\": sName\n\t\t\t} );\n\t\t}\n\t}\n\n\n\t/**\n\t * Fire callback functions and trigger events. Note that the loop over the\n\t * callback array store is done backwards! Further note that you do not want to\n\t * fire off triggers in time sensitive applications (for example cell creation)\n\t * as its slow.\n\t *  @param {object} settings dataTables settings object\n\t *  @param {string} callbackArr Name of the array storage for the callbacks in\n\t *      oSettings\n\t *  @param {string} event Name of the jQuery custom event to trigger. If null no\n\t *      trigger is fired\n\t *  @param {array} args Array of arguments to pass to the callback function /\n\t *      trigger\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnCallbackFire( settings, callbackArr, event, args )\n\t{\n\t\tvar ret = [];\n\n\t\tif ( callbackArr ) {\n\t\t\tret = $.map( settings[callbackArr].slice().reverse(), function (val, i) {\n\t\t\t\treturn val.fn.apply( settings.oInstance, args );\n\t\t\t} );\n\t\t}\n\n\t\tif ( event !== null ) {\n\t\t\t$(settings.nTable).trigger( event+'.dt', args );\n\t\t}\n\n\t\treturn ret;\n\t}\n\n\n\tfunction _fnLengthOverflow ( settings )\n\t{\n\t\tvar\n\t\t\tstart = settings._iDisplayStart,\n\t\t\tend = settings.fnDisplayEnd(),\n\t\t\tlen = settings._iDisplayLength;\n\n\t\t/* If we have space to show extra rows (backing up from the end point - then do so */\n\t\tif ( end === settings.fnRecordsDisplay() )\n\t\t{\n\t\t\tstart = end - len;\n\t\t}\n\n\t\tif ( len === -1 || start < 0 )\n\t\t{\n\t\t\tstart = 0;\n\t\t}\n\n\t\tsettings._iDisplayStart = start;\n\t}\n\n\n\tfunction _fnRenderer( settings, type )\n\t{\n\t\tvar renderer = settings.renderer;\n\t\tvar host = DataTable.ext.renderer[type];\n\n\t\tif ( $.isPlainObject( renderer ) && renderer[type] ) {\n\t\t\t// Specific renderer for this type. If available use it, otherwise use\n\t\t\t// the default.\n\t\t\treturn host[renderer[type]] || host._;\n\t\t}\n\t\telse if ( typeof renderer === 'string' ) {\n\t\t\t// Common renderer - if there is one available for this type use it,\n\t\t\t// otherwise use the default\n\t\t\treturn host[renderer] || host._;\n\t\t}\n\n\t\t// Use the default\n\t\treturn host._;\n\t}\n\n\n\t/**\n\t * Detect the data source being used for the table. Used to simplify the code\n\t * a little (ajax) and to make it compress a little smaller.\n\t *\n\t *  @param {object} settings dataTables settings object\n\t *  @returns {string} Data source\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnDataSource ( settings )\n\t{\n\t\tif ( settings.oFeatures.bServerSide ) {\n\t\t\treturn 'ssp';\n\t\t}\n\t\telse if ( settings.ajax || settings.sAjaxSource ) {\n\t\t\treturn 'ajax';\n\t\t}\n\t\treturn 'dom';\n\t}\n\n\n\tDataTable = function( options )\n\t{\n\t\t/**\n\t\t * Perform a jQuery selector action on the table's TR elements (from the tbody) and\n\t\t * return the resulting jQuery object.\n\t\t *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on\n\t\t *  @param {object} [oOpts] Optional parameters for modifying the rows to be included\n\t\t *  @param {string} [oOpts.filter=none] Select TR elements that meet the current filter\n\t\t *    criterion (\"applied\") or all TR elements (i.e. no filter).\n\t\t *  @param {string} [oOpts.order=current] Order of the TR elements in the processed array.\n\t\t *    Can be either 'current', whereby the current sorting of the table is used, or\n\t\t *    'original' whereby the original order the data was read into the table is used.\n\t\t *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page\n\t\t *    (\"current\") or not (\"all\"). If 'current' is given, then order is assumed to be\n\t\t *    'current' and filter is 'applied', regardless of what they might be given as.\n\t\t *  @returns {object} jQuery object, filtered by the given selector.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Highlight every second row\n\t\t *      oTable.$('tr:odd').css('backgroundColor', 'blue');\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Filter to rows with 'Webkit' in them, add a background colour and then\n\t\t *      // remove the filter, thus highlighting the 'Webkit' rows only.\n\t\t *      oTable.fnFilter('Webkit');\n\t\t *      oTable.$('tr', {\"search\": \"applied\"}).css('backgroundColor', 'blue');\n\t\t *      oTable.fnFilter('');\n\t\t *    } );\n\t\t */\n\t\tthis.$ = function ( sSelector, oOpts )\n\t\t{\n\t\t\treturn this.api(true).$( sSelector, oOpts );\n\t\t};\n\n\n\t\t/**\n\t\t * Almost identical to $ in operation, but in this case returns the data for the matched\n\t\t * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes\n\t\t * rather than any descendants, so the data can be obtained for the row/cell. If matching\n\t\t * rows are found, the data returned is the original data array/object that was used to\n\t\t * create the row (or a generated array if from a DOM source).\n\t\t *\n\t\t * This method is often useful in-combination with $ where both functions are given the\n\t\t * same parameters and the array indexes will match identically.\n\t\t *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on\n\t\t *  @param {object} [oOpts] Optional parameters for modifying the rows to be included\n\t\t *  @param {string} [oOpts.filter=none] Select elements that meet the current filter\n\t\t *    criterion (\"applied\") or all elements (i.e. no filter).\n\t\t *  @param {string} [oOpts.order=current] Order of the data in the processed array.\n\t\t *    Can be either 'current', whereby the current sorting of the table is used, or\n\t\t *    'original' whereby the original order the data was read into the table is used.\n\t\t *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page\n\t\t *    (\"current\") or not (\"all\"). If 'current' is given, then order is assumed to be\n\t\t *    'current' and filter is 'applied', regardless of what they might be given as.\n\t\t *  @returns {array} Data for the matched elements. If any elements, as a result of the\n\t\t *    selector, were not TR, TD or TH elements in the DataTable, they will have a null\n\t\t *    entry in the array.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Get the data from the first row in the table\n\t\t *      var data = oTable._('tr:first');\n\t\t *\n\t\t *      // Do something useful with the data\n\t\t *      alert( \"First cell is: \"+data[0] );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Filter to 'Webkit' and get all data for\n\t\t *      oTable.fnFilter('Webkit');\n\t\t *      var data = oTable._('tr', {\"search\": \"applied\"});\n\t\t *\n\t\t *      // Do something with the data\n\t\t *      alert( data.length+\" rows matched the search\" );\n\t\t *    } );\n\t\t */\n\t\tthis._ = function ( sSelector, oOpts )\n\t\t{\n\t\t\treturn this.api(true).rows( sSelector, oOpts ).data();\n\t\t};\n\n\n\t\t/**\n\t\t * Create a DataTables Api instance, with the currently selected tables for\n\t\t * the Api's context.\n\t\t * @param {boolean} [traditional=false] Set the API instance's context to be\n\t\t *   only the table referred to by the `DataTable.ext.iApiIndex` option, as was\n\t\t *   used in the API presented by DataTables 1.9- (i.e. the traditional mode),\n\t\t *   or if all tables captured in the jQuery object should be used.\n\t\t * @return {DataTables.Api}\n\t\t */\n\t\tthis.api = function ( traditional )\n\t\t{\n\t\t\treturn traditional ?\n\t\t\t\tnew _Api(\n\t\t\t\t\t_fnSettingsFromNode( this[ _ext.iApiIndex ] )\n\t\t\t\t) :\n\t\t\t\tnew _Api( this );\n\t\t};\n\n\n\t\t/**\n\t\t * Add a single new row or multiple rows of data to the table. Please note\n\t\t * that this is suitable for client-side processing only - if you are using\n\t\t * server-side processing (i.e. \"bServerSide\": true), then to add data, you\n\t\t * must add it to the data source, i.e. the server-side, through an Ajax call.\n\t\t *  @param {array|object} data The data to be added to the table. This can be:\n\t\t *    <ul>\n\t\t *      <li>1D array of data - add a single row with the data provided</li>\n\t\t *      <li>2D array of arrays - add multiple rows in a single call</li>\n\t\t *      <li>object - data object when using <i>mData</i></li>\n\t\t *      <li>array of objects - multiple data objects when using <i>mData</i></li>\n\t\t *    </ul>\n\t\t *  @param {bool} [redraw=true] redraw the table or not\n\t\t *  @returns {array} An array of integers, representing the list of indexes in\n\t\t *    <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to\n\t\t *    the table.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    // Global var for counter\n\t\t *    var giCount = 2;\n\t\t *\n\t\t *    $(document).ready(function() {\n\t\t *      $('#example').dataTable();\n\t\t *    } );\n\t\t *\n\t\t *    function fnClickAddRow() {\n\t\t *      $('#example').dataTable().fnAddData( [\n\t\t *        giCount+\".1\",\n\t\t *        giCount+\".2\",\n\t\t *        giCount+\".3\",\n\t\t *        giCount+\".4\" ]\n\t\t *      );\n\t\t *\n\t\t *      giCount++;\n\t\t *    }\n\t\t */\n\t\tthis.fnAddData = function( data, redraw )\n\t\t{\n\t\t\tvar api = this.api( true );\n\n\t\t\t/* Check if we want to add multiple rows or not */\n\t\t\tvar rows = $.isArray(data) && ( $.isArray(data[0]) || $.isPlainObject(data[0]) ) ?\n\t\t\t\tapi.rows.add( data ) :\n\t\t\t\tapi.row.add( data );\n\n\t\t\tif ( redraw === undefined || redraw ) {\n\t\t\t\tapi.draw();\n\t\t\t}\n\n\t\t\treturn rows.flatten().toArray();\n\t\t};\n\n\n\t\t/**\n\t\t * This function will make DataTables recalculate the column sizes, based on the data\n\t\t * contained in the table and the sizes applied to the columns (in the DOM, CSS or\n\t\t * through the sWidth parameter). This can be useful when the width of the table's\n\t\t * parent element changes (for example a window resize).\n\t\t *  @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable( {\n\t\t *        \"sScrollY\": \"200px\",\n\t\t *        \"bPaginate\": false\n\t\t *      } );\n\t\t *\n\t\t *      $(window).bind('resize', function () {\n\t\t *        oTable.fnAdjustColumnSizing();\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\tthis.fnAdjustColumnSizing = function ( bRedraw )\n\t\t{\n\t\t\tvar api = this.api( true ).columns.adjust();\n\t\t\tvar settings = api.settings()[0];\n\t\t\tvar scroll = settings.oScroll;\n\n\t\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\t\tapi.draw( false );\n\t\t\t}\n\t\t\telse if ( scroll.sX !== \"\" || scroll.sY !== \"\" ) {\n\t\t\t\t/* If not redrawing, but scrolling, we want to apply the new column sizes anyway */\n\t\t\t\t_fnScrollDraw( settings );\n\t\t\t}\n\t\t};\n\n\n\t\t/**\n\t\t * Quickly and simply clear a table\n\t\t *  @param {bool} [bRedraw=true] redraw the table or not\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)\n\t\t *      oTable.fnClearTable();\n\t\t *    } );\n\t\t */\n\t\tthis.fnClearTable = function( bRedraw )\n\t\t{\n\t\t\tvar api = this.api( true ).clear();\n\n\t\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\t\tapi.draw();\n\t\t\t}\n\t\t};\n\n\n\t\t/**\n\t\t * The exact opposite of 'opening' a row, this function will close any rows which\n\t\t * are currently 'open'.\n\t\t *  @param {node} nTr the table row to 'close'\n\t\t *  @returns {int} 0 on success, or 1 if failed (can't find the row)\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable;\n\t\t *\n\t\t *      // 'open' an information row when a row is clicked on\n\t\t *      $('#example tbody tr').click( function () {\n\t\t *        if ( oTable.fnIsOpen(this) ) {\n\t\t *          oTable.fnClose( this );\n\t\t *        } else {\n\t\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t\t *        }\n\t\t *      } );\n\t\t *\n\t\t *      oTable = $('#example').dataTable();\n\t\t *    } );\n\t\t */\n\t\tthis.fnClose = function( nTr )\n\t\t{\n\t\t\tthis.api( true ).row( nTr ).child.hide();\n\t\t};\n\n\n\t\t/**\n\t\t * Remove a row for the table\n\t\t *  @param {mixed} target The index of the row from aoData to be deleted, or\n\t\t *    the TR element you want to delete\n\t\t *  @param {function|null} [callBack] Callback function\n\t\t *  @param {bool} [redraw=true] Redraw the table or not\n\t\t *  @returns {array} The row that was deleted\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Immediately remove the first row\n\t\t *      oTable.fnDeleteRow( 0 );\n\t\t *    } );\n\t\t */\n\t\tthis.fnDeleteRow = function( target, callback, redraw )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\tvar rows = api.rows( target );\n\t\t\tvar settings = rows.settings()[0];\n\t\t\tvar data = settings.aoData[ rows[0][0] ];\n\n\t\t\trows.remove();\n\n\t\t\tif ( callback ) {\n\t\t\t\tcallback.call( this, settings, data );\n\t\t\t}\n\n\t\t\tif ( redraw === undefined || redraw ) {\n\t\t\t\tapi.draw();\n\t\t\t}\n\n\t\t\treturn data;\n\t\t};\n\n\n\t\t/**\n\t\t * Restore the table to it's original state in the DOM by removing all of DataTables\n\t\t * enhancements, alterations to the DOM structure of the table and event listeners.\n\t\t *  @param {boolean} [remove=false] Completely remove the table from the DOM\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      // This example is fairly pointless in reality, but shows how fnDestroy can be used\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *      oTable.fnDestroy();\n\t\t *    } );\n\t\t */\n\t\tthis.fnDestroy = function ( remove )\n\t\t{\n\t\t\tthis.api( true ).destroy( remove );\n\t\t};\n\n\n\t\t/**\n\t\t * Redraw the table\n\t\t *  @param {bool} [complete=true] Re-filter and resort (if enabled) the table before the draw.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Re-draw the table - you wouldn't want to do it here, but it's an example :-)\n\t\t *      oTable.fnDraw();\n\t\t *    } );\n\t\t */\n\t\tthis.fnDraw = function( complete )\n\t\t{\n\t\t\t// Note that this isn't an exact match to the old call to _fnDraw - it takes\n\t\t\t// into account the new data, but can old position.\n\t\t\tthis.api( true ).draw( ! complete );\n\t\t};\n\n\n\t\t/**\n\t\t * Filter the input based on data\n\t\t *  @param {string} sInput String to filter the table on\n\t\t *  @param {int|null} [iColumn] Column to limit filtering to\n\t\t *  @param {bool} [bRegex=false] Treat as regular expression or not\n\t\t *  @param {bool} [bSmart=true] Perform smart filtering or not\n\t\t *  @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es)\n\t\t *  @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false)\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Sometime later - filter...\n\t\t *      oTable.fnFilter( 'test string' );\n\t\t *    } );\n\t\t */\n\t\tthis.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive )\n\t\t{\n\t\t\tvar api = this.api( true );\n\n\t\t\tif ( iColumn === null || iColumn === undefined ) {\n\t\t\t\tapi.search( sInput, bRegex, bSmart, bCaseInsensitive );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tapi.column( iColumn ).search( sInput, bRegex, bSmart, bCaseInsensitive );\n\t\t\t}\n\n\t\t\tapi.draw();\n\t\t};\n\n\n\t\t/**\n\t\t * Get the data for the whole table, an individual row or an individual cell based on the\n\t\t * provided parameters.\n\t\t *  @param {int|node} [src] A TR row node, TD/TH cell node or an integer. If given as\n\t\t *    a TR node then the data source for the whole row will be returned. If given as a\n\t\t *    TD/TH cell node then iCol will be automatically calculated and the data for the\n\t\t *    cell returned. If given as an integer, then this is treated as the aoData internal\n\t\t *    data index for the row (see fnGetPosition) and the data for that row used.\n\t\t *  @param {int} [col] Optional column index that you want the data of.\n\t\t *  @returns {array|object|string} If mRow is undefined, then the data for all rows is\n\t\t *    returned. If mRow is defined, just data for that row, and is iCol is\n\t\t *    defined, only data for the designated cell is returned.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    // Row data\n\t\t *    $(document).ready(function() {\n\t\t *      oTable = $('#example').dataTable();\n\t\t *\n\t\t *      oTable.$('tr').click( function () {\n\t\t *        var data = oTable.fnGetData( this );\n\t\t *        // ... do something with the array / object of data for the row\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Individual cell data\n\t\t *    $(document).ready(function() {\n\t\t *      oTable = $('#example').dataTable();\n\t\t *\n\t\t *      oTable.$('td').click( function () {\n\t\t *        var sData = oTable.fnGetData( this );\n\t\t *        alert( 'The cell clicked on had the value of '+sData );\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\tthis.fnGetData = function( src, col )\n\t\t{\n\t\t\tvar api = this.api( true );\n\n\t\t\tif ( src !== undefined ) {\n\t\t\t\tvar type = src.nodeName ? src.nodeName.toLowerCase() : '';\n\n\t\t\t\treturn col !== undefined || type == 'td' || type == 'th' ?\n\t\t\t\t\tapi.cell( src, col ).data() :\n\t\t\t\t\tapi.row( src ).data();\n\t\t\t}\n\n\t\t\treturn api.data().toArray();\n\t\t};\n\n\n\t\t/**\n\t\t * Get an array of the TR nodes that are used in the table's body. Note that you will\n\t\t * typically want to use the '$' API method in preference to this as it is more\n\t\t * flexible.\n\t\t *  @param {int} [iRow] Optional row index for the TR element you want\n\t\t *  @returns {array|node} If iRow is undefined, returns an array of all TR elements\n\t\t *    in the table's body, or iRow is defined, just the TR element requested.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Get the nodes from the table\n\t\t *      var nNodes = oTable.fnGetNodes( );\n\t\t *    } );\n\t\t */\n\t\tthis.fnGetNodes = function( iRow )\n\t\t{\n\t\t\tvar api = this.api( true );\n\n\t\t\treturn iRow !== undefined ?\n\t\t\t\tapi.row( iRow ).node() :\n\t\t\t\tapi.rows().nodes().toArray();\n\t\t};\n\n\n\t\t/**\n\t\t * Get the array indexes of a particular cell from it's DOM element\n\t\t * and column index including hidden columns\n\t\t *  @param {node} node this can either be a TR, TD or TH in the table's body\n\t\t *  @returns {int} If nNode is given as a TR, then a single index is returned, or\n\t\t *    if given as a cell, an array of [row index, column index (visible),\n\t\t *    column index (all)] is given.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      $('#example tbody td').click( function () {\n\t\t *        // Get the position of the current data from the node\n\t\t *        var aPos = oTable.fnGetPosition( this );\n\t\t *\n\t\t *        // Get the data array for this row\n\t\t *        var aData = oTable.fnGetData( aPos[0] );\n\t\t *\n\t\t *        // Update the data array and return the value\n\t\t *        aData[ aPos[1] ] = 'clicked';\n\t\t *        this.innerHTML = 'clicked';\n\t\t *      } );\n\t\t *\n\t\t *      // Init DataTables\n\t\t *      oTable = $('#example').dataTable();\n\t\t *    } );\n\t\t */\n\t\tthis.fnGetPosition = function( node )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\tvar nodeName = node.nodeName.toUpperCase();\n\n\t\t\tif ( nodeName == 'TR' ) {\n\t\t\t\treturn api.row( node ).index();\n\t\t\t}\n\t\t\telse if ( nodeName == 'TD' || nodeName == 'TH' ) {\n\t\t\t\tvar cell = api.cell( node ).index();\n\n\t\t\t\treturn [\n\t\t\t\t\tcell.row,\n\t\t\t\t\tcell.columnVisible,\n\t\t\t\t\tcell.column\n\t\t\t\t];\n\t\t\t}\n\t\t\treturn null;\n\t\t};\n\n\n\t\t/**\n\t\t * Check to see if a row is 'open' or not.\n\t\t *  @param {node} nTr the table row to check\n\t\t *  @returns {boolean} true if the row is currently open, false otherwise\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable;\n\t\t *\n\t\t *      // 'open' an information row when a row is clicked on\n\t\t *      $('#example tbody tr').click( function () {\n\t\t *        if ( oTable.fnIsOpen(this) ) {\n\t\t *          oTable.fnClose( this );\n\t\t *        } else {\n\t\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t\t *        }\n\t\t *      } );\n\t\t *\n\t\t *      oTable = $('#example').dataTable();\n\t\t *    } );\n\t\t */\n\t\tthis.fnIsOpen = function( nTr )\n\t\t{\n\t\t\treturn this.api( true ).row( nTr ).child.isShown();\n\t\t};\n\n\n\t\t/**\n\t\t * This function will place a new row directly after a row which is currently\n\t\t * on display on the page, with the HTML contents that is passed into the\n\t\t * function. This can be used, for example, to ask for confirmation that a\n\t\t * particular record should be deleted.\n\t\t *  @param {node} nTr The table row to 'open'\n\t\t *  @param {string|node|jQuery} mHtml The HTML to put into the row\n\t\t *  @param {string} sClass Class to give the new TD cell\n\t\t *  @returns {node} The row opened. Note that if the table row passed in as the\n\t\t *    first parameter, is not found in the table, this method will silently\n\t\t *    return.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable;\n\t\t *\n\t\t *      // 'open' an information row when a row is clicked on\n\t\t *      $('#example tbody tr').click( function () {\n\t\t *        if ( oTable.fnIsOpen(this) ) {\n\t\t *          oTable.fnClose( this );\n\t\t *        } else {\n\t\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t\t *        }\n\t\t *      } );\n\t\t *\n\t\t *      oTable = $('#example').dataTable();\n\t\t *    } );\n\t\t */\n\t\tthis.fnOpen = function( nTr, mHtml, sClass )\n\t\t{\n\t\t\treturn this.api( true ).row( nTr ).child( mHtml, sClass ).show();\n\t\t};\n\n\n\t\t/**\n\t\t * Change the pagination - provides the internal logic for pagination in a simple API\n\t\t * function. With this function you can have a DataTables table go to the next,\n\t\t * previous, first or last pages.\n\t\t *  @param {string|int} mAction Paging action to take: \"first\", \"previous\", \"next\" or \"last\"\n\t\t *    or page number to jump to (integer), note that page 0 is the first page.\n\t\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *      oTable.fnPageChange( 'next' );\n\t\t *    } );\n\t\t */\n\t\tthis.fnPageChange = function ( mAction, bRedraw )\n\t\t{\n\t\t\tvar api = this.api( true ).page( mAction );\n\n\t\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\t\tapi.draw(false);\n\t\t\t}\n\t\t};\n\n\n\t\t/**\n\t\t * Show a particular column\n\t\t *  @param {int} iCol The column whose display should be changed\n\t\t *  @param {bool} bShow Show (true) or hide (false) the column\n\t\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Hide the second column after initialisation\n\t\t *      oTable.fnSetColumnVis( 1, false );\n\t\t *    } );\n\t\t */\n\t\tthis.fnSetColumnVis = function ( iCol, bShow, bRedraw )\n\t\t{\n\t\t\tvar api = this.api( true ).column( iCol ).visible( bShow );\n\n\t\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\t\tapi.columns.adjust().draw();\n\t\t\t}\n\t\t};\n\n\n\t\t/**\n\t\t * Get the settings for a particular table for external manipulation\n\t\t *  @returns {object} DataTables settings object. See\n\t\t *    {@link DataTable.models.oSettings}\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *      var oSettings = oTable.fnSettings();\n\t\t *\n\t\t *      // Show an example parameter from the settings\n\t\t *      alert( oSettings._iDisplayStart );\n\t\t *    } );\n\t\t */\n\t\tthis.fnSettings = function()\n\t\t{\n\t\t\treturn _fnSettingsFromNode( this[_ext.iApiIndex] );\n\t\t};\n\n\n\t\t/**\n\t\t * Sort the table by a particular column\n\t\t *  @param {int} iCol the data index to sort on. Note that this will not match the\n\t\t *    'display index' if you have hidden data entries\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Sort immediately with columns 0 and 1\n\t\t *      oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );\n\t\t *    } );\n\t\t */\n\t\tthis.fnSort = function( aaSort )\n\t\t{\n\t\t\tthis.api( true ).order( aaSort ).draw();\n\t\t};\n\n\n\t\t/**\n\t\t * Attach a sort listener to an element for a given column\n\t\t *  @param {node} nNode the element to attach the sort listener to\n\t\t *  @param {int} iColumn the column that a click on this node will sort on\n\t\t *  @param {function} [fnCallback] callback function when sort is run\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Sort on column 1, when 'sorter' is clicked on\n\t\t *      oTable.fnSortListener( document.getElementById('sorter'), 1 );\n\t\t *    } );\n\t\t */\n\t\tthis.fnSortListener = function( nNode, iColumn, fnCallback )\n\t\t{\n\t\t\tthis.api( true ).order.listener( nNode, iColumn, fnCallback );\n\t\t};\n\n\n\t\t/**\n\t\t * Update a table cell or row - this method will accept either a single value to\n\t\t * update the cell with, an array of values with one element for each column or\n\t\t * an object in the same format as the original data source. The function is\n\t\t * self-referencing in order to make the multi column updates easier.\n\t\t *  @param {object|array|string} mData Data to update the cell/row with\n\t\t *  @param {node|int} mRow TR element you want to update or the aoData index\n\t\t *  @param {int} [iColumn] The column to update, give as null or undefined to\n\t\t *    update a whole row.\n\t\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t\t *  @param {bool} [bAction=true] Perform pre-draw actions or not\n\t\t *  @returns {int} 0 on success, 1 on error\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *      oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell\n\t\t *      oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], $('tbody tr')[0] ); // Row\n\t\t *    } );\n\t\t */\n\t\tthis.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )\n\t\t{\n\t\t\tvar api = this.api( true );\n\n\t\t\tif ( iColumn === undefined || iColumn === null ) {\n\t\t\t\tapi.row( mRow ).data( mData );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tapi.cell( mRow, iColumn ).data( mData );\n\t\t\t}\n\n\t\t\tif ( bAction === undefined || bAction ) {\n\t\t\t\tapi.columns.adjust();\n\t\t\t}\n\n\t\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\t\tapi.draw();\n\t\t\t}\n\t\t\treturn 0;\n\t\t};\n\n\n\t\t/**\n\t\t * Provide a common method for plug-ins to check the version of DataTables being used, in order\n\t\t * to ensure compatibility.\n\t\t *  @param {string} sVersion Version string to check for, in the format \"X.Y.Z\". Note that the\n\t\t *    formats \"X\" and \"X.Y\" are also acceptable.\n\t\t *  @returns {boolean} true if this version of DataTables is greater or equal to the required\n\t\t *    version, or false if this version of DataTales is not suitable\n\t\t *  @method\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *      alert( oTable.fnVersionCheck( '1.9.0' ) );\n\t\t *    } );\n\t\t */\n\t\tthis.fnVersionCheck = _ext.fnVersionCheck;\n\n\n\t\t/*\n\t\t * This is really a good bit rubbish this method of exposing the internal methods\n\t\t * publicly... - To be fixed in 2.0 using methods on the prototype\n\t\t */\n\n\n\t\t/**\n\t\t * Create a wrapper function for exporting an internal functions to an external API.\n\t\t *  @param {string} fn API function name\n\t\t *  @returns {function} wrapped function\n\t\t *  @memberof DataTable#internal\n\t\t */\n\t\tfunction _fnExternApiFunc (fn)\n\t\t{\n\t\t\treturn function() {\n\t\t\t\tvar args = [_fnSettingsFromNode( this[DataTable.ext.iApiIndex] )].concat(\n\t\t\t\t\tArray.prototype.slice.call(arguments)\n\t\t\t\t);\n\t\t\t\treturn DataTable.ext.internal[fn].apply( this, args );\n\t\t\t};\n\t\t}\n\n\n\t\t/**\n\t\t * Reference to internal functions for use by plug-in developers. Note that\n\t\t * these methods are references to internal functions and are considered to be\n\t\t * private. If you use these methods, be aware that they are liable to change\n\t\t * between versions.\n\t\t *  @namespace\n\t\t */\n\t\tthis.oApi = this.internal = {\n\t\t\t_fnExternApiFunc: _fnExternApiFunc,\n\t\t\t_fnBuildAjax: _fnBuildAjax,\n\t\t\t_fnAjaxUpdate: _fnAjaxUpdate,\n\t\t\t_fnAjaxParameters: _fnAjaxParameters,\n\t\t\t_fnAjaxUpdateDraw: _fnAjaxUpdateDraw,\n\t\t\t_fnAjaxDataSrc: _fnAjaxDataSrc,\n\t\t\t_fnAddColumn: _fnAddColumn,\n\t\t\t_fnColumnOptions: _fnColumnOptions,\n\t\t\t_fnAdjustColumnSizing: _fnAdjustColumnSizing,\n\t\t\t_fnVisibleToColumnIndex: _fnVisibleToColumnIndex,\n\t\t\t_fnColumnIndexToVisible: _fnColumnIndexToVisible,\n\t\t\t_fnVisbleColumns: _fnVisbleColumns,\n\t\t\t_fnGetColumns: _fnGetColumns,\n\t\t\t_fnColumnTypes: _fnColumnTypes,\n\t\t\t_fnApplyColumnDefs: _fnApplyColumnDefs,\n\t\t\t_fnHungarianMap: _fnHungarianMap,\n\t\t\t_fnCamelToHungarian: _fnCamelToHungarian,\n\t\t\t_fnLanguageCompat: _fnLanguageCompat,\n\t\t\t_fnBrowserDetect: _fnBrowserDetect,\n\t\t\t_fnAddData: _fnAddData,\n\t\t\t_fnAddTr: _fnAddTr,\n\t\t\t_fnNodeToDataIndex: _fnNodeToDataIndex,\n\t\t\t_fnNodeToColumnIndex: _fnNodeToColumnIndex,\n\t\t\t_fnGetRowData: _fnGetRowData,\n\t\t\t_fnGetCellData: _fnGetCellData,\n\t\t\t_fnSetCellData: _fnSetCellData,\n\t\t\t_fnSplitObjNotation: _fnSplitObjNotation,\n\t\t\t_fnGetObjectDataFn: _fnGetObjectDataFn,\n\t\t\t_fnSetObjectDataFn: _fnSetObjectDataFn,\n\t\t\t_fnGetDataMaster: _fnGetDataMaster,\n\t\t\t_fnClearTable: _fnClearTable,\n\t\t\t_fnDeleteIndex: _fnDeleteIndex,\n\t\t\t_fnInvalidateRow: _fnInvalidateRow,\n\t\t\t_fnGetRowElements: _fnGetRowElements,\n\t\t\t_fnCreateTr: _fnCreateTr,\n\t\t\t_fnBuildHead: _fnBuildHead,\n\t\t\t_fnDrawHead: _fnDrawHead,\n\t\t\t_fnDraw: _fnDraw,\n\t\t\t_fnReDraw: _fnReDraw,\n\t\t\t_fnAddOptionsHtml: _fnAddOptionsHtml,\n\t\t\t_fnDetectHeader: _fnDetectHeader,\n\t\t\t_fnGetUniqueThs: _fnGetUniqueThs,\n\t\t\t_fnFeatureHtmlFilter: _fnFeatureHtmlFilter,\n\t\t\t_fnFilterComplete: _fnFilterComplete,\n\t\t\t_fnFilterCustom: _fnFilterCustom,\n\t\t\t_fnFilterColumn: _fnFilterColumn,\n\t\t\t_fnFilter: _fnFilter,\n\t\t\t_fnFilterCreateSearch: _fnFilterCreateSearch,\n\t\t\t_fnEscapeRegex: _fnEscapeRegex,\n\t\t\t_fnFilterData: _fnFilterData,\n\t\t\t_fnFeatureHtmlInfo: _fnFeatureHtmlInfo,\n\t\t\t_fnUpdateInfo: _fnUpdateInfo,\n\t\t\t_fnInfoMacros: _fnInfoMacros,\n\t\t\t_fnInitialise: _fnInitialise,\n\t\t\t_fnInitComplete: _fnInitComplete,\n\t\t\t_fnLengthChange: _fnLengthChange,\n\t\t\t_fnFeatureHtmlLength: _fnFeatureHtmlLength,\n\t\t\t_fnFeatureHtmlPaginate: _fnFeatureHtmlPaginate,\n\t\t\t_fnPageChange: _fnPageChange,\n\t\t\t_fnFeatureHtmlProcessing: _fnFeatureHtmlProcessing,\n\t\t\t_fnProcessingDisplay: _fnProcessingDisplay,\n\t\t\t_fnFeatureHtmlTable: _fnFeatureHtmlTable,\n\t\t\t_fnScrollDraw: _fnScrollDraw,\n\t\t\t_fnApplyToChildren: _fnApplyToChildren,\n\t\t\t_fnCalculateColumnWidths: _fnCalculateColumnWidths,\n\t\t\t_fnThrottle: _fnThrottle,\n\t\t\t_fnConvertToWidth: _fnConvertToWidth,\n\t\t\t_fnScrollingWidthAdjust: _fnScrollingWidthAdjust,\n\t\t\t_fnGetWidestNode: _fnGetWidestNode,\n\t\t\t_fnGetMaxLenString: _fnGetMaxLenString,\n\t\t\t_fnStringToCss: _fnStringToCss,\n\t\t\t_fnScrollBarWidth: _fnScrollBarWidth,\n\t\t\t_fnSortFlatten: _fnSortFlatten,\n\t\t\t_fnSort: _fnSort,\n\t\t\t_fnSortAria: _fnSortAria,\n\t\t\t_fnSortListener: _fnSortListener,\n\t\t\t_fnSortAttachListener: _fnSortAttachListener,\n\t\t\t_fnSortingClasses: _fnSortingClasses,\n\t\t\t_fnSortData: _fnSortData,\n\t\t\t_fnSaveState: _fnSaveState,\n\t\t\t_fnLoadState: _fnLoadState,\n\t\t\t_fnSettingsFromNode: _fnSettingsFromNode,\n\t\t\t_fnLog: _fnLog,\n\t\t\t_fnMap: _fnMap,\n\t\t\t_fnBindAction: _fnBindAction,\n\t\t\t_fnCallbackReg: _fnCallbackReg,\n\t\t\t_fnCallbackFire: _fnCallbackFire,\n\t\t\t_fnLengthOverflow: _fnLengthOverflow,\n\t\t\t_fnRenderer: _fnRenderer,\n\t\t\t_fnDataSource: _fnDataSource,\n\t\t\t_fnRowAttributes: _fnRowAttributes\n\t\t};\n\n\t\t$.extend( DataTable.ext.internal, this.internal );\n\n\t\tfor ( var fn in DataTable.ext.internal ) {\n\t\t\tif ( fn ) {\n\t\t\t\tthis[fn] = _fnExternApiFunc(fn);\n\t\t\t}\n\t\t}\n\n\n\t\tvar _that = this;\n\t\tvar emptyInit = options === undefined;\n\t\tvar len = this.length;\n\n\t\tif ( emptyInit ) {\n\t\t\toptions = {};\n\t\t}\n\n\t\tthis.each(function() {\n\t\t\t// For each initialisation we want to give it a clean initialisation\n\t\t\t// object that can be bashed around\n\t\t\tvar o = {};\n\t\t\tvar oInit = len > 1 ? // optimisation for single table case\n\t\t\t\t_fnExtend( o, options, true ) :\n\t\t\t\toptions;\n\n\t\t\t/*global oInit,_that,emptyInit*/\n\t\t\tvar i=0, iLen, j, jLen, k, kLen;\n\t\t\tvar sId = this.getAttribute( 'id' );\n\t\t\tvar bInitHandedOff = false;\n\t\t\tvar defaults = DataTable.defaults;\n\n\n\t\t\t/* Sanity check */\n\t\t\tif ( this.nodeName.toLowerCase() != 'table' )\n\t\t\t{\n\t\t\t\t_fnLog( null, 0, 'Non-table node initialisation ('+this.nodeName+')', 2 );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t/* Backwards compatibility for the defaults */\n\t\t\t_fnCompatOpts( defaults );\n\t\t\t_fnCompatCols( defaults.column );\n\n\t\t\t/* Convert the camel-case defaults to Hungarian */\n\t\t\t_fnCamelToHungarian( defaults, defaults, true );\n\t\t\t_fnCamelToHungarian( defaults.column, defaults.column, true );\n\n\t\t\t/* Setting up the initialisation object */\n\t\t\t_fnCamelToHungarian( defaults, oInit );\n\n\t\t\t/* Check to see if we are re-initialising a table */\n\t\t\tvar allSettings = DataTable.settings;\n\t\t\tfor ( i=0, iLen=allSettings.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\t/* Base check on table node */\n\t\t\t\tif ( allSettings[i].nTable == this )\n\t\t\t\t{\n\t\t\t\t\tvar bRetrieve = oInit.bRetrieve !== undefined ? oInit.bRetrieve : defaults.bRetrieve;\n\t\t\t\t\tvar bDestroy = oInit.bDestroy !== undefined ? oInit.bDestroy : defaults.bDestroy;\n\n\t\t\t\t\tif ( emptyInit || bRetrieve )\n\t\t\t\t\t{\n\t\t\t\t\t\treturn allSettings[i].oInstance;\n\t\t\t\t\t}\n\t\t\t\t\telse if ( bDestroy )\n\t\t\t\t\t{\n\t\t\t\t\t\tallSettings[i].oInstance.fnDestroy();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t_fnLog( allSettings[i], 0, 'Cannot reinitialise DataTable', 3 );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/* If the element we are initialising has the same ID as a table which was previously\n\t\t\t\t * initialised, but the table nodes don't match (from before) then we destroy the old\n\t\t\t\t * instance by simply deleting it. This is under the assumption that the table has been\n\t\t\t\t * destroyed by other methods. Anyone using non-id selectors will need to do this manually\n\t\t\t\t */\n\t\t\t\tif ( allSettings[i].sTableId == this.id )\n\t\t\t\t{\n\t\t\t\t\tallSettings.splice( i, 1 );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* Ensure the table has an ID - required for accessibility */\n\t\t\tif ( sId === null || sId === \"\" )\n\t\t\t{\n\t\t\t\tsId = \"DataTables_Table_\"+(DataTable.ext._unique++);\n\t\t\t\tthis.id = sId;\n\t\t\t}\n\n\t\t\t/* Create the settings object for this table and set some of the default parameters */\n\t\t\tvar oSettings = $.extend( true, {}, DataTable.models.oSettings, {\n\t\t\t\t\"nTable\":        this,\n\t\t\t\t\"oApi\":          _that.internal,\n\t\t\t\t\"oInit\":         oInit,\n\t\t\t\t\"sDestroyWidth\": $(this)[0].style.width,\n\t\t\t\t\"sInstance\":     sId,\n\t\t\t\t\"sTableId\":      sId\n\t\t\t} );\n\t\t\tallSettings.push( oSettings );\n\n\t\t\t// Need to add the instance after the instance after the settings object has been added\n\t\t\t// to the settings array, so we can self reference the table instance if more than one\n\t\t\toSettings.oInstance = (_that.length===1) ? _that : $(this).dataTable();\n\n\t\t\t// Backwards compatibility, before we apply all the defaults\n\t\t\t_fnCompatOpts( oInit );\n\n\t\t\tif ( oInit.oLanguage )\n\t\t\t{\n\t\t\t\t_fnLanguageCompat( oInit.oLanguage );\n\t\t\t}\n\n\t\t\t// If the length menu is given, but the init display length is not, use the length menu\n\t\t\tif ( oInit.aLengthMenu && ! oInit.iDisplayLength )\n\t\t\t{\n\t\t\t\toInit.iDisplayLength = $.isArray( oInit.aLengthMenu[0] ) ?\n\t\t\t\t\toInit.aLengthMenu[0][0] : oInit.aLengthMenu[0];\n\t\t\t}\n\n\t\t\t// Apply the defaults and init options to make a single init object will all\n\t\t\t// options defined from defaults and instance options.\n\t\t\toInit = _fnExtend( $.extend( true, {}, defaults ), oInit );\n\n\n\t\t\t// Map the initialisation options onto the settings object\n\t\t\t_fnMap( oSettings.oFeatures, oInit, [\n\t\t\t\t\"bPaginate\",\n\t\t\t\t\"bLengthChange\",\n\t\t\t\t\"bFilter\",\n\t\t\t\t\"bSort\",\n\t\t\t\t\"bSortMulti\",\n\t\t\t\t\"bInfo\",\n\t\t\t\t\"bProcessing\",\n\t\t\t\t\"bAutoWidth\",\n\t\t\t\t\"bSortClasses\",\n\t\t\t\t\"bServerSide\",\n\t\t\t\t\"bDeferRender\"\n\t\t\t] );\n\t\t\t_fnMap( oSettings, oInit, [\n\t\t\t\t\"asStripeClasses\",\n\t\t\t\t\"ajax\",\n\t\t\t\t\"fnServerData\",\n\t\t\t\t\"fnFormatNumber\",\n\t\t\t\t\"sServerMethod\",\n\t\t\t\t\"aaSorting\",\n\t\t\t\t\"aaSortingFixed\",\n\t\t\t\t\"aLengthMenu\",\n\t\t\t\t\"sPaginationType\",\n\t\t\t\t\"sAjaxSource\",\n\t\t\t\t\"sAjaxDataProp\",\n\t\t\t\t\"iStateDuration\",\n\t\t\t\t\"sDom\",\n\t\t\t\t\"bSortCellsTop\",\n\t\t\t\t\"iTabIndex\",\n\t\t\t\t\"fnStateLoadCallback\",\n\t\t\t\t\"fnStateSaveCallback\",\n\t\t\t\t\"renderer\",\n\t\t\t\t[ \"iCookieDuration\", \"iStateDuration\" ], // backwards compat\n\t\t\t\t[ \"oSearch\", \"oPreviousSearch\" ],\n\t\t\t\t[ \"aoSearchCols\", \"aoPreSearchCols\" ],\n\t\t\t\t[ \"iDisplayLength\", \"_iDisplayLength\" ],\n\t\t\t\t[ \"bJQueryUI\", \"bJUI\" ]\n\t\t\t] );\n\t\t\t_fnMap( oSettings.oScroll, oInit, [\n\t\t\t\t[ \"sScrollX\", \"sX\" ],\n\t\t\t\t[ \"sScrollXInner\", \"sXInner\" ],\n\t\t\t\t[ \"sScrollY\", \"sY\" ],\n\t\t\t\t[ \"bScrollCollapse\", \"bCollapse\" ]\n\t\t\t] );\n\t\t\t_fnMap( oSettings.oLanguage, oInit, \"fnInfoCallback\" );\n\n\t\t\t/* Callback functions which are array driven */\n\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback',       oInit.fnDrawCallback,      'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoServerParams',       oInit.fnServerParams,      'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoStateSaveParams',    oInit.fnStateSaveParams,   'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoStateLoadParams',    oInit.fnStateLoadParams,   'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoStateLoaded',        oInit.fnStateLoaded,       'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoRowCallback',        oInit.fnRowCallback,       'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow,        'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoHeaderCallback',     oInit.fnHeaderCallback,    'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoFooterCallback',     oInit.fnFooterCallback,    'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoInitComplete',       oInit.fnInitComplete,      'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoPreDrawCallback',    oInit.fnPreDrawCallback,   'user' );\n\n\t\t\t// @todo Remove in 1.11\n\t\t\tif ( oInit.bJQueryUI )\n\t\t\t{\n\t\t\t\t/* Use the JUI classes object for display. You could clone the oStdClasses object if\n\t\t\t\t * you want to have multiple tables with multiple independent classes\n\t\t\t\t */\n\t\t\t\t$.extend( oSettings.oClasses, DataTable.ext.oJUIClasses, oInit.oClasses );\n\n\t\t\t\tif ( oInit.sDom === defaults.sDom && defaults.sDom === \"lfrtip\" )\n\t\t\t\t{\n\t\t\t\t\t/* Set the DOM to use a layout suitable for jQuery UI's theming */\n\t\t\t\t\toSettings.sDom = '<\"H\"lfr>t<\"F\"ip>';\n\t\t\t\t}\n\n\t\t\t\tif ( ! oSettings.renderer ) {\n\t\t\t\t\toSettings.renderer = 'jqueryui';\n\t\t\t\t}\n\t\t\t\telse if ( $.isPlainObject( oSettings.renderer ) && ! oSettings.renderer.header ) {\n\t\t\t\t\toSettings.renderer.header = 'jqueryui';\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$.extend( oSettings.oClasses, DataTable.ext.classes, oInit.oClasses );\n\t\t\t}\n\t\t\t$(this).addClass( oSettings.oClasses.sTable );\n\n\t\t\t/* Calculate the scroll bar width and cache it for use later on */\n\t\t\tif ( oSettings.oScroll.sX !== \"\" || oSettings.oScroll.sY !== \"\" )\n\t\t\t{\n\t\t\t\toSettings.oScroll.iBarWidth = _fnScrollBarWidth();\n\t\t\t}\n\t\t\tif ( oSettings.oScroll.sX === true ) { // Easy initialisation of x-scrolling\n\t\t\t\toSettings.oScroll.sX = '100%';\n\t\t\t}\n\n\t\t\tif ( oSettings.iInitDisplayStart === undefined )\n\t\t\t{\n\t\t\t\t/* Display start point, taking into account the save saving */\n\t\t\t\toSettings.iInitDisplayStart = oInit.iDisplayStart;\n\t\t\t\toSettings._iDisplayStart = oInit.iDisplayStart;\n\t\t\t}\n\n\t\t\tif ( oInit.iDeferLoading !== null )\n\t\t\t{\n\t\t\t\toSettings.bDeferLoading = true;\n\t\t\t\tvar tmp = $.isArray( oInit.iDeferLoading );\n\t\t\t\toSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading;\n\t\t\t\toSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading;\n\t\t\t}\n\n\t\t\t/* Language definitions */\n\t\t\tif ( oInit.oLanguage.sUrl !== \"\" )\n\t\t\t{\n\t\t\t\t/* Get the language definitions from a file - because this Ajax call makes the language\n\t\t\t\t * get async to the remainder of this function we use bInitHandedOff to indicate that\n\t\t\t\t * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor\n\t\t\t\t */\n\t\t\t\toSettings.oLanguage.sUrl = oInit.oLanguage.sUrl;\n\t\t\t\t$.getJSON( oSettings.oLanguage.sUrl, null, function( json ) {\n\t\t\t\t\t_fnLanguageCompat( json );\n\t\t\t\t\t_fnCamelToHungarian( defaults.oLanguage, json );\n\t\t\t\t\t$.extend( true, oSettings.oLanguage, oInit.oLanguage, json );\n\t\t\t\t\t_fnInitialise( oSettings );\n\t\t\t\t} );\n\t\t\t\tbInitHandedOff = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$.extend( true, oSettings.oLanguage, oInit.oLanguage );\n\t\t\t}\n\n\n\t\t\t/*\n\t\t\t * Stripes\n\t\t\t */\n\t\t\tif ( oInit.asStripeClasses === null )\n\t\t\t{\n\t\t\t\toSettings.asStripeClasses =[\n\t\t\t\t\toSettings.oClasses.sStripeOdd,\n\t\t\t\t\toSettings.oClasses.sStripeEven\n\t\t\t\t];\n\t\t\t}\n\n\t\t\t/* Remove row stripe classes if they are already on the table row */\n\t\t\tvar stripeClasses = oSettings.asStripeClasses;\n\t\t\tvar rowOne = $('tbody tr:eq(0)', this);\n\t\t\tif ( $.inArray( true, $.map( stripeClasses, function(el, i) {\n\t\t\t\treturn rowOne.hasClass(el);\n\t\t\t} ) ) !== -1 ) {\n\t\t\t\t$('tbody tr', this).removeClass( stripeClasses.join(' ') );\n\t\t\t\toSettings.asDestroyStripes = stripeClasses.slice();\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Columns\n\t\t\t * See if we should load columns automatically or use defined ones\n\t\t\t */\n\t\t\tvar anThs = [];\n\t\t\tvar aoColumnsInit;\n\t\t\tvar nThead = this.getElementsByTagName('thead');\n\t\t\tif ( nThead.length !== 0 )\n\t\t\t{\n\t\t\t\t_fnDetectHeader( oSettings.aoHeader, nThead[0] );\n\t\t\t\tanThs = _fnGetUniqueThs( oSettings );\n\t\t\t}\n\n\t\t\t/* If not given a column array, generate one with nulls */\n\t\t\tif ( oInit.aoColumns === null )\n\t\t\t{\n\t\t\t\taoColumnsInit = [];\n\t\t\t\tfor ( i=0, iLen=anThs.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\taoColumnsInit.push( null );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\taoColumnsInit = oInit.aoColumns;\n\t\t\t}\n\n\t\t\t/* Add the columns */\n\t\t\tfor ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\t_fnAddColumn( oSettings, anThs ? anThs[i] : null );\n\t\t\t}\n\n\t\t\t/* Apply the column definitions */\n\t\t\t_fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) {\n\t\t\t\t_fnColumnOptions( oSettings, iCol, oDef );\n\t\t\t} );\n\n\t\t\t/* HTML5 attribute detection - build an mData object automatically if the\n\t\t\t * attributes are found\n\t\t\t */\n\t\t\tif ( rowOne.length ) {\n\t\t\t\tvar a = function ( cell, name ) {\n\t\t\t\t\treturn cell.getAttribute( 'data-'+name ) ? name : null;\n\t\t\t\t};\n\n\t\t\t\t$.each( _fnGetRowElements( oSettings, rowOne[0] ).cells, function (i, cell) {\n\t\t\t\t\tvar col = oSettings.aoColumns[i];\n\n\t\t\t\t\tif ( col.mData === i ) {\n\t\t\t\t\t\tvar sort = a( cell, 'sort' ) || a( cell, 'order' );\n\t\t\t\t\t\tvar filter = a( cell, 'filter' ) || a( cell, 'search' );\n\n\t\t\t\t\t\tif ( sort !== null || filter !== null ) {\n\t\t\t\t\t\t\tcol.mData = {\n\t\t\t\t\t\t\t\t_:      i+'.display',\n\t\t\t\t\t\t\t\tsort:   sort !== null   ? i+'.@data-'+sort   : undefined,\n\t\t\t\t\t\t\t\ttype:   sort !== null   ? i+'.@data-'+sort   : undefined,\n\t\t\t\t\t\t\t\tfilter: filter !== null ? i+'.@data-'+filter : undefined\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t_fnColumnOptions( oSettings, i );\n\t\t\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/* Must be done after everything which can be overridden by the state saving! */\n\t\t\tif ( oInit.bStateSave )\n\t\t\t{\n\t\t\t\toSettings.oFeatures.bStateSave = true;\n\t\t\t\t_fnLoadState( oSettings, oInit );\n\t\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' );\n\t\t\t}\n\n\n\t\t\t/*\n\t\t\t * Sorting\n\t\t\t * @todo For modularisation (1.11) this needs to do into a sort start up handler\n\t\t\t */\n\n\t\t\t// If aaSorting is not defined, then we use the first indicator in asSorting\n\t\t\t// in case that has been altered, so the default sort reflects that option\n\t\t\tif ( oInit.aaSorting === undefined )\n\t\t\t{\n\t\t\t\tfor ( i=0, iLen=oSettings.aaSorting.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\toSettings.aaSorting[i][1] = oSettings.aoColumns[ i ].asSorting[0];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* Do a first pass on the sorting classes (allows any size changes to be taken into\n\t\t\t * account, and also will apply sorting disabled classes if disabled\n\t\t\t */\n\t\t\t_fnSortingClasses( oSettings );\n\n\t\t\tif ( oSettings.oFeatures.bSort )\n\t\t\t{\n\t\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', function () {\n\t\t\t\t\tif ( oSettings.bSorted ) {\n\t\t\t\t\t\tvar aSort = _fnSortFlatten( oSettings );\n\t\t\t\t\t\tvar sortedColumns = {};\n\n\t\t\t\t\t\t$.each( aSort, function (i, val) {\n\t\t\t\t\t\t\tsortedColumns[ val.src ] = val.dir;\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t_fnCallbackFire( oSettings, null, 'order', [oSettings, aSort, sortedColumns] );\n\t\t\t\t\t\t_fnSortingClasses( oSettings );\n\t\t\t\t\t\t_fnSortAria( oSettings );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\n\n\t\t\t/*\n\t\t\t * Final init\n\t\t\t * Cache the header, body and footer as required, creating them if needed\n\t\t\t */\n\n\t\t\t/* Browser support detection */\n\t\t\t_fnBrowserDetect( oSettings );\n\n\t\t\t// Work around for Webkit bug 83867 - store the caption-side before removing from doc\n\t\t\tvar captions = $(this).children('caption').each( function () {\n\t\t\t\tthis._captionSide = $(this).css('caption-side');\n\t\t\t} );\n\n\t\t\tvar thead = $(this).children('thead');\n\t\t\tif ( thead.length === 0 )\n\t\t\t{\n\t\t\t\tthead = $('<thead/>').appendTo(this);\n\t\t\t}\n\t\t\toSettings.nTHead = thead[0];\n\n\t\t\tvar tbody = $(this).children('tbody');\n\t\t\tif ( tbody.length === 0 )\n\t\t\t{\n\t\t\t\ttbody = $('<tbody/>').appendTo(this);\n\t\t\t}\n\t\t\toSettings.nTBody = tbody[0];\n\n\t\t\tvar tfoot = $(this).children('tfoot');\n\t\t\tif ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== \"\" || oSettings.oScroll.sY !== \"\") )\n\t\t\t{\n\t\t\t\t// If we are a scrolling table, and no footer has been given, then we need to create\n\t\t\t\t// a tfoot element for the caption element to be appended to\n\t\t\t\ttfoot = $('<tfoot/>').appendTo(this);\n\t\t\t}\n\n\t\t\tif ( tfoot.length === 0 || tfoot.children().length === 0 ) {\n\t\t\t\t$(this).addClass( oSettings.oClasses.sNoFooter );\n\t\t\t}\n\t\t\telse if ( tfoot.length > 0 ) {\n\t\t\t\toSettings.nTFoot = tfoot[0];\n\t\t\t\t_fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot );\n\t\t\t}\n\n\t\t\t/* Check if there is data passing into the constructor */\n\t\t\tif ( oInit.aaData )\n\t\t\t{\n\t\t\t\tfor ( i=0 ; i<oInit.aaData.length ; i++ )\n\t\t\t\t{\n\t\t\t\t\t_fnAddData( oSettings, oInit.aaData[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( oSettings.bDeferLoading || _fnDataSource( oSettings ) == 'dom' )\n\t\t\t{\n\t\t\t\t/* Grab the data from the page - only do this when deferred loading or no Ajax\n\t\t\t\t * source since there is no point in reading the DOM data if we are then going\n\t\t\t\t * to replace it with Ajax data\n\t\t\t\t */\n\t\t\t\t_fnAddTr( oSettings, $(oSettings.nTBody).children('tr') );\n\t\t\t}\n\n\t\t\t/* Copy the data index array */\n\t\t\toSettings.aiDisplay = oSettings.aiDisplayMaster.slice();\n\n\t\t\t/* Initialisation complete - table can be drawn */\n\t\t\toSettings.bInitialised = true;\n\n\t\t\t/* Check if we need to initialise the table (it might not have been handed off to the\n\t\t\t * language processor)\n\t\t\t */\n\t\t\tif ( bInitHandedOff === false )\n\t\t\t{\n\t\t\t\t_fnInitialise( oSettings );\n\t\t\t}\n\t\t} );\n\t\t_that = null;\n\t\treturn this;\n\t};\n\n\n\n\t/**\n\t * Computed structure of the DataTables API, defined by the options passed to\n\t * `DataTable.Api.register()` when building the API.\n\t *\n\t * The structure is built in order to speed creation and extension of the Api\n\t * objects since the extensions are effectively pre-parsed.\n\t *\n\t * The array is an array of objects with the following structure, where this\n\t * base array represents the Api prototype base:\n\t *\n\t *     [\n\t *       {\n\t *         name:      'data'                -- string   - Property name\n\t *         val:       function () {},       -- function - Api method (or undefined if just an object\n\t *         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result\n\t *         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property\n\t *       },\n\t *       {\n\t *         name:     'row'\n\t *         val:       {},\n\t *         methodExt: [ ... ],\n\t *         propExt:   [\n\t *           {\n\t *             name:      'data'\n\t *             val:       function () {},\n\t *             methodExt: [ ... ],\n\t *             propExt:   [ ... ]\n\t *           },\n\t *           ...\n\t *         ]\n\t *       }\n\t *     ]\n\t *\n\t * @type {Array}\n\t * @ignore\n\t */\n\tvar __apiStruct = [];\n\n\n\t/**\n\t * `Array.prototype` reference.\n\t *\n\t * @type object\n\t * @ignore\n\t */\n\tvar __arrayProto = Array.prototype;\n\n\n\n\n\t/**\n\t * Abstraction for `context` parameter of the `Api` constructor to allow it to\n\t * take several different forms for ease of use.\n\t *\n\t * Each of the input parameter types will be converted to a DataTables settings\n\t * object where possible.\n\t *\n\t * @param  {string|node|jQuery|object} mixed DataTable identifier. Can be one\n\t *   of:\n\t *\n\t *   * `string` - jQuery selector. Any DataTables' matching the given selector\n\t *     with be found and used.\n\t *   * `node` - `TABLE` node which has already been formed into a DataTable.\n\t *   * `jQuery` - A jQuery object of `TABLE` nodes.\n\t *   * `object` - DataTables settings object\n\t * @return {array|null} Matching DataTables settings objects. `null` or\n\t *   `undefined` is returned if no matching DataTable is found.\n\t * @ignore\n\t */\n\tvar _toSettings = function ( mixed )\n\t{\n\t\tvar idx, jq;\n\t\tvar settings = DataTable.settings;\n\t\tvar tables = $.map( settings, function (el, i) {\n\t\t\treturn el.nTable;\n\t\t} );\n\n\t\tif ( mixed.nTable && mixed.oApi ) {\n\t\t\t// DataTables settings object\n\t\t\treturn [ mixed ];\n\t\t}\n\t\telse if ( mixed.nodeName && mixed.nodeName.toLowerCase() === 'table' ) {\n\t\t\t// Table node\n\t\t\tidx = $.inArray( mixed, tables );\n\t\t\treturn idx !== -1 ? [ settings[idx] ] : null;\n\t\t}\n\t\telse if ( typeof mixed === 'string' ) {\n\t\t\t// jQuery selector\n\t\t\tjq = $(mixed);\n\t\t}\n\t\telse if ( mixed instanceof $ ) {\n\t\t\t// jQuery object (also DataTables instance)\n\t\t\tjq = mixed;\n\t\t}\n\n\t\tif ( jq ) {\n\t\t\treturn jq.map( function(i) {\n\t\t\t\tidx = $.inArray( this, tables );\n\t\t\t\treturn idx !== -1 ? settings[idx] : null;\n\t\t\t} );\n\t\t}\n\t};\n\n\n\t/**\n\t * DataTables API class - used to control and interface with  one or more\n\t * DataTables enhanced tables.\n\t *\n\t * The API class is heavily based on jQuery, presenting a chainable interface\n\t * that you can use to interact with tables. Each instance of the API class has\n\t * a \"context\" - i.e. the tables that it will operate on. This could be a single\n\t * table, all tables on a page or a sub-set thereof.\n\t *\n\t * Additionally the API is designed to allow you to easily work with the data in\n\t * the tables, retrieving and manipulating it as required. This is done by\n\t * presenting the API class as an array like interface. The contents of the\n\t * array depend upon the actions requested by each method (for example\n\t * `rows().nodes()` will return an array of nodes, while `rows().data()` will\n\t * return an array of objects or arrays depending upon your table's\n\t * configuration). The API object has a number of array like methods (`push`,\n\t * `pop`, `reverse` etc) as well as additional helper methods (`each`, `pluck`,\n\t * `unique` etc) to assist your working with the data held in a table.\n\t *\n\t * Most methods (those which return an Api instance) are chainable, which means\n\t * the return from a method call also has all of the methods available that the\n\t * top level object had. For example, these two calls are equivalent:\n\t *\n\t *     // Not chained\n\t *     api.row.add( {...} );\n\t *     api.draw();\n\t *\n\t *     // Chained\n\t *     api.row.add( {...} ).draw();\n\t *\n\t * @class DataTable.Api\n\t * @param {array|object|string|jQuery} context DataTable identifier. This is\n\t *   used to define which DataTables enhanced tables this API will operate on.\n\t *   Can be one of:\n\t *\n\t *   * `string` - jQuery selector. Any DataTables' matching the given selector\n\t *     with be found and used.\n\t *   * `node` - `TABLE` node which has already been formed into a DataTable.\n\t *   * `jQuery` - A jQuery object of `TABLE` nodes.\n\t *   * `object` - DataTables settings object\n\t * @param {array} [data] Data to initialise the Api instance with.\n\t *\n\t * @example\n\t *   // Direct initialisation during DataTables construction\n\t *   var api = $('#example').DataTable();\n\t *\n\t * @example\n\t *   // Initialisation using a DataTables jQuery object\n\t *   var api = $('#example').dataTable().api();\n\t *\n\t * @example\n\t *   // Initialisation as a constructor\n\t *   var api = new $.fn.DataTable.Api( 'table.dataTable' );\n\t */\n\tDataTable.Api = _Api = function ( context, data )\n\t{\n\t\tif ( ! this instanceof _Api ) {\n\t\t\tthrow 'DT API must be constructed as a new object';\n\t\t\t// or should it do the 'new' for the caller?\n\t\t\t// return new _Api.apply( this, arguments );\n\t\t}\n\n\t\tvar settings = [];\n\t\tvar ctxSettings = function ( o ) {\n\t\t\tvar a = _toSettings( o );\n\t\t\tif ( a ) {\n\t\t\t\tsettings.push.apply( settings, a );\n\t\t\t}\n\t\t};\n\n\t\tif ( $.isArray( context ) ) {\n\t\t\tfor ( var i=0, ien=context.length ; i<ien ; i++ ) {\n\t\t\t\tctxSettings( context[i] );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctxSettings( context );\n\t\t}\n\n\t\t// Remove duplicates\n\t\tthis.context = _unique( settings );\n\n\t\t// Initial data\n\t\tif ( data ) {\n\t\t\tthis.push.apply( this, data );\n\t\t}\n\n\t\t// selector\n\t\tthis.selector = {\n\t\t\trows: null,\n\t\t\tcols: null,\n\t\t\topts: null\n\t\t};\n\n\t\t_Api.extend( this, this, __apiStruct );\n\t};\n\n\n\t_Api.prototype = /** @lends DataTables.Api */{\n\t\t/**\n\t\t * Return a new Api instance, comprised of the data held in the current\n\t\t * instance, join with the other array(s) and/or value(s).\n\t\t *\n\t\t * An alias for `Array.prototype.concat`.\n\t\t *\n\t\t * @type method\n\t\t * @param {*} value1 Arrays and/or values to concatenate.\n\t\t * @param {*} [...] Additional arrays and/or values to concatenate.\n\t\t * @returns {DataTables.Api} New API instance, comprising of the combined\n\t\t *   array.\n\t\t */\n\t\tconcat:  __arrayProto.concat,\n\n\n\t\tcontext: [], // array of table settings objects\n\n\n\t\teach: function ( fn )\n\t\t{\n\t\t\tif ( __arrayProto.forEach ) {\n\t\t\t\t// Where possible, use the built-in forEach\n\t\t\t\t__arrayProto.forEach.call( this, fn, this );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Compatibility for browsers without EMCA-252-5 (JS 1.6)\n\t\t\t\tfor ( var i=0, ien=this.length ; i<ien; i++ ) {\n\t\t\t\t\t// In strict mode the execution scope is the passed value\n\t\t\t\t\tfn.call( this, this[i], i, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this;\n\t\t},\n\n\n\t\tfilter: function ( fn )\n\t\t{\n\t\t\tvar a = [];\n\n\t\t\tif ( __arrayProto.filter ) {\n\t\t\t\ta = __arrayProto.filter.call( this, fn, this );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Compatibility for browsers without EMCA-252-5 (JS 1.6)\n\t\t\t\tfor ( var i=0, ien=this.length ; i<ien ; i++ ) {\n\t\t\t\t\tif ( fn.call( this, this[i], i, this ) ) {\n\t\t\t\t\t\ta.push( this[i] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn new _Api( this.context, a );\n\t\t},\n\n\n\t\tflatten: function ()\n\t\t{\n\t\t\tvar a = [];\n\t\t\treturn new _Api( this.context, a.concat.apply( a, this ) );\n\t\t},\n\n\n\t\tjoin:    __arrayProto.join,\n\n\n\t\tindexOf: __arrayProto.indexOf || function (obj, start)\n\t\t{\n\t\t\tfor ( var i=(start || 0), ien=this.length ; i<ien ; i++ ) {\n\t\t\t\tif ( this[i] === obj ) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn -1;\n\t\t},\n\n\t\t// Internal only at the moment - relax?\n\t\titerator: function ( flatten, type, fn ) {\n\t\t\tvar\n\t\t\t\ta = [], ret,\n\t\t\t\ti, ien, j, jen,\n\t\t\t\tcontext = this.context,\n\t\t\t\trows, items, item,\n\t\t\t\tselector = this.selector;\n\n\t\t\t// Argument shifting\n\t\t\tif ( typeof flatten === 'string' ) {\n\t\t\t\tfn = type;\n\t\t\t\ttype = flatten;\n\t\t\t\tflatten = false;\n\t\t\t}\n\n\t\t\tfor ( i=0, ien=context.length ; i<ien ; i++ ) {\n\t\t\t\tif ( type === 'table' ) {\n\t\t\t\t\tret = fn( context[i], i );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\ta.push( ret );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ( type === 'columns' || type === 'rows' ) {\n\t\t\t\t\t// this has same length as context - one entry for each table\n\t\t\t\t\tret = fn( context[i], this[i], i );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\ta.push( ret );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ( type === 'column' || type === 'column-rows' || type === 'row' || type === 'cell' ) {\n\t\t\t\t\t// columns and rows share the same structure.\n\t\t\t\t\t// 'this' is an array of column indexes for each context\n\t\t\t\t\titems = this[i];\n\n\t\t\t\t\tif ( type === 'column-rows' ) {\n\t\t\t\t\t\trows = _selector_row_indexes( context[i], selector.opts );\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( j=0, jen=items.length ; j<jen ; j++ ) {\n\t\t\t\t\t\titem = items[j];\n\n\t\t\t\t\t\tif ( type === 'cell' ) {\n\t\t\t\t\t\t\tret = fn( context[i], item.row, item.column, i, j );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tret = fn( context[i], item, i, j, rows );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\t\ta.push( ret );\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 ( a.length ) {\n\t\t\t\tvar api = new _Api( context, flatten ? a.concat.apply( [], a ) : a );\n\t\t\t\tvar apiSelector = api.selector;\n\t\t\t\tapiSelector.rows = selector.rows;\n\t\t\t\tapiSelector.cols = selector.cols;\n\t\t\t\tapiSelector.opts = selector.opts;\n\t\t\t\treturn api;\n\t\t\t}\n\t\t\treturn this;\n\t\t},\n\n\n\t\tlastIndexOf: __arrayProto.lastIndexOf || function (obj, start)\n\t\t{\n\t\t\t// Bit cheeky...\n\t\t\treturn this.indexOf.apply( this.toArray.reverse(), arguments );\n\t\t},\n\n\n\t\tlength:  0,\n\n\n\t\tmap: function ( fn )\n\t\t{\n\t\t\tvar a = [];\n\n\t\t\tif ( __arrayProto.map ) {\n\t\t\t\ta = __arrayProto.map.call( this, fn, this );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Compatibility for browsers without EMCA-252-5 (JS 1.6)\n\t\t\t\tfor ( var i=0, ien=this.length ; i<ien ; i++ ) {\n\t\t\t\t\ta.push( fn.call( this, this[i], i ) );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn new _Api( this.context, a );\n\t\t},\n\n\n\t\tpluck: function ( prop )\n\t\t{\n\t\t\treturn this.map( function ( el ) {\n\t\t\t\treturn el[ prop ];\n\t\t\t} );\n\t\t},\n\n\t\tpop:     __arrayProto.pop,\n\n\n\t\tpush:    __arrayProto.push,\n\n\n\t\t// Does not return an API instance\n\t\treduce: __arrayProto.reduce || function ( fn, init )\n\t\t{\n\t\t\tvar\n\t\t\t\tvalue,\n\t\t\t\tisSet = false;\n\n\t\t\tif ( arguments.length > 1 ) {\n\t\t\t\tvalue = init;\n\t\t\t\tisSet = true;\n\t\t\t}\n\n\t\t\tfor ( var i=0, ien=this.length ; i<ien ; i++ ) {\n\t\t\t\tif ( ! this.hasOwnProperty(i) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tvalue = isSet ?\n\t\t\t\t\tfn( value, this[i], i, this ) :\n\t\t\t\t\tthis[i];\n\n\t\t\t\tisSet = true;\n\t\t\t}\n\n\t\t\treturn value;\n\t\t},\n\n\n\t\treduceRight: __arrayProto.reduceRight || function ( fn, init )\n\t\t{\n\t\t\tvar\n\t\t\t\tvalue,\n\t\t\t\tisSet = false;\n\n\t\t\tif ( arguments.length > 1 ) {\n\t\t\t\tvalue = init;\n\t\t\t\tisSet = true;\n\t\t\t}\n\n\t\t\tfor ( var i=this.length-1 ; i>=0 ; i-- ) {\n\t\t\t\tif ( ! this.hasOwnProperty(i) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tvalue = isSet ?\n\t\t\t\t\tfn( value, this[i], i, this ) :\n\t\t\t\t\tthis[i];\n\n\t\t\t\tisSet = true;\n\t\t\t}\n\n\t\t\treturn value;\n\t\t},\n\n\t\treverse: __arrayProto.reverse,\n\n\n\t\t// Object with rows, columns and opts\n\t\tselector: null,\n\n\n\t\tshift:   __arrayProto.shift,\n\n\n\t\tsort:    __arrayProto.sort, // ? name - order?\n\n\n\t\tsplice:  __arrayProto.splice,\n\n\n\t\ttoArray: function ()\n\t\t{\n\t\t\treturn __arrayProto.slice.call( this );\n\t\t},\n\n\n\t\tto$: function ()\n\t\t{\n\t\t\treturn $( this );\n\t\t},\n\n\n\t\ttoJQuery: function ()\n\t\t{\n\t\t\treturn $( this );\n\t\t},\n\n\n\t\tunique: function ()\n\t\t{\n\t\t\treturn new _Api( this.context, _unique(this) );\n\t\t},\n\n\n\t\tunshift: __arrayProto.unshift\n\t};\n\n\n\n\n\t_Api.extend = function ( scope, obj, ext )\n\t{\n\t\t// Only extend API instances and static properties of the API\n\t\tif ( ! obj || ( ! (obj instanceof _Api) && ! obj.__dt_wrapper ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar\n\t\t\ti, ien,\n\t\t\tj, jen,\n\t\t\tstruct, inner,\n\t\t\tmethodScoping = function ( fn, struc ) {\n\t\t\t\treturn function () {\n\t\t\t\t\tvar ret = fn.apply( scope, arguments );\n\n\t\t\t\t\t// Method extension\n\t\t\t\t\t_Api.extend( ret, ret, struc.methodExt );\n\t\t\t\t\treturn ret;\n\t\t\t\t};\n\t\t\t};\n\n\t\tfor ( i=0, ien=ext.length ; i<ien ; i++ ) {\n\t\t\tstruct = ext[i];\n\n\t\t\t// Value\n\t\t\tobj[ struct.name ] = typeof struct.val === 'function' ?\n\t\t\t\tmethodScoping( struct.val, struct ) :\n\t\t\t\tstruct.val;\n\n\t\t\tobj[ struct.name ].__dt_wrapper = true;\n\n\t\t\t// Property extension\n\t\t\t_Api.extend( scope, obj[ struct.name ], struct.propExt );\n\t\t}\n\t};\n\n\n\t// @todo - Is there need for an augment function?\n\t// _Api.augment = function ( inst, name )\n\t// {\n\t// \t// Find src object in the structure from the name\n\t// \tvar parts = name.split('.');\n\n\t// \t_Api.extend( inst, obj );\n\t// };\n\n\n\t//     [\n\t//       {\n\t//         name:      'data'                -- string   - Property name\n\t//         val:       function () {},       -- function - Api method (or undefined if just an object\n\t//         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result\n\t//         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property\n\t//       },\n\t//       {\n\t//         name:     'row'\n\t//         val:       {},\n\t//         methodExt: [ ... ],\n\t//         propExt:   [\n\t//           {\n\t//             name:      'data'\n\t//             val:       function () {},\n\t//             methodExt: [ ... ],\n\t//             propExt:   [ ... ]\n\t//           },\n\t//           ...\n\t//         ]\n\t//       }\n\t//     ]\n\n\t_Api.register = _api_register = function ( name, val )\n\t{\n\t\tif ( $.isArray( name ) ) {\n\t\t\tfor ( var j=0, jen=name.length ; j<jen ; j++ ) {\n\t\t\t\t_Api.register( name[j], val );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tvar\n\t\t\ti, ien,\n\t\t\their = name.split('.'),\n\t\t\tstruct = __apiStruct,\n\t\t\tkey, method;\n\n\t\tvar find = function ( src, name ) {\n\t\t\tfor ( var i=0, ien=src.length ; i<ien ; i++ ) {\n\t\t\t\tif ( src[i].name === name ) {\n\t\t\t\t\treturn src[i];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t};\n\n\t\tfor ( i=0, ien=heir.length ; i<ien ; i++ ) {\n\t\t\tmethod = heir[i].indexOf('()') !== -1;\n\t\t\tkey = method ?\n\t\t\t\their[i].replace('()', '') :\n\t\t\t\their[i];\n\n\t\t\tvar src = find( struct, key );\n\t\t\tif ( ! src ) {\n\t\t\t\tsrc = {\n\t\t\t\t\tname:      key,\n\t\t\t\t\tval:       {},\n\t\t\t\t\tmethodExt: [],\n\t\t\t\t\tpropExt:   []\n\t\t\t\t};\n\t\t\t\tstruct.push( src );\n\t\t\t}\n\n\t\t\tif ( i === ien-1 ) {\n\t\t\t\tsrc.val = val;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tstruct = method ?\n\t\t\t\t\tsrc.methodExt :\n\t\t\t\t\tsrc.propExt;\n\t\t\t}\n\t\t}\n\n\t\t// Rebuild the API with the new construct\n\t\tif ( _Api.ready ) {\n\t\t\tDataTable.api.build();\n\t\t}\n\t};\n\n\n\t_Api.registerPlural = _api_registerPlural = function ( pluralName, singularName, val ) {\n\t\t_Api.register( pluralName, val );\n\n\t\t_Api.register( singularName, function () {\n\t\t\tvar ret = val.apply( this, arguments );\n\n\t\t\tif ( ret === this ) {\n\t\t\t\t// Returned item is the API instance that was passed in, return it\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\telse if ( ret instanceof _Api ) {\n\t\t\t\t// New API instance returned, want the value from the first item\n\t\t\t\t// in the returned array for the singular result.\n\t\t\t\treturn ret.length ?\n\t\t\t\t\t$.isArray( ret[0] ) ?\n\t\t\t\t\t\tnew _Api( ret.context, ret[0] ) : // Array results are 'enhanced'\n\t\t\t\t\t\tret[0] :\n\t\t\t\t\tundefined;\n\t\t\t}\n\n\t\t\t// Non-API return - just fire it back\n\t\t\treturn ret;\n\t\t} );\n\t};\n\n\n\t/**\n\t * Selector for HTML tables. Apply the given selector to the give array of\n\t * DataTables settings objects.\n\t *\n\t * @param {string|integer} [selector] jQuery selector string or integer\n\t * @param  {array} Array of DataTables settings objects to be filtered\n\t * @return {array}\n\t * @ignore\n\t */\n\tvar __table_selector = function ( selector, a )\n\t{\n\t\t// Integer is used to pick out a table by index\n\t\tif ( typeof selector === 'number' ) {\n\t\t\treturn [ a[ selector ] ];\n\t\t}\n\n\t\t// Perform a jQuery selector on the table nodes\n\t\tvar nodes = $.map( a, function (el, i) {\n\t\t\treturn el.nTable;\n\t\t} );\n\n\t\treturn $(nodes)\n\t\t\t.filter( selector )\n\t\t\t.map( function (i) {\n\t\t\t\t// Need to translate back from the table node to the settings\n\t\t\t\tvar idx = $.inArray( this, nodes );\n\t\t\t\treturn a[ idx ];\n\t\t\t} )\n\t\t\t.toArray();\n\t};\n\n\n\n\t/**\n\t * Context selector for the API's context (i.e. the tables the API instance\n\t * refers to.\n\t *\n\t * @name    DataTable.Api#tables\n\t * @param {string|integer} [selector] Selector to pick which tables the iterator\n\t *   should operate on. If not given, all tables in the current context are\n\t *   used. This can be given as a jQuery selector (for example `':gt(0)'`) to\n\t *   select multiple tables or as an integer to select a single table.\n\t * @returns {DataTable.Api} Returns a new API instance if a selector is given.\n\t */\n\t_api_register( 'tables()', function ( selector ) {\n\t\t// A new instance is created if there was a selector specified\n\t\treturn selector ?\n\t\t\tnew _Api( __table_selector( selector, this.context ) ) :\n\t\t\tthis;\n\t} );\n\n\n\t_api_register( 'table()', function ( selector ) {\n\t\tvar tables = this.tables( selector );\n\t\tvar ctx = tables.context;\n\n\t\t// Truncate to the first matched table\n\t\tif ( ctx.length ) {\n\t\t\tctx.length = 1;\n\t\t}\n\n\t\treturn tables;\n\t} );\n\n\n\t_api_registerPlural( 'tables().nodes()', 'table().node()' , function () {\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\treturn ctx.nTable;\n\t\t} );\n\t} );\n\n\n\t_api_registerPlural( 'tables().body()', 'table().body()' , function () {\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\treturn ctx.nTBody;\n\t\t} );\n\t} );\n\n\n\t_api_registerPlural( 'tables().header()', 'table().header()' , function () {\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\treturn ctx.nTHead;\n\t\t} );\n\t} );\n\n\n\t_api_registerPlural( 'tables().footer()', 'table().footer()' , function () {\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\treturn ctx.nTFoot;\n\t\t} );\n\t} );\n\n\n\n\t/**\n\t * Redraw the tables in the current context.\n\t *\n\t * @param {boolean} [reset=true] Reset (default) or hold the current paging\n\t *   position. A full re-sort and re-filter is performed when this method is\n\t *   called, which is why the pagination reset is the default action.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'draw()', function ( resetPaging ) {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnReDraw( settings, resetPaging===false );\n\t\t} );\n\t} );\n\n\n\n\t/**\n\t * Get the current page index.\n\t *\n\t * @return {integer} Current page index (zero based)\n\t *//**\n\t * Set the current page.\n\t *\n\t * Note that if you attempt to show a page which does not exist, DataTables will\n\t * not throw an error, but rather reset the paging.\n\t *\n\t * @param {integer|string} action The paging action to take. This can be one of:\n\t *  * `integer` - The page index to jump to\n\t *  * `string` - An action to take:\n\t *    * `first` - Jump to first page.\n\t *    * `next` - Jump to the next page\n\t *    * `previous` - Jump to previous page\n\t *    * `last` - Jump to the last page.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'page()', function ( action ) {\n\t\tif ( action === undefined ) {\n\t\t\treturn this.page.info().page; // not an expensive call\n\t\t}\n\n\t\t// else, have an action to take on all tables\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnPageChange( settings, action );\n\t\t} );\n\t} );\n\n\n\t/**\n\t * Paging information for the first table in the current context.\n\t *\n\t * If you require paging information for another table, use the `table()` method\n\t * with a suitable selector.\n\t *\n\t * @return {object} Object with the following properties set:\n\t *  * `page` - Current page index (zero based - i.e. the first page is `0`)\n\t *  * `pages` - Total number of pages\n\t *  * `start` - Display index for the first record shown on the current page\n\t *  * `end` - Display index for the last record shown on the current page\n\t *  * `length` - Display length (number of records). Note that generally `start\n\t *    + length = end`, but this is not always true, for example if there are\n\t *    only 2 records to show on the final page, with a length of 10.\n\t *  * `recordsTotal` - Full data set length\n\t *  * `recordsDisplay` - Data set length once the current filtering criterion\n\t *    are applied.\n\t */\n\t_api_register( 'page.info()', function ( action ) {\n\t\tif ( this.context.length === 0 ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tvar\n\t\t\tsettings   = this.context[0],\n\t\t\tstart      = settings._iDisplayStart,\n\t\t\tlen        = settings._iDisplayLength,\n\t\t\tvisRecords = settings.fnRecordsDisplay(),\n\t\t\tall        = len === -1;\n\n\t\treturn {\n\t\t\t\"page\":           all ? 0 : Math.floor( start / len ),\n\t\t\t\"pages\":          all ? 1 : Math.ceil( visRecords / len ),\n\t\t\t\"start\":          start,\n\t\t\t\"end\":            settings.fnDisplayEnd(),\n\t\t\t\"length\":         len,\n\t\t\t\"recordsTotal\":   settings.fnRecordsTotal(),\n\t\t\t\"recordsDisplay\": visRecords\n\t\t};\n\t} );\n\n\n\t/**\n\t * Get the current page length.\n\t *\n\t * @return {integer} Current page length. Note `-1` indicates that all records\n\t *   are to be shown.\n\t *//**\n\t * Set the current page length.\n\t *\n\t * @param {integer} Page length to set. Use `-1` to show all records.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'page.len()', function ( len ) {\n\t\t// Note that we can't call this function 'length()' because `length`\n\t\t// is a Javascript property of functions which defines how many arguments\n\t\t// the function expects.\n\t\tif ( len === undefined ) {\n\t\t\treturn this.context.length !== 0 ?\n\t\t\t\tthis.context[0]._iDisplayLength :\n\t\t\t\tundefined;\n\t\t}\n\n\t\t// else, set the page length\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnLengthChange( settings, len );\n\t\t} );\n\t} );\n\n\n\n\tvar __reload = function ( settings, holdPosition, callback ) {\n\t\tif ( _fnDataSource( settings ) == 'ssp' ) {\n\t\t\t_fnReDraw( settings, holdPosition );\n\t\t}\n\t\telse {\n\t\t\t// Trigger xhr\n\t\t\t_fnBuildAjax( settings, [], function( json ) {\n\t\t\t\t// xxx can this be reduced?\n\t\t\t\t_fnClearTable( settings );\n\n\t\t\t\tvar data = _fnAjaxDataSrc( settings, json );\n\t\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\t\t_fnAddData( settings, data[i] );\n\t\t\t\t}\n\n\t\t\t\t_fnReDraw( settings, holdPosition );\n\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback( json );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t};\n\n\n\t/**\n\t * Get the JSON response from the last Ajax request that DataTables made to the\n\t * server. Note that this returns the JSON from the first table in the current\n\t * context.\n\t *\n\t * @return {object} JSON received from the server.\n\t */\n\t_api_register( 'ajax.json()', function () {\n\t\tvar ctx = this.context;\n\n\t\tif ( ctx.length > 0 ) {\n\t\t\treturn ctx[0].json;\n\t\t}\n\n\t\t// else return undefined;\n\t} );\n\n\n\t/**\n\t * Reload tables from the Ajax data source. Note that this function will\n\t * automatically re-draw the table when the remote data has been loaded.\n\t *\n\t * @param {boolean} [reset=true] Reset (default) or hold the current paging\n\t *   position. A full re-sort and re-filter is performed when this method is\n\t *   called, which is why the pagination reset is the default action.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'ajax.reload()', function ( callback, resetPaging ) {\n\t\treturn this.iterator( 'table', function (settings) {\n\t\t\t__reload( settings, resetPaging===false, callback );\n\t\t} );\n\t} );\n\n\n\t/**\n\t * Get the current Ajax URL. Note that this returns the URL from the first\n\t * table in the current context.\n\t *\n\t * @return {string} Current Ajax source URL\n\t *//**\n\t * Set the Ajax URL. Note that this will set the URL for all tables in the\n\t * current context.\n\t *\n\t * @param {string} url URL to set.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'ajax.url()', function ( url ) {\n\t\tvar ctx = this.context;\n\n\t\tif ( url === undefined ) {\n\t\t\t// get\n\t\t\tif ( ctx.length === 0 ) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tctx = ctx[0];\n\n\t\t\treturn ctx.ajax ?\n\t\t\t\t$.isPlainObject( ctx.ajax ) ?\n\t\t\t\t\tctx.ajax.url :\n\t\t\t\t\tctx.ajax :\n\t\t\t\tctx.sAjaxSource;\n\t\t}\n\n\t\t// set\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tif ( $.isPlainObject( settings.ajax ) ) {\n\t\t\t\tsettings.ajax.url = url;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsettings.ajax = url;\n\t\t\t}\n\t\t\t// No need to consider sAjaxSource here since DataTables gives priority\n\t\t\t// to `ajax` over `sAjaxSource`. So setting `ajax` here, renders any\n\t\t\t// value of `sAjaxSource` redundant.\n\t\t} );\n\t} );\n\n\n\t/**\n\t * Load data from the newly set Ajax URL. Note that this method is only\n\t * available when `ajax.url()` is used to set a URL. Additionally, this method\n\t * has the same effect as calling `ajax.reload()` but is provided for\n\t * convenience when setting a new URL. Like `ajax.reload()` it will\n\t * automatically redraw the table once the remote data has been loaded.\n\t *\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'ajax.url().load()', function ( callback, resetPaging ) {\n\t\t// Same as a reload, but makes sense to present it for easy access after a\n\t\t// url change\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\t__reload( ctx, resetPaging===false, callback );\n\t\t} );\n\t} );\n\n\n\n\n\tvar _selector_run = function ( selector, select )\n\t{\n\t\tvar\n\t\t\tout = [], res,\n\t\t\ta, i, ien, j, jen;\n\n\t\tif ( ! $.isArray( selector ) ) {\n\t\t\tselector = [ selector ];\n\t\t}\n\n\t\tfor ( i=0, ien=selector.length ; i<ien ; i++ ) {\n\t\t\ta = selector[i] && selector[i].split ?\n\t\t\t\tselector[i].split(',') :\n\t\t\t\t[ selector[i] ];\n\n\t\t\tfor ( j=0, jen=a.length ; j<jen ; j++ ) {\n\t\t\t\tres = select( typeof a[j] === 'string' ? $.trim(a[j]) : a[j] );\n\n\t\t\t\tif ( res && res.length ) {\n\t\t\t\t\tout.push.apply( out, res );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn out;\n\t};\n\n\n\tvar _selector_opts = function ( opts )\n\t{\n\t\tif ( ! opts ) {\n\t\t\topts = {};\n\t\t}\n\n\t\t// Backwards compatibility for 1.9- which used the terminology filter rather\n\t\t// than search\n\t\tif ( opts.filter && ! opts.search ) {\n\t\t\topts.search = opts.filter;\n\t\t}\n\n\t\treturn {\n\t\t\tsearch: opts.search || 'none',\n\t\t\torder:  opts.order  || 'current',\n\t\t\tpage:   opts.page   || 'all'\n\t\t};\n\t};\n\n\n\tvar _selector_first = function ( inst )\n\t{\n\t\t// Reduce the API instance to the first item found\n\t\tfor ( var i=0, ien=inst.length ; i<ien ; i++ ) {\n\t\t\tif ( inst[i].length > 0 ) {\n\t\t\t\t// Assign the first element to the first item in the instance\n\t\t\t\t// and truncate the instance and context\n\t\t\t\tinst[0] = inst[i];\n\t\t\t\tinst.length = 1;\n\t\t\t\tinst.context = [ inst.context[i] ];\n\n\t\t\t\treturn inst;\n\t\t\t}\n\t\t}\n\n\t\t// Not found - return an empty instance\n\t\tinst.length = 0;\n\t\treturn inst;\n\t};\n\n\n\tvar _selector_row_indexes = function ( settings, opts )\n\t{\n\t\tvar\n\t\t\ti, ien, tmp, a=[],\n\t\t\tdisplayFiltered = settings.aiDisplay,\n\t\t\tdisplayMaster = settings.aiDisplayMaster;\n\n\t\tvar\n\t\t\tsearch = opts.search,  // none, applied, removed\n\t\t\torder  = opts.order,   // applied, current, index (original - compatibility with 1.9)\n\t\t\tpage   = opts.page;    // all, current\n\n\t\t// Current page implies that order=current and fitler=applied, since it is\n\t\t// fairly senseless otherwise, regardless of what order and search actually\n\t\t// are\n\t\tif ( page == 'current' )\n\t\t{\n\t\t\tfor ( i=settings._iDisplayStart, ien=settings.fnDisplayEnd() ; i<ien ; i++ ) {\n\t\t\t\ta.push( displayFiltered[i] );\n\t\t\t}\n\t\t}\n\t\telse if ( order == 'current' || order == 'applied' ) {\n\t\t\ta = search == 'none' ?\n\t\t\t\tdisplayMaster.slice() :                      // no search\n\t\t\t\tsearch == 'applied' ?\n\t\t\t\t\tdisplayFiltered.slice() :                // applied search\n\t\t\t\t\t$.map( displayMaster, function (el, i) { // removed search\n\t\t\t\t\t\treturn $.inArray( el, displayFiltered ) === -1 ? el : null;\n\t\t\t\t\t} );\n\t\t}\n\t\telse if ( order == 'index' || order == 'original' ) {\n\t\t\tfor ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\t\tif ( search == 'none' ) {\n\t\t\t\t\ta.push( i );\n\t\t\t\t}\n\t\t\t\telse { // applied | removed\n\t\t\t\t\ttmp = $.inArray( i, displayFiltered );\n\n\t\t\t\t\tif ((tmp === -1 && search == 'removed') ||\n\t\t\t\t\t\t(tmp === 1  && search == 'applied') )\n\t\t\t\t\t{\n\t\t\t\t\t\ta.push( i );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn a;\n\t};\n\n\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Rows\n\t *\n\t * {}          - no selector - use all available rows\n\t * {integer}   - row aoData index\n\t * {node}      - TR node\n\t * {string}    - jQuery selector to apply to the TR elements\n\t * {array}     - jQuery array of nodes, or simply an array of TR nodes\n\t *\n\t */\n\n\n\tvar __row_selector = function ( settings, selector, opts )\n\t{\n\t\treturn _selector_run( selector, function ( sel ) {\n\t\t\tvar selInt = _intVal( sel );\n\n\t\t\t// Short cut - selector is a number and no options provided (default is\n\t\t\t// all records, so no need to check if the index is in there, since it\n\t\t\t// must be - dev error if the index doesn't exist).\n\t\t\tif ( selInt !== null && ! opts ) {\n\t\t\t\treturn [ selInt ];\n\t\t\t}\n\n\t\t\tvar rows = _selector_row_indexes( settings, opts );\n\n\t\t\tif ( selInt !== null && $.inArray( selInt, rows ) !== -1 ) {\n\t\t\t\t// Selector - integer\n\t\t\t\treturn [ selInt ];\n\t\t\t}\n\t\t\telse if ( ! sel ) {\n\t\t\t\t// Selector - none\n\t\t\t\treturn rows;\n\t\t\t}\n\n\t\t\t// Get nodes in the order from the `rows` array (can't use `pluck`) @todo - use pluck_order\n\t\t\tvar nodes = [];\n\t\t\tfor ( var i=0, ien=rows.length ; i<ien ; i++ ) {\n\t\t\t\tnodes.push( settings.aoData[ rows[i] ].nTr );\n\t\t\t}\n\n\t\t\tif ( sel.nodeName ) {\n\t\t\t\t// Selector - node\n\t\t\t\tif ( $.inArray( sel, nodes ) !== -1 ) {\n\t\t\t\t\treturn [ sel._DT_RowIndex ];// sel is a TR node that is in the table\n\t\t\t\t\t\t\t\t\t\t\t// and DataTables adds a prop for fast lookup\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Selector - jQuery selector string, array of nodes or jQuery object/\n\t\t\t// As jQuery's .filter() allows jQuery objects to be passed in filter,\n\t\t\t// it also allows arrays, so this will cope with all three options\n\t\t\treturn $(nodes)\n\t\t\t\t.filter( sel )\n\t\t\t\t.map( function () {\n\t\t\t\t\treturn this._DT_RowIndex;\n\t\t\t\t} )\n\t\t\t\t.toArray();\n\t\t} );\n\t};\n\n\n\t/**\n\t *\n\t */\n\t_api_register( 'rows()', function ( selector, opts ) {\n\t\t// argument shifting\n\t\tif ( selector === undefined ) {\n\t\t\tselector = '';\n\t\t}\n\t\telse if ( $.isPlainObject( selector ) ) {\n\t\t\topts = selector;\n\t\t\tselector = '';\n\t\t}\n\n\t\topts = _selector_opts( opts );\n\n\t\tvar inst = this.iterator( 'table', function ( settings ) {\n\t\t\treturn __row_selector( settings, selector, opts );\n\t\t} );\n\n\t\t// Want argument shifting here and in __row_selector?\n\t\tinst.selector.rows = selector;\n\t\tinst.selector.opts = opts;\n\n\t\treturn inst;\n\t} );\n\n\n\t_api_registerPlural( 'rows().nodes()', 'row().node()' , function () {\n\t\treturn this.iterator( 'row', function ( settings, row ) {\n\t\t\t// use pluck order on an array rather - rows gives an array, row gives it individually\n\t\t\treturn settings.aoData[ row ].nTr || undefined;\n\t\t} );\n\t} );\n\n\n\t_api_register( 'rows().data()', function () {\n\t\treturn this.iterator( true, 'rows', function ( settings, rows ) {\n\t\t\treturn _pluck_order( settings.aoData, rows, '_aData' );\n\t\t} );\n\t} );\n\n\t_api_registerPlural( 'rows().cache()', 'row().cache()', function ( type ) {\n\t\treturn this.iterator( 'row', function ( settings, row ) {\n\t\t\tvar r = settings.aoData[ row ];\n\t\t\treturn type === 'search' ? r._aFilterData : r._aSortData;\n\t\t} );\n\t} );\n\n\t_api_registerPlural( 'rows().invalidate()', 'row().invalidate()', function ( src ) {\n\t\treturn this.iterator( 'row', function ( settings, row ) {\n\t\t\t_fnInvalidateRow( settings, row, src );\n\t\t} );\n\t} );\n\n\n\t_api_registerPlural( 'rows().indexes()', 'row().index()', function () {\n\t\treturn this.iterator( 'row', function ( settings, row ) {\n\t\t\treturn row;\n\t\t} );\n\t} );\n\n\n\t_api_registerPlural( 'rows().remove()', 'row().remove()', function () {\n\t\tvar that = this;\n\n\t\treturn this.iterator( 'row', function ( settings, row, thatIdx ) {\n\t\t\tvar data = settings.aoData;\n\n\t\t\tdata.splice( row, 1 );\n\n\t\t\t// Update the _DT_RowIndex parameter on all rows in the table\n\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\tif ( data[i].nTr !== null ) {\n\t\t\t\t\tdata[i].nTr._DT_RowIndex = i;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove the target row from the search array\n\t\t\tvar displayIndex = $.inArray( row, settings.aiDisplay );\n\n\t\t\t// Delete from the display arrays\n\t\t\t_fnDeleteIndex( settings.aiDisplayMaster, row );\n\t\t\t_fnDeleteIndex( settings.aiDisplay, row );\n\t\t\t_fnDeleteIndex( that[ thatIdx ], row, false ); // maintain local indexes\n\n\t\t\t// Check for an 'overflow' they case for displaying the table\n\t\t\t_fnLengthOverflow( settings );\n\t\t} );\n\t} );\n\n\n\t_api_register( 'rows.add()', function ( rows ) {\n\t\tvar newRows = this.iterator( 'table', function ( settings ) {\n\t\t\t\tvar row, i, ien;\n\t\t\t\tvar out = [];\n\n\t\t\t\tfor ( i=0, ien=rows.length ; i<ien ; i++ ) {\n\t\t\t\t\trow = rows[i];\n\n\t\t\t\t\tif ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {\n\t\t\t\t\t\tout.push( _fnAddTr( settings, row )[0] );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tout.push( _fnAddData( settings, row ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn out;\n\t\t\t} );\n\n\t\t// Return an Api.rows() extended instance, so rows().nodes() etc can be used\n\t\tvar modRows = this.rows( -1 );\n\t\tmodRows.pop();\n\t\tmodRows.push.apply( modRows, newRows );\n\n\t\treturn modRows;\n\t} );\n\n\n\n\n\n\t/**\n\t *\n\t */\n\t_api_register( 'row()', function ( selector, opts ) {\n\t\treturn _selector_first( this.rows( selector, opts ) );\n\t} );\n\n\n\t_api_register( 'row().data()', function ( data ) {\n\t\tvar ctx = this.context;\n\n\t\tif ( data === undefined ) {\n\t\t\t// Get\n\t\t\treturn ctx.length && this.length ?\n\t\t\t\tctx[0].aoData[ this[0] ]._aData :\n\t\t\t\tundefined;\n\t\t}\n\n\t\t// Set\n\t\tctx[0].aoData[ this[0] ]._aData = data;\n\n\t\t// Automatically invalidate\n\t\t_fnInvalidateRow( ctx[0], this[0], 'data' );\n\n\t\treturn this;\n\t} );\n\n\n\t_api_register( 'row.add()', function ( row ) {\n\t\t// Allow a jQuery object to be passed in - only a single row is added from\n\t\t// it though - the first element in the set\n\t\tif ( row instanceof $ && row.length ) {\n\t\t\trow = row[0];\n\t\t}\n\n\t\tvar rows = this.iterator( 'table', function ( settings ) {\n\t\t\tif ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {\n\t\t\t\treturn _fnAddTr( settings, row )[0];\n\t\t\t}\n\t\t\treturn _fnAddData( settings, row );\n\t\t} );\n\n\t\t// Return an Api.rows() extended instance, with the newly added row selected\n\t\treturn this.row( rows[0] );\n\t} );\n\n\n\n\tvar __details_add = function ( ctx, row, data, klass )\n\t{\n\t\t// Convert to array of TR elements\n\t\tvar rows = [];\n\t\tvar addRow = function ( r, k ) {\n\t\t\tif ( ! r.nodeName || r.nodeName.toUpperCase() !== 'tr' ) {\n\t\t\t\tr = $('<tr><td></td></tr>').find('td').html( r ).parent();\n\t\t\t}\n\n\t\t\t$('td', r).addClass( k )[0].colSpan = _fnVisbleColumns( ctx );\n\t\t\trows.push( r[0] );\n\t\t};\n\n\t\tif ( $.isArray( data ) || data instanceof $ ) {\n\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\taddRow( data[i], klass );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\taddRow( data, klass );\n\t\t}\n\n\t\tif ( row._details ) {\n\t\t\trow._details.remove();\n\t\t}\n\n\t\trow._details = $(rows);\n\n\t\t// If the children were already shown, that state should be retained\n\t\tif ( row._detailsShow ) {\n\t\t\trow._details.insertAfter( row.nTr );\n\t\t}\n\t};\n\n\n\tvar __details_display = function ( show ) {\n\t\tvar ctx = this.context;\n\n\t\tif ( ctx.length && this.length ) {\n\t\t\tvar row = ctx[0].aoData[ this[0] ];\n\n\t\t\tif ( row._details ) {\n\t\t\t\trow._detailsShow = show;\n\t\t\t\tif ( show ) {\n\t\t\t\t\trow._details.insertAfter( row.nTr );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\trow._details.remove();\n\t\t\t\t}\n\n\t\t\t\t__details_events( ctx[0] );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t};\n\n\n\tvar __details_events = function ( settings )\n\t{\n\t\tvar table = $(settings.nTable);\n\n\t\ttable.off('draw.DT_details');\n\t\ttable.off('column-visibility.DT_details');\n\n\t\tif ( _pluck( settings.aoData, '_details' ).length > 0 ) {\n\t\t\t// On each draw, insert the required elements into the document\n\t\t\ttable.on('draw.DT_details', function () {\n\t\t\t\ttable.find('tbody tr').each( function () {\n\t\t\t\t\t// Look up the row index for each row and append open row\n\t\t\t\t\tvar rowIdx = _fnNodeToDataIndex( settings, this );\n\t\t\t\t\tvar row = settings.aoData[ rowIdx ];\n\n\t\t\t\t\tif ( row._detailsShow ) {\n\t\t\t\t\t\trow._details.insertAfter( this );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\t// Column visibility change - update the colspan\n\t\t\ttable.on( 'column-visibility.DT_details', function ( e, settings, idx, vis ) {\n\t\t\t\t// Update the colspan for the details rows (note, only if it already has\n\t\t\t\t// a colspan)\n\t\t\t\tvar row, visible = _fnVisbleColumns( settings );\n\n\t\t\t\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\t\t\trow = settings.aoData[i];\n\n\t\t\t\t\tif ( row._details ) {\n\t\t\t\t\t\trow._details.children('td[colspan]').attr('colspan', visible );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t};\n\n\t// data can be:\n\t//  tr\n\t//  string\n\t//  jQuery or array of any of the above\n\t_api_register( 'row().child()', function ( data, klass ) {\n\t\tvar ctx = this.context;\n\n\t\tif ( data === undefined ) {\n\t\t\t// get\n\t\t\treturn ctx.length && this.length ?\n\t\t\t\tctx[0].aoData[ this[0] ]._details :\n\t\t\t\tundefined;\n\t\t}\n\t\telse if ( ctx.length && this.length ) {\n\t\t\t// set\n\t\t\t__details_add( ctx[0], ctx[0].aoData[ this[0] ], data, klass );\n\t\t}\n\n\t\treturn this;\n\t} );\n\n\t_api_register( [\n\t\t'row().child.show()',\n\t\t'row().child().show()'\n\t], function () {\n\t\t__details_display.call( this, true );\n\t} );\n\n\t_api_register( [\n\t\t'row().child.hide()',\n\t\t'row().child().hide()'\n\t], function () {\n\t\t__details_display.call( this, false );\n\t} );\n\n\t_api_register( 'row().child.isShown()', function () {\n\t\tvar ctx = this.context;\n\n\t\tif ( ctx.length && this.length ) {\n\t\t\t// _detailsShown as false or undefined will fall through to return false\n\t\t\treturn ctx[0].aoData[ this[0] ]._detailsShow || false;\n\t\t}\n\t\treturn false;\n\t} );\n\n\n\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Columns\n\t *\n\t * {integer}           - column index (>=0 count from left, <0 count from right)\n\t * \"{integer}:visIdx\"  - visible column index (i.e. translate to column index)  (>=0 count from left, <0 count from right)\n\t * \"{integer}:visible\" - alias for {integer}:visIdx  (>=0 count from left, <0 count from right)\n\t * \"{string}:name\"     - column name\n\t * \"{string}\"          - jQuery selector on column header nodes\n\t *\n\t */\n\n\t// can be an array of these items, comma separated list, or an array of comma\n\t// separated lists\n\n\tvar __re_column_selector = /^(.*):(name|visIdx|visible)$/;\n\n\tvar __column_selector = function ( settings, selector, opts )\n\t{\n\t\tvar\n\t\t\tcolumns = settings.aoColumns,\n\t\t\tnames = _pluck( columns, 'sName' ),\n\t\t\tnodes = _pluck( columns, 'nTh' );\n\n\t\treturn _selector_run( selector, function ( s ) {\n\t\t\tvar selInt = _intVal( s );\n\n\t\t\tif ( s === '' ) {\n\t\t\t\t// All columns\n\t\t\t\treturn _range( settings.aoColumns.length );\n\t\t\t}\n\t\t\telse if ( selInt !== null ) {\n\t\t\t\t// Integer selector\n\t\t\t\treturn [ selInt >= 0 ?\n\t\t\t\t\tselInt : // Count from left\n\t\t\t\t\tcolumns.length + selInt // Count from right (+ because its a negative value)\n\t\t\t\t];\n\t\t\t}\n\t\t\telse {\n\t\t\t\tvar match = s.match( __re_column_selector );\n\n\t\t\t\tif ( match ) {\n\t\t\t\t\tswitch( match[2] ) {\n\t\t\t\t\t\tcase 'visIdx':\n\t\t\t\t\t\tcase 'visible':\n\t\t\t\t\t\t\tvar idx = parseInt( match[1], 10 );\n\t\t\t\t\t\t\t// Visible index given, convert to column index\n\t\t\t\t\t\t\tif ( idx < 0 ) {\n\t\t\t\t\t\t\t\t// Counting from the right\n\t\t\t\t\t\t\t\tvar visColumns = $.map( columns, function (col,i) {\n\t\t\t\t\t\t\t\t\treturn col.bVisible ? i : null;\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t\treturn [ visColumns[ visColumns.length + idx ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Counting from the left\n\t\t\t\t\t\t\treturn [ _fnVisibleToColumnIndex( settings, idx ) ];\n\n\t\t\t\t\t\tcase 'name':\n\t\t\t\t\t\t\t// match by name. `names` is column index complete and in order\n\t\t\t\t\t\t\treturn $.map( names, function (name, i) {\n\t\t\t\t\t\t\t\treturn name === match[1] ? i : null;\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// jQuery selector on the TH elements for the columns\n\t\t\t\t\treturn $( nodes )\n\t\t\t\t\t\t.filter( s )\n\t\t\t\t\t\t.map( function () {\n\t\t\t\t\t\t\treturn $.inArray( this, nodes ); // `nodes` is column index complete and in order\n\t\t\t\t\t\t} )\n\t\t\t\t\t\t.toArray();\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t};\n\n\n\n\n\n\tvar __setColumnVis = function ( settings, column, vis ) {\n\t\tvar\n\t\t\tcols = settings.aoColumns,\n\t\t\tcol  = cols[ column ],\n\t\t\tdata = settings.aoData,\n\t\t\trow, cells, i, ien, tr;\n\n\t\t// Get\n\t\tif ( vis === undefined ) {\n\t\t\treturn col.bVisible;\n\t\t}\n\n\t\t// Set\n\t\t// No change\n\t\tif ( col.bVisible === vis ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( vis ) {\n\t\t\t// Insert column\n\t\t\t// Need to decide if we should use appendChild or insertBefore\n\t\t\tvar insertBefore = $.inArray( true, _pluck(cols, 'bVisible'), column+1 );\n\n\t\t\tfor ( i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\ttr = data[i].nTr;\n\t\t\t\tcells = data[i].anCells;\n\n\t\t\t\tif ( tr ) {\n\t\t\t\t\t// insertBefore can act like appendChild if 2nd arg is null\n\t\t\t\t\ttr.insertBefore( cells[ column ], cells[ insertBefore ] || null );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// Remove column\n\t\t\t$( _pluck( settings.aoData, 'anCells', column ) ).remove();\n\n\t\t\tcol.bVisible = false;\n\t\t\t_fnDrawHead( settings, settings.aoHeader );\n\t\t\t_fnDrawHead( settings, settings.aoFooter );\n\n\t\t\t_fnSaveState( settings );\n\t\t}\n\n\t\t// Common actions\n\t\tcol.bVisible = vis;\n\t\t_fnDrawHead( settings, settings.aoHeader );\n\t\t_fnDrawHead( settings, settings.aoFooter );\n\n\t\t// Automatically adjust column sizing\n\t\t_fnAdjustColumnSizing( settings );\n\n\t\t// Realign columns for scrolling\n\t\tif ( settings.oScroll.sX || settings.oScroll.sY ) {\n\t\t\t_fnScrollDraw( settings );\n\t\t}\n\n\t\t_fnCallbackFire( settings, null, 'column-visibility', [settings, column, vis] );\n\n\t\t_fnSaveState( settings );\n\t};\n\n\n\t/**\n\t *\n\t */\n\t_api_register( 'columns()', function ( selector, opts ) {\n\t\t// argument shifting\n\t\tif ( selector === undefined ) {\n\t\t\tselector = '';\n\t\t}\n\t\telse if ( $.isPlainObject( selector ) ) {\n\t\t\topts = selector;\n\t\t\tselector = '';\n\t\t}\n\n\t\topts = _selector_opts( opts );\n\n\t\tvar inst = this.iterator( 'table', function ( settings ) {\n\t\t\treturn __column_selector( settings, selector, opts );\n\t\t} );\n\n\t\t// Want argument shifting here and in _row_selector?\n\t\tinst.selector.cols = selector;\n\t\tinst.selector.opts = opts;\n\n\t\treturn inst;\n\t} );\n\n\n\t/**\n\t *\n\t */\n\t_api_registerPlural( 'columns().header()', 'column().header()', function ( selector, opts ) {\n\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\treturn settings.aoColumns[column].nTh;\n\t\t} );\n\t} );\n\n\n\t/**\n\t *\n\t */\n\t_api_registerPlural( 'columns().footer()', 'column().footer()', function ( selector, opts ) {\n\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\treturn settings.aoColumns[column].nTf;\n\t\t} );\n\t} );\n\n\n\t/**\n\t *\n\t */\n\t_api_registerPlural( 'columns().data()', 'column().data()', function () {\n\t\treturn this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {\n\t\t\tvar a = [];\n\t\t\tfor ( var row=0, ien=rows.length ; row<ien ; row++ ) {\n\t\t\t\ta.push( _fnGetCellData( settings, rows[row], column, '' ) );\n\t\t\t}\n\t\t\treturn a;\n\t\t} );\n\t} );\n\n\n\t_api_registerPlural( 'columns().cache()', 'column().cache()', function ( type ) {\n\t\treturn this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {\n\t\t\treturn _pluck_order( settings.aoData, rows,\n\t\t\t\ttype === 'search' ? '_aFilterData' : '_aSortData', column\n\t\t\t);\n\t\t} );\n\t} );\n\n\n\t_api_registerPlural( 'columns().nodes()', 'column().nodes()', function () {\n\t\treturn this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {\n\t\t\treturn _pluck_order( settings.aoData, rows, 'anCells', column ) ;\n\t\t} );\n\t} );\n\n\n\n\t_api_registerPlural( 'columns().visible()', 'column().visible()', function ( vis ) {\n\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\treturn __setColumnVis( settings, column, vis );\n\t\t} );\n\t} );\n\n\n\n\t_api_registerPlural( 'columns().indexes()', 'column().index()', function ( type ) {\n\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\treturn type === 'visible' ?\n\t\t\t\t_fnColumnIndexToVisible( settings, column ) :\n\t\t\t\tcolumn;\n\t\t} );\n\t} );\n\n\n\t// _api_register( 'columns().show()', function () {\n\t// \tvar selector = this.selector;\n\t// \treturn this.columns( selector.cols, selector.opts ).visible( true );\n\t// } );\n\n\n\t// _api_register( 'columns().hide()', function () {\n\t// \tvar selector = this.selector;\n\t// \treturn this.columns( selector.cols, selector.opts ).visible( false );\n\t// } );\n\n\n\n\t_api_register( 'columns.adjust()', function () {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnAdjustColumnSizing( settings );\n\t\t} );\n\t} );\n\n\n\t// Convert from one column index type, to another type\n\t_api_register( 'column.index()', function ( type, idx ) {\n\t\tif ( this.context.length !== 0 ) {\n\t\t\tvar ctx = this.context[0];\n\n\t\t\tif ( type === 'fromVisible' || type === 'toData' ) {\n\t\t\t\treturn _fnColumnIndexToVisible( ctx, idx );\n\t\t\t}\n\t\t\telse if ( type === 'fromData' || type === 'toVisible' ) {\n\t\t\t\treturn _fnVisibleToColumnIndex( ctx, idx );\n\t\t\t}\n\t\t}\n\t} );\n\n\n\t_api_register( 'column()', function ( selector, opts ) {\n\t\treturn _selector_first( this.columns( selector, opts ) );\n\t} );\n\n\n\n\n\tvar __cell_selector = function ( settings, selector, opts )\n\t{\n\t\tvar data = settings.aoData;\n\t\tvar rows = _selector_row_indexes( settings, opts );\n\t\tvar cells = _pluck_order( data, rows, 'anCells' );\n\t\tvar allCells = $( [].concat.apply([], cells) );\n\t\tvar row;\n\t\tvar columns = settings.aoColumns.length;\n\t\tvar a, i, ien, j;\n\n\t\treturn _selector_run( selector, function ( s ) {\n\t\t\tif ( ! s ) {\n\t\t\t\t// All cells\n\t\t\t\ta = [];\n\n\t\t\t\tfor ( i=0, ien=rows.length ; i<ien ; i++ ) {\n\t\t\t\t\trow = rows[i];\n\n\t\t\t\t\tfor ( j=0 ; j<columns ; j++ ) {\n\t\t\t\t\t\ta.push( {\n\t\t\t\t\t\t\trow: row,\n\t\t\t\t\t\t\tcolumn: j\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn a;\n\t\t\t}\n\n\t\t\t// jQuery filtered cells\n\t\t\treturn allCells.filter( s ).map( function (i, el) {\n\t\t\t\trow = el.parentNode._DT_RowIndex;\n\n\t\t\t\treturn {\n\t\t\t\t\trow: row,\n\t\t\t\t\tcolumn: $.inArray( el, data[ row ].anCells )\n\t\t\t\t};\n\t\t\t} );\n\t\t} );\n\t};\n\n\n\n\n\t_api_register( 'cells()', function ( rowSelector, columnSelector, opts ) {\n\t\t// Argument shifting\n\t\tif ( $.isPlainObject( rowSelector ) ) {\n\t\t\topts = rowSelector;\n\t\t\trowSelector = null;\n\t\t}\n\t\tif ( $.isPlainObject( columnSelector ) ) {\n\t\t\topts = columnSelector;\n\t\t\tcolumnSelector = null;\n\t\t}\n\n\t\t// Cell selector\n\t\tif ( columnSelector === null || columnSelector === undefined ) {\n\t\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t\treturn __cell_selector( settings, rowSelector, _selector_opts( opts ) );\n\t\t\t} );\n\t\t}\n\n\t\t// Row + column selector\n\t\tvar columns = this.columns( columnSelector, opts );\n\t\tvar rows = this.rows( rowSelector, opts );\n\t\tvar a, i, ien, j, jen;\n\n\t\tvar cells = this.iterator( 'table', function ( settings, idx ) {\n\t\t\ta = [];\n\n\t\t\tfor ( i=0, ien=rows[idx].length ; i<ien ; i++ ) {\n\t\t\t\tfor ( j=0, jen=columns[idx].length ; j<jen ; j++ ) {\n\t\t\t\t\ta.push( {\n\t\t\t\t\t\trow:    rows[idx][i],\n\t\t\t\t\t\tcolumn: columns[idx][j]\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn a;\n\t\t} );\n\n\t\t$.extend( cells.selector, {\n\t\t\tcols: columnSelector,\n\t\t\trows: rowSelector,\n\t\t\topts: opts\n\t\t} );\n\n\t\treturn cells;\n\t} );\n\n\n\t_api_registerPlural( 'cells().nodes()', 'cell().node()', function () {\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\treturn settings.aoData[ row ].anCells[ column ];\n\t\t} );\n\t} );\n\n\n\t_api_register( 'cells().data()', function () {\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\treturn _fnGetCellData( settings, row, column );\n\t\t} );\n\t} );\n\n\n\t_api_registerPlural( 'cells().cache()', 'cell().cache()', function ( type ) {\n\t\ttype = type === 'search' ? '_aFilterData' : '_aSortData';\n\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\treturn settings.aoData[ row ][ type ][ column ];\n\t\t} );\n\t} );\n\n\n\t_api_registerPlural( 'cells().indexes()', 'cell().index()', function () {\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\treturn {\n\t\t\t\trow: row,\n\t\t\t\tcolumn: column,\n\t\t\t\tcolumnVisible: _fnColumnIndexToVisible( settings, column )\n\t\t\t};\n\t\t} );\n\t} );\n\n\n\t_api_register( [\n\t\t'cells().invalidate()',\n\t\t'cell().invalidate()'\n\t], function ( src ) {\n\t\tvar selector = this.selector;\n\n\t\t// Use the rows method of the instance to perform the invalidation, rather\n\t\t// than doing it here. This avoids needing to handle duplicate rows from\n\t\t// the cells.\n\t\tthis.rows( selector.rows, selector.opts ).invalidate( src );\n\n\t\treturn this;\n\t} );\n\n\n\n\n\t_api_register( 'cell()', function ( rowSelector, columnSelector, opts ) {\n\t\treturn _selector_first( this.cells( rowSelector, columnSelector, opts ) );\n\t} );\n\n\n\n\t_api_register( 'cell().data()', function ( data ) {\n\t\tvar ctx = this.context;\n\t\tvar cell = this[0];\n\n\t\tif ( data === undefined ) {\n\t\t\t// Get\n\t\t\treturn ctx.length && cell.length ?\n\t\t\t\t_fnGetCellData( ctx[0], cell[0].row, cell[0].column ) :\n\t\t\t\tundefined;\n\t\t}\n\n\t\t// Set\n\t\t_fnSetCellData( ctx[0], cell[0].row, cell[0].column, data );\n\t\t_fnInvalidateRow( ctx[0], cell[0].row, 'data', cell[0].column );\n\n\t\treturn this;\n\t} );\n\n\n\n\t/**\n\t * Get current ordering (sorting) that has been applied to the table.\n\t *\n\t * @returns {array} 2D array containing the sorting information for the first\n\t *   table in the current context. Each element in the parent array represents\n\t *   a column being sorted upon (i.e. multi-sorting with two columns would have\n\t *   2 inner arrays). The inner arrays may have 2 or 3 elements. The first is\n\t *   the column index that the sorting condition applies to, the second is the\n\t *   direction of the sort (`desc` or `asc`) and, optionally, the third is the\n\t *   index of the sorting order from the `column.sorting` initialisation array.\n\t *//**\n\t * Set the ordering for the table.\n\t *\n\t * @param {integer} order Column index to sort upon.\n\t * @param {string} direction Direction of the sort to be applied (`asc` or `desc`)\n\t * @returns {DataTables.Api} this\n\t *//**\n\t * Set the ordering for the table.\n\t *\n\t * @param {array} order 1D array of sorting information to be applied.\n\t * @param {array} [...] Optional additional sorting conditions\n\t * @returns {DataTables.Api} this\n\t *//**\n\t * Set the ordering for the table.\n\t *\n\t * @param {array} order 2D array of sorting information to be applied.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'order()', function ( order, dir ) {\n\t\tvar ctx = this.context;\n\n\t\tif ( order === undefined ) {\n\t\t\t// get\n\t\t\treturn ctx.length !== 0 ?\n\t\t\t\tctx[0].aaSorting :\n\t\t\t\tundefined;\n\t\t}\n\n\t\t// set\n\t\tif ( typeof order === 'number' ) {\n\t\t\t// Simple column / direction passed in\n\t\t\torder = [ [ order, dir ] ];\n\t\t}\n\t\telse if ( ! $.isArray( order[0] ) ) {\n\t\t\t// Arguments passed in (list of 1D arrays)\n\t\t\torder = Array.prototype.slice.call( arguments );\n\t\t}\n\t\t// otherwise a 2D array was passed in\n\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tsettings.aaSorting = order.slice();\n\t\t} );\n\t} );\n\n\n\t/**\n\t * Attach a sort listener to an element for a given column\n\t *\n\t * @param {node|jQuery|string} node Identifier for the element(s) to attach the\n\t *   listener to. This can take the form of a single DOM node, a jQuery\n\t *   collection of nodes or a jQuery selector which will identify the node(s).\n\t * @param {integer} column the column that a click on this node will sort on\n\t * @param {function} [callback] callback function when sort is run\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'order.listener()', function ( node, column, callback ) {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnSortAttachListener( settings, node, column, callback );\n\t\t} );\n\t} );\n\n\n\t// Order by the selected column(s)\n\t_api_register( [\n\t\t'columns().order()',\n\t\t'column().order()'\n\t], function ( dir ) {\n\t\tvar that = this;\n\n\t\treturn this.iterator( 'table', function ( settings, i ) {\n\t\t\tvar sort = [];\n\n\t\t\t$.each( that[i], function (j, col) {\n\t\t\t\tsort.push( [ col, dir ] );\n\t\t\t} );\n\n\t\t\tsettings.aaSorting = sort;\n\t\t} );\n\t} );\n\n\n\n\t_api_register( 'search()', function ( input, regex, smart, caseInsen ) {\n\t\tvar ctx = this.context;\n\n\t\tif ( input === undefined ) {\n\t\t\t// get\n\t\t\treturn ctx.length !== 0 ?\n\t\t\t\tctx[0].oPreviousSearch.sSearch :\n\t\t\t\tundefined;\n\t\t}\n\n\t\t// set\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tif ( ! settings.oFeatures.bFilter ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_fnFilterComplete( settings, $.extend( {}, settings.oPreviousSearch, {\n\t\t\t\t\"sSearch\": input+\"\",\n\t\t\t\t\"bRegex\":  regex === null ? false : regex,\n\t\t\t\t\"bSmart\":  smart === null ? true  : smart,\n\t\t\t\t\"bCaseInsensitive\": caseInsen === null ? true : caseInsen\n\t\t\t} ), 1 );\n\t\t} );\n\t} );\n\n\n\t_api_register( [\n\t\t'columns().search()',\n\t\t'column().search()'\n\t], function ( input, regex, smart, caseInsen ) {\n\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\tvar preSearch = settings.aoPreSearchCols;\n\n\t\t\tif ( input === undefined ) {\n\t\t\t\t// get\n\t\t\t\treturn preSearch[ column ].sSearch;\n\t\t\t}\n\n\t\t\t// set\n\t\t\tif ( ! settings.oFeatures.bFilter ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$.extend( preSearch[ column ], {\n\t\t\t\t\"sSearch\": input+\"\",\n\t\t\t\t\"bRegex\":  regex === null ? false : regex,\n\t\t\t\t\"bSmart\":  smart === null ? true  : smart,\n\t\t\t\t\"bCaseInsensitive\": caseInsen === null ? true : caseInsen\n\t\t\t} );\n\n\t\t\t_fnFilterComplete( settings, settings.oPreviousSearch, 1 );\n\t\t} );\n\t} );\n\n\n\n\t/**\n\t * Provide a common method for plug-ins to check the version of DataTables being\n\t * used, in order to ensure compatibility.\n\t *\n\t *  @param {string} version Version string to check for, in the format \"X.Y.Z\".\n\t *    Note that the formats \"X\" and \"X.Y\" are also acceptable.\n\t *  @returns {boolean} true if this version of DataTables is greater or equal to\n\t *    the required version, or false if this version of DataTales is not\n\t *    suitable\n\t *  @static\n\t *  @dtopt API-Static\n\t *\n\t *  @example\n\t *    alert( $.fn.dataTable.versionCheck( '1.9.0' ) );\n\t */\n\tDataTable.versionCheck = DataTable.fnVersionCheck = function( version )\n\t{\n\t\tvar aThis = DataTable.version.split('.');\n\t\tvar aThat = version.split('.');\n\t\tvar iThis, iThat;\n\n\t\tfor ( var i=0, iLen=aThat.length ; i<iLen ; i++ ) {\n\t\t\tiThis = parseInt( aThis[i], 10 ) || 0;\n\t\t\tiThat = parseInt( aThat[i], 10 ) || 0;\n\n\t\t\t// Parts are the same, keep comparing\n\t\t\tif (iThis === iThat) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Parts are different, return immediately\n\t\t\treturn iThis > iThat;\n\t\t}\n\n\t\treturn true;\n\t};\n\n\n\t/**\n\t * Check if a `<table>` node is a DataTable table already or not.\n\t *\n\t *  @param {node|jquery|string} table Table node, jQuery object or jQuery\n\t *      selector for the table to test. Note that if more than more than one\n\t *      table is passed on, only the first will be checked\n\t *  @returns {boolean} true the table given is a DataTable, or false otherwise\n\t *  @static\n\t *  @dtopt API-Static\n\t *\n\t *  @example\n\t *    if ( ! $.fn.DataTable.isDataTable( '#example' ) ) {\n\t *      $('#example').dataTable();\n\t *    }\n\t */\n\tDataTable.isDataTable = DataTable.fnIsDataTable = function ( table )\n\t{\n\t\tvar t = $(table).get(0);\n\t\tvar is = false;\n\n\t\t$.each( DataTable.settings, function (i, o) {\n\t\t\tif ( o.nTable === t || o.nScrollHead === t || o.nScrollFoot === t ) {\n\t\t\t\tis = true;\n\t\t\t}\n\t\t} );\n\n\t\treturn is;\n\t};\n\n\n\t/**\n\t * Get all DataTable tables that have been initialised - optionally you can\n\t * select to get only currently visible tables.\n\t *\n\t *  @param {boolean} [visible=false] Flag to indicate if you want all (default)\n\t *    or visible tables only.\n\t *  @returns {array} Array of `table` nodes (not DataTable instances) which are\n\t *    DataTables\n\t *  @static\n\t *  @dtopt API-Static\n\t *\n\t *  @example\n\t *    $.each( $.fn.dataTable.tables(true), function () {\n\t *      $(table).DataTable().columns.adjust();\n\t *    } );\n\t */\n\tDataTable.tables = DataTable.fnTables = function ( visible )\n\t{\n\t\treturn jQuery.map( DataTable.settings, function (o) {\n\t\t\tif ( !visible || (visible && $(o.nTable).is(':visible')) ) {\n\t\t\t\treturn o.nTable;\n\t\t\t}\n\t\t} );\n\t};\n\n\n\n\t/**\n\t *\n\t */\n\t_api_register( '$()', function ( selector, opts ) {\n\t\tvar\n\t\t\trows   = this.rows( opts ).nodes(), // Get all rows\n\t\t\tjqRows = $(rows);\n\n\t\treturn $( [].concat(\n\t\t\tjqRows.filter( selector ).toArray(),\n\t\t\tjqRows.find( selector ).toArray()\n\t\t) );\n\t} );\n\n\n\t// jQuery functions to operate on the tables\n\t$.each( [ 'on', 'one', 'off' ], function (i, key) {\n\t\t_api_register( key+'()', function ( /* event, handler */ ) {\n\t\t\tvar args = Array.prototype.slice.call(arguments);\n\n\t\t\t// Add the `dt` namespace automatically if it isn't already present\n\t\t\tif ( args[0].indexOf( '.dt' ) === -1 ) {\n\t\t\t\targs[0] += '.dt';\n\t\t\t}\n\n\t\t\tvar inst = $( this.tables().nodes() );\n\t\t\tinst[key].apply( inst, args );\n\t\t\treturn this;\n\t\t} );\n\t} );\n\n\n\t_api_register( 'clear()', function () {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnClearTable( settings );\n\t\t} );\n\t} );\n\n\n\t_api_register( 'settings()', function () {\n\t\treturn new _Api( this.context, this.context );\n\t} );\n\n\n\t_api_register( 'data()', function () {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\treturn _pluck( settings.aoData, '_aData' );\n\t\t} ).flatten();\n\t} );\n\n\n\t_api_register( 'destroy()', function ( remove ) {\n\t\tremove = remove || false;\n\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tvar orig      = settings.nTableWrapper.parentNode;\n\t\t\tvar classes   = settings.oClasses;\n\t\t\tvar table     = settings.nTable;\n\t\t\tvar tbody     = settings.nTBody;\n\t\t\tvar thead     = settings.nTHead;\n\t\t\tvar tfoot     = settings.nTFoot;\n\t\t\tvar jqTable   = $(table);\n\t\t\tvar jqTbody   = $(tbody);\n\t\t\tvar jqWrapper = $(settings.nTableWrapper);\n\t\t\tvar rows      = $.map( settings.aoData, function (r) { return r.nTr; } );\n\t\t\tvar i, ien;\n\n\t\t\t// Flag to note that the table is currently being destroyed - no action\n\t\t\t// should be taken\n\t\t\tsettings.bDestroying = true;\n\n\t\t\t// Fire off the destroy callbacks for plug-ins etc\n\t\t\t_fnCallbackFire( settings, \"aoDestroyCallback\", \"destroy\", [settings] );\n\n\t\t\t// If not being removed from the document, make all columns visible\n\t\t\tif ( ! remove ) {\n\t\t\t\tnew _Api( settings ).columns().visible( true );\n\t\t\t}\n\n\t\t\t// Blitz all DT events\n\t\t\tjqWrapper.unbind('.DT').find(':not(tbody *)').unbind('.DT');\n\t\t\t$(window).unbind('.DT-'+settings.sInstance);\n\n\t\t\t// When scrolling we had to break the table up - restore it\n\t\t\tif ( table != thead.parentNode ) {\n\t\t\t\tjqTable.children('thead').remove();\n\t\t\t\tjqTable.append( thead );\n\t\t\t}\n\n\t\t\tif ( tfoot && table != tfoot.parentNode ) {\n\t\t\t\tjqTable.children('tfoot').remove();\n\t\t\t\tjqTable.append( tfoot );\n\t\t\t}\n\n\t\t\t// Remove the DataTables generated nodes, events and classes\n\t\t\tjqTable.remove();\n\t\t\tjqWrapper.remove();\n\n\t\t\tsettings.aaSorting = [];\n\t\t\tsettings.aaSortingFixed = [];\n\t\t\t_fnSortingClasses( settings );\n\n\t\t\t$( rows ).removeClass( settings.asStripeClasses.join(' ') );\n\n\t\t\t$('th, td', thead).removeClass( classes.sSortable+' '+\n\t\t\t\tclasses.sSortableAsc+' '+classes.sSortableDesc+' '+classes.sSortableNone\n\t\t\t);\n\n\t\t\tif ( settings.bJUI ) {\n\t\t\t\t$('th span.'+classes.sSortIcon+ ', td span.'+classes.sSortIcon, thead).remove();\n\t\t\t\t$('th, td', thead).each( function () {\n\t\t\t\t\tvar wrapper = $('div.'+classes.sSortJUIWrapper, this);\n\t\t\t\t\t$(this).append( wrapper.contents() );\n\t\t\t\t\twrapper.remove();\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tif ( ! remove ) {\n\t\t\t\t// insertBefore acts like appendChild if !arg[1]\n\t\t\t\torig.insertBefore( table, settings.nTableReinsertBefore );\n\t\t\t}\n\n\t\t\t// Add the TR elements back into the table in their original order\n\t\t\tjqTbody.children().detach();\n\t\t\tjqTbody.append( rows );\n\n\t\t\t// Restore the width of the original table - was read from the style property,\n\t\t\t// so we can restore directly to that\n\t\t\tjqTable\n\t\t\t\t.css( 'width', settings.sDestroyWidth )\n\t\t\t\t.removeClass( classes.sTable );\n\n\t\t\t// If the were originally stripe classes - then we add them back here.\n\t\t\t// Note this is not fool proof (for example if not all rows had stripe\n\t\t\t// classes - but it's a good effort without getting carried away\n\t\t\tien = settings.asDestroyStripes.length;\n\n\t\t\tif ( ien ) {\n\t\t\t\tjqTbody.children().each( function (i) {\n\t\t\t\t\t$(this).addClass( settings.asDestroyStripes[i % ien] );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t/* Remove the settings object from the settings array */\n\t\t\tvar idx = $.inArray( settings, DataTable.settings );\n\t\t\tif ( idx !== -1 ) {\n\t\t\t\tDataTable.settings.splice( idx, 1 );\n\t\t\t}\n\t\t} );\n\t} );\n\n\n\t/**\n\t * Version string for plug-ins to check compatibility. Allowed format is\n\t * `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used\n\t * only for non-release builds. See http://semver.org/ for more information.\n\t *  @member\n\t *  @type string\n\t *  @default Version number\n\t */\n\tDataTable.version = \"1.10.0-dev\";\n\n\t/**\n\t * Private data store, containing all of the settings objects that are\n\t * created for the tables on a given page.\n\t *\n\t * Note that the `DataTable.settings` object is aliased to\n\t * `jQuery.fn.dataTableExt` through which it may be accessed and\n\t * manipulated, or `jQuery.fn.dataTable.settings`.\n\t *  @member\n\t *  @type array\n\t *  @default []\n\t *  @private\n\t */\n\tDataTable.settings = [];\n\n\t/**\n\t * Object models container, for the various models that DataTables has\n\t * available to it. These models define the objects that are used to hold\n\t * the active state and configuration of the table.\n\t *  @namespace\n\t */\n\tDataTable.models = {};\n\n\n\n\t/**\n\t * Template object for the way in which DataTables holds information about\n\t * search information for the global filter and individual column filters.\n\t *  @namespace\n\t */\n\tDataTable.models.oSearch = {\n\t\t/**\n\t\t * Flag to indicate if the filtering should be case insensitive or not\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t */\n\t\t\"bCaseInsensitive\": true,\n\n\t\t/**\n\t\t * Applied search term\n\t\t *  @type string\n\t\t *  @default <i>Empty string</i>\n\t\t */\n\t\t\"sSearch\": \"\",\n\n\t\t/**\n\t\t * Flag to indicate if the search term should be interpreted as a\n\t\t * regular expression (true) or not (false) and therefore and special\n\t\t * regex characters escaped.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bRegex\": false,\n\n\t\t/**\n\t\t * Flag to indicate if DataTables is to use its smart filtering or not.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t */\n\t\t\"bSmart\": true\n\t};\n\n\n\n\n\t/**\n\t * Template object for the way in which DataTables holds information about\n\t * each individual row. This is the object format used for the settings\n\t * aoData array.\n\t *  @namespace\n\t */\n\tDataTable.models.oRow = {\n\t\t/**\n\t\t * TR element for the row\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTr\": null,\n\n\t\t/**\n\t\t * Array of TD elements for each row. This is null until the row has been\n\t\t * created.\n\t\t *  @type array nodes\n\t\t *  @default []\n\t\t */\n\t\t\"anCells\": null,\n\n\t\t/**\n\t\t * Data object from the original data source for the row. This is either\n\t\t * an array if using the traditional form of DataTables, or an object if\n\t\t * using mData options. The exact type will depend on the passed in\n\t\t * data from the data source, or will be an array if using DOM a data\n\t\t * source.\n\t\t *  @type array|object\n\t\t *  @default []\n\t\t */\n\t\t\"_aData\": [],\n\n\t\t/**\n\t\t * Sorting data cache - this array is ostensibly the same length as the\n\t\t * number of columns (although each index is generated only as it is\n\t\t * needed), and holds the data that is used for sorting each column in the\n\t\t * row. We do this cache generation at the start of the sort in order that\n\t\t * the formatting of the sort data need be done only once for each cell\n\t\t * per sort. This array should not be read from or written to by anything\n\t\t * other than the master sorting methods.\n\t\t *  @type array\n\t\t *  @default null\n\t\t *  @private\n\t\t */\n\t\t\"_aSortData\": null,\n\n\t\t/**\n\t\t * Per cell filtering data cache. As per the sort data cache, used to\n\t\t * increase the performance of the filtering in DataTables\n\t\t *  @type array\n\t\t *  @default null\n\t\t *  @private\n\t\t */\n\t\t\"_aFilterData\": null,\n\n\t\t/**\n\t\t * Filtering data cache. This is the same as the cell filtering cache, but\n\t\t * in this case a string rather than an array. This is easily computed with\n\t\t * a join on `_aFilterData`, but is provided as a cache so the join isn't\n\t\t * needed on every search (memory traded for performance)\n\t\t *  @type array\n\t\t *  @default null\n\t\t *  @private\n\t\t */\n\t\t\"_sFilterRow\": null,\n\n\t\t/**\n\t\t * Cache of the class name that DataTables has applied to the row, so we\n\t\t * can quickly look at this variable rather than needing to do a DOM check\n\t\t * on className for the nTr property.\n\t\t *  @type string\n\t\t *  @default <i>Empty string</i>\n\t\t *  @private\n\t\t */\n\t\t\"_sRowStripe\": \"\",\n\n\t\t/**\n\t\t * Denote if the original data source was from the DOM, or the data source\n\t\t * object. This is used for invalidating data, so DataTables can\n\t\t * automatically read data from the original source, unless uninstructed\n\t\t * otherwise.\n\t\t *  @type string\n\t\t *  @default null\n\t\t *  @private\n\t\t */\n\t\t\"src\": null\n\t};\n\n\n\n\t/**\n\t * Template object for the column information object in DataTables. This object\n\t * is held in the settings aoColumns array and contains all the information that\n\t * DataTables needs about each individual column.\n\t *\n\t * Note that this object is related to {@link DataTable.defaults.column}\n\t * but this one is the internal data store for DataTables's cache of columns.\n\t * It should NOT be manipulated outside of DataTables. Any configuration should\n\t * be done through the initialisation options.\n\t *  @namespace\n\t */\n\tDataTable.models.oColumn = {\n\t\t/**\n\t\t * A list of the columns that sorting should occur on when this column\n\t\t * is sorted. That this property is an array allows multi-column sorting\n\t\t * to be defined for a column (for example first name / last name columns\n\t\t * would benefit from this). The values are integers pointing to the\n\t\t * columns to be sorted on (typically it will be a single integer pointing\n\t\t * at itself, but that doesn't need to be the case).\n\t\t *  @type array\n\t\t */\n\t\t\"aDataSort\": null,\n\n\t\t/**\n\t\t * Define the sorting directions that are applied to the column, in sequence\n\t\t * as the column is repeatedly sorted upon - i.e. the first value is used\n\t\t * as the sorting direction when the column if first sorted (clicked on).\n\t\t * Sort it again (click again) and it will move on to the next index.\n\t\t * Repeat until loop.\n\t\t *  @type array\n\t\t */\n\t\t\"asSorting\": null,\n\n\t\t/**\n\t\t * Flag to indicate if the column is searchable, and thus should be included\n\t\t * in the filtering or not.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bSearchable\": null,\n\n\t\t/**\n\t\t * Flag to indicate if the column is sortable or not.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bSortable\": null,\n\n\t\t/**\n\t\t * Flag to indicate if the column is currently visible in the table or not\n\t\t *  @type boolean\n\t\t */\n\t\t\"bVisible\": null,\n\n\t\t/**\n\t\t * Store for manual type assignment using the `column.type` option. This\n\t\t * is held in store so we can manipulate the column's `sType` property.\n\t\t *  @type string\n\t\t *  @default null\n\t\t *  @private\n\t\t */\n\t\t\"_sManualType\": null,\n\n\t\t/**\n\t\t * Flag to indicate if HTML5 data attributes should be used as the data\n\t\t * source for filtering or sorting. True is either are.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *  @private\n\t\t */\n\t\t\"_bAttrSrc\": false,\n\n\t\t/**\n\t\t * Developer definable function that is called whenever a cell is created (Ajax source,\n\t\t * etc) or processed for input (DOM source). This can be used as a compliment to mRender\n\t\t * allowing you to modify the DOM element (add background colour for example) when the\n\t\t * element is available.\n\t\t *  @type function\n\t\t *  @param {element} nTd The TD node that has been created\n\t\t *  @param {*} sData The Data for the cell\n\t\t *  @param {array|object} oData The data for the whole row\n\t\t *  @param {int} iRow The row index for the aoData data store\n\t\t *  @default null\n\t\t */\n\t\t\"fnCreatedCell\": null,\n\n\t\t/**\n\t\t * Function to get data from a cell in a column. You should <b>never</b>\n\t\t * access data directly through _aData internally in DataTables - always use\n\t\t * the method attached to this property. It allows mData to function as\n\t\t * required. This function is automatically assigned by the column\n\t\t * initialisation method\n\t\t *  @type function\n\t\t *  @param {array|object} oData The data array/object for the array\n\t\t *    (i.e. aoData[]._aData)\n\t\t *  @param {string} sSpecific The specific data type you want to get -\n\t\t *    'display', 'type' 'filter' 'sort'\n\t\t *  @returns {*} The data for the cell from the given row's data\n\t\t *  @default null\n\t\t */\n\t\t\"fnGetData\": null,\n\n\t\t/**\n\t\t * Function to set data for a cell in the column. You should <b>never</b>\n\t\t * set the data directly to _aData internally in DataTables - always use\n\t\t * this method. It allows mData to function as required. This function\n\t\t * is automatically assigned by the column initialisation method\n\t\t *  @type function\n\t\t *  @param {array|object} oData The data array/object for the array\n\t\t *    (i.e. aoData[]._aData)\n\t\t *  @param {*} sValue Value to set\n\t\t *  @default null\n\t\t */\n\t\t\"fnSetData\": null,\n\n\t\t/**\n\t\t * Property to read the value for the cells in the column from the data\n\t\t * source array / object. If null, then the default content is used, if a\n\t\t * function is given then the return from the function is used.\n\t\t *  @type function|int|string|null\n\t\t *  @default null\n\t\t */\n\t\t\"mData\": null,\n\n\t\t/**\n\t\t * Partner property to mData which is used (only when defined) to get\n\t\t * the data - i.e. it is basically the same as mData, but without the\n\t\t * 'set' option, and also the data fed to it is the result from mData.\n\t\t * This is the rendering method to match the data method of mData.\n\t\t *  @type function|int|string|null\n\t\t *  @default null\n\t\t */\n\t\t\"mRender\": null,\n\n\t\t/**\n\t\t * Unique header TH/TD element for this column - this is what the sorting\n\t\t * listener is attached to (if sorting is enabled.)\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTh\": null,\n\n\t\t/**\n\t\t * Unique footer TH/TD element for this column (if there is one). Not used\n\t\t * in DataTables as such, but can be used for plug-ins to reference the\n\t\t * footer for each column.\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTf\": null,\n\n\t\t/**\n\t\t * The class to apply to all TD elements in the table's TBODY for the column\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sClass\": null,\n\n\t\t/**\n\t\t * When DataTables calculates the column widths to assign to each column,\n\t\t * it finds the longest string in each column and then constructs a\n\t\t * temporary table and reads the widths from that. The problem with this\n\t\t * is that \"mmm\" is much wider then \"iiii\", but the latter is a longer\n\t\t * string - thus the calculation can go wrong (doing it properly and putting\n\t\t * it into an DOM object and measuring that is horribly(!) slow). Thus as\n\t\t * a \"work around\" we provide this option. It will append its value to the\n\t\t * text that is found to be the longest string for the column - i.e. padding.\n\t\t *  @type string\n\t\t */\n\t\t\"sContentPadding\": null,\n\n\t\t/**\n\t\t * Allows a default value to be given for a column's data, and will be used\n\t\t * whenever a null data source is encountered (this can be because mData\n\t\t * is set to null, or because the data source itself is null).\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sDefaultContent\": null,\n\n\t\t/**\n\t\t * Name for the column, allowing reference to the column by name as well as\n\t\t * by index (needs a lookup to work by name).\n\t\t *  @type string\n\t\t */\n\t\t\"sName\": null,\n\n\t\t/**\n\t\t * Custom sorting data type - defines which of the available plug-ins in\n\t\t * afnSortData the custom sorting will use - if any is defined.\n\t\t *  @type string\n\t\t *  @default std\n\t\t */\n\t\t\"sSortDataType\": 'std',\n\n\t\t/**\n\t\t * Class to be applied to the header element when sorting on this column\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sSortingClass\": null,\n\n\t\t/**\n\t\t * Class to be applied to the header element when sorting on this column -\n\t\t * when jQuery UI theming is used.\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sSortingClassJUI\": null,\n\n\t\t/**\n\t\t * Title of the column - what is seen in the TH element (nTh).\n\t\t *  @type string\n\t\t */\n\t\t\"sTitle\": null,\n\n\t\t/**\n\t\t * Column sorting and filtering type\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sType\": null,\n\n\t\t/**\n\t\t * Width of the column\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sWidth\": null,\n\n\t\t/**\n\t\t * Width of the column when it was first \"encountered\"\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sWidthOrig\": null\n\t};\n\n\n\t/*\n\t * Developer note: The properties of the object below are given in Hungarian\n\t * notation, that was used as the interface for DataTables prior to v1.10, however\n\t * from v1.10 onwards the primary interface is camel case. In order to avoid\n\t * breaking backwards compatibility utterly with this change, the Hungarian\n\t * version is still, internally the primary interface, but is is not documented\n\t * - hence the @name tags in each doc comment. This allows a Javascript function\n\t * to create a map from Hungarian notation to camel case (going the other direction\n\t * would require each property to be listed, which would at around 3K to the size\n\t * of DataTables, while this method is about a 0.5K hit.\n\t *\n\t * Ultimately this does pave the way for Hungarian notation to be dropped\n\t * completely, but that is a massive amount of work and will break current\n\t * installs (therefore is on-hold until v2).\n\t */\n\n\t/**\n\t * Initialisation options that can be given to DataTables at initialisation\n\t * time.\n\t *  @namespace\n\t */\n\tDataTable.defaults = {\n\t\t/**\n\t\t * An array of data to use for the table, passed in at initialisation which\n\t\t * will be used in preference to any data which is already in the DOM. This is\n\t\t * particularly useful for constructing tables purely in Javascript, for\n\t\t * example with a custom Ajax call.\n\t\t *  @type array\n\t\t *  @default null\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.data\n\t\t *\n\t\t *  @example\n\t\t *    // Using a 2D array data source\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"data\": [\n\t\t *          ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'],\n\t\t *          ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'],\n\t\t *        ],\n\t\t *        \"columns\": [\n\t\t *          { \"title\": \"Engine\" },\n\t\t *          { \"title\": \"Browser\" },\n\t\t *          { \"title\": \"Platform\" },\n\t\t *          { \"title\": \"Version\" },\n\t\t *          { \"title\": \"Grade\" }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using an array of objects as a data source (`data`)\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"data\": [\n\t\t *          {\n\t\t *            \"engine\":   \"Trident\",\n\t\t *            \"browser\":  \"Internet Explorer 4.0\",\n\t\t *            \"platform\": \"Win 95+\",\n\t\t *            \"version\":  4,\n\t\t *            \"grade\":    \"X\"\n\t\t *          },\n\t\t *          {\n\t\t *            \"engine\":   \"Trident\",\n\t\t *            \"browser\":  \"Internet Explorer 5.0\",\n\t\t *            \"platform\": \"Win 95+\",\n\t\t *            \"version\":  5,\n\t\t *            \"grade\":    \"C\"\n\t\t *          }\n\t\t *        ],\n\t\t *        \"columns\": [\n\t\t *          { \"title\": \"Engine\",   \"data\": \"engine\" },\n\t\t *          { \"title\": \"Browser\",  \"data\": \"browser\" },\n\t\t *          { \"title\": \"Platform\", \"data\": \"platform\" },\n\t\t *          { \"title\": \"Version\",  \"data\": \"version\" },\n\t\t *          { \"title\": \"Grade\",    \"data\": \"grade\" }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"aaData\": null,\n\n\n\t\t/**\n\t\t * If ordering is enabled, then DataTables will perform a first pass sort on\n\t\t * initialisation. You can define which column(s) the sort is performed\n\t\t * upon, and the sorting direction, with this variable. The `sorting` array\n\t\t * should contain an array for each column to be sorted initially containing\n\t\t * the column's index and a direction string ('asc' or 'desc').\n\t\t *  @type array\n\t\t *  @default [[0,'asc']]\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.order\n\t\t *\n\t\t *  @example\n\t\t *    // Sort by 3rd column first, and then 4th column\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"order\": [[2,'asc'], [3,'desc']]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *    // No initial sorting\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"order\": []\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"aaSorting\": [[0,'asc']],\n\n\n\t\t/**\n\t\t * This parameter is basically identical to the `sorting` parameter, but\n\t\t * cannot be overridden by user interaction with the table. What this means\n\t\t * is that you could have a column (visible or hidden) which the sorting\n\t\t * will always be forced on first - any sorting after that (from the user)\n\t\t * will then be performed as required. This can be useful for grouping rows\n\t\t * together.\n\t\t *  @type array\n\t\t *  @default null\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.orderFixed\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"orderFixed\": [[0,'asc']]\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"aaSortingFixed\": [],\n\n\n\t\t/**\n\t\t * DataTables can be instructed to load data to display in the table from a\n\t\t * Ajax source. This option defines how that Ajax call is made and where to.\n\t\t *\n\t\t * The `ajax` property has three different modes of operation, depending on\n\t\t * how it is defined. These are:\n\t\t *\n\t\t * * `string` - Set the URL from where the data should be loaded from.\n\t\t * * `object` - Define properties for `jQuery.ajax`.\n\t\t * * `function` - Custom data get function\n\t\t *\n\t\t * `string`\n\t\t * --------\n\t\t *\n\t\t * As a string, the `ajax` property simply defines the URL from which\n\t\t * DataTables will load data.\n\t\t *\n\t\t * `object`\n\t\t * --------\n\t\t *\n\t\t * As an object, the parameters in the object are passed to\n\t\t * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control\n\t\t * of the Ajax request. DataTables has a number of default parameters which\n\t\t * you can override using this option. Please refer to the jQuery\n\t\t * documentation for a full description of the options available, although\n\t\t * the following parameters provide additional options in DataTables or\n\t\t * require special consideration:\n\t\t *\n\t\t * * `data` - As with jQuery, `data` can be provided as an object, but it\n\t\t *   can also be used as a function to manipulate the data DataTables sends\n\t\t *   to the server. The function takes a single parameter, an object of\n\t\t *   parameters with the values that DataTables has readied for sending. An\n\t\t *   object may be returned which will be merged into the DataTables\n\t\t *   defaults, or you can add the items to the object that was passed in and\n\t\t *   not return anything from the function. This supersedes `fnServerParams`\n\t\t *   from DataTables 1.9-.\n\t\t *\n\t\t * * `dataSrc` - By default DataTables will look for the property `data` (or\n\t\t *   `aaData` for compatibility with DataTables 1.9-) when obtaining data\n\t\t *   from an Ajax source or for server-side processing - this parameter\n\t\t *   allows that property to be changed. You can use Javascript dotted\n\t\t *   object notation to get a data source for multiple levels of nesting, or\n\t\t *   it my be used as a function. As a function it takes a single parameter,\n\t\t *   the JSON returned from the server, which can be manipulated as\n\t\t *   required, with the returned value being that used by DataTables as the\n\t\t *   data source for the table. This supersedes `sAjaxDataProp` from\n\t\t *   DataTables 1.9-.\n\t\t *\n\t\t * * `success` - Should not be overridden it is used internally in\n\t\t *   DataTables. To manipulate / transform the data returned by the server\n\t\t *   use `ajax.dataSrc`, or use `ajax` as a function (see below).\n\t\t *\n\t\t * `function`\n\t\t * ----------\n\t\t *\n\t\t * As a function, making the Ajax call is left up to yourself allowing\n\t\t * complete control of the Ajax request. Indeed, if desired, a method other\n\t\t * than Ajax could be used to obtain the required data, such as Web storage\n\t\t * or an AIR database.\n\t\t *\n\t\t * The function is given four parameters and no return is required. The\n\t\t * parameters are:\n\t\t *\n\t\t * 1. _object_ - Data to send to the server\n\t\t * 2. _function_ - Callback function that must be executed when the required\n\t\t *    data has been obtained. That data should be passed into the callback\n\t\t *    as the only parameter\n\t\t * 3. _object_ - DataTables settings object for the table\n\t\t *\n\t\t * Note that this supersedes `fnServerData` from DataTables 1.9-.\n\t\t *\n\t\t *  @type string|object|function\n\t\t *  @default null\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.ajax\n\t\t *  @since 1.10.0\n\t\t *\n\t\t * @example\n\t\t *   // Get JSON data from a file via Ajax.\n\t\t *   // Note DataTables expects data in the form `{ data: [ ...data... ] }` by default).\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": \"data.json\"\n\t\t *   } );\n\t\t *\n\t\t * @example\n\t\t *   // Get JSON data from a file via Ajax, using `dataSrc` to change\n\t\t *   // `data` to `tableData` (i.e. `{ tableData: [ ...data... ] }`)\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": {\n\t\t *       \"url\": \"data.json\",\n\t\t *       \"dataSrc\": \"tableData\"\n\t\t *     }\n\t\t *   } );\n\t\t *\n\t\t * @example\n\t\t *   // Get JSON data from a file via Ajax, using `dataSrc` to read data\n\t\t *   // from a plain array rather than an array in an object\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": {\n\t\t *       \"url\": \"data.json\",\n\t\t *       \"dataSrc\": \"\"\n\t\t *     }\n\t\t *   } );\n\t\t *\n\t\t * @example\n\t\t *   // Manipulate the data returned from the server - add a link to data\n\t\t *   // (note this can, should, be done using `render` for the column - this\n\t\t *   // is just a simple example of how the data can be manipulated).\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": {\n\t\t *       \"url\": \"data.json\",\n\t\t *       \"dataSrc\": function ( json ) {\n\t\t *         for ( var i=0, ien=json.length ; i<ien ; i++ ) {\n\t\t *           json[i][0] = '<a href=\"/message/'+json[i][0]+'>View message</a>';\n\t\t *         }\n\t\t *         return json;\n\t\t *       }\n\t\t *     }\n\t\t *   } );\n\t\t *\n\t\t * @example\n\t\t *   // Add data to the request\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": {\n\t\t *       \"url\": \"data.json\",\n\t\t *       \"data\": function ( d ) {\n\t\t *         return {\n\t\t *           \"extra_search\": $('#extra').val()\n\t\t *         };\n\t\t *       }\n\t\t *     }\n\t\t *   } );\n\t\t *\n\t\t * @example\n\t\t *   // Send request as POST\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": {\n\t\t *       \"url\": \"data.json\",\n\t\t *       \"type\": \"POST\"\n\t\t *     }\n\t\t *   } );\n\t\t *\n\t\t * @example\n\t\t *   // Get the data from localStorage (could interface with a form for\n\t\t *   // adding, editing and removing rows).\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": function (data, callback, settings) {\n\t\t *       callback(\n\t\t *         JSON.parse( localStorage.getItem('dataTablesData') )\n\t\t *       );\n\t\t *     }\n\t\t *   } );\n\t\t */\n\t\t\"ajax\": null,\n\n\n\t\t/**\n\t\t * This parameter allows you to readily specify the entries in the length drop\n\t\t * down menu that DataTables shows when pagination is enabled. It can be\n\t\t * either a 1D array of options which will be used for both the displayed\n\t\t * option and the value, or a 2D array which will use the array in the first\n\t\t * position as the value, and the array in the second position as the\n\t\t * displayed options (useful for language strings such as 'All').\n\t\t *\n\t\t * Note that the `pageLength` property will be automatically set to the\n\t\t * first value given in this array, unless `pageLength` is also provided.\n\t\t *  @type array\n\t\t *  @default [ 10, 25, 50, 100 ]\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.lengthMenu\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"lengthMenu\": [[10, 25, 50, -1], [10, 25, 50, \"All\"]]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"aLengthMenu\": [ 10, 25, 50, 100 ],\n\n\n\t\t/**\n\t\t * The `columns` option in the initialisation parameter allows you to define\n\t\t * details about the way individual columns behave. For a full list of\n\t\t * column options that can be set, please see\n\t\t * {@link DataTable.defaults.column}. Note that if you use `columns` to\n\t\t * define your columns, you must have an entry in the array for every single\n\t\t * column that you have in your table (these can be null if you don't which\n\t\t * to specify any options).\n\t\t *  @member\n\t\t *\n\t\t *  @name DataTable.defaults.column\n\t\t */\n\t\t\"aoColumns\": null,\n\n\t\t/**\n\t\t * Very similar to `columns`, `columnDefs` allows you to target a specific\n\t\t * column, multiple columns, or all columns, using the `targets` property of\n\t\t * each object in the array. This allows great flexibility when creating\n\t\t * tables, as the `columnDefs` arrays can be of any length, targeting the\n\t\t * columns you specifically want. `columnDefs` may use any of the column\n\t\t * options available: {@link DataTable.defaults.column}, but it _must_\n\t\t * have `targets` defined in each object in the array. Values in the `targets`\n\t\t * array may be:\n\t\t *   <ul>\n\t\t *     <li>a string - class name will be matched on the TH for the column</li>\n\t\t *     <li>0 or a positive integer - column index counting from the left</li>\n\t\t *     <li>a negative integer - column index counting from the right</li>\n\t\t *     <li>the string \"_all\" - all columns (i.e. assign a default)</li>\n\t\t *   </ul>\n\t\t *  @member\n\t\t *\n\t\t *  @name DataTable.defaults.columnDefs\n\t\t */\n\t\t\"aoColumnDefs\": null,\n\n\n\t\t/**\n\t\t * Basically the same as `search`, this parameter defines the individual column\n\t\t * filtering state at initialisation time. The array must be of the same size\n\t\t * as the number of columns, and each element be an object with the parameters\n\t\t * `search` and `escapeRegex` (the latter is optional). 'null' is also\n\t\t * accepted and the default will be used.\n\t\t *  @type array\n\t\t *  @default []\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.searchCols\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"searchCols\": [\n\t\t *          null,\n\t\t *          { \"search\": \"My filter\" },\n\t\t *          null,\n\t\t *          { \"search\": \"^[0-9]\", \"escapeRegex\": false }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"aoSearchCols\": [],\n\n\n\t\t/**\n\t\t * An array of CSS classes that should be applied to displayed rows. This\n\t\t * array may be of any length, and DataTables will apply each class\n\t\t * sequentially, looping when required.\n\t\t *  @type array\n\t\t *  @default null <i>Will take the values determined by the `oClasses.stripe*`\n\t\t *    options</i>\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.stripeClasses\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stripeClasses\": [ 'strip1', 'strip2', 'strip3' ]\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"asStripeClasses\": null,\n\n\n\t\t/**\n\t\t * Enable or disable automatic column width calculation. This can be disabled\n\t\t * as an optimisation (it takes some time to calculate the widths) if the\n\t\t * tables widths are passed in using `columns`.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.autoWidth\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"autoWidth\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bAutoWidth\": true,\n\n\n\t\t/**\n\t\t * Deferred rendering can provide DataTables with a huge speed boost when you\n\t\t * are using an Ajax or JS data source for the table. This option, when set to\n\t\t * true, will cause DataTables to defer the creation of the table elements for\n\t\t * each row until they are needed for a draw - saving a significant amount of\n\t\t * time.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.deferRender\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"ajax\": \"sources/arrays.txt\",\n\t\t *        \"deferRender\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bDeferRender\": false,\n\n\n\t\t/**\n\t\t * Replace a DataTable which matches the given selector and replace it with\n\t\t * one which has the properties of the new initialisation object passed. If no\n\t\t * table matches the selector, then the new DataTable will be constructed as\n\t\t * per normal.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.destroy\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"srollY\": \"200px\",\n\t\t *        \"paginate\": false\n\t\t *      } );\n\t\t *\n\t\t *      // Some time later....\n\t\t *      $('#example').dataTable( {\n\t\t *        \"filter\": false,\n\t\t *        \"destroy\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bDestroy\": false,\n\n\n\t\t/**\n\t\t * Enable or disable filtering of data. Filtering in DataTables is \"smart\" in\n\t\t * that it allows the end user to input multiple words (space separated) and\n\t\t * will match a row containing those words, even if not in the order that was\n\t\t * specified (this allow matching across multiple columns). Note that if you\n\t\t * wish to use filtering in DataTables this must remain 'true' - to remove the\n\t\t * default filtering input box and retain filtering abilities, please use\n\t\t * {@link DataTable.defaults.dom}.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.searching\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"searching\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bFilter\": true,\n\n\n\t\t/**\n\t\t * Enable or disable the table information display. This shows information\n\t\t * about the data that is currently visible on the page, including information\n\t\t * about filtered data if that action is being performed.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.info\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"info\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bInfo\": true,\n\n\n\t\t/**\n\t\t * Enable jQuery UI ThemeRoller support (required as ThemeRoller requires some\n\t\t * slightly different and additional mark-up from what DataTables has\n\t\t * traditionally used).\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.jQueryUI\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"jQueryUI\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bJQueryUI\": false,\n\n\n\t\t/**\n\t\t * Allows the end user to select the size of a formatted page from a select\n\t\t * menu (sizes are 10, 25, 50 and 100). Requires pagination (`paginate`).\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.lengthChange\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"lengthChange\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bLengthChange\": true,\n\n\n\t\t/**\n\t\t * Enable or disable pagination.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.paging\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"paging\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bPaginate\": true,\n\n\n\t\t/**\n\t\t * Enable or disable the display of a 'processing' indicator when the table is\n\t\t * being processed (e.g. a sort). This is particularly useful for tables with\n\t\t * large amounts of data where it can take a noticeable amount of time to sort\n\t\t * the entries.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.processing\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"processing\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bProcessing\": false,\n\n\n\t\t/**\n\t\t * Retrieve the DataTables object for the given selector. Note that if the\n\t\t * table has already been initialised, this parameter will cause DataTables\n\t\t * to simply return the object that has already been set up - it will not take\n\t\t * account of any changes you might have made to the initialisation object\n\t\t * passed to DataTables (setting this parameter to true is an acknowledgement\n\t\t * that you understand this). `destroy` can be used to reinitialise a table if\n\t\t * you need.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.retrieve\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      initTable();\n\t\t *      tableActions();\n\t\t *    } );\n\t\t *\n\t\t *    function initTable ()\n\t\t *    {\n\t\t *      return $('#example').dataTable( {\n\t\t *        \"scrollY\": \"200px\",\n\t\t *        \"paginate\": false,\n\t\t *        \"retrieve\": true\n\t\t *      } );\n\t\t *    }\n\t\t *\n\t\t *    function tableActions ()\n\t\t *    {\n\t\t *      var table = initTable();\n\t\t *      // perform API operations with oTable\n\t\t *    }\n\t\t */\n\t\t\"bRetrieve\": false,\n\n\n\t\t/**\n\t\t * When vertical (y) scrolling is enabled, DataTables will force the height of\n\t\t * the table's viewport to the given height at all times (useful for layout).\n\t\t * However, this can look odd when filtering data down to a small data set,\n\t\t * and the footer is left \"floating\" further down. This parameter (when\n\t\t * enabled) will cause DataTables to collapse the table's viewport down when\n\t\t * the result set will fit within the given Y height.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.scrollCollapse\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"scrollY\": \"200\",\n\t\t *        \"scrollCollapse\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bScrollCollapse\": false,\n\n\n\t\t/**\n\t\t * Configure DataTables to use server-side processing. Note that the\n\t\t * `ajax` parameter must also be given in order to give DataTables a\n\t\t * source to obtain the required data for each draw.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @dtopt Server-side\n\t\t *  @name DataTable.defaults.serverSide\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"serverSide\": true,\n\t\t *        \"ajax\": \"xhr.php\"\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bServerSide\": false,\n\n\n\t\t/**\n\t\t * Enable or disable sorting of columns. Sorting of individual columns can be\n\t\t * disabled by the `sortable` option for each column.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.ordering\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"ordering\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bSort\": true,\n\n\n\t\t/**\n\t\t * Enable or display DataTables' ability to sort multiple columns at the\n\t\t * same time (activated by shift-click by the user).\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.orderMulti\n\t\t *\n\t\t *  @example\n\t\t *    // Disable multiple column sorting ability\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"orderMulti\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bSortMulti\": true,\n\n\n\t\t/**\n\t\t * Allows control over whether DataTables should use the top (true) unique\n\t\t * cell that is found for a single column, or the bottom (false - default).\n\t\t * This is useful when using complex headers.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.orderCellsTop\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"orderCellsTop\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bSortCellsTop\": false,\n\n\n\t\t/**\n\t\t * Enable or disable the addition of the classes `sorting\\_1`, `sorting\\_2` and\n\t\t * `sorting\\_3` to the columns which are currently being sorted on. This is\n\t\t * presented as a feature switch as it can increase processing time (while\n\t\t * classes are removed and added) so for large data sets you might want to\n\t\t * turn this off.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.orderClasses\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"orderClasses\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bSortClasses\": true,\n\n\n\t\t/**\n\t\t * Enable or disable state saving. When enabled HTML5 `localStorage` will be\n\t\t * used to save table display information such as pagination information,\n\t\t * display length, filtering and sorting. As such when the end user reloads\n\t\t * the page the display display will match what thy had previously set up.\n\t\t *\n\t\t * Due to the use of `localStorage` the default state saving is not supported\n\t\t * in IE6 or 7. If state saving is required in those browsers, use\n\t\t * `stateSaveCallback` to provide a storage solution such as cookies.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.stateSave\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bStateSave\": false,\n\n\n\t\t/**\n\t\t * This function is called when a TR element is created (and all TD child\n\t\t * elements have been inserted), or registered if using a DOM source, allowing\n\t\t * manipulation of the TR element (adding classes etc).\n\t\t *  @type function\n\t\t *  @param {node} row \"TR\" element for the current row\n\t\t *  @param {array} data Raw data array for this row\n\t\t *  @param {int} dataIndex The index of this row in the internal aoData array\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.createdRow\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"createdRow\": function( row, data, dataIndex ) {\n\t\t *          // Bold the grade for all 'A' grade browsers\n\t\t *          if ( data[4] == \"A\" )\n\t\t *          {\n\t\t *            $('td:eq(4)', row).html( '<b>A</b>' );\n\t\t *          }\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnCreatedRow\": null,\n\n\n\t\t/**\n\t\t * This function is called on every 'draw' event, and allows you to\n\t\t * dynamically modify any aspect you want about the created DOM.\n\t\t *  @type function\n\t\t *  @param {object} settings DataTables settings object\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.drawCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"drawCallback\": function( settings ) {\n\t\t *          alert( 'DataTables has redrawn the table' );\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnDrawCallback\": null,\n\n\n\t\t/**\n\t\t * Identical to fnHeaderCallback() but for the table footer this function\n\t\t * allows you to modify the table footer on every 'draw' event.\n\t\t *  @type function\n\t\t *  @param {node} foot \"TR\" element for the footer\n\t\t *  @param {array} data Full table data (as derived from the original HTML)\n\t\t *  @param {int} start Index for the current display starting point in the\n\t\t *    display array\n\t\t *  @param {int} end Index for the current display ending point in the\n\t\t *    display array\n\t\t *  @param {array int} display Index array to translate the visual position\n\t\t *    to the full data array\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.footerCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"footerCallback\": function( tfoot, data, start, end, display ) {\n\t\t *          tfoot.getElementsByTagName('th')[0].innerHTML = \"Starting index is \"+start;\n\t\t *        }\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"fnFooterCallback\": null,\n\n\n\t\t/**\n\t\t * When rendering large numbers in the information element for the table\n\t\t * (i.e. \"Showing 1 to 10 of 57 entries\") DataTables will render large numbers\n\t\t * to have a comma separator for the 'thousands' units (e.g. 1 million is\n\t\t * rendered as \"1,000,000\") to help readability for the end user. This\n\t\t * function will override the default method DataTables uses.\n\t\t *  @type function\n\t\t *  @member\n\t\t *  @param {int} toFormat number to be formatted\n\t\t *  @returns {string} formatted string for DataTables to show the number\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.formatNumber\n\t\t *\n\t\t *  @example\n\t\t *    // Format a number using a single quote for the separator (note that\n\t\t *    // this can also be done with the language.infoThousands option)\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"formatNumber\": function ( toFormat ) {\n\t\t *          return toFormat.toString().replace(\n\t\t *            /\\B(?=(\\d{3})+(?!\\d))/g, \"'\"\n\t\t *          );\n\t\t *        };\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnFormatNumber\": function ( toFormat ) {\n\t\t\treturn toFormat.toString().replace(\n\t\t\t\t/\\B(?=(\\d{3})+(?!\\d))/g,\n\t\t\t\tthis.oLanguage.sInfoThousands\n\t\t\t);\n\t\t},\n\n\n\t\t/**\n\t\t * This function is called on every 'draw' event, and allows you to\n\t\t * dynamically modify the header row. This can be used to calculate and\n\t\t * display useful information about the table.\n\t\t *  @type function\n\t\t *  @param {node} head \"TR\" element for the header\n\t\t *  @param {array} data Full table data (as derived from the original HTML)\n\t\t *  @param {int} start Index for the current display starting point in the\n\t\t *    display array\n\t\t *  @param {int} end Index for the current display ending point in the\n\t\t *    display array\n\t\t *  @param {array int} display Index array to translate the visual position\n\t\t *    to the full data array\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.headerCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"fheaderCallback\": function( head, data, start, end, display ) {\n\t\t *          head.getElementsByTagName('th')[0].innerHTML = \"Displaying \"+(end-start)+\" records\";\n\t\t *        }\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"fnHeaderCallback\": null,\n\n\n\t\t/**\n\t\t * The information element can be used to convey information about the current\n\t\t * state of the table. Although the internationalisation options presented by\n\t\t * DataTables are quite capable of dealing with most customisations, there may\n\t\t * be times where you wish to customise the string further. This callback\n\t\t * allows you to do exactly that.\n\t\t *  @type function\n\t\t *  @param {object} oSettings DataTables settings object\n\t\t *  @param {int} start Starting position in data for the draw\n\t\t *  @param {int} end End position in data for the draw\n\t\t *  @param {int} max Total number of rows in the table (regardless of\n\t\t *    filtering)\n\t\t *  @param {int} total Total number of rows in the data set, after filtering\n\t\t *  @param {string} pre The string that DataTables has formatted using it's\n\t\t *    own rules\n\t\t *  @returns {string} The string to be displayed in the information element.\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.infoCallback\n\t\t *\n\t\t *  @example\n\t\t *    $('#example').dataTable( {\n\t\t *      \"infoCallback\": function( settings, start, end, max, total, pre ) {\n\t\t *        return start +\" to \"+ end;\n\t\t *      }\n\t\t *    } );\n\t\t */\n\t\t\"fnInfoCallback\": null,\n\n\n\t\t/**\n\t\t * Called when the table has been initialised. Normally DataTables will\n\t\t * initialise sequentially and there will be no need for this function,\n\t\t * however, this does not hold true when using external language information\n\t\t * since that is obtained using an async XHR call.\n\t\t *  @type function\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @param {object} json The JSON object request from the server - only\n\t\t *    present if client-side Ajax sourced data is used\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.initComplete\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"initComplete\": function(settings, json) {\n\t\t *          alert( 'DataTables has finished its initialisation.' );\n\t\t *        }\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"fnInitComplete\": null,\n\n\n\t\t/**\n\t\t * Called at the very start of each table draw and can be used to cancel the\n\t\t * draw by returning false, any other return (including undefined) results in\n\t\t * the full draw occurring).\n\t\t *  @type function\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @returns {boolean} False will cancel the draw, anything else (including no\n\t\t *    return) will allow it to complete.\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.preDrawCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"preDrawCallback\": function( settings ) {\n\t\t *          if ( $('#test').val() == 1 ) {\n\t\t *            return false;\n\t\t *          }\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnPreDrawCallback\": null,\n\n\n\t\t/**\n\t\t * This function allows you to 'post process' each row after it have been\n\t\t * generated for each table draw, but before it is rendered on screen. This\n\t\t * function might be used for setting the row class name etc.\n\t\t *  @type function\n\t\t *  @param {node} row \"TR\" element for the current row\n\t\t *  @param {array} data Raw data array for this row\n\t\t *  @param {int} displayIndex The display index for the current table draw\n\t\t *  @param {int} displayIndexFull The index of the data in the full list of\n\t\t *    rows (after filtering)\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.rowCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"rowCallback\": function( row, data, displayIndex, displayIndexFull ) {\n\t\t *          // Bold the grade for all 'A' grade browsers\n\t\t *          if ( data[4] == \"A\" ) {\n\t\t *            $('td:eq(4)', row).html( '<b>A</b>' );\n\t\t *          }\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnRowCallback\": null,\n\n\n\t\t/**\n\t\t * __Deprecated__ The functionality provided by this parameter has now been\n\t\t * superseded by that provided through `ajax`, which should be used instead.\n\t\t *\n\t\t * This parameter allows you to override the default function which obtains\n\t\t * the data from the server so something more suitable for your application.\n\t\t * For example you could use POST data, or pull information from a Gears or\n\t\t * AIR database.\n\t\t *  @type function\n\t\t *  @member\n\t\t *  @param {string} source HTTP source to obtain the data from (`ajax`)\n\t\t *  @param {array} data A key/value pair object containing the data to send\n\t\t *    to the server\n\t\t *  @param {function} callback to be called on completion of the data get\n\t\t *    process that will draw the data on the page.\n\t\t *  @param {object} settings DataTables settings object\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @dtopt Server-side\n\t\t *  @name DataTable.defaults.serverData\n\t\t *\n\t\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t\t */\n\t\t\"fnServerData\": null,\n\n\n\t\t/**\n\t\t * __Deprecated__ The functionality provided by this parameter has now been\n\t\t * superseded by that provided through `ajax`, which should be used instead.\n\t\t *\n\t\t *  It is often useful to send extra data to the server when making an Ajax\n\t\t * request - for example custom filtering information, and this callback\n\t\t * function makes it trivial to send extra information to the server. The\n\t\t * passed in parameter is the data set that has been constructed by\n\t\t * DataTables, and you can add to this or modify it as you require.\n\t\t *  @type function\n\t\t *  @param {array} data Data array (array of objects which are name/value\n\t\t *    pairs) that has been constructed by DataTables and will be sent to the\n\t\t *    server. In the case of Ajax sourced data with server-side processing\n\t\t *    this will be an empty array, for server-side processing there will be a\n\t\t *    significant number of parameters!\n\t\t *  @returns {undefined} Ensure that you modify the data array passed in,\n\t\t *    as this is passed by reference.\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @dtopt Server-side\n\t\t *  @name DataTable.defaults.serverParams\n\t\t *\n\t\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t\t */\n\t\t\"fnServerParams\": null,\n\n\n\t\t/**\n\t\t * Load the table state. With this function you can define from where, and how, the\n\t\t * state of a table is loaded. By default DataTables will load from `localStorage`\n\t\t * but you might wish to use a server-side database or cookies.\n\t\t *  @type function\n\t\t *  @member\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @return {object} The DataTables state object to be loaded\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.stateLoadCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true,\n\t\t *        \"stateLoadCallback\": function (settings) {\n\t\t *          var o;\n\t\t *\n\t\t *          // Send an Ajax request to the server to get the data. Note that\n\t\t *          // this is a synchronous request.\n\t\t *          $.ajax( {\n\t\t *            \"url\": \"/state_load\",\n\t\t *            \"async\": false,\n\t\t *            \"dataType\": \"json\",\n\t\t *            \"success\": function (json) {\n\t\t *              o = json;\n\t\t *            }\n\t\t *          } );\n\t\t *\n\t\t *          return o;\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnStateLoadCallback\": function ( settings ) {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(\n\t\t\t\t\tlocalStorage.getItem('DataTables_'+settings.sInstance+'_'+window.location.pathname)\n\t\t\t\t);\n\t\t\t} catch (e) {}\n\t\t},\n\n\n\t\t/**\n\t\t * Callback which allows modification of the saved state prior to loading that state.\n\t\t * This callback is called when the table is loading state from the stored data, but\n\t\t * prior to the settings object being modified by the saved state. Note that for\n\t\t * plug-in authors, you should use the `stateLoadParams` event to load parameters for\n\t\t * a plug-in.\n\t\t *  @type function\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @param {object} data The state object that is to be loaded\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.stateLoadParams\n\t\t *\n\t\t *  @example\n\t\t *    // Remove a saved filter, so filtering is never loaded\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true,\n\t\t *        \"stateLoadParams\": function (settings, data) {\n\t\t *          data.oSearch.sSearch = \"\";\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Disallow state loading by returning false\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true,\n\t\t *        \"stateLoadParams\": function (settings, data) {\n\t\t *          return false;\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnStateLoadParams\": null,\n\n\n\t\t/**\n\t\t * Callback that is called when the state has been loaded from the state saving method\n\t\t * and the DataTables settings object has been modified as a result of the loaded state.\n\t\t *  @type function\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @param {object} data The state object that was loaded\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.stateLoaded\n\t\t *\n\t\t *  @example\n\t\t *    // Show an alert with the filtering value that was saved\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true,\n\t\t *        \"stateLoaded\": function (settings, data) {\n\t\t *          alert( 'Saved filter was: '+data.oSearch.sSearch );\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnStateLoaded\": null,\n\n\n\t\t/**\n\t\t * Save the table state. This function allows you to define where and how the state\n\t\t * information for the table is stored By default DataTables will use `localStorage`\n\t\t * but you might wish to use a server-side database or cookies.\n\t\t *  @type function\n\t\t *  @member\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @param {object} data The state object to be saved\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.stateSaveCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true,\n\t\t *        \"stateSaveCallback\": function (settings, data) {\n\t\t *          // Send an Ajax request to the server with the state object\n\t\t *          $.ajax( {\n\t\t *            \"url\": \"/state_save\",\n\t\t *            \"data\": data,\n\t\t *            \"dataType\": \"json\",\n\t\t *            \"method\": \"POST\"\n\t\t *            \"success\": function () {}\n\t\t *          } );\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnStateSaveCallback\": function ( settings, data ) {\n\t\t\ttry {\n\t\t\t\tlocalStorage.setItem(\n\t\t\t\t\t'DataTables_'+settings.sInstance+'_'+window.location.pathname,\n\t\t\t\t\tJSON.stringify(data)\n\t\t\t\t);\n\t\t\t} catch (e) {}\n\t\t},\n\n\n\t\t/**\n\t\t * Callback which allows modification of the state to be saved. Called when the table\n\t\t * has changed state a new state save is required. This method allows modification of\n\t\t * the state saving object prior to actually doing the save, including addition or\n\t\t * other state properties or modification. Note that for plug-in authors, you should\n\t\t * use the `stateSaveParams` event to save parameters for a plug-in.\n\t\t *  @type function\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @param {object} data The state object to be saved\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.stateSaveParams\n\t\t *\n\t\t *  @example\n\t\t *    // Remove a saved filter, so filtering is never saved\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true,\n\t\t *        \"stateSaveParams\": function (settings, data) {\n\t\t *          data.oSearch.sSearch = \"\";\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnStateSaveParams\": null,\n\n\n\t\t/**\n\t\t * Duration for which the saved state information is considered valid. After this period\n\t\t * has elapsed the state will be returned to the default.\n\t\t * Value is given in seconds.\n\t\t *  @type int\n\t\t *  @default 7200 <i>(2 hours)</i>\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.stateDuration\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateDuration\": 60*60*24; // 1 day\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"iStateDuration\": 7200,\n\n\n\t\t/**\n\t\t * When enabled DataTables will not make a request to the server for the first\n\t\t * page draw - rather it will use the data already on the page (no sorting etc\n\t\t * will be applied to it), thus saving on an XHR at load time. `deferLoading`\n\t\t * is used to indicate that deferred loading is required, but it is also used\n\t\t * to tell DataTables how many records there are in the full table (allowing\n\t\t * the information element and pagination to be displayed correctly). In the case\n\t\t * where a filtering is applied to the table on initial load, this can be\n\t\t * indicated by giving the parameter as an array, where the first element is\n\t\t * the number of records available after filtering and the second element is the\n\t\t * number of records without filtering (allowing the table information element\n\t\t * to be shown correctly).\n\t\t *  @type int | array\n\t\t *  @default null\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.deferLoading\n\t\t *\n\t\t *  @example\n\t\t *    // 57 records available in the table, no filtering applied\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"serverSide\": true,\n\t\t *        \"ajax\": \"scripts/server_processing.php\",\n\t\t *        \"deferLoading\": 57\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // 57 records after filtering, 100 without filtering (an initial filter applied)\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"serverSide\": true,\n\t\t *        \"ajax\": \"scripts/server_processing.php\",\n\t\t *        \"deferLoading\": [ 57, 100 ],\n\t\t *        \"search\": {\n\t\t *          \"search\": \"my_filter\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"iDeferLoading\": null,\n\n\n\t\t/**\n\t\t * Number of rows to display on a single page when using pagination. If\n\t\t * feature enabled (`lengthChange`) then the end user will be able to override\n\t\t * this to a custom setting using a pop-up menu.\n\t\t *  @type int\n\t\t *  @default 10\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.pageLength\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"pageLength\": 50\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"iDisplayLength\": 10,\n\n\n\t\t/**\n\t\t * Define the starting point for data display when using DataTables with\n\t\t * pagination. Note that this parameter is the number of records, rather than\n\t\t * the page number, so if you have 10 records per page and want to start on\n\t\t * the third page, it should be \"20\".\n\t\t *  @type int\n\t\t *  @default 0\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.displayStart\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"displayStart\": 20\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"iDisplayStart\": 0,\n\n\n\t\t/**\n\t\t * By default DataTables allows keyboard navigation of the table (sorting, paging,\n\t\t * and filtering) by adding a `tabindex` attribute to the required elements. This\n\t\t * allows you to tab through the controls and press the enter key to activate them.\n\t\t * The tabindex is default 0, meaning that the tab follows the flow of the document.\n\t\t * You can overrule this using this parameter if you wish. Use a value of -1 to\n\t\t * disable built-in keyboard navigation.\n\t\t *  @type int\n\t\t *  @default 0\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.tabIndex\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"tabIndex\": 1\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"iTabIndex\": 0,\n\n\n\t\t/**\n\t\t * Classes that DataTables assigns to the various components and features\n\t\t * that it adds to the HTML table. This allows classes to be configured\n\t\t * during initialisation in addition to through the static\n\t\t * {@link DataTable.ext.oStdClasses} object).\n\t\t *  @namespace\n\t\t *  @name DataTable.defaults.classes\n\t\t */\n\t\t\"oClasses\": {},\n\n\n\t\t/**\n\t\t * All strings that DataTables uses in the user interface that it creates\n\t\t * are defined in this object, allowing you to modified them individually or\n\t\t * completely replace them all as required.\n\t\t *  @namespace\n\t\t *  @name DataTable.defaults.language\n\t\t */\n\t\t\"oLanguage\": {\n\t\t\t/**\n\t\t\t * Strings that are used for WAI-ARIA labels and controls only (these are not\n\t\t\t * actually visible on the page, but will be read by screenreaders, and thus\n\t\t\t * must be internationalised as well).\n\t\t\t *  @namespace\n\t\t\t *  @name DataTable.defaults.language.aria\n\t\t\t */\n\t\t\t\"oAria\": {\n\t\t\t\t/**\n\t\t\t\t * ARIA label that is added to the table headers when the column may be\n\t\t\t\t * sorted ascending by activing the column (click or return when focused).\n\t\t\t\t * Note that the column header is prefixed to this string.\n\t\t\t\t *  @type string\n\t\t\t\t *  @default : activate to sort column ascending\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.aria.sortAscending\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"aria\": {\n\t\t\t\t *            \"sortAscending\": \" - click/return to sort ascending\"\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\"sSortAscending\": \"：激活排序列升序\",\n\n\t\t\t\t/**\n\t\t\t\t * ARIA label that is added to the table headers when the column may be\n\t\t\t\t * sorted descending by activing the column (click or return when focused).\n\t\t\t\t * Note that the column header is prefixed to this string.\n\t\t\t\t *  @type string\n\t\t\t\t *  @default : activate to sort column ascending\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.aria.sortDescending\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"aria\": {\n\t\t\t\t *            \"sortDescending\": \" - click/return to sort descending\"\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\"sSortDescending\": \"：激活排序列降序\"\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Pagination string used by DataTables for the built-in pagination\n\t\t\t * control types.\n\t\t\t *  @namespace\n\t\t\t *  @name DataTable.defaults.language.paginate\n\t\t\t */\n\t\t\t\"oPaginate\": {\n\t\t\t\t/**\n\t\t\t\t * Text to use when using the 'full_numbers' type of pagination for the\n\t\t\t\t * button to take the user to the first page.\n\t\t\t\t *  @type string\n\t\t\t\t *  @default First\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.paginate.first\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"paginate\": {\n\t\t\t\t *            \"first\": \"First page\"\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\"sFirst\": \"第一页\",\n\n\n\t\t\t\t/**\n\t\t\t\t * Text to use when using the 'full_numbers' type of pagination for the\n\t\t\t\t * button to take the user to the last page.\n\t\t\t\t *  @type string\n\t\t\t\t *  @default Last\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.paginate.last\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"paginate\": {\n\t\t\t\t *            \"last\": \"Last page\"\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\"sLast\": \"最后一页\",\n\n\n\t\t\t\t/**\n\t\t\t\t * Text to use for the 'next' pagination button (to take the user to the\n\t\t\t\t * next page).\n\t\t\t\t *  @type string\n\t\t\t\t *  @default Next\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.paginate.next\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"paginate\": {\n\t\t\t\t *            \"next\": \"Next page\"\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\"sNext\": \"下一页\",\n\n\n\t\t\t\t/**\n\t\t\t\t * Text to use for the 'previous' pagination button (to take the user to\n\t\t\t\t * the previous page).\n\t\t\t\t *  @type string\n\t\t\t\t *  @default Previous\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.paginate.previous\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"paginate\": {\n\t\t\t\t *            \"previous\": \"Previous page\"\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\"sPrevious\": \"上一页\"\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * This string is shown in preference to `zeroRecords` when the table is\n\t\t\t * empty of data (regardless of filtering). Note that this is an optional\n\t\t\t * parameter - if it is not given, the value of `zeroRecords` will be used\n\t\t\t * instead (either the default or given value).\n\t\t\t *  @type string\n\t\t\t *  @default No data available in table\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.emptyTable\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"emptyTable\": \"No data available in table\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sEmptyTable\": \"没有数据\",\n\n\n\t\t\t/**\n\t\t\t * This string gives information to the end user about the information\n\t\t\t * that is current on display on the page. The following tokens can be\n\t\t\t * used in the string and will be dynamically replaced as the table\n\t\t\t * display updates. This tokens can be placed anywhere in the string, or\n\t\t\t * removed as needed by the language requires:\n\t\t\t *\n\t\t\t * * `\\_START\\_` - Display index of the first record on the current page\n\t\t\t * * `\\_END\\_` - Display index of the last record on the current page\n\t\t\t * * `\\_TOTAL\\_` - Number of records in the table after filtering\n\t\t\t * * `\\_MAX\\_` - Number of records in the table without filtering\n\t\t\t * * `\\_PAGE\\_` - Current page number\n\t\t\t * * `\\_PAGES\\_` - Total number of pages of data in the table\n\t\t\t *\n\t\t\t *  @type string\n\t\t\t *  @default Showing _START_ to _END_ of _TOTAL_ entries\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.info\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"info\": \"Showing page _PAGE_ of _PAGES_\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sInfo\": \"显示 _START_ 到 _END_ 项，共 _TOTAL_ 项\",\n\n\n\t\t\t/**\n\t\t\t * Display information string for when the table is empty. Typically the\n\t\t\t * format of this string should match `info`.\n\t\t\t *  @type string\n\t\t\t *  @default Showing 0 to 0 of 0 entries\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.infoEmpty\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"infoEmpty\": \"No entries to show\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sInfoEmpty\": \"显示0项\",\n\n\n\t\t\t/**\n\t\t\t * When a user filters the information in a table, this string is appended\n\t\t\t * to the information (`info`) to give an idea of how strong the filtering\n\t\t\t * is. The variable _MAX_ is dynamically updated.\n\t\t\t *  @type string\n\t\t\t *  @default (filtered from _MAX_ total entries)\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.infoFiltered\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"infoFiltered\": \" - filtering from _MAX_ records\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sInfoFiltered\": \"（从 _MAX_ 中筛选）\",\n\n\n\t\t\t/**\n\t\t\t * If can be useful to append extra information to the info string at times,\n\t\t\t * and this variable does exactly that. This information will be appended to\n\t\t\t * the `info` (`infoEmpty` and `infoFiltered` in whatever combination they are\n\t\t\t * being used) at all times.\n\t\t\t *  @type string\n\t\t\t *  @default <i>Empty string</i>\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.infoPostFix\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"infoPostFix\": \"All records shown are derived from real information.\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sInfoPostFix\": \"\",\n\n\n\t\t\t/**\n\t\t\t * DataTables has a build in number formatter (`formatNumber`) which is used\n\t\t\t * to format large numbers that are used in the table information. By\n\t\t\t * default a comma is used, but this can be trivially changed to any\n\t\t\t * character you wish with this parameter.\n\t\t\t *  @type string\n\t\t\t *  @default ,\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.infoThousands\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"infoThousands\": \"'\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sInfoThousands\": \",\",\n\n\n\t\t\t/**\n\t\t\t * Detail the action that will be taken when the drop down menu for the\n\t\t\t * pagination length option is changed. The '_MENU_' variable is replaced\n\t\t\t * with a default select list of 10, 25, 50 and 100, and can be replaced\n\t\t\t * with a custom select box if required.\n\t\t\t *  @type string\n\t\t\t *  @default Show _MENU_ entries\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.lengthMenu\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Language change only\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"lengthMenu\": \"Display _MENU_ records\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Language and options change\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"lengthMenu\": 'Display <select>'+\n\t\t\t *            '<option value=\"10\">10</option>'+\n\t\t\t *            '<option value=\"20\">20</option>'+\n\t\t\t *            '<option value=\"30\">30</option>'+\n\t\t\t *            '<option value=\"40\">40</option>'+\n\t\t\t *            '<option value=\"50\">50</option>'+\n\t\t\t *            '<option value=\"-1\">All</option>'+\n\t\t\t *            '</select> records'\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sLengthMenu\": \"显示 _MENU_ entries\",\n\n\n\t\t\t/**\n\t\t\t * When using Ajax sourced data and during the first draw when DataTables is\n\t\t\t * gathering the data, this message is shown in an empty row in the table to\n\t\t\t * indicate to the end user the the data is being loaded. Note that this\n\t\t\t * parameter is not used when loading data by server-side processing, just\n\t\t\t * Ajax sourced data with client-side processing.\n\t\t\t *  @type string\n\t\t\t *  @default Loading...\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.loadingRecords\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"loadingRecords\": \"Please wait - loading...\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sLoadingRecords\": \"加载中…\",\n\n\n\t\t\t/**\n\t\t\t * Text which is displayed when the table is processing a user action\n\t\t\t * (usually a sort command or similar).\n\t\t\t *  @type string\n\t\t\t *  @default Processing...\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.processing\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"processing\": \"DataTables is currently busy\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sProcessing\": \"处理中…\",\n\n\n\t\t\t/**\n\t\t\t * Details the actions that will be taken when the user types into the\n\t\t\t * filtering input text box. The variable \"_INPUT_\", if used in the string,\n\t\t\t * is replaced with the HTML text box for the filtering input allowing\n\t\t\t * control over where it appears in the string. If \"_INPUT_\" is not given\n\t\t\t * then the input box is appended to the string automatically.\n\t\t\t *  @type string\n\t\t\t *  @default Search:\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.search\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Input text box will be appended at the end automatically\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"search\": \"Filter records:\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Specify where the filter should appear\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"search\": \"Apply filter _INPUT_ to table\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sSearch\": \"查找：\",\n\n\n\t\t\t/**\n\t\t\t * All of the language information can be stored in a file on the\n\t\t\t * server-side, which DataTables will look up if this parameter is passed.\n\t\t\t * It must store the URL of the language file, which is in a JSON format,\n\t\t\t * and the object has the same properties as the oLanguage object in the\n\t\t\t * initialiser object (i.e. the above parameters). Please refer to one of\n\t\t\t * the example language files to see how this works in action.\n\t\t\t *  @type string\n\t\t\t *  @default <i>Empty string - i.e. disabled</i>\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.url\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"url\": \"http://www.sprymedia.co.uk/dataTables/lang.txt\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sUrl\": \"\",\n\n\n\t\t\t/**\n\t\t\t * Text shown inside the table records when the is no information to be\n\t\t\t * displayed after filtering. `emptyTable` is shown when there is simply no\n\t\t\t * information in the table at all (regardless of filtering).\n\t\t\t *  @type string\n\t\t\t *  @default No matching records found\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.zeroRecords\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"zeroRecords\": \"No records to display\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sZeroRecords\": \"没有找到符合条件的记录\"\n\t\t},\n\n\n\t\t/**\n\t\t * This parameter allows you to have define the global filtering state at\n\t\t * initialisation time. As an object the `search` parameter must be\n\t\t * defined, but all other parameters are optional. When `regex` is true,\n\t\t * the search string will be treated as a regular expression, when false\n\t\t * (default) it will be treated as a straight string. When `smart`\n\t\t * DataTables will use it's smart filtering methods (to word match at\n\t\t * any point in the data), when false this will not be done.\n\t\t *  @namespace\n\t\t *  @extends DataTable.models.oSearch\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.search\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"search\": {\"search\": \"Initial search\"}\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"oSearch\": $.extend( {}, DataTable.models.oSearch ),\n\n\n\t\t/**\n\t\t * __Deprecated__ The functionality provided by this parameter has now been\n\t\t * superseded by that provided through `ajax`, which should be used instead.\n\t\t *\n\t\t * By default DataTables will look for the property `data` (or `aaData` for\n\t\t * compatibility with DataTables 1.9-) when obtaining data from an Ajax\n\t\t * source or for server-side processing - this parameter allows that\n\t\t * property to be changed. You can use Javascript dotted object notation to\n\t\t * get a data source for multiple levels of nesting.\n\t\t *  @type string\n\t\t *  @default data\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @dtopt Server-side\n\t\t *  @name DataTable.defaults.ajaxDataProp\n\t\t *\n\t\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t\t */\n\t\t\"sAjaxDataProp\": \"data\",\n\n\n\t\t/**\n\t\t * __Deprecated__ The functionality provided by this parameter has now been\n\t\t * superseded by that provided through `ajax`, which should be used instead.\n\t\t *\n\t\t * You can instruct DataTables to load data from an external\n\t\t * source using this parameter (use aData if you want to pass data in you\n\t\t * already have). Simply provide a url a JSON object can be obtained from.\n\t\t *  @type string\n\t\t *  @default null\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @dtopt Server-side\n\t\t *  @name DataTable.defaults.ajaxSource\n\t\t *\n\t\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t\t */\n\t\t\"sAjaxSource\": null,\n\n\n\t\t/**\n\t\t * This initialisation variable allows you to specify exactly where in the\n\t\t * DOM you want DataTables to inject the various controls it adds to the page\n\t\t * (for example you might want the pagination controls at the top of the\n\t\t * table). DIV elements (with or without a custom class) can also be added to\n\t\t * aid styling. The follow syntax is used:\n\t\t *   <ul>\n\t\t *     <li>The following options are allowed:\n\t\t *       <ul>\n\t\t *         <li>'l' - Length changing</li>\n\t\t *         <li>'f' - Filtering input</li>\n\t\t *         <li>'t' - The table!</li>\n\t\t *         <li>'i' - Information</li>\n\t\t *         <li>'p' - Pagination</li>\n\t\t *         <li>'r' - pRocessing</li>\n\t\t *       </ul>\n\t\t *     </li>\n\t\t *     <li>The following constants are allowed:\n\t\t *       <ul>\n\t\t *         <li>'H' - jQueryUI theme \"header\" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li>\n\t\t *         <li>'F' - jQueryUI theme \"footer\" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li>\n\t\t *       </ul>\n\t\t *     </li>\n\t\t *     <li>The following syntax is expected:\n\t\t *       <ul>\n\t\t *         <li>'&lt;' and '&gt;' - div elements</li>\n\t\t *         <li>'&lt;\"class\" and '&gt;' - div with a class</li>\n\t\t *         <li>'&lt;\"#id\" and '&gt;' - div with an ID</li>\n\t\t *       </ul>\n\t\t *     </li>\n\t\t *     <li>Examples:\n\t\t *       <ul>\n\t\t *         <li>'&lt;\"wrapper\"flipt&gt;'</li>\n\t\t *         <li>'&lt;lf&lt;t&gt;ip&gt;'</li>\n\t\t *       </ul>\n\t\t *     </li>\n\t\t *   </ul>\n\t\t *  @type string\n\t\t *  @default lfrtip <i>(when `jQueryUI` is false)</i> <b>or</b>\n\t\t *    <\"H\"lfr>t<\"F\"ip> <i>(when `jQueryUI` is true)</i>\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.dom\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"dom\": '&lt;\"top\"i&gt;rt&lt;\"bottom\"flp&gt;&lt;\"clear\"&gt;'\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sDom\": \"lfrtip\",\n\n\n\t\t/**\n\t\t * DataTables features four different built-in options for the buttons to\n\t\t * display for pagination control:\n\t\t *\n\t\t * * `simple` - 'Previous' and 'Next' buttons only\n\t\t * * 'simple_numbers` - 'Previous' and 'Next' buttons, plus page numbers\n\t\t * * `full` - 'First', 'Previous', 'Next' and 'Last' buttons\n\t\t * * `full_numbers` - 'First', 'Previous', 'Next' and 'Last' buttons, plus\n\t\t *   page numbers\n\t\t *\n\t\t * Further methods can be added using {@link DataTable.ext.oPagination}.\n\t\t *  @type string\n\t\t *  @default simple_numbers\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.pagingType\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"pagingType\": \"full_numbers\"\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"sPaginationType\": \"simple_numbers\",\n\n\n\t\t/**\n\t\t * Enable horizontal scrolling. When a table is too wide to fit into a\n\t\t * certain layout, or you have a large number of columns in the table, you\n\t\t * can enable x-scrolling to show the table in a viewport, which can be\n\t\t * scrolled. This property can be `true` which will allow the table to\n\t\t * scroll horizontally when needed, or any CSS unit, or a number (in which\n\t\t * case it will be treated as a pixel measurement). Setting as simply `true`\n\t\t * is recommended.\n\t\t *  @type boolean|string\n\t\t *  @default <i>blank string - i.e. disabled</i>\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.scrollX\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"scrollX\": true,\n\t\t *        \"scrollCollapse\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sScrollX\": \"\",\n\n\n\t\t/**\n\t\t * This property can be used to force a DataTable to use more width than it\n\t\t * might otherwise do when x-scrolling is enabled. For example if you have a\n\t\t * table which requires to be well spaced, this parameter is useful for\n\t\t * \"over-sizing\" the table, and thus forcing scrolling. This property can by\n\t\t * any CSS unit, or a number (in which case it will be treated as a pixel\n\t\t * measurement).\n\t\t *  @type string\n\t\t *  @default <i>blank string - i.e. disabled</i>\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.scrollXInner\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"scrollX\": \"100%\",\n\t\t *        \"scrollXInner\": \"110%\"\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sScrollXInner\": \"\",\n\n\n\t\t/**\n\t\t * Enable vertical scrolling. Vertical scrolling will constrain the DataTable\n\t\t * to the given height, and enable scrolling for any data which overflows the\n\t\t * current viewport. This can be used as an alternative to paging to display\n\t\t * a lot of data in a small area (although paging and scrolling can both be\n\t\t * enabled at the same time). This property can be any CSS unit, or a number\n\t\t * (in which case it will be treated as a pixel measurement).\n\t\t *  @type string\n\t\t *  @default <i>blank string - i.e. disabled</i>\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.scrollY\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"scrollY\": \"200px\",\n\t\t *        \"paginate\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sScrollY\": \"\",\n\n\n\t\t/**\n\t\t * __Deprecated__ The functionality provided by this parameter has now been\n\t\t * superseded by that provided through `ajax`, which should be used instead.\n\t\t *\n\t\t * Set the HTTP method that is used to make the Ajax call for server-side\n\t\t * processing or Ajax sourced data.\n\t\t *  @type string\n\t\t *  @default GET\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @dtopt Server-side\n\t\t *  @name DataTable.defaults.serverMethod\n\t\t *\n\t\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t\t */\n\t\t\"sServerMethod\": \"GET\",\n\n\n\t\t/**\n\t\t * DataTables makes use of renderers when displaying HTML elements for\n\t\t * a table. These renderers can be added or modified by plug-ins to\n\t\t * generate suitable mark-up for a site. For example the Bootstrap\n\t\t * integration plug-in for DataTables uses a paging button renderer to\n\t\t * display pagination buttons in the mark-up required by Bootstrap.\n\t\t *\n\t\t * For further information about the renderers available see\n\t\t * DataTable.ext.renderer\n\t\t *  @type string|object\n\t\t *  @default null\n\t\t *\n\t\t *  @name DataTable.defaults.renderer\n\t\t *\n\t\t */\n\t\t\"renderer\": null\n\t};\n\n\t_fnHungarianMap( DataTable.defaults );\n\n\n\n\t/*\n\t * Developer note - See note in model.defaults.js about the use of Hungarian\n\t * notation and camel case.\n\t */\n\n\t/**\n\t * Column options that can be given to DataTables at initialisation time.\n\t *  @namespace\n\t */\n\tDataTable.defaults.column = {\n\t\t/**\n\t\t * Define which column(s) an order will occur on for this column. This\n\t\t * allows a column's ordering to take multiple columns into account when\n\t\t * doing a sort or use the data from a different column. For example first\n\t\t * name / last name columns make sense to do a multi-column sort over the\n\t\t * two columns.\n\t\t *  @type array|int\n\t\t *  @default null <i>Takes the value of the column index automatically</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.orderData\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"orderData\": [ 0, 1 ], \"targets\": [ 0 ] },\n\t\t *          { \"orderData\": [ 1, 0 ], \"targets\": [ 1 ] },\n\t\t *          { \"orderData\": 2, \"targets\": [ 2 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"orderData\": [ 0, 1 ] },\n\t\t *          { \"orderData\": [ 1, 0 ] },\n\t\t *          { \"orderData\": 2 },\n\t\t *          null,\n\t\t *          null\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"aDataSort\": null,\n\t\t\"iDataSort\": -1,\n\n\n\t\t/**\n\t\t * You can control the default ordering direction, and even alter the\n\t\t * behaviour of the sort handler (i.e. only allow ascending ordering etc)\n\t\t * using this parameter.\n\t\t *  @type array\n\t\t *  @default [ 'asc', 'desc' ]\n\t\t *\n\t\t *  @name DataTable.defaults.column.orderSequence\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"orderSequence\": [ \"asc\" ], \"targets\": [ 1 ] },\n\t\t *          { \"orderSequence\": [ \"desc\", \"asc\", \"asc\" ], \"targets\": [ 2 ] },\n\t\t *          { \"orderSequence\": [ \"desc\" ], \"targets\": [ 3 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          null,\n\t\t *          { \"orderSequence\": [ \"asc\" ] },\n\t\t *          { \"orderSequence\": [ \"desc\", \"asc\", \"asc\" ] },\n\t\t *          { \"orderSequence\": [ \"desc\" ] },\n\t\t *          null\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"asSorting\": [ 'asc', 'desc' ],\n\n\n\t\t/**\n\t\t * Enable or disable filtering on the data in this column.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @name DataTable.defaults.column.searchable\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"searchable\": false, \"targets\": [ 0 ] }\n\t\t *        ] } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"searchable\": false },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ] } );\n\t\t *    } );\n\t\t */\n\t\t\"bSearchable\": true,\n\n\n\t\t/**\n\t\t * Enable or disable ordering on this column.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @name DataTable.defaults.column.orderable\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"orderable\": false, \"targets\": [ 0 ] }\n\t\t *        ] } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"orderable\": false },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ] } );\n\t\t *    } );\n\t\t */\n\t\t\"bSortable\": true,\n\n\n\t\t/**\n\t\t * Enable or disable the display of this column.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @name DataTable.defaults.column.visible\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"visible\": false, \"targets\": [ 0 ] }\n\t\t *        ] } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"visible\": false },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ] } );\n\t\t *    } );\n\t\t */\n\t\t\"bVisible\": true,\n\n\n\t\t/**\n\t\t * Developer definable function that is called whenever a cell is created (Ajax source,\n\t\t * etc) or processed for input (DOM source). This can be used as a compliment to mRender\n\t\t * allowing you to modify the DOM element (add background colour for example) when the\n\t\t * element is available.\n\t\t *  @type function\n\t\t *  @param {element} td The TD node that has been created\n\t\t *  @param {*} cellData The Data for the cell\n\t\t *  @param {array|object} rowData The data for the whole row\n\t\t *  @param {int} row The row index for the aoData data store\n\t\t *  @param {int} col The column index for aoColumns\n\t\t *\n\t\t *  @name DataTable.defaults.column.createdCell\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [3],\n\t\t *          \"createdCell\": function (td, cellData, rowData, row, col) {\n\t\t *            if ( cellData == \"1.7\" ) {\n\t\t *              $(td).css('color', 'blue')\n\t\t *            }\n\t\t *          }\n\t\t *        } ]\n\t\t *      });\n\t\t *    } );\n\t\t */\n\t\t\"fnCreatedCell\": null,\n\n\n\t\t/**\n\t\t * This parameter has been replaced by `data` in DataTables to ensure naming\n\t\t * consistency. `dataProp` can still be used, as there is backwards\n\t\t * compatibility in DataTables for this option, but it is strongly\n\t\t * recommended that you use `data` in preference to `dataProp`.\n\t\t *  @name DataTable.defaults.column.dataProp\n\t\t */\n\n\n\t\t/**\n\t\t * This property can be used to read data from any data source property,\n\t\t * including deeply nested objects / properties. `data` can be given in a\n\t\t * number of different ways which effect its behaviour:\n\t\t *\n\t\t * * `integer` - treated as an array index for the data source. This is the\n\t\t *   default that DataTables uses (incrementally increased for each column).\n\t\t * * `string` - read an object property from the data source. There are\n\t\t *   three 'special' options that can be used in the string to alter how\n\t\t *   DataTables reads the data from the source object:\n\t\t *    * `.` - Dotted Javascript notation. Just as you use a `.` in\n\t\t *      Javascript to read from nested objects, so to can the options\n\t\t *      specified in `data`. For example: `browser.version` or\n\t\t *      `browser.name`. If your object parameter name contains a period, use\n\t\t *      `\\\\` to escape it - i.e. `first\\\\.name`.\n\t\t *    * `[]` - Array notation. DataTables can automatically combine data\n\t\t *      from and array source, joining the data with the characters provided\n\t\t *      between the two brackets. For example: `name[, ]` would provide a\n\t\t *      comma-space separated list from the source array. If no characters\n\t\t *      are provided between the brackets, the original array source is\n\t\t *      returned.\n\t\t *    * `()` - Function notation. Adding `()` to the end of a parameter will\n\t\t *      execute a function of the name given. For example: `browser()` for a\n\t\t *      simple function on the data source, `browser.version()` for a\n\t\t *      function in a nested property or even `browser().version` to get an\n\t\t *      object property if the function called returns an object. Note that\n\t\t *      function notation is recommended for use in `render` rather than\n\t\t *      `data` as it is much simpler to use as a renderer.\n\t\t * * `null` - use the original data source for the row rather than plucking\n\t\t *   data directly from it. This action has effects on two other\n\t\t *   initialisation options:\n\t\t *    * `defaultContent` - When null is given as the `data` option and\n\t\t *      `defaultContent` is specified for the column, the value defined by\n\t\t *      `defaultContent` will be used for the cell.\n\t\t *    * `render` - When null is used for the `data` option and the `render`\n\t\t *      option is specified for the column, the whole data source for the\n\t\t *      row is used for the renderer.\n\t\t * * `function` - the function given will be executed whenever DataTables\n\t\t *   needs to set or get the data for a cell in the column. The function\n\t\t *   takes three parameters:\n\t\t *    * Parameters:\n\t\t *      * `{array|object}` The data source for the row\n\t\t *      * `{string}` The type call data requested - this will be 'set' when\n\t\t *        setting data or 'filter', 'display', 'type', 'sort' or undefined\n\t\t *        when gathering data. Note that when `undefined` is given for the\n\t\t *        type DataTables expects to get the raw data for the object back<\n\t\t *      * `{*}` Data to set when the second parameter is 'set'.\n\t\t *    * Return:\n\t\t *      * The return value from the function is not required when 'set' is\n\t\t *        the type of call, but otherwise the return is what will be used\n\t\t *        for the data requested.\n\t\t *\n\t\t * Note that `data` is a getter and setter option. If you just require\n\t\t * formatting of data for output, you will likely want to use `render` which\n\t\t * is simply a getter and thus simpler to use.\n\t\t *\n\t\t * Note that prior to DataTables 1.9.2 `data` was called `mDataProp`. The\n\t\t * name change reflects the flexibility of this property and is consistent\n\t\t * with the naming of mRender. If 'mDataProp' is given, then it will still\n\t\t * be used by DataTables, as it automatically maps the old name to the new\n\t\t * if required.\n\t\t *\n\t\t *  @type string|int|function|null\n\t\t *  @default null <i>Use automatically calculated column index</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.data\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Read table data from objects\n\t\t *    // JSON structure for each row:\n\t\t *    //   {\n\t\t *    //      \"engine\": {value},\n\t\t *    //      \"browser\": {value},\n\t\t *    //      \"platform\": {value},\n\t\t *    //      \"version\": {value},\n\t\t *    //      \"grade\": {value}\n\t\t *    //   }\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"ajaxSource\": \"sources/objects.txt\",\n\t\t *        \"columns\": [\n\t\t *          { \"data\": \"engine\" },\n\t\t *          { \"data\": \"browser\" },\n\t\t *          { \"data\": \"platform\" },\n\t\t *          { \"data\": \"version\" },\n\t\t *          { \"data\": \"grade\" }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Read information from deeply nested objects\n\t\t *    // JSON structure for each row:\n\t\t *    //   {\n\t\t *    //      \"engine\": {value},\n\t\t *    //      \"browser\": {value},\n\t\t *    //      \"platform\": {\n\t\t *    //         \"inner\": {value}\n\t\t *    //      },\n\t\t *    //      \"details\": [\n\t\t *    //         {value}, {value}\n\t\t *    //      ]\n\t\t *    //   }\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"ajaxSource\": \"sources/deep.txt\",\n\t\t *        \"columns\": [\n\t\t *          { \"data\": \"engine\" },\n\t\t *          { \"data\": \"browser\" },\n\t\t *          { \"data\": \"platform.inner\" },\n\t\t *          { \"data\": \"platform.details.0\" },\n\t\t *          { \"data\": \"platform.details.1\" }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `data` as a function to provide different information for\n\t\t *    // sorting, filtering and display. In this case, currency (price)\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"data\": function ( source, type, val ) {\n\t\t *            if (type === 'set') {\n\t\t *              source.price = val;\n\t\t *              // Store the computed dislay and filter values for efficiency\n\t\t *              source.price_display = val==\"\" ? \"\" : \"$\"+numberFormat(val);\n\t\t *              source.price_filter  = val==\"\" ? \"\" : \"$\"+numberFormat(val)+\" \"+val;\n\t\t *              return;\n\t\t *            }\n\t\t *            else if (type === 'display') {\n\t\t *              return source.price_display;\n\t\t *            }\n\t\t *            else if (type === 'filter') {\n\t\t *              return source.price_filter;\n\t\t *            }\n\t\t *            // 'sort', 'type' and undefined all just use the integer\n\t\t *            return source.price;\n\t\t *          }\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using default content\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"data\": null,\n\t\t *          \"defaultContent\": \"Click to edit\"\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using array notation - outputting a list from an array\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"data\": \"name[, ]\"\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t */\n\t\t\"mData\": null,\n\n\n\t\t/**\n\t\t * This property is the rendering partner to `data` and it is suggested that\n\t\t * when you want to manipulate data for display (including filtering,\n\t\t * sorting etc) without altering the underlying data for the table, use this\n\t\t * property. `render` can be considered to be the the read only companion to\n\t\t * `data` which is read / write (then as such more complex). Like `data`\n\t\t * this option can be given in a number of different ways to effect its\n\t\t * behaviour:\n\t\t *\n\t\t * * `integer` - treated as an array index for the data source. This is the\n\t\t *   default that DataTables uses (incrementally increased for each column).\n\t\t * * `string` - read an object property from the data source. There are\n\t\t *   three 'special' options that can be used in the string to alter how\n\t\t *   DataTables reads the data from the source object:\n\t\t *    * `.` - Dotted Javascript notation. Just as you use a `.` in\n\t\t *      Javascript to read from nested objects, so to can the options\n\t\t *      specified in `data`. For example: `browser.version` or\n\t\t *      `browser.name`. If your object parameter name contains a period, use\n\t\t *      `\\\\` to escape it - i.e. `first\\\\.name`.\n\t\t *    * `[]` - Array notation. DataTables can automatically combine data\n\t\t *      from and array source, joining the data with the characters provided\n\t\t *      between the two brackets. For example: `name[, ]` would provide a\n\t\t *      comma-space separated list from the source array. If no characters\n\t\t *      are provided between the brackets, the original array source is\n\t\t *      returned.\n\t\t *    * `()` - Function notation. Adding `()` to the end of a parameter will\n\t\t *      execute a function of the name given. For example: `browser()` for a\n\t\t *      simple function on the data source, `browser.version()` for a\n\t\t *      function in a nested property or even `browser().version` to get an\n\t\t *      object property if the function called returns an object.\n\t\t * * `object` - use different data for the different data types requested by\n\t\t *   DataTables ('filter', 'display', 'type' or 'sort'). The property names\n\t\t *   of the object is the data type the property refers to and the value can\n\t\t *   defined using an integer, string or function using the same rules as\n\t\t *   `render` normally does. Note that an `_` option _must_ be specified.\n\t\t *   This is the default value to use if you haven't specified a value for\n\t\t *   the data type requested by DataTables.\n\t\t * * `function` - the function given will be executed whenever DataTables\n\t\t *   needs to set or get the data for a cell in the column. The function\n\t\t *   takes three parameters:\n\t\t *    * Parameters:\n\t\t *      * {array|object} The data source for the row (based on `data`)\n\t\t *      * {string} The type call data requested - this will be 'filter',\n\t\t *        'display', 'type' or 'sort'.\n\t\t *      * {array|object} The full data source for the row (not based on\n\t\t *        `data`)\n\t\t *    * Return:\n\t\t *      * The return value from the function is what will be used for the\n\t\t *        data requested.\n\t\t *\n\t\t *  @type string|int|function|object|null\n\t\t *  @default null Use the data source value.\n\t\t *\n\t\t *  @name DataTable.defaults.column.render\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Create a comma separated list from an array of objects\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"ajaxSource\": \"sources/deep.txt\",\n\t\t *        \"columns\": [\n\t\t *          { \"data\": \"engine\" },\n\t\t *          { \"data\": \"browser\" },\n\t\t *          {\n\t\t *            \"data\": \"platform\",\n\t\t *            \"render\": \"[, ].name\"\n\t\t *          }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Execute a function to obtain data\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"data\": null, // Use the full data source object for the renderer's source\n\t\t *          \"render\": \"browserName()\"\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // As an object, extracting different data for the different types\n\t\t *    // This would be used with a data source such as:\n\t\t *    //   { \"phone\": 5552368, \"phone_filter\": \"5552368 555-2368\", \"phone_display\": \"555-2368\" }\n\t\t *    // Here the `phone` integer is used for sorting and type detection, while `phone_filter`\n\t\t *    // (which has both forms) is used for filtering for if a user inputs either format, while\n\t\t *    // the formatted phone number is the one that is shown in the table.\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"data\": null, // Use the full data source object for the renderer's source\n\t\t *          \"render\": {\n\t\t *            \"_\": \"phone\",\n\t\t *            \"filter\": \"phone_filter\",\n\t\t *            \"display\": \"phone_display\"\n\t\t *          }\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Use as a function to create a link from the data source\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"data\": \"download_link\",\n\t\t *          \"render\": function ( data, type, full ) {\n\t\t *            return '<a href=\"'+data+'\">Download</a>';\n\t\t *          }\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"mRender\": null,\n\n\n\t\t/**\n\t\t * Change the cell type created for the column - either TD cells or TH cells. This\n\t\t * can be useful as TH cells have semantic meaning in the table body, allowing them\n\t\t * to act as a header for a row (you may wish to add scope='row' to the TH elements).\n\t\t *  @type string\n\t\t *  @default td\n\t\t *\n\t\t *  @name DataTable.defaults.column.cellType\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Make the first column use TH cells\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"cellType\": \"th\"\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sCellType\": \"td\",\n\n\n\t\t/**\n\t\t * Class to give to each cell in this column.\n\t\t *  @type string\n\t\t *  @default <i>Empty string</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.class\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"class\": \"my_class\", \"targets\": [ 0 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"class\": \"my_class\" },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sClass\": \"\",\n\n\t\t/**\n\t\t * When DataTables calculates the column widths to assign to each column,\n\t\t * it finds the longest string in each column and then constructs a\n\t\t * temporary table and reads the widths from that. The problem with this\n\t\t * is that \"mmm\" is much wider then \"iiii\", but the latter is a longer\n\t\t * string - thus the calculation can go wrong (doing it properly and putting\n\t\t * it into an DOM object and measuring that is horribly(!) slow). Thus as\n\t\t * a \"work around\" we provide this option. It will append its value to the\n\t\t * text that is found to be the longest string for the column - i.e. padding.\n\t\t * Generally you shouldn't need this!\n\t\t *  @type string\n\t\t *  @default <i>Empty string<i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.contentPadding\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          {\n\t\t *            \"contentPadding\": \"mmm\"\n\t\t *          }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sContentPadding\": \"\",\n\n\n\t\t/**\n\t\t * Allows a default value to be given for a column's data, and will be used\n\t\t * whenever a null data source is encountered (this can be because `data`\n\t\t * is set to null, or because the data source itself is null).\n\t\t *  @type string\n\t\t *  @default null\n\t\t *\n\t\t *  @name DataTable.defaults.column.defaultContent\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          {\n\t\t *            \"data\": null,\n\t\t *            \"defaultContent\": \"Edit\",\n\t\t *            \"targets\": [ -1 ]\n\t\t *          }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          {\n\t\t *            \"data\": null,\n\t\t *            \"defaultContent\": \"Edit\"\n\t\t *          }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sDefaultContent\": null,\n\n\n\t\t/**\n\t\t * This parameter is only used in DataTables' server-side processing. It can\n\t\t * be exceptionally useful to know what columns are being displayed on the\n\t\t * client side, and to map these to database fields. When defined, the names\n\t\t * also allow DataTables to reorder information from the server if it comes\n\t\t * back in an unexpected order (i.e. if you switch your columns around on the\n\t\t * client-side, your server-side code does not also need updating).\n\t\t *  @type string\n\t\t *  @default <i>Empty string</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.name\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"name\": \"engine\", \"targets\": [ 0 ] },\n\t\t *          { \"name\": \"browser\", \"targets\": [ 1 ] },\n\t\t *          { \"name\": \"platform\", \"targets\": [ 2 ] },\n\t\t *          { \"name\": \"version\", \"targets\": [ 3 ] },\n\t\t *          { \"name\": \"grade\", \"targets\": [ 4 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"name\": \"engine\" },\n\t\t *          { \"name\": \"browser\" },\n\t\t *          { \"name\": \"platform\" },\n\t\t *          { \"name\": \"version\" },\n\t\t *          { \"name\": \"grade\" }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sName\": \"\",\n\n\n\t\t/**\n\t\t * Defines a data source type for the ordering which can be used to read\n\t\t * real-time information from the table (updating the internally cached\n\t\t * version) prior to ordering. This allows ordering to occur on user\n\t\t * editable elements such as form inputs.\n\t\t *  @type string\n\t\t *  @default std\n\t\t *\n\t\t *  @name DataTable.defaults.column.orderDataType\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"orderDataType\": \"dom-text\", \"targets\": [ 2, 3 ] },\n\t\t *          { \"type\": \"numeric\", \"targets\": [ 3 ] },\n\t\t *          { \"orderDataType\": \"dom-select\", \"targets\": [ 4 ] },\n\t\t *          { \"orderDataType\": \"dom-checkbox\", \"targets\": [ 5 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          null,\n\t\t *          null,\n\t\t *          { \"orderDataType\": \"dom-text\" },\n\t\t *          { \"orderDataType\": \"dom-text\", \"type\": \"numeric\" },\n\t\t *          { \"orderDataType\": \"dom-select\" },\n\t\t *          { \"orderDataType\": \"dom-checkbox\" }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sSortDataType\": \"std\",\n\n\n\t\t/**\n\t\t * The title of this column.\n\t\t *  @type string\n\t\t *  @default null <i>Derived from the 'TH' value for this column in the\n\t\t *    original HTML table.</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.title\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"title\": \"My column title\", \"targets\": [ 0 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"title\": \"My column title\" },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sTitle\": null,\n\n\n\t\t/**\n\t\t * The type allows you to specify how the data for this column will be\n\t\t * ordered. Four types (string, numeric, date and html (which will strip\n\t\t * HTML tags before ordering)) are currently available. Note that only date\n\t\t * formats understood by Javascript's Date() object will be accepted as type\n\t\t * date. For example: \"Mar 26, 2008 5:03 PM\". May take the values: 'string',\n\t\t * 'numeric', 'date' or 'html' (by default). Further types can be adding\n\t\t * through plug-ins.\n\t\t *  @type string\n\t\t *  @default null <i>Auto-detected from raw data</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.type\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"type\": \"html\", \"targets\": [ 0 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"type\": \"html\" },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sType\": null,\n\n\n\t\t/**\n\t\t * Defining the width of the column, this parameter may take any CSS value\n\t\t * (3em, 20px etc). DataTables applies 'smart' widths to columns which have not\n\t\t * been given a specific width through this interface ensuring that the table\n\t\t * remains readable.\n\t\t *  @type string\n\t\t *  @default null <i>Automatic</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.width\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"width\": \"20%\", \"targets\": [ 0 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"width\": \"20%\" },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sWidth\": null\n\t};\n\n\t_fnHungarianMap( DataTable.defaults.column );\n\n\n\n\t/**\n\t * DataTables settings object - this holds all the information needed for a\n\t * given table, including configuration, data and current application of the\n\t * table options. DataTables does not have a single instance for each DataTable\n\t * with the settings attached to that instance, but rather instances of the\n\t * DataTable \"class\" are created on-the-fly as needed (typically by a\n\t * $().dataTable() call) and the settings object is then applied to that\n\t * instance.\n\t *\n\t * Note that this object is related to {@link DataTable.defaults} but this\n\t * one is the internal data store for DataTables's cache of columns. It should\n\t * NOT be manipulated outside of DataTables. Any configuration should be done\n\t * through the initialisation options.\n\t *  @namespace\n\t *  @todo Really should attach the settings object to individual instances so we\n\t *    don't need to create new instances on each $().dataTable() call (if the\n\t *    table already exists). It would also save passing oSettings around and\n\t *    into every single function. However, this is a very significant\n\t *    architecture change for DataTables and will almost certainly break\n\t *    backwards compatibility with older installations. This is something that\n\t *    will be done in 2.0.\n\t */\n\tDataTable.models.oSettings = {\n\t\t/**\n\t\t * Primary features of DataTables and their enablement state.\n\t\t *  @namespace\n\t\t */\n\t\t\"oFeatures\": {\n\n\t\t\t/**\n\t\t\t * Flag to say if DataTables should automatically try to calculate the\n\t\t\t * optimum table and columns widths (true) or not (false).\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bAutoWidth\": null,\n\n\t\t\t/**\n\t\t\t * Delay the creation of TR and TD elements until they are actually\n\t\t\t * needed by a driven page draw. This can give a significant speed\n\t\t\t * increase for Ajax source and Javascript source data, but makes no\n\t\t\t * difference at all fro DOM and server-side processing tables.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bDeferRender\": null,\n\n\t\t\t/**\n\t\t\t * Enable filtering on the table or not. Note that if this is disabled\n\t\t\t * then there is no filtering at all on the table, including fnFilter.\n\t\t\t * To just remove the filtering input use sDom and remove the 'f' option.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bFilter\": null,\n\n\t\t\t/**\n\t\t\t * Table information element (the 'Showing x of y records' div) enable\n\t\t\t * flag.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bInfo\": null,\n\n\t\t\t/**\n\t\t\t * Present a user control allowing the end user to change the page size\n\t\t\t * when pagination is enabled.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bLengthChange\": null,\n\n\t\t\t/**\n\t\t\t * Pagination enabled or not. Note that if this is disabled then length\n\t\t\t * changing must also be disabled.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bPaginate\": null,\n\n\t\t\t/**\n\t\t\t * Processing indicator enable flag whenever DataTables is enacting a\n\t\t\t * user request - typically an Ajax request for server-side processing.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bProcessing\": null,\n\n\t\t\t/**\n\t\t\t * Server-side processing enabled flag - when enabled DataTables will\n\t\t\t * get all data from the server for every draw - there is no filtering,\n\t\t\t * sorting or paging done on the client-side.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bServerSide\": null,\n\n\t\t\t/**\n\t\t\t * Sorting enablement flag.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bSort\": null,\n\n\t\t\t/**\n\t\t\t * Multi-column sorting\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bSortMulti\": null,\n\n\t\t\t/**\n\t\t\t * Apply a class to the columns which are being sorted to provide a\n\t\t\t * visual highlight or not. This can slow things down when enabled since\n\t\t\t * there is a lot of DOM interaction.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bSortClasses\": null,\n\n\t\t\t/**\n\t\t\t * State saving enablement flag.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bStateSave\": null\n\t\t},\n\n\n\t\t/**\n\t\t * Scrolling settings for a table.\n\t\t *  @namespace\n\t\t */\n\t\t\"oScroll\": {\n\t\t\t/**\n\t\t\t * When the table is shorter in height than sScrollY, collapse the\n\t\t\t * table container down to the height of the table (when true).\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bCollapse\": null,\n\n\t\t\t/**\n\t\t\t * Width of the scrollbar for the web-browser's platform. Calculated\n\t\t\t * during table initialisation.\n\t\t\t *  @type int\n\t\t\t *  @default 0\n\t\t\t */\n\t\t\t\"iBarWidth\": 0,\n\n\t\t\t/**\n\t\t\t * Viewport width for horizontal scrolling. Horizontal scrolling is\n\t\t\t * disabled if an empty string.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type string\n\t\t\t */\n\t\t\t\"sX\": null,\n\n\t\t\t/**\n\t\t\t * Width to expand the table to when using x-scrolling. Typically you\n\t\t\t * should not need to use this.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type string\n\t\t\t *  @deprecated\n\t\t\t */\n\t\t\t\"sXInner\": null,\n\n\t\t\t/**\n\t\t\t * Viewport height for vertical scrolling. Vertical scrolling is disabled\n\t\t\t * if an empty string.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type string\n\t\t\t */\n\t\t\t\"sY\": null\n\t\t},\n\n\t\t/**\n\t\t * Language information for the table.\n\t\t *  @namespace\n\t\t *  @extends DataTable.defaults.oLanguage\n\t\t */\n\t\t\"oLanguage\": {\n\t\t\t/**\n\t\t\t * Information callback function. See\n\t\t\t * {@link DataTable.defaults.fnInfoCallback}\n\t\t\t *  @type function\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"fnInfoCallback\": null\n\t\t},\n\n\t\t/**\n\t\t * Browser support parameters\n\t\t *  @namespace\n\t\t */\n\t\t\"oBrowser\": {\n\t\t\t/**\n\t\t\t * Indicate if the browser incorrectly calculates width:100% inside a\n\t\t\t * scrolling element (IE6/7)\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t */\n\t\t\t\"bScrollOversize\": false,\n\n\t\t\t/**\n\t\t\t * Determine if the vertical scrollbar is on the right or left of the\n\t\t\t * scrolling container - needed for rtl language layout, although not\n\t\t\t * all browsers move the scrollbar (Safari).\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t */\n\t\t\t\"bScrollbarLeft\": false\n\t\t},\n\n\n\t\t\"ajax\": null,\n\n\n\t\t/**\n\t\t * Array referencing the nodes which are used for the features. The\n\t\t * parameters of this object match what is allowed by sDom - i.e.\n\t\t *   <ul>\n\t\t *     <li>'l' - Length changing</li>\n\t\t *     <li>'f' - Filtering input</li>\n\t\t *     <li>'t' - The table!</li>\n\t\t *     <li>'i' - Information</li>\n\t\t *     <li>'p' - Pagination</li>\n\t\t *     <li>'r' - pRocessing</li>\n\t\t *   </ul>\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aanFeatures\": [],\n\n\t\t/**\n\t\t * Store data information - see {@link DataTable.models.oRow} for detailed\n\t\t * information.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoData\": [],\n\n\t\t/**\n\t\t * Array of indexes which are in the current display (after filtering etc)\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aiDisplay\": [],\n\n\t\t/**\n\t\t * Array of indexes for display - no filtering\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aiDisplayMaster\": [],\n\n\t\t/**\n\t\t * Store information about each column that is in use\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoColumns\": [],\n\n\t\t/**\n\t\t * Store information about the table's header\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoHeader\": [],\n\n\t\t/**\n\t\t * Store information about the table's footer\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoFooter\": [],\n\n\t\t/**\n\t\t * Store the applied global search information in case we want to force a\n\t\t * research or compare the old search to a new one.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @namespace\n\t\t *  @extends DataTable.models.oSearch\n\t\t */\n\t\t\"oPreviousSearch\": {},\n\n\t\t/**\n\t\t * Store the applied search for each column - see\n\t\t * {@link DataTable.models.oSearch} for the format that is used for the\n\t\t * filtering information for each column.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoPreSearchCols\": [],\n\n\t\t/**\n\t\t * Sorting that is applied to the table. Note that the inner arrays are\n\t\t * used in the following manner:\n\t\t * <ul>\n\t\t *   <li>Index 0 - column number</li>\n\t\t *   <li>Index 1 - current sorting direction</li>\n\t\t * </ul>\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type array\n\t\t *  @todo These inner arrays should really be objects\n\t\t */\n\t\t\"aaSorting\": null,\n\n\t\t/**\n\t\t * Sorting that is always applied to the table (i.e. prefixed in front of\n\t\t * aaSorting).\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aaSortingFixed\": [],\n\n\t\t/**\n\t\t * Classes to use for the striping of a table.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"asStripeClasses\": null,\n\n\t\t/**\n\t\t * If restoring a table - we should restore its striping classes as well\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"asDestroyStripes\": [],\n\n\t\t/**\n\t\t * If restoring a table - we should restore its width\n\t\t *  @type int\n\t\t *  @default 0\n\t\t */\n\t\t\"sDestroyWidth\": 0,\n\n\t\t/**\n\t\t * Callback functions array for every time a row is inserted (i.e. on a draw).\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoRowCallback\": [],\n\n\t\t/**\n\t\t * Callback functions for the header on each draw.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoHeaderCallback\": [],\n\n\t\t/**\n\t\t * Callback function for the footer on each draw.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoFooterCallback\": [],\n\n\t\t/**\n\t\t * Array of callback functions for draw callback functions\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoDrawCallback\": [],\n\n\t\t/**\n\t\t * Array of callback functions for row created function\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoRowCreatedCallback\": [],\n\n\t\t/**\n\t\t * Callback functions for just before the table is redrawn. A return of\n\t\t * false will be used to cancel the draw.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoPreDrawCallback\": [],\n\n\t\t/**\n\t\t * Callback functions for when the table has been initialised.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoInitComplete\": [],\n\n\n\t\t/**\n\t\t * Callbacks for modifying the settings to be stored for state saving, prior to\n\t\t * saving state.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoStateSaveParams\": [],\n\n\t\t/**\n\t\t * Callbacks for modifying the settings that have been stored for state saving\n\t\t * prior to using the stored values to restore the state.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoStateLoadParams\": [],\n\n\t\t/**\n\t\t * Callbacks for operating on the settings object once the saved state has been\n\t\t * loaded\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoStateLoaded\": [],\n\n\t\t/**\n\t\t * Cache the table ID for quick access\n\t\t *  @type string\n\t\t *  @default <i>Empty string</i>\n\t\t */\n\t\t\"sTableId\": \"\",\n\n\t\t/**\n\t\t * The TABLE node for the main table\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTable\": null,\n\n\t\t/**\n\t\t * Permanent ref to the thead element\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTHead\": null,\n\n\t\t/**\n\t\t * Permanent ref to the tfoot element - if it exists\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTFoot\": null,\n\n\t\t/**\n\t\t * Permanent ref to the tbody element\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTBody\": null,\n\n\t\t/**\n\t\t * Cache the wrapper node (contains all DataTables controlled elements)\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTableWrapper\": null,\n\n\t\t/**\n\t\t * Indicate if when using server-side processing the loading of data\n\t\t * should be deferred until the second draw.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bDeferLoading\": false,\n\n\t\t/**\n\t\t * Indicate if all required information has been read in\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bInitialised\": false,\n\n\t\t/**\n\t\t * Information about open rows. Each object in the array has the parameters\n\t\t * 'nTr' and 'nParent'\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoOpenRows\": [],\n\n\t\t/**\n\t\t * Dictate the positioning of DataTables' control elements - see\n\t\t * {@link DataTable.model.oInit.sDom}.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sDom\": null,\n\n\t\t/**\n\t\t * Which type of pagination should be used.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t *  @default two_button\n\t\t */\n\t\t\"sPaginationType\": \"two_button\",\n\n\t\t/**\n\t\t * The state duration (for `stateSave`) in seconds.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type int\n\t\t *  @default 0\n\t\t */\n\t\t\"iStateDuration\": 0,\n\n\t\t/**\n\t\t * Array of callback functions for state saving. Each array element is an\n\t\t * object with the following parameters:\n\t\t *   <ul>\n\t\t *     <li>function:fn - function to call. Takes two parameters, oSettings\n\t\t *       and the JSON string to save that has been thus far created. Returns\n\t\t *       a JSON string to be inserted into a json object\n\t\t *       (i.e. '\"param\": [ 0, 1, 2]')</li>\n\t\t *     <li>string:sName - name of callback</li>\n\t\t *   </ul>\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoStateSave\": [],\n\n\t\t/**\n\t\t * Array of callback functions for state loading. Each array element is an\n\t\t * object with the following parameters:\n\t\t *   <ul>\n\t\t *     <li>function:fn - function to call. Takes two parameters, oSettings\n\t\t *       and the object stored. May return false to cancel state loading</li>\n\t\t *     <li>string:sName - name of callback</li>\n\t\t *   </ul>\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoStateLoad\": [],\n\n\t\t/**\n\t\t * State that was loaded. Useful for back reference\n\t\t *  @type object\n\t\t *  @default null\n\t\t */\n\t\t\"oLoadedState\": null,\n\n\t\t/**\n\t\t * Source url for AJAX data for the table.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sAjaxSource\": null,\n\n\t\t/**\n\t\t * Property from a given object from which to read the table data from. This\n\t\t * can be an empty string (when not server-side processing), in which case\n\t\t * it is  assumed an an array is given directly.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t */\n\t\t\"sAjaxDataProp\": null,\n\n\t\t/**\n\t\t * Note if draw should be blocked while getting data\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t */\n\t\t\"bAjaxDataGet\": true,\n\n\t\t/**\n\t\t * The last jQuery XHR object that was used for server-side data gathering.\n\t\t * This can be used for working with the XHR information in one of the\n\t\t * callbacks\n\t\t *  @type object\n\t\t *  @default null\n\t\t */\n\t\t\"jqXHR\": null,\n\n\t\t/**\n\t\t * JSON returned from the server in the last Ajax request\n\t\t *  @type object\n\t\t *  @default undefined\n\t\t */\n\t\t\"json\": undefined,\n\n\t\t/**\n\t\t * Function to get the server-side data.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type function\n\t\t */\n\t\t\"fnServerData\": null,\n\n\t\t/**\n\t\t * Functions which are called prior to sending an Ajax request so extra\n\t\t * parameters can easily be sent to the server\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoServerParams\": [],\n\n\t\t/**\n\t\t * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if\n\t\t * required).\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t */\n\t\t\"sServerMethod\": null,\n\n\t\t/**\n\t\t * Format numbers for display.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type function\n\t\t */\n\t\t\"fnFormatNumber\": null,\n\n\t\t/**\n\t\t * List of options that can be used for the user selectable length menu.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aLengthMenu\": null,\n\n\t\t/**\n\t\t * Counter for the draws that the table does. Also used as a tracker for\n\t\t * server-side processing\n\t\t *  @type int\n\t\t *  @default 0\n\t\t */\n\t\t\"iDraw\": 0,\n\n\t\t/**\n\t\t * Indicate if a redraw is being done - useful for Ajax\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bDrawing\": false,\n\n\t\t/**\n\t\t * Draw index (iDraw) of the last error when parsing the returned data\n\t\t *  @type int\n\t\t *  @default -1\n\t\t */\n\t\t\"iDrawError\": -1,\n\n\t\t/**\n\t\t * Paging display length\n\t\t *  @type int\n\t\t *  @default 10\n\t\t */\n\t\t\"_iDisplayLength\": 10,\n\n\t\t/**\n\t\t * Paging start point - aiDisplay index\n\t\t *  @type int\n\t\t *  @default 0\n\t\t */\n\t\t\"_iDisplayStart\": 0,\n\n\t\t/**\n\t\t * Server-side processing - number of records in the result set\n\t\t * (i.e. before filtering), Use fnRecordsTotal rather than\n\t\t * this property to get the value of the number of records, regardless of\n\t\t * the server-side processing setting.\n\t\t *  @type int\n\t\t *  @default 0\n\t\t *  @private\n\t\t */\n\t\t\"_iRecordsTotal\": 0,\n\n\t\t/**\n\t\t * Server-side processing - number of records in the current display set\n\t\t * (i.e. after filtering). Use fnRecordsDisplay rather than\n\t\t * this property to get the value of the number of records, regardless of\n\t\t * the server-side processing setting.\n\t\t *  @type boolean\n\t\t *  @default 0\n\t\t *  @private\n\t\t */\n\t\t\"_iRecordsDisplay\": 0,\n\n\t\t/**\n\t\t * Flag to indicate if jQuery UI marking and classes should be used.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bJUI\": null,\n\n\t\t/**\n\t\t * The classes to use for the table\n\t\t *  @type object\n\t\t *  @default {}\n\t\t */\n\t\t\"oClasses\": {},\n\n\t\t/**\n\t\t * Flag attached to the settings object so you can check in the draw\n\t\t * callback if filtering has been done in the draw. Deprecated in favour of\n\t\t * events.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *  @deprecated\n\t\t */\n\t\t\"bFiltered\": false,\n\n\t\t/**\n\t\t * Flag attached to the settings object so you can check in the draw\n\t\t * callback if sorting has been done in the draw. Deprecated in favour of\n\t\t * events.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *  @deprecated\n\t\t */\n\t\t\"bSorted\": false,\n\n\t\t/**\n\t\t * Indicate that if multiple rows are in the header and there is more than\n\t\t * one unique cell per column, if the top one (true) or bottom one (false)\n\t\t * should be used for sorting / title by DataTables.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bSortCellsTop\": null,\n\n\t\t/**\n\t\t * Initialisation object that is used for the table\n\t\t *  @type object\n\t\t *  @default null\n\t\t */\n\t\t\"oInit\": null,\n\n\t\t/**\n\t\t * Destroy callback functions - for plug-ins to attach themselves to the\n\t\t * destroy so they can clean up markup and events.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoDestroyCallback\": [],\n\n\n\t\t/**\n\t\t * Get the number of records in the current record set, before filtering\n\t\t *  @type function\n\t\t */\n\t\t\"fnRecordsTotal\": function ()\n\t\t{\n\t\t\treturn _fnDataSource( this ) == 'ssp' ?\n\t\t\t\tthis._iRecordsTotal * 1 :\n\t\t\t\tthis.aiDisplayMaster.length;\n\t\t},\n\n\t\t/**\n\t\t * Get the number of records in the current record set, after filtering\n\t\t *  @type function\n\t\t */\n\t\t\"fnRecordsDisplay\": function ()\n\t\t{\n\t\t\treturn _fnDataSource( this ) == 'ssp' ?\n\t\t\t\tthis._iRecordsDisplay * 1 :\n\t\t\t\tthis.aiDisplay.length;\n\t\t},\n\n\t\t/**\n\t\t * Get the display end point - aiDisplay index\n\t\t *  @type function\n\t\t */\n\t\t\"fnDisplayEnd\": function ()\n\t\t{\n\t\t\tvar\n\t\t\t\tlen      = this._iDisplayLength,\n\t\t\t\tstart    = this._iDisplayStart,\n\t\t\t\tcalc     = start + len,\n\t\t\t\trecords  = this.aiDisplay.length,\n\t\t\t\tfeatures = this.oFeatures,\n\t\t\t\tpaginate = features.bPaginate;\n\n\t\t\tif ( features.bServerSide ) {\n\t\t\t\treturn paginate === false || len === -1 ?\n\t\t\t\t\tstart + records :\n\t\t\t\t\tMath.min( start+len, this._iRecordsDisplay );\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn ! paginate || calc>records || len===-1 ?\n\t\t\t\t\trecords :\n\t\t\t\t\tcalc;\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The DataTables object for this table\n\t\t *  @type object\n\t\t *  @default null\n\t\t */\n\t\t\"oInstance\": null,\n\n\t\t/**\n\t\t * Unique identifier for each instance of the DataTables object. If there\n\t\t * is an ID on the table node, then it takes that value, otherwise an\n\t\t * incrementing internal counter is used.\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sInstance\": null,\n\n\t\t/**\n\t\t * tabindex attribute value that is added to DataTables control elements, allowing\n\t\t * keyboard navigation of the table and its controls.\n\t\t */\n\t\t\"iTabIndex\": 0,\n\n\t\t/**\n\t\t * DIV container for the footer scrolling table if scrolling\n\t\t */\n\t\t\"nScrollHead\": null,\n\n\t\t/**\n\t\t * DIV container for the footer scrolling table if scrolling\n\t\t */\n\t\t\"nScrollFoot\": null,\n\n\t\t/**\n\t\t * Last applied sort\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aLastSort\": [],\n\n\t\t/**\n\t\t * Stored plug-in instances\n\t\t *  @type object\n\t\t *  @default {}\n\t\t */\n\t\t\"oPlugins\": {}\n\t};\n\n\t/**\n\t * Extension object for DataTables that is used to provide all extension\n\t * options.\n\t *\n\t * Note that the `DataTable.ext` object is available through\n\t * `jQuery.fn.dataTable.ext` where it may be accessed and manipulated. It is\n\t * also aliased to `jQuery.fn.dataTableExt` for historic reasons.\n\t *  @namespace\n\t *  @extends DataTable.models.ext\n\t */\n\n\n\t/**\n\t * DataTables extensions\n\t *\n\t * This namespace acts as a collection area for plug-ins that can be used to\n\t * extend DataTables capabilities. Indeed many of the build in methods\n\t * use this method to provide their own capabilities (sorting methods for\n\t * example).\n\t *\n\t * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy\n\t * reasons\n\t *\n\t *  @namespace\n\t */\n\tDataTable.ext = _ext = {\n\t\t/**\n\t\t * Element class names\n\t\t *\n\t\t *  @type object\n\t\t *  @default {}\n\t\t */\n\t\tclasses: {},\n\n\n\t\t/**\n\t\t * Error reporting.\n\t\t *\n\t\t * How should DataTables report an error. Can take the value 'alert' or\n\t\t * 'throw'\n\t\t *\n\t\t *  @type string\n\t\t *  @default alert\n\t\t */\n\t\terrMode: \"alert\",\n\n\n\t\t/**\n\t\t * Feature plug-ins.\n\t\t *\n\t\t * This is an array of objects which describe the feature plug-ins that are\n\t\t * available to DataTables. These feature plug-ins are then available for\n\t\t * use through the `dom` initialisation option.\n\t\t *\n\t\t * Each feature plug-in is described by an object which must have the\n\t\t * following properties:\n\t\t *\n\t\t * * `fnInit` - function that is used to initialise the plug-in,\n\t\t * * `cFeature` - a character so the feature can be enabled by the `dom`\n\t\t *   instillation option. This is case sensitive.\n\t\t *\n\t\t * The `fnInit` function has the following input parameters:\n\t\t *\n\t\t * 1. `{object}` DataTables settings object: see\n\t\t *    {@link DataTable.models.oSettings}\n\t\t *\n\t\t * And the following return is expected:\n\t\t *\n\t\t * * {node|null} The element which contains your feature. Note that the\n\t\t *   return may also be void if your plug-in does not require to inject any\n\t\t *   DOM elements into DataTables control (`dom`) - for example this might\n\t\t *   be useful when developing a plug-in which allows table control via\n\t\t *   keyboard entry\n\t\t *\n\t\t *  @type array\n\t\t *\n\t\t *  @example\n\t\t *    $.fn.dataTable.ext.features.push( {\n\t\t *      \"fnInit\": function( oSettings ) {\n\t\t *        return new TableTools( { \"oDTSettings\": oSettings } );\n\t\t *      },\n\t\t *      \"cFeature\": \"T\"\n\t\t *    } );\n\t\t */\n\t\tfeature: [],\n\n\n\t\t/**\n\t\t * Row searching.\n\t\t *\n\t\t * This method of searching is complimentary to the default type based\n\t\t * searching, and a lot more comprehensive as it allows you complete control\n\t\t * over the searching logic. Each element in this array is a function\n\t\t * (parameters described below) that is called for every row in the table,\n\t\t * and your logic decides if it should be included in the searching data set\n\t\t * or not.\n\t\t *\n\t\t * Searching functions have the following input parameters:\n\t\t *\n\t\t * 1. `{object}` DataTables settings object: see\n\t\t *    {@link DataTable.models.oSettings}\n\t\t * 2. `{array|object}` Data for the row to be processed (same as the\n\t\t *    original format that was passed in as the data source, or an array\n\t\t *    from a DOM data source\n\t\t * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which\n\t\t *    can be useful to retrieve the `TR` element if you need DOM interaction.\n\t\t *\n\t\t * And the following return is expected:\n\t\t *\n\t\t * * {boolean} Include the row in the searched result set (true) or not\n\t\t *   (false)\n\t\t *\n\t\t * Note that as with the main search ability in DataTables, technically this\n\t\t * is \"filtering\", since it is subtractive. However, for consistency in\n\t\t * naming we call it searching here.\n\t\t *\n\t\t *  @type array\n\t\t *  @default []\n\t\t *\n\t\t *  @example\n\t\t *    // The following example shows custom search being applied to the\n\t\t *    // fourth column (i.e. the data[3] index) based on two input values\n\t\t *    // from the end-user, matching the data in a certain range.\n\t\t *    $.fn.dataTable.ext.search.push(\n\t\t *      function( settings, data, dataIndex ) {\n\t\t *        var min = document.getElementById('min').value * 1;\n\t\t *        var max = document.getElementById('max').value * 1;\n\t\t *        var version = data[3] == \"-\" ? 0 : data[3]*1;\n\t\t *\n\t\t *        if ( min == \"\" && max == \"\" ) {\n\t\t *          return true;\n\t\t *        }\n\t\t *        else if ( min == \"\" && version < max ) {\n\t\t *          return true;\n\t\t *        }\n\t\t *        else if ( min < version && \"\" == max ) {\n\t\t *          return true;\n\t\t *        }\n\t\t *        else if ( min < version && version < max ) {\n\t\t *          return true;\n\t\t *        }\n\t\t *        return false;\n\t\t *      }\n\t\t *    );\n\t\t */\n\t\tsearch: [],\n\n\n\t\t/**\n\t\t * Internal functions, exposed for used in plug-ins.\n\t\t *\n\t\t * Please note that you should not need to use the internal methods for\n\t\t * anything other than a plug-in (and even then, try to avoid if possible).\n\t\t * The internal function may change between releases.\n\t\t *\n\t\t *  @type object\n\t\t *  @default {}\n\t\t */\n\t\tinternal: {},\n\n\n\t\t/**\n\t\t * Legacy configuration options. Enable and disable legacy options that\n\t\t * are available in DataTables.\n\t\t *\n\t\t *  @type object\n\t\t */\n\t\tlegacy: {\n\t\t\t/**\n\t\t\t * Enable / disable DataTables 1.9 compatible server-side processing\n\t\t\t * requests\n\t\t\t *\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t */\n\t\t\tajax: false\n\t\t},\n\n\n\t\t/**\n\t\t * Pagination plug-in methods.\n\t\t *\n\t\t * Each entry in this object is a function and defines which buttons should\n\t\t * be shown by the pagination rendering method that is used for the table:\n\t\t * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the\n\t\t * buttons are displayed in the document, while the functions here tell it\n\t\t * what buttons to display. This is done by returning an array of button\n\t\t * descriptions (what each button will do).\n\t\t *\n\t\t * Pagination types (the four built in options and any additional plug-in\n\t\t * options defined here) can be used through the `paginationType`\n\t\t * initialisation parameter.\n\t\t *\n\t\t * The functions defined take two parameters:\n\t\t *\n\t\t * 1. `{int} page` The current page index\n\t\t * 2. `{int} pages` The number of pages in the table\n\t\t *\n\t\t * Each function is expected to return an array where each element of the\n\t\t * array can be one of:\n\t\t *\n\t\t * * `first` - Jump to first page when activated\n\t\t * * `last` - Jump to last page when activated\n\t\t * * `previous` - Show previous page when activated\n\t\t * * `next` - Show next page when activated\n\t\t * * `{int}` - Show page of the index given\n\t\t * * `{array}` - A nested array containing the above elements to add a\n\t\t *   containing 'DIV' element (might be useful for styling).\n\t\t *\n\t\t * Note that DataTables v1.9- used this object slightly differently whereby\n\t\t * an object with two functions would be defined for each plug-in. That\n\t\t * ability is still supported by DataTables 1.10+ to provide backwards\n\t\t * compatibility, but this option of use is now decremented and no longer\n\t\t * documented in DataTables 1.10+.\n\t\t *\n\t\t *  @type object\n\t\t *  @default {}\n\t\t *\n\t\t *  @example\n\t\t *    // Show previous, next and current page buttons only\n\t\t *    $.fn.dataTableExt.oPagination.current = function ( page, pages ) {\n\t\t *      return [ 'previous', page, 'next' ];\n\t\t *    };\n\t\t */\n\t\tpager: {},\n\n\n\t\trenderer: {\n\t\t\tpageButton: {},\n\t\t\theader: {}\n\t\t},\n\n\n\t\t/**\n\t\t * Ordering plug-ins - custom data source\n\t\t *\n\t\t * The extension options for ordering of data available here is complimentary\n\t\t * to the default type based ordering that DataTables typically uses. It\n\t\t * allows much greater control over the the data that is being used to\n\t\t * order a column, but is necessarily therefore more complex.\n\t\t *\n\t\t * This type of ordering is useful if you want to do ordering based on data\n\t\t * live from the DOM (for example the contents of an 'input' element) rather\n\t\t * than just the static string that DataTables knows of.\n\t\t *\n\t\t * The way these plug-ins work is that you create an array of the values you\n\t\t * wish to be ordering for the column in question and then return that\n\t\t * array. The data in the array much be in the index order of the rows in\n\t\t * the table (not the currently ordering order!). Which order data gathering\n\t\t * function is run here depends on the `dt-init columns.orderDataType`\n\t\t * parameter that is used for the column (if any).\n\t\t *\n\t\t * The functions defined take two parameters:\n\t\t *\n\t\t * 1. `{object}` DataTables settings object: see\n\t\t *    {@link DataTable.models.oSettings}\n\t\t * 2. `{int}` Target column index\n\t\t *\n\t\t * Each function is expected to return an array:\n\t\t *\n\t\t * * `{array}` Data for the column to be ordering upon\n\t\t *\n\t\t *  @type array\n\t\t *\n\t\t *  @example\n\t\t *    // Ordering using `input` node values\n\t\t *    $.fn.dataTable.ext.order['dom-text'] = function  ( settings, col )\n\t\t *    {\n\t\t *      return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) {\n\t\t *        return $('input', td).val();\n\t\t *      } );\n\t\t *    }\n\t\t */\n\t\torder: {},\n\n\n\t\t/**\n\t\t * Type based plug-ins.\n\t\t *\n\t\t * Each column in DataTables has a type assigned to it, either by automatic\n\t\t * detection or by direct assignment using the `type` option for the column.\n\t\t * The type of a column will effect how it is ordering and search (plug-ins\n\t\t * can also make use of the column type if required).\n\t\t *\n\t\t * @namespace\n\t\t */\n\t\ttype: {\n\t\t\t/**\n\t\t\t * Type detection functions.\n\t\t\t *\n\t\t\t * The functions defined in this object are used to automatically detect\n\t\t\t * a column's type, making initialisation of DataTables super easy, even\n\t\t\t * when complex data is in the table.\n\t\t\t *\n\t\t\t * The functions defined take a single parameter:\n\t\t\t *\n\t\t     *  1. `{*}` Data from the column cell to be analysed\n\t\t\t *\n\t\t\t * Each function is expected to return:\n\t\t\t *\n\t\t\t * * `{string|null}` Data type detected, or null if unknown (and thus\n\t\t\t *   pass it on to the other type detection functions.\n\t\t\t *\n\t\t\t *  @type array\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Currency type detection plug-in:\n\t\t\t *    $.fn.dataTable.ext.type.detect.push(\n\t\t\t *      function ( data ) {\n\t\t\t *        // Check the numeric part\n\t\t\t *        if ( ! $.isNumeric( data.substring(1) ) ) {\n\t\t\t *          return null;\n\t\t\t *        }\n\t\t\t *\n\t\t\t *        // Check prefixed by currency\n\t\t\t *        if ( data.charAt(0) == '$' || data.charAt(0) == '&pound;' ) {\n\t\t\t *          return 'currency';\n\t\t\t *        }\n\t\t\t *        return null;\n\t\t\t *      }\n\t\t\t *    );\n\t\t\t */\n\t\t\tdetect: [],\n\n\n\t\t\t/**\n\t\t\t * Type based search formatting.\n\t\t\t *\n\t\t\t * The type based searching functions can be used to pre-format the\n\t\t\t * data to be search on. For example, it can be used to strip HTML\n\t\t\t * tags or to de-format telephone numbers for numeric only searching.\n\t\t\t *\n\t\t\t * Note that is a search is not defined for a column of a given type,\n\t\t\t * no search formatting will be performed.\n\t\t\t *\n\t\t\t * Pre-processing of searching data plug-ins - When you assign the sType\n\t\t\t * for a column (or have it automatically detected for you by DataTables\n\t\t\t * or a type detection plug-in), you will typically be using this for\n\t\t\t * custom sorting, but it can also be used to provide custom searching\n\t\t\t * by allowing you to pre-processing the data and returning the data in\n\t\t\t * the format that should be searched upon. This is done by adding\n\t\t\t * functions this object with a parameter name which matches the sType\n\t\t\t * for that target column. This is the corollary of <i>afnSortData</i>\n\t\t\t * for searching data.\n\t\t\t *\n\t\t\t * The functions defined take a single parameter:\n\t\t\t *\n\t\t     *  1. `{*}` Data from the column cell to be prepared for searching\n\t\t\t *\n\t\t\t * Each function is expected to return:\n\t\t\t *\n\t\t\t * * `{string|null}` Formatted string that will be used for the searching.\n\t\t\t *\n\t\t\t *  @type object\n\t\t\t *  @default {}\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) {\n\t\t\t *      return d.replace(/\\n/g,\" \").replace( /<.*?>/g, \"\" );\n\t\t\t *    }\n\t\t\t */\n\t\t\tsearch: {},\n\n\n\t\t\t/**\n\t\t\t * Type based ordering.\n\t\t\t *\n\t\t\t * The column type tells DataTables what ordering to apply to the table\n\t\t\t * when a column is sorted upon. The order for each type that is defined,\n\t\t\t * is defined by the functions available in this object.\n\t\t\t *\n\t\t\t * Each ordering option can be described by three properties added to\n\t\t\t * this object:\n\t\t\t *\n\t\t\t * * `{type}-pre` - Pre-formatting function\n\t\t\t * * `{type}-asc` - Ascending order function\n\t\t\t * * `{type}-desc` - Descending order function\n\t\t\t *\n\t\t\t * All three can be used together, only `{type}-pre` or only\n\t\t\t * `{type}-asc` and `{type}-desc` together. It is generally recommended\n\t\t\t * that only `{type}-pre` is used, as this provides the optimal\n\t\t\t * implementation in terms of speed, although the others are provided\n\t\t\t * for compatibility with existing Javascript sort functions.\n\t\t\t *\n\t\t\t * `{type}-pre`: Functions defined take a single parameter:\n\t\t\t *\n\t\t     *  1. `{*}` Data from the column cell to be prepared for ordering\n\t\t\t *\n\t\t\t * And return:\n\t\t\t *\n\t\t\t * * `{*}` Data to be sorted upon\n\t\t\t *\n\t\t\t * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort\n\t\t\t * functions, taking two parameters:\n\t\t\t *\n\t\t     *  1. `{*}` Data to compare to the second parameter\n\t\t     *  2. `{*}` Data to compare to the first parameter\n\t\t\t *\n\t\t\t * And returning:\n\t\t\t *\n\t\t\t * * `{*}` Ordering match: <0 if first parameter should be sorted lower\n\t\t\t *   than the second parameter, ===0 if the two parameters are equal and\n\t\t\t *   >0 if the first parameter should be sorted height than the second\n\t\t\t *   parameter.\n\t\t\t *\n\t\t\t *  @type object\n\t\t\t *  @default {}\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Numeric ordering of formatted numbers with a pre-formatter\n\t\t\t *    $.extend( $.fn.dataTable.ext.type.order, {\n\t\t\t *      \"string-pre\": function(x) {\n\t\t\t *        a = (a === \"-\" || a === \"\") ? 0 : a.replace( /[^\\d\\-\\.]/g, \"\" );\n\t\t\t *        return parseFloat( a );\n\t\t\t *      }\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Case-sensitive string ordering, with no pre-formatting method\n\t\t\t *    $.extend( $.fn.dataTable.ext.order, {\n\t\t\t *      \"string-case-asc\": function(x,y) {\n\t\t\t *        return ((x < y) ? -1 : ((x > y) ? 1 : 0));\n\t\t\t *      },\n\t\t\t *      \"string-case-desc\": function(x,y) {\n\t\t\t *        return ((x < y) ? 1 : ((x > y) ? -1 : 0));\n\t\t\t *      }\n\t\t\t *    } );\n\t\t\t */\n\t\t\torder: {}\n\t\t},\n\n\t\t/**\n\t\t * Unique DataTables instance counter\n\t\t *\n\t\t * @type int\n\t\t * @private\n\t\t */\n\t\t_unique: 0,\n\n\n\t\t//\n\t\t// Depreciated\n\t\t// The following properties are retained for backwards compatiblity only.\n\t\t// The should not be used in new projects and will be removed in a future\n\t\t// version\n\t\t//\n\n\t\t/**\n\t\t * Version check function.\n\t\t *  @type function\n\t\t *  @depreciated Since 1.10\n\t\t */\n\t\tfnVersionCheck: DataTable.fnVersionCheck,\n\n\n\t\t/**\n\t\t * Index for what 'this' index API functions should use\n\t\t *  @type int\n\t\t *  @deprecated Since v1.10\n\t\t */\n\t\tiApiIndex: 0,\n\n\n\t\t/**\n\t\t * jQuery UI class container\n\t\t *  @type object\n\t\t *  @deprecated Since v1.10\n\t\t */\n\t\toJUIClasses: {},\n\n\n\t\t/**\n\t\t * Software version\n\t\t *  @type string\n\t\t *  @deprecated Since v1.10\n\t\t */\n\t\tsVersion: DataTable.version\n\t};\n\n\n\t//\n\t// Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts\n\t//\n\t$.extend( _ext, {\n\t\tafnFiltering: _ext.filter,\n\t\taTypes:       _ext.type.detect,\n\t\tofnSearch:    _ext.type.search,\n\t\toSort:        _ext.type.order,\n\t\tafnSortData:  _ext.order,\n\t\taoFeatures:   _ext.feature,\n\t\toApi:         _ext.internal,\n\t\toStdClasses:  _ext.classes,\n\t\toPagination:  _ext.pager\n\t} );\n\n\n\t$.extend( DataTable.ext.classes, {\n\t\t\"sTable\": \"dataTable\",\n\t\t\"sNoFooter\": \"no-footer\",\n\n\t\t/* Paging buttons */\n\t\t\"sPageButton\": \"paginate_button\",\n\t\t\"sPageButtonActive\": \"current\",\n\t\t\"sPageButtonDisabled\": \"disabled\",\n\n\t\t/* Striping classes */\n\t\t\"sStripeOdd\": \"odd\",\n\t\t\"sStripeEven\": \"even\",\n\n\t\t/* Empty row */\n\t\t\"sRowEmpty\": \"dataTables_empty\",\n\n\t\t/* Features */\n\t\t\"sWrapper\": \"dataTables_wrapper\",\n\t\t\"sFilter\": \"dataTables_filter\",\n\t\t\"sInfo\": \"dataTables_info\",\n\t\t\"sPaging\": \"dataTables_paginate paging_\", /* Note that the type is postfixed */\n\t\t\"sLength\": \"dataTables_length\",\n\t\t\"sProcessing\": \"dataTables_processing\",\n\n\t\t/* Sorting */\n\t\t\"sSortAsc\": \"sorting_asc\",\n\t\t\"sSortDesc\": \"sorting_desc\",\n\t\t\"sSortable\": \"sorting\", /* Sortable in both directions */\n\t\t\"sSortableAsc\": \"sorting_asc_disabled\",\n\t\t\"sSortableDesc\": \"sorting_desc_disabled\",\n\t\t\"sSortableNone\": \"sorting_disabled\",\n\t\t\"sSortColumn\": \"sorting_\", /* Note that an int is postfixed for the sorting order */\n\n\t\t/* Filtering */\n\t\t\"sFilterInput\": \"\",\n\n\t\t/* Page length */\n\t\t\"sLengthSelect\": \"\",\n\n\t\t/* Scrolling */\n\t\t\"sScrollWrapper\": \"dataTables_scroll\",\n\t\t\"sScrollHead\": \"dataTables_scrollHead\",\n\t\t\"sScrollHeadInner\": \"dataTables_scrollHeadInner\",\n\t\t\"sScrollBody\": \"dataTables_scrollBody\",\n\t\t\"sScrollFoot\": \"dataTables_scrollFoot\",\n\t\t\"sScrollFootInner\": \"dataTables_scrollFootInner\",\n\n\t\t/* Misc */\n\t\t\"sHeaderTH\": \"\",\n\t\t\"sFooterTH\": \"\",\n\n\t\t// Deprecated\n\t\t\"sSortJUIAsc\": \"\",\n\t\t\"sSortJUIDesc\": \"\",\n\t\t\"sSortJUI\": \"\",\n\t\t\"sSortJUIAscAllowed\": \"\",\n\t\t\"sSortJUIDescAllowed\": \"\",\n\t\t\"sSortJUIWrapper\": \"\",\n\t\t\"sSortIcon\": \"\",\n\t\t\"sJUIHeader\": \"\",\n\t\t\"sJUIFooter\": \"\"\n\t} );\n\n\n\t(function() {\n\n\t// Reused strings for better compression. Closure compiler appears to have a\n\t// weird edge case where it is trying to expand strings rather than use the\n\t// variable version. This results in about 200 bytes being added, for very\n\t// little preference benefit since it this run on script load only.\n\tvar _empty = '';\n\t_empty = '';\n\n\tvar _stateDefault = _empty + 'ui-state-default';\n\tvar _sortIcon     = _empty + 'css_right ui-icon ui-icon-';\n\tvar _headerFooter = _empty + 'fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix';\n\n\t$.extend( DataTable.ext.oJUIClasses, DataTable.ext.classes, {\n\t\t/* Full numbers paging buttons */\n\t\t\"sPageButton\":         \"fg-button ui-button \"+_stateDefault,\n\t\t\"sPageButtonActive\":   \"ui-state-disabled\",\n\t\t\"sPageButtonDisabled\": \"ui-state-disabled\",\n\n\t\t/* Features */\n\t\t\"sPaging\": \"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi \"+\n\t\t\t\"ui-buttonset-multi paging_\", /* Note that the type is postfixed */\n\n\t\t/* Sorting */\n\t\t\"sSortAsc\":            _stateDefault+\" sorting_asc\",\n\t\t\"sSortDesc\":           _stateDefault+\" sorting_desc\",\n\t\t\"sSortable\":           _stateDefault+\" sorting\",\n\t\t\"sSortableAsc\":        _stateDefault+\" sorting_asc_disabled\",\n\t\t\"sSortableDesc\":       _stateDefault+\" sorting_desc_disabled\",\n\t\t\"sSortableNone\":       _stateDefault+\" sorting_disabled\",\n\t\t\"sSortJUIAsc\":         _sortIcon+\"triangle-1-n\",\n\t\t\"sSortJUIDesc\":        _sortIcon+\"triangle-1-s\",\n\t\t\"sSortJUI\":            _sortIcon+\"carat-2-n-s\",\n\t\t\"sSortJUIAscAllowed\":  _sortIcon+\"carat-1-n\",\n\t\t\"sSortJUIDescAllowed\": _sortIcon+\"carat-1-s\",\n\t\t\"sSortJUIWrapper\":     \"DataTables_sort_wrapper\",\n\t\t\"sSortIcon\":           \"DataTables_sort_icon\",\n\n\t\t/* Scrolling */\n\t\t\"sScrollHead\": \"dataTables_scrollHead \"+_stateDefault,\n\t\t\"sScrollFoot\": \"dataTables_scrollFoot \"+_stateDefault,\n\n\t\t/* Misc */\n\t\t\"sHeaderTH\":  _stateDefault,\n\t\t\"sFooterTH\":  _stateDefault,\n\t\t\"sJUIHeader\": _headerFooter+\" ui-corner-tl ui-corner-tr\",\n\t\t\"sJUIFooter\": _headerFooter+\" ui-corner-bl ui-corner-br\"\n\t} );\n\n\t}());\n\n\n\n\tvar extPagination = DataTable.ext.pager;\n\n\tfunction _numbers ( page, pages ) {\n\t\tvar\n\t\t\tnumbers = [],\n\t\t\tbuttons = extPagination.numbers_length,\n\t\t\thalf = Math.floor( buttons / 2 ),\n\t\t\ti = 1;\n\n\t\tif ( pages <= buttons ) {\n\t\t\tnumbers = _range( 0, pages );\n\t\t}\n\t\telse if ( page <= half ) {\n\t\t\tnumbers = _range( 0, buttons-2 );\n\t\t\tnumbers.push( 'ellipsis' );\n\t\t\tnumbers.push( pages-1 );\n\t\t}\n\t\telse if ( page >= pages - 1 - half ) {\n\t\t\tnumbers = _range( pages-(buttons-2), pages );\n\t\t\tnumbers.splice( 0, 0, 'ellipsis' ); // no unshift in ie6\n\t\t\tnumbers.splice( 0, 0, 0 );\n\t\t}\n\t\telse {\n\t\t\tnumbers = _range( page-1, page+2 );\n\t\t\tnumbers.push( 'ellipsis' );\n\t\t\tnumbers.push( pages-1 );\n\t\t\tnumbers.splice( 0, 0, 'ellipsis' );\n\t\t\tnumbers.splice( 0, 0, 0 );\n\t\t}\n\n\t\tnumbers.DT_el = 'span';\n\t\treturn numbers;\n\t}\n\n\n\t$.extend( extPagination, {\n\t\tsimple: function ( page, pages ) {\n\t\t\treturn [ 'previous', 'next' ];\n\t\t},\n\n\t\tfull: function ( page, pages ) {\n\t\t\treturn [  'first', 'previous', 'next', 'last' ];\n\t\t},\n\n\t\tsimple_numbers: function ( page, pages ) {\n\t\t\treturn [ 'previous', _numbers(page, pages), 'next' ];\n\t\t},\n\n\t\tfull_numbers: function ( page, pages ) {\n\t\t\treturn [ 'first', 'previous', _numbers(page, pages), 'next', 'last' ];\n\t\t},\n\n\t\t// For testing and plug-ins to use\n\t\t_numbers: _numbers,\n\t\tnumbers_length: 7\n\t} );\n\n\n\t$.extend( true, DataTable.ext.renderer, {\n\t\tpageButton: {\n\t\t\t_: function ( settings, host, idx, buttons, page, pages ) {\n\t\t\t\tvar classes = settings.oClasses;\n\t\t\t\tvar lang = settings.oLanguage.oPaginate;\n\t\t\t\tvar btnDisplay, btnClass;\n\n\t\t\t\tvar attach = function( container, buttons ) {\n\t\t\t\t\tvar i, ien, node, button;\n\t\t\t\t\tvar clickHandler = function ( e ) {\n\t\t\t\t\t\t_fnPageChange( settings, e.data.action, true );\n\t\t\t\t\t};\n\n\t\t\t\t\tfor ( i=0, ien=buttons.length ; i<ien ; i++ ) {\n\t\t\t\t\t\tbutton = buttons[i];\n\n\t\t\t\t\t\tif ( $.isArray( button ) ) {\n\t\t\t\t\t\t\tvar inner = $( '<'+(button.DT_el || 'div')+'/>' )\n\t\t\t\t\t\t\t\t.appendTo( container );\n\t\t\t\t\t\t\tattach( inner, button );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tbtnDisplay = '';\n\t\t\t\t\t\t\tbtnClass = '';\n\n\t\t\t\t\t\t\tswitch ( button ) {\n\t\t\t\t\t\t\t\tcase 'ellipsis':\n\t\t\t\t\t\t\t\t\tcontainer.append('<span>&hellip;</span>');\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 'first':\n\t\t\t\t\t\t\t\t\tbtnDisplay = lang.sFirst;\n\t\t\t\t\t\t\t\t\tbtnClass = button + (page > 0 ?\n\t\t\t\t\t\t\t\t\t\t'' : ' '+classes.sPageButtonDisabled);\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 'previous':\n\t\t\t\t\t\t\t\t\tbtnDisplay = lang.sPrevious;\n\t\t\t\t\t\t\t\t\tbtnClass = button + (page > 0 ?\n\t\t\t\t\t\t\t\t\t\t'' : ' '+classes.sPageButtonDisabled);\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 'next':\n\t\t\t\t\t\t\t\t\tbtnDisplay = lang.sNext;\n\t\t\t\t\t\t\t\t\tbtnClass = button + (page < pages-1 ?\n\t\t\t\t\t\t\t\t\t\t'' : ' '+classes.sPageButtonDisabled);\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 'last':\n\t\t\t\t\t\t\t\t\tbtnDisplay = lang.sLast;\n\t\t\t\t\t\t\t\t\tbtnClass = button + (page < pages-1 ?\n\t\t\t\t\t\t\t\t\t\t'' : ' '+classes.sPageButtonDisabled);\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tbtnDisplay = button + 1;\n\t\t\t\t\t\t\t\t\tbtnClass = page === button ?\n\t\t\t\t\t\t\t\t\t\tclasses.sPageButtonActive : '';\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( btnDisplay ) {\n\t\t\t\t\t\t\t\tnode = $('<a>', {\n\t\t\t\t\t\t\t\t\t\t'class': classes.sPageButton+' '+btnClass,\n\t\t\t\t\t\t\t\t\t\t'aria-controls': settings.sTableId,\n\t\t\t\t\t\t\t\t\t\t'tabindex': settings.iTabIndex,\n\t\t\t\t\t\t\t\t\t\t'id': idx === 0 && typeof button === 'string' ?\n\t\t\t\t\t\t\t\t\t\t\tsettings.sTableId +'_'+ button :\n\t\t\t\t\t\t\t\t\t\t\tnull\n\t\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t\t\t.html( btnDisplay )\n\t\t\t\t\t\t\t\t\t.appendTo( container );\n\n\t\t\t\t\t\t\t\t_fnBindAction(\n\t\t\t\t\t\t\t\t\tnode, {action: button}, clickHandler\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\tattach( $(host).empty(), buttons );\n\t\t\t}\n\t\t}\n\t} );\n\n\n\n\tvar __numericReplace = function ( d, re1, re2 ) {\n\t\tif ( !d || d === '-' ) {\n\t\t\treturn -Infinity;\n\t\t}\n\n\t\tif ( d.replace ) {\n\t\t\tif ( re1 ) {\n\t\t\t\td = d.replace( re1, '' );\n\t\t\t}\n\n\t\t\tif ( re2 ) {\n\t\t\t\td = d.replace( re2, '' );\n\t\t\t}\n\t\t}\n\n\t\treturn d * 1;\n\t};\n\n\n\t$.extend( DataTable.ext.type.order, {\n\t\t// Dates\n\t\t\"date-pre\": function ( d )\n\t\t{\n\t\t\treturn Date.parse( d ) || 0;\n\t\t},\n\n\t\t// Plain numbers\n\t\t\"numeric-pre\": function ( d )\n\t\t{\n\t\t\treturn __numericReplace( d );\n\t\t},\n\n\t\t// Formatted numbers\n\t\t\"numeric-fmt-pre\": function ( d )\n\t\t{\n\t\t\treturn __numericReplace( d, _re_formatted_numeric );\n\t\t},\n\n\t\t// HTML numeric\n\t\t\"html-numeric-pre\": function ( d )\n\t\t{\n\t\t\treturn __numericReplace( d, _re_html );\n\t\t},\n\n\t\t// HTML numeric, formatted\n\t\t\"html-numeric-fmt-pre\": function ( d )\n\t\t{\n\t\t\treturn __numericReplace( d, _re_html, _re_formatted_numeric );\n\t\t},\n\n\t\t// html\n\t\t\"html-pre\": function ( a )\n\t\t{\n\t\t\treturn a.replace ?\n\t\t\t\ta.replace( /<.*?>/g, \"\" ).toLowerCase() :\n\t\t\t\ta+'';\n\t\t},\n\n\t\t// string\n\t\t\"string-pre\": function ( a )\n\t\t{\n\t\t\treturn typeof a === 'string' ?\n\t\t\t\ta.toLowerCase() :\n\t\t\t\t! a || ! a.toString ?\n\t\t\t\t\t'' :\n\t\t\t\t\ta.toString();\n\t\t},\n\n\t\t// string-asc and -desc are retained only for compatibility with the old\n\t\t// sort methods\n\t\t\"string-asc\": function ( x, y )\n\t\t{\n\t\t\treturn ((x < y) ? -1 : ((x > y) ? 1 : 0));\n\t\t},\n\n\t\t\"string-desc\": function ( x, y )\n\t\t{\n\t\t\treturn ((x < y) ? 1 : ((x > y) ? -1 : 0));\n\t\t}\n\t} );\n\n\n\t// Built in type detection. See model.ext.aTypes for information about\n\t// what is required from this methods.\n\t$.extend( DataTable.ext.type.detect, [\n\t\t// Plain numbers - first since V8 detects some plain numbers as dates\n\t\t// e.g. Date.parse('55') (but not all, e.g. Date.parse('22')...).\n\t\tfunction ( d )\n\t\t{\n\t\t\treturn _isNumber( d ) ? 'numeric' : null;\n\t\t},\n\n\t\t// Dates (only those recognised by the browser's Date.parse)\n\t\tfunction ( d )\n\t\t{\n\t\t\t// V8 will remove any unknown characters at the start of the expression,\n\t\t\t// leading to false matches such as `$245.12` being a valid date. See\n\t\t\t// forum thread 18941 for detail.\n\t\t\tif ( d && ! _re_date_start.test(d) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tvar parsed = Date.parse(d);\n\t\t\treturn (parsed !== null && !isNaN(parsed)) || _empty(d) ? 'date' : null;\n\t\t},\n\n\t\t// Formatted numbers\n\t\tfunction ( d )\n\t\t{\n\t\t\treturn _isNumber( d, true ) ? 'numeric-fmt' : null;\n\t\t},\n\n\t\t// HTML numeric\n\t\tfunction ( d )\n\t\t{\n\t\t\treturn _htmlNumeric( d ) ? 'html-numeric' : null;\n\t\t},\n\n\t\t// HTML numeric, formatted\n\t\tfunction ( d )\n\t\t{\n\t\t\treturn _htmlNumeric( d, true ) ? 'html-numeric-fmt' : null;\n\t\t},\n\n\t\t// HTML (this is strict checking - there much be html)\n\t\tfunction ( d )\n\t\t{\n\t\t\treturn _empty( d ) || (typeof d === 'string' && d.indexOf('<') !== -1) ?\n\t\t\t\t'html' : null;\n\t\t}\n\t] );\n\n\n\n\t// Filter formatting functions. See model.ext.ofnSearch for information about\n\t// what is required from these methods.\n\n\n\t$.extend( DataTable.ext.type.search, {\n\t\thtml: function ( data ) {\n\t\t\treturn _empty(data) ?\n\t\t\t\t'' :\n\t\t\t\ttypeof data === 'string' ?\n\t\t\t\t\tdata\n\t\t\t\t\t\t.replace( _re_new_lines, \" \" )\n\t\t\t\t\t\t.replace( _re_html, \"\" ) :\n\t\t\t\t\t'';\n\t\t},\n\n\t\tstring: function ( data ) {\n\t\t\treturn _empty(data) ?\n\t\t\t\t'' :\n\t\t\t\ttypeof data === 'string' ?\n\t\t\t\t\tdata.replace( _re_new_lines, \" \" ) :\n\t\t\t\t\tdata;\n\t\t}\n\t} );\n\n\n\n\t$.extend( true, DataTable.ext.renderer, {\n\t\theader: {\n\t\t\t_: function ( settings, cell, column, idx, classes ) {\n\t\t\t\t// No additional mark-up required\n\n\t\t\t\t// Attach a sort listener to update on sort\n\t\t\t\t$(settings.nTable).on( 'order.dt', function ( e, settings, sorting, columns ) {\n\t\t\t\t\tcell\n\t\t\t\t\t\t.removeClass(\n\t\t\t\t\t\t\tcolumn.sSortingClass +' '+\n\t\t\t\t\t\t\tclasses.sSortAsc +' '+\n\t\t\t\t\t\t\tclasses.sSortDesc\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.addClass( columns[ idx ] == 'asc' ?\n\t\t\t\t\t\t\tclasses.sSortAsc : columns[ idx ] == 'desc' ?\n\t\t\t\t\t\t\t\tclasses.sSortDesc :\n\t\t\t\t\t\t\t\tcolumn.sSortingClass\n\t\t\t\t\t\t);\n\t\t\t\t} );\n\t\t\t},\n\n\t\t\tjqueryui: function ( settings, cell, column, idx, classes ) {\n\t\t\t\t$('<div/>')\n\t\t\t\t\t.addClass( classes.sSortJUIWrapper )\n\t\t\t\t\t.append( cell.contents() )\n\t\t\t\t\t.append( $('<span/>')\n\t\t\t\t\t\t.addClass( classes.sSortIcon+' '+column.sSortingClassJUI )\n\t\t\t\t\t)\n\t\t\t\t\t.appendTo( cell );\n\n\t\t\t\t// Attach a sort listener to update on sort\n\t\t\t\t$(settings.nTable).on( 'order.dt', function ( e, settings, sorting, columns ) {\n\t\t\t\t\tcell\n\t\t\t\t\t\t.removeClass( classes.sSortAsc +\" \"+classes.sSortDesc )\n\t\t\t\t\t\t.addClass( columns[ idx ] == 'asc' ?\n\t\t\t\t\t\t\tclasses.sSortAsc : columns[ idx ] == 'desc' ?\n\t\t\t\t\t\t\t\tclasses.sSortDesc :\n\t\t\t\t\t\t\t\tcolumn.sSortingClass\n\t\t\t\t\t\t);\n\n\t\t\t\t\tcell\n\t\t\t\t\t\t.find( 'span' )\n\t\t\t\t\t\t.removeClass(\n\t\t\t\t\t\t\tclasses.sSortJUIAsc +\" \"+\n\t\t\t\t\t\t\tclasses.sSortJUIDesc +\" \"+\n\t\t\t\t\t\t\tclasses.sSortJUI +\" \"+\n\t\t\t\t\t\t\tclasses.sSortJUIAscAllowed +\" \"+\n\t\t\t\t\t\t\tclasses.sSortJUIDescAllowed\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.addClass( columns[ idx ] == 'asc' ?\n\t\t\t\t\t\t\tclasses.sSortJUIAsc : columns[ idx ] == 'desc' ?\n\t\t\t\t\t\t\t\tclasses.sSortJUIDesc :\n\t\t\t\t\t\t\t\tcolumn.sSortingClassJUI\n\t\t\t\t\t\t);\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t} );\n\n\n\t// jQuery access\n\t$.fn.dataTable = DataTable;\n\n\t// Legacy aliases\n\t$.fn.dataTableSettings = DataTable.settings;\n\t$.fn.dataTableExt = DataTable.ext;\n\n\t// With a capital `D` we return a DataTables API instance rather than a\n\t// jQuery object\n\t$.fn.DataTable = function ( opts ) {\n\t\treturn $(this).dataTable( opts ).api();\n\t};\n\n\t// All properties that are available to $.fn.dataTable should also be\n\t// available on $.fn.DataTable\n\t$.each( DataTable, function ( prop, val ) {\n\t\t$.fn.DataTable[ prop ] = val;\n\t} );\n\n\n\t// Information about events fired by DataTables - for documentation.\n\t/**\n\t * Draw event, fired whenever the table is redrawn on the page, at the same\n\t * point as fnDrawCallback. This may be useful for binding events or\n\t * performing calculations when the table is altered at all.\n\t *  @name DataTable#draw.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * Search event, fired when the searching applied to the table (using the\n\t * built-in global search, or column filters) is altered.\n\t *  @name DataTable#search.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * Page change event, fired when the paging of the table is altered.\n\t *  @name DataTable#page.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * Order event, fired when the ordering applied to the table is altered.\n\t *  @name DataTable#order.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * DataTables initialisation complete event, fired when the table is fully\n\t * drawn, including Ajax data loaded, if Ajax data is required.\n\t *  @name DataTable#init.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} oSettings DataTables settings object\n\t *  @param {object} json The JSON object request from the server - only\n\t *    present if client-side Ajax sourced data is used</li></ol>\n\t */\n\n\t/**\n\t * State save event, fired when the table has changed state a new state save\n\t * is required. This event allows modification of the state saving object\n\t * prior to actually doing the save, including addition or other state\n\t * properties (for plug-ins) or modification of a DataTables core property.\n\t *  @name DataTable#stateSaveParams.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} oSettings DataTables settings object\n\t *  @param {object} json The state information to be saved\n\t */\n\n\t/**\n\t * State load event, fired when the table is loading state from the stored\n\t * data, but prior to the settings object being modified by the saved state\n\t * - allowing modification of the saved state is required or loading of\n\t * state for a plug-in.\n\t *  @name DataTable#stateLoadParams.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} oSettings DataTables settings object\n\t *  @param {object} json The saved state information\n\t */\n\n\t/**\n\t * State loaded event, fired when state has been loaded from stored data and\n\t * the settings object has been modified by the loaded data.\n\t *  @name DataTable#stateLoaded.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} oSettings DataTables settings object\n\t *  @param {object} json The saved state information\n\t */\n\n\t/**\n\t * Processing event, fired when DataTables is doing some kind of processing\n\t * (be it, order, searcg or anything else). It can be used to indicate to\n\t * the end user that there is something happening, or that something has\n\t * finished.\n\t *  @name DataTable#processing.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} oSettings DataTables settings object\n\t *  @param {boolean} bShow Flag for if DataTables is doing processing or not\n\t */\n\n\t/**\n\t * Ajax (XHR) event, fired whenever an Ajax request is completed from a\n\t * request to made to the server for new data. This event is called before\n\t * DataTables processed the returned data, so it can also be used to pre-\n\t * process the data returned from the server, if needed.\n\t *\n\t * Note that this trigger is called in `fnServerData`, if you override\n\t * `fnServerData` and which to use this event, you need to trigger it in you\n\t * success function.\n\t *  @name DataTable#xhr.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t *  @param {object} json JSON returned from the server\n\t *\n\t *  @example\n\t *     // Use a custom property returned from the server in another DOM element\n\t *     $('#table').dataTable().on('xhr.dt', function (e, settings, json) {\n\t *       $('#status').html( json.status );\n\t *     } );\n\t *\n\t *  @example\n\t *     // Pre-process the data returned from the server\n\t *     $('#table').dataTable().on('xhr.dt', function (e, settings, json) {\n\t *       for ( var i=0, ien=json.aaData.length ; i<ien ; i++ ) {\n\t *         json.aaData[i].sum = json.aaData[i].one + json.aaData[i].two;\n\t *       }\n\t *       // Note no return - manipulate the data directly in the JSON object.\n\t *     } );\n\t */\n\n\t/**\n\t * Destroy event, fired when the DataTable is destroyed by calling fnDestroy\n\t * or passing the bDestroy:true parameter in the initialisation object. This\n\t * can be used to remove bound events, added DOM nodes, etc.\n\t *  @name DataTable#destroy.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * Page length change event, fired when number of records to show on each\n\t * page (the length) is changed.\n\t *  @name DataTable#length.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t *  @param {integer} len New length\n\t */\n\n\t/**\n\t * Column sizing has changed.\n\t *  @name DataTable#column-sizing.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * Column visibility has changed.\n\t *  @name DataTable#column-visibility.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t *  @param {int} column Column index\n\t *  @param {bool} vis `false` if column now hidden, or `true` if visible\n\t */\n}));\n\n}(window, document, jQuery));\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/datapicker/bootstrap-datepicker.js",
    "content": "/* =========================================================\n * bootstrap-datepicker.js\n * Repo: https://github.com/eternicode/bootstrap-datepicker/\n * Demo: http://eternicode.github.io/bootstrap-datepicker/\n * Docs: http://bootstrap-datepicker.readthedocs.org/\n * Forked from http://www.eyecon.ro/bootstrap-datepicker\n * =========================================================\n * Started by Stefan Petre; improvements by Andrew Rowls + contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"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://www.apache.org/licenses/LICENSE-2.0\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\n(function($, undefined){\n\n\tvar $window = $(window);\n\n\tfunction UTCDate(){\n\t\treturn new Date(Date.UTC.apply(Date, arguments));\n\t}\n\tfunction UTCToday(){\n\t\tvar today = new Date();\n\t\treturn UTCDate(today.getFullYear(), today.getMonth(), today.getDate());\n\t}\n\tfunction alias(method){\n\t\treturn function(){\n\t\t\treturn this[method].apply(this, arguments);\n\t\t};\n\t}\n\n\tvar DateArray = (function(){\n\t\tvar extras = {\n\t\t\tget: function(i){\n\t\t\t\treturn this.slice(i)[0];\n\t\t\t},\n\t\t\tcontains: function(d){\n\t\t\t\t// Array.indexOf is not cross-browser;\n\t\t\t\t// $.inArray doesn't work with Dates\n\t\t\t\tvar val = d && d.valueOf();\n\t\t\t\tfor (var i=0, l=this.length; i < l; i++)\n\t\t\t\t\tif (this[i].valueOf() === val)\n\t\t\t\t\t\treturn i;\n\t\t\t\treturn -1;\n\t\t\t},\n\t\t\tremove: function(i){\n\t\t\t\tthis.splice(i,1);\n\t\t\t},\n\t\t\treplace: function(new_array){\n\t\t\t\tif (!new_array)\n\t\t\t\t\treturn;\n\t\t\t\tif (!$.isArray(new_array))\n\t\t\t\t\tnew_array = [new_array];\n\t\t\t\tthis.clear();\n\t\t\t\tthis.push.apply(this, new_array);\n\t\t\t},\n\t\t\tclear: function(){\n\t\t\t\tthis.splice(0);\n\t\t\t},\n\t\t\tcopy: function(){\n\t\t\t\tvar a = new DateArray();\n\t\t\t\ta.replace(this);\n\t\t\t\treturn a;\n\t\t\t}\n\t\t};\n\n\t\treturn function(){\n\t\t\tvar a = [];\n\t\t\ta.push.apply(a, arguments);\n\t\t\t$.extend(a, extras);\n\t\t\treturn a;\n\t\t};\n\t})();\n\n\n\t// Picker object\n\n\tvar Datepicker = function(element, options){\n\t\tthis.dates = new DateArray();\n\t\tthis.viewDate = UTCToday();\n\t\tthis.focusDate = null;\n\n\t\tthis._process_options(options);\n\n\t\tthis.element = $(element);\n\t\tthis.isInline = false;\n\t\tthis.isInput = this.element.is('input');\n\t\tthis.component = this.element.is('.date') ? this.element.find('.add-on, .input-group-addon, .btn') : false;\n\t\tthis.hasInput = this.component && this.element.find('input').length;\n\t\tif (this.component && this.component.length === 0)\n\t\t\tthis.component = false;\n\n\t\tthis.picker = $(DPGlobal.template);\n\t\tthis._buildEvents();\n\t\tthis._attachEvents();\n\n\t\tif (this.isInline){\n\t\t\tthis.picker.addClass('datepicker-inline').appendTo(this.element);\n\t\t}\n\t\telse {\n\t\t\tthis.picker.addClass('datepicker-dropdown dropdown-menu');\n\t\t}\n\n\t\tif (this.o.rtl){\n\t\t\tthis.picker.addClass('datepicker-rtl');\n\t\t}\n\n\t\tthis.viewMode = this.o.startView;\n\n\t\tif (this.o.calendarWeeks)\n\t\t\tthis.picker.find('tfoot th.today')\n\t\t\t\t\t\t.attr('colspan', function(i, val){\n\t\t\t\t\t\t\treturn parseInt(val) + 1;\n\t\t\t\t\t\t});\n\n\t\tthis._allow_update = false;\n\n\t\tthis.setStartDate(this._o.startDate);\n\t\tthis.setEndDate(this._o.endDate);\n\t\tthis.setDaysOfWeekDisabled(this.o.daysOfWeekDisabled);\n\n\t\tthis.fillDow();\n\t\tthis.fillMonths();\n\n\t\tthis._allow_update = true;\n\n\t\tthis.update();\n\t\tthis.showMode();\n\n\t\tif (this.isInline){\n\t\t\tthis.show();\n\t\t}\n\t};\n\n\tDatepicker.prototype = {\n\t\tconstructor: Datepicker,\n\n\t\t_process_options: function(opts){\n\t\t\t// Store raw options for reference\n\t\t\tthis._o = $.extend({}, this._o, opts);\n\t\t\t// Processed options\n\t\t\tvar o = this.o = $.extend({}, this._o);\n\n\t\t\t// Check if \"de-DE\" style date is available, if not language should\n\t\t\t// fallback to 2 letter code eg \"de\"\n\t\t\tvar lang = o.language;\n\t\t\tif (!dates[lang]){\n\t\t\t\tlang = lang.split('-')[0];\n\t\t\t\tif (!dates[lang])\n\t\t\t\t\tlang = defaults.language;\n\t\t\t}\n\t\t\to.language = lang;\n\n\t\t\tswitch (o.startView){\n\t\t\t\tcase 2:\n\t\t\t\tcase 'decade':\n\t\t\t\t\to.startView = 2;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1:\n\t\t\t\tcase 'year':\n\t\t\t\t\to.startView = 1;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\to.startView = 0;\n\t\t\t}\n\n\t\t\tswitch (o.minViewMode){\n\t\t\t\tcase 1:\n\t\t\t\tcase 'months':\n\t\t\t\t\to.minViewMode = 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\tcase 'years':\n\t\t\t\t\to.minViewMode = 2;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\to.minViewMode = 0;\n\t\t\t}\n\n\t\t\to.startView = Math.max(o.startView, o.minViewMode);\n\n\t\t\t// true, false, or Number > 0\n\t\t\tif (o.multidate !== true){\n\t\t\t\to.multidate = Number(o.multidate) || false;\n\t\t\t\tif (o.multidate !== false)\n\t\t\t\t\to.multidate = Math.max(0, o.multidate);\n\t\t\t\telse\n\t\t\t\t\to.multidate = 1;\n\t\t\t}\n\t\t\to.multidateSeparator = String(o.multidateSeparator);\n\n\t\t\to.weekStart %= 7;\n\t\t\to.weekEnd = ((o.weekStart + 6) % 7);\n\n\t\t\tvar format = DPGlobal.parseFormat(o.format);\n\t\t\tif (o.startDate !== -Infinity){\n\t\t\t\tif (!!o.startDate){\n\t\t\t\t\tif (o.startDate instanceof Date)\n\t\t\t\t\t\to.startDate = this._local_to_utc(this._zero_time(o.startDate));\n\t\t\t\t\telse\n\t\t\t\t\t\to.startDate = DPGlobal.parseDate(o.startDate, format, o.language);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\to.startDate = -Infinity;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (o.endDate !== Infinity){\n\t\t\t\tif (!!o.endDate){\n\t\t\t\t\tif (o.endDate instanceof Date)\n\t\t\t\t\t\to.endDate = this._local_to_utc(this._zero_time(o.endDate));\n\t\t\t\t\telse\n\t\t\t\t\t\to.endDate = DPGlobal.parseDate(o.endDate, format, o.language);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\to.endDate = Infinity;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\to.daysOfWeekDisabled = o.daysOfWeekDisabled||[];\n\t\t\tif (!$.isArray(o.daysOfWeekDisabled))\n\t\t\t\to.daysOfWeekDisabled = o.daysOfWeekDisabled.split(/[,\\s]*/);\n\t\t\to.daysOfWeekDisabled = $.map(o.daysOfWeekDisabled, function(d){\n\t\t\t\treturn parseInt(d, 10);\n\t\t\t});\n\n\t\t\tvar plc = String(o.orientation).toLowerCase().split(/\\s+/g),\n\t\t\t\t_plc = o.orientation.toLowerCase();\n\t\t\tplc = $.grep(plc, function(word){\n\t\t\t\treturn (/^auto|left|right|top|bottom$/).test(word);\n\t\t\t});\n\t\t\to.orientation = {x: 'auto', y: 'auto'};\n\t\t\tif (!_plc || _plc === 'auto')\n\t\t\t\t; // no action\n\t\t\telse if (plc.length === 1){\n\t\t\t\tswitch (plc[0]){\n\t\t\t\t\tcase 'top':\n\t\t\t\t\tcase 'bottom':\n\t\t\t\t\t\to.orientation.y = plc[0];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'left':\n\t\t\t\t\tcase 'right':\n\t\t\t\t\t\to.orientation.x = plc[0];\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_plc = $.grep(plc, function(word){\n\t\t\t\t\treturn (/^left|right$/).test(word);\n\t\t\t\t});\n\t\t\t\to.orientation.x = _plc[0] || 'auto';\n\n\t\t\t\t_plc = $.grep(plc, function(word){\n\t\t\t\t\treturn (/^top|bottom$/).test(word);\n\t\t\t\t});\n\t\t\t\to.orientation.y = _plc[0] || 'auto';\n\t\t\t}\n\t\t},\n\t\t_events: [],\n\t\t_secondaryEvents: [],\n\t\t_applyEvents: function(evs){\n\t\t\tfor (var i=0, el, ch, ev; i < evs.length; i++){\n\t\t\t\tel = evs[i][0];\n\t\t\t\tif (evs[i].length === 2){\n\t\t\t\t\tch = undefined;\n\t\t\t\t\tev = evs[i][1];\n\t\t\t\t}\n\t\t\t\telse if (evs[i].length === 3){\n\t\t\t\t\tch = evs[i][1];\n\t\t\t\t\tev = evs[i][2];\n\t\t\t\t}\n\t\t\t\tel.on(ev, ch);\n\t\t\t}\n\t\t},\n\t\t_unapplyEvents: function(evs){\n\t\t\tfor (var i=0, el, ev, ch; i < evs.length; i++){\n\t\t\t\tel = evs[i][0];\n\t\t\t\tif (evs[i].length === 2){\n\t\t\t\t\tch = undefined;\n\t\t\t\t\tev = evs[i][1];\n\t\t\t\t}\n\t\t\t\telse if (evs[i].length === 3){\n\t\t\t\t\tch = evs[i][1];\n\t\t\t\t\tev = evs[i][2];\n\t\t\t\t}\n\t\t\t\tel.off(ev, ch);\n\t\t\t}\n\t\t},\n\t\t_buildEvents: function(){\n\t\t\tif (this.isInput){ // single input\n\t\t\t\tthis._events = [\n\t\t\t\t\t[this.element, {\n\t\t\t\t\t\tfocus: $.proxy(this.show, this),\n\t\t\t\t\t\tkeyup: $.proxy(function(e){\n\t\t\t\t\t\t\tif ($.inArray(e.keyCode, [27,37,39,38,40,32,13,9]) === -1)\n\t\t\t\t\t\t\t\tthis.update();\n\t\t\t\t\t\t}, this),\n\t\t\t\t\t\tkeydown: $.proxy(this.keydown, this)\n\t\t\t\t\t}]\n\t\t\t\t];\n\t\t\t}\n\t\t\telse if (this.component && this.hasInput){ // component: input + button\n\t\t\t\tthis._events = [\n\t\t\t\t\t// For components that are not readonly, allow keyboard nav\n\t\t\t\t\t[this.element.find('input'), {\n\t\t\t\t\t\tfocus: $.proxy(this.show, this),\n\t\t\t\t\t\tkeyup: $.proxy(function(e){\n\t\t\t\t\t\t\tif ($.inArray(e.keyCode, [27,37,39,38,40,32,13,9]) === -1)\n\t\t\t\t\t\t\t\tthis.update();\n\t\t\t\t\t\t}, this),\n\t\t\t\t\t\tkeydown: $.proxy(this.keydown, this)\n\t\t\t\t\t}],\n\t\t\t\t\t[this.component, {\n\t\t\t\t\t\tclick: $.proxy(this.show, this)\n\t\t\t\t\t}]\n\t\t\t\t];\n\t\t\t}\n\t\t\telse if (this.element.is('div')){  // inline datepicker\n\t\t\t\tthis.isInline = true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._events = [\n\t\t\t\t\t[this.element, {\n\t\t\t\t\t\tclick: $.proxy(this.show, this)\n\t\t\t\t\t}]\n\t\t\t\t];\n\t\t\t}\n\t\t\tthis._events.push(\n\t\t\t\t// Component: listen for blur on element descendants\n\t\t\t\t[this.element, '*', {\n\t\t\t\t\tblur: $.proxy(function(e){\n\t\t\t\t\t\tthis._focused_from = e.target;\n\t\t\t\t\t}, this)\n\t\t\t\t}],\n\t\t\t\t// Input: listen for blur on element\n\t\t\t\t[this.element, {\n\t\t\t\t\tblur: $.proxy(function(e){\n\t\t\t\t\t\tthis._focused_from = e.target;\n\t\t\t\t\t}, this)\n\t\t\t\t}]\n\t\t\t);\n\n\t\t\tthis._secondaryEvents = [\n\t\t\t\t[this.picker, {\n\t\t\t\t\tclick: $.proxy(this.click, this)\n\t\t\t\t}],\n\t\t\t\t[$(window), {\n\t\t\t\t\tresize: $.proxy(this.place, this)\n\t\t\t\t}],\n\t\t\t\t[$(document), {\n\t\t\t\t\t'mousedown touchstart': $.proxy(function(e){\n\t\t\t\t\t\t// Clicked outside the datepicker, hide it\n\t\t\t\t\t\tif (!(\n\t\t\t\t\t\t\tthis.element.is(e.target) ||\n\t\t\t\t\t\t\tthis.element.find(e.target).length ||\n\t\t\t\t\t\t\tthis.picker.is(e.target) ||\n\t\t\t\t\t\t\tthis.picker.find(e.target).length\n\t\t\t\t\t\t)){\n\t\t\t\t\t\t\tthis.hide();\n\t\t\t\t\t\t}\n\t\t\t\t\t}, this)\n\t\t\t\t}]\n\t\t\t];\n\t\t},\n\t\t_attachEvents: function(){\n\t\t\tthis._detachEvents();\n\t\t\tthis._applyEvents(this._events);\n\t\t},\n\t\t_detachEvents: function(){\n\t\t\tthis._unapplyEvents(this._events);\n\t\t},\n\t\t_attachSecondaryEvents: function(){\n\t\t\tthis._detachSecondaryEvents();\n\t\t\tthis._applyEvents(this._secondaryEvents);\n\t\t},\n\t\t_detachSecondaryEvents: function(){\n\t\t\tthis._unapplyEvents(this._secondaryEvents);\n\t\t},\n\t\t_trigger: function(event, altdate){\n\t\t\tvar date = altdate || this.dates.get(-1),\n\t\t\t\tlocal_date = this._utc_to_local(date);\n\n\t\t\tthis.element.trigger({\n\t\t\t\ttype: event,\n\t\t\t\tdate: local_date,\n\t\t\t\tdates: $.map(this.dates, this._utc_to_local),\n\t\t\t\tformat: $.proxy(function(ix, format){\n\t\t\t\t\tif (arguments.length === 0){\n\t\t\t\t\t\tix = this.dates.length - 1;\n\t\t\t\t\t\tformat = this.o.format;\n\t\t\t\t\t}\n\t\t\t\t\telse if (typeof ix === 'string'){\n\t\t\t\t\t\tformat = ix;\n\t\t\t\t\t\tix = this.dates.length - 1;\n\t\t\t\t\t}\n\t\t\t\t\tformat = format || this.o.format;\n\t\t\t\t\tvar date = this.dates.get(ix);\n\t\t\t\t\treturn DPGlobal.formatDate(date, format, this.o.language);\n\t\t\t\t}, this)\n\t\t\t});\n\t\t},\n\n\t\tshow: function(){\n\t\t\tif (!this.isInline)\n\t\t\t\tthis.picker.appendTo('body');\n\t\t\tthis.picker.show();\n\t\t\tthis.place();\n\t\t\tthis._attachSecondaryEvents();\n\t\t\tthis._trigger('show');\n\t\t},\n\n\t\thide: function(){\n\t\t\tif (this.isInline)\n\t\t\t\treturn;\n\t\t\tif (!this.picker.is(':visible'))\n\t\t\t\treturn;\n\t\t\tthis.focusDate = null;\n\t\t\tthis.picker.hide().detach();\n\t\t\tthis._detachSecondaryEvents();\n\t\t\tthis.viewMode = this.o.startView;\n\t\t\tthis.showMode();\n\n\t\t\tif (\n\t\t\t\tthis.o.forceParse &&\n\t\t\t\t(\n\t\t\t\t\tthis.isInput && this.element.val() ||\n\t\t\t\t\tthis.hasInput && this.element.find('input').val()\n\t\t\t\t)\n\t\t\t)\n\t\t\t\tthis.setValue();\n\t\t\tthis._trigger('hide');\n\t\t},\n\n\t\tremove: function(){\n\t\t\tthis.hide();\n\t\t\tthis._detachEvents();\n\t\t\tthis._detachSecondaryEvents();\n\t\t\tthis.picker.remove();\n\t\t\tdelete this.element.data().datepicker;\n\t\t\tif (!this.isInput){\n\t\t\t\tdelete this.element.data().date;\n\t\t\t}\n\t\t},\n\n\t\t_utc_to_local: function(utc){\n\t\t\treturn utc && new Date(utc.getTime() + (utc.getTimezoneOffset()*60000));\n\t\t},\n\t\t_local_to_utc: function(local){\n\t\t\treturn local && new Date(local.getTime() - (local.getTimezoneOffset()*60000));\n\t\t},\n\t\t_zero_time: function(local){\n\t\t\treturn local && new Date(local.getFullYear(), local.getMonth(), local.getDate());\n\t\t},\n\t\t_zero_utc_time: function(utc){\n\t\t\treturn utc && new Date(Date.UTC(utc.getUTCFullYear(), utc.getUTCMonth(), utc.getUTCDate()));\n\t\t},\n\n\t\tgetDates: function(){\n\t\t\treturn $.map(this.dates, this._utc_to_local);\n\t\t},\n\n\t\tgetUTCDates: function(){\n\t\t\treturn $.map(this.dates, function(d){\n\t\t\t\treturn new Date(d);\n\t\t\t});\n\t\t},\n\n\t\tgetDate: function(){\n\t\t\treturn this._utc_to_local(this.getUTCDate());\n\t\t},\n\n\t\tgetUTCDate: function(){\n\t\t\treturn new Date(this.dates.get(-1));\n\t\t},\n\n\t\tsetDates: function(){\n\t\t\tvar args = $.isArray(arguments[0]) ? arguments[0] : arguments;\n\t\t\tthis.update.apply(this, args);\n\t\t\tthis._trigger('changeDate');\n\t\t\tthis.setValue();\n\t\t},\n\n\t\tsetUTCDates: function(){\n\t\t\tvar args = $.isArray(arguments[0]) ? arguments[0] : arguments;\n\t\t\tthis.update.apply(this, $.map(args, this._utc_to_local));\n\t\t\tthis._trigger('changeDate');\n\t\t\tthis.setValue();\n\t\t},\n\n\t\tsetDate: alias('setDates'),\n\t\tsetUTCDate: alias('setUTCDates'),\n\n\t\tsetValue: function(){\n\t\t\tvar formatted = this.getFormattedDate();\n\t\t\tif (!this.isInput){\n\t\t\t\tif (this.component){\n\t\t\t\t\tthis.element.find('input').val(formatted).change();\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.element.val(formatted).change();\n\t\t\t}\n\t\t},\n\n\t\tgetFormattedDate: function(format){\n\t\t\tif (format === undefined)\n\t\t\t\tformat = this.o.format;\n\n\t\t\tvar lang = this.o.language;\n\t\t\treturn $.map(this.dates, function(d){\n\t\t\t\treturn DPGlobal.formatDate(d, format, lang);\n\t\t\t}).join(this.o.multidateSeparator);\n\t\t},\n\n\t\tsetStartDate: function(startDate){\n\t\t\tthis._process_options({startDate: startDate});\n\t\t\tthis.update();\n\t\t\tthis.updateNavArrows();\n\t\t},\n\n\t\tsetEndDate: function(endDate){\n\t\t\tthis._process_options({endDate: endDate});\n\t\t\tthis.update();\n\t\t\tthis.updateNavArrows();\n\t\t},\n\n\t\tsetDaysOfWeekDisabled: function(daysOfWeekDisabled){\n\t\t\tthis._process_options({daysOfWeekDisabled: daysOfWeekDisabled});\n\t\t\tthis.update();\n\t\t\tthis.updateNavArrows();\n\t\t},\n\n\t\tplace: function(){\n\t\t\tif (this.isInline)\n\t\t\t\treturn;\n\t\t\tvar calendarWidth = this.picker.outerWidth(),\n\t\t\t\tcalendarHeight = this.picker.outerHeight(),\n\t\t\t\tvisualPadding = 10,\n\t\t\t\twindowWidth = $window.width(),\n\t\t\t\twindowHeight = $window.height(),\n\t\t\t\tscrollTop = $window.scrollTop();\n\n\t\t\tvar zIndex = parseInt(this.element.parents().filter(function(){\n\t\t\t\t\treturn $(this).css('z-index') !== 'auto';\n\t\t\t\t}).first().css('z-index'))+10;\n\t\t\tvar offset = this.component ? this.component.parent().offset() : this.element.offset();\n\t\t\tvar height = this.component ? this.component.outerHeight(true) : this.element.outerHeight(false);\n\t\t\tvar width = this.component ? this.component.outerWidth(true) : this.element.outerWidth(false);\n\t\t\tvar left = offset.left,\n\t\t\t\ttop = offset.top;\n\n\t\t\tthis.picker.removeClass(\n\t\t\t\t'datepicker-orient-top datepicker-orient-bottom '+\n\t\t\t\t'datepicker-orient-right datepicker-orient-left'\n\t\t\t);\n\n\t\t\tif (this.o.orientation.x !== 'auto'){\n\t\t\t\tthis.picker.addClass('datepicker-orient-' + this.o.orientation.x);\n\t\t\t\tif (this.o.orientation.x === 'right')\n\t\t\t\t\tleft -= calendarWidth - width;\n\t\t\t}\n\t\t\t// auto x orientation is best-placement: if it crosses a window\n\t\t\t// edge, fudge it sideways\n\t\t\telse {\n\t\t\t\t// Default to left\n\t\t\t\tthis.picker.addClass('datepicker-orient-left');\n\t\t\t\tif (offset.left < 0)\n\t\t\t\t\tleft -= offset.left - visualPadding;\n\t\t\t\telse if (offset.left + calendarWidth > windowWidth)\n\t\t\t\t\tleft = windowWidth - calendarWidth - visualPadding;\n\t\t\t}\n\n\t\t\t// auto y orientation is best-situation: top or bottom, no fudging,\n\t\t\t// decision based on which shows more of the calendar\n\t\t\tvar yorient = this.o.orientation.y,\n\t\t\t\ttop_overflow, bottom_overflow;\n\t\t\tif (yorient === 'auto'){\n\t\t\t\ttop_overflow = -scrollTop + offset.top - calendarHeight;\n\t\t\t\tbottom_overflow = scrollTop + windowHeight - (offset.top + height + calendarHeight);\n\t\t\t\tif (Math.max(top_overflow, bottom_overflow) === bottom_overflow)\n\t\t\t\t\tyorient = 'top';\n\t\t\t\telse\n\t\t\t\t\tyorient = 'bottom';\n\t\t\t}\n\t\t\tthis.picker.addClass('datepicker-orient-' + yorient);\n\t\t\tif (yorient === 'top')\n\t\t\t\ttop += height;\n\t\t\telse\n\t\t\t\ttop -= calendarHeight + parseInt(this.picker.css('padding-top'));\n\n\t\t\tthis.picker.css({\n\t\t\t\ttop: top,\n\t\t\t\tleft: left,\n\t\t\t\tzIndex: zIndex\n\t\t\t});\n\t\t},\n\n\t\t_allow_update: true,\n\t\tupdate: function(){\n\t\t\tif (!this._allow_update)\n\t\t\t\treturn;\n\n\t\t\tvar oldDates = this.dates.copy(),\n\t\t\t\tdates = [],\n\t\t\t\tfromArgs = false;\n\t\t\tif (arguments.length){\n\t\t\t\t$.each(arguments, $.proxy(function(i, date){\n\t\t\t\t\tif (date instanceof Date)\n\t\t\t\t\t\tdate = this._local_to_utc(date);\n\t\t\t\t\tdates.push(date);\n\t\t\t\t}, this));\n\t\t\t\tfromArgs = true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdates = this.isInput\n\t\t\t\t\t\t? this.element.val()\n\t\t\t\t\t\t: this.element.data('date') || this.element.find('input').val();\n\t\t\t\tif (dates && this.o.multidate)\n\t\t\t\t\tdates = dates.split(this.o.multidateSeparator);\n\t\t\t\telse\n\t\t\t\t\tdates = [dates];\n\t\t\t\tdelete this.element.data().date;\n\t\t\t}\n\n\t\t\tdates = $.map(dates, $.proxy(function(date){\n\t\t\t\treturn DPGlobal.parseDate(date, this.o.format, this.o.language);\n\t\t\t}, this));\n\t\t\tdates = $.grep(dates, $.proxy(function(date){\n\t\t\t\treturn (\n\t\t\t\t\tdate < this.o.startDate ||\n\t\t\t\t\tdate > this.o.endDate ||\n\t\t\t\t\t!date\n\t\t\t\t);\n\t\t\t}, this), true);\n\t\t\tthis.dates.replace(dates);\n\n\t\t\tif (this.dates.length)\n\t\t\t\tthis.viewDate = new Date(this.dates.get(-1));\n\t\t\telse if (this.viewDate < this.o.startDate)\n\t\t\t\tthis.viewDate = new Date(this.o.startDate);\n\t\t\telse if (this.viewDate > this.o.endDate)\n\t\t\t\tthis.viewDate = new Date(this.o.endDate);\n\n\t\t\tif (fromArgs){\n\t\t\t\t// setting date by clicking\n\t\t\t\tthis.setValue();\n\t\t\t}\n\t\t\telse if (dates.length){\n\t\t\t\t// setting date by typing\n\t\t\t\tif (String(oldDates) !== String(this.dates))\n\t\t\t\t\tthis._trigger('changeDate');\n\t\t\t}\n\t\t\tif (!this.dates.length && oldDates.length)\n\t\t\t\tthis._trigger('clearDate');\n\n\t\t\tthis.fill();\n\t\t},\n\n\t\tfillDow: function(){\n\t\t\tvar dowCnt = this.o.weekStart,\n\t\t\t\thtml = '<tr>';\n\t\t\tif (this.o.calendarWeeks){\n\t\t\t\tvar cell = '<th class=\"cw\">&nbsp;</th>';\n\t\t\t\thtml += cell;\n\t\t\t\tthis.picker.find('.datepicker-days thead tr:first-child').prepend(cell);\n\t\t\t}\n\t\t\twhile (dowCnt < this.o.weekStart + 7){\n\t\t\t\thtml += '<th class=\"dow\">'+dates[this.o.language].daysMin[(dowCnt++)%7]+'</th>';\n\t\t\t}\n\t\t\thtml += '</tr>';\n\t\t\tthis.picker.find('.datepicker-days thead').append(html);\n\t\t},\n\n\t\tfillMonths: function(){\n\t\t\tvar html = '',\n\t\t\ti = 0;\n\t\t\twhile (i < 12){\n\t\t\t\thtml += '<span class=\"month\">'+dates[this.o.language].monthsShort[i++]+'</span>';\n\t\t\t}\n\t\t\tthis.picker.find('.datepicker-months td').html(html);\n\t\t},\n\n\t\tsetRange: function(range){\n\t\t\tif (!range || !range.length)\n\t\t\t\tdelete this.range;\n\t\t\telse\n\t\t\t\tthis.range = $.map(range, function(d){\n\t\t\t\t\treturn d.valueOf();\n\t\t\t\t});\n\t\t\tthis.fill();\n\t\t},\n\n\t\tgetClassNames: function(date){\n\t\t\tvar cls = [],\n\t\t\t\tyear = this.viewDate.getUTCFullYear(),\n\t\t\t\tmonth = this.viewDate.getUTCMonth(),\n\t\t\t\ttoday = new Date();\n\t\t\tif (date.getUTCFullYear() < year || (date.getUTCFullYear() === year && date.getUTCMonth() < month)){\n\t\t\t\tcls.push('old');\n\t\t\t}\n\t\t\telse if (date.getUTCFullYear() > year || (date.getUTCFullYear() === year && date.getUTCMonth() > month)){\n\t\t\t\tcls.push('new');\n\t\t\t}\n\t\t\tif (this.focusDate && date.valueOf() === this.focusDate.valueOf())\n\t\t\t\tcls.push('focused');\n\t\t\t// Compare internal UTC date with local today, not UTC today\n\t\t\tif (this.o.todayHighlight &&\n\t\t\t\tdate.getUTCFullYear() === today.getFullYear() &&\n\t\t\t\tdate.getUTCMonth() === today.getMonth() &&\n\t\t\t\tdate.getUTCDate() === today.getDate()){\n\t\t\t\tcls.push('today');\n\t\t\t}\n\t\t\tif (this.dates.contains(date) !== -1)\n\t\t\t\tcls.push('active');\n\t\t\tif (date.valueOf() < this.o.startDate || date.valueOf() > this.o.endDate ||\n\t\t\t\t$.inArray(date.getUTCDay(), this.o.daysOfWeekDisabled) !== -1){\n\t\t\t\tcls.push('disabled');\n\t\t\t}\n\t\t\tif (this.range){\n\t\t\t\tif (date > this.range[0] && date < this.range[this.range.length-1]){\n\t\t\t\t\tcls.push('range');\n\t\t\t\t}\n\t\t\t\tif ($.inArray(date.valueOf(), this.range) !== -1){\n\t\t\t\t\tcls.push('selected');\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn cls;\n\t\t},\n\n\t\tfill: function(){\n\t\t\tvar d = new Date(this.viewDate),\n\t\t\t\tyear = d.getUTCFullYear(),\n\t\t\t\tmonth = d.getUTCMonth(),\n\t\t\t\tstartYear = this.o.startDate !== -Infinity ? this.o.startDate.getUTCFullYear() : -Infinity,\n\t\t\t\tstartMonth = this.o.startDate !== -Infinity ? this.o.startDate.getUTCMonth() : -Infinity,\n\t\t\t\tendYear = this.o.endDate !== Infinity ? this.o.endDate.getUTCFullYear() : Infinity,\n\t\t\t\tendMonth = this.o.endDate !== Infinity ? this.o.endDate.getUTCMonth() : Infinity,\n\t\t\t\ttodaytxt = dates[this.o.language].today || dates['en'].today || '',\n\t\t\t\tcleartxt = dates[this.o.language].clear || dates['en'].clear || '',\n\t\t\t\ttooltip;\n\t\t\tthis.picker.find('.datepicker-days thead th.datepicker-switch')\n\t\t\t\t\t\t.text(dates[this.o.language].months[month]+' '+year);\n\t\t\tthis.picker.find('tfoot th.today')\n\t\t\t\t\t\t.text(todaytxt)\n\t\t\t\t\t\t.toggle(this.o.todayBtn !== false);\n\t\t\tthis.picker.find('tfoot th.clear')\n\t\t\t\t\t\t.text(cleartxt)\n\t\t\t\t\t\t.toggle(this.o.clearBtn !== false);\n\t\t\tthis.updateNavArrows();\n\t\t\tthis.fillMonths();\n\t\t\tvar prevMonth = UTCDate(year, month-1, 28),\n\t\t\t\tday = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth());\n\t\t\tprevMonth.setUTCDate(day);\n\t\t\tprevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.o.weekStart + 7)%7);\n\t\t\tvar nextMonth = new Date(prevMonth);\n\t\t\tnextMonth.setUTCDate(nextMonth.getUTCDate() + 42);\n\t\t\tnextMonth = nextMonth.valueOf();\n\t\t\tvar html = [];\n\t\t\tvar clsName;\n\t\t\twhile (prevMonth.valueOf() < nextMonth){\n\t\t\t\tif (prevMonth.getUTCDay() === this.o.weekStart){\n\t\t\t\t\thtml.push('<tr>');\n\t\t\t\t\tif (this.o.calendarWeeks){\n\t\t\t\t\t\t// ISO 8601: First week contains first thursday.\n\t\t\t\t\t\t// ISO also states week starts on Monday, but we can be more abstract here.\n\t\t\t\t\t\tvar\n\t\t\t\t\t\t\t// Start of current week: based on weekstart/current date\n\t\t\t\t\t\t\tws = new Date(+prevMonth + (this.o.weekStart - prevMonth.getUTCDay() - 7) % 7 * 864e5),\n\t\t\t\t\t\t\t// Thursday of this week\n\t\t\t\t\t\t\tth = new Date(Number(ws) + (7 + 4 - ws.getUTCDay()) % 7 * 864e5),\n\t\t\t\t\t\t\t// First Thursday of year, year from thursday\n\t\t\t\t\t\t\tyth = new Date(Number(yth = UTCDate(th.getUTCFullYear(), 0, 1)) + (7 + 4 - yth.getUTCDay())%7*864e5),\n\t\t\t\t\t\t\t// Calendar week: ms between thursdays, div ms per day, div 7 days\n\t\t\t\t\t\t\tcalWeek =  (th - yth) / 864e5 / 7 + 1;\n\t\t\t\t\t\thtml.push('<td class=\"cw\">'+ calWeek +'</td>');\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tclsName = this.getClassNames(prevMonth);\n\t\t\t\tclsName.push('day');\n\n\t\t\t\tif (this.o.beforeShowDay !== $.noop){\n\t\t\t\t\tvar before = this.o.beforeShowDay(this._utc_to_local(prevMonth));\n\t\t\t\t\tif (before === undefined)\n\t\t\t\t\t\tbefore = {};\n\t\t\t\t\telse if (typeof(before) === 'boolean')\n\t\t\t\t\t\tbefore = {enabled: before};\n\t\t\t\t\telse if (typeof(before) === 'string')\n\t\t\t\t\t\tbefore = {classes: before};\n\t\t\t\t\tif (before.enabled === false)\n\t\t\t\t\t\tclsName.push('disabled');\n\t\t\t\t\tif (before.classes)\n\t\t\t\t\t\tclsName = clsName.concat(before.classes.split(/\\s+/));\n\t\t\t\t\tif (before.tooltip)\n\t\t\t\t\t\ttooltip = before.tooltip;\n\t\t\t\t}\n\n\t\t\t\tclsName = $.unique(clsName);\n\t\t\t\thtml.push('<td class=\"'+clsName.join(' ')+'\"' + (tooltip ? ' title=\"'+tooltip+'\"' : '') + '>'+prevMonth.getUTCDate() + '</td>');\n\t\t\t\tif (prevMonth.getUTCDay() === this.o.weekEnd){\n\t\t\t\t\thtml.push('</tr>');\n\t\t\t\t}\n\t\t\t\tprevMonth.setUTCDate(prevMonth.getUTCDate()+1);\n\t\t\t}\n\t\t\tthis.picker.find('.datepicker-days tbody').empty().append(html.join(''));\n\n\t\t\tvar months = this.picker.find('.datepicker-months')\n\t\t\t\t\t\t.find('th:eq(1)')\n\t\t\t\t\t\t\t.text(year)\n\t\t\t\t\t\t\t.end()\n\t\t\t\t\t\t.find('span').removeClass('active');\n\n\t\t\t$.each(this.dates, function(i, d){\n\t\t\t\tif (d.getUTCFullYear() === year)\n\t\t\t\t\tmonths.eq(d.getUTCMonth()).addClass('active');\n\t\t\t});\n\n\t\t\tif (year < startYear || year > endYear){\n\t\t\t\tmonths.addClass('disabled');\n\t\t\t}\n\t\t\tif (year === startYear){\n\t\t\t\tmonths.slice(0, startMonth).addClass('disabled');\n\t\t\t}\n\t\t\tif (year === endYear){\n\t\t\t\tmonths.slice(endMonth+1).addClass('disabled');\n\t\t\t}\n\n\t\t\thtml = '';\n\t\t\tyear = parseInt(year/10, 10) * 10;\n\t\t\tvar yearCont = this.picker.find('.datepicker-years')\n\t\t\t\t\t\t\t\t.find('th:eq(1)')\n\t\t\t\t\t\t\t\t\t.text(year + '-' + (year + 9))\n\t\t\t\t\t\t\t\t\t.end()\n\t\t\t\t\t\t\t\t.find('td');\n\t\t\tyear -= 1;\n\t\t\tvar years = $.map(this.dates, function(d){\n\t\t\t\t\treturn d.getUTCFullYear();\n\t\t\t\t}),\n\t\t\t\tclasses;\n\t\t\tfor (var i = -1; i < 11; i++){\n\t\t\t\tclasses = ['year'];\n\t\t\t\tif (i === -1)\n\t\t\t\t\tclasses.push('old');\n\t\t\t\telse if (i === 10)\n\t\t\t\t\tclasses.push('new');\n\t\t\t\tif ($.inArray(year, years) !== -1)\n\t\t\t\t\tclasses.push('active');\n\t\t\t\tif (year < startYear || year > endYear)\n\t\t\t\t\tclasses.push('disabled');\n\t\t\t\thtml += '<span class=\"' + classes.join(' ') + '\">'+year+'</span>';\n\t\t\t\tyear += 1;\n\t\t\t}\n\t\t\tyearCont.html(html);\n\t\t},\n\n\t\tupdateNavArrows: function(){\n\t\t\tif (!this._allow_update)\n\t\t\t\treturn;\n\n\t\t\tvar d = new Date(this.viewDate),\n\t\t\t\tyear = d.getUTCFullYear(),\n\t\t\t\tmonth = d.getUTCMonth();\n\t\t\tswitch (this.viewMode){\n\t\t\t\tcase 0:\n\t\t\t\t\tif (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear() && month <= this.o.startDate.getUTCMonth()){\n\t\t\t\t\t\tthis.picker.find('.prev').css({visibility: 'hidden'});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.picker.find('.prev').css({visibility: 'visible'});\n\t\t\t\t\t}\n\t\t\t\t\tif (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear() && month >= this.o.endDate.getUTCMonth()){\n\t\t\t\t\t\tthis.picker.find('.next').css({visibility: 'hidden'});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.picker.find('.next').css({visibility: 'visible'});\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1:\n\t\t\t\tcase 2:\n\t\t\t\t\tif (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear()){\n\t\t\t\t\t\tthis.picker.find('.prev').css({visibility: 'hidden'});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.picker.find('.prev').css({visibility: 'visible'});\n\t\t\t\t\t}\n\t\t\t\t\tif (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear()){\n\t\t\t\t\t\tthis.picker.find('.next').css({visibility: 'hidden'});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.picker.find('.next').css({visibility: 'visible'});\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\n\t\tclick: function(e){\n\t\t\te.preventDefault();\n\t\t\tvar target = $(e.target).closest('span, td, th'),\n\t\t\t\tyear, month, day;\n\t\t\tif (target.length === 1){\n\t\t\t\tswitch (target[0].nodeName.toLowerCase()){\n\t\t\t\t\tcase 'th':\n\t\t\t\t\t\tswitch (target[0].className){\n\t\t\t\t\t\t\tcase 'datepicker-switch':\n\t\t\t\t\t\t\t\tthis.showMode(1);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'prev':\n\t\t\t\t\t\t\tcase 'next':\n\t\t\t\t\t\t\t\tvar dir = DPGlobal.modes[this.viewMode].navStep * (target[0].className === 'prev' ? -1 : 1);\n\t\t\t\t\t\t\t\tswitch (this.viewMode){\n\t\t\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\t\t\tthis.viewDate = this.moveMonth(this.viewDate, dir);\n\t\t\t\t\t\t\t\t\t\tthis._trigger('changeMonth', this.viewDate);\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t\t\tthis.viewDate = this.moveYear(this.viewDate, dir);\n\t\t\t\t\t\t\t\t\t\tif (this.viewMode === 1)\n\t\t\t\t\t\t\t\t\t\t\tthis._trigger('changeYear', this.viewDate);\n\t\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\tthis.fill();\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'today':\n\t\t\t\t\t\t\t\tvar date = new Date();\n\t\t\t\t\t\t\t\tdate = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);\n\n\t\t\t\t\t\t\t\tthis.showMode(-2);\n\t\t\t\t\t\t\t\tvar which = this.o.todayBtn === 'linked' ? null : 'view';\n\t\t\t\t\t\t\t\tthis._setDate(date, which);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'clear':\n\t\t\t\t\t\t\t\tvar element;\n\t\t\t\t\t\t\t\tif (this.isInput)\n\t\t\t\t\t\t\t\t\telement = this.element;\n\t\t\t\t\t\t\t\telse if (this.component)\n\t\t\t\t\t\t\t\t\telement = this.element.find('input');\n\t\t\t\t\t\t\t\tif (element)\n\t\t\t\t\t\t\t\t\telement.val(\"\").change();\n\t\t\t\t\t\t\t\tthis.update();\n\t\t\t\t\t\t\t\tthis._trigger('changeDate');\n\t\t\t\t\t\t\t\tif (this.o.autoclose)\n\t\t\t\t\t\t\t\t\tthis.hide();\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'span':\n\t\t\t\t\t\tif (!target.is('.disabled')){\n\t\t\t\t\t\t\tthis.viewDate.setUTCDate(1);\n\t\t\t\t\t\t\tif (target.is('.month')){\n\t\t\t\t\t\t\t\tday = 1;\n\t\t\t\t\t\t\t\tmonth = target.parent().find('span').index(target);\n\t\t\t\t\t\t\t\tyear = this.viewDate.getUTCFullYear();\n\t\t\t\t\t\t\t\tthis.viewDate.setUTCMonth(month);\n\t\t\t\t\t\t\t\tthis._trigger('changeMonth', this.viewDate);\n\t\t\t\t\t\t\t\tif (this.o.minViewMode === 1){\n\t\t\t\t\t\t\t\t\tthis._setDate(UTCDate(year, month, day));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tday = 1;\n\t\t\t\t\t\t\t\tmonth = 0;\n\t\t\t\t\t\t\t\tyear = parseInt(target.text(), 10)||0;\n\t\t\t\t\t\t\t\tthis.viewDate.setUTCFullYear(year);\n\t\t\t\t\t\t\t\tthis._trigger('changeYear', this.viewDate);\n\t\t\t\t\t\t\t\tif (this.o.minViewMode === 2){\n\t\t\t\t\t\t\t\t\tthis._setDate(UTCDate(year, month, day));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.showMode(-1);\n\t\t\t\t\t\t\tthis.fill();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'td':\n\t\t\t\t\t\tif (target.is('.day') && !target.is('.disabled')){\n\t\t\t\t\t\t\tday = parseInt(target.text(), 10)||1;\n\t\t\t\t\t\t\tyear = this.viewDate.getUTCFullYear();\n\t\t\t\t\t\t\tmonth = this.viewDate.getUTCMonth();\n\t\t\t\t\t\t\tif (target.is('.old')){\n\t\t\t\t\t\t\t\tif (month === 0){\n\t\t\t\t\t\t\t\t\tmonth = 11;\n\t\t\t\t\t\t\t\t\tyear -= 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tmonth -= 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (target.is('.new')){\n\t\t\t\t\t\t\t\tif (month === 11){\n\t\t\t\t\t\t\t\t\tmonth = 0;\n\t\t\t\t\t\t\t\t\tyear += 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tmonth += 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis._setDate(UTCDate(year, month, day));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.picker.is(':visible') && this._focused_from){\n\t\t\t\t$(this._focused_from).focus();\n\t\t\t}\n\t\t\tdelete this._focused_from;\n\t\t},\n\n\t\t_toggle_multidate: function(date){\n\t\t\tvar ix = this.dates.contains(date);\n\t\t\tif (!date){\n\t\t\t\tthis.dates.clear();\n\t\t\t}\n\t\t\telse if (ix !== -1){\n\t\t\t\tthis.dates.remove(ix);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.dates.push(date);\n\t\t\t}\n\t\t\tif (typeof this.o.multidate === 'number')\n\t\t\t\twhile (this.dates.length > this.o.multidate)\n\t\t\t\t\tthis.dates.remove(0);\n\t\t},\n\n\t\t_setDate: function(date, which){\n\t\t\tif (!which || which === 'date')\n\t\t\t\tthis._toggle_multidate(date && new Date(date));\n\t\t\tif (!which || which  === 'view')\n\t\t\t\tthis.viewDate = date && new Date(date);\n\n\t\t\tthis.fill();\n\t\t\tthis.setValue();\n\t\t\tthis._trigger('changeDate');\n\t\t\tvar element;\n\t\t\tif (this.isInput){\n\t\t\t\telement = this.element;\n\t\t\t}\n\t\t\telse if (this.component){\n\t\t\t\telement = this.element.find('input');\n\t\t\t}\n\t\t\tif (element){\n\t\t\t\telement.change();\n\t\t\t}\n\t\t\tif (this.o.autoclose && (!which || which === 'date')){\n\t\t\t\tthis.hide();\n\t\t\t}\n\t\t},\n\n\t\tmoveMonth: function(date, dir){\n\t\t\tif (!date)\n\t\t\t\treturn undefined;\n\t\t\tif (!dir)\n\t\t\t\treturn date;\n\t\t\tvar new_date = new Date(date.valueOf()),\n\t\t\t\tday = new_date.getUTCDate(),\n\t\t\t\tmonth = new_date.getUTCMonth(),\n\t\t\t\tmag = Math.abs(dir),\n\t\t\t\tnew_month, test;\n\t\t\tdir = dir > 0 ? 1 : -1;\n\t\t\tif (mag === 1){\n\t\t\t\ttest = dir === -1\n\t\t\t\t\t// If going back one month, make sure month is not current month\n\t\t\t\t\t// (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02)\n\t\t\t\t\t? function(){\n\t\t\t\t\t\treturn new_date.getUTCMonth() === month;\n\t\t\t\t\t}\n\t\t\t\t\t// If going forward one month, make sure month is as expected\n\t\t\t\t\t// (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02)\n\t\t\t\t\t: function(){\n\t\t\t\t\t\treturn new_date.getUTCMonth() !== new_month;\n\t\t\t\t\t};\n\t\t\t\tnew_month = month + dir;\n\t\t\t\tnew_date.setUTCMonth(new_month);\n\t\t\t\t// Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11\n\t\t\t\tif (new_month < 0 || new_month > 11)\n\t\t\t\t\tnew_month = (new_month + 12) % 12;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// For magnitudes >1, move one month at a time...\n\t\t\t\tfor (var i=0; i < mag; i++)\n\t\t\t\t\t// ...which might decrease the day (eg, Jan 31 to Feb 28, etc)...\n\t\t\t\t\tnew_date = this.moveMonth(new_date, dir);\n\t\t\t\t// ...then reset the day, keeping it in the new month\n\t\t\t\tnew_month = new_date.getUTCMonth();\n\t\t\t\tnew_date.setUTCDate(day);\n\t\t\t\ttest = function(){\n\t\t\t\t\treturn new_month !== new_date.getUTCMonth();\n\t\t\t\t};\n\t\t\t}\n\t\t\t// Common date-resetting loop -- if date is beyond end of month, make it\n\t\t\t// end of month\n\t\t\twhile (test()){\n\t\t\t\tnew_date.setUTCDate(--day);\n\t\t\t\tnew_date.setUTCMonth(new_month);\n\t\t\t}\n\t\t\treturn new_date;\n\t\t},\n\n\t\tmoveYear: function(date, dir){\n\t\t\treturn this.moveMonth(date, dir*12);\n\t\t},\n\n\t\tdateWithinRange: function(date){\n\t\t\treturn date >= this.o.startDate && date <= this.o.endDate;\n\t\t},\n\n\t\tkeydown: function(e){\n\t\t\tif (this.picker.is(':not(:visible)')){\n\t\t\t\tif (e.keyCode === 27) // allow escape to hide and re-show picker\n\t\t\t\t\tthis.show();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar dateChanged = false,\n\t\t\t\tdir, newDate, newViewDate,\n\t\t\t\tfocusDate = this.focusDate || this.viewDate;\n\t\t\tswitch (e.keyCode){\n\t\t\t\tcase 27: // escape\n\t\t\t\t\tif (this.focusDate){\n\t\t\t\t\t\tthis.focusDate = null;\n\t\t\t\t\t\tthis.viewDate = this.dates.get(-1) || this.viewDate;\n\t\t\t\t\t\tthis.fill();\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tthis.hide();\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 37: // left\n\t\t\t\tcase 39: // right\n\t\t\t\t\tif (!this.o.keyboardNavigation)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdir = e.keyCode === 37 ? -1 : 1;\n\t\t\t\t\tif (e.ctrlKey){\n\t\t\t\t\t\tnewDate = this.moveYear(this.dates.get(-1) || UTCToday(), dir);\n\t\t\t\t\t\tnewViewDate = this.moveYear(focusDate, dir);\n\t\t\t\t\t\tthis._trigger('changeYear', this.viewDate);\n\t\t\t\t\t}\n\t\t\t\t\telse if (e.shiftKey){\n\t\t\t\t\t\tnewDate = this.moveMonth(this.dates.get(-1) || UTCToday(), dir);\n\t\t\t\t\t\tnewViewDate = this.moveMonth(focusDate, dir);\n\t\t\t\t\t\tthis._trigger('changeMonth', this.viewDate);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tnewDate = new Date(this.dates.get(-1) || UTCToday());\n\t\t\t\t\t\tnewDate.setUTCDate(newDate.getUTCDate() + dir);\n\t\t\t\t\t\tnewViewDate = new Date(focusDate);\n\t\t\t\t\t\tnewViewDate.setUTCDate(focusDate.getUTCDate() + dir);\n\t\t\t\t\t}\n\t\t\t\t\tif (this.dateWithinRange(newDate)){\n\t\t\t\t\t\tthis.focusDate = this.viewDate = newViewDate;\n\t\t\t\t\t\tthis.setValue();\n\t\t\t\t\t\tthis.fill();\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 38: // up\n\t\t\t\tcase 40: // down\n\t\t\t\t\tif (!this.o.keyboardNavigation)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdir = e.keyCode === 38 ? -1 : 1;\n\t\t\t\t\tif (e.ctrlKey){\n\t\t\t\t\t\tnewDate = this.moveYear(this.dates.get(-1) || UTCToday(), dir);\n\t\t\t\t\t\tnewViewDate = this.moveYear(focusDate, dir);\n\t\t\t\t\t\tthis._trigger('changeYear', this.viewDate);\n\t\t\t\t\t}\n\t\t\t\t\telse if (e.shiftKey){\n\t\t\t\t\t\tnewDate = this.moveMonth(this.dates.get(-1) || UTCToday(), dir);\n\t\t\t\t\t\tnewViewDate = this.moveMonth(focusDate, dir);\n\t\t\t\t\t\tthis._trigger('changeMonth', this.viewDate);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tnewDate = new Date(this.dates.get(-1) || UTCToday());\n\t\t\t\t\t\tnewDate.setUTCDate(newDate.getUTCDate() + dir * 7);\n\t\t\t\t\t\tnewViewDate = new Date(focusDate);\n\t\t\t\t\t\tnewViewDate.setUTCDate(focusDate.getUTCDate() + dir * 7);\n\t\t\t\t\t}\n\t\t\t\t\tif (this.dateWithinRange(newDate)){\n\t\t\t\t\t\tthis.focusDate = this.viewDate = newViewDate;\n\t\t\t\t\t\tthis.setValue();\n\t\t\t\t\t\tthis.fill();\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 32: // spacebar\n\t\t\t\t\t// Spacebar is used in manually typing dates in some formats.\n\t\t\t\t\t// As such, its behavior should not be hijacked.\n\t\t\t\t\tbreak;\n\t\t\t\tcase 13: // enter\n\t\t\t\t\tfocusDate = this.focusDate || this.dates.get(-1) || this.viewDate;\n\t\t\t\t\tthis._toggle_multidate(focusDate);\n\t\t\t\t\tdateChanged = true;\n\t\t\t\t\tthis.focusDate = null;\n\t\t\t\t\tthis.viewDate = this.dates.get(-1) || this.viewDate;\n\t\t\t\t\tthis.setValue();\n\t\t\t\t\tthis.fill();\n\t\t\t\t\tif (this.picker.is(':visible')){\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tif (this.o.autoclose)\n\t\t\t\t\t\t\tthis.hide();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 9: // tab\n\t\t\t\t\tthis.focusDate = null;\n\t\t\t\t\tthis.viewDate = this.dates.get(-1) || this.viewDate;\n\t\t\t\t\tthis.fill();\n\t\t\t\t\tthis.hide();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (dateChanged){\n\t\t\t\tif (this.dates.length)\n\t\t\t\t\tthis._trigger('changeDate');\n\t\t\t\telse\n\t\t\t\t\tthis._trigger('clearDate');\n\t\t\t\tvar element;\n\t\t\t\tif (this.isInput){\n\t\t\t\t\telement = this.element;\n\t\t\t\t}\n\t\t\t\telse if (this.component){\n\t\t\t\t\telement = this.element.find('input');\n\t\t\t\t}\n\t\t\t\tif (element){\n\t\t\t\t\telement.change();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tshowMode: function(dir){\n\t\t\tif (dir){\n\t\t\t\tthis.viewMode = Math.max(this.o.minViewMode, Math.min(2, this.viewMode + dir));\n\t\t\t}\n\t\t\tthis.picker\n\t\t\t\t.find('>div')\n\t\t\t\t.hide()\n\t\t\t\t.filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName)\n\t\t\t\t\t.css('display', 'block');\n\t\t\tthis.updateNavArrows();\n\t\t}\n\t};\n\n\tvar DateRangePicker = function(element, options){\n\t\tthis.element = $(element);\n\t\tthis.inputs = $.map(options.inputs, function(i){\n\t\t\treturn i.jquery ? i[0] : i;\n\t\t});\n\t\tdelete options.inputs;\n\n\t\t$(this.inputs)\n\t\t\t.datepicker(options)\n\t\t\t.bind('changeDate', $.proxy(this.dateUpdated, this));\n\n\t\tthis.pickers = $.map(this.inputs, function(i){\n\t\t\treturn $(i).data('datepicker');\n\t\t});\n\t\tthis.updateDates();\n\t};\n\tDateRangePicker.prototype = {\n\t\tupdateDates: function(){\n\t\t\tthis.dates = $.map(this.pickers, function(i){\n\t\t\t\treturn i.getUTCDate();\n\t\t\t});\n\t\t\tthis.updateRanges();\n\t\t},\n\t\tupdateRanges: function(){\n\t\t\tvar range = $.map(this.dates, function(d){\n\t\t\t\treturn d.valueOf();\n\t\t\t});\n\t\t\t$.each(this.pickers, function(i, p){\n\t\t\t\tp.setRange(range);\n\t\t\t});\n\t\t},\n\t\tdateUpdated: function(e){\n\t\t\t// `this.updating` is a workaround for preventing infinite recursion\n\t\t\t// between `changeDate` triggering and `setUTCDate` calling.  Until\n\t\t\t// there is a better mechanism.\n\t\t\tif (this.updating)\n\t\t\t\treturn;\n\t\t\tthis.updating = true;\n\n\t\t\tvar dp = $(e.target).data('datepicker'),\n\t\t\t\tnew_date = dp.getUTCDate(),\n\t\t\t\ti = $.inArray(e.target, this.inputs),\n\t\t\t\tl = this.inputs.length;\n\t\t\tif (i === -1)\n\t\t\t\treturn;\n\n\t\t\t$.each(this.pickers, function(i, p){\n\t\t\t\tif (!p.getUTCDate())\n\t\t\t\t\tp.setUTCDate(new_date);\n\t\t\t});\n\n\t\t\tif (new_date < this.dates[i]){\n\t\t\t\t// Date being moved earlier/left\n\t\t\t\twhile (i >= 0 && new_date < this.dates[i]){\n\t\t\t\t\tthis.pickers[i--].setUTCDate(new_date);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (new_date > this.dates[i]){\n\t\t\t\t// Date being moved later/right\n\t\t\t\twhile (i < l && new_date > this.dates[i]){\n\t\t\t\t\tthis.pickers[i++].setUTCDate(new_date);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.updateDates();\n\n\t\t\tdelete this.updating;\n\t\t},\n\t\tremove: function(){\n\t\t\t$.map(this.pickers, function(p){ p.remove(); });\n\t\t\tdelete this.element.data().datepicker;\n\t\t}\n\t};\n\n\tfunction opts_from_el(el, prefix){\n\t\t// Derive options from element data-attrs\n\t\tvar data = $(el).data(),\n\t\t\tout = {}, inkey,\n\t\t\treplace = new RegExp('^' + prefix.toLowerCase() + '([A-Z])');\n\t\tprefix = new RegExp('^' + prefix.toLowerCase());\n\t\tfunction re_lower(_,a){\n\t\t\treturn a.toLowerCase();\n\t\t}\n\t\tfor (var key in data)\n\t\t\tif (prefix.test(key)){\n\t\t\t\tinkey = key.replace(replace, re_lower);\n\t\t\t\tout[inkey] = data[key];\n\t\t\t}\n\t\treturn out;\n\t}\n\n\tfunction opts_from_locale(lang){\n\t\t// Derive options from locale plugins\n\t\tvar out = {};\n\t\t// Check if \"de-DE\" style date is available, if not language should\n\t\t// fallback to 2 letter code eg \"de\"\n\t\tif (!dates[lang]){\n\t\t\tlang = lang.split('-')[0];\n\t\t\tif (!dates[lang])\n\t\t\t\treturn;\n\t\t}\n\t\tvar d = dates[lang];\n\t\t$.each(locale_opts, function(i,k){\n\t\t\tif (k in d)\n\t\t\t\tout[k] = d[k];\n\t\t});\n\t\treturn out;\n\t}\n\n\tvar old = $.fn.datepicker;\n\t$.fn.datepicker = function(option){\n\t\tvar args = Array.apply(null, arguments);\n\t\targs.shift();\n\t\tvar internal_return;\n\t\tthis.each(function(){\n\t\t\tvar $this = $(this),\n\t\t\t\tdata = $this.data('datepicker'),\n\t\t\t\toptions = typeof option === 'object' && option;\n\t\t\tif (!data){\n\t\t\t\tvar elopts = opts_from_el(this, 'date'),\n\t\t\t\t\t// Preliminary otions\n\t\t\t\t\txopts = $.extend({}, defaults, elopts, options),\n\t\t\t\t\tlocopts = opts_from_locale(xopts.language),\n\t\t\t\t\t// Options priority: js args, data-attrs, locales, defaults\n\t\t\t\t\topts = $.extend({}, defaults, locopts, elopts, options);\n\t\t\t\tif ($this.is('.input-daterange') || opts.inputs){\n\t\t\t\t\tvar ropts = {\n\t\t\t\t\t\tinputs: opts.inputs || $this.find('input').toArray()\n\t\t\t\t\t};\n\t\t\t\t\t$this.data('datepicker', (data = new DateRangePicker(this, $.extend(opts, ropts))));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t$this.data('datepicker', (data = new Datepicker(this, opts)));\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof option === 'string' && typeof data[option] === 'function'){\n\t\t\t\tinternal_return = data[option].apply(data, args);\n\t\t\t\tif (internal_return !== undefined)\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tif (internal_return !== undefined)\n\t\t\treturn internal_return;\n\t\telse\n\t\t\treturn this;\n\t};\n\n\tvar defaults = $.fn.datepicker.defaults = {\n\t\tautoclose: false,\n\t\tbeforeShowDay: $.noop,\n\t\tcalendarWeeks: false,\n\t\tclearBtn: false,\n\t\tdaysOfWeekDisabled: [],\n\t\tendDate: Infinity,\n\t\tforceParse: true,\n\t\tformat: 'yyyy-mm-dd',\n\t\tkeyboardNavigation: true,\n\t\tlanguage: 'en',\n\t\tminViewMode: 0,\n\t\tmultidate: false,\n\t\tmultidateSeparator: ',',\n\t\torientation: \"auto\",\n\t\trtl: false,\n\t\tstartDate: -Infinity,\n\t\tstartView: 0,\n\t\ttodayBtn: false,\n\t\ttodayHighlight: false,\n\t\tweekStart: 0\n\t};\n\tvar locale_opts = $.fn.datepicker.locale_opts = [\n\t\t'format',\n\t\t'rtl',\n\t\t'weekStart'\n\t];\n\t$.fn.datepicker.Constructor = Datepicker;\n\tvar dates = $.fn.datepicker.dates = {\n\t\ten: {\n\t\t\tdays: [\"星期日\", \"星期一\", \"星期二\", \"星期三\", \"星期四\", \"星期五\", \"星期六\", \"星期日\"],\n\t\t\tdaysShort: [\"日\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\", \"日\"],\n\t\t\tdaysMin: [\"日\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\", \"日\"],\n\t\t\tmonths: [\"一月\", \"二月\", \"三月\", \"四月\", \"五月\", \"六月\", \"七月\", \"八月\", \"九月\", \"十月\", \"十一月\", \"十二月\"],\n\t\t\tmonthsShort: [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\"],\n\t\t\ttoday: \"今天\",\n\t\t\tclear: \"清空\"\n\t\t}\n\t};\n\n\tvar DPGlobal = {\n\t\tmodes: [\n\t\t\t{\n\t\t\t\tclsName: 'days',\n\t\t\t\tnavFnc: 'Month',\n\t\t\t\tnavStep: 1\n\t\t\t},\n\t\t\t{\n\t\t\t\tclsName: 'months',\n\t\t\t\tnavFnc: 'FullYear',\n\t\t\t\tnavStep: 1\n\t\t\t},\n\t\t\t{\n\t\t\t\tclsName: 'years',\n\t\t\t\tnavFnc: 'FullYear',\n\t\t\t\tnavStep: 10\n\t\t}],\n\t\tisLeapYear: function(year){\n\t\t\treturn (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0));\n\t\t},\n\t\tgetDaysInMonth: function(year, month){\n\t\t\treturn [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];\n\t\t},\n\t\tvalidParts: /dd?|DD?|mm?|MM?|yy(?:yy)?/g,\n\t\tnonpunctuation: /[^ -\\/:-@\\[\\u3400-\\u9fff-`{-~\\t\\n\\r]+/g,\n\t\tparseFormat: function(format){\n\t\t\t// IE treats \\0 as a string end in inputs (truncating the value),\n\t\t\t// so it's a bad format delimiter, anyway\n\t\t\tvar separators = format.replace(this.validParts, '\\0').split('\\0'),\n\t\t\t\tparts = format.match(this.validParts);\n\t\t\tif (!separators || !separators.length || !parts || parts.length === 0){\n\t\t\t\tthrow new Error(\"Invalid date format.\");\n\t\t\t}\n\t\t\treturn {separators: separators, parts: parts};\n\t\t},\n\t\tparseDate: function(date, format, language){\n\t\t\tif (!date)\n\t\t\t\treturn undefined;\n\t\t\tif (date instanceof Date)\n\t\t\t\treturn date;\n\t\t\tif (typeof format === 'string')\n\t\t\t\tformat = DPGlobal.parseFormat(format);\n\t\t\tvar part_re = /([\\-+]\\d+)([dmwy])/,\n\t\t\t\tparts = date.match(/([\\-+]\\d+)([dmwy])/g),\n\t\t\t\tpart, dir, i;\n\t\t\tif (/^[\\-+]\\d+[dmwy]([\\s,]+[\\-+]\\d+[dmwy])*$/.test(date)){\n\t\t\t\tdate = new Date();\n\t\t\t\tfor (i=0; i < parts.length; i++){\n\t\t\t\t\tpart = part_re.exec(parts[i]);\n\t\t\t\t\tdir = parseInt(part[1]);\n\t\t\t\t\tswitch (part[2]){\n\t\t\t\t\t\tcase 'd':\n\t\t\t\t\t\t\tdate.setUTCDate(date.getUTCDate() + dir);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'm':\n\t\t\t\t\t\t\tdate = Datepicker.prototype.moveMonth.call(Datepicker.prototype, date, dir);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'w':\n\t\t\t\t\t\t\tdate.setUTCDate(date.getUTCDate() + dir * 7);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'y':\n\t\t\t\t\t\t\tdate = Datepicker.prototype.moveYear.call(Datepicker.prototype, date, dir);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 0, 0, 0);\n\t\t\t}\n\t\t\tparts = date && date.match(this.nonpunctuation) || [];\n\t\t\tdate = new Date();\n\t\t\tvar parsed = {},\n\t\t\t\tsetters_order = ['yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'd', 'dd'],\n\t\t\t\tsetters_map = {\n\t\t\t\t\tyyyy: function(d,v){\n\t\t\t\t\t\treturn d.setUTCFullYear(v);\n\t\t\t\t\t},\n\t\t\t\t\tyy: function(d,v){\n\t\t\t\t\t\treturn d.setUTCFullYear(2000+v);\n\t\t\t\t\t},\n\t\t\t\t\tm: function(d,v){\n\t\t\t\t\t\tif (isNaN(d))\n\t\t\t\t\t\t\treturn d;\n\t\t\t\t\t\tv -= 1;\n\t\t\t\t\t\twhile (v < 0) v += 12;\n\t\t\t\t\t\tv %= 12;\n\t\t\t\t\t\td.setUTCMonth(v);\n\t\t\t\t\t\twhile (d.getUTCMonth() !== v)\n\t\t\t\t\t\t\td.setUTCDate(d.getUTCDate()-1);\n\t\t\t\t\t\treturn d;\n\t\t\t\t\t},\n\t\t\t\t\td: function(d,v){\n\t\t\t\t\t\treturn d.setUTCDate(v);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tval, filtered;\n\t\t\tsetters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m'];\n\t\t\tsetters_map['dd'] = setters_map['d'];\n\t\t\tdate = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);\n\t\t\tvar fparts = format.parts.slice();\n\t\t\t// Remove noop parts\n\t\t\tif (parts.length !== fparts.length){\n\t\t\t\tfparts = $(fparts).filter(function(i,p){\n\t\t\t\t\treturn $.inArray(p, setters_order) !== -1;\n\t\t\t\t}).toArray();\n\t\t\t}\n\t\t\t// Process remainder\n\t\t\tfunction match_part(){\n\t\t\t\tvar m = this.slice(0, parts[i].length),\n\t\t\t\t\tp = parts[i].slice(0, m.length);\n\t\t\t\treturn m === p;\n\t\t\t}\n\t\t\tif (parts.length === fparts.length){\n\t\t\t\tvar cnt;\n\t\t\t\tfor (i=0, cnt = fparts.length; i < cnt; i++){\n\t\t\t\t\tval = parseInt(parts[i], 10);\n\t\t\t\t\tpart = fparts[i];\n\t\t\t\t\tif (isNaN(val)){\n\t\t\t\t\t\tswitch (part){\n\t\t\t\t\t\t\tcase 'MM':\n\t\t\t\t\t\t\t\tfiltered = $(dates[language].months).filter(match_part);\n\t\t\t\t\t\t\t\tval = $.inArray(filtered[0], dates[language].months) + 1;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'M':\n\t\t\t\t\t\t\t\tfiltered = $(dates[language].monthsShort).filter(match_part);\n\t\t\t\t\t\t\t\tval = $.inArray(filtered[0], dates[language].monthsShort) + 1;\n\t\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\tparsed[part] = val;\n\t\t\t\t}\n\t\t\t\tvar _date, s;\n\t\t\t\tfor (i=0; i < setters_order.length; i++){\n\t\t\t\t\ts = setters_order[i];\n\t\t\t\t\tif (s in parsed && !isNaN(parsed[s])){\n\t\t\t\t\t\t_date = new Date(date);\n\t\t\t\t\t\tsetters_map[s](_date, parsed[s]);\n\t\t\t\t\t\tif (!isNaN(_date))\n\t\t\t\t\t\t\tdate = _date;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn date;\n\t\t},\n\t\tformatDate: function(date, format, language){\n\t\t\tif (!date)\n\t\t\t\treturn '';\n\t\t\tif (typeof format === 'string')\n\t\t\t\tformat = DPGlobal.parseFormat(format);\n\t\t\tvar val = {\n\t\t\t\td: date.getUTCDate(),\n\t\t\t\tD: dates[language].daysShort[date.getUTCDay()],\n\t\t\t\tDD: dates[language].days[date.getUTCDay()],\n\t\t\t\tm: date.getUTCMonth() + 1,\n\t\t\t\tM: dates[language].monthsShort[date.getUTCMonth()],\n\t\t\t\tMM: dates[language].months[date.getUTCMonth()],\n\t\t\t\tyy: date.getUTCFullYear().toString().substring(2),\n\t\t\t\tyyyy: date.getUTCFullYear()\n\t\t\t};\n\t\t\tval.dd = (val.d < 10 ? '0' : '') + val.d;\n\t\t\tval.mm = (val.m < 10 ? '0' : '') + val.m;\n\t\t\tdate = [];\n\t\t\tvar seps = $.extend([], format.separators);\n\t\t\tfor (var i=0, cnt = format.parts.length; i <= cnt; i++){\n\t\t\t\tif (seps.length)\n\t\t\t\t\tdate.push(seps.shift());\n\t\t\t\tdate.push(val[format.parts[i]]);\n\t\t\t}\n\t\t\treturn date.join('');\n\t\t},\n\t\theadTemplate: '<thead>'+\n\t\t\t\t\t\t\t'<tr>'+\n\t\t\t\t\t\t\t\t'<th class=\"prev\">&laquo;</th>'+\n\t\t\t\t\t\t\t\t'<th colspan=\"5\" class=\"datepicker-switch\"></th>'+\n\t\t\t\t\t\t\t\t'<th class=\"next\">&raquo;</th>'+\n\t\t\t\t\t\t\t'</tr>'+\n\t\t\t\t\t\t'</thead>',\n\t\tcontTemplate: '<tbody><tr><td colspan=\"7\"></td></tr></tbody>',\n\t\tfootTemplate: '<tfoot>'+\n\t\t\t\t\t\t\t'<tr>'+\n\t\t\t\t\t\t\t\t'<th colspan=\"7\" class=\"today\"></th>'+\n\t\t\t\t\t\t\t'</tr>'+\n\t\t\t\t\t\t\t'<tr>'+\n\t\t\t\t\t\t\t\t'<th colspan=\"7\" class=\"clear\"></th>'+\n\t\t\t\t\t\t\t'</tr>'+\n\t\t\t\t\t\t'</tfoot>'\n\t};\n\tDPGlobal.template = '<div class=\"datepicker\">'+\n\t\t\t\t\t\t\t'<div class=\"datepicker-days\">'+\n\t\t\t\t\t\t\t\t'<table class=\" table-condensed\">'+\n\t\t\t\t\t\t\t\t\tDPGlobal.headTemplate+\n\t\t\t\t\t\t\t\t\t'<tbody></tbody>'+\n\t\t\t\t\t\t\t\t\tDPGlobal.footTemplate+\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\t'<div class=\"datepicker-months\">'+\n\t\t\t\t\t\t\t\t'<table class=\"table-condensed\">'+\n\t\t\t\t\t\t\t\t\tDPGlobal.headTemplate+\n\t\t\t\t\t\t\t\t\tDPGlobal.contTemplate+\n\t\t\t\t\t\t\t\t\tDPGlobal.footTemplate+\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\t'<div class=\"datepicker-years\">'+\n\t\t\t\t\t\t\t\t'<table class=\"table-condensed\">'+\n\t\t\t\t\t\t\t\t\tDPGlobal.headTemplate+\n\t\t\t\t\t\t\t\t\tDPGlobal.contTemplate+\n\t\t\t\t\t\t\t\t\tDPGlobal.footTemplate+\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\n\t$.fn.datepicker.DPGlobal = DPGlobal;\n\n\n\t/* DATEPICKER NO CONFLICT\n\t* =================== */\n\n\t$.fn.datepicker.noConflict = function(){\n\t\t$.fn.datepicker = old;\n\t\treturn this;\n\t};\n\n\n\t/* DATEPICKER DATA-API\n\t* ================== */\n\n\t$(document).on(\n\t\t'focus.datepicker.data-api click.datepicker.data-api',\n\t\t'[data-provide=\"datepicker\"]',\n\t\tfunction(e){\n\t\t\tvar $this = $(this);\n\t\t\tif ($this.data('datepicker'))\n\t\t\t\treturn;\n\t\t\te.preventDefault();\n\t\t\t// component click requires us to explicitly show it\n\t\t\t$this.datepicker('show');\n\t\t}\n\t);\n\t$(function(){\n\t\t$('[data-provide=\"datepicker-inline\"]').datepicker();\n\t});\n\n}(window.jQuery));\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/diff_match_patch/diff_match_patch.js",
    "content": "(function(){function diff_match_patch(){this.Diff_Timeout=1;this.Diff_EditCost=4;this.Match_Threshold=0.5;this.Match_Distance=1E3;this.Patch_DeleteThreshold=0.5;this.Patch_Margin=4;this.Match_MaxBits=32}\ndiff_match_patch.prototype.diff_main=function(a,b,c,d){\"undefined\"==typeof d&&(d=0>=this.Diff_Timeout?Number.MAX_VALUE:(new Date).getTime()+1E3*this.Diff_Timeout);if(null==a||null==b)throw Error(\"Null input. (diff_main)\");if(a==b)return a?[[0,a]]:[];\"undefined\"==typeof c&&(c=!0);var e=c,f=this.diff_commonPrefix(a,b);c=a.substring(0,f);a=a.substring(f);b=b.substring(f);var f=this.diff_commonSuffix(a,b),g=a.substring(a.length-f);a=a.substring(0,a.length-f);b=b.substring(0,b.length-f);a=this.diff_compute_(a,\nb,e,d);c&&a.unshift([0,c]);g&&a.push([0,g]);this.diff_cleanupMerge(a);return a};\ndiff_match_patch.prototype.diff_compute_=function(a,b,c,d){if(!a)return[[1,b]];if(!b)return[[-1,a]];var e=a.length>b.length?a:b,f=a.length>b.length?b:a,g=e.indexOf(f);return-1!=g?(c=[[1,e.substring(0,g)],[0,f],[1,e.substring(g+f.length)]],a.length>b.length&&(c[0][0]=c[2][0]=-1),c):1==f.length?[[-1,a],[1,b]]:(e=this.diff_halfMatch_(a,b))?(f=e[0],a=e[1],g=e[2],b=e[3],e=e[4],f=this.diff_main(f,g,c,d),c=this.diff_main(a,b,c,d),f.concat([[0,e]],c)):c&&100<a.length&&100<b.length?this.diff_lineMode_(a,b,\nd):this.diff_bisect_(a,b,d)};\ndiff_match_patch.prototype.diff_lineMode_=function(a,b,c){var d=this.diff_linesToChars_(a,b);a=d.chars1;b=d.chars2;d=d.lineArray;a=this.diff_main(a,b,!1,c);this.diff_charsToLines_(a,d);this.diff_cleanupSemantic(a);a.push([0,\"\"]);for(var e=d=b=0,f=\"\",g=\"\";b<a.length;){switch(a[b][0]){case 1:e++;g+=a[b][1];break;case -1:d++;f+=a[b][1];break;case 0:if(1<=d&&1<=e){a.splice(b-d-e,d+e);b=b-d-e;d=this.diff_main(f,g,!1,c);for(e=d.length-1;0<=e;e--)a.splice(b,0,d[e]);b+=d.length}d=e=0;g=f=\"\"}b++}a.pop();return a};\ndiff_match_patch.prototype.diff_bisect_=function(a,b,c){for(var d=a.length,e=b.length,f=Math.ceil((d+e)/2),g=f,h=2*f,j=Array(h),i=Array(h),k=0;k<h;k++)j[k]=-1,i[k]=-1;j[g+1]=0;i[g+1]=0;for(var k=d-e,q=0!=k%2,r=0,t=0,p=0,w=0,v=0;v<f&&!((new Date).getTime()>c);v++){for(var n=-v+r;n<=v-t;n+=2){var l=g+n,m;m=n==-v||n!=v&&j[l-1]<j[l+1]?j[l+1]:j[l-1]+1;for(var s=m-n;m<d&&s<e&&a.charAt(m)==b.charAt(s);)m++,s++;j[l]=m;if(m>d)t+=2;else if(s>e)r+=2;else if(q&&(l=g+k-n,0<=l&&l<h&&-1!=i[l])){var u=d-i[l];if(m>=\nu)return this.diff_bisectSplit_(a,b,m,s,c)}}for(n=-v+p;n<=v-w;n+=2){l=g+n;u=n==-v||n!=v&&i[l-1]<i[l+1]?i[l+1]:i[l-1]+1;for(m=u-n;u<d&&m<e&&a.charAt(d-u-1)==b.charAt(e-m-1);)u++,m++;i[l]=u;if(u>d)w+=2;else if(m>e)p+=2;else if(!q&&(l=g+k-n,0<=l&&(l<h&&-1!=j[l])&&(m=j[l],s=g+m-l,u=d-u,m>=u)))return this.diff_bisectSplit_(a,b,m,s,c)}}return[[-1,a],[1,b]]};\ndiff_match_patch.prototype.diff_bisectSplit_=function(a,b,c,d,e){var f=a.substring(0,c),g=b.substring(0,d);a=a.substring(c);b=b.substring(d);f=this.diff_main(f,g,!1,e);e=this.diff_main(a,b,!1,e);return f.concat(e)};\ndiff_match_patch.prototype.diff_linesToChars_=function(a,b){function c(a){for(var b=\"\",c=0,f=-1,g=d.length;f<a.length-1;){f=a.indexOf(\"\\n\",c);-1==f&&(f=a.length-1);var r=a.substring(c,f+1),c=f+1;(e.hasOwnProperty?e.hasOwnProperty(r):void 0!==e[r])?b+=String.fromCharCode(e[r]):(b+=String.fromCharCode(g),e[r]=g,d[g++]=r)}return b}var d=[],e={};d[0]=\"\";var f=c(a),g=c(b);return{chars1:f,chars2:g,lineArray:d}};\ndiff_match_patch.prototype.diff_charsToLines_=function(a,b){for(var c=0;c<a.length;c++){for(var d=a[c][1],e=[],f=0;f<d.length;f++)e[f]=b[d.charCodeAt(f)];a[c][1]=e.join(\"\")}};diff_match_patch.prototype.diff_commonPrefix=function(a,b){if(!a||!b||a.charAt(0)!=b.charAt(0))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(f,e)==b.substring(f,e)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\ndiff_match_patch.prototype.diff_commonSuffix=function(a,b){if(!a||!b||a.charAt(a.length-1)!=b.charAt(b.length-1))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(a.length-e,a.length-f)==b.substring(b.length-e,b.length-f)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\ndiff_match_patch.prototype.diff_commonOverlap_=function(a,b){var c=a.length,d=b.length;if(0==c||0==d)return 0;c>d?a=a.substring(c-d):c<d&&(b=b.substring(0,c));c=Math.min(c,d);if(a==b)return c;for(var d=0,e=1;;){var f=a.substring(c-e),f=b.indexOf(f);if(-1==f)return d;e+=f;if(0==f||a.substring(c-e)==b.substring(0,e))d=e,e++}};\ndiff_match_patch.prototype.diff_halfMatch_=function(a,b){function c(a,b,c){for(var d=a.substring(c,c+Math.floor(a.length/4)),e=-1,g=\"\",h,j,n,l;-1!=(e=b.indexOf(d,e+1));){var m=f.diff_commonPrefix(a.substring(c),b.substring(e)),s=f.diff_commonSuffix(a.substring(0,c),b.substring(0,e));g.length<s+m&&(g=b.substring(e-s,e)+b.substring(e,e+m),h=a.substring(0,c-s),j=a.substring(c+m),n=b.substring(0,e-s),l=b.substring(e+m))}return 2*g.length>=a.length?[h,j,n,l,g]:null}if(0>=this.Diff_Timeout)return null;\nvar d=a.length>b.length?a:b,e=a.length>b.length?b:a;if(4>d.length||2*e.length<d.length)return null;var f=this,g=c(d,e,Math.ceil(d.length/4)),d=c(d,e,Math.ceil(d.length/2)),h;if(!g&&!d)return null;h=d?g?g[4].length>d[4].length?g:d:d:g;var j;a.length>b.length?(g=h[0],d=h[1],e=h[2],j=h[3]):(e=h[0],j=h[1],g=h[2],d=h[3]);h=h[4];return[g,d,e,j,h]};\ndiff_match_patch.prototype.diff_cleanupSemantic=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=0,h=0,j=0,i=0;f<a.length;)0==a[f][0]?(c[d++]=f,g=j,h=i,i=j=0,e=a[f][1]):(1==a[f][0]?j+=a[f][1].length:i+=a[f][1].length,e&&(e.length<=Math.max(g,h)&&e.length<=Math.max(j,i))&&(a.splice(c[d-1],0,[-1,e]),a[c[d-1]+1][0]=1,d--,d--,f=0<d?c[d-1]:-1,i=j=h=g=0,e=null,b=!0)),f++;b&&this.diff_cleanupMerge(a);this.diff_cleanupSemanticLossless(a);for(f=1;f<a.length;){if(-1==a[f-1][0]&&1==a[f][0]){b=a[f-1][1];c=a[f][1];\nd=this.diff_commonOverlap_(b,c);e=this.diff_commonOverlap_(c,b);if(d>=e){if(d>=b.length/2||d>=c.length/2)a.splice(f,0,[0,c.substring(0,d)]),a[f-1][1]=b.substring(0,b.length-d),a[f+1][1]=c.substring(d),f++}else if(e>=b.length/2||e>=c.length/2)a.splice(f,0,[0,b.substring(0,e)]),a[f-1][0]=1,a[f-1][1]=c.substring(0,c.length-e),a[f+1][0]=-1,a[f+1][1]=b.substring(e),f++;f++}f++}};\ndiff_match_patch.prototype.diff_cleanupSemanticLossless=function(a){function b(a,b){if(!a||!b)return 6;var c=a.charAt(a.length-1),d=b.charAt(0),e=c.match(diff_match_patch.nonAlphaNumericRegex_),f=d.match(diff_match_patch.nonAlphaNumericRegex_),g=e&&c.match(diff_match_patch.whitespaceRegex_),h=f&&d.match(diff_match_patch.whitespaceRegex_),c=g&&c.match(diff_match_patch.linebreakRegex_),d=h&&d.match(diff_match_patch.linebreakRegex_),i=c&&a.match(diff_match_patch.blanklineEndRegex_),j=d&&b.match(diff_match_patch.blanklineStartRegex_);\nreturn i||j?5:c||d?4:e&&!g&&h?3:g||h?2:e||f?1:0}for(var c=1;c<a.length-1;){if(0==a[c-1][0]&&0==a[c+1][0]){var d=a[c-1][1],e=a[c][1],f=a[c+1][1],g=this.diff_commonSuffix(d,e);if(g)var h=e.substring(e.length-g),d=d.substring(0,d.length-g),e=h+e.substring(0,e.length-g),f=h+f;for(var g=d,h=e,j=f,i=b(d,e)+b(e,f);e.charAt(0)===f.charAt(0);){var d=d+e.charAt(0),e=e.substring(1)+f.charAt(0),f=f.substring(1),k=b(d,e)+b(e,f);k>=i&&(i=k,g=d,h=e,j=f)}a[c-1][1]!=g&&(g?a[c-1][1]=g:(a.splice(c-1,1),c--),a[c][1]=\nh,j?a[c+1][1]=j:(a.splice(c+1,1),c--))}c++}};diff_match_patch.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;diff_match_patch.whitespaceRegex_=/\\s/;diff_match_patch.linebreakRegex_=/[\\r\\n]/;diff_match_patch.blanklineEndRegex_=/\\n\\r?\\n$/;diff_match_patch.blanklineStartRegex_=/^\\r?\\n\\r?\\n/;\ndiff_match_patch.prototype.diff_cleanupEfficiency=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=!1,h=!1,j=!1,i=!1;f<a.length;){if(0==a[f][0])a[f][1].length<this.Diff_EditCost&&(j||i)?(c[d++]=f,g=j,h=i,e=a[f][1]):(d=0,e=null),j=i=!1;else if(-1==a[f][0]?i=!0:j=!0,e&&(g&&h&&j&&i||e.length<this.Diff_EditCost/2&&3==g+h+j+i))a.splice(c[d-1],0,[-1,e]),a[c[d-1]+1][0]=1,d--,e=null,g&&h?(j=i=!0,d=0):(d--,f=0<d?c[d-1]:-1,j=i=!1),b=!0;f++}b&&this.diff_cleanupMerge(a)};\ndiff_match_patch.prototype.diff_cleanupMerge=function(a){a.push([0,\"\"]);for(var b=0,c=0,d=0,e=\"\",f=\"\",g;b<a.length;)switch(a[b][0]){case 1:d++;f+=a[b][1];b++;break;case -1:c++;e+=a[b][1];b++;break;case 0:1<c+d?(0!==c&&0!==d&&(g=this.diff_commonPrefix(f,e),0!==g&&(0<b-c-d&&0==a[b-c-d-1][0]?a[b-c-d-1][1]+=f.substring(0,g):(a.splice(0,0,[0,f.substring(0,g)]),b++),f=f.substring(g),e=e.substring(g)),g=this.diff_commonSuffix(f,e),0!==g&&(a[b][1]=f.substring(f.length-g)+a[b][1],f=f.substring(0,f.length-\ng),e=e.substring(0,e.length-g))),0===c?a.splice(b-d,c+d,[1,f]):0===d?a.splice(b-c,c+d,[-1,e]):a.splice(b-c-d,c+d,[-1,e],[1,f]),b=b-c-d+(c?1:0)+(d?1:0)+1):0!==b&&0==a[b-1][0]?(a[b-1][1]+=a[b][1],a.splice(b,1)):b++,c=d=0,f=e=\"\"}\"\"===a[a.length-1][1]&&a.pop();c=!1;for(b=1;b<a.length-1;)0==a[b-1][0]&&0==a[b+1][0]&&(a[b][1].substring(a[b][1].length-a[b-1][1].length)==a[b-1][1]?(a[b][1]=a[b-1][1]+a[b][1].substring(0,a[b][1].length-a[b-1][1].length),a[b+1][1]=a[b-1][1]+a[b+1][1],a.splice(b-1,1),c=!0):a[b][1].substring(0,\na[b+1][1].length)==a[b+1][1]&&(a[b-1][1]+=a[b+1][1],a[b][1]=a[b][1].substring(a[b+1][1].length)+a[b+1][1],a.splice(b+1,1),c=!0)),b++;c&&this.diff_cleanupMerge(a)};diff_match_patch.prototype.diff_xIndex=function(a,b){var c=0,d=0,e=0,f=0,g;for(g=0;g<a.length;g++){1!==a[g][0]&&(c+=a[g][1].length);-1!==a[g][0]&&(d+=a[g][1].length);if(c>b)break;e=c;f=d}return a.length!=g&&-1===a[g][0]?f:f+(b-e)};\ndiff_match_patch.prototype.diff_prettyHtml=function(a){for(var b=[],c=/&/g,d=/</g,e=/>/g,f=/\\n/g,g=0;g<a.length;g++){var h=a[g][0],j=a[g][1],j=j.replace(c,\"&amp;\").replace(d,\"&lt;\").replace(e,\"&gt;\").replace(f,\"&para;<br>\");switch(h){case 1:b[g]='<ins style=\"background:#e6ffe6;\">'+j+\"</ins>\";break;case -1:b[g]='<del style=\"background:#ffe6e6;\">'+j+\"</del>\";break;case 0:b[g]=\"<span>\"+j+\"</span>\"}}return b.join(\"\")};\ndiff_match_patch.prototype.diff_text1=function(a){for(var b=[],c=0;c<a.length;c++)1!==a[c][0]&&(b[c]=a[c][1]);return b.join(\"\")};diff_match_patch.prototype.diff_text2=function(a){for(var b=[],c=0;c<a.length;c++)-1!==a[c][0]&&(b[c]=a[c][1]);return b.join(\"\")};diff_match_patch.prototype.diff_levenshtein=function(a){for(var b=0,c=0,d=0,e=0;e<a.length;e++){var f=a[e][0],g=a[e][1];switch(f){case 1:c+=g.length;break;case -1:d+=g.length;break;case 0:b+=Math.max(c,d),d=c=0}}return b+=Math.max(c,d)};\ndiff_match_patch.prototype.diff_toDelta=function(a){for(var b=[],c=0;c<a.length;c++)switch(a[c][0]){case 1:b[c]=\"+\"+encodeURI(a[c][1]);break;case -1:b[c]=\"-\"+a[c][1].length;break;case 0:b[c]=\"=\"+a[c][1].length}return b.join(\"\\t\").replace(/%20/g,\" \")};\ndiff_match_patch.prototype.diff_fromDelta=function(a,b){for(var c=[],d=0,e=0,f=b.split(/\\t/g),g=0;g<f.length;g++){var h=f[g].substring(1);switch(f[g].charAt(0)){case \"+\":try{c[d++]=[1,decodeURI(h)]}catch(j){throw Error(\"Illegal escape in diff_fromDelta: \"+h);}break;case \"-\":case \"=\":var i=parseInt(h,10);if(isNaN(i)||0>i)throw Error(\"Invalid number in diff_fromDelta: \"+h);h=a.substring(e,e+=i);\"=\"==f[g].charAt(0)?c[d++]=[0,h]:c[d++]=[-1,h];break;default:if(f[g])throw Error(\"Invalid diff operation in diff_fromDelta: \"+\nf[g]);}}if(e!=a.length)throw Error(\"Delta length (\"+e+\") does not equal source text length (\"+a.length+\").\");return c};diff_match_patch.prototype.match_main=function(a,b,c){if(null==a||null==b||null==c)throw Error(\"Null input. (match_main)\");c=Math.max(0,Math.min(c,a.length));return a==b?0:a.length?a.substring(c,c+b.length)==b?c:this.match_bitap_(a,b,c):-1};\ndiff_match_patch.prototype.match_bitap_=function(a,b,c){function d(a,d){var e=a/b.length,g=Math.abs(c-d);return!f.Match_Distance?g?1:e:e+g/f.Match_Distance}if(b.length>this.Match_MaxBits)throw Error(\"Pattern too long for this browser.\");var e=this.match_alphabet_(b),f=this,g=this.Match_Threshold,h=a.indexOf(b,c);-1!=h&&(g=Math.min(d(0,h),g),h=a.lastIndexOf(b,c+b.length),-1!=h&&(g=Math.min(d(0,h),g)));for(var j=1<<b.length-1,h=-1,i,k,q=b.length+a.length,r,t=0;t<b.length;t++){i=0;for(k=q;i<k;)d(t,c+\nk)<=g?i=k:q=k,k=Math.floor((q-i)/2+i);q=k;i=Math.max(1,c-k+1);var p=Math.min(c+k,a.length)+b.length;k=Array(p+2);for(k[p+1]=(1<<t)-1;p>=i;p--){var w=e[a.charAt(p-1)];k[p]=0===t?(k[p+1]<<1|1)&w:(k[p+1]<<1|1)&w|((r[p+1]|r[p])<<1|1)|r[p+1];if(k[p]&j&&(w=d(t,p-1),w<=g))if(g=w,h=p-1,h>c)i=Math.max(1,2*c-h);else break}if(d(t+1,c)>g)break;r=k}return h};\ndiff_match_patch.prototype.match_alphabet_=function(a){for(var b={},c=0;c<a.length;c++)b[a.charAt(c)]=0;for(c=0;c<a.length;c++)b[a.charAt(c)]|=1<<a.length-c-1;return b};\ndiff_match_patch.prototype.patch_addContext_=function(a,b){if(0!=b.length){for(var c=b.substring(a.start2,a.start2+a.length1),d=0;b.indexOf(c)!=b.lastIndexOf(c)&&c.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)d+=this.Patch_Margin,c=b.substring(a.start2-d,a.start2+a.length1+d);d+=this.Patch_Margin;(c=b.substring(a.start2-d,a.start2))&&a.diffs.unshift([0,c]);(d=b.substring(a.start2+a.length1,a.start2+a.length1+d))&&a.diffs.push([0,d]);a.start1-=c.length;a.start2-=c.length;a.length1+=\nc.length+d.length;a.length2+=c.length+d.length}};\ndiff_match_patch.prototype.patch_make=function(a,b,c){var d;if(\"string\"==typeof a&&\"string\"==typeof b&&\"undefined\"==typeof c)d=a,b=this.diff_main(d,b,!0),2<b.length&&(this.diff_cleanupSemantic(b),this.diff_cleanupEfficiency(b));else if(a&&\"object\"==typeof a&&\"undefined\"==typeof b&&\"undefined\"==typeof c)b=a,d=this.diff_text1(b);else if(\"string\"==typeof a&&b&&\"object\"==typeof b&&\"undefined\"==typeof c)d=a;else if(\"string\"==typeof a&&\"string\"==typeof b&&c&&\"object\"==typeof c)d=a,b=c;else throw Error(\"Unknown call format to patch_make.\");\nif(0===b.length)return[];c=[];a=new diff_match_patch.patch_obj;for(var e=0,f=0,g=0,h=d,j=0;j<b.length;j++){var i=b[j][0],k=b[j][1];!e&&0!==i&&(a.start1=f,a.start2=g);switch(i){case 1:a.diffs[e++]=b[j];a.length2+=k.length;d=d.substring(0,g)+k+d.substring(g);break;case -1:a.length1+=k.length;a.diffs[e++]=b[j];d=d.substring(0,g)+d.substring(g+k.length);break;case 0:k.length<=2*this.Patch_Margin&&e&&b.length!=j+1?(a.diffs[e++]=b[j],a.length1+=k.length,a.length2+=k.length):k.length>=2*this.Patch_Margin&&\ne&&(this.patch_addContext_(a,h),c.push(a),a=new diff_match_patch.patch_obj,e=0,h=d,f=g)}1!==i&&(f+=k.length);-1!==i&&(g+=k.length)}e&&(this.patch_addContext_(a,h),c.push(a));return c};diff_match_patch.prototype.patch_deepCopy=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c],e=new diff_match_patch.patch_obj;e.diffs=[];for(var f=0;f<d.diffs.length;f++)e.diffs[f]=d.diffs[f].slice();e.start1=d.start1;e.start2=d.start2;e.length1=d.length1;e.length2=d.length2;b[c]=e}return b};\ndiff_match_patch.prototype.patch_apply=function(a,b){if(0==a.length)return[b,[]];a=this.patch_deepCopy(a);var c=this.patch_addPadding(a);b=c+b+c;this.patch_splitMax(a);for(var d=0,e=[],f=0;f<a.length;f++){var g=a[f].start2+d,h=this.diff_text1(a[f].diffs),j,i=-1;if(h.length>this.Match_MaxBits){if(j=this.match_main(b,h.substring(0,this.Match_MaxBits),g),-1!=j&&(i=this.match_main(b,h.substring(h.length-this.Match_MaxBits),g+h.length-this.Match_MaxBits),-1==i||j>=i))j=-1}else j=this.match_main(b,h,g);\nif(-1==j)e[f]=!1,d-=a[f].length2-a[f].length1;else if(e[f]=!0,d=j-g,g=-1==i?b.substring(j,j+h.length):b.substring(j,i+this.Match_MaxBits),h==g)b=b.substring(0,j)+this.diff_text2(a[f].diffs)+b.substring(j+h.length);else if(g=this.diff_main(h,g,!1),h.length>this.Match_MaxBits&&this.diff_levenshtein(g)/h.length>this.Patch_DeleteThreshold)e[f]=!1;else{this.diff_cleanupSemanticLossless(g);for(var h=0,k,i=0;i<a[f].diffs.length;i++){var q=a[f].diffs[i];0!==q[0]&&(k=this.diff_xIndex(g,h));1===q[0]?b=b.substring(0,\nj+k)+q[1]+b.substring(j+k):-1===q[0]&&(b=b.substring(0,j+k)+b.substring(j+this.diff_xIndex(g,h+q[1].length)));-1!==q[0]&&(h+=q[1].length)}}}b=b.substring(c.length,b.length-c.length);return[b,e]};\ndiff_match_patch.prototype.patch_addPadding=function(a){for(var b=this.Patch_Margin,c=\"\",d=1;d<=b;d++)c+=String.fromCharCode(d);for(d=0;d<a.length;d++)a[d].start1+=b,a[d].start2+=b;var d=a[0],e=d.diffs;if(0==e.length||0!=e[0][0])e.unshift([0,c]),d.start1-=b,d.start2-=b,d.length1+=b,d.length2+=b;else if(b>e[0][1].length){var f=b-e[0][1].length;e[0][1]=c.substring(e[0][1].length)+e[0][1];d.start1-=f;d.start2-=f;d.length1+=f;d.length2+=f}d=a[a.length-1];e=d.diffs;0==e.length||0!=e[e.length-1][0]?(e.push([0,\nc]),d.length1+=b,d.length2+=b):b>e[e.length-1][1].length&&(f=b-e[e.length-1][1].length,e[e.length-1][1]+=c.substring(0,f),d.length1+=f,d.length2+=f);return c};\ndiff_match_patch.prototype.patch_splitMax=function(a){for(var b=this.Match_MaxBits,c=0;c<a.length;c++)if(!(a[c].length1<=b)){var d=a[c];a.splice(c--,1);for(var e=d.start1,f=d.start2,g=\"\";0!==d.diffs.length;){var h=new diff_match_patch.patch_obj,j=!0;h.start1=e-g.length;h.start2=f-g.length;\"\"!==g&&(h.length1=h.length2=g.length,h.diffs.push([0,g]));for(;0!==d.diffs.length&&h.length1<b-this.Patch_Margin;){var g=d.diffs[0][0],i=d.diffs[0][1];1===g?(h.length2+=i.length,f+=i.length,h.diffs.push(d.diffs.shift()),\nj=!1):-1===g&&1==h.diffs.length&&0==h.diffs[0][0]&&i.length>2*b?(h.length1+=i.length,e+=i.length,j=!1,h.diffs.push([g,i]),d.diffs.shift()):(i=i.substring(0,b-h.length1-this.Patch_Margin),h.length1+=i.length,e+=i.length,0===g?(h.length2+=i.length,f+=i.length):j=!1,h.diffs.push([g,i]),i==d.diffs[0][1]?d.diffs.shift():d.diffs[0][1]=d.diffs[0][1].substring(i.length))}g=this.diff_text2(h.diffs);g=g.substring(g.length-this.Patch_Margin);i=this.diff_text1(d.diffs).substring(0,this.Patch_Margin);\"\"!==i&&\n(h.length1+=i.length,h.length2+=i.length,0!==h.diffs.length&&0===h.diffs[h.diffs.length-1][0]?h.diffs[h.diffs.length-1][1]+=i:h.diffs.push([0,i]));j||a.splice(++c,0,h)}}};diff_match_patch.prototype.patch_toText=function(a){for(var b=[],c=0;c<a.length;c++)b[c]=a[c];return b.join(\"\")};\ndiff_match_patch.prototype.patch_fromText=function(a){var b=[];if(!a)return b;a=a.split(\"\\n\");for(var c=0,d=/^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$/;c<a.length;){var e=a[c].match(d);if(!e)throw Error(\"Invalid patch string: \"+a[c]);var f=new diff_match_patch.patch_obj;b.push(f);f.start1=parseInt(e[1],10);\"\"===e[2]?(f.start1--,f.length1=1):\"0\"==e[2]?f.length1=0:(f.start1--,f.length1=parseInt(e[2],10));f.start2=parseInt(e[3],10);\"\"===e[4]?(f.start2--,f.length2=1):\"0\"==e[4]?f.length2=0:(f.start2--,f.length2=\nparseInt(e[4],10));for(c++;c<a.length;){e=a[c].charAt(0);try{var g=decodeURI(a[c].substring(1))}catch(h){throw Error(\"Illegal escape in patch_fromText: \"+g);}if(\"-\"==e)f.diffs.push([-1,g]);else if(\"+\"==e)f.diffs.push([1,g]);else if(\" \"==e)f.diffs.push([0,g]);else if(\"@\"==e)break;else if(\"\"!==e)throw Error('Invalid patch mode \"'+e+'\" in: '+g);c++}}return b};diff_match_patch.patch_obj=function(){this.diffs=[];this.start2=this.start1=null;this.length2=this.length1=0};\ndiff_match_patch.patch_obj.prototype.toString=function(){var a,b;a=0===this.length1?this.start1+\",0\":1==this.length1?this.start1+1:this.start1+1+\",\"+this.length1;b=0===this.length2?this.start2+\",0\":1==this.length2?this.start2+1:this.start2+1+\",\"+this.length2;a=[\"@@ -\"+a+\" +\"+b+\" @@\\n\"];var c;for(b=0;b<this.diffs.length;b++){switch(this.diffs[b][0]){case 1:c=\"+\";break;case -1:c=\"-\";break;case 0:c=\" \"}a[b+1]=c+encodeURI(this.diffs[b][1])+\"\\n\"}return a.join(\"\").replace(/%20/g,\" \")};\nthis.diff_match_patch=diff_match_patch;this.DIFF_DELETE=-1;this.DIFF_INSERT=1;this.DIFF_EQUAL=0;})()\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/dropzone/dropzone.js",
    "content": "\n;(function(){\n\n    /**\n     * Require the module at `name`.\n     *\n     * @param {String} name\n     * @return {Object} exports\n     * @api public\n     */\n\n    function require(name) {\n        var module = require.modules[name];\n        if (!module) throw new Error('failed to require \"' + name + '\"');\n\n        if (!('exports' in module) && typeof module.definition === 'function') {\n            module.client = module.component = true;\n            module.definition.call(this, module.exports = {}, module);\n            delete module.definition;\n        }\n\n        return module.exports;\n    }\n\n    /**\n     * Registered modules.\n     */\n\n    require.modules = {};\n\n    /**\n     * Register module at `name` with callback `definition`.\n     *\n     * @param {String} name\n     * @param {Function} definition\n     * @api private\n     */\n\n    require.register = function (name, definition) {\n        require.modules[name] = {\n            definition: definition\n        };\n    };\n\n    /**\n     * Define a module's exports immediately with `exports`.\n     *\n     * @param {String} name\n     * @param {Generic} exports\n     * @api private\n     */\n\n    require.define = function (name, exports) {\n        require.modules[name] = {\n            exports: exports\n        };\n    };\n    require.register(\"component~emitter@1.1.2\", function (exports, module) {\n\n        /**\n         * Expose `Emitter`.\n         */\n\n        module.exports = Emitter;\n\n        /**\n         * Initialize a new `Emitter`.\n         *\n         * @api public\n         */\n\n        function Emitter(obj) {\n            if (obj) return mixin(obj);\n        };\n\n        /**\n         * Mixin the emitter properties.\n         *\n         * @param {Object} obj\n         * @return {Object}\n         * @api private\n         */\n\n        function mixin(obj) {\n            for (var key in Emitter.prototype) {\n                obj[key] = Emitter.prototype[key];\n            }\n            return obj;\n        }\n\n        /**\n         * Listen on the given `event` with `fn`.\n         *\n         * @param {String} event\n         * @param {Function} fn\n         * @return {Emitter}\n         * @api public\n         */\n\n        Emitter.prototype.on =\n            Emitter.prototype.addEventListener = function(event, fn){\n                this._callbacks = this._callbacks || {};\n                (this._callbacks[event] = this._callbacks[event] || [])\n                    .push(fn);\n                return this;\n            };\n\n        /**\n         * Adds an `event` listener that will be invoked a single\n         * time then automatically removed.\n         *\n         * @param {String} event\n         * @param {Function} fn\n         * @return {Emitter}\n         * @api public\n         */\n\n        Emitter.prototype.once = function(event, fn){\n            var self = this;\n            this._callbacks = this._callbacks || {};\n\n            function on() {\n                self.off(event, on);\n                fn.apply(this, arguments);\n            }\n\n            on.fn = fn;\n            this.on(event, on);\n            return this;\n        };\n\n        /**\n         * Remove the given callback for `event` or all\n         * registered callbacks.\n         *\n         * @param {String} event\n         * @param {Function} fn\n         * @return {Emitter}\n         * @api public\n         */\n\n        Emitter.prototype.off =\n            Emitter.prototype.removeListener =\n                Emitter.prototype.removeAllListeners =\n                    Emitter.prototype.removeEventListener = function(event, fn){\n                        this._callbacks = this._callbacks || {};\n\n                        // all\n                        if (0 == arguments.length) {\n                            this._callbacks = {};\n                            return this;\n                        }\n\n                        // specific event\n                        var callbacks = this._callbacks[event];\n                        if (!callbacks) return this;\n\n                        // remove all handlers\n                        if (1 == arguments.length) {\n                            delete this._callbacks[event];\n                            return this;\n                        }\n\n                        // remove specific handler\n                        var cb;\n                        for (var i = 0; i < callbacks.length; i++) {\n                            cb = callbacks[i];\n                            if (cb === fn || cb.fn === fn) {\n                                callbacks.splice(i, 1);\n                                break;\n                            }\n                        }\n                        return this;\n                    };\n\n        /**\n         * Emit `event` with the given args.\n         *\n         * @param {String} event\n         * @param {Mixed} ...\n         * @return {Emitter}\n         */\n\n        Emitter.prototype.emit = function(event){\n            this._callbacks = this._callbacks || {};\n            var args = [].slice.call(arguments, 1)\n                , callbacks = this._callbacks[event];\n\n            if (callbacks) {\n                callbacks = callbacks.slice(0);\n                for (var i = 0, len = callbacks.length; i < len; ++i) {\n                    callbacks[i].apply(this, args);\n                }\n            }\n\n            return this;\n        };\n\n        /**\n         * Return array of callbacks for `event`.\n         *\n         * @param {String} event\n         * @return {Array}\n         * @api public\n         */\n\n        Emitter.prototype.listeners = function(event){\n            this._callbacks = this._callbacks || {};\n            return this._callbacks[event] || [];\n        };\n\n        /**\n         * Check if this emitter has `event` handlers.\n         *\n         * @param {String} event\n         * @return {Boolean}\n         * @api public\n         */\n\n        Emitter.prototype.hasListeners = function(event){\n            return !! this.listeners(event).length;\n        };\n\n    });\n\n    require.register(\"dropzone\", function (exports, module) {\n\n\n        /**\n         * Exposing dropzone\n         */\n        module.exports = require(\"dropzone/lib/dropzone.js\");\n\n    });\n\n    require.register(\"dropzone/lib/dropzone.js\", function (exports, module) {\n\n        /*\n         *\n         * More info at [www.dropzonejs.com](http://www.dropzonejs.com)\n         *\n         * Copyright (c) 2012, Matias Meno\n         *\n         * Permission is hereby granted, free of charge, to any person obtaining a copy\n         * of this software and associated documentation files (the \"Software\"), to deal\n         * in the Software without restriction, including without limitation the rights\n         * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n         * copies of the Software, and to permit persons to whom the Software is\n         * furnished to do so, subject to the following conditions:\n         *\n         * The above copyright notice and this permission notice shall be included in\n         * all copies or substantial portions of the Software.\n         *\n         * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n         * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n         * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n         * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n         * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n         * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n         * THE SOFTWARE.\n         *\n         */\n\n        (function() {\n            var Dropzone, Em, camelize, contentLoaded, detectVerticalSquash, drawImageIOSFix, noop, without,\n                __hasProp = {}.hasOwnProperty,\n                __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n                __slice = [].slice;\n\n            Em = typeof Emitter !== \"undefined\" && Emitter !== null ? Emitter : require(\"component~emitter@1.1.2\");\n\n            noop = function() {};\n\n            Dropzone = (function(_super) {\n                var extend;\n\n                __extends(Dropzone, _super);\n\n\n                /*\n                 This is a list of all available events you can register on a dropzone object.\n\n                 You can register an event handler like this:\n\n                 dropzone.on(\"dragEnter\", function() { });\n                 */\n\n                Dropzone.prototype.events = [\"drop\", \"dragstart\", \"dragend\", \"dragenter\", \"dragover\", \"dragleave\", \"addedfile\", \"removedfile\", \"thumbnail\", \"error\", \"errormultiple\", \"processing\", \"processingmultiple\", \"uploadprogress\", \"totaluploadprogress\", \"sending\", \"sendingmultiple\", \"success\", \"successmultiple\", \"canceled\", \"canceledmultiple\", \"complete\", \"completemultiple\", \"reset\", \"maxfilesexceeded\", \"maxfilesreached\"];\n\n                Dropzone.prototype.defaultOptions = {\n                    url: null,\n                    method: \"post\",\n                    withCredentials: false,\n                    parallelUploads: 2,\n                    uploadMultiple: false,\n                    maxFilesize: 256,\n                    paramName: \"file\",\n                    createImageThumbnails: true,\n                    maxThumbnailFilesize: 10,\n                    thumbnailWidth: 100,\n                    thumbnailHeight: 100,\n                    maxFiles: null,\n                    params: {},\n                    clickable: true,\n                    ignoreHiddenFiles: true,\n                    acceptedFiles: null,\n                    acceptedMimeTypes: null,\n                    autoProcessQueue: true,\n                    autoQueue: true,\n                    addRemoveLinks: false,\n                    previewsContainer: null,\n                    dictDefaultMessage: \"Drop files here to upload\",\n                    dictFallbackMessage: \"Your browser does not support drag'n'drop file uploads.\",\n                    dictFallbackText: \"Please use the fallback form below to upload your files like in the olden days.\",\n                    dictFileTooBig: \"File is too big ({{filesize}}MiB). Max filesize: {{maxFilesize}}MiB.\",\n                    dictInvalidFileType: \"You can't upload files of this type.\",\n                    dictResponseError: \"Server responded with {{statusCode}} code.\",\n                    dictCancelUpload: \"Cancel upload\",\n                    dictCancelUploadConfirmation: \"Are you sure you want to cancel this upload?\",\n                    dictRemoveFile: \"Remove file\",\n                    dictRemoveFileConfirmation: null,\n                    dictMaxFilesExceeded: \"You can not upload any more files.\",\n                    accept: function(file, done) {\n                        return done();\n                    },\n                    init: function() {\n                        return noop;\n                    },\n                    forceFallback: false,\n                    fallback: function() {\n                        var child, messageElement, span, _i, _len, _ref;\n                        this.element.className = \"\" + this.element.className + \" dz-browser-not-supported\";\n                        _ref = this.element.getElementsByTagName(\"div\");\n                        for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n                            child = _ref[_i];\n                            if (/(^| )dz-message($| )/.test(child.className)) {\n                                messageElement = child;\n                                child.className = \"dz-message\";\n                                continue;\n                            }\n                        }\n                        if (!messageElement) {\n                            messageElement = Dropzone.createElement(\"<div class=\\\"dz-message\\\"><span></span></div>\");\n                            this.element.appendChild(messageElement);\n                        }\n                        span = messageElement.getElementsByTagName(\"span\")[0];\n                        if (span) {\n                            span.textContent = this.options.dictFallbackMessage;\n                        }\n                        return this.element.appendChild(this.getFallbackForm());\n                    },\n                    resize: function(file) {\n                        var info, srcRatio, trgRatio;\n                        info = {\n                            srcX: 0,\n                            srcY: 0,\n                            srcWidth: file.width,\n                            srcHeight: file.height\n                        };\n                        srcRatio = file.width / file.height;\n                        trgRatio = this.options.thumbnailWidth / this.options.thumbnailHeight;\n                        if (file.height < this.options.thumbnailHeight || file.width < this.options.thumbnailWidth) {\n                            info.trgHeight = info.srcHeight;\n                            info.trgWidth = info.srcWidth;\n                        } else {\n                            if (srcRatio > trgRatio) {\n                                info.srcHeight = file.height;\n                                info.srcWidth = info.srcHeight * trgRatio;\n                            } else {\n                                info.srcWidth = file.width;\n                                info.srcHeight = info.srcWidth / trgRatio;\n                            }\n                        }\n                        info.srcX = (file.width - info.srcWidth) / 2;\n                        info.srcY = (file.height - info.srcHeight) / 2;\n                        return info;\n                    },\n\n                    /*\n                     Those functions register themselves to the events on init and handle all\n                     the user interface specific stuff. Overwriting them won't break the upload\n                     but can break the way it's displayed.\n                     You can overwrite them if you don't like the default behavior. If you just\n                     want to add an additional event handler, register it on the dropzone object\n                     and don't overwrite those options.\n                     */\n                    drop: function(e) {\n                        return this.element.classList.remove(\"dz-drag-hover\");\n                    },\n                    dragstart: noop,\n                    dragend: function(e) {\n                        return this.element.classList.remove(\"dz-drag-hover\");\n                    },\n                    dragenter: function(e) {\n                        return this.element.classList.add(\"dz-drag-hover\");\n                    },\n                    dragover: function(e) {\n                        return this.element.classList.add(\"dz-drag-hover\");\n                    },\n                    dragleave: function(e) {\n                        return this.element.classList.remove(\"dz-drag-hover\");\n                    },\n                    paste: noop,\n                    reset: function() {\n                        return this.element.classList.remove(\"dz-started\");\n                    },\n                    addedfile: function(file) {\n                        var node, removeFileEvent, removeLink, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _results;\n                        if (this.element === this.previewsContainer) {\n                            this.element.classList.add(\"dz-started\");\n                        }\n                        file.previewElement = Dropzone.createElement(this.options.previewTemplate.trim());\n                        file.previewTemplate = file.previewElement;\n                        this.previewsContainer.appendChild(file.previewElement);\n                        _ref = file.previewElement.querySelectorAll(\"[data-dz-name]\");\n                        for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n                            node = _ref[_i];\n                            node.textContent = file.name;\n                        }\n                        _ref1 = file.previewElement.querySelectorAll(\"[data-dz-size]\");\n                        for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {\n                            node = _ref1[_j];\n                            node.innerHTML = this.filesize(file.size);\n                        }\n                        if (this.options.addRemoveLinks) {\n                            file._removeLink = Dropzone.createElement(\"<a class=\\\"dz-remove\\\" href=\\\"javascript:undefined;\\\" data-dz-remove>\" + this.options.dictRemoveFile + \"</a>\");\n                            file.previewElement.appendChild(file._removeLink);\n                        }\n                        removeFileEvent = (function(_this) {\n                            return function(e) {\n                                e.preventDefault();\n                                e.stopPropagation();\n                                if (file.status === Dropzone.UPLOADING) {\n                                    return Dropzone.confirm(_this.options.dictCancelUploadConfirmation, function() {\n                                        return _this.removeFile(file);\n                                    });\n                                } else {\n                                    if (_this.options.dictRemoveFileConfirmation) {\n                                        return Dropzone.confirm(_this.options.dictRemoveFileConfirmation, function() {\n                                            return _this.removeFile(file);\n                                        });\n                                    } else {\n                                        return _this.removeFile(file);\n                                    }\n                                }\n                            };\n                        })(this);\n                        _ref2 = file.previewElement.querySelectorAll(\"[data-dz-remove]\");\n                        _results = [];\n                        for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {\n                            removeLink = _ref2[_k];\n                            _results.push(removeLink.addEventListener(\"click\", removeFileEvent));\n                        }\n                        return _results;\n                    },\n                    removedfile: function(file) {\n                        var _ref;\n                        if ((_ref = file.previewElement) != null) {\n                            _ref.parentNode.removeChild(file.previewElement);\n                        }\n                        return this._updateMaxFilesReachedClass();\n                    },\n                    thumbnail: function(file, dataUrl) {\n                        var thumbnailElement, _i, _len, _ref, _results;\n                        file.previewElement.classList.remove(\"dz-file-preview\");\n                        file.previewElement.classList.add(\"dz-image-preview\");\n                        _ref = file.previewElement.querySelectorAll(\"[data-dz-thumbnail]\");\n                        _results = [];\n                        for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n                            thumbnailElement = _ref[_i];\n                            thumbnailElement.alt = file.name;\n                            _results.push(thumbnailElement.src = dataUrl);\n                        }\n                        return _results;\n                    },\n                    error: function(file, message) {\n                        var node, _i, _len, _ref, _results;\n                        file.previewElement.classList.add(\"dz-error\");\n                        if (typeof message !== \"String\" && message.error) {\n                            message = message.error;\n                        }\n                        _ref = file.previewElement.querySelectorAll(\"[data-dz-errormessage]\");\n                        _results = [];\n                        for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n                            node = _ref[_i];\n                            _results.push(node.textContent = message);\n                        }\n                        return _results;\n                    },\n                    errormultiple: noop,\n                    processing: function(file) {\n                        file.previewElement.classList.add(\"dz-processing\");\n                        if (file._removeLink) {\n                            return file._removeLink.textContent = this.options.dictCancelUpload;\n                        }\n                    },\n                    processingmultiple: noop,\n                    uploadprogress: function(file, progress, bytesSent) {\n                        var node, _i, _len, _ref, _results;\n                        _ref = file.previewElement.querySelectorAll(\"[data-dz-uploadprogress]\");\n                        _results = [];\n                        for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n                            node = _ref[_i];\n                            _results.push(node.style.width = \"\" + progress + \"%\");\n                        }\n                        return _results;\n                    },\n                    totaluploadprogress: noop,\n                    sending: noop,\n                    sendingmultiple: noop,\n                    success: function(file) {\n                        return file.previewElement.classList.add(\"dz-success\");\n                    },\n                    successmultiple: noop,\n                    canceled: function(file) {\n                        return this.emit(\"error\", file, \"Upload canceled.\");\n                    },\n                    canceledmultiple: noop,\n                    complete: function(file) {\n                        if (file._removeLink) {\n                            return file._removeLink.textContent = this.options.dictRemoveFile;\n                        }\n                    },\n                    completemultiple: noop,\n                    maxfilesexceeded: noop,\n                    maxfilesreached: noop,\n                    previewTemplate: \"<div class=\\\"dz-preview dz-file-preview\\\">\\n  <div class=\\\"dz-details\\\">\\n    <div class=\\\"dz-filename\\\"><span data-dz-name></span></div>\\n    <div class=\\\"dz-size\\\" data-dz-size></div>\\n    <img data-dz-thumbnail />\\n  </div>\\n  <div class=\\\"dz-progress\\\"><span class=\\\"dz-upload\\\" data-dz-uploadprogress></span></div>\\n  <div class=\\\"dz-success-mark\\\"><span>✔</span></div>\\n  <div class=\\\"dz-error-mark\\\"><span>✘</span></div>\\n  <div class=\\\"dz-error-message\\\"><span data-dz-errormessage></span></div>\\n</div>\"\n                };\n\n                extend = function() {\n                    var key, object, objects, target, val, _i, _len;\n                    target = arguments[0], objects = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n                    for (_i = 0, _len = objects.length; _i < _len; _i++) {\n                        object = objects[_i];\n                        for (key in object) {\n                            val = object[key];\n                            target[key] = val;\n                        }\n                    }\n                    return target;\n                };\n\n                function Dropzone(element, options) {\n                    var elementOptions, fallback, _ref;\n                    this.element = element;\n                    this.version = Dropzone.version;\n                    this.defaultOptions.previewTemplate = this.defaultOptions.previewTemplate.replace(/\\n*/g, \"\");\n                    this.clickableElements = [];\n                    this.listeners = [];\n                    this.files = [];\n                    if (typeof this.element === \"string\") {\n                        this.element = document.querySelector(this.element);\n                    }\n                    if (!(this.element && (this.element.nodeType != null))) {\n                        throw new Error(\"Invalid dropzone element.\");\n                    }\n                    if (this.element.dropzone) {\n                        throw new Error(\"Dropzone already attached.\");\n                    }\n                    Dropzone.instances.push(this);\n                    this.element.dropzone = this;\n                    elementOptions = (_ref = Dropzone.optionsForElement(this.element)) != null ? _ref : {};\n                    this.options = extend({}, this.defaultOptions, elementOptions, options != null ? options : {});\n                    if (this.options.forceFallback || !Dropzone.isBrowserSupported()) {\n                        return this.options.fallback.call(this);\n                    }\n                    if (this.options.url == null) {\n                        this.options.url = this.element.getAttribute(\"action\");\n                    }\n                    if (!this.options.url) {\n                        throw new Error(\"No URL provided.\");\n                    }\n                    if (this.options.acceptedFiles && this.options.acceptedMimeTypes) {\n                        throw new Error(\"You can't provide both 'acceptedFiles' and 'acceptedMimeTypes'. 'acceptedMimeTypes' is deprecated.\");\n                    }\n                    if (this.options.acceptedMimeTypes) {\n                        this.options.acceptedFiles = this.options.acceptedMimeTypes;\n                        delete this.options.acceptedMimeTypes;\n                    }\n                    this.options.method = this.options.method.toUpperCase();\n                    if ((fallback = this.getExistingFallback()) && fallback.parentNode) {\n                        fallback.parentNode.removeChild(fallback);\n                    }\n                    if (this.options.previewsContainer) {\n                        this.previewsContainer = Dropzone.getElement(this.options.previewsContainer, \"previewsContainer\");\n                    } else {\n                        this.previewsContainer = this.element;\n                    }\n                    if (this.options.clickable) {\n                        if (this.options.clickable === true) {\n                            this.clickableElements = [this.element];\n                        } else {\n                            this.clickableElements = Dropzone.getElements(this.options.clickable, \"clickable\");\n                        }\n                    }\n                    this.init();\n                }\n\n                Dropzone.prototype.getAcceptedFiles = function() {\n                    var file, _i, _len, _ref, _results;\n                    _ref = this.files;\n                    _results = [];\n                    for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n                        file = _ref[_i];\n                        if (file.accepted) {\n                            _results.push(file);\n                        }\n                    }\n                    return _results;\n                };\n\n                Dropzone.prototype.getRejectedFiles = function() {\n                    var file, _i, _len, _ref, _results;\n                    _ref = this.files;\n                    _results = [];\n                    for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n                        file = _ref[_i];\n                        if (!file.accepted) {\n                            _results.push(file);\n                        }\n                    }\n                    return _results;\n                };\n\n                Dropzone.prototype.getFilesWithStatus = function(status) {\n                    var file, _i, _len, _ref, _results;\n                    _ref = this.files;\n                    _results = [];\n                    for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n                        file = _ref[_i];\n                        if (file.status === status) {\n                            _results.push(file);\n                        }\n                    }\n                    return _results;\n                };\n\n                Dropzone.prototype.getQueuedFiles = function() {\n                    return this.getFilesWithStatus(Dropzone.QUEUED);\n                };\n\n                Dropzone.prototype.getUploadingFiles = function() {\n                    return this.getFilesWithStatus(Dropzone.UPLOADING);\n                };\n\n                Dropzone.prototype.getActiveFiles = function() {\n                    var file, _i, _len, _ref, _results;\n                    _ref = this.files;\n                    _results = [];\n                    for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n                        file = _ref[_i];\n                        if (file.status === Dropzone.UPLOADING || file.status === Dropzone.QUEUED) {\n                            _results.push(file);\n                        }\n                    }\n                    return _results;\n                };\n\n                Dropzone.prototype.init = function() {\n                    var eventName, noPropagation, setupHiddenFileInput, _i, _len, _ref, _ref1;\n                    if (this.element.tagName === \"form\") {\n                        this.element.setAttribute(\"enctype\", \"multipart/form-data\");\n                    }\n                    if (this.element.classList.contains(\"dropzone\") && !this.element.querySelector(\".dz-message\")) {\n                        this.element.appendChild(Dropzone.createElement(\"<div class=\\\"dz-default dz-message\\\"><span>\" + this.options.dictDefaultMessage + \"</span></div>\"));\n                    }\n                    if (this.clickableElements.length) {\n                        setupHiddenFileInput = (function(_this) {\n                            return function() {\n                                if (_this.hiddenFileInput) {\n                                    document.body.removeChild(_this.hiddenFileInput);\n                                }\n                                _this.hiddenFileInput = document.createElement(\"input\");\n                                _this.hiddenFileInput.setAttribute(\"type\", \"file\");\n                                if ((_this.options.maxFiles == null) || _this.options.maxFiles > 1) {\n                                    _this.hiddenFileInput.setAttribute(\"multiple\", \"multiple\");\n                                }\n                                _this.hiddenFileInput.className = \"dz-hidden-input\";\n                                if (_this.options.acceptedFiles != null) {\n                                    _this.hiddenFileInput.setAttribute(\"accept\", _this.options.acceptedFiles);\n                                }\n                                _this.hiddenFileInput.style.visibility = \"hidden\";\n                                _this.hiddenFileInput.style.position = \"absolute\";\n                                _this.hiddenFileInput.style.top = \"0\";\n                                _this.hiddenFileInput.style.left = \"0\";\n                                _this.hiddenFileInput.style.height = \"0\";\n                                _this.hiddenFileInput.style.width = \"0\";\n                                document.body.appendChild(_this.hiddenFileInput);\n                                return _this.hiddenFileInput.addEventListener(\"change\", function() {\n                                    var file, files, _i, _len;\n                                    files = _this.hiddenFileInput.files;\n                                    if (files.length) {\n                                        for (_i = 0, _len = files.length; _i < _len; _i++) {\n                                            file = files[_i];\n                                            _this.addFile(file);\n                                        }\n                                    }\n                                    return setupHiddenFileInput();\n                                });\n                            };\n                        })(this);\n                        setupHiddenFileInput();\n                    }\n                    this.URL = (_ref = window.URL) != null ? _ref : window.webkitURL;\n                    _ref1 = this.events;\n                    for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n                        eventName = _ref1[_i];\n                        this.on(eventName, this.options[eventName]);\n                    }\n                    this.on(\"uploadprogress\", (function(_this) {\n                        return function() {\n                            return _this.updateTotalUploadProgress();\n                        };\n                    })(this));\n                    this.on(\"removedfile\", (function(_this) {\n                        return function() {\n                            return _this.updateTotalUploadProgress();\n                        };\n                    })(this));\n                    this.on(\"canceled\", (function(_this) {\n                        return function(file) {\n                            return _this.emit(\"complete\", file);\n                        };\n                    })(this));\n                    this.on(\"complete\", (function(_this) {\n                        return function(file) {\n                            if (_this.getUploadingFiles().length === 0 && _this.getQueuedFiles().length === 0) {\n                                return setTimeout((function() {\n                                    return _this.emit(\"queuecomplete\");\n                                }), 0);\n                            }\n                        };\n                    })(this));\n                    noPropagation = function(e) {\n                        e.stopPropagation();\n                        if (e.preventDefault) {\n                            return e.preventDefault();\n                        } else {\n                            return e.returnValue = false;\n                        }\n                    };\n                    this.listeners = [\n                        {\n                            element: this.element,\n                            events: {\n                                \"dragstart\": (function(_this) {\n                                    return function(e) {\n                                        return _this.emit(\"dragstart\", e);\n                                    };\n                                })(this),\n                                \"dragenter\": (function(_this) {\n                                    return function(e) {\n                                        noPropagation(e);\n                                        return _this.emit(\"dragenter\", e);\n                                    };\n                                })(this),\n                                \"dragover\": (function(_this) {\n                                    return function(e) {\n                                        var efct;\n                                        try {\n                                            efct = e.dataTransfer.effectAllowed;\n                                        } catch (_error) {}\n                                        e.dataTransfer.dropEffect = 'move' === efct || 'linkMove' === efct ? 'move' : 'copy';\n                                        noPropagation(e);\n                                        return _this.emit(\"dragover\", e);\n                                    };\n                                })(this),\n                                \"dragleave\": (function(_this) {\n                                    return function(e) {\n                                        return _this.emit(\"dragleave\", e);\n                                    };\n                                })(this),\n                                \"drop\": (function(_this) {\n                                    return function(e) {\n                                        noPropagation(e);\n                                        return _this.drop(e);\n                                    };\n                                })(this),\n                                \"dragend\": (function(_this) {\n                                    return function(e) {\n                                        return _this.emit(\"dragend\", e);\n                                    };\n                                })(this)\n                            }\n                        }\n                    ];\n                    this.clickableElements.forEach((function(_this) {\n                        return function(clickableElement) {\n                            return _this.listeners.push({\n                                element: clickableElement,\n                                events: {\n                                    \"click\": function(evt) {\n                                        if ((clickableElement !== _this.element) || (evt.target === _this.element || Dropzone.elementInside(evt.target, _this.element.querySelector(\".dz-message\")))) {\n                                            return _this.hiddenFileInput.click();\n                                        }\n                                    }\n                                }\n                            });\n                        };\n                    })(this));\n                    this.enable();\n                    return this.options.init.call(this);\n                };\n\n                Dropzone.prototype.destroy = function() {\n                    var _ref;\n                    this.disable();\n                    this.removeAllFiles(true);\n                    if ((_ref = this.hiddenFileInput) != null ? _ref.parentNode : void 0) {\n                        this.hiddenFileInput.parentNode.removeChild(this.hiddenFileInput);\n                        this.hiddenFileInput = null;\n                    }\n                    delete this.element.dropzone;\n                    return Dropzone.instances.splice(Dropzone.instances.indexOf(this), 1);\n                };\n\n                Dropzone.prototype.updateTotalUploadProgress = function() {\n                    var activeFiles, file, totalBytes, totalBytesSent, totalUploadProgress, _i, _len, _ref;\n                    totalBytesSent = 0;\n                    totalBytes = 0;\n                    activeFiles = this.getActiveFiles();\n                    if (activeFiles.length) {\n                        _ref = this.getActiveFiles();\n                        for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n                            file = _ref[_i];\n                            totalBytesSent += file.upload.bytesSent;\n                            totalBytes += file.upload.total;\n                        }\n                        totalUploadProgress = 100 * totalBytesSent / totalBytes;\n                    } else {\n                        totalUploadProgress = 100;\n                    }\n                    return this.emit(\"totaluploadprogress\", totalUploadProgress, totalBytes, totalBytesSent);\n                };\n\n                Dropzone.prototype.getFallbackForm = function() {\n                    var existingFallback, fields, fieldsString, form;\n                    if (existingFallback = this.getExistingFallback()) {\n                        return existingFallback;\n                    }\n                    fieldsString = \"<div class=\\\"dz-fallback\\\">\";\n                    if (this.options.dictFallbackText) {\n                        fieldsString += \"<p>\" + this.options.dictFallbackText + \"</p>\";\n                    }\n                    fieldsString += \"<input type=\\\"file\\\" name=\\\"\" + this.options.paramName + (this.options.uploadMultiple ? \"[]\" : \"\") + \"\\\" \" + (this.options.uploadMultiple ? 'multiple=\"multiple\"' : void 0) + \" /><input type=\\\"submit\\\" value=\\\"Upload!\\\"></div>\";\n                    fields = Dropzone.createElement(fieldsString);\n                    if (this.element.tagName !== \"FORM\") {\n                        form = Dropzone.createElement(\"<form action=\\\"\" + this.options.url + \"\\\" enctype=\\\"multipart/form-data\\\" method=\\\"\" + this.options.method + \"\\\"></form>\");\n                        form.appendChild(fields);\n                    } else {\n                        this.element.setAttribute(\"enctype\", \"multipart/form-data\");\n                        this.element.setAttribute(\"method\", this.options.method);\n                    }\n                    return form != null ? form : fields;\n                };\n\n                Dropzone.prototype.getExistingFallback = function() {\n                    var fallback, getFallback, tagName, _i, _len, _ref;\n                    getFallback = function(elements) {\n                        var el, _i, _len;\n                        for (_i = 0, _len = elements.length; _i < _len; _i++) {\n                            el = elements[_i];\n                            if (/(^| )fallback($| )/.test(el.className)) {\n                                return el;\n                            }\n                        }\n                    };\n                    _ref = [\"div\", \"form\"];\n                    for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n                        tagName = _ref[_i];\n                        if (fallback = getFallback(this.element.getElementsByTagName(tagName))) {\n                            return fallback;\n                        }\n                    }\n                };\n\n                Dropzone.prototype.setupEventListeners = function() {\n                    var elementListeners, event, listener, _i, _len, _ref, _results;\n                    _ref = this.listeners;\n                    _results = [];\n                    for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n                        elementListeners = _ref[_i];\n                        _results.push((function() {\n                            var _ref1, _results1;\n                            _ref1 = elementListeners.events;\n                            _results1 = [];\n                            for (event in _ref1) {\n                                listener = _ref1[event];\n                                _results1.push(elementListeners.element.addEventListener(event, listener, false));\n                            }\n                            return _results1;\n                        })());\n                    }\n                    return _results;\n                };\n\n                Dropzone.prototype.removeEventListeners = function() {\n                    var elementListeners, event, listener, _i, _len, _ref, _results;\n                    _ref = this.listeners;\n                    _results = [];\n                    for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n                        elementListeners = _ref[_i];\n                        _results.push((function() {\n                            var _ref1, _results1;\n                            _ref1 = elementListeners.events;\n                            _results1 = [];\n                            for (event in _ref1) {\n                                listener = _ref1[event];\n                                _results1.push(elementListeners.element.removeEventListener(event, listener, false));\n                            }\n                            return _results1;\n                        })());\n                    }\n                    return _results;\n                };\n\n                Dropzone.prototype.disable = function() {\n                    var file, _i, _len, _ref, _results;\n                    this.clickableElements.forEach(function(element) {\n                        return element.classList.remove(\"dz-clickable\");\n                    });\n                    this.removeEventListeners();\n                    _ref = this.files;\n                    _results = [];\n                    for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n                        file = _ref[_i];\n                        _results.push(this.cancelUpload(file));\n                    }\n                    return _results;\n                };\n\n                Dropzone.prototype.enable = function() {\n                    this.clickableElements.forEach(function(element) {\n                        return element.classList.add(\"dz-clickable\");\n                    });\n                    return this.setupEventListeners();\n                };\n\n                Dropzone.prototype.filesize = function(size) {\n                    var string;\n                    if (size >= 1024 * 1024 * 1024 * 1024 / 10) {\n                        size = size / (1024 * 1024 * 1024 * 1024 / 10);\n                        string = \"TiB\";\n                    } else if (size >= 1024 * 1024 * 1024 / 10) {\n                        size = size / (1024 * 1024 * 1024 / 10);\n                        string = \"GiB\";\n                    } else if (size >= 1024 * 1024 / 10) {\n                        size = size / (1024 * 1024 / 10);\n                        string = \"MiB\";\n                    } else if (size >= 1024 / 10) {\n                        size = size / (1024 / 10);\n                        string = \"KiB\";\n                    } else {\n                        size = size * 10;\n                        string = \"b\";\n                    }\n                    return \"<strong>\" + (Math.round(size) / 10) + \"</strong> \" + string;\n                };\n\n                Dropzone.prototype._updateMaxFilesReachedClass = function() {\n                    if ((this.options.maxFiles != null) && this.getAcceptedFiles().length >= this.options.maxFiles) {\n                        if (this.getAcceptedFiles().length === this.options.maxFiles) {\n                            this.emit('maxfilesreached', this.files);\n                        }\n                        return this.element.classList.add(\"dz-max-files-reached\");\n                    } else {\n                        return this.element.classList.remove(\"dz-max-files-reached\");\n                    }\n                };\n\n                Dropzone.prototype.drop = function(e) {\n                    var files, items;\n                    if (!e.dataTransfer) {\n                        return;\n                    }\n                    this.emit(\"drop\", e);\n                    files = e.dataTransfer.files;\n                    if (files.length) {\n                        items = e.dataTransfer.items;\n                        if (items && items.length && (items[0].webkitGetAsEntry != null)) {\n                            this._addFilesFromItems(items);\n                        } else {\n                            this.handleFiles(files);\n                        }\n                    }\n                };\n\n                Dropzone.prototype.paste = function(e) {\n                    var items, _ref;\n                    if ((e != null ? (_ref = e.clipboardData) != null ? _ref.items : void 0 : void 0) == null) {\n                        return;\n                    }\n                    this.emit(\"paste\", e);\n                    items = e.clipboardData.items;\n                    if (items.length) {\n                        return this._addFilesFromItems(items);\n                    }\n                };\n\n                Dropzone.prototype.handleFiles = function(files) {\n                    var file, _i, _len, _results;\n                    _results = [];\n                    for (_i = 0, _len = files.length; _i < _len; _i++) {\n                        file = files[_i];\n                        _results.push(this.addFile(file));\n                    }\n                    return _results;\n                };\n\n                Dropzone.prototype._addFilesFromItems = function(items) {\n                    var entry, item, _i, _len, _results;\n                    _results = [];\n                    for (_i = 0, _len = items.length; _i < _len; _i++) {\n                        item = items[_i];\n                        if ((item.webkitGetAsEntry != null) && (entry = item.webkitGetAsEntry())) {\n                            if (entry.isFile) {\n                                _results.push(this.addFile(item.getAsFile()));\n                            } else if (entry.isDirectory) {\n                                _results.push(this._addFilesFromDirectory(entry, entry.name));\n                            } else {\n                                _results.push(void 0);\n                            }\n                        } else if (item.getAsFile != null) {\n                            if ((item.kind == null) || item.kind === \"file\") {\n                                _results.push(this.addFile(item.getAsFile()));\n                            } else {\n                                _results.push(void 0);\n                            }\n                        } else {\n                            _results.push(void 0);\n                        }\n                    }\n                    return _results;\n                };\n\n                Dropzone.prototype._addFilesFromDirectory = function(directory, path) {\n                    var dirReader, entriesReader;\n                    dirReader = directory.createReader();\n                    entriesReader = (function(_this) {\n                        return function(entries) {\n                            var entry, _i, _len;\n                            for (_i = 0, _len = entries.length; _i < _len; _i++) {\n                                entry = entries[_i];\n                                if (entry.isFile) {\n                                    entry.file(function(file) {\n                                        if (_this.options.ignoreHiddenFiles && file.name.substring(0, 1) === '.') {\n                                            return;\n                                        }\n                                        file.fullPath = \"\" + path + \"/\" + file.name;\n                                        return _this.addFile(file);\n                                    });\n                                } else if (entry.isDirectory) {\n                                    _this._addFilesFromDirectory(entry, \"\" + path + \"/\" + entry.name);\n                                }\n                            }\n                        };\n                    })(this);\n                    return dirReader.readEntries(entriesReader, function(error) {\n                        return typeof console !== \"undefined\" && console !== null ? typeof console.log === \"function\" ? console.log(error) : void 0 : void 0;\n                    });\n                };\n\n                Dropzone.prototype.accept = function(file, done) {\n                    if (file.size > this.options.maxFilesize * 1024 * 1024) {\n                        return done(this.options.dictFileTooBig.replace(\"{{filesize}}\", Math.round(file.size / 1024 / 10.24) / 100).replace(\"{{maxFilesize}}\", this.options.maxFilesize));\n                    } else if (!Dropzone.isValidFile(file, this.options.acceptedFiles)) {\n                        return done(this.options.dictInvalidFileType);\n                    } else if ((this.options.maxFiles != null) && this.getAcceptedFiles().length >= this.options.maxFiles) {\n                        done(this.options.dictMaxFilesExceeded.replace(\"{{maxFiles}}\", this.options.maxFiles));\n                        return this.emit(\"maxfilesexceeded\", file);\n                    } else {\n                        return this.options.accept.call(this, file, done);\n                    }\n                };\n\n                Dropzone.prototype.addFile = function(file) {\n                    file.upload = {\n                        progress: 0,\n                        total: file.size,\n                        bytesSent: 0\n                    };\n                    this.files.push(file);\n                    file.status = Dropzone.ADDED;\n                    this.emit(\"addedfile\", file);\n                    this._enqueueThumbnail(file);\n                    return this.accept(file, (function(_this) {\n                        return function(error) {\n                            if (error) {\n                                file.accepted = false;\n                                _this._errorProcessing([file], error);\n                            } else {\n                                file.accepted = true;\n                                if (_this.options.autoQueue) {\n                                    _this.enqueueFile(file);\n                                }\n                            }\n                            return _this._updateMaxFilesReachedClass();\n                        };\n                    })(this));\n                };\n\n                Dropzone.prototype.enqueueFiles = function(files) {\n                    var file, _i, _len;\n                    for (_i = 0, _len = files.length; _i < _len; _i++) {\n                        file = files[_i];\n                        this.enqueueFile(file);\n                    }\n                    return null;\n                };\n\n                Dropzone.prototype.enqueueFile = function(file) {\n                    if (file.status === Dropzone.ADDED && file.accepted === true) {\n                        file.status = Dropzone.QUEUED;\n                        if (this.options.autoProcessQueue) {\n                            return setTimeout(((function(_this) {\n                                return function() {\n                                    return _this.processQueue();\n                                };\n                            })(this)), 0);\n                        }\n                    } else {\n                        throw new Error(\"This file can't be queued because it has already been processed or was rejected.\");\n                    }\n                };\n\n                Dropzone.prototype._thumbnailQueue = [];\n\n                Dropzone.prototype._processingThumbnail = false;\n\n                Dropzone.prototype._enqueueThumbnail = function(file) {\n                    if (this.options.createImageThumbnails && file.type.match(/image.*/) && file.size <= this.options.maxThumbnailFilesize * 1024 * 1024) {\n                        this._thumbnailQueue.push(file);\n                        return setTimeout(((function(_this) {\n                            return function() {\n                                return _this._processThumbnailQueue();\n                            };\n                        })(this)), 0);\n                    }\n                };\n\n                Dropzone.prototype._processThumbnailQueue = function() {\n                    if (this._processingThumbnail || this._thumbnailQueue.length === 0) {\n                        return;\n                    }\n                    this._processingThumbnail = true;\n                    return this.createThumbnail(this._thumbnailQueue.shift(), (function(_this) {\n                        return function() {\n                            _this._processingThumbnail = false;\n                            return _this._processThumbnailQueue();\n                        };\n                    })(this));\n                };\n\n                Dropzone.prototype.removeFile = function(file) {\n                    if (file.status === Dropzone.UPLOADING) {\n                        this.cancelUpload(file);\n                    }\n                    this.files = without(this.files, file);\n                    this.emit(\"removedfile\", file);\n                    if (this.files.length === 0) {\n                        return this.emit(\"reset\");\n                    }\n                };\n\n                Dropzone.prototype.removeAllFiles = function(cancelIfNecessary) {\n                    var file, _i, _len, _ref;\n                    if (cancelIfNecessary == null) {\n                        cancelIfNecessary = false;\n                    }\n                    _ref = this.files.slice();\n                    for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n                        file = _ref[_i];\n                        if (file.status !== Dropzone.UPLOADING || cancelIfNecessary) {\n                            this.removeFile(file);\n                        }\n                    }\n                    return null;\n                };\n\n                Dropzone.prototype.createThumbnail = function(file, callback) {\n                    var fileReader;\n                    fileReader = new FileReader;\n                    fileReader.onload = (function(_this) {\n                        return function() {\n                            var img;\n                            img = document.createElement(\"img\");\n                            img.onload = function() {\n                                var canvas, ctx, resizeInfo, thumbnail, _ref, _ref1, _ref2, _ref3;\n                                file.width = img.width;\n                                file.height = img.height;\n                                resizeInfo = _this.options.resize.call(_this, file);\n                                if (resizeInfo.trgWidth == null) {\n                                    resizeInfo.trgWidth = _this.options.thumbnailWidth;\n                                }\n                                if (resizeInfo.trgHeight == null) {\n                                    resizeInfo.trgHeight = _this.options.thumbnailHeight;\n                                }\n                                canvas = document.createElement(\"canvas\");\n                                ctx = canvas.getContext(\"2d\");\n                                canvas.width = resizeInfo.trgWidth;\n                                canvas.height = resizeInfo.trgHeight;\n                                drawImageIOSFix(ctx, img, (_ref = resizeInfo.srcX) != null ? _ref : 0, (_ref1 = resizeInfo.srcY) != null ? _ref1 : 0, resizeInfo.srcWidth, resizeInfo.srcHeight, (_ref2 = resizeInfo.trgX) != null ? _ref2 : 0, (_ref3 = resizeInfo.trgY) != null ? _ref3 : 0, resizeInfo.trgWidth, resizeInfo.trgHeight);\n                                thumbnail = canvas.toDataURL(\"image/png\");\n                                _this.emit(\"thumbnail\", file, thumbnail);\n                                if (callback != null) {\n                                    return callback();\n                                }\n                            };\n                            return img.src = fileReader.result;\n                        };\n                    })(this);\n                    return fileReader.readAsDataURL(file);\n                };\n\n                Dropzone.prototype.processQueue = function() {\n                    var i, parallelUploads, processingLength, queuedFiles;\n                    parallelUploads = this.options.parallelUploads;\n                    processingLength = this.getUploadingFiles().length;\n                    i = processingLength;\n                    if (processingLength >= parallelUploads) {\n                        return;\n                    }\n                    queuedFiles = this.getQueuedFiles();\n                    if (!(queuedFiles.length > 0)) {\n                        return;\n                    }\n                    if (this.options.uploadMultiple) {\n                        return this.processFiles(queuedFiles.slice(0, parallelUploads - processingLength));\n                    } else {\n                        while (i < parallelUploads) {\n                            if (!queuedFiles.length) {\n                                return;\n                            }\n                            this.processFile(queuedFiles.shift());\n                            i++;\n                        }\n                    }\n                };\n\n                Dropzone.prototype.processFile = function(file) {\n                    return this.processFiles([file]);\n                };\n\n                Dropzone.prototype.processFiles = function(files) {\n                    var file, _i, _len;\n                    for (_i = 0, _len = files.length; _i < _len; _i++) {\n                        file = files[_i];\n                        file.processing = true;\n                        file.status = Dropzone.UPLOADING;\n                        this.emit(\"processing\", file);\n                    }\n                    if (this.options.uploadMultiple) {\n                        this.emit(\"processingmultiple\", files);\n                    }\n                    return this.uploadFiles(files);\n                };\n\n                Dropzone.prototype._getFilesWithXhr = function(xhr) {\n                    var file, files;\n                    return files = (function() {\n                        var _i, _len, _ref, _results;\n                        _ref = this.files;\n                        _results = [];\n                        for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n                            file = _ref[_i];\n                            if (file.xhr === xhr) {\n                                _results.push(file);\n                            }\n                        }\n                        return _results;\n                    }).call(this);\n                };\n\n                Dropzone.prototype.cancelUpload = function(file) {\n                    var groupedFile, groupedFiles, _i, _j, _len, _len1, _ref;\n                    if (file.status === Dropzone.UPLOADING) {\n                        groupedFiles = this._getFilesWithXhr(file.xhr);\n                        for (_i = 0, _len = groupedFiles.length; _i < _len; _i++) {\n                            groupedFile = groupedFiles[_i];\n                            groupedFile.status = Dropzone.CANCELED;\n                        }\n                        file.xhr.abort();\n                        for (_j = 0, _len1 = groupedFiles.length; _j < _len1; _j++) {\n                            groupedFile = groupedFiles[_j];\n                            this.emit(\"canceled\", groupedFile);\n                        }\n                        if (this.options.uploadMultiple) {\n                            this.emit(\"canceledmultiple\", groupedFiles);\n                        }\n                    } else if ((_ref = file.status) === Dropzone.ADDED || _ref === Dropzone.QUEUED) {\n                        file.status = Dropzone.CANCELED;\n                        this.emit(\"canceled\", file);\n                        if (this.options.uploadMultiple) {\n                            this.emit(\"canceledmultiple\", [file]);\n                        }\n                    }\n                    if (this.options.autoProcessQueue) {\n                        return this.processQueue();\n                    }\n                };\n\n                Dropzone.prototype.uploadFile = function(file) {\n                    return this.uploadFiles([file]);\n                };\n\n                Dropzone.prototype.uploadFiles = function(files) {\n                    var file, formData, handleError, headerName, headerValue, headers, input, inputName, inputType, key, option, progressObj, response, updateProgress, value, xhr, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _ref, _ref1, _ref2, _ref3, _ref4;\n                    xhr = new XMLHttpRequest();\n                    for (_i = 0, _len = files.length; _i < _len; _i++) {\n                        file = files[_i];\n                        file.xhr = xhr;\n                    }\n                    xhr.open(this.options.method, this.options.url, true);\n                    xhr.withCredentials = !!this.options.withCredentials;\n                    response = null;\n                    handleError = (function(_this) {\n                        return function() {\n                            var _j, _len1, _results;\n                            _results = [];\n                            for (_j = 0, _len1 = files.length; _j < _len1; _j++) {\n                                file = files[_j];\n                                _results.push(_this._errorProcessing(files, response || _this.options.dictResponseError.replace(\"{{statusCode}}\", xhr.status), xhr));\n                            }\n                            return _results;\n                        };\n                    })(this);\n                    updateProgress = (function(_this) {\n                        return function(e) {\n                            var allFilesFinished, progress, _j, _k, _l, _len1, _len2, _len3, _results;\n                            if (e != null) {\n                                progress = 100 * e.loaded / e.total;\n                                for (_j = 0, _len1 = files.length; _j < _len1; _j++) {\n                                    file = files[_j];\n                                    file.upload = {\n                                        progress: progress,\n                                        total: e.total,\n                                        bytesSent: e.loaded\n                                    };\n                                }\n                            } else {\n                                allFilesFinished = true;\n                                progress = 100;\n                                for (_k = 0, _len2 = files.length; _k < _len2; _k++) {\n                                    file = files[_k];\n                                    if (!(file.upload.progress === 100 && file.upload.bytesSent === file.upload.total)) {\n                                        allFilesFinished = false;\n                                    }\n                                    file.upload.progress = progress;\n                                    file.upload.bytesSent = file.upload.total;\n                                }\n                                if (allFilesFinished) {\n                                    return;\n                                }\n                            }\n                            _results = [];\n                            for (_l = 0, _len3 = files.length; _l < _len3; _l++) {\n                                file = files[_l];\n                                _results.push(_this.emit(\"uploadprogress\", file, progress, file.upload.bytesSent));\n                            }\n                            return _results;\n                        };\n                    })(this);\n                    xhr.onload = (function(_this) {\n                        return function(e) {\n                            var _ref;\n                            if (files[0].status === Dropzone.CANCELED) {\n                                return;\n                            }\n                            if (xhr.readyState !== 4) {\n                                return;\n                            }\n                            response = xhr.responseText;\n                            if (xhr.getResponseHeader(\"content-type\") && ~xhr.getResponseHeader(\"content-type\").indexOf(\"application/json\")) {\n                                try {\n                                    response = JSON.parse(response);\n                                } catch (_error) {\n                                    e = _error;\n                                    response = \"Invalid JSON response from server.\";\n                                }\n                            }\n                            updateProgress();\n                            if (!((200 <= (_ref = xhr.status) && _ref < 300))) {\n                                return handleError();\n                            } else {\n                                return _this._finished(files, response, e);\n                            }\n                        };\n                    })(this);\n                    xhr.onerror = (function(_this) {\n                        return function() {\n                            if (files[0].status === Dropzone.CANCELED) {\n                                return;\n                            }\n                            return handleError();\n                        };\n                    })(this);\n                    progressObj = (_ref = xhr.upload) != null ? _ref : xhr;\n                    progressObj.onprogress = updateProgress;\n                    headers = {\n                        \"Accept\": \"application/json\",\n                        \"Cache-Control\": \"no-cache\",\n                        \"X-Requested-With\": \"XMLHttpRequest\"\n                    };\n                    if (this.options.headers) {\n                        extend(headers, this.options.headers);\n                    }\n                    for (headerName in headers) {\n                        headerValue = headers[headerName];\n                        xhr.setRequestHeader(headerName, headerValue);\n                    }\n                    formData = new FormData();\n                    if (this.options.params) {\n                        _ref1 = this.options.params;\n                        for (key in _ref1) {\n                            value = _ref1[key];\n                            formData.append(key, value);\n                        }\n                    }\n                    for (_j = 0, _len1 = files.length; _j < _len1; _j++) {\n                        file = files[_j];\n                        this.emit(\"sending\", file, xhr, formData);\n                    }\n                    if (this.options.uploadMultiple) {\n                        this.emit(\"sendingmultiple\", files, xhr, formData);\n                    }\n                    if (this.element.tagName === \"FORM\") {\n                        _ref2 = this.element.querySelectorAll(\"input, textarea, select, button\");\n                        for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {\n                            input = _ref2[_k];\n                            inputName = input.getAttribute(\"name\");\n                            inputType = input.getAttribute(\"type\");\n                            if (input.tagName === \"SELECT\" && input.hasAttribute(\"multiple\")) {\n                                _ref3 = input.options;\n                                for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) {\n                                    option = _ref3[_l];\n                                    if (option.selected) {\n                                        formData.append(inputName, option.value);\n                                    }\n                                }\n                            } else if (!inputType || ((_ref4 = inputType.toLowerCase()) !== \"checkbox\" && _ref4 !== \"radio\") || input.checked) {\n                                formData.append(inputName, input.value);\n                            }\n                        }\n                    }\n                    for (_m = 0, _len4 = files.length; _m < _len4; _m++) {\n                        file = files[_m];\n                        formData.append(\"\" + this.options.paramName + (this.options.uploadMultiple ? \"[]\" : \"\"), file, file.name);\n                    }\n                    return xhr.send(formData);\n                };\n\n                Dropzone.prototype._finished = function(files, responseText, e) {\n                    var file, _i, _len;\n                    for (_i = 0, _len = files.length; _i < _len; _i++) {\n                        file = files[_i];\n                        file.status = Dropzone.SUCCESS;\n                        this.emit(\"success\", file, responseText, e);\n                        this.emit(\"complete\", file);\n                    }\n                    if (this.options.uploadMultiple) {\n                        this.emit(\"successmultiple\", files, responseText, e);\n                        this.emit(\"completemultiple\", files);\n                    }\n                    if (this.options.autoProcessQueue) {\n                        return this.processQueue();\n                    }\n                };\n\n                Dropzone.prototype._errorProcessing = function(files, message, xhr) {\n                    var file, _i, _len;\n                    for (_i = 0, _len = files.length; _i < _len; _i++) {\n                        file = files[_i];\n                        file.status = Dropzone.ERROR;\n                        this.emit(\"error\", file, message, xhr);\n                        this.emit(\"complete\", file);\n                    }\n                    if (this.options.uploadMultiple) {\n                        this.emit(\"errormultiple\", files, message, xhr);\n                        this.emit(\"completemultiple\", files);\n                    }\n                    if (this.options.autoProcessQueue) {\n                        return this.processQueue();\n                    }\n                };\n\n                return Dropzone;\n\n            })(Em);\n\n            Dropzone.version = \"3.8.7\";\n\n            Dropzone.options = {};\n\n            Dropzone.optionsForElement = function(element) {\n                if (element.getAttribute(\"id\")) {\n                    return Dropzone.options[camelize(element.getAttribute(\"id\"))];\n                } else {\n                    return void 0;\n                }\n            };\n\n            Dropzone.instances = [];\n\n            Dropzone.forElement = function(element) {\n                if (typeof element === \"string\") {\n                    element = document.querySelector(element);\n                }\n                if ((element != null ? element.dropzone : void 0) == null) {\n                    throw new Error(\"No Dropzone found for given element. This is probably because you're trying to access it before Dropzone had the time to initialize. Use the `init` option to setup any additional observers on your Dropzone.\");\n                }\n                return element.dropzone;\n            };\n\n            Dropzone.autoDiscover = true;\n\n            Dropzone.discover = function() {\n                var checkElements, dropzone, dropzones, _i, _len, _results;\n                if (document.querySelectorAll) {\n                    dropzones = document.querySelectorAll(\".dropzone\");\n                } else {\n                    dropzones = [];\n                    checkElements = function(elements) {\n                        var el, _i, _len, _results;\n                        _results = [];\n                        for (_i = 0, _len = elements.length; _i < _len; _i++) {\n                            el = elements[_i];\n                            if (/(^| )dropzone($| )/.test(el.className)) {\n                                _results.push(dropzones.push(el));\n                            } else {\n                                _results.push(void 0);\n                            }\n                        }\n                        return _results;\n                    };\n                    checkElements(document.getElementsByTagName(\"div\"));\n                    checkElements(document.getElementsByTagName(\"form\"));\n                }\n                _results = [];\n                for (_i = 0, _len = dropzones.length; _i < _len; _i++) {\n                    dropzone = dropzones[_i];\n                    if (Dropzone.optionsForElement(dropzone) !== false) {\n                        _results.push(new Dropzone(dropzone));\n                    } else {\n                        _results.push(void 0);\n                    }\n                }\n                return _results;\n            };\n\n            Dropzone.blacklistedBrowsers = [/opera.*Macintosh.*version\\/12/i];\n\n            Dropzone.isBrowserSupported = function() {\n                var capableBrowser, regex, _i, _len, _ref;\n                capableBrowser = true;\n                if (window.File && window.FileReader && window.FileList && window.Blob && window.FormData && document.querySelector) {\n                    if (!(\"classList\" in document.createElement(\"a\"))) {\n                        capableBrowser = false;\n                    } else {\n                        _ref = Dropzone.blacklistedBrowsers;\n                        for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n                            regex = _ref[_i];\n                            if (regex.test(navigator.userAgent)) {\n                                capableBrowser = false;\n                                continue;\n                            }\n                        }\n                    }\n                } else {\n                    capableBrowser = false;\n                }\n                return capableBrowser;\n            };\n\n            without = function(list, rejectedItem) {\n                var item, _i, _len, _results;\n                _results = [];\n                for (_i = 0, _len = list.length; _i < _len; _i++) {\n                    item = list[_i];\n                    if (item !== rejectedItem) {\n                        _results.push(item);\n                    }\n                }\n                return _results;\n            };\n\n            camelize = function(str) {\n                return str.replace(/[\\-_](\\w)/g, function(match) {\n                    return match.charAt(1).toUpperCase();\n                });\n            };\n\n            Dropzone.createElement = function(string) {\n                var div;\n                div = document.createElement(\"div\");\n                div.innerHTML = string;\n                return div.childNodes[0];\n            };\n\n            Dropzone.elementInside = function(element, container) {\n                if (element === container) {\n                    return true;\n                }\n                while (element = element.parentNode) {\n                    if (element === container) {\n                        return true;\n                    }\n                }\n                return false;\n            };\n\n            Dropzone.getElement = function(el, name) {\n                var element;\n                if (typeof el === \"string\") {\n                    element = document.querySelector(el);\n                } else if (el.nodeType != null) {\n                    element = el;\n                }\n                if (element == null) {\n                    throw new Error(\"Invalid `\" + name + \"` option provided. Please provide a CSS selector or a plain HTML element.\");\n                }\n                return element;\n            };\n\n            Dropzone.getElements = function(els, name) {\n                var e, el, elements, _i, _j, _len, _len1, _ref;\n                if (els instanceof Array) {\n                    elements = [];\n                    try {\n                        for (_i = 0, _len = els.length; _i < _len; _i++) {\n                            el = els[_i];\n                            elements.push(this.getElement(el, name));\n                        }\n                    } catch (_error) {\n                        e = _error;\n                        elements = null;\n                    }\n                } else if (typeof els === \"string\") {\n                    elements = [];\n                    _ref = document.querySelectorAll(els);\n                    for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {\n                        el = _ref[_j];\n                        elements.push(el);\n                    }\n                } else if (els.nodeType != null) {\n                    elements = [els];\n                }\n                if (!((elements != null) && elements.length)) {\n                    throw new Error(\"Invalid `\" + name + \"` option provided. Please provide a CSS selector, a plain HTML element or a list of those.\");\n                }\n                return elements;\n            };\n\n            Dropzone.confirm = function(question, accepted, rejected) {\n                if (window.confirm(question)) {\n                    return accepted();\n                } else if (rejected != null) {\n                    return rejected();\n                }\n            };\n\n            Dropzone.isValidFile = function(file, acceptedFiles) {\n                var baseMimeType, mimeType, validType, _i, _len;\n                if (!acceptedFiles) {\n                    return true;\n                }\n                acceptedFiles = acceptedFiles.split(\",\");\n                mimeType = file.type;\n                baseMimeType = mimeType.replace(/\\/.*$/, \"\");\n                for (_i = 0, _len = acceptedFiles.length; _i < _len; _i++) {\n                    validType = acceptedFiles[_i];\n                    validType = validType.trim();\n                    if (validType.charAt(0) === \".\") {\n                        if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) {\n                            return true;\n                        }\n                    } else if (/\\/\\*$/.test(validType)) {\n                        if (baseMimeType === validType.replace(/\\/.*$/, \"\")) {\n                            return true;\n                        }\n                    } else {\n                        if (mimeType === validType) {\n                            return true;\n                        }\n                    }\n                }\n                return false;\n            };\n\n            if (typeof jQuery !== \"undefined\" && jQuery !== null) {\n                jQuery.fn.dropzone = function(options) {\n                    return this.each(function() {\n                        return new Dropzone(this, options);\n                    });\n                };\n            }\n\n            if (typeof module !== \"undefined\" && module !== null) {\n                module.exports = Dropzone;\n            } else {\n                window.Dropzone = Dropzone;\n            }\n\n            Dropzone.ADDED = \"added\";\n\n            Dropzone.QUEUED = \"queued\";\n\n            Dropzone.ACCEPTED = Dropzone.QUEUED;\n\n            Dropzone.UPLOADING = \"uploading\";\n\n            Dropzone.PROCESSING = Dropzone.UPLOADING;\n\n            Dropzone.CANCELED = \"canceled\";\n\n            Dropzone.ERROR = \"error\";\n\n            Dropzone.SUCCESS = \"success\";\n\n\n            /*\n\n             Bugfix for iOS 6 and 7\n             Source: http://stackoverflow.com/questions/11929099/html5-canvas-drawimage-ratio-bug-ios\n             based on the work of https://github.com/stomita/ios-imagefile-megapixel\n             */\n\n            detectVerticalSquash = function(img) {\n                var alpha, canvas, ctx, data, ey, ih, iw, py, ratio, sy;\n                iw = img.naturalWidth;\n                ih = img.naturalHeight;\n                canvas = document.createElement(\"canvas\");\n                canvas.width = 1;\n                canvas.height = ih;\n                ctx = canvas.getContext(\"2d\");\n                ctx.drawImage(img, 0, 0);\n                data = ctx.getImageData(0, 0, 1, ih).data;\n                sy = 0;\n                ey = ih;\n                py = ih;\n                while (py > sy) {\n                    alpha = data[(py - 1) * 4 + 3];\n                    if (alpha === 0) {\n                        ey = py;\n                    } else {\n                        sy = py;\n                    }\n                    py = (ey + sy) >> 1;\n                }\n                ratio = py / ih;\n                if (ratio === 0) {\n                    return 1;\n                } else {\n                    return ratio;\n                }\n            };\n\n            drawImageIOSFix = function(ctx, img, sx, sy, sw, sh, dx, dy, dw, dh) {\n                var vertSquashRatio;\n                vertSquashRatio = detectVerticalSquash(img);\n                return ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh / vertSquashRatio);\n            };\n\n\n            /*\n             * contentloaded.js\n             *\n             * Author: Diego Perini (diego.perini at gmail.com)\n             * Summary: cross-browser wrapper for DOMContentLoaded\n             * Updated: 20101020\n             * License: MIT\n             * Version: 1.2\n             *\n             * URL:\n             * http://javascript.nwbox.com/ContentLoaded/\n             * http://javascript.nwbox.com/ContentLoaded/MIT-LICENSE\n             */\n\n            contentLoaded = function(win, fn) {\n                var add, doc, done, init, poll, pre, rem, root, top;\n                done = false;\n                top = true;\n                doc = win.document;\n                root = doc.documentElement;\n                add = (doc.addEventListener ? \"addEventListener\" : \"attachEvent\");\n                rem = (doc.addEventListener ? \"removeEventListener\" : \"detachEvent\");\n                pre = (doc.addEventListener ? \"\" : \"on\");\n                init = function(e) {\n                    if (e.type === \"readystatechange\" && doc.readyState !== \"complete\") {\n                        return;\n                    }\n                    (e.type === \"load\" ? win : doc)[rem](pre + e.type, init, false);\n                    if (!done && (done = true)) {\n                        return fn.call(win, e.type || e);\n                    }\n                };\n                poll = function() {\n                    var e;\n                    try {\n                        root.doScroll(\"left\");\n                    } catch (_error) {\n                        e = _error;\n                        setTimeout(poll, 50);\n                        return;\n                    }\n                    return init(\"poll\");\n                };\n                if (doc.readyState !== \"complete\") {\n                    if (doc.createEventObject && root.doScroll) {\n                        try {\n                            top = !win.frameElement;\n                        } catch (_error) {}\n                        if (top) {\n                            poll();\n                        }\n                    }\n                    doc[add](pre + \"DOMContentLoaded\", init, false);\n                    doc[add](pre + \"readystatechange\", init, false);\n                    return win[add](pre + \"load\", init, false);\n                }\n            };\n\n            Dropzone._autoDiscoverFunction = function() {\n                if (Dropzone.autoDiscover) {\n                    return Dropzone.discover();\n                }\n            };\n\n            contentLoaded(window, Dropzone._autoDiscoverFunction);\n\n        }).call(this);\n\n    });\n\n    if (typeof exports == \"object\") {\n        module.exports = require(\"dropzone\");\n    } else if (typeof define == \"function\" && define.amd) {\n        define([], function(){ return require(\"dropzone\"); });\n    } else {\n        this[\"Dropzone\"] = require(\"dropzone\");\n    }\n})()\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/easypiechart/jquery.easypiechart.js",
    "content": "/**!\n * easyPieChart\n * Lightweight plugin to render simple, animated and retina optimized pie charts\n *\n * @license\n * @author Robert Fleischmann <rendro87@gmail.com> (http://robert-fleischmann.de)\n * @version 2.1.5\n **/\n\n(function(root, factory) {\n    if(typeof exports === 'object') {\n        module.exports = factory(require('jquery'));\n    }\n    else if(typeof define === 'function' && define.amd) {\n        define(['jquery'], factory);\n    }\n    else {\n        factory(root.jQuery);\n    }\n}(this, function($) {\n\n    /**\n     * Renderer to render the chart on a canvas object\n     * @param {DOMElement} el      DOM element to host the canvas (root of the plugin)\n     * @param {object}     options options object of the plugin\n     */\n    var CanvasRenderer = function(el, options) {\n        var cachedBackground;\n        var canvas = document.createElement('canvas');\n\n        el.appendChild(canvas);\n\n        if (typeof(G_vmlCanvasManager) !== 'undefined') {\n            G_vmlCanvasManager.initElement(canvas);\n        }\n\n        var ctx = canvas.getContext('2d');\n\n        canvas.width = canvas.height = options.size;\n\n        // canvas on retina devices\n        var scaleBy = 1;\n        if (window.devicePixelRatio > 1) {\n            scaleBy = window.devicePixelRatio;\n            canvas.style.width = canvas.style.height = [options.size, 'px'].join('');\n            canvas.width = canvas.height = options.size * scaleBy;\n            ctx.scale(scaleBy, scaleBy);\n        }\n\n        // move 0,0 coordinates to the center\n        ctx.translate(options.size / 2, options.size / 2);\n\n        // rotate canvas -90deg\n        ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI);\n\n        var radius = (options.size - options.lineWidth) / 2;\n        if (options.scaleColor && options.scaleLength) {\n            radius -= options.scaleLength + 2; // 2 is the distance between scale and bar\n        }\n\n        // IE polyfill for Date\n        Date.now = Date.now || function() {\n            return +(new Date());\n        };\n\n        /**\n         * Draw a circle around the center of the canvas\n         * @param {strong} color     Valid CSS color string\n         * @param {number} lineWidth Width of the line in px\n         * @param {number} percent   Percentage to draw (float between -1 and 1)\n         */\n        var drawCircle = function(color, lineWidth, percent) {\n            percent = Math.min(Math.max(-1, percent || 0), 1);\n            var isNegative = percent <= 0 ? true : false;\n\n            ctx.beginPath();\n            ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, isNegative);\n\n            ctx.strokeStyle = color;\n            ctx.lineWidth = lineWidth;\n\n            ctx.stroke();\n        };\n\n        /**\n         * Draw the scale of the chart\n         */\n        var drawScale = function() {\n            var offset;\n            var length;\n\n            ctx.lineWidth = 1;\n            ctx.fillStyle = options.scaleColor;\n\n            ctx.save();\n            for (var i = 24; i > 0; --i) {\n                if (i % 6 === 0) {\n                    length = options.scaleLength;\n                    offset = 0;\n                } else {\n                    length = options.scaleLength * 0.6;\n                    offset = options.scaleLength - length;\n                }\n                ctx.fillRect(-options.size/2 + offset, 0, length, 1);\n                ctx.rotate(Math.PI / 12);\n            }\n            ctx.restore();\n        };\n\n        /**\n         * Request animation frame wrapper with polyfill\n         * @return {function} Request animation frame method or timeout fallback\n         */\n        var reqAnimationFrame = (function() {\n            return  window.requestAnimationFrame ||\n                window.webkitRequestAnimationFrame ||\n                window.mozRequestAnimationFrame ||\n                function(callback) {\n                    window.setTimeout(callback, 1000 / 60);\n                };\n        }());\n\n        /**\n         * Draw the background of the plugin including the scale and the track\n         */\n        var drawBackground = function() {\n            if(options.scaleColor) drawScale();\n            if(options.trackColor) drawCircle(options.trackColor, options.lineWidth, 1);\n        };\n\n        /**\n         * Canvas accessor\n         */\n        this.getCanvas = function() {\n            return canvas;\n        };\n\n        /**\n         * Canvas 2D context 'ctx' accessor\n         */\n        this.getCtx = function() {\n            return ctx;\n        };\n\n        /**\n         * Clear the complete canvas\n         */\n        this.clear = function() {\n            ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size);\n        };\n\n        /**\n         * Draw the complete chart\n         * @param {number} percent Percent shown by the chart between -100 and 100\n         */\n        this.draw = function(percent) {\n            // do we need to render a background\n            if (!!options.scaleColor || !!options.trackColor) {\n                // getImageData and putImageData are supported\n                if (ctx.getImageData && ctx.putImageData) {\n                    if (!cachedBackground) {\n                        drawBackground();\n                        cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy);\n                    } else {\n                        ctx.putImageData(cachedBackground, 0, 0);\n                    }\n                } else {\n                    this.clear();\n                    drawBackground();\n                }\n            } else {\n                this.clear();\n            }\n\n            ctx.lineCap = options.lineCap;\n\n            // if barcolor is a function execute it and pass the percent as a value\n            var color;\n            if (typeof(options.barColor) === 'function') {\n                color = options.barColor(percent);\n            } else {\n                color = options.barColor;\n            }\n\n            // draw bar\n            drawCircle(color, options.lineWidth, percent / 100);\n        }.bind(this);\n\n        /**\n         * Animate from some percent to some other percentage\n         * @param {number} from Starting percentage\n         * @param {number} to   Final percentage\n         */\n        this.animate = function(from, to) {\n            var startTime = Date.now();\n            options.onStart(from, to);\n            var animation = function() {\n                var process = Math.min(Date.now() - startTime, options.animate.duration);\n                var currentValue = options.easing(this, process, from, to - from, options.animate.duration);\n                this.draw(currentValue);\n                options.onStep(from, to, currentValue);\n                if (process >= options.animate.duration) {\n                    options.onStop(from, to);\n                } else {\n                    reqAnimationFrame(animation);\n                }\n            }.bind(this);\n\n            reqAnimationFrame(animation);\n        }.bind(this);\n    };\n\n    var EasyPieChart = function(el, opts) {\n        var defaultOptions = {\n            barColor: '#ef1e25',\n            trackColor: '#f9f9f9',\n            scaleColor: '#dfe0e0',\n            scaleLength: 5,\n            lineCap: 'round',\n            lineWidth: 3,\n            size: 110,\n            rotate: 0,\n            animate: {\n                duration: 1000,\n                enabled: true\n            },\n            easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/\n                t = t / (d/2);\n                if (t < 1) {\n                    return c / 2 * t * t + b;\n                }\n                return -c/2 * ((--t)*(t-2) - 1) + b;\n            },\n            onStart: function(from, to) {\n                return;\n            },\n            onStep: function(from, to, currentValue) {\n                return;\n            },\n            onStop: function(from, to) {\n                return;\n            }\n        };\n\n        // detect present renderer\n        if (typeof(CanvasRenderer) !== 'undefined') {\n            defaultOptions.renderer = CanvasRenderer;\n        } else if (typeof(SVGRenderer) !== 'undefined') {\n            defaultOptions.renderer = SVGRenderer;\n        } else {\n            throw new Error('Please load either the SVG- or the CanvasRenderer');\n        }\n\n        var options = {};\n        var currentValue = 0;\n\n        /**\n         * Initialize the plugin by creating the options object and initialize rendering\n         */\n        var init = function() {\n            this.el = el;\n            this.options = options;\n\n            // merge user options into default options\n            for (var i in defaultOptions) {\n                if (defaultOptions.hasOwnProperty(i)) {\n                    options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i];\n                    if (typeof(options[i]) === 'function') {\n                        options[i] = options[i].bind(this);\n                    }\n                }\n            }\n\n            // check for jQuery easing\n            if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) {\n                options.easing = jQuery.easing[options.easing];\n            } else {\n                options.easing = defaultOptions.easing;\n            }\n\n            // process earlier animate option to avoid bc breaks\n            if (typeof(options.animate) === 'number') {\n                options.animate = {\n                    duration: options.animate,\n                    enabled: true\n                };\n            }\n\n            if (typeof(options.animate) === 'boolean' && !options.animate) {\n                options.animate = {\n                    duration: 1000,\n                    enabled: options.animate\n                };\n            }\n\n            // create renderer\n            this.renderer = new options.renderer(el, options);\n\n            // initial draw\n            this.renderer.draw(currentValue);\n\n            // initial update\n            if (el.dataset && el.dataset.percent) {\n                this.update(parseFloat(el.dataset.percent));\n            } else if (el.getAttribute && el.getAttribute('data-percent')) {\n                this.update(parseFloat(el.getAttribute('data-percent')));\n            }\n        }.bind(this);\n\n        /**\n         * Update the value of the chart\n         * @param  {number} newValue Number between 0 and 100\n         * @return {object}          Instance of the plugin for method chaining\n         */\n        this.update = function(newValue) {\n            newValue = parseFloat(newValue);\n            if (options.animate.enabled) {\n                this.renderer.animate(currentValue, newValue);\n            } else {\n                this.renderer.draw(newValue);\n            }\n            currentValue = newValue;\n            return this;\n        }.bind(this);\n\n        /**\n         * Disable animation\n         * @return {object} Instance of the plugin for method chaining\n         */\n        this.disableAnimation = function() {\n            options.animate.enabled = false;\n            return this;\n        };\n\n        /**\n         * Enable animation\n         * @return {object} Instance of the plugin for method chaining\n         */\n        this.enableAnimation = function() {\n            options.animate.enabled = true;\n            return this;\n        };\n\n        init();\n    };\n\n    $.fn.easyPieChart = function(options) {\n        return this.each(function() {\n            var instanceOptions;\n\n            if (!$.data(this, 'easyPieChart')) {\n                instanceOptions = $.extend({}, options, $(this).data());\n                $.data(this, 'easyPieChart', new EasyPieChart(this, instanceOptions));\n            }\n        });\n    };\n\n\n}));\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/echarts/echarts-all.js",
    "content": "!function(e){var t,i;!function(){function e(e,t){if(!t)return e;if(0===e.indexOf(\".\")){var i=t.split(\"/\"),n=e.split(\"/\"),a=i.length-1,o=n.length,r=0,s=0;e:for(var l=0;o>l;l++)switch(n[l]){case\"..\":if(!(a>r))break e;r++,s++;break;case\".\":s++;break;default:break e}return i.length=a-r,n=n.slice(s),i.concat(n).join(\"/\")}return e}function n(t){function i(i,r){if(\"string\"==typeof i){var s=n[i];return s||(s=o(e(i,t)),n[i]=s),s}i instanceof Array&&(r=r||function(){},r.apply(this,a(i,r,t)))}var n={};return i}function a(i,n,a){for(var s=[],l=r[a],h=0,m=Math.min(i.length,n.length);m>h;h++){var V,U=e(i[h],a);switch(U){case\"require\":V=l&&l.require||t;break;case\"exports\":V=l.exports;break;case\"module\":V=l;break;default:V=o(U)}s.push(V)}return s}function o(e){var t=r[e];if(!t)throw new Error(\"No \"+e);if(!t.defined){var i=t.factory,n=i.apply(this,a(t.deps||[],i,e));\"undefined\"!=typeof n&&(t.exports=n),t.defined=1}return t.exports}var r={};i=function(e,t,i){r[e]={id:e,deps:t,factory:i,defined:0,exports:{},require:n(e)}},t=n(\"\")}(),i(\"echarts\",[\"echarts/echarts\"],function(e){return e}),i(\"echarts/echarts\",[\"require\",\"./config\",\"zrender/tool/util\",\"zrender/tool/event\",\"zrender/tool/env\",\"zrender\",\"zrender/config\",\"./chart/island\",\"./component/toolbox\",\"./component\",\"./component/title\",\"./component/tooltip\",\"./component/legend\",\"./util/ecData\",\"./chart\",\"zrender/tool/color\",\"./component/timeline\",\"zrender/shape/Image\",\"zrender/loadingEffect/Bar\",\"zrender/loadingEffect/Bubble\",\"zrender/loadingEffect/DynamicLine\",\"zrender/loadingEffect/Ring\",\"zrender/loadingEffect/Spin\",\"zrender/loadingEffect/Whirling\",\"./theme/macarons\",\"./theme/infographic\"],function(e){function t(){r.Dispatcher.call(this)}function i(e){e.innerHTML=\"\",this._themeConfig={},this.dom=e,this._connected=!1,this._status={dragIn:!1,dragOut:!1,needRefresh:!1},this._curEventType=!1,this._chartList=[],this._messageCenter=new t,this._messageCenterOutSide=new t,this.resize=this.resize(),this._init()}function n(e,t,i,n,a){for(var o=e._chartList,r=o.length;r--;){var s=o[r];\"function\"==typeof s[t]&&s[t](i,n,a)}}var a=e(\"./config\"),o=e(\"zrender/tool/util\"),r=e(\"zrender/tool/event\"),s={},l=e(\"zrender/tool/env\").canvasSupported,h=new Date-0,m={},V=\"_echarts_instance_\";s.version=\"2.2.7\",s.dependencies={zrender:\"2.1.1\"},s.init=function(t,n){var a=e(\"zrender\");a.version.replace(\".\",\"\")-0<s.dependencies.zrender.replace(\".\",\"\")-0&&console.error(\"ZRender \"+a.version+\" is too old for ECharts \"+s.version+\". Current version need ZRender \"+s.dependencies.zrender+\"+\"),t=t instanceof Array?t[0]:t;var o=t.getAttribute(V);return o||(o=h++,t.setAttribute(V,o)),m[o]&&m[o].dispose(),m[o]=new i(t),m[o].id=o,m[o].canvasSupported=l,m[o].setTheme(n),m[o]},s.getInstanceById=function(e){return m[e]},o.merge(t.prototype,r.Dispatcher.prototype,!0);var U=e(\"zrender/config\").EVENT,d=[\"CLICK\",\"DBLCLICK\",\"MOUSEOVER\",\"MOUSEOUT\",\"DRAGSTART\",\"DRAGEND\",\"DRAGENTER\",\"DRAGOVER\",\"DRAGLEAVE\",\"DROP\"];return i.prototype={_init:function(){var t=this,i=e(\"zrender\").init(this.dom);this._zr=i,this._messageCenter.dispatch=function(e,i,n,a){n=n||{},n.type=e,n.event=i,t._messageCenter.dispatchWithContext(e,n,a),t._messageCenterOutSide.dispatchWithContext(e,n,a)},this._onevent=function(e){return t.__onevent(e)};for(var n in a.EVENT)\"CLICK\"!=n&&\"DBLCLICK\"!=n&&\"HOVER\"!=n&&\"MOUSEOUT\"!=n&&\"MAP_ROAM\"!=n&&this._messageCenter.bind(a.EVENT[n],this._onevent,this);var o={};this._onzrevent=function(e){return t[o[e.type]](e)};for(var r=0,s=d.length;s>r;r++){var l=d[r],h=U[l];o[h]=\"_on\"+l.toLowerCase(),i.on(h,this._onzrevent)}this.chart={},this.component={};var m=e(\"./chart/island\");this._island=new m(this._themeConfig,this._messageCenter,i,{},this),this.chart.island=this._island;var V=e(\"./component/toolbox\");this._toolbox=new V(this._themeConfig,this._messageCenter,i,{},this),this.component.toolbox=this._toolbox;var p=e(\"./component\");p.define(\"title\",e(\"./component/title\")),p.define(\"tooltip\",e(\"./component/tooltip\")),p.define(\"legend\",e(\"./component/legend\")),(0===i.getWidth()||0===i.getHeight())&&console.error(\"Dom’s width & height should be ready before init.\")},__onevent:function(e){e.__echartsId=e.__echartsId||this.id;var t=e.__echartsId===this.id;switch(this._curEventType||(this._curEventType=e.type),e.type){case a.EVENT.LEGEND_SELECTED:this._onlegendSelected(e);break;case a.EVENT.DATA_ZOOM:if(!t){var i=this.component.dataZoom;i&&(i.silence(!0),i.absoluteZoom(e.zoom),i.silence(!1))}this._ondataZoom(e);break;case a.EVENT.DATA_RANGE:t&&this._ondataRange(e);break;case a.EVENT.MAGIC_TYPE_CHANGED:if(!t){var n=this.component.toolbox;n&&(n.silence(!0),n.setMagicType(e.magicType),n.silence(!1))}this._onmagicTypeChanged(e);break;case a.EVENT.DATA_VIEW_CHANGED:t&&this._ondataViewChanged(e);break;case a.EVENT.TOOLTIP_HOVER:t&&this._tooltipHover(e);break;case a.EVENT.RESTORE:this._onrestore();break;case a.EVENT.REFRESH:t&&this._onrefresh(e);break;case a.EVENT.TOOLTIP_IN_GRID:case a.EVENT.TOOLTIP_OUT_GRID:if(t){if(this._connected){var o=this.component.grid;o&&(e.x=(e.event.zrenderX-o.getX())/o.getWidth(),e.y=(e.event.zrenderY-o.getY())/o.getHeight())}}else{var o=this.component.grid;o&&this._zr.trigger(\"mousemove\",{connectTrigger:!0,zrenderX:o.getX()+e.x*o.getWidth(),zrenderY:o.getY()+e.y*o.getHeight()})}}if(this._connected&&t&&this._curEventType===e.type){for(var r in this._connected)this._connected[r].connectedEventHandler(e);this._curEventType=null}(!t||!this._connected&&t)&&(this._curEventType=null)},_onclick:function(e){if(n(this,\"onclick\",e),e.target){var t=this._eventPackage(e.target);t&&null!=t.seriesIndex&&this._messageCenter.dispatch(a.EVENT.CLICK,e.event,t,this)}},_ondblclick:function(e){if(n(this,\"ondblclick\",e),e.target){var t=this._eventPackage(e.target);t&&null!=t.seriesIndex&&this._messageCenter.dispatch(a.EVENT.DBLCLICK,e.event,t,this)}},_onmouseover:function(e){if(e.target){var t=this._eventPackage(e.target);t&&null!=t.seriesIndex&&this._messageCenter.dispatch(a.EVENT.HOVER,e.event,t,this)}},_onmouseout:function(e){if(e.target){var t=this._eventPackage(e.target);t&&null!=t.seriesIndex&&this._messageCenter.dispatch(a.EVENT.MOUSEOUT,e.event,t,this)}},_ondragstart:function(e){this._status={dragIn:!1,dragOut:!1,needRefresh:!1},n(this,\"ondragstart\",e)},_ondragenter:function(e){n(this,\"ondragenter\",e)},_ondragover:function(e){n(this,\"ondragover\",e)},_ondragleave:function(e){n(this,\"ondragleave\",e)},_ondrop:function(e){n(this,\"ondrop\",e,this._status),this._island.ondrop(e,this._status)},_ondragend:function(e){if(n(this,\"ondragend\",e,this._status),this._timeline&&this._timeline.ondragend(e,this._status),this._island.ondragend(e,this._status),this._status.needRefresh){this._syncBackupData(this._option);var t=this._messageCenter;t.dispatch(a.EVENT.DATA_CHANGED,e.event,this._eventPackage(e.target),this),t.dispatch(a.EVENT.REFRESH,null,null,this)}},_onlegendSelected:function(e){this._status.needRefresh=!1,n(this,\"onlegendSelected\",e,this._status),this._status.needRefresh&&this._messageCenter.dispatch(a.EVENT.REFRESH,null,null,this)},_ondataZoom:function(e){this._status.needRefresh=!1,n(this,\"ondataZoom\",e,this._status),this._status.needRefresh&&this._messageCenter.dispatch(a.EVENT.REFRESH,null,null,this)},_ondataRange:function(e){this._clearEffect(),this._status.needRefresh=!1,n(this,\"ondataRange\",e,this._status),this._status.needRefresh&&this._zr.refreshNextFrame()},_onmagicTypeChanged:function(){this._clearEffect(),this._render(this._toolbox.getMagicOption())},_ondataViewChanged:function(e){this._syncBackupData(e.option),this._messageCenter.dispatch(a.EVENT.DATA_CHANGED,null,e,this),this._messageCenter.dispatch(a.EVENT.REFRESH,null,null,this)},_tooltipHover:function(e){var t=[];n(this,\"ontooltipHover\",e,t)},_onrestore:function(){this.restore()},_onrefresh:function(e){this._refreshInside=!0,this.refresh(e),this._refreshInside=!1},_syncBackupData:function(e){this.component.dataZoom&&this.component.dataZoom.syncBackupData(e)},_eventPackage:function(t){if(t){var i=e(\"./util/ecData\"),n=i.get(t,\"seriesIndex\"),a=i.get(t,\"dataIndex\");return a=-1!=n&&this.component.dataZoom?this.component.dataZoom.getRealDataIndex(n,a):a,{seriesIndex:n,seriesName:(i.get(t,\"series\")||{}).name,dataIndex:a,data:i.get(t,\"data\"),name:i.get(t,\"name\"),value:i.get(t,\"value\"),special:i.get(t,\"special\")}}},_noDataCheck:function(e){for(var t=e.series,i=0,n=t.length;n>i;i++)if(t[i].type==a.CHART_TYPE_MAP||t[i].data&&t[i].data.length>0||t[i].markPoint&&t[i].markPoint.data&&t[i].markPoint.data.length>0||t[i].markLine&&t[i].markLine.data&&t[i].markLine.data.length>0||t[i].nodes&&t[i].nodes.length>0||t[i].links&&t[i].links.length>0||t[i].matrix&&t[i].matrix.length>0||t[i].eventList&&t[i].eventList.length>0)return!1;var o=this._option&&this._option.noDataLoadingOption||this._themeConfig.noDataLoadingOption||a.noDataLoadingOption||{text:this._option&&this._option.noDataText||this._themeConfig.noDataText||a.noDataText,effect:this._option&&this._option.noDataEffect||this._themeConfig.noDataEffect||a.noDataEffect};return this.clear(),this.showLoading(o),!0},_render:function(t){if(this._mergeGlobalConifg(t),!this._noDataCheck(t)){var i=t.backgroundColor;if(i)if(l||-1==i.indexOf(\"rgba\"))this.dom.style.backgroundColor=i;else{var n=i.split(\",\");this.dom.style.filter=\"alpha(opacity=\"+100*n[3].substring(0,n[3].lastIndexOf(\")\"))+\")\",n.length=3,n[0]=n[0].replace(\"a\",\"\"),this.dom.style.backgroundColor=n.join(\",\")+\")\"}this._zr.clearAnimation(),this._chartList=[];var o=e(\"./chart\"),r=e(\"./component\");(t.xAxis||t.yAxis)&&(t.grid=t.grid||{},t.dataZoom=t.dataZoom||{});for(var s,h,m,V=[\"title\",\"legend\",\"tooltip\",\"dataRange\",\"roamController\",\"grid\",\"dataZoom\",\"xAxis\",\"yAxis\",\"polar\"],U=0,d=V.length;d>U;U++)h=V[U],m=this.component[h],t[h]?(m?m.refresh&&m.refresh(t):(s=r.get(/^[xy]Axis$/.test(h)?\"axis\":h),m=new s(this._themeConfig,this._messageCenter,this._zr,t,this,h),this.component[h]=m),this._chartList.push(m)):m&&(m.dispose(),this.component[h]=null,delete this.component[h]);for(var p,c,u,y={},U=0,d=t.series.length;d>U;U++)c=t.series[U].type,c?y[c]||(y[c]=!0,p=o.get(c),p?(this.chart[c]?(u=this.chart[c],u.refresh(t)):u=new p(this._themeConfig,this._messageCenter,this._zr,t,this),this._chartList.push(u),this.chart[c]=u):console.error(c+\" has not been required.\")):console.error(\"series[\"+U+\"] chart type has not been defined.\");for(c in this.chart)c==a.CHART_TYPE_ISLAND||y[c]||(this.chart[c].dispose(),this.chart[c]=null,delete this.chart[c]);this.component.grid&&this.component.grid.refixAxisShape(this.component),this._island.refresh(t),this._toolbox.refresh(t),t.animation&&!t.renderAsImage?this._zr.refresh():this._zr.render();var g=\"IMG\"+this.id,b=document.getElementById(g);t.renderAsImage&&l?(b?b.src=this.getDataURL(t.renderAsImage):(b=this.getImage(t.renderAsImage),b.id=g,b.style.position=\"absolute\",b.style.left=0,b.style.top=0,this.dom.firstChild.appendChild(b)),this.un(),this._zr.un(),this._disposeChartList(),this._zr.clear()):b&&b.parentNode.removeChild(b),b=null,this._option=t}},restore:function(){this._clearEffect(),this._option=o.clone(this._optionRestore),this._disposeChartList(),this._island.clear(),this._toolbox.reset(this._option,!0),this._render(this._option)},refresh:function(e){this._clearEffect(),e=e||{};var t=e.option;!this._refreshInside&&t&&(t=this.getOption(),o.merge(t,e.option,!0),o.merge(this._optionRestore,e.option,!0),this._toolbox.reset(t)),this._island.refresh(t),this._toolbox.refresh(t),this._zr.clearAnimation();for(var i=0,n=this._chartList.length;n>i;i++)this._chartList[i].refresh&&this._chartList[i].refresh(t);this.component.grid&&this.component.grid.refixAxisShape(this.component),this._zr.refresh()},_disposeChartList:function(){this._clearEffect(),this._zr.clearAnimation();for(var e=this._chartList.length;e--;){var t=this._chartList[e];if(t){var i=t.type;this.chart[i]&&delete this.chart[i],this.component[i]&&delete this.component[i],t.dispose&&t.dispose()}}this._chartList=[]},_mergeGlobalConifg:function(t){for(var i=[\"backgroundColor\",\"calculable\",\"calculableColor\",\"calculableHolderColor\",\"nameConnector\",\"valueConnector\",\"animation\",\"animationThreshold\",\"animationDuration\",\"animationDurationUpdate\",\"animationEasing\",\"addDataAnimation\",\"symbolList\",\"DRAG_ENABLE_TIME\"],n=i.length;n--;){var o=i[n];null==t[o]&&(t[o]=null!=this._themeConfig[o]?this._themeConfig[o]:a[o])}var r=t.color;r&&r.length||(r=this._themeConfig.color||a.color),this._zr.getColor=function(t){var i=e(\"zrender/tool/color\");return i.getColor(t,r)},l||(t.animation=!1,t.addDataAnimation=!1)},setOption:function(e,t){return e.timeline?this._setTimelineOption(e):this._setOption(e,t)},_setOption:function(e,t,i){return!t&&this._option?this._option=o.merge(this.getOption(),o.clone(e),!0):(this._option=o.clone(e),!i&&this._timeline&&this._timeline.dispose()),this._optionRestore=o.clone(this._option),this._option.series&&0!==this._option.series.length?(this.component.dataZoom&&(this._option.dataZoom||this._option.toolbox&&this._option.toolbox.feature&&this._option.toolbox.feature.dataZoom&&this._option.toolbox.feature.dataZoom.show)&&this.component.dataZoom.syncOption(this._option),this._toolbox.reset(this._option),this._render(this._option),this):void this._zr.clear()},getOption:function(){function e(e){var n=i._optionRestore[e];if(n)if(n instanceof Array)for(var a=n.length;a--;)t[e][a].data=o.clone(n[a].data);else t[e].data=o.clone(n.data)}var t=o.clone(this._option),i=this;return e(\"xAxis\"),e(\"yAxis\"),e(\"series\"),t},setSeries:function(e,t){return t?(this._option.series=e,this.setOption(this._option,t)):this.setOption({series:e}),this},getSeries:function(){return this.getOption().series},_setTimelineOption:function(t){this._timeline&&this._timeline.dispose();var i=e(\"./component/timeline\"),n=new i(this._themeConfig,this._messageCenter,this._zr,t,this);return this._timeline=n,this.component.timeline=this._timeline,this},addData:function(e,t,i,n,r){function s(){if(V._zr){V._zr.clearAnimation();for(var e=0,t=X.length;t>e;e++)X[e].motionlessOnce=h.addDataAnimation&&X[e].addDataAnimation;V._messageCenter.dispatch(a.EVENT.REFRESH,null,{option:h},V)}}for(var l=e instanceof Array?e:[[e,t,i,n,r]],h=this.getOption(),m=this._optionRestore,V=this,U=0,d=l.length;d>U;U++){e=l[U][0],t=l[U][1],i=l[U][2],n=l[U][3],r=l[U][4];var p=m.series[e],c=i?\"unshift\":\"push\",u=i?\"pop\":\"shift\";if(p){var y=p.data,g=h.series[e].data;if(y[c](t),g[c](t),n||(y[u](),t=g[u]()),null!=r){var b,f;if(p.type===a.CHART_TYPE_PIE&&(b=m.legend)&&(f=b.data)){var k=h.legend.data;if(f[c](r),k[c](r),!n){var x=o.indexOf(f,t.name);-1!=x&&f.splice(x,1),x=o.indexOf(k,t.name),-1!=x&&k.splice(x,1)}}else if(null!=m.xAxis&&null!=m.yAxis){var _,L,W=p.xAxisIndex||0;(null==m.xAxis[W].type||\"category\"===m.xAxis[W].type)&&(_=m.xAxis[W].data,L=h.xAxis[W].data,_[c](r),L[c](r),n||(_[u](),L[u]())),W=p.yAxisIndex||0,\"category\"===m.yAxis[W].type&&(_=m.yAxis[W].data,L=h.yAxis[W].data,_[c](r),L[c](r),n||(_[u](),L[u]()))}}this._option.series[e].data=h.series[e].data}}this._zr.clearAnimation();for(var X=this._chartList,v=0,w=function(){v--,0===v&&s()},U=0,d=X.length;d>U;U++)h.addDataAnimation&&X[U].addDataAnimation&&(v++,X[U].addDataAnimation(l,w));return this.component.dataZoom&&this.component.dataZoom.syncOption(h),this._option=h,h.addDataAnimation||setTimeout(s,0),this},addMarkPoint:function(e,t){return this._addMark(e,t,\"markPoint\")},addMarkLine:function(e,t){return this._addMark(e,t,\"markLine\")},_addMark:function(e,t,i){var n,a=this._option.series;if(a&&(n=a[e])){var r=this._optionRestore.series,s=r[e],l=n[i],h=s[i];l=n[i]=l||{data:[]},h=s[i]=h||{data:[]};for(var m in t)\"data\"===m?(l.data=l.data.concat(t.data),h.data=h.data.concat(t.data)):\"object\"!=typeof t[m]||null==l[m]?l[m]=h[m]=t[m]:(o.merge(l[m],t[m],!0),o.merge(h[m],t[m],!0));var V=this.chart[n.type];V&&V.addMark(e,t,i)}return this},delMarkPoint:function(e,t){return this._delMark(e,t,\"markPoint\")},delMarkLine:function(e,t){return this._delMark(e,t,\"markLine\")},_delMark:function(e,t,i){var n,a,o,r=this._option.series;if(!(r&&(n=r[e])&&(a=n[i])&&(o=a.data)))return this;t=t.split(\" > \");for(var s=-1,l=0,h=o.length;h>l;l++){var m=o[l];if(m instanceof Array){if(m[0].name===t[0]&&m[1].name===t[1]){s=l;break}}else if(m.name===t[0]){s=l;break}}if(s>-1){o.splice(s,1),this._optionRestore.series[e][i].data.splice(s,1);var V=this.chart[n.type];V&&V.delMark(e,t.join(\" > \"),i)}return this},getDom:function(){return this.dom},getZrender:function(){return this._zr},getDataURL:function(e){if(!l)return\"\";if(0===this._chartList.length){var t=\"IMG\"+this.id,i=document.getElementById(t);if(i)return i.src}var n=this.component.tooltip;switch(n&&n.hideTip(),e){case\"jpeg\":break;default:e=\"png\"}var a=this._option.backgroundColor;return a&&\"rgba(0,0,0,0)\"===a.replace(\" \",\"\")&&(a=\"#fff\"),this._zr.toDataURL(\"image/\"+e,a)},getImage:function(e){var t=this._optionRestore.title,i=document.createElement(\"img\");return i.src=this.getDataURL(e),i.title=t&&t.text||\"ECharts\",i},getConnectedDataURL:function(t){if(!this.isConnected())return this.getDataURL(t);var i=this.dom,n={self:{img:this.getDataURL(t),left:i.offsetLeft,top:i.offsetTop,right:i.offsetLeft+i.offsetWidth,bottom:i.offsetTop+i.offsetHeight}},a=n.self.left,o=n.self.top,r=n.self.right,s=n.self.bottom;for(var l in this._connected)i=this._connected[l].getDom(),n[l]={img:this._connected[l].getDataURL(t),left:i.offsetLeft,top:i.offsetTop,right:i.offsetLeft+i.offsetWidth,bottom:i.offsetTop+i.offsetHeight},a=Math.min(a,n[l].left),o=Math.min(o,n[l].top),r=Math.max(r,n[l].right),s=Math.max(s,n[l].bottom);var h=document.createElement(\"div\");h.style.position=\"absolute\",h.style.left=\"-4000px\",h.style.width=r-a+\"px\",h.style.height=s-o+\"px\",document.body.appendChild(h);var m=e(\"zrender\").init(h),V=e(\"zrender/shape/Image\");for(var l in n)m.addShape(new V({style:{x:n[l].left-a,y:n[l].top-o,image:n[l].img}}));m.render();var U=this._option.backgroundColor;U&&\"rgba(0,0,0,0)\"===U.replace(/ /g,\"\")&&(U=\"#fff\");var d=m.toDataURL(\"image/png\",U);return setTimeout(function(){m.dispose(),h.parentNode.removeChild(h),h=null},100),d},getConnectedImage:function(e){var t=this._optionRestore.title,i=document.createElement(\"img\");return i.src=this.getConnectedDataURL(e),i.title=t&&t.text||\"ECharts\",i},on:function(e,t){return this._messageCenterOutSide.bind(e,t,this),this},un:function(e,t){return this._messageCenterOutSide.unbind(e,t),this},connect:function(e){if(!e)return this;if(this._connected||(this._connected={}),e instanceof Array)for(var t=0,i=e.length;i>t;t++)this._connected[e[t].id]=e[t];else this._connected[e.id]=e;return this},disConnect:function(e){if(!e||!this._connected)return this;if(e instanceof Array)for(var t=0,i=e.length;i>t;t++)delete this._connected[e[t].id];else delete this._connected[e.id];for(var n in this._connected)return this;return this._connected=!1,this},connectedEventHandler:function(e){e.__echartsId!=this.id&&this._onevent(e)},isConnected:function(){return!!this._connected},showLoading:function(t){var i={bar:e(\"zrender/loadingEffect/Bar\"),bubble:e(\"zrender/loadingEffect/Bubble\"),dynamicLine:e(\"zrender/loadingEffect/DynamicLine\"),ring:e(\"zrender/loadingEffect/Ring\"),spin:e(\"zrender/loadingEffect/Spin\"),whirling:e(\"zrender/loadingEffect/Whirling\")};this._toolbox.hideDataView(),t=t||{};var n=t.textStyle||{};t.textStyle=n;var r=o.merge(o.merge(o.clone(n),this._themeConfig.textStyle),a.textStyle);n.textFont=r.fontStyle+\" \"+r.fontWeight+\" \"+r.fontSize+\"px \"+r.fontFamily,n.text=t.text||this._option&&this._option.loadingText||this._themeConfig.loadingText||a.loadingText,null!=t.x&&(n.x=t.x),null!=t.y&&(n.y=t.y),t.effectOption=t.effectOption||{},t.effectOption.textStyle=n;var s=t.effect;return(\"string\"==typeof s||null==s)&&(s=i[t.effect||this._option&&this._option.loadingEffect||this._themeConfig.loadingEffect||a.loadingEffect]||i.spin),this._zr.showLoading(new s(t.effectOption)),this},hideLoading:function(){return this._zr.hideLoading(),this},setTheme:function(t){if(t){if(\"string\"==typeof t)switch(t){case\"macarons\":t=e(\"./theme/macarons\");break;case\"infographic\":t=e(\"./theme/infographic\");break;default:t={}}else t=t||{};this._themeConfig=t}if(!l){var i=this._themeConfig.textStyle;i&&i.fontFamily&&i.fontFamily2&&(i.fontFamily=i.fontFamily2),i=a.textStyle,i.fontFamily=i.fontFamily2}this._timeline&&this._timeline.setTheme(!0),this._optionRestore&&this.restore()},resize:function(){var e=this;return function(){if(e._clearEffect(),e._zr.resize(),e._option&&e._option.renderAsImage&&l)return e._render(e._option),e;e._zr.clearAnimation(),e._island.resize(),e._toolbox.resize(),e._timeline&&e._timeline.resize();for(var t=0,i=e._chartList.length;i>t;t++)e._chartList[t].resize&&e._chartList[t].resize();return e.component.grid&&e.component.grid.refixAxisShape(e.component),e._zr.refresh(),e._messageCenter.dispatch(a.EVENT.RESIZE,null,null,e),e}},_clearEffect:function(){this._zr.modLayer(a.EFFECT_ZLEVEL,{motionBlur:!1}),this._zr.painter.clearLayer(a.EFFECT_ZLEVEL)},clear:function(){return this._disposeChartList(),this._zr.clear(),this._option={},this._optionRestore={},this.dom.style.backgroundColor=null,this},dispose:function(){var e=this.dom.getAttribute(V);e&&delete m[e],this._island.dispose(),this._toolbox.dispose(),this._timeline&&this._timeline.dispose(),this._messageCenter.unbind(),this.clear(),this._zr.dispose(),this._zr=null}},s}),i(\"echarts/config\",[],function(){var e={CHART_TYPE_LINE:\"line\",CHART_TYPE_BAR:\"bar\",CHART_TYPE_SCATTER:\"scatter\",CHART_TYPE_PIE:\"pie\",CHART_TYPE_RADAR:\"radar\",CHART_TYPE_VENN:\"venn\",CHART_TYPE_TREEMAP:\"treemap\",CHART_TYPE_TREE:\"tree\",CHART_TYPE_MAP:\"map\",CHART_TYPE_K:\"k\",CHART_TYPE_ISLAND:\"island\",CHART_TYPE_FORCE:\"force\",CHART_TYPE_CHORD:\"chord\",CHART_TYPE_GAUGE:\"gauge\",CHART_TYPE_FUNNEL:\"funnel\",CHART_TYPE_EVENTRIVER:\"eventRiver\",CHART_TYPE_WORDCLOUD:\"wordCloud\",CHART_TYPE_HEATMAP:\"heatmap\",COMPONENT_TYPE_TITLE:\"title\",COMPONENT_TYPE_LEGEND:\"legend\",COMPONENT_TYPE_DATARANGE:\"dataRange\",COMPONENT_TYPE_DATAVIEW:\"dataView\",COMPONENT_TYPE_DATAZOOM:\"dataZoom\",COMPONENT_TYPE_TOOLBOX:\"toolbox\",COMPONENT_TYPE_TOOLTIP:\"tooltip\",COMPONENT_TYPE_GRID:\"grid\",COMPONENT_TYPE_AXIS:\"axis\",COMPONENT_TYPE_POLAR:\"polar\",COMPONENT_TYPE_X_AXIS:\"xAxis\",COMPONENT_TYPE_Y_AXIS:\"yAxis\",COMPONENT_TYPE_AXIS_CATEGORY:\"categoryAxis\",COMPONENT_TYPE_AXIS_VALUE:\"valueAxis\",COMPONENT_TYPE_TIMELINE:\"timeline\",COMPONENT_TYPE_ROAMCONTROLLER:\"roamController\",backgroundColor:\"rgba(0,0,0,0)\",color:[\"#ff7f50\",\"#87cefa\",\"#da70d6\",\"#32cd32\",\"#6495ed\",\"#ff69b4\",\"#ba55d3\",\"#cd5c5c\",\"#ffa500\",\"#40e0d0\",\"#1e90ff\",\"#ff6347\",\"#7b68ee\",\"#00fa9a\",\"#ffd700\",\"#6699FF\",\"#ff6666\",\"#3cb371\",\"#b8860b\",\"#30e0e0\"],markPoint:{clickable:!0,symbol:\"pin\",symbolSize:10,large:!1,effect:{show:!1,loop:!0,period:15,type:\"scale\",scaleSize:2,bounceDistance:10},itemStyle:{normal:{borderWidth:2,label:{show:!0,position:\"inside\"}},emphasis:{label:{show:!0}}}},markLine:{clickable:!0,symbol:[\"circle\",\"arrow\"],symbolSize:[2,4],smoothness:.2,precision:2,effect:{show:!1,loop:!0,period:15,scaleSize:2},bundling:{enable:!1,maxTurningAngle:45},itemStyle:{normal:{borderWidth:1.5,label:{show:!0,position:\"end\"},lineStyle:{type:\"dashed\"}},emphasis:{label:{show:!1},lineStyle:{}}}},textStyle:{decoration:\"none\",fontFamily:\"Arial, Verdana, sans-serif\",fontFamily2:\"微软雅黑\",fontSize:12,fontStyle:\"normal\",fontWeight:\"normal\"},EVENT:{REFRESH:\"refresh\",RESTORE:\"restore\",RESIZE:\"resize\",CLICK:\"click\",DBLCLICK:\"dblclick\",HOVER:\"hover\",MOUSEOUT:\"mouseout\",DATA_CHANGED:\"dataChanged\",DATA_ZOOM:\"dataZoom\",DATA_RANGE:\"dataRange\",DATA_RANGE_SELECTED:\"dataRangeSelected\",DATA_RANGE_HOVERLINK:\"dataRangeHoverLink\",LEGEND_SELECTED:\"legendSelected\",LEGEND_HOVERLINK:\"legendHoverLink\",MAP_SELECTED:\"mapSelected\",PIE_SELECTED:\"pieSelected\",MAGIC_TYPE_CHANGED:\"magicTypeChanged\",DATA_VIEW_CHANGED:\"dataViewChanged\",TIMELINE_CHANGED:\"timelineChanged\",MAP_ROAM:\"mapRoam\",FORCE_LAYOUT_END:\"forceLayoutEnd\",TOOLTIP_HOVER:\"tooltipHover\",TOOLTIP_IN_GRID:\"tooltipInGrid\",TOOLTIP_OUT_GRID:\"tooltipOutGrid\",ROAMCONTROLLER:\"roamController\"},DRAG_ENABLE_TIME:120,EFFECT_ZLEVEL:10,effectBlendAlpha:.95,symbolList:[\"circle\",\"rectangle\",\"triangle\",\"diamond\",\"emptyCircle\",\"emptyRectangle\",\"emptyTriangle\",\"emptyDiamond\"],loadingEffect:\"spin\",loadingText:\"数据读取中...\",noDataEffect:\"bubble\",noDataText:\"暂无数据\",calculable:!1,calculableColor:\"rgba(255,165,0,0.6)\",calculableHolderColor:\"#ccc\",nameConnector:\" & \",valueConnector:\": \",animation:!0,addDataAnimation:!0,animationThreshold:2e3,animationDuration:2e3,animationDurationUpdate:500,animationEasing:\"ExponentialOut\"};return e}),i(\"zrender/tool/util\",[\"require\",\"../dep/excanvas\"],function(e){function t(e){return e&&1===e.nodeType&&\"string\"==typeof e.nodeName}function i(e){if(\"object\"==typeof e&&null!==e){var n=e;if(e instanceof Array){n=[];for(var a=0,o=e.length;o>a;a++)n[a]=i(e[a])}else if(!y[g.call(e)]&&!t(e)){n={};for(var r in e)e.hasOwnProperty(r)&&(n[r]=i(e[r]))}return n}return e}function n(e,i,n,o){if(i.hasOwnProperty(n)){var r=e[n];\"object\"!=typeof r||y[g.call(r)]||t(r)?!o&&n in e||(e[n]=i[n]):a(e[n],i[n],o)}}function a(e,t,i){for(var a in t)n(e,t,a,i);return e}function o(){if(!U)if(e(\"../dep/excanvas\"),window.G_vmlCanvasManager){var t=document.createElement(\"div\");t.style.position=\"absolute\",t.style.top=\"-1000px\",document.body.appendChild(t),U=G_vmlCanvasManager.initElement(t).getContext(\"2d\")}else U=document.createElement(\"canvas\").getContext(\"2d\");return U}function r(e,t){if(e.indexOf)return e.indexOf(t);for(var i=0,n=e.length;n>i;i++)if(e[i]===t)return i;return-1}function s(e,t){function i(){}var n=e.prototype;i.prototype=t.prototype,e.prototype=new i;for(var a in n)e.prototype[a]=n[a];e.constructor=e}function l(e,t,i){if(e&&t)if(e.forEach&&e.forEach===p)e.forEach(t,i);else if(e.length===+e.length)for(var n=0,a=e.length;a>n;n++)t.call(i,e[n],n,e);else for(var o in e)e.hasOwnProperty(o)&&t.call(i,e[o],o,e)}function h(e,t,i){if(e&&t){if(e.map&&e.map===c)return e.map(t,i);for(var n=[],a=0,o=e.length;o>a;a++)n.push(t.call(i,e[a],a,e));return n}}function m(e,t,i){if(e&&t){if(e.filter&&e.filter===u)return e.filter(t,i);for(var n=[],a=0,o=e.length;o>a;a++)t.call(i,e[a],a,e)&&n.push(e[a]);return n}}function V(e,t){return function(){e.apply(t,arguments)}}var U,d=Array.prototype,p=d.forEach,c=d.map,u=d.filter,y={\"[object Function]\":1,\"[object RegExp]\":1,\"[object Date]\":1,\"[object Error]\":1,\"[object CanvasGradient]\":1},g=Object.prototype.toString;return{inherits:s,clone:i,merge:a,getContext:o,indexOf:r,each:l,map:h,filter:m,bind:V}}),i(\"zrender/tool/event\",[\"require\",\"../mixin/Eventful\"],function(e){\"use strict\";function t(e){return\"undefined\"!=typeof e.zrenderX&&e.zrenderX||\"undefined\"!=typeof e.offsetX&&e.offsetX||\"undefined\"!=typeof e.layerX&&e.layerX||\"undefined\"!=typeof e.clientX&&e.clientX}function i(e){return\"undefined\"!=typeof e.zrenderY&&e.zrenderY||\"undefined\"!=typeof e.offsetY&&e.offsetY||\"undefined\"!=typeof e.layerY&&e.layerY||\"undefined\"!=typeof e.clientY&&e.clientY}function n(e){return\"undefined\"!=typeof e.zrenderDelta&&e.zrenderDelta||\"undefined\"!=typeof e.wheelDelta&&e.wheelDelta||\"undefined\"!=typeof e.detail&&-e.detail}var a=e(\"../mixin/Eventful\"),o=\"function\"==typeof window.addEventListener?function(e){e.preventDefault(),e.stopPropagation(),e.cancelBubble=!0}:function(e){e.returnValue=!1,e.cancelBubble=!0};return{getX:t,getY:i,getDelta:n,stop:o,Dispatcher:a}}),i(\"zrender/tool/env\",[],function(){function e(e){var t=this.os={},i=this.browser={},n=e.match(/Web[kK]it[\\/]{0,1}([\\d.]+)/),a=e.match(/(Android);?[\\s\\/]+([\\d.]+)?/),o=e.match(/(iPad).*OS\\s([\\d_]+)/),r=e.match(/(iPod)(.*OS\\s([\\d_]+))?/),s=!o&&e.match(/(iPhone\\sOS)\\s([\\d_]+)/),l=e.match(/(webOS|hpwOS)[\\s\\/]([\\d.]+)/),h=l&&e.match(/TouchPad/),m=e.match(/Kindle\\/([\\d.]+)/),V=e.match(/Silk\\/([\\d._]+)/),U=e.match(/(BlackBerry).*Version\\/([\\d.]+)/),d=e.match(/(BB10).*Version\\/([\\d.]+)/),p=e.match(/(RIM\\sTablet\\sOS)\\s([\\d.]+)/),c=e.match(/PlayBook/),u=e.match(/Chrome\\/([\\d.]+)/)||e.match(/CriOS\\/([\\d.]+)/),y=e.match(/Firefox\\/([\\d.]+)/),g=e.match(/MSIE ([\\d.]+)/),b=n&&e.match(/Mobile\\//)&&!u,f=e.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/)&&!u,g=e.match(/MSIE\\s([\\d.]+)/);return(i.webkit=!!n)&&(i.version=n[1]),a&&(t.android=!0,t.version=a[2]),s&&!r&&(t.ios=t.iphone=!0,t.version=s[2].replace(/_/g,\".\")),o&&(t.ios=t.ipad=!0,t.version=o[2].replace(/_/g,\".\")),r&&(t.ios=t.ipod=!0,t.version=r[3]?r[3].replace(/_/g,\".\"):null),l&&(t.webos=!0,t.version=l[2]),h&&(t.touchpad=!0),U&&(t.blackberry=!0,t.version=U[2]),d&&(t.bb10=!0,t.version=d[2]),p&&(t.rimtabletos=!0,t.version=p[2]),c&&(i.playbook=!0),m&&(t.kindle=!0,t.version=m[1]),V&&(i.silk=!0,i.version=V[1]),!V&&t.android&&e.match(/Kindle Fire/)&&(i.silk=!0),u&&(i.chrome=!0,i.version=u[1]),y&&(i.firefox=!0,i.version=y[1]),g&&(i.ie=!0,i.version=g[1]),b&&(e.match(/Safari/)||t.ios)&&(i.safari=!0),f&&(i.webview=!0),g&&(i.ie=!0,i.version=g[1]),t.tablet=!!(o||c||a&&!e.match(/Mobile/)||y&&e.match(/Tablet/)||g&&!e.match(/Phone/)&&e.match(/Touch/)),t.phone=!(t.tablet||t.ipod||!(a||s||l||U||d||u&&e.match(/Android/)||u&&e.match(/CriOS\\/([\\d.]+)/)||y&&e.match(/Mobile/)||g&&e.match(/Touch/))),{browser:i,os:t,canvasSupported:document.createElement(\"canvas\").getContext?!0:!1}}return e(navigator.userAgent)}),i(\"zrender\",[\"zrender/zrender\"],function(e){return e}),i(\"zrender/zrender\",[\"require\",\"./dep/excanvas\",\"./tool/util\",\"./tool/log\",\"./tool/guid\",\"./Handler\",\"./Painter\",\"./Storage\",\"./animation/Animation\",\"./tool/env\"],function(e){function t(e){return function(){e._needsRefreshNextFrame&&e.refresh()}}e(\"./dep/excanvas\");var i=e(\"./tool/util\"),n=e(\"./tool/log\"),a=e(\"./tool/guid\"),o=e(\"./Handler\"),r=e(\"./Painter\"),s=e(\"./Storage\"),l=e(\"./animation/Animation\"),h={},m={};m.version=\"2.1.1\",m.init=function(e){var t=new V(a(),e);return h[t.id]=t,t},m.dispose=function(e){if(e)e.dispose();else{for(var t in h)h[t].dispose();h={}}return m},m.getInstance=function(e){return h[e]},m.delInstance=function(e){return delete h[e],m};var V=function(i,n){this.id=i,this.env=e(\"./tool/env\"),this.storage=new s,this.painter=new r(n,this.storage),this.handler=new o(n,this.storage,this.painter),this.animation=new l({stage:{update:t(this)}}),this.animation.start();var a=this;this.painter.refreshNextFrame=function(){a.refreshNextFrame()},this._needsRefreshNextFrame=!1;var a=this,h=this.storage,m=h.delFromMap;h.delFromMap=function(e){var t=h.get(e);a.stopAnimation(t),m.call(h,e)}};return V.prototype.getId=function(){return this.id},V.prototype.addShape=function(e){return this.addElement(e),this},V.prototype.addGroup=function(e){return this.addElement(e),this},V.prototype.delShape=function(e){return this.delElement(e),this},V.prototype.delGroup=function(e){return this.delElement(e),this},V.prototype.modShape=function(e,t){return this.modElement(e,t),this},V.prototype.modGroup=function(e,t){return this.modElement(e,t),this},V.prototype.addElement=function(e){return this.storage.addRoot(e),this._needsRefreshNextFrame=!0,this},V.prototype.delElement=function(e){return this.storage.delRoot(e),this._needsRefreshNextFrame=!0,this},V.prototype.modElement=function(e,t){return this.storage.mod(e,t),this._needsRefreshNextFrame=!0,this},V.prototype.modLayer=function(e,t){return this.painter.modLayer(e,t),this._needsRefreshNextFrame=!0,this},V.prototype.addHoverShape=function(e){return this.storage.addHover(e),this},V.prototype.render=function(e){return this.painter.render(e),this._needsRefreshNextFrame=!1,this},V.prototype.refresh=function(e){return this.painter.refresh(e),this._needsRefreshNextFrame=!1,this},V.prototype.refreshNextFrame=function(){return this._needsRefreshNextFrame=!0,this},V.prototype.refreshHover=function(e){return this.painter.refreshHover(e),this},V.prototype.refreshShapes=function(e,t){return this.painter.refreshShapes(e,t),this},V.prototype.resize=function(){return this.painter.resize(),this},V.prototype.animate=function(e,t,a){var o=this;if(\"string\"==typeof e&&(e=this.storage.get(e)),e){var r;if(t){for(var s=t.split(\".\"),l=e,h=0,m=s.length;m>h;h++)l&&(l=l[s[h]]);l&&(r=l)}else r=e;if(!r)return void n('Property \"'+t+'\" is not existed in element '+e.id);\n\nnull==e.__animators&&(e.__animators=[]);var V=e.__animators,U=this.animation.animate(r,{loop:a}).during(function(){o.modShape(e)}).done(function(){var t=i.indexOf(e.__animators,U);t>=0&&V.splice(t,1)});return V.push(U),U}n(\"Element not existed\")},V.prototype.stopAnimation=function(e){if(e.__animators){for(var t=e.__animators,i=t.length,n=0;i>n;n++)t[n].stop();t.length=0}return this},V.prototype.clearAnimation=function(){return this.animation.clear(),this},V.prototype.showLoading=function(e){return this.painter.showLoading(e),this},V.prototype.hideLoading=function(){return this.painter.hideLoading(),this},V.prototype.getWidth=function(){return this.painter.getWidth()},V.prototype.getHeight=function(){return this.painter.getHeight()},V.prototype.toDataURL=function(e,t,i){return this.painter.toDataURL(e,t,i)},V.prototype.shapeToImage=function(e,t,i){var n=a();return this.painter.shapeToImage(n,e,t,i)},V.prototype.on=function(e,t,i){return this.handler.on(e,t,i),this},V.prototype.un=function(e,t){return this.handler.un(e,t),this},V.prototype.trigger=function(e,t){return this.handler.trigger(e,t),this},V.prototype.clear=function(){return this.storage.delRoot(),this.painter.clear(),this},V.prototype.dispose=function(){this.animation.stop(),this.clear(),this.storage.dispose(),this.painter.dispose(),this.handler.dispose(),this.animation=this.storage=this.painter=this.handler=null,m.delInstance(this.id)},m}),i(\"zrender/config\",[],function(){var e={EVENT:{RESIZE:\"resize\",CLICK:\"click\",DBLCLICK:\"dblclick\",MOUSEWHEEL:\"mousewheel\",MOUSEMOVE:\"mousemove\",MOUSEOVER:\"mouseover\",MOUSEOUT:\"mouseout\",MOUSEDOWN:\"mousedown\",MOUSEUP:\"mouseup\",GLOBALOUT:\"globalout\",DRAGSTART:\"dragstart\",DRAGEND:\"dragend\",DRAGENTER:\"dragenter\",DRAGOVER:\"dragover\",DRAGLEAVE:\"dragleave\",DROP:\"drop\",touchClickDelay:300},elementClassName:\"zr-element\",catchBrushException:!1,debugMode:0,devicePixelRatio:Math.max(window.devicePixelRatio||1,1)};return e}),i(\"echarts/chart/island\",[\"require\",\"./base\",\"zrender/shape/Circle\",\"../config\",\"../util/ecData\",\"zrender/tool/util\",\"zrender/tool/event\",\"zrender/tool/color\",\"../util/accMath\",\"../chart\"],function(e){function t(e,t,n,a,r){i.call(this,e,t,n,a,r),this._nameConnector,this._valueConnector,this._zrHeight=this.zr.getHeight(),this._zrWidth=this.zr.getWidth();var l=this;l.shapeHandler.onmousewheel=function(e){var t=e.target,i=e.event,n=s.getDelta(i);n=n>0?-1:1,t.style.r-=n,t.style.r=t.style.r<5?5:t.style.r;var a=o.get(t,\"value\"),r=a*l.option.island.calculateStep;a=r>1?Math.round(a-r*n):+(a-r*n).toFixed(2);var h=o.get(t,\"name\");t.style.text=h+\":\"+a,o.set(t,\"value\",a),o.set(t,\"name\",h),l.zr.modShape(t.id),l.zr.refreshNextFrame(),s.stop(i)}}var i=e(\"./base\"),n=e(\"zrender/shape/Circle\"),a=e(\"../config\");a.island={zlevel:0,z:5,r:15,calculateStep:.1};var o=e(\"../util/ecData\"),r=e(\"zrender/tool/util\"),s=e(\"zrender/tool/event\");return t.prototype={type:a.CHART_TYPE_ISLAND,_combine:function(t,i){var n=e(\"zrender/tool/color\"),a=e(\"../util/accMath\"),r=a.accAdd(o.get(t,\"value\"),o.get(i,\"value\")),s=o.get(t,\"name\")+this._nameConnector+o.get(i,\"name\");t.style.text=s+this._valueConnector+r,o.set(t,\"value\",r),o.set(t,\"name\",s),t.style.r=this.option.island.r,t.style.color=n.mix(t.style.color,i.style.color)},refresh:function(e){e&&(e.island=this.reformOption(e.island),this.option=e,this._nameConnector=this.option.nameConnector,this._valueConnector=this.option.valueConnector)},getOption:function(){return this.option},resize:function(){var e=this.zr.getWidth(),t=this.zr.getHeight(),i=e/(this._zrWidth||e),n=t/(this._zrHeight||t);if(1!==i||1!==n){this._zrWidth=e,this._zrHeight=t;for(var a=0,o=this.shapeList.length;o>a;a++)this.zr.modShape(this.shapeList[a].id,{style:{x:Math.round(this.shapeList[a].style.x*i),y:Math.round(this.shapeList[a].style.y*n)}})}},add:function(e){var t=o.get(e,\"name\"),i=o.get(e,\"value\"),a=null!=o.get(e,\"series\")?o.get(e,\"series\").name:\"\",r=this.getFont(this.option.island.textStyle),s=this.option.island,l={zlevel:s.zlevel,z:s.z,style:{x:e.style.x,y:e.style.y,r:this.option.island.r,color:e.style.color||e.style.strokeColor,text:t+this._valueConnector+i,textFont:r},draggable:!0,hoverable:!0,onmousewheel:this.shapeHandler.onmousewheel,_type:\"island\"};\"#fff\"===l.style.color&&(l.style.color=e.style.strokeColor),this.setCalculable(l),l.dragEnableTime=0,o.pack(l,{name:a},-1,i,-1,t),l=new n(l),this.shapeList.push(l),this.zr.addShape(l)},del:function(e){this.zr.delShape(e.id);for(var t=[],i=0,n=this.shapeList.length;n>i;i++)this.shapeList[i].id!=e.id&&t.push(this.shapeList[i]);this.shapeList=t},ondrop:function(e,t){if(this.isDrop&&e.target){var i=e.target,n=e.dragged;this._combine(i,n),this.zr.modShape(i.id),t.dragIn=!0,this.isDrop=!1}},ondragend:function(e,t){var i=e.target;this.isDragend?t.dragIn&&(this.del(i),t.needRefresh=!0):t.dragIn||(i.style.x=s.getX(e.event),i.style.y=s.getY(e.event),this.add(i),t.needRefresh=!0),this.isDragend=!1}},r.inherits(t,i),e(\"../chart\").define(\"island\",t),t}),i(\"echarts/component/toolbox\",[\"require\",\"./base\",\"zrender/shape/Line\",\"zrender/shape/Image\",\"zrender/shape/Rectangle\",\"../util/shape/Icon\",\"../config\",\"zrender/tool/util\",\"zrender/config\",\"zrender/tool/event\",\"./dataView\",\"../component\"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.dom=o.dom,this._magicType={},this._magicMap={},this._isSilence=!1,this._iconList,this._iconShapeMap={},this._featureTitle={},this._featureIcon={},this._featureColor={},this._featureOption={},this._enableColor=\"red\",this._disableColor=\"#ccc\",this._markShapeList=[];var r=this;r._onMark=function(e){r.__onMark(e)},r._onMarkUndo=function(e){r.__onMarkUndo(e)},r._onMarkClear=function(e){r.__onMarkClear(e)},r._onDataZoom=function(e){r.__onDataZoom(e)},r._onDataZoomReset=function(e){r.__onDataZoomReset(e)},r._onDataView=function(e){r.__onDataView(e)},r._onRestore=function(e){r.__onRestore(e)},r._onSaveAsImage=function(e){r.__onSaveAsImage(e)},r._onMagicType=function(e){r.__onMagicType(e)},r._onCustomHandler=function(e){r.__onCustomHandler(e)},r._onmousemove=function(e){return r.__onmousemove(e)},r._onmousedown=function(e){return r.__onmousedown(e)},r._onmouseup=function(e){return r.__onmouseup(e)},r._onclick=function(e){return r.__onclick(e)}}var i=e(\"./base\"),n=e(\"zrender/shape/Line\"),a=e(\"zrender/shape/Image\"),o=e(\"zrender/shape/Rectangle\"),r=e(\"../util/shape/Icon\"),s=e(\"../config\");s.toolbox={zlevel:0,z:6,show:!1,orient:\"horizontal\",x:\"right\",y:\"top\",color:[\"#1e90ff\",\"#22bb22\",\"#4b0082\",\"#d2691e\"],disableColor:\"#ddd\",effectiveColor:\"red\",backgroundColor:\"rgba(0,0,0,0)\",borderColor:\"#ccc\",borderWidth:0,padding:5,itemGap:10,itemSize:16,showTitle:!0,feature:{mark:{show:!1,title:{mark:\"辅助线开关\",markUndo:\"删除辅助线\",markClear:\"清空辅助线\"},lineStyle:{width:1,color:\"#1e90ff\",type:\"dashed\"}},dataZoom:{show:!1,title:{dataZoom:\"区域缩放\",dataZoomReset:\"区域缩放后退\"}},dataView:{show:!1,title:\"数据视图\",readOnly:!1,lang:[\"数据视图\",\"关闭\",\"刷新\"]},magicType:{show:!1,title:{line:\"折线图切换\",bar:\"柱形图切换\",stack:\"堆积\",tiled:\"平铺\",force:\"力导向布局图切换\",chord:\"和弦图切换\",pie:\"饼图切换\",funnel:\"漏斗图切换\"},type:[]},restore:{show:!1,title:\"还原\"},saveAsImage:{show:!1,title:\"保存为图片\",type:\"png\",lang:[\"点击保存\"]}}};var l=e(\"zrender/tool/util\"),h=e(\"zrender/config\"),m=e(\"zrender/tool/event\"),V=\"stack\",U=\"tiled\";return t.prototype={type:s.COMPONENT_TYPE_TOOLBOX,_buildShape:function(){this._iconList=[];var e=this.option.toolbox;this._enableColor=e.effectiveColor,this._disableColor=e.disableColor;var t=e.feature,i=[];for(var n in t)if(t[n].show)switch(n){case\"mark\":i.push({key:n,name:\"mark\"}),i.push({key:n,name:\"markUndo\"}),i.push({key:n,name:\"markClear\"});break;case\"magicType\":for(var a=0,o=t[n].type.length;o>a;a++)t[n].title[t[n].type[a]+\"Chart\"]=t[n].title[t[n].type[a]],t[n].option&&(t[n].option[t[n].type[a]+\"Chart\"]=t[n].option[t[n].type[a]]),i.push({key:n,name:t[n].type[a]+\"Chart\"});break;case\"dataZoom\":i.push({key:n,name:\"dataZoom\"}),i.push({key:n,name:\"dataZoomReset\"});break;case\"saveAsImage\":this.canvasSupported&&i.push({key:n,name:\"saveAsImage\"});break;default:i.push({key:n,name:n})}if(i.length>0){for(var r,n,a=0,o=i.length;o>a;a++)r=i[a].name,n=i[a].key,this._iconList.push(r),this._featureTitle[r]=t[n].title[r]||t[n].title,t[n].icon&&(this._featureIcon[r]=t[n].icon[r]||t[n].icon),t[n].color&&(this._featureColor[r]=t[n].color[r]||t[n].color),t[n].option&&(this._featureOption[r]=t[n].option[r]||t[n].option);this._itemGroupLocation=this._getItemGroupLocation(),this._buildBackground(),this._buildItem();for(var a=0,o=this.shapeList.length;o>a;a++)this.zr.addShape(this.shapeList[a]);this._iconShapeMap.mark&&(this._iconDisable(this._iconShapeMap.markUndo),this._iconDisable(this._iconShapeMap.markClear)),this._iconShapeMap.dataZoomReset&&0===this._zoomQueue.length&&this._iconDisable(this._iconShapeMap.dataZoomReset)}},_buildItem:function(){var t,i,n,o,s=this.option.toolbox,l=this._iconList.length,h=this._itemGroupLocation.x,m=this._itemGroupLocation.y,V=s.itemSize,U=s.itemGap,d=s.color instanceof Array?s.color:[s.color],p=this.getFont(s.textStyle);\"horizontal\"===s.orient?(i=this._itemGroupLocation.y/this.zr.getHeight()<.5?\"bottom\":\"top\",n=this._itemGroupLocation.x/this.zr.getWidth()<.5?\"left\":\"right\",o=this._itemGroupLocation.y/this.zr.getHeight()<.5?\"top\":\"bottom\"):i=this._itemGroupLocation.x/this.zr.getWidth()<.5?\"right\":\"left\",this._iconShapeMap={};for(var c=this,u=0;l>u;u++){switch(t={type:\"icon\",zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:h,y:m,width:V,height:V,iconType:this._iconList[u],lineWidth:1,strokeColor:this._featureColor[this._iconList[u]]||d[u%d.length],brushType:\"stroke\"},highlightStyle:{lineWidth:1,text:s.showTitle?this._featureTitle[this._iconList[u]]:void 0,textFont:p,textPosition:i,strokeColor:this._featureColor[this._iconList[u]]||d[u%d.length]},hoverable:!0,clickable:!0},this._featureIcon[this._iconList[u]]&&(t.style.image=this._featureIcon[this._iconList[u]].replace(new RegExp(\"^image:\\\\/\\\\/\"),\"\"),t.style.opacity=.8,t.highlightStyle.opacity=1,t.type=\"image\"),\"horizontal\"===s.orient&&(0===u&&\"left\"===n&&(t.highlightStyle.textPosition=\"specific\",t.highlightStyle.textAlign=n,t.highlightStyle.textBaseline=o,t.highlightStyle.textX=h,t.highlightStyle.textY=\"top\"===o?m+V+10:m-10),u===l-1&&\"right\"===n&&(t.highlightStyle.textPosition=\"specific\",t.highlightStyle.textAlign=n,t.highlightStyle.textBaseline=o,t.highlightStyle.textX=h+V,t.highlightStyle.textY=\"top\"===o?m+V+10:m-10)),this._iconList[u]){case\"mark\":t.onclick=c._onMark;break;case\"markUndo\":t.onclick=c._onMarkUndo;break;case\"markClear\":t.onclick=c._onMarkClear;break;case\"dataZoom\":t.onclick=c._onDataZoom;break;case\"dataZoomReset\":t.onclick=c._onDataZoomReset;break;case\"dataView\":if(!this._dataView){var y=e(\"./dataView\");this._dataView=new y(this.ecTheme,this.messageCenter,this.zr,this.option,this.myChart)}t.onclick=c._onDataView;break;case\"restore\":t.onclick=c._onRestore;break;case\"saveAsImage\":t.onclick=c._onSaveAsImage;break;default:this._iconList[u].match(\"Chart\")?(t._name=this._iconList[u].replace(\"Chart\",\"\"),t.onclick=c._onMagicType):t.onclick=c._onCustomHandler}\"icon\"===t.type?t=new r(t):\"image\"===t.type&&(t=new a(t)),this.shapeList.push(t),this._iconShapeMap[this._iconList[u]]=t,\"horizontal\"===s.orient?h+=V+U:m+=V+U}},_buildBackground:function(){var e=this.option.toolbox,t=this.reformCssArray(this.option.toolbox.padding);this.shapeList.push(new o({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._itemGroupLocation.x-t[3],y:this._itemGroupLocation.y-t[0],width:this._itemGroupLocation.width+t[3]+t[1],height:this._itemGroupLocation.height+t[0]+t[2],brushType:0===e.borderWidth?\"fill\":\"both\",color:e.backgroundColor,strokeColor:e.borderColor,lineWidth:e.borderWidth}}))},_getItemGroupLocation:function(){var e=this.option.toolbox,t=this.reformCssArray(this.option.toolbox.padding),i=this._iconList.length,n=e.itemGap,a=e.itemSize,o=0,r=0;\"horizontal\"===e.orient?(o=(a+n)*i-n,r=a):(r=(a+n)*i-n,o=a);var s,l=this.zr.getWidth();switch(e.x){case\"center\":s=Math.floor((l-o)/2);break;case\"left\":s=t[3]+e.borderWidth;break;case\"right\":s=l-o-t[1]-e.borderWidth;break;default:s=e.x-0,s=isNaN(s)?0:s}var h,m=this.zr.getHeight();switch(e.y){case\"top\":h=t[0]+e.borderWidth;break;case\"bottom\":h=m-r-t[2]-e.borderWidth;break;case\"center\":h=Math.floor((m-r)/2);break;default:h=e.y-0,h=isNaN(h)?0:h}return{x:s,y:h,width:o,height:r}},__onmousemove:function(e){this._marking&&(this._markShape.style.xEnd=m.getX(e.event),this._markShape.style.yEnd=m.getY(e.event),this.zr.addHoverShape(this._markShape)),this._zooming&&(this._zoomShape.style.width=m.getX(e.event)-this._zoomShape.style.x,this._zoomShape.style.height=m.getY(e.event)-this._zoomShape.style.y,this.zr.addHoverShape(this._zoomShape),this.dom.style.cursor=\"crosshair\",m.stop(e.event)),this._zoomStart&&\"pointer\"!=this.dom.style.cursor&&\"move\"!=this.dom.style.cursor&&(this.dom.style.cursor=\"crosshair\")},__onmousedown:function(e){if(!e.target){this._zooming=!0;var t=m.getX(e.event),i=m.getY(e.event),n=this.option.dataZoom||{};return this._zoomShape=new o({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:t,y:i,width:1,height:1,brushType:\"both\"},highlightStyle:{lineWidth:2,color:n.fillerColor||s.dataZoom.fillerColor,strokeColor:n.handleColor||s.dataZoom.handleColor,brushType:\"both\"}}),this.zr.addHoverShape(this._zoomShape),!0}},__onmouseup:function(){if(!this._zoomShape||Math.abs(this._zoomShape.style.width)<10||Math.abs(this._zoomShape.style.height)<10)return this._zooming=!1,!0;if(this._zooming&&this.component.dataZoom){this._zooming=!1;var e=this.component.dataZoom.rectZoom(this._zoomShape.style);e&&(this._zoomQueue.push({start:e.start,end:e.end,start2:e.start2,end2:e.end2}),this._iconEnable(this._iconShapeMap.dataZoomReset),this.zr.refreshNextFrame())}return!0},__onclick:function(e){if(!e.target)if(this._marking)this._marking=!1,this._markShapeList.push(this._markShape),this._iconEnable(this._iconShapeMap.markUndo),this._iconEnable(this._iconShapeMap.markClear),this.zr.addShape(this._markShape),this.zr.refreshNextFrame();else if(this._markStart){this._marking=!0;var t=m.getX(e.event),i=m.getY(e.event);this._markShape=new n({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{xStart:t,yStart:i,xEnd:t,yEnd:i,lineWidth:this.query(this.option,\"toolbox.feature.mark.lineStyle.width\"),strokeColor:this.query(this.option,\"toolbox.feature.mark.lineStyle.color\"),lineType:this.query(this.option,\"toolbox.feature.mark.lineStyle.type\")}}),this.zr.addHoverShape(this._markShape)}},__onMark:function(e){var t=e.target;if(this._marking||this._markStart)this._resetMark(),this.zr.refreshNextFrame();else{this._resetZoom(),this.zr.modShape(t.id,{style:{strokeColor:this._enableColor}}),this.zr.refreshNextFrame(),this._markStart=!0;var i=this;setTimeout(function(){i.zr&&i.zr.on(h.EVENT.CLICK,i._onclick)&&i.zr.on(h.EVENT.MOUSEMOVE,i._onmousemove)},10)}return!0},__onMarkUndo:function(){if(this._marking)this._marking=!1;else{var e=this._markShapeList.length;if(e>=1){var t=this._markShapeList[e-1];this.zr.delShape(t.id),this.zr.refreshNextFrame(),this._markShapeList.pop(),1===e&&(this._iconDisable(this._iconShapeMap.markUndo),this._iconDisable(this._iconShapeMap.markClear))}}return!0},__onMarkClear:function(){this._marking&&(this._marking=!1);var e=this._markShapeList.length;if(e>0){for(;e--;)this.zr.delShape(this._markShapeList.pop().id);this._iconDisable(this._iconShapeMap.markUndo),this._iconDisable(this._iconShapeMap.markClear),this.zr.refreshNextFrame()}return!0},__onDataZoom:function(e){var t=e.target;if(this._zooming||this._zoomStart)this._resetZoom(),this.zr.refreshNextFrame(),this.dom.style.cursor=\"default\";else{this._resetMark(),this.zr.modShape(t.id,{style:{strokeColor:this._enableColor}}),this.zr.refreshNextFrame(),this._zoomStart=!0;var i=this;setTimeout(function(){i.zr&&i.zr.on(h.EVENT.MOUSEDOWN,i._onmousedown)&&i.zr.on(h.EVENT.MOUSEUP,i._onmouseup)&&i.zr.on(h.EVENT.MOUSEMOVE,i._onmousemove)},10),this.dom.style.cursor=\"crosshair\"}return!0},__onDataZoomReset:function(){return this._zooming&&(this._zooming=!1),this._zoomQueue.pop(),this._zoomQueue.length>0?this.component.dataZoom.absoluteZoom(this._zoomQueue[this._zoomQueue.length-1]):(this.component.dataZoom.rectZoom(),this._iconDisable(this._iconShapeMap.dataZoomReset),this.zr.refreshNextFrame()),!0},_resetMark:function(){this._marking=!1,this._markStart&&(this._markStart=!1,this._iconShapeMap.mark&&this.zr.modShape(this._iconShapeMap.mark.id,{style:{strokeColor:this._iconShapeMap.mark.highlightStyle.strokeColor}}),this.zr.un(h.EVENT.CLICK,this._onclick),this.zr.un(h.EVENT.MOUSEMOVE,this._onmousemove))},_resetZoom:function(){this._zooming=!1,this._zoomStart&&(this._zoomStart=!1,this._iconShapeMap.dataZoom&&this.zr.modShape(this._iconShapeMap.dataZoom.id,{style:{strokeColor:this._iconShapeMap.dataZoom.highlightStyle.strokeColor}}),this.zr.un(h.EVENT.MOUSEDOWN,this._onmousedown),this.zr.un(h.EVENT.MOUSEUP,this._onmouseup),this.zr.un(h.EVENT.MOUSEMOVE,this._onmousemove))},_iconDisable:function(e){\"image\"!=e.type?this.zr.modShape(e.id,{hoverable:!1,clickable:!1,style:{strokeColor:this._disableColor}}):this.zr.modShape(e.id,{hoverable:!1,clickable:!1,style:{opacity:.3}})},_iconEnable:function(e){\"image\"!=e.type?this.zr.modShape(e.id,{hoverable:!0,clickable:!0,style:{strokeColor:e.highlightStyle.strokeColor}}):this.zr.modShape(e.id,{hoverable:!0,clickable:!0,style:{opacity:.8}})},__onDataView:function(){return this._dataView.show(this.option),!0},__onRestore:function(){return this._resetMark(),this._resetZoom(),this.messageCenter.dispatch(s.EVENT.RESTORE,null,null,this.myChart),!0},__onSaveAsImage:function(){var e=this.option.toolbox.feature.saveAsImage,t=e.type||\"png\";\"png\"!=t&&\"jpeg\"!=t&&(t=\"png\");var i;i=this.myChart.isConnected()?this.myChart.getConnectedDataURL(t):this.zr.toDataURL(\"image/\"+t,this.option.backgroundColor&&\"rgba(0,0,0,0)\"===this.option.backgroundColor.replace(\" \",\"\")?\"#fff\":this.option.backgroundColor);var n=document.createElement(\"div\");n.id=\"__echarts_download_wrap__\",n.style.cssText=\"position:fixed;z-index:99999;display:block;top:0;left:0;background-color:rgba(33,33,33,0.5);text-align:center;width:100%;height:100%;line-height:\"+document.documentElement.clientHeight+\"px;\";var a=document.createElement(\"a\");a.href=i,a.setAttribute(\"download\",(e.name?e.name:this.option.title&&(this.option.title.text||this.option.title.subtext)?this.option.title.text||this.option.title.subtext:\"ECharts\")+\".\"+t),a.innerHTML='<img style=\"vertical-align:middle\" src=\"'+i+'\" title=\"'+(window.ActiveXObject||\"ActiveXObject\"in window?\"右键->图片另存为\":e.lang?e.lang[0]:\"点击保存\")+'\"/>',n.appendChild(a),document.body.appendChild(n),a=null,n=null,setTimeout(function(){var e=document.getElementById(\"__echarts_download_wrap__\");e&&(e.onclick=function(){var e=document.getElementById(\"__echarts_download_wrap__\");e.onclick=null,e.innerHTML=\"\",document.body.removeChild(e),e=null},e=null)},500)},__onMagicType:function(e){this._resetMark();var t=e.target._name;return this._magicType[t]||(this._magicType[t]=!0,t===s.CHART_TYPE_LINE?this._magicType[s.CHART_TYPE_BAR]=!1:t===s.CHART_TYPE_BAR&&(this._magicType[s.CHART_TYPE_LINE]=!1),t===s.CHART_TYPE_PIE?this._magicType[s.CHART_TYPE_FUNNEL]=!1:t===s.CHART_TYPE_FUNNEL&&(this._magicType[s.CHART_TYPE_PIE]=!1),t===s.CHART_TYPE_FORCE?this._magicType[s.CHART_TYPE_CHORD]=!1:t===s.CHART_TYPE_CHORD&&(this._magicType[s.CHART_TYPE_FORCE]=!1),t===V?this._magicType[U]=!1:t===U&&(this._magicType[V]=!1),this.messageCenter.dispatch(s.EVENT.MAGIC_TYPE_CHANGED,e.event,{magicType:this._magicType},this.myChart)),!0},setMagicType:function(e){this._resetMark(),this._magicType=e,!this._isSilence&&this.messageCenter.dispatch(s.EVENT.MAGIC_TYPE_CHANGED,null,{magicType:this._magicType},this.myChart)},__onCustomHandler:function(e){var t=e.target.style.iconType,i=this.option.toolbox.feature[t].onclick;\"function\"==typeof i&&i.call(this,this.option)},reset:function(e,t){if(t&&this.clear(),this.query(e,\"toolbox.show\")&&this.query(e,\"toolbox.feature.magicType.show\")){var i=e.toolbox.feature.magicType.type,n=i.length;for(this._magicMap={};n--;)this._magicMap[i[n]]=!0;n=e.series.length;for(var a,o;n--;)a=e.series[n].type,this._magicMap[a]&&(o=e.xAxis instanceof Array?e.xAxis[e.series[n].xAxisIndex||0]:e.xAxis,o&&\"category\"===(o.type||\"category\")&&(o.__boundaryGap=null!=o.boundaryGap?o.boundaryGap:!0),o=e.yAxis instanceof Array?e.yAxis[e.series[n].yAxisIndex||0]:e.yAxis,o&&\"category\"===o.type&&(o.__boundaryGap=null!=o.boundaryGap?o.boundaryGap:!0),e.series[n].__type=a,e.series[n].__itemStyle=l.clone(e.series[n].itemStyle||{})),(this._magicMap[V]||this._magicMap[U])&&(e.series[n].__stack=e.series[n].stack)}this._magicType=t?{}:this._magicType||{};for(var r in this._magicType)if(this._magicType[r]){this.option=e,this.getMagicOption();break}var s=e.dataZoom;if(s&&s.show){var h=null!=s.start&&s.start>=0&&s.start<=100?s.start:0,m=null!=s.end&&s.end>=0&&s.end<=100?s.end:100;h>m&&(h+=m,m=h-m,h-=m),this._zoomQueue=[{start:h,end:m,start2:0,end2:100}]}else this._zoomQueue=[]},getMagicOption:function(){var e,t;if(this._magicType[s.CHART_TYPE_LINE]||this._magicType[s.CHART_TYPE_BAR]){for(var i=this._magicType[s.CHART_TYPE_LINE]?!1:!0,n=0,a=this.option.series.length;a>n;n++)t=this.option.series[n].type,(t==s.CHART_TYPE_LINE||t==s.CHART_TYPE_BAR)&&(e=this.option.xAxis instanceof Array?this.option.xAxis[this.option.series[n].xAxisIndex||0]:this.option.xAxis,e&&\"category\"===(e.type||\"category\")&&(e.boundaryGap=i?!0:e.__boundaryGap),e=this.option.yAxis instanceof Array?this.option.yAxis[this.option.series[n].yAxisIndex||0]:this.option.yAxis,e&&\"category\"===e.type&&(e.boundaryGap=i?!0:e.__boundaryGap));this._defaultMagic(s.CHART_TYPE_LINE,s.CHART_TYPE_BAR)}if(this._defaultMagic(s.CHART_TYPE_CHORD,s.CHART_TYPE_FORCE),this._defaultMagic(s.CHART_TYPE_PIE,s.CHART_TYPE_FUNNEL),this._magicType[V]||this._magicType[U])for(var n=0,a=this.option.series.length;a>n;n++)this._magicType[V]?(this.option.series[n].stack=\"_ECHARTS_STACK_KENER_2014_\",t=V):this._magicType[U]&&(this.option.series[n].stack=null,t=U),this._featureOption[t+\"Chart\"]&&l.merge(this.option.series[n],this._featureOption[t+\"Chart\"]||{},!0);return this.option},_defaultMagic:function(e,t){if(this._magicType[e]||this._magicType[t])for(var i=0,n=this.option.series.length;n>i;i++){var a=this.option.series[i].type;(a==e||a==t)&&(this.option.series[i].type=this._magicType[e]?e:t,this.option.series[i].itemStyle=l.clone(this.option.series[i].__itemStyle),a=this.option.series[i].type,this._featureOption[a+\"Chart\"]&&l.merge(this.option.series[i],this._featureOption[a+\"Chart\"]||{},!0))}},silence:function(e){this._isSilence=e},resize:function(){this._resetMark(),this.clear(),this.option&&this.option.toolbox&&this.option.toolbox.show&&this._buildShape(),this._dataView&&this._dataView.resize()},hideDataView:function(){this._dataView&&this._dataView.hide()},clear:function(e){this.zr&&(this.zr.delShape(this.shapeList),this.shapeList=[],e||(this.zr.delShape(this._markShapeList),this._markShapeList=[]))},onbeforDispose:function(){this._dataView&&(this._dataView.dispose(),this._dataView=null),this._markShapeList=null},refresh:function(e){e&&(this._resetMark(),this._resetZoom(),e.toolbox=this.reformOption(e.toolbox),this.option=e,this.clear(!0),e.toolbox.show&&this._buildShape(),this.hideDataView())}},l.inherits(t,i),e(\"../component\").define(\"toolbox\",t),t}),i(\"echarts/component\",[],function(){var e={},t={};return e.define=function(i,n){return t[i]=n,e},e.get=function(e){return t[e]},e}),i(\"echarts/component/title\",[\"require\",\"./base\",\"zrender/shape/Text\",\"zrender/shape/Rectangle\",\"../config\",\"zrender/tool/util\",\"zrender/tool/area\",\"zrender/tool/color\",\"../component\"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e(\"./base\"),n=e(\"zrender/shape/Text\"),a=e(\"zrender/shape/Rectangle\"),o=e(\"../config\");o.title={zlevel:0,z:6,show:!0,text:\"\",subtext:\"\",x:\"left\",y:\"top\",backgroundColor:\"rgba(0,0,0,0)\",borderColor:\"#ccc\",borderWidth:0,padding:5,itemGap:5,textStyle:{fontSize:18,fontWeight:\"bolder\",color:\"#333\"},subtextStyle:{color:\"#aaa\"}};var r=e(\"zrender/tool/util\"),s=e(\"zrender/tool/area\"),l=e(\"zrender/tool/color\");return t.prototype={type:o.COMPONENT_TYPE_TITLE,_buildShape:function(){if(this.titleOption.show){this._itemGroupLocation=this._getItemGroupLocation(),this._buildBackground(),this._buildItem();for(var e=0,t=this.shapeList.length;t>e;e++)this.zr.addShape(this.shapeList[e])}},_buildItem:function(){var e=this.titleOption.text,t=this.titleOption.link,i=this.titleOption.target,a=this.titleOption.subtext,o=this.titleOption.sublink,r=this.titleOption.subtarget,s=this.getFont(this.titleOption.textStyle),h=this.getFont(this.titleOption.subtextStyle),m=this._itemGroupLocation.x,V=this._itemGroupLocation.y,U=this._itemGroupLocation.width,d=this._itemGroupLocation.height,p={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{y:V,color:this.titleOption.textStyle.color,text:e,textFont:s,textBaseline:\"top\"},highlightStyle:{color:l.lift(this.titleOption.textStyle.color,1),brushType:\"fill\"},hoverable:!1};t&&(p.hoverable=!0,p.clickable=!0,p.onclick=function(){i&&\"self\"==i?window.location=t:window.open(t)});var c={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{y:V+d,color:this.titleOption.subtextStyle.color,text:a,textFont:h,textBaseline:\"bottom\"},highlightStyle:{color:l.lift(this.titleOption.subtextStyle.color,1),brushType:\"fill\"},hoverable:!1};switch(o&&(c.hoverable=!0,c.clickable=!0,c.onclick=function(){r&&\"self\"==r?window.location=o:window.open(o)}),this.titleOption.x){case\"center\":p.style.x=c.style.x=m+U/2,p.style.textAlign=c.style.textAlign=\"center\";break;case\"left\":p.style.x=c.style.x=m,p.style.textAlign=c.style.textAlign=\"left\";break;case\"right\":p.style.x=c.style.x=m+U,p.style.textAlign=c.style.textAlign=\"right\";break;default:m=this.titleOption.x-0,m=isNaN(m)?0:m,p.style.x=c.style.x=m}this.titleOption.textAlign&&(p.style.textAlign=c.style.textAlign=this.titleOption.textAlign),this.shapeList.push(new n(p)),\"\"!==a&&this.shapeList.push(new n(c))},_buildBackground:function(){var e=this.reformCssArray(this.titleOption.padding);this.shapeList.push(new a({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._itemGroupLocation.x-e[3],y:this._itemGroupLocation.y-e[0],width:this._itemGroupLocation.width+e[3]+e[1],height:this._itemGroupLocation.height+e[0]+e[2],brushType:0===this.titleOption.borderWidth?\"fill\":\"both\",color:this.titleOption.backgroundColor,strokeColor:this.titleOption.borderColor,lineWidth:this.titleOption.borderWidth}}))},_getItemGroupLocation:function(){var e,t=this.reformCssArray(this.titleOption.padding),i=this.titleOption.text,n=this.titleOption.subtext,a=this.getFont(this.titleOption.textStyle),o=this.getFont(this.titleOption.subtextStyle),r=Math.max(s.getTextWidth(i,a),s.getTextWidth(n,o)),l=s.getTextHeight(i,a)+(\"\"===n?0:this.titleOption.itemGap+s.getTextHeight(n,o)),h=this.zr.getWidth();switch(this.titleOption.x){case\"center\":e=Math.floor((h-r)/2);break;case\"left\":e=t[3]+this.titleOption.borderWidth;break;case\"right\":e=h-r-t[1]-this.titleOption.borderWidth;break;default:e=this.titleOption.x-0,e=isNaN(e)?0:e}var m,V=this.zr.getHeight();switch(this.titleOption.y){case\"top\":m=t[0]+this.titleOption.borderWidth;break;case\"bottom\":m=V-l-t[2]-this.titleOption.borderWidth;break;case\"center\":m=Math.floor((V-l)/2);break;default:m=this.titleOption.y-0,m=isNaN(m)?0:m}return{x:e,y:m,width:r,height:l}},refresh:function(e){e&&(this.option=e,this.option.title=this.reformOption(this.option.title),this.titleOption=this.option.title,this.titleOption.textStyle=this.getTextStyle(this.titleOption.textStyle),this.titleOption.subtextStyle=this.getTextStyle(this.titleOption.subtextStyle)),this.clear(),this._buildShape()}},r.inherits(t,i),e(\"../component\").define(\"title\",t),t}),i(\"echarts/component/tooltip\",[\"require\",\"./base\",\"../util/shape/Cross\",\"zrender/shape/Line\",\"zrender/shape/Rectangle\",\"../config\",\"../util/ecData\",\"zrender/config\",\"zrender/tool/event\",\"zrender/tool/area\",\"zrender/tool/color\",\"zrender/tool/util\",\"zrender/shape/Base\",\"../component\"],function(e){function t(e,t,o,r,s){i.call(this,e,t,o,r,s),this.dom=s.dom;var l=this;l._onmousemove=function(e){return l.__onmousemove(e)},l._onglobalout=function(e){return l.__onglobalout(e)},this.zr.on(h.EVENT.MOUSEMOVE,l._onmousemove),this.zr.on(h.EVENT.GLOBALOUT,l._onglobalout),l._hide=function(e){return l.__hide(e)},l._tryShow=function(e){return l.__tryShow(e)},l._refixed=function(e){return l.__refixed(e)},l._setContent=function(e,t){return l.__setContent(e,t)},this._tDom=this._tDom||document.createElement(\"div\"),this._tDom.onselectstart=function(){return!1},this._tDom.onmouseover=function(){l._mousein=!0},this._tDom.onmouseout=function(){l._mousein=!1},this._tDom.className=\"echarts-tooltip\",this._tDom.style.position=\"absolute\",this.hasAppend=!1,this._axisLineShape&&this.zr.delShape(this._axisLineShape.id),this._axisLineShape=new a({zlevel:this.getZlevelBase(),z:this.getZBase(),invisible:!0,hoverable:!1}),this.shapeList.push(this._axisLineShape),this.zr.addShape(this._axisLineShape),this._axisShadowShape&&this.zr.delShape(this._axisShadowShape.id),this._axisShadowShape=new a({zlevel:this.getZlevelBase(),z:1,invisible:!0,hoverable:!1}),this.shapeList.push(this._axisShadowShape),this.zr.addShape(this._axisShadowShape),this._axisCrossShape&&this.zr.delShape(this._axisCrossShape.id),this._axisCrossShape=new n({zlevel:this.getZlevelBase(),z:this.getZBase(),invisible:!0,hoverable:!1}),this.shapeList.push(this._axisCrossShape),this.zr.addShape(this._axisCrossShape),this.showing=!1,this.refresh(r)}var i=e(\"./base\"),n=e(\"../util/shape/Cross\"),a=e(\"zrender/shape/Line\"),o=e(\"zrender/shape/Rectangle\"),r=new o({}),s=e(\"../config\");s.tooltip={zlevel:1,z:8,show:!0,showContent:!0,trigger:\"item\",islandFormatter:\"{a} <br/>{b} : {c}\",showDelay:20,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:\"rgba(0,0,0,0.7)\",borderColor:\"#333\",borderRadius:4,borderWidth:0,padding:5,axisPointer:{type:\"line\",lineStyle:{color:\"#48b\",width:2,type:\"solid\"},crossStyle:{color:\"#1e90ff\",width:1,type:\"dashed\"},shadowStyle:{color:\"rgba(150,150,150,0.3)\",width:\"auto\",type:\"default\"}},textStyle:{color:\"#fff\"}};var l=e(\"../util/ecData\"),h=e(\"zrender/config\"),m=e(\"zrender/tool/event\"),V=e(\"zrender/tool/area\"),U=e(\"zrender/tool/color\"),d=e(\"zrender/tool/util\"),p=e(\"zrender/shape/Base\");return t.prototype={type:s.COMPONENT_TYPE_TOOLTIP,_gCssText:\"position:absolute;display:block;border-style:solid;white-space:nowrap;\",_style:function(e){if(!e)return\"\";var t=[];if(e.transitionDuration){var i=\"left \"+e.transitionDuration+\"s,top \"+e.transitionDuration+\"s\";t.push(\"transition:\"+i),t.push(\"-moz-transition:\"+i),t.push(\"-webkit-transition:\"+i),t.push(\"-o-transition:\"+i)}e.backgroundColor&&(t.push(\"background-Color:\"+U.toHex(e.backgroundColor)),t.push(\"filter:alpha(opacity=70)\"),t.push(\"background-Color:\"+e.backgroundColor)),null!=e.borderWidth&&t.push(\"border-width:\"+e.borderWidth+\"px\"),null!=e.borderColor&&t.push(\"border-color:\"+e.borderColor),null!=e.borderRadius&&(t.push(\"border-radius:\"+e.borderRadius+\"px\"),t.push(\"-moz-border-radius:\"+e.borderRadius+\"px\"),t.push(\"-webkit-border-radius:\"+e.borderRadius+\"px\"),t.push(\"-o-border-radius:\"+e.borderRadius+\"px\"));var n=e.textStyle;n&&(n.color&&t.push(\"color:\"+n.color),n.decoration&&t.push(\"text-decoration:\"+n.decoration),n.align&&t.push(\"text-align:\"+n.align),n.fontFamily&&t.push(\"font-family:\"+n.fontFamily),n.fontSize&&t.push(\"font-size:\"+n.fontSize+\"px\"),n.fontSize&&t.push(\"line-height:\"+Math.round(3*n.fontSize/2)+\"px\"),n.fontStyle&&t.push(\"font-style:\"+n.fontStyle),n.fontWeight&&t.push(\"font-weight:\"+n.fontWeight));var a=e.padding;return null!=a&&(a=this.reformCssArray(a),t.push(\"padding:\"+a[0]+\"px \"+a[1]+\"px \"+a[2]+\"px \"+a[3]+\"px\")),t=t.join(\";\")+\";\"},__hide:function(){this._lastDataIndex=-1,this._lastSeriesIndex=-1,this._lastItemTriggerId=-1,this._tDom&&(this._tDom.style.display=\"none\");var e=!1;this._axisLineShape.invisible||(this._axisLineShape.invisible=!0,\nthis.zr.modShape(this._axisLineShape.id),e=!0),this._axisShadowShape.invisible||(this._axisShadowShape.invisible=!0,this.zr.modShape(this._axisShadowShape.id),e=!0),this._axisCrossShape.invisible||(this._axisCrossShape.invisible=!0,this.zr.modShape(this._axisCrossShape.id),e=!0),this._lastTipShape&&this._lastTipShape.tipShape.length>0&&(this.zr.delShape(this._lastTipShape.tipShape),this._lastTipShape=!1,this.shapeList.length=2),e&&this.zr.refreshNextFrame(),this.showing=!1},_show:function(e,t,i,n){var a=this._tDom.offsetHeight,o=this._tDom.offsetWidth;e&&(\"function\"==typeof e&&(e=e([t,i])),e instanceof Array&&(t=e[0],i=e[1])),t+o>this._zrWidth&&(t-=o+40),i+a>this._zrHeight&&(i-=a-20),20>i&&(i=0),this._tDom.style.cssText=this._gCssText+this._defaultCssText+(n?n:\"\")+\"left:\"+t+\"px;top:\"+i+\"px;\",(10>a||10>o)&&setTimeout(this._refixed,20),this.showing=!0},__refixed:function(){if(this._tDom){var e=\"\",t=this._tDom.offsetHeight,i=this._tDom.offsetWidth;this._tDom.offsetLeft+i>this._zrWidth&&(e+=\"left:\"+(this._zrWidth-i-20)+\"px;\"),this._tDom.offsetTop+t>this._zrHeight&&(e+=\"top:\"+(this._zrHeight-t-10)+\"px;\"),\"\"!==e&&(this._tDom.style.cssText+=e)}},__tryShow:function(){var e,t;if(this._curTarget){if(\"island\"===this._curTarget._type&&this.option.tooltip.show)return void this._showItemTrigger();var i=l.get(this._curTarget,\"series\"),n=l.get(this._curTarget,\"data\");e=this.deepQuery([n,i,this.option],\"tooltip.show\"),null!=i&&null!=n&&e?(t=this.deepQuery([n,i,this.option],\"tooltip.trigger\"),\"axis\"===t?this._showAxisTrigger(i.xAxisIndex,i.yAxisIndex,l.get(this._curTarget,\"dataIndex\")):this._showItemTrigger()):(clearTimeout(this._hidingTicket),clearTimeout(this._showingTicket),this._hidingTicket=setTimeout(this._hide,this._hideDelay))}else this._findPolarTrigger()||this._findAxisTrigger()},_findAxisTrigger:function(){if(!this.component.xAxis||!this.component.yAxis)return void(this._hidingTicket=setTimeout(this._hide,this._hideDelay));for(var e,t,i=this.option.series,n=0,a=i.length;a>n;n++)if(\"axis\"===this.deepQuery([i[n],this.option],\"tooltip.trigger\"))return e=i[n].xAxisIndex||0,t=i[n].yAxisIndex||0,this.component.xAxis.getAxis(e)&&this.component.xAxis.getAxis(e).type===s.COMPONENT_TYPE_AXIS_CATEGORY?void this._showAxisTrigger(e,t,this._getNearestDataIndex(\"x\",this.component.xAxis.getAxis(e))):this.component.yAxis.getAxis(t)&&this.component.yAxis.getAxis(t).type===s.COMPONENT_TYPE_AXIS_CATEGORY?void this._showAxisTrigger(e,t,this._getNearestDataIndex(\"y\",this.component.yAxis.getAxis(t))):void this._showAxisTrigger(e,t,-1);\"cross\"===this.option.tooltip.axisPointer.type&&this._showAxisTrigger(-1,-1,-1)},_findPolarTrigger:function(){if(!this.component.polar)return!1;var e,t=m.getX(this._event),i=m.getY(this._event),n=this.component.polar.getNearestIndex([t,i]);return n?(e=n.valueIndex,n=n.polarIndex):n=-1,-1!=n?this._showPolarTrigger(n,e):!1},_getNearestDataIndex:function(e,t){var i=-1,n=m.getX(this._event),a=m.getY(this._event);if(\"x\"===e){for(var o,r,s=this.component.grid.getXend(),l=t.getCoordByIndex(i);s>l&&(r=l,n>=l);)o=l,l=t.getCoordByIndex(++i);return 0>=i?i=0:r-n>=n-o?i-=1:null==t.getNameByIndex(i)&&(i-=1),i}for(var h,V,U=this.component.grid.getY(),l=t.getCoordByIndex(i);l>U&&(h=l,l>=a);)V=l,l=t.getCoordByIndex(++i);return 0>=i?i=0:a-h>=V-a?i-=1:null==t.getNameByIndex(i)&&(i-=1),i},_showAxisTrigger:function(e,t,i){if(!this._event.connectTrigger&&this.messageCenter.dispatch(s.EVENT.TOOLTIP_IN_GRID,this._event,null,this.myChart),null==this.component.xAxis||null==this.component.yAxis||null==e||null==t)return clearTimeout(this._hidingTicket),clearTimeout(this._showingTicket),void(this._hidingTicket=setTimeout(this._hide,this._hideDelay));var n,a,o,r,l=this.option.series,h=[],V=[],U=\"\";if(\"axis\"===this.option.tooltip.trigger){if(!this.option.tooltip.show)return;a=this.option.tooltip.formatter,o=this.option.tooltip.position}var d,p,c=-1!=e&&this.component.xAxis.getAxis(e).type===s.COMPONENT_TYPE_AXIS_CATEGORY?\"xAxis\":-1!=t&&this.component.yAxis.getAxis(t).type===s.COMPONENT_TYPE_AXIS_CATEGORY?\"yAxis\":!1;if(c){var u=\"xAxis\"==c?e:t;n=this.component[c].getAxis(u);for(var y=0,g=l.length;g>y;y++)this._isSelected(l[y].name)&&l[y][c+\"Index\"]===u&&\"axis\"===this.deepQuery([l[y],this.option],\"tooltip.trigger\")&&(r=this.query(l[y],\"tooltip.showContent\")||r,a=this.query(l[y],\"tooltip.formatter\")||a,o=this.query(l[y],\"tooltip.position\")||o,U+=this._style(this.query(l[y],\"tooltip\")),null!=l[y].stack&&\"xAxis\"==c?(h.unshift(l[y]),V.unshift(y)):(h.push(l[y]),V.push(y)));this.messageCenter.dispatch(s.EVENT.TOOLTIP_HOVER,this._event,{seriesIndex:V,dataIndex:i},this.myChart);var b;\"xAxis\"==c?(d=this.subPixelOptimize(n.getCoordByIndex(i),this._axisLineWidth),p=m.getY(this._event),b=[d,this.component.grid.getY(),d,this.component.grid.getYend()]):(d=m.getX(this._event),p=this.subPixelOptimize(n.getCoordByIndex(i),this._axisLineWidth),b=[this.component.grid.getX(),p,this.component.grid.getXend(),p]),this._styleAxisPointer(h,b[0],b[1],b[2],b[3],n.getGap(),d,p)}else d=m.getX(this._event),p=m.getY(this._event),this._styleAxisPointer(l,this.component.grid.getX(),p,this.component.grid.getXend(),p,0,d,p),i>=0?this._showItemTrigger(!0):(clearTimeout(this._hidingTicket),clearTimeout(this._showingTicket),this._tDom.style.display=\"none\");if(h.length>0){if(this._lastItemTriggerId=-1,this._lastDataIndex!=i||this._lastSeriesIndex!=V[0]){this._lastDataIndex=i,this._lastSeriesIndex=V[0];var f,k;if(\"function\"==typeof a){for(var x=[],y=0,g=h.length;g>y;y++)f=h[y].data[i],k=this.getDataFromOption(f,\"-\"),x.push({seriesIndex:V[y],seriesName:h[y].name||\"\",series:h[y],dataIndex:i,data:f,name:n.getNameByIndex(i),value:k,0:h[y].name||\"\",1:n.getNameByIndex(i),2:k,3:f});this._curTicket=\"axis:\"+i,this._tDom.innerHTML=a.call(this.myChart,x,this._curTicket,this._setContent)}else if(\"string\"==typeof a){this._curTicket=0/0,a=a.replace(\"{a}\",\"{a0}\").replace(\"{b}\",\"{b0}\").replace(\"{c}\",\"{c0}\");for(var y=0,g=h.length;g>y;y++)a=a.replace(\"{a\"+y+\"}\",this._encodeHTML(h[y].name||\"\")),a=a.replace(\"{b\"+y+\"}\",this._encodeHTML(n.getNameByIndex(i))),f=h[y].data[i],f=this.getDataFromOption(f,\"-\"),a=a.replace(\"{c\"+y+\"}\",f instanceof Array?f:this.numAddCommas(f));this._tDom.innerHTML=a}else{this._curTicket=0/0,a=this._encodeHTML(n.getNameByIndex(i));for(var y=0,g=h.length;g>y;y++)a+=\"<br/>\"+this._encodeHTML(h[y].name||\"\")+\" : \",f=h[y].data[i],f=this.getDataFromOption(f,\"-\"),a+=f instanceof Array?f:this.numAddCommas(f);this._tDom.innerHTML=a}}if(r===!1||!this.option.tooltip.showContent)return;this.hasAppend||(this._tDom.style.left=this._zrWidth/2+\"px\",this._tDom.style.top=this._zrHeight/2+\"px\",this.dom.firstChild.appendChild(this._tDom),this.hasAppend=!0),this._show(o,d+10,p+10,U)}},_showPolarTrigger:function(e,t){if(null==this.component.polar||null==e||null==t||0>t)return!1;var i,n,a,o=this.option.series,r=[],s=[],l=\"\";if(\"axis\"===this.option.tooltip.trigger){if(!this.option.tooltip.show)return!1;i=this.option.tooltip.formatter,n=this.option.tooltip.position}for(var h=this.option.polar[e].indicator[t].text,V=0,U=o.length;U>V;V++)this._isSelected(o[V].name)&&o[V].polarIndex===e&&\"axis\"===this.deepQuery([o[V],this.option],\"tooltip.trigger\")&&(a=this.query(o[V],\"tooltip.showContent\")||a,i=this.query(o[V],\"tooltip.formatter\")||i,n=this.query(o[V],\"tooltip.position\")||n,l+=this._style(this.query(o[V],\"tooltip\")),r.push(o[V]),s.push(V));if(r.length>0){for(var d,p,c,u=[],V=0,U=r.length;U>V;V++){d=r[V].data;for(var y=0,g=d.length;g>y;y++)p=d[y],this._isSelected(p.name)&&(p=null!=p?p:{name:\"\",value:{dataIndex:\"-\"}},c=this.getDataFromOption(p.value[t]),u.push({seriesIndex:s[V],seriesName:r[V].name||\"\",series:r[V],dataIndex:t,data:p,name:p.name,indicator:h,value:c,0:r[V].name||\"\",1:p.name,2:c,3:h}))}if(u.length<=0)return;if(this._lastItemTriggerId=-1,this._lastDataIndex!=t||this._lastSeriesIndex!=s[0])if(this._lastDataIndex=t,this._lastSeriesIndex=s[0],\"function\"==typeof i)this._curTicket=\"axis:\"+t,this._tDom.innerHTML=i.call(this.myChart,u,this._curTicket,this._setContent);else if(\"string\"==typeof i){i=i.replace(\"{a}\",\"{a0}\").replace(\"{b}\",\"{b0}\").replace(\"{c}\",\"{c0}\").replace(\"{d}\",\"{d0}\");for(var V=0,U=u.length;U>V;V++)i=i.replace(\"{a\"+V+\"}\",this._encodeHTML(u[V].seriesName)),i=i.replace(\"{b\"+V+\"}\",this._encodeHTML(u[V].name)),i=i.replace(\"{c\"+V+\"}\",this.numAddCommas(u[V].value)),i=i.replace(\"{d\"+V+\"}\",this._encodeHTML(u[V].indicator));this._tDom.innerHTML=i}else{i=this._encodeHTML(u[0].name)+\"<br/>\"+this._encodeHTML(u[0].indicator)+\" : \"+this.numAddCommas(u[0].value);for(var V=1,U=u.length;U>V;V++)i+=\"<br/>\"+this._encodeHTML(u[V].name)+\"<br/>\",i+=this._encodeHTML(u[V].indicator)+\" : \"+this.numAddCommas(u[V].value);this._tDom.innerHTML=i}if(a===!1||!this.option.tooltip.showContent)return;return this.hasAppend||(this._tDom.style.left=this._zrWidth/2+\"px\",this._tDom.style.top=this._zrHeight/2+\"px\",this.dom.firstChild.appendChild(this._tDom),this.hasAppend=!0),this._show(n,m.getX(this._event),m.getY(this._event),l),!0}},_showItemTrigger:function(e){if(this._curTarget){var t,i,n,a=l.get(this._curTarget,\"series\"),o=l.get(this._curTarget,\"seriesIndex\"),r=l.get(this._curTarget,\"data\"),h=l.get(this._curTarget,\"dataIndex\"),V=l.get(this._curTarget,\"name\"),U=l.get(this._curTarget,\"value\"),d=l.get(this._curTarget,\"special\"),p=l.get(this._curTarget,\"special2\"),c=[r,a,this.option],u=\"\";if(\"island\"!=this._curTarget._type){var y=e?\"axis\":\"item\";this.option.tooltip.trigger===y&&(t=this.option.tooltip.formatter,i=this.option.tooltip.position),this.query(a,\"tooltip.trigger\")===y&&(n=this.query(a,\"tooltip.showContent\")||n,t=this.query(a,\"tooltip.formatter\")||t,i=this.query(a,\"tooltip.position\")||i,u+=this._style(this.query(a,\"tooltip\"))),n=this.query(r,\"tooltip.showContent\")||n,t=this.query(r,\"tooltip.formatter\")||t,i=this.query(r,\"tooltip.position\")||i,u+=this._style(this.query(r,\"tooltip\"))}else this._lastItemTriggerId=0/0,n=this.deepQuery(c,\"tooltip.showContent\"),t=this.deepQuery(c,\"tooltip.islandFormatter\"),i=this.deepQuery(c,\"tooltip.islandPosition\");this._lastDataIndex=-1,this._lastSeriesIndex=-1,this._lastItemTriggerId!==this._curTarget.id&&(this._lastItemTriggerId=this._curTarget.id,\"function\"==typeof t?(this._curTicket=(a.name||\"\")+\":\"+h,this._tDom.innerHTML=t.call(this.myChart,{seriesIndex:o,seriesName:a.name||\"\",series:a,dataIndex:h,data:r,name:V,value:U,percent:d,indicator:d,value2:p,indicator2:p,0:a.name||\"\",1:V,2:U,3:d,4:p,5:r,6:o,7:h},this._curTicket,this._setContent)):\"string\"==typeof t?(this._curTicket=0/0,t=t.replace(\"{a}\",\"{a0}\").replace(\"{b}\",\"{b0}\").replace(\"{c}\",\"{c0}\"),t=t.replace(\"{a0}\",this._encodeHTML(a.name||\"\")).replace(\"{b0}\",this._encodeHTML(V)).replace(\"{c0}\",U instanceof Array?U:this.numAddCommas(U)),t=t.replace(\"{d}\",\"{d0}\").replace(\"{d0}\",d||\"\"),t=t.replace(\"{e}\",\"{e0}\").replace(\"{e0}\",l.get(this._curTarget,\"special2\")||\"\"),this._tDom.innerHTML=t):(this._curTicket=0/0,this._tDom.innerHTML=a.type===s.CHART_TYPE_RADAR&&d?this._itemFormatter.radar.call(this,a,V,U,d):a.type===s.CHART_TYPE_EVENTRIVER?this._itemFormatter.eventRiver.call(this,a,V,U,r):\"\"+(null!=a.name?this._encodeHTML(a.name)+\"<br/>\":\"\")+(\"\"===V?\"\":this._encodeHTML(V)+\" : \")+(U instanceof Array?U:this.numAddCommas(U))));var g=m.getX(this._event),b=m.getY(this._event);this.deepQuery(c,\"tooltip.axisPointer.show\")&&this.component.grid?this._styleAxisPointer([a],this.component.grid.getX(),b,this.component.grid.getXend(),b,0,g,b):this._hide(),n!==!1&&this.option.tooltip.showContent&&(this.hasAppend||(this._tDom.style.left=this._zrWidth/2+\"px\",this._tDom.style.top=this._zrHeight/2+\"px\",this.dom.firstChild.appendChild(this._tDom),this.hasAppend=!0),this._show(i,g+20,b-20,u))}},_itemFormatter:{radar:function(e,t,i,n){var a=\"\";a+=this._encodeHTML(\"\"===t?e.name||\"\":t),a+=\"\"===a?\"\":\"<br />\";for(var o=0;o<n.length;o++)a+=this._encodeHTML(n[o].text)+\" : \"+this.numAddCommas(i[o])+\"<br />\";return a},chord:function(e,t,i,n,a){if(null==a)return this._encodeHTML(t)+\" (\"+this.numAddCommas(i)+\")\";var o=this._encodeHTML(t),r=this._encodeHTML(n);return\"\"+(null!=e.name?this._encodeHTML(e.name)+\"<br/>\":\"\")+o+\" -> \"+r+\" (\"+this.numAddCommas(i)+\")<br />\"+r+\" -> \"+o+\" (\"+this.numAddCommas(a)+\")\"},eventRiver:function(e,t,i,n){var a=\"\";a+=this._encodeHTML(\"\"===e.name?\"\":e.name+\" : \"),a+=this._encodeHTML(t),a+=\"\"===a?\"\":\"<br />\",n=n.evolution;for(var o=0,r=n.length;r>o;o++)a+='<div style=\"padding-top:5px;\">',n[o].detail&&(n[o].detail.img&&(a+='<img src=\"'+n[o].detail.img+'\" style=\"float:left;width:40px;height:40px;\">'),a+='<div style=\"margin-left:45px;\">'+n[o].time+\"<br/>\",a+='<a href=\"'+n[o].detail.link+'\" target=\"_blank\">',a+=n[o].detail.text+\"</a></div>\",a+=\"</div>\");return a}},_styleAxisPointer:function(e,t,i,n,a,o,r,s){if(e.length>0){var l,h,m=this.option.tooltip.axisPointer,V=m.type,U={line:{},cross:{},shadow:{}};for(var d in U)U[d].color=m[d+\"Style\"].color,U[d].width=m[d+\"Style\"].width,U[d].type=m[d+\"Style\"].type;for(var p=0,c=e.length;c>p;p++)l=e[p],h=this.query(l,\"tooltip.axisPointer.type\"),V=h||V,h&&(U[h].color=this.query(l,\"tooltip.axisPointer.\"+h+\"Style.color\")||U[h].color,U[h].width=this.query(l,\"tooltip.axisPointer.\"+h+\"Style.width\")||U[h].width,U[h].type=this.query(l,\"tooltip.axisPointer.\"+h+\"Style.type\")||U[h].type);if(\"line\"===V){var u=U.line.width,y=t==n;this._axisLineShape.style={xStart:y?this.subPixelOptimize(t,u):t,yStart:y?i:this.subPixelOptimize(i,u),xEnd:y?this.subPixelOptimize(n,u):n,yEnd:y?a:this.subPixelOptimize(a,u),strokeColor:U.line.color,lineWidth:u,lineType:U.line.type},this._axisLineShape.invisible=!1,this.zr.modShape(this._axisLineShape.id)}else if(\"cross\"===V){var g=U.cross.width;this._axisCrossShape.style={brushType:\"stroke\",rect:this.component.grid.getArea(),x:this.subPixelOptimize(r,g),y:this.subPixelOptimize(s,g),text:(\"( \"+this.component.xAxis.getAxis(0).getValueFromCoord(r)+\" , \"+this.component.yAxis.getAxis(0).getValueFromCoord(s)+\" )\").replace(\"  , \",\" \").replace(\" ,  \",\" \"),textPosition:\"specific\",strokeColor:U.cross.color,lineWidth:g,lineType:U.cross.type},this.component.grid.getXend()-r>100?(this._axisCrossShape.style.textAlign=\"left\",this._axisCrossShape.style.textX=r+10):(this._axisCrossShape.style.textAlign=\"right\",this._axisCrossShape.style.textX=r-10),s-this.component.grid.getY()>50?(this._axisCrossShape.style.textBaseline=\"bottom\",this._axisCrossShape.style.textY=s-10):(this._axisCrossShape.style.textBaseline=\"top\",this._axisCrossShape.style.textY=s+10),this._axisCrossShape.invisible=!1,this.zr.modShape(this._axisCrossShape.id)}else\"shadow\"===V&&((null==U.shadow.width||\"auto\"===U.shadow.width||isNaN(U.shadow.width))&&(U.shadow.width=o),t===n?Math.abs(this.component.grid.getX()-t)<2?(U.shadow.width/=2,t=n+=U.shadow.width/2):Math.abs(this.component.grid.getXend()-t)<2&&(U.shadow.width/=2,t=n-=U.shadow.width/2):i===a&&(Math.abs(this.component.grid.getY()-i)<2?(U.shadow.width/=2,i=a+=U.shadow.width/2):Math.abs(this.component.grid.getYend()-i)<2&&(U.shadow.width/=2,i=a-=U.shadow.width/2)),this._axisShadowShape.style={xStart:t,yStart:i,xEnd:n,yEnd:a,strokeColor:U.shadow.color,lineWidth:U.shadow.width},this._axisShadowShape.invisible=!1,this.zr.modShape(this._axisShadowShape.id));this.zr.refreshNextFrame()}},__onmousemove:function(e){if(clearTimeout(this._hidingTicket),clearTimeout(this._showingTicket),!this._mousein||!this._enterable){var t=e.target,i=m.getX(e.event),n=m.getY(e.event);if(t){this._curTarget=t,this._event=e.event,this._event.zrenderX=i,this._event.zrenderY=n;var a;if(this._needAxisTrigger&&this.component.polar&&-1!=(a=this.component.polar.isInside([i,n])))for(var o=this.option.series,l=0,h=o.length;h>l;l++)if(o[l].polarIndex===a&&\"axis\"===this.deepQuery([o[l],this.option],\"tooltip.trigger\")){this._curTarget=null;break}this._showingTicket=setTimeout(this._tryShow,this._showDelay)}else this._curTarget=!1,this._event=e.event,this._event.zrenderX=i,this._event.zrenderY=n,this._needAxisTrigger&&this.component.grid&&V.isInside(r,this.component.grid.getArea(),i,n)?this._showingTicket=setTimeout(this._tryShow,this._showDelay):this._needAxisTrigger&&this.component.polar&&-1!=this.component.polar.isInside([i,n])?this._showingTicket=setTimeout(this._tryShow,this._showDelay):(!this._event.connectTrigger&&this.messageCenter.dispatch(s.EVENT.TOOLTIP_OUT_GRID,this._event,null,this.myChart),this._hidingTicket=setTimeout(this._hide,this._hideDelay))}},__onglobalout:function(){clearTimeout(this._hidingTicket),clearTimeout(this._showingTicket),this._hidingTicket=setTimeout(this._hide,this._hideDelay)},__setContent:function(e,t){this._tDom&&(e===this._curTicket&&(this._tDom.innerHTML=t),setTimeout(this._refixed,20))},ontooltipHover:function(e,t){if(!this._lastTipShape||this._lastTipShape&&this._lastTipShape.dataIndex!=e.dataIndex){this._lastTipShape&&this._lastTipShape.tipShape.length>0&&(this.zr.delShape(this._lastTipShape.tipShape),this.shapeList.length=2);for(var i=0,n=t.length;n>i;i++)t[i].zlevel=this.getZlevelBase(),t[i].z=this.getZBase(),t[i].style=p.prototype.getHighlightStyle(t[i].style,t[i].highlightStyle),t[i].draggable=!1,t[i].hoverable=!1,t[i].clickable=!1,t[i].ondragend=null,t[i].ondragover=null,t[i].ondrop=null,this.shapeList.push(t[i]),this.zr.addShape(t[i]);this._lastTipShape={dataIndex:e.dataIndex,tipShape:t}}},ondragend:function(){this._hide()},onlegendSelected:function(e){this._selectedMap=e.selected},_setSelectedMap:function(){this._selectedMap=this.component.legend?d.clone(this.component.legend.getSelectedMap()):{}},_isSelected:function(e){return null!=this._selectedMap[e]?this._selectedMap[e]:!0},showTip:function(e){if(e){var t,i=this.option.series;if(null!=e.seriesIndex)t=e.seriesIndex;else for(var n=e.seriesName,a=0,o=i.length;o>a;a++)if(i[a].name===n){t=a;break}var r=i[t];if(null!=r){var m=this.myChart.chart[r.type],V=\"axis\"===this.deepQuery([r,this.option],\"tooltip.trigger\");if(m)if(V){var U=e.dataIndex;switch(m.type){case s.CHART_TYPE_LINE:case s.CHART_TYPE_BAR:case s.CHART_TYPE_K:case s.CHART_TYPE_RADAR:if(null==this.component.polar||r.data[0].value.length<=U)return;var d=r.polarIndex||0,p=this.component.polar.getVector(d,U,\"max\");this._event={zrenderX:p[0],zrenderY:p[1]},this._showPolarTrigger(d,U)}}else{var c,u,y=m.shapeList;switch(m.type){case s.CHART_TYPE_LINE:case s.CHART_TYPE_BAR:case s.CHART_TYPE_K:case s.CHART_TYPE_TREEMAP:case s.CHART_TYPE_SCATTER:for(var U=e.dataIndex,a=0,o=y.length;o>a;a++)if(null==y[a]._mark&&l.get(y[a],\"seriesIndex\")==t&&l.get(y[a],\"dataIndex\")==U){this._curTarget=y[a],c=y[a].style.x,u=m.type!=s.CHART_TYPE_K?y[a].style.y:y[a].style.y[0];break}break;case s.CHART_TYPE_RADAR:for(var U=e.dataIndex,a=0,o=y.length;o>a;a++)if(\"polygon\"===y[a].type&&l.get(y[a],\"seriesIndex\")==t&&l.get(y[a],\"dataIndex\")==U){this._curTarget=y[a];var p=this.component.polar.getCenter(r.polarIndex||0);c=p[0],u=p[1];break}break;case s.CHART_TYPE_PIE:for(var g=e.name,a=0,o=y.length;o>a;a++)if(\"sector\"===y[a].type&&l.get(y[a],\"seriesIndex\")==t&&l.get(y[a],\"name\")==g){this._curTarget=y[a];var b=this._curTarget.style,f=(b.startAngle+b.endAngle)/2*Math.PI/180;c=this._curTarget.style.x+Math.cos(f)*b.r/1.5,u=this._curTarget.style.y-Math.sin(f)*b.r/1.5;break}break;case s.CHART_TYPE_MAP:for(var g=e.name,k=r.mapType,a=0,o=y.length;o>a;a++)if(\"text\"===y[a].type&&y[a]._mapType===k&&y[a].style._name===g){this._curTarget=y[a],c=this._curTarget.style.x+this._curTarget.position[0],u=this._curTarget.style.y+this._curTarget.position[1];break}break;case s.CHART_TYPE_CHORD:for(var g=e.name,a=0,o=y.length;o>a;a++)if(\"sector\"===y[a].type&&l.get(y[a],\"name\")==g){this._curTarget=y[a];var b=this._curTarget.style,f=(b.startAngle+b.endAngle)/2*Math.PI/180;return c=this._curTarget.style.x+Math.cos(f)*(b.r-2),u=this._curTarget.style.y-Math.sin(f)*(b.r-2),void this.zr.trigger(h.EVENT.MOUSEMOVE,{zrenderX:c,zrenderY:u})}break;case s.CHART_TYPE_FORCE:for(var g=e.name,a=0,o=y.length;o>a;a++)if(\"circle\"===y[a].type&&l.get(y[a],\"name\")==g){this._curTarget=y[a],c=this._curTarget.position[0],u=this._curTarget.position[1];break}}null!=c&&null!=u&&(this._event={zrenderX:c,zrenderY:u},this.zr.addHoverShape(this._curTarget),this.zr.refreshHover(),this._showItemTrigger())}}}},hideTip:function(){this._hide()},refresh:function(e){if(this._zrHeight=this.zr.getHeight(),this._zrWidth=this.zr.getWidth(),this._lastTipShape&&this._lastTipShape.tipShape.length>0&&this.zr.delShape(this._lastTipShape.tipShape),this._lastTipShape=!1,this.shapeList.length=2,this._lastDataIndex=-1,this._lastSeriesIndex=-1,this._lastItemTriggerId=-1,e){this.option=e,this.option.tooltip=this.reformOption(this.option.tooltip),this.option.tooltip.textStyle=d.merge(this.option.tooltip.textStyle,this.ecTheme.textStyle),this._needAxisTrigger=!1,\"axis\"===this.option.tooltip.trigger&&(this._needAxisTrigger=!0);for(var t=this.option.series,i=0,n=t.length;n>i;i++)if(\"axis\"===this.query(t[i],\"tooltip.trigger\")){this._needAxisTrigger=!0;break}this._showDelay=this.option.tooltip.showDelay,this._hideDelay=this.option.tooltip.hideDelay,this._defaultCssText=this._style(this.option.tooltip),this._setSelectedMap(),this._axisLineWidth=this.option.tooltip.axisPointer.lineStyle.width,this._enterable=this.option.tooltip.enterable,!this._enterable&&this._tDom.className.indexOf(h.elementClassName)<0&&(this._tDom.className+=\" \"+h.elementClassName)}if(this.showing){var a=this;setTimeout(function(){a.zr.trigger(h.EVENT.MOUSEMOVE,a.zr.handler._event)},50)}},onbeforDispose:function(){this._lastTipShape&&this._lastTipShape.tipShape.length>0&&this.zr.delShape(this._lastTipShape.tipShape),clearTimeout(this._hidingTicket),clearTimeout(this._showingTicket),this.zr.un(h.EVENT.MOUSEMOVE,this._onmousemove),this.zr.un(h.EVENT.GLOBALOUT,this._onglobalout),this.hasAppend&&this.dom.firstChild&&this.dom.firstChild.removeChild(this._tDom),this._tDom=null},_encodeHTML:function(e){return String(e).replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\").replace(/'/g,\"&#39;\")}},d.inherits(t,i),e(\"../component\").define(\"tooltip\",t),t}),i(\"echarts/component/legend\",[\"require\",\"./base\",\"zrender/shape/Text\",\"zrender/shape/Rectangle\",\"zrender/shape/Sector\",\"../util/shape/Icon\",\"../util/shape/Candle\",\"../config\",\"zrender/tool/util\",\"zrender/tool/area\",\"../component\"],function(e){function t(e,t,n,a,o){if(!this.query(a,\"legend.data\"))return void console.error(\"option.legend.data has not been defined.\");i.call(this,e,t,n,a,o);var r=this;r._legendSelected=function(e){r.__legendSelected(e)},r._dispatchHoverLink=function(e){return r.__dispatchHoverLink(e)},this._colorIndex=0,this._colorMap={},this._selectedMap={},this._hasDataMap={},this.refresh(a)}var i=e(\"./base\"),n=e(\"zrender/shape/Text\"),a=e(\"zrender/shape/Rectangle\"),o=e(\"zrender/shape/Sector\"),r=e(\"../util/shape/Icon\"),s=e(\"../util/shape/Candle\"),l=e(\"../config\");l.legend={zlevel:0,z:4,show:!0,orient:\"horizontal\",x:\"center\",y:\"top\",backgroundColor:\"rgba(0,0,0,0)\",borderColor:\"#ccc\",borderWidth:0,padding:5,itemGap:10,itemWidth:20,itemHeight:14,textStyle:{color:\"#333\"},selectedMode:!0};var h=e(\"zrender/tool/util\"),m=e(\"zrender/tool/area\");t.prototype={type:l.COMPONENT_TYPE_LEGEND,_buildShape:function(){if(this.legendOption.show){this._itemGroupLocation=this._getItemGroupLocation(),this._buildBackground(),this._buildItem();for(var e=0,t=this.shapeList.length;t>e;e++)this.zr.addShape(this.shapeList[e])}},_buildItem:function(){var e,t,i,a,o,s,l,V,U=this.legendOption.data,d=U.length,p=this.legendOption.textStyle,c=this.zr.getWidth(),u=this.zr.getHeight(),y=this._itemGroupLocation.x,g=this._itemGroupLocation.y,b=this.legendOption.itemWidth,f=this.legendOption.itemHeight,k=this.legendOption.itemGap;\"vertical\"===this.legendOption.orient&&\"right\"===this.legendOption.x&&(y=this._itemGroupLocation.x+this._itemGroupLocation.width-b);for(var x=0;d>x;x++)o=h.merge(U[x].textStyle||{},p),s=this.getFont(o),e=this._getName(U[x]),l=this._getFormatterName(e),\"\"!==e?(t=U[x].icon||this._getSomethingByName(e).type,V=this.getColor(e),\"horizontal\"===this.legendOption.orient?200>c-y&&b+5+m.getTextWidth(l,s)+(x===d-1||\"\"===U[x+1]?0:k)>=c-y&&(y=this._itemGroupLocation.x,g+=f+k):200>u-g&&f+(x===d-1||\"\"===U[x+1]?0:k)>=u-g&&(\"right\"===this.legendOption.x?y-=this._itemGroupLocation.maxWidth+k:y+=this._itemGroupLocation.maxWidth+k,g=this._itemGroupLocation.y),i=this._getItemShapeByType(y,g,b,f,this._selectedMap[e]&&this._hasDataMap[e]?V:\"#ccc\",t,V),i._name=e,i=new r(i),a={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:y+b+5,y:g+f/2,color:this._selectedMap[e]?\"auto\"===o.color?V:o.color:\"#ccc\",text:l,textFont:s,textBaseline:\"middle\"},highlightStyle:{color:V,brushType:\"fill\"},hoverable:!!this.legendOption.selectedMode,clickable:!!this.legendOption.selectedMode},\"vertical\"===this.legendOption.orient&&\"right\"===this.legendOption.x&&(a.style.x-=b+10,a.style.textAlign=\"right\"),a._name=e,a=new n(a),this.legendOption.selectedMode&&(i.onclick=a.onclick=this._legendSelected,i.onmouseover=a.onmouseover=this._dispatchHoverLink,i.hoverConnect=a.id,a.hoverConnect=i.id),this.shapeList.push(i),this.shapeList.push(a),\"horizontal\"===this.legendOption.orient?y+=b+5+m.getTextWidth(l,s)+k:g+=f+k):\"horizontal\"===this.legendOption.orient?(y=this._itemGroupLocation.x,g+=f+k):(\"right\"===this.legendOption.x?y-=this._itemGroupLocation.maxWidth+k:y+=this._itemGroupLocation.maxWidth+k,g=this._itemGroupLocation.y);\"horizontal\"===this.legendOption.orient&&\"center\"===this.legendOption.x&&g!=this._itemGroupLocation.y&&this._mLineOptimize()},_getName:function(e){return\"undefined\"!=typeof e.name?e.name:e},_getFormatterName:function(e){var t,i=this.legendOption.formatter;return t=\"function\"==typeof i?i.call(this.myChart,e):\"string\"==typeof i?i.replace(\"{name}\",e):e},_getFormatterNameFromData:function(e){var t=this._getName(e);return this._getFormatterName(t)},_mLineOptimize:function(){for(var e=[],t=this._itemGroupLocation.x,i=2,n=this.shapeList.length;n>i;i++)this.shapeList[i].style.x===t?e.push((this._itemGroupLocation.width-(this.shapeList[i-1].style.x+m.getTextWidth(this.shapeList[i-1].style.text,this.shapeList[i-1].style.textFont)-t))/2):i===n-1&&e.push((this._itemGroupLocation.width-(this.shapeList[i].style.x+m.getTextWidth(this.shapeList[i].style.text,this.shapeList[i].style.textFont)-t))/2);for(var a=-1,i=1,n=this.shapeList.length;n>i;i++)this.shapeList[i].style.x===t&&a++,0!==e[a]&&(this.shapeList[i].style.x+=e[a])},_buildBackground:function(){var e=this.reformCssArray(this.legendOption.padding);this.shapeList.push(new a({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._itemGroupLocation.x-e[3],y:this._itemGroupLocation.y-e[0],width:this._itemGroupLocation.width+e[3]+e[1],height:this._itemGroupLocation.height+e[0]+e[2],brushType:0===this.legendOption.borderWidth?\"fill\":\"both\",color:this.legendOption.backgroundColor,strokeColor:this.legendOption.borderColor,lineWidth:this.legendOption.borderWidth}}))},_getItemGroupLocation:function(){var e=this.legendOption.data,t=e.length,i=this.legendOption.itemGap,n=this.legendOption.itemWidth+5,a=this.legendOption.itemHeight,o=this.legendOption.textStyle,r=this.getFont(o),s=0,l=0,V=this.reformCssArray(this.legendOption.padding),U=this.zr.getWidth()-V[1]-V[3],d=this.zr.getHeight()-V[0]-V[2],p=0,c=0;if(\"horizontal\"===this.legendOption.orient){l=a;for(var u=0;t>u;u++)if(\"\"!==this._getName(e[u])){var y=m.getTextWidth(this._getFormatterNameFromData(e[u]),e[u].textStyle?this.getFont(h.merge(e[u].textStyle||{},o)):r);p+n+y+i>U?(p-=i,s=Math.max(s,p),l+=a+i,p=0):(p+=n+y+i,s=Math.max(s,p-i))}else p-=i,s=Math.max(s,p),l+=a+i,p=0}else{for(var u=0;t>u;u++)c=Math.max(c,m.getTextWidth(this._getFormatterNameFromData(e[u]),e[u].textStyle?this.getFont(h.merge(e[u].textStyle||{},o)):r));c+=n,s=c;for(var u=0;t>u;u++)\"\"!==this._getName(e[u])?p+a+i>d?(s+=c+i,p-=i,l=Math.max(l,p),p=0):(p+=a+i,l=Math.max(l,p-i)):(s+=c+i,p-=i,l=Math.max(l,p),p=0)}U=this.zr.getWidth(),d=this.zr.getHeight();var g;switch(this.legendOption.x){case\"center\":g=Math.floor((U-s)/2);break;case\"left\":g=V[3]+this.legendOption.borderWidth;break;case\"right\":g=U-s-V[1]-V[3]-2*this.legendOption.borderWidth;break;default:g=this.parsePercent(this.legendOption.x,U)}var b;switch(this.legendOption.y){case\"top\":b=V[0]+this.legendOption.borderWidth;break;case\"bottom\":b=d-l-V[0]-V[2]-2*this.legendOption.borderWidth;break;case\"center\":b=Math.floor((d-l)/2);break;default:b=this.parsePercent(this.legendOption.y,d)}return{x:g,y:b,width:s,height:l,maxWidth:c}},_getSomethingByName:function(e){for(var t,i=this.option.series,n=0,a=i.length;a>n;n++){if(i[n].name===e)return{type:i[n].type,series:i[n],seriesIndex:n,data:null,dataIndex:-1};if(i[n].type===l.CHART_TYPE_PIE||i[n].type===l.CHART_TYPE_RADAR||i[n].type===l.CHART_TYPE_CHORD||i[n].type===l.CHART_TYPE_FORCE||i[n].type===l.CHART_TYPE_FUNNEL||i[n].type===l.CHART_TYPE_TREEMAP){t=i[n].categories||i[n].data||i[n].nodes;for(var o=0,r=t.length;r>o;o++)if(t[o].name===e)return{type:i[n].type,series:i[n],seriesIndex:n,data:t[o],dataIndex:o}}}return{type:\"bar\",series:null,seriesIndex:-1,data:null,dataIndex:-1}},_getItemShapeByType:function(e,t,i,n,a,o,r){var s,h=\"#ccc\"===a?r:a,m={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{iconType:\"legendicon\"+o,x:e,y:t,width:i,height:n,color:a,strokeColor:a,lineWidth:2},highlightStyle:{color:h,strokeColor:h,lineWidth:1},hoverable:this.legendOption.selectedMode,clickable:this.legendOption.selectedMode};if(o.match(\"image\")){var s=o.replace(new RegExp(\"^image:\\\\/\\\\/\"),\"\");o=\"image\"}switch(o){case\"line\":m.style.brushType=\"stroke\",m.highlightStyle.lineWidth=3;break;case\"radar\":case\"venn\":case\"tree\":case\"treemap\":case\"scatter\":m.highlightStyle.lineWidth=3;break;case\"k\":m.style.brushType=\"both\",m.highlightStyle.lineWidth=3,m.highlightStyle.color=m.style.color=this.deepQuery([this.ecTheme,l],\"k.itemStyle.normal.color\")||\"#fff\",m.style.strokeColor=\"#ccc\"!=a?this.deepQuery([this.ecTheme,l],\"k.itemStyle.normal.lineStyle.color\")||\"#ff3200\":a;break;case\"image\":m.style.iconType=\"image\",m.style.image=s,\"#ccc\"===a&&(m.style.opacity=.5)}return m},__legendSelected:function(e){var t=e.target._name;if(\"single\"===this.legendOption.selectedMode)for(var i in this._selectedMap)this._selectedMap[i]=!1;this._selectedMap[t]=!this._selectedMap[t],this.messageCenter.dispatch(l.EVENT.LEGEND_SELECTED,e.event,{selected:this._selectedMap,target:t},this.myChart)},__dispatchHoverLink:function(e){this.messageCenter.dispatch(l.EVENT.LEGEND_HOVERLINK,e.event,{target:e.target._name},this.myChart)},refresh:function(e){if(e){this.option=e||this.option,this.option.legend=this.reformOption(this.option.legend),this.legendOption=this.option.legend;var t,i,n,a,o=this.legendOption.data||[];if(this.legendOption.selected)for(var r in this.legendOption.selected)this._selectedMap[r]=\"undefined\"!=typeof this._selectedMap[r]?this._selectedMap[r]:this.legendOption.selected[r];for(var s=0,h=o.length;h>s;s++)t=this._getName(o[s]),\"\"!==t&&(i=this._getSomethingByName(t),i.series?(this._hasDataMap[t]=!0,a=!i.data||i.type!==l.CHART_TYPE_PIE&&i.type!==l.CHART_TYPE_FORCE&&i.type!==l.CHART_TYPE_FUNNEL?[i.series]:[i.data,i.series],n=this.getItemStyleColor(this.deepQuery(a,\"itemStyle.normal.color\"),i.seriesIndex,i.dataIndex,i.data),n&&i.type!=l.CHART_TYPE_K&&this.setColor(t,n),this._selectedMap[t]=null!=this._selectedMap[t]?this._selectedMap[t]:!0):this._hasDataMap[t]=!1)}this.clear(),this._buildShape()},getRelatedAmount:function(e){for(var t,i=0,n=this.option.series,a=0,o=n.length;o>a;a++)if(n[a].name===e&&i++,n[a].type===l.CHART_TYPE_PIE||n[a].type===l.CHART_TYPE_RADAR||n[a].type===l.CHART_TYPE_CHORD||n[a].type===l.CHART_TYPE_FORCE||n[a].type===l.CHART_TYPE_FUNNEL){t=n[a].type!=l.CHART_TYPE_FORCE?n[a].data:n[a].categories;for(var r=0,s=t.length;s>r;r++)t[r].name===e&&\"-\"!=t[r].value&&i++}return i},setColor:function(e,t){this._colorMap[e]=t},getColor:function(e){return this._colorMap[e]||(this._colorMap[e]=this.zr.getColor(this._colorIndex++)),this._colorMap[e]},hasColor:function(e){return this._colorMap[e]?this._colorMap[e]:!1},add:function(e,t){\nfor(var i=this.legendOption.data,n=0,a=i.length;a>n;n++)if(this._getName(i[n])===e)return;this.legendOption.data.push(e),this.setColor(e,t),this._selectedMap[e]=!0,this._hasDataMap[e]=!0},del:function(e){for(var t=this.legendOption.data,i=0,n=t.length;n>i;i++)if(this._getName(t[i])===e)return this.legendOption.data.splice(i,1)},getItemShape:function(e){if(null!=e)for(var t,i=0,n=this.shapeList.length;n>i;i++)if(t=this.shapeList[i],t._name===e&&\"text\"!=t.type)return t},setItemShape:function(e,t){for(var i,n=0,a=this.shapeList.length;a>n;n++)i=this.shapeList[n],i._name===e&&\"text\"!=i.type&&(this._selectedMap[e]||(t.style.color=\"#ccc\",t.style.strokeColor=\"#ccc\"),this.zr.modShape(i.id,t))},isSelected:function(e){return\"undefined\"!=typeof this._selectedMap[e]?this._selectedMap[e]:!0},getSelectedMap:function(){return this._selectedMap},setSelected:function(e,t){if(\"single\"===this.legendOption.selectedMode)for(var i in this._selectedMap)this._selectedMap[i]=!1;this._selectedMap[e]=t,this.messageCenter.dispatch(l.EVENT.LEGEND_SELECTED,null,{selected:this._selectedMap,target:e},this.myChart)},onlegendSelected:function(e,t){var i=e.selected;for(var n in i)this._selectedMap[n]!=i[n]&&(t.needRefresh=!0),this._selectedMap[n]=i[n]}};var V={line:function(e,t){var i=t.height/2;e.moveTo(t.x,t.y+i),e.lineTo(t.x+t.width,t.y+i)},pie:function(e,t){var i=t.x,n=t.y,a=t.width,r=t.height;o.prototype.buildPath(e,{x:i+a/2,y:n+r+2,r:r,r0:6,startAngle:45,endAngle:135})},eventRiver:function(e,t){var i=t.x,n=t.y,a=t.width,o=t.height;e.moveTo(i,n+o),e.bezierCurveTo(i+a,n+o,i,n+4,i+a,n+4),e.lineTo(i+a,n),e.bezierCurveTo(i,n,i+a,n+o-4,i,n+o-4),e.lineTo(i,n+o)},k:function(e,t){var i=t.x,n=t.y,a=t.width,o=t.height;s.prototype.buildPath(e,{x:i+a/2,y:[n+1,n+1,n+o-6,n+o],width:a-6})},bar:function(e,t){var i=t.x,n=t.y+1,a=t.width,o=t.height-2,r=3;e.moveTo(i+r,n),e.lineTo(i+a-r,n),e.quadraticCurveTo(i+a,n,i+a,n+r),e.lineTo(i+a,n+o-r),e.quadraticCurveTo(i+a,n+o,i+a-r,n+o),e.lineTo(i+r,n+o),e.quadraticCurveTo(i,n+o,i,n+o-r),e.lineTo(i,n+r),e.quadraticCurveTo(i,n,i+r,n)},force:function(e,t){r.prototype.iconLibrary.circle(e,t)},radar:function(e,t){var i=6,n=t.x+t.width/2,a=t.y+t.height/2,o=t.height/2,r=2*Math.PI/i,s=-Math.PI/2,l=n+o*Math.cos(s),h=a+o*Math.sin(s);e.moveTo(l,h),s+=r;for(var m=0,V=i-1;V>m;m++)e.lineTo(n+o*Math.cos(s),a+o*Math.sin(s)),s+=r;e.lineTo(l,h)}};V.chord=V.pie,V.map=V.bar;for(var U in V)r.prototype.iconLibrary[\"legendicon\"+U]=V[U];return h.inherits(t,i),e(\"../component\").define(\"legend\",t),t}),i(\"echarts/util/ecData\",[],function(){function e(e,t,i,n,a,o,r,s){var l;return\"undefined\"!=typeof n&&(l=null==n.value?n:n.value),e._echartsData={_series:t,_seriesIndex:i,_data:n,_dataIndex:a,_name:o,_value:l,_special:r,_special2:s},e._echartsData}function t(e,t){var i=e._echartsData;if(!t)return i;switch(t){case\"series\":case\"seriesIndex\":case\"data\":case\"dataIndex\":case\"name\":case\"value\":case\"special\":case\"special2\":return i&&i[\"_\"+t]}return null}function i(e,t,i){switch(e._echartsData=e._echartsData||{},t){case\"series\":case\"seriesIndex\":case\"data\":case\"dataIndex\":case\"name\":case\"value\":case\"special\":case\"special2\":e._echartsData[\"_\"+t]=i}}function n(e,t){t._echartsData={_series:e._echartsData._series,_seriesIndex:e._echartsData._seriesIndex,_data:e._echartsData._data,_dataIndex:e._echartsData._dataIndex,_name:e._echartsData._name,_value:e._echartsData._value,_special:e._echartsData._special,_special2:e._echartsData._special2}}return{pack:e,set:i,get:t,clone:n}}),i(\"echarts/chart\",[],function(){var e={},t={};return e.define=function(i,n){return t[i]=n,e},e.get=function(e){return t[e]},e}),i(\"zrender/tool/color\",[\"require\",\"../tool/util\"],function(e){function t(e){D=e}function i(){D=N}function n(e,t){return e=0|e,t=t||D,t[e%t.length]}function a(e){B=e}function o(){H=B}function r(){return B}function s(e,t,i,n,a,o,r){O||(O=P.getContext());for(var s=O.createRadialGradient(e,t,i,n,a,o),l=0,h=r.length;h>l;l++)s.addColorStop(r[l][0],r[l][1]);return s.__nonRecursion=!0,s}function l(e,t,i,n,a){O||(O=P.getContext());for(var o=O.createLinearGradient(e,t,i,n),r=0,s=a.length;s>r;r++)o.addColorStop(a[r][0],a[r][1]);return o.__nonRecursion=!0,o}function h(e,t,i){e=p(e),t=p(t),e=I(e),t=I(t);for(var n=[],a=(t[0]-e[0])/i,o=(t[1]-e[1])/i,r=(t[2]-e[2])/i,s=(t[3]-e[3])/i,l=0,h=e[0],m=e[1],U=e[2],d=e[3];i>l;l++)n[l]=V([S(Math.floor(h),[0,255]),S(Math.floor(m),[0,255]),S(Math.floor(U),[0,255]),d.toFixed(4)-0],\"rgba\"),h+=a,m+=o,U+=r,d+=s;return h=t[0],m=t[1],U=t[2],d=t[3],n[l]=V([h,m,U,d],\"rgba\"),n}function m(e,t){var i=[],n=e.length;if(void 0===t&&(t=20),1===n)i=h(e[0],e[0],t);else if(n>1)for(var a=0,o=n-1;o>a;a++){var r=h(e[a],e[a+1],t);o-1>a&&r.pop(),i=i.concat(r)}return i}function V(e,t){if(t=t||\"rgb\",e&&(3===e.length||4===e.length)){if(e=C(e,function(e){return e>1?Math.ceil(e):e}),t.indexOf(\"hex\")>-1)return\"#\"+((1<<24)+(e[0]<<16)+(e[1]<<8)+ +e[2]).toString(16).slice(1);if(t.indexOf(\"hs\")>-1){var i=C(e.slice(1,3),function(e){return e+\"%\"});e[1]=i[0],e[2]=i[1]}return t.indexOf(\"a\")>-1?(3===e.length&&e.push(1),e[3]=S(e[3],[0,1]),t+\"(\"+e.slice(0,4).join(\",\")+\")\"):t+\"(\"+e.slice(0,3).join(\",\")+\")\"}}function U(e){e=L(e),e.indexOf(\"rgba\")<0&&(e=p(e));var t=[],i=0;return e.replace(/[\\d.]+/g,function(e){e=3>i?0|e:+e,t[i++]=e}),t}function d(e,t){if(!E(e))return e;var i=I(e),n=i[3];return\"undefined\"==typeof n&&(n=1),e.indexOf(\"hsb\")>-1?i=F(i):e.indexOf(\"hsl\")>-1&&(i=T(i)),t.indexOf(\"hsb\")>-1||t.indexOf(\"hsv\")>-1?i=A(i):t.indexOf(\"hsl\")>-1&&(i=M(i)),i[3]=n,V(i,t)}function p(e){return d(e,\"rgba\")}function c(e){return d(e,\"rgb\")}function u(e){return d(e,\"hex\")}function y(e){return d(e,\"hsva\")}function g(e){return d(e,\"hsv\")}function b(e){return d(e,\"hsba\")}function f(e){return d(e,\"hsb\")}function k(e){return d(e,\"hsla\")}function x(e){return d(e,\"hsl\")}function _(e){for(var t in G)if(u(G[t])===u(e))return t;return null}function L(e){return String(e).replace(/\\s+/g,\"\")}function W(e){if(G[e]&&(e=G[e]),e=L(e),e=e.replace(/hsv/i,\"hsb\"),/^#[\\da-f]{3}$/i.test(e)){e=parseInt(e.slice(1),16);var t=(3840&e)<<8,i=(240&e)<<4,n=15&e;e=\"#\"+((1<<24)+(t<<4)+t+(i<<4)+i+(n<<4)+n).toString(16).slice(1)}return e}function X(e,t){if(!E(e))return e;var i=t>0?1:-1;\"undefined\"==typeof t&&(t=0),t=Math.abs(t)>1?1:Math.abs(t),e=c(e);for(var n=I(e),a=0;3>a;a++)n[a]=1===i?n[a]*(1-t)|0:(255-n[a])*t+n[a]|0;return\"rgb(\"+n.join(\",\")+\")\"}function v(e){if(!E(e))return e;var t=I(p(e));return t=C(t,function(e){return 255-e}),V(t,\"rgb\")}function w(e,t,i){if(!E(e)||!E(t))return e;\"undefined\"==typeof i&&(i=.5),i=1-S(i,[0,1]);for(var n=2*i-1,a=I(p(e)),o=I(p(t)),r=a[3]-o[3],s=((n*r===-1?n:(n+r)/(1+n*r))+1)/2,l=1-s,h=[],m=0;3>m;m++)h[m]=a[m]*s+o[m]*l;var U=a[3]*i+o[3]*(1-i);return U=Math.max(0,Math.min(1,U)),1===a[3]&&1===o[3]?V(h,\"rgb\"):(h[3]=U,V(h,\"rgba\"))}function K(){return\"#\"+(Math.random().toString(16)+\"0000\").slice(2,8)}function I(e){e=W(e);var t=e.match(R);if(null===t)throw new Error(\"The color format error\");var i,n,a,o=[];if(t[2])i=t[2].replace(\"#\",\"\").split(\"\"),a=[i[0]+i[1],i[2]+i[3],i[4]+i[5]],o=C(a,function(e){return S(parseInt(e,16),[0,255])});else if(t[4]){var r=t[4].split(\",\");n=r[3],a=r.slice(0,3),o=C(a,function(e){return e=Math.floor(e.indexOf(\"%\")>0?2.55*parseInt(e,0):e),S(e,[0,255])}),\"undefined\"!=typeof n&&o.push(S(parseFloat(n),[0,1]))}else if(t[5]||t[6]){var s=(t[5]||t[6]).split(\",\"),l=parseInt(s[0],0)/360,h=s[1],m=s[2];n=s[3],o=C([h,m],function(e){return S(parseFloat(e)/100,[0,1])}),o.unshift(l),\"undefined\"!=typeof n&&o.push(S(parseFloat(n),[0,1]))}return o}function J(e,t){if(!E(e))return e;null===t&&(t=1);var i=I(p(e));return i[3]=S(Number(t).toFixed(4),[0,1]),V(i,\"rgba\")}function C(e,t){if(\"function\"!=typeof t)throw new TypeError;for(var i=e?e.length:0,n=0;i>n;n++)e[n]=t(e[n]);return e}function S(e,t){return e<=t[0]?e=t[0]:e>=t[1]&&(e=t[1]),e}function E(e){return e instanceof Array||\"string\"==typeof e}function F(e){var t,i,n,a=e[0],o=e[1],r=e[2];if(0===o)t=255*r,i=255*r,n=255*r;else{var s=6*a;6===s&&(s=0);var l=0|s,h=r*(1-o),m=r*(1-o*(s-l)),V=r*(1-o*(1-(s-l))),U=0,d=0,p=0;0===l?(U=r,d=V,p=h):1===l?(U=m,d=r,p=h):2===l?(U=h,d=r,p=V):3===l?(U=h,d=m,p=r):4===l?(U=V,d=h,p=r):(U=r,d=h,p=m),t=255*U,i=255*d,n=255*p}return[t,i,n]}function T(e){var t,i,n,a=e[0],o=e[1],r=e[2];if(0===o)t=255*r,i=255*r,n=255*r;else{var s;s=.5>r?r*(1+o):r+o-o*r;var l=2*r-s;t=255*z(l,s,a+1/3),i=255*z(l,s,a),n=255*z(l,s,a-1/3)}return[t,i,n]}function z(e,t,i){return 0>i&&(i+=1),i>1&&(i-=1),1>6*i?e+6*(t-e)*i:1>2*i?t:2>3*i?e+(t-e)*(2/3-i)*6:e}function A(e){var t,i,n=e[0]/255,a=e[1]/255,o=e[2]/255,r=Math.min(n,a,o),s=Math.max(n,a,o),l=s-r,h=s;if(0===l)t=0,i=0;else{i=l/s;var m=((s-n)/6+l/2)/l,V=((s-a)/6+l/2)/l,U=((s-o)/6+l/2)/l;n===s?t=U-V:a===s?t=1/3+m-U:o===s&&(t=2/3+V-m),0>t&&(t+=1),t>1&&(t-=1)}return t=360*t,i=100*i,h=100*h,[t,i,h]}function M(e){var t,i,n=e[0]/255,a=e[1]/255,o=e[2]/255,r=Math.min(n,a,o),s=Math.max(n,a,o),l=s-r,h=(s+r)/2;if(0===l)t=0,i=0;else{i=.5>h?l/(s+r):l/(2-s-r);var m=((s-n)/6+l/2)/l,V=((s-a)/6+l/2)/l,U=((s-o)/6+l/2)/l;n===s?t=U-V:a===s?t=1/3+m-U:o===s&&(t=2/3+V-m),0>t&&(t+=1),t>1&&(t-=1)}return t=360*t,i=100*i,h=100*h,[t,i,h]}var O,P=e(\"../tool/util\"),D=[\"#ff9277\",\" #dddd00\",\" #ffc877\",\" #bbe3ff\",\" #d5ffbb\",\"#bbbbff\",\" #ddb000\",\" #b0dd00\",\" #e2bbff\",\" #ffbbe3\",\"#ff7777\",\" #ff9900\",\" #83dd00\",\" #77e3ff\",\" #778fff\",\"#c877ff\",\" #ff77ab\",\" #ff6600\",\" #aa8800\",\" #77c7ff\",\"#ad77ff\",\" #ff77ff\",\" #dd0083\",\" #777700\",\" #00aa00\",\"#0088aa\",\" #8400dd\",\" #aa0088\",\" #dd0000\",\" #772e00\"],N=D,B=\"rgba(255,255,0,0.5)\",H=B,R=/^\\s*((#[a-f\\d]{6})|(#[a-f\\d]{3})|rgba?\\(\\s*([\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?(?:\\s*,\\s*[\\d\\.]+%?)?)\\s*\\)|hsba?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?(?:\\s*,\\s*[\\d\\.]+)?)%?\\s*\\)|hsla?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?(?:\\s*,\\s*[\\d\\.]+)?)%?\\s*\\))\\s*$/i,G={aliceblue:\"#f0f8ff\",antiquewhite:\"#faebd7\",aqua:\"#0ff\",aquamarine:\"#7fffd4\",azure:\"#f0ffff\",beige:\"#f5f5dc\",bisque:\"#ffe4c4\",black:\"#000\",blanchedalmond:\"#ffebcd\",blue:\"#00f\",blueviolet:\"#8a2be2\",brown:\"#a52a2a\",burlywood:\"#deb887\",cadetblue:\"#5f9ea0\",chartreuse:\"#7fff00\",chocolate:\"#d2691e\",coral:\"#ff7f50\",cornflowerblue:\"#6495ed\",cornsilk:\"#fff8dc\",crimson:\"#dc143c\",cyan:\"#0ff\",darkblue:\"#00008b\",darkcyan:\"#008b8b\",darkgoldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",darkgrey:\"#a9a9a9\",darkgreen:\"#006400\",darkkhaki:\"#bdb76b\",darkmagenta:\"#8b008b\",darkolivegreen:\"#556b2f\",darkorange:\"#ff8c00\",darkorchid:\"#9932cc\",darkred:\"#8b0000\",darksalmon:\"#e9967a\",darkseagreen:\"#8fbc8f\",darkslateblue:\"#483d8b\",darkslategray:\"#2f4f4f\",darkslategrey:\"#2f4f4f\",darkturquoise:\"#00ced1\",darkviolet:\"#9400d3\",deeppink:\"#ff1493\",deepskyblue:\"#00bfff\",dimgray:\"#696969\",dimgrey:\"#696969\",dodgerblue:\"#1e90ff\",firebrick:\"#b22222\",floralwhite:\"#fffaf0\",forestgreen:\"#228b22\",fuchsia:\"#f0f\",gainsboro:\"#dcdcdc\",ghostwhite:\"#f8f8ff\",gold:\"#ffd700\",goldenrod:\"#daa520\",gray:\"#808080\",grey:\"#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\",lightgray:\"#d3d3d3\",lightgrey:\"#d3d3d3\",lightgreen:\"#90ee90\",lightpink:\"#ffb6c1\",lightsalmon:\"#ffa07a\",lightseagreen:\"#20b2aa\",lightskyblue:\"#87cefa\",lightslategray:\"#789\",lightslategrey:\"#789\",lightsteelblue:\"#b0c4de\",lightyellow:\"#ffffe0\",lime:\"#0f0\",limegreen:\"#32cd32\",linen:\"#faf0e6\",magenta:\"#f0f\",maroon:\"#800000\",mediumaquamarine:\"#66cdaa\",mediumblue:\"#0000cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9370d8\",mediumseagreen:\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumspringgreen:\"#00fa9a\",mediumturquoise:\"#48d1cc\",mediumvioletred:\"#c71585\",midnightblue:\"#191970\",mintcream:\"#f5fffa\",mistyrose:\"#ffe4e1\",moccasin:\"#ffe4b5\",navajowhite:\"#ffdead\",navy:\"#000080\",oldlace:\"#fdf5e6\",olive:\"#808000\",olivedrab:\"#6b8e23\",orange:\"#ffa500\",orangered:\"#ff4500\",orchid:\"#da70d6\",palegoldenrod:\"#eee8aa\",palegreen:\"#98fb98\",paleturquoise:\"#afeeee\",palevioletred:\"#d87093\",papayawhip:\"#ffefd5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pink:\"#ffc0cb\",plum:\"#dda0dd\",powderblue:\"#b0e0e6\",purple:\"#800080\",red:\"#f00\",rosybrown:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebrown:\"#8b4513\",salmon:\"#fa8072\",sandybrown:\"#f4a460\",seagreen:\"#2e8b57\",seashell:\"#fff5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",skyblue:\"#87ceeb\",slateblue:\"#6a5acd\",slategray:\"#708090\",slategrey:\"#708090\",snow:\"#fffafa\",springgreen:\"#00ff7f\",steelblue:\"#4682b4\",tan:\"#d2b48c\",teal:\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff6347\",turquoise:\"#40e0d0\",violet:\"#ee82ee\",wheat:\"#f5deb3\",white:\"#fff\",whitesmoke:\"#f5f5f5\",yellow:\"#ff0\",yellowgreen:\"#9acd32\"};return{customPalette:t,resetPalette:i,getColor:n,getHighlightColor:r,customHighlight:a,resetHighlight:o,getRadialGradient:s,getLinearGradient:l,getGradientColors:m,getStepColors:h,reverse:v,mix:w,lift:X,trim:L,random:K,toRGB:c,toRGBA:p,toHex:u,toHSL:x,toHSLA:k,toHSB:f,toHSBA:b,toHSV:g,toHSVA:y,toName:_,toColor:V,toArray:U,alpha:J,getData:I}}),i(\"echarts/component/timeline\",[\"require\",\"./base\",\"zrender/shape/Rectangle\",\"../util/shape/Icon\",\"../util/shape/Chain\",\"../config\",\"zrender/tool/util\",\"zrender/tool/area\",\"zrender/tool/event\",\"../component\"],function(e){function t(e,t,i,a,o){n.call(this,e,t,i,a,o);var r=this;if(r._onclick=function(e){return r.__onclick(e)},r._ondrift=function(e,t){return r.__ondrift(this,e,t)},r._ondragend=function(){return r.__ondragend()},r._setCurrentOption=function(){var e=r.timelineOption;r.currentIndex%=e.data.length;var t=r.options[r.currentIndex]||{};r.myChart._setOption(t,e.notMerge,!0),r.messageCenter.dispatch(s.EVENT.TIMELINE_CHANGED,null,{currentIndex:r.currentIndex,data:null!=e.data[r.currentIndex].name?e.data[r.currentIndex].name:e.data[r.currentIndex]},r.myChart)},r._onFrame=function(){r._setCurrentOption(),r._syncHandleShape(),r.timelineOption.autoPlay&&(r.playTicket=setTimeout(function(){return r.currentIndex+=1,!r.timelineOption.loop&&r.currentIndex>=r.timelineOption.data.length?(r.currentIndex=r.timelineOption.data.length-1,void r.stop()):void r._onFrame()},r.timelineOption.playInterval))},this.setTheme(!1),this.options=this.option.options,this.currentIndex=this.timelineOption.currentIndex%this.timelineOption.data.length,this.timelineOption.notMerge||0===this.currentIndex||(this.options[this.currentIndex]=l.merge(this.options[this.currentIndex],this.options[0])),this.timelineOption.show&&(this._buildShape(),this._syncHandleShape()),this._setCurrentOption(),this.timelineOption.autoPlay){var r=this;this.playTicket=setTimeout(function(){r.play()},null!=this.ecTheme.animationDuration?this.ecTheme.animationDuration:s.animationDuration)}}function i(e,t){var i=2,n=t.x+i,a=t.y+i+2,r=t.width-i,s=t.height-i,l=t.symbol;if(\"last\"===l)e.moveTo(n+r-2,a+s/3),e.lineTo(n+r-2,a),e.lineTo(n+2,a+s/2),e.lineTo(n+r-2,a+s),e.lineTo(n+r-2,a+s/3*2),e.moveTo(n,a),e.lineTo(n,a);else if(\"next\"===l)e.moveTo(n+2,a+s/3),e.lineTo(n+2,a),e.lineTo(n+r-2,a+s/2),e.lineTo(n+2,a+s),e.lineTo(n+2,a+s/3*2),e.moveTo(n,a),e.lineTo(n,a);else if(\"play\"===l)if(\"stop\"===t.status)e.moveTo(n+2,a),e.lineTo(n+r-2,a+s/2),e.lineTo(n+2,a+s),e.lineTo(n+2,a);else{var h=\"both\"===t.brushType?2:3;e.rect(n+2,a,h,s),e.rect(n+r-h-2,a,h,s)}else if(l.match(\"image\")){var m=\"\";m=l.replace(new RegExp(\"^image:\\\\/\\\\/\"),\"\"),l=o.prototype.iconLibrary.image,l(e,{x:n,y:a,width:r,height:s,image:m})}}var n=e(\"./base\"),a=e(\"zrender/shape/Rectangle\"),o=e(\"../util/shape/Icon\"),r=e(\"../util/shape/Chain\"),s=e(\"../config\");s.timeline={zlevel:0,z:4,show:!0,type:\"time\",notMerge:!1,realtime:!0,x:80,x2:80,y2:0,height:50,backgroundColor:\"rgba(0,0,0,0)\",borderColor:\"#ccc\",borderWidth:0,padding:5,controlPosition:\"left\",autoPlay:!1,loop:!0,playInterval:2e3,lineStyle:{width:1,color:\"#666\",type:\"dashed\"},label:{show:!0,interval:\"auto\",rotate:0,textStyle:{color:\"#333\"}},checkpointStyle:{symbol:\"auto\",symbolSize:\"auto\",color:\"auto\",borderColor:\"auto\",borderWidth:\"auto\",label:{show:!1,textStyle:{color:\"auto\"}}},controlStyle:{itemSize:15,itemGap:5,normal:{color:\"#333\"},emphasis:{color:\"#1e90ff\"}},symbol:\"emptyDiamond\",symbolSize:4,currentIndex:0};var l=e(\"zrender/tool/util\"),h=e(\"zrender/tool/area\"),m=e(\"zrender/tool/event\");return t.prototype={type:s.COMPONENT_TYPE_TIMELINE,_buildShape:function(){if(this._location=this._getLocation(),this._buildBackground(),this._buildControl(),this._chainPoint=this._getChainPoint(),this.timelineOption.label.show)for(var e=this._getInterval(),t=0,i=this._chainPoint.length;i>t;t+=e)this._chainPoint[t].showLabel=!0;this._buildChain(),this._buildHandle();for(var t=0,n=this.shapeList.length;n>t;t++)this.zr.addShape(this.shapeList[t])},_getLocation:function(){var e,t=this.timelineOption,i=this.reformCssArray(this.timelineOption.padding),n=this.zr.getWidth(),a=this.parsePercent(t.x,n),o=this.parsePercent(t.x2,n);null==t.width?(e=n-a-o,o=n-o):(e=this.parsePercent(t.width,n),o=a+e);var r,s,l=this.zr.getHeight(),h=this.parsePercent(t.height,l);return null!=t.y?(r=this.parsePercent(t.y,l),s=r+h):(s=l-this.parsePercent(t.y2,l),r=s-h),{x:a+i[3],y:r+i[0],x2:o-i[1],y2:s-i[2],width:e-i[1]-i[3],height:h-i[0]-i[2]}},_getReformedLabel:function(e){var t=this.timelineOption,i=null!=t.data[e].name?t.data[e].name:t.data[e],n=t.data[e].formatter||t.label.formatter;return n&&(\"function\"==typeof n?i=n.call(this.myChart,i):\"string\"==typeof n&&(i=n.replace(\"{value}\",i))),i},_getInterval:function(){var e=this._chainPoint,t=this.timelineOption,i=t.label.interval;if(\"auto\"===i){var n=t.label.textStyle.fontSize,a=t.data,o=t.data.length;if(o>3){var r,s,l=!1;for(i=0;!l&&o>i;){i++,l=!0;for(var m=i;o>m;m+=i){if(r=e[m].x-e[m-i].x,0!==t.label.rotate)s=n;else if(a[m].textStyle)s=h.getTextWidth(e[m].name,e[m].textFont);else{var V=e[m].name+\"\",U=(V.match(/\\w/g)||\"\").length,d=V.length-U;s=U*n*2/3+d*n}if(s>r){l=!1;break}}}}else i=1}else i=i-0+1;return i},_getChainPoint:function(){function e(e){return null!=h[e].name?h[e].name:h[e]+\"\"}var t,i=this.timelineOption,n=i.symbol.toLowerCase(),a=i.symbolSize,o=i.label.rotate,r=i.label.textStyle,s=this.getFont(r),h=i.data,m=this._location.x,V=this._location.y+this._location.height/4*3,U=this._location.x2-this._location.x,d=h.length,p=[];if(d>1){var c=U/d;if(c=c>50?50:20>c?5:c,U-=2*c,\"number\"===i.type)for(var u=0;d>u;u++)p.push(m+c+U/(d-1)*u);else{p[0]=new Date(e(0).replace(/-/g,\"/\")),p[d-1]=new Date(e(d-1).replace(/-/g,\"/\"))-p[0];for(var u=1;d>u;u++)p[u]=m+c+U*(new Date(e(u).replace(/-/g,\"/\"))-p[0])/p[d-1];p[0]=m+c}}else p.push(m+U/2);for(var y,g,b,f,k,x=[],u=0;d>u;u++)m=p[u],y=h[u].symbol&&h[u].symbol.toLowerCase()||n,y.match(\"empty\")?(y=y.replace(\"empty\",\"\"),b=!0):b=!1,y.match(\"star\")&&(g=y.replace(\"star\",\"\")-0||5,y=\"star\"),t=h[u].textStyle?l.merge(h[u].textStyle||{},r):r,f=t.align||\"center\",o?(f=o>0?\"right\":\"left\",k=[o*Math.PI/180,m,V-5]):k=!1,x.push({x:m,n:g,isEmpty:b,symbol:y,symbolSize:h[u].symbolSize||a,color:h[u].color,borderColor:h[u].borderColor,borderWidth:h[u].borderWidth,name:this._getReformedLabel(u),textColor:t.color,textAlign:f,textBaseline:t.baseline||\"middle\",textX:m,textY:V-(o?5:0),textFont:h[u].textStyle?this.getFont(t):s,rotation:k,showLabel:!1});return x},_buildBackground:function(){var e=this.timelineOption,t=this.reformCssArray(this.timelineOption.padding),i=this._location.width,n=this._location.height;(0!==e.borderWidth||\"rgba(0,0,0,0)\"!=e.backgroundColor.replace(/\\s/g,\"\"))&&this.shapeList.push(new a({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._location.x-t[3],y:this._location.y-t[0],width:i+t[1]+t[3],height:n+t[0]+t[2],brushType:0===e.borderWidth?\"fill\":\"both\",color:e.backgroundColor,strokeColor:e.borderColor,lineWidth:e.borderWidth}}))},_buildControl:function(){var e=this,t=this.timelineOption,i=t.lineStyle,n=t.controlStyle;if(\"none\"!==t.controlPosition){var a,r=n.itemSize,s=n.itemGap;\"left\"===t.controlPosition?(a=this._location.x,this._location.x+=3*(r+s)):(a=this._location.x2-(3*(r+s)-s),this._location.x2-=3*(r+s));var h=this._location.y,m={zlevel:this.getZlevelBase(),z:this.getZBase()+1,style:{iconType:\"timelineControl\",symbol:\"last\",x:a,y:h,width:r,height:r,brushType:\"stroke\",color:n.normal.color,strokeColor:n.normal.color,lineWidth:i.width},highlightStyle:{color:n.emphasis.color,strokeColor:n.emphasis.color,lineWidth:i.width+1},clickable:!0};this._ctrLastShape=new o(m),this._ctrLastShape.onclick=function(){e.last()},this.shapeList.push(this._ctrLastShape),a+=r+s,this._ctrPlayShape=new o(l.clone(m)),this._ctrPlayShape.style.brushType=\"fill\",this._ctrPlayShape.style.symbol=\"play\",this._ctrPlayShape.style.status=this.timelineOption.autoPlay?\"playing\":\"stop\",this._ctrPlayShape.style.x=a,this._ctrPlayShape.onclick=function(){\"stop\"===e._ctrPlayShape.style.status?e.play():e.stop()},this.shapeList.push(this._ctrPlayShape),a+=r+s,this._ctrNextShape=new o(l.clone(m)),this._ctrNextShape.style.symbol=\"next\",this._ctrNextShape.style.x=a,this._ctrNextShape.onclick=function(){e.next()},this.shapeList.push(this._ctrNextShape)}},_buildChain:function(){var e=this.timelineOption,t=e.lineStyle;this._timelineShae={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:this._location.x,y:this.subPixelOptimize(this._location.y,t.width),width:this._location.x2-this._location.x,height:this._location.height,chainPoint:this._chainPoint,brushType:\"both\",strokeColor:t.color,lineWidth:t.width,lineType:t.type},hoverable:!1,clickable:!0,onclick:this._onclick},this._timelineShae=new r(this._timelineShae),this.shapeList.push(this._timelineShae)},_buildHandle:function(){var e=this._chainPoint[this.currentIndex],t=e.symbolSize+1;t=5>t?5:t,this._handleShape={zlevel:this.getZlevelBase(),z:this.getZBase()+1,hoverable:!1,draggable:!0,style:{iconType:\"diamond\",n:e.n,x:e.x-t,y:this._location.y+this._location.height/4-t,width:2*t,height:2*t,brushType:\"both\",textPosition:\"specific\",textX:e.x,textY:this._location.y-this._location.height/4,textAlign:\"center\",textBaseline:\"middle\"},highlightStyle:{},ondrift:this._ondrift,ondragend:this._ondragend},this._handleShape=new o(this._handleShape),this.shapeList.push(this._handleShape)},_syncHandleShape:function(){if(this.timelineOption.show){var e=this.timelineOption,t=e.checkpointStyle,i=this._chainPoint[this.currentIndex];this._handleShape.style.text=t.label.show?i.name:\"\",this._handleShape.style.textFont=i.textFont,this._handleShape.style.n=i.n,\"auto\"===t.symbol?this._handleShape.style.iconType=\"none\"!=i.symbol?i.symbol:\"diamond\":(this._handleShape.style.iconType=t.symbol,t.symbol.match(\"star\")&&(this._handleShape.style.n=t.symbol.replace(\"star\",\"\")-0||5,this._handleShape.style.iconType=\"star\"));var n;\"auto\"===t.symbolSize?(n=i.symbolSize+2,n=5>n?5:n):n=t.symbolSize-0,this._handleShape.style.color=\"auto\"===t.color?i.color?i.color:e.controlStyle.emphasis.color:t.color,this._handleShape.style.textColor=\"auto\"===t.label.textStyle.color?this._handleShape.style.color:t.label.textStyle.color,this._handleShape.highlightStyle.strokeColor=this._handleShape.style.strokeColor=\"auto\"===t.borderColor?i.borderColor?i.borderColor:\"#fff\":t.borderColor,this._handleShape.style.lineWidth=\"auto\"===t.borderWidth?i.borderWidth?i.borderWidth:0:t.borderWidth-0,this._handleShape.highlightStyle.lineWidth=this._handleShape.style.lineWidth+1,this.zr.animate(this._handleShape.id,\"style\").when(500,{x:i.x-n,textX:i.x,y:this._location.y+this._location.height/4-n,width:2*n,height:2*n}).start(\"ExponentialOut\")}},_findChainIndex:function(e){var t=this._chainPoint,i=t.length;if(e<=t[0].x)return 0;if(e>=t[i-1].x)return i-1;for(var n=0;i-1>n;n++)if(e>=t[n].x&&e<=t[n+1].x)return Math.abs(e-t[n].x)<Math.abs(e-t[n+1].x)?n:n+1},__onclick:function(e){var t=m.getX(e.event),i=this._findChainIndex(t);return i===this.currentIndex?!0:(this.currentIndex=i,this.timelineOption.autoPlay&&this.stop(),clearTimeout(this.playTicket),void this._onFrame())},__ondrift:function(e,t){this.timelineOption.autoPlay&&this.stop();var i,n=this._chainPoint,a=n.length;e.style.x+t<=n[0].x-n[0].symbolSize?(e.style.x=n[0].x-n[0].symbolSize,i=0):e.style.x+t>=n[a-1].x-n[a-1].symbolSize?(e.style.x=n[a-1].x-n[a-1].symbolSize,i=a-1):(e.style.x+=t,i=this._findChainIndex(e.style.x));var o=n[i],r=o.symbolSize+2;if(e.style.iconType=o.symbol,e.style.n=o.n,e.style.textX=e.style.x+r/2,e.style.y=this._location.y+this._location.height/4-r,e.style.width=2*r,e.style.height=2*r,e.style.text=o.name,i===this.currentIndex)return!0;if(this.currentIndex=i,this.timelineOption.realtime){clearTimeout(this.playTicket);var s=this;this.playTicket=setTimeout(function(){s._setCurrentOption()},200)}return!0},__ondragend:function(){this.isDragend=!0},ondragend:function(e,t){this.isDragend&&e.target&&(!this.timelineOption.realtime&&this._setCurrentOption(),t.dragOut=!0,t.dragIn=!0,t.needRefresh=!1,this.isDragend=!1,this._syncHandleShape())},last:function(){return this.timelineOption.autoPlay&&this.stop(),this.currentIndex-=1,this.currentIndex<0&&(this.currentIndex=this.timelineOption.data.length-1),this._onFrame(),this.currentIndex},next:function(){return this.timelineOption.autoPlay&&this.stop(),this.currentIndex+=1,this.currentIndex>=this.timelineOption.data.length&&(this.currentIndex=0),this._onFrame(),this.currentIndex},play:function(e,t){return this._ctrPlayShape&&\"playing\"!=this._ctrPlayShape.style.status&&(this._ctrPlayShape.style.status=\"playing\",this.zr.modShape(this._ctrPlayShape.id),this.zr.refreshNextFrame()),this.timelineOption.autoPlay=null!=t?t:!0,this.timelineOption.autoPlay||clearTimeout(this.playTicket),this.currentIndex=null!=e?e:this.currentIndex+1,this.currentIndex>=this.timelineOption.data.length&&(this.currentIndex=0),this._onFrame(),this.currentIndex},stop:function(){return this._ctrPlayShape&&\"stop\"!=this._ctrPlayShape.style.status&&(this._ctrPlayShape.style.status=\"stop\",this.zr.modShape(this._ctrPlayShape.id),this.zr.refreshNextFrame()),this.timelineOption.autoPlay=!1,clearTimeout(this.playTicket),this.currentIndex},resize:function(){this.timelineOption.show&&(this.clear(),this._buildShape(),this._syncHandleShape())},setTheme:function(e){this.timelineOption=this.reformOption(l.clone(this.option.timeline)),this.timelineOption.label.textStyle=this.getTextStyle(this.timelineOption.label.textStyle),this.timelineOption.checkpointStyle.label.textStyle=this.getTextStyle(this.timelineOption.checkpointStyle.label.textStyle),this.myChart.canvasSupported||(this.timelineOption.realtime=!1),this.timelineOption.show&&e&&(this.clear(),this._buildShape(),this._syncHandleShape())},onbeforDispose:function(){clearTimeout(this.playTicket)}},o.prototype.iconLibrary.timelineControl=i,l.inherits(t,n),e(\"../component\").define(\"timeline\",t),t}),i(\"zrender/shape/Image\",[\"require\",\"./Base\",\"../tool/util\"],function(e){var t=e(\"./Base\"),i=function(e){t.call(this,e)};return i.prototype={type:\"image\",brush:function(e,t,i){var n=this.style||{};t&&(n=this.getHighlightStyle(n,this.highlightStyle||{}));var a=n.image,o=this;if(this._imageCache||(this._imageCache={}),\"string\"==typeof a){var r=a;this._imageCache[r]?a=this._imageCache[r]:(a=new Image,a.onload=function(){a.onload=null,o.modSelf(),i()},a.src=r,this._imageCache[r]=a)}if(a){if(\"IMG\"==a.nodeName.toUpperCase())if(window.ActiveXObject){if(\"complete\"!=a.readyState)return}else if(!a.complete)return;var s=n.width||a.width,l=n.height||a.height,h=n.x,m=n.y;if(!a.width||!a.height)return;if(e.save(),this.doClip(e),this.setContext(e,n),this.setTransform(e),n.sWidth&&n.sHeight){var V=n.sx||0,U=n.sy||0;e.drawImage(a,V,U,n.sWidth,n.sHeight,h,m,s,l)}else if(n.sx&&n.sy){var V=n.sx,U=n.sy,d=s-V,p=l-U;e.drawImage(a,V,U,d,p,h,m,s,l)}else e.drawImage(a,h,m,s,l);n.width||(n.width=s),n.height||(n.height=l),this.style.width||(this.style.width=s),this.style.height||(this.style.height=l),this.drawText(e,n,this.style),e.restore()}},getRect:function(e){return{x:e.x,y:e.y,width:e.width,height:e.height}},clearCache:function(){this._imageCache={}}},e(\"../tool/util\").inherits(i,t),i}),i(\"zrender/loadingEffect/Bar\",[\"require\",\"./Base\",\"../tool/util\",\"../tool/color\",\"../shape/Rectangle\"],function(e){function t(e){i.call(this,e)}var i=e(\"./Base\"),n=e(\"../tool/util\"),a=e(\"../tool/color\"),o=e(\"../shape/Rectangle\");return n.inherits(t,i),t.prototype._start=function(e,t){var i=n.merge(this.options,{textStyle:{color:\"#888\"},backgroundColor:\"rgba(250, 250, 250, 0.8)\",effectOption:{x:0,y:this.canvasHeight/2-30,width:this.canvasWidth,height:5,brushType:\"fill\",timeInterval:100}}),r=this.createTextShape(i.textStyle),s=this.createBackgroundShape(i.backgroundColor),l=i.effectOption,h=new o({highlightStyle:n.clone(l)});return h.highlightStyle.color=l.color||a.getLinearGradient(l.x,l.y,l.x+l.width,l.y+l.height,[[0,\"#ff6400\"],[.5,\"#ffe100\"],[1,\"#b1ff00\"]]),null!=i.progress?(e(s),h.highlightStyle.width=this.adjust(i.progress,[0,1])*i.effectOption.width,e(h),e(r),void t()):(h.highlightStyle.width=0,setInterval(function(){e(s),h.highlightStyle.width<l.width?h.highlightStyle.width+=8:h.highlightStyle.width=0,e(h),e(r),t()},l.timeInterval))},t}),i(\"zrender/loadingEffect/Bubble\",[\"require\",\"./Base\",\"../tool/util\",\"../tool/color\",\"../shape/Circle\"],function(e){function t(e){i.call(this,e)}var i=e(\"./Base\"),n=e(\"../tool/util\"),a=e(\"../tool/color\"),o=e(\"../shape/Circle\");return n.inherits(t,i),t.prototype._start=function(e,t){for(var i=n.merge(this.options,{textStyle:{color:\"#888\"},backgroundColor:\"rgba(250, 250, 250, 0.8)\",effect:{n:50,lineWidth:2,brushType:\"stroke\",color:\"random\",timeInterval:100}}),r=this.createTextShape(i.textStyle),s=this.createBackgroundShape(i.backgroundColor),l=i.effect,h=l.n,m=l.brushType,V=l.lineWidth,U=[],d=this.canvasWidth,p=this.canvasHeight,c=0;h>c;c++){var u=\"random\"==l.color?a.alpha(a.random(),.3):l.color;U[c]=new o({highlightStyle:{x:Math.ceil(Math.random()*d),y:Math.ceil(Math.random()*p),r:Math.ceil(40*Math.random()),brushType:m,color:u,strokeColor:u,lineWidth:V},animationY:Math.ceil(20*Math.random())})}return setInterval(function(){e(s);for(var i=0;h>i;i++){var n=U[i].highlightStyle;n.y-U[i].animationY+n.r<=0&&(U[i].highlightStyle.y=p+n.r,U[i].highlightStyle.x=Math.ceil(Math.random()*d)),U[i].highlightStyle.y-=U[i].animationY,e(U[i])}e(r),t()},l.timeInterval)},t}),i(\"zrender/loadingEffect/DynamicLine\",[\"require\",\"./Base\",\"../tool/util\",\"../tool/color\",\"../shape/Line\"],function(e){function t(e){i.call(this,e)}var i=e(\"./Base\"),n=e(\"../tool/util\"),a=e(\"../tool/color\"),o=e(\"../shape/Line\");return n.inherits(t,i),t.prototype._start=function(e,t){for(var i=n.merge(this.options,{textStyle:{color:\"#fff\"},backgroundColor:\"rgba(0, 0, 0, 0.8)\",effectOption:{n:30,lineWidth:1,color:\"random\",timeInterval:100}}),r=this.createTextShape(i.textStyle),s=this.createBackgroundShape(i.backgroundColor),l=i.effectOption,h=l.n,m=l.lineWidth,V=[],U=this.canvasWidth,d=this.canvasHeight,p=0;h>p;p++){var c=-Math.ceil(1e3*Math.random()),u=Math.ceil(400*Math.random()),y=Math.ceil(Math.random()*d),g=\"random\"==l.color?a.random():l.color;V[p]=new o({highlightStyle:{xStart:c,yStart:y,xEnd:c+u,yEnd:y,strokeColor:g,lineWidth:m},animationX:Math.ceil(100*Math.random()),len:u})}return setInterval(function(){e(s);for(var i=0;h>i;i++){var n=V[i].highlightStyle;n.xStart>=U&&(V[i].len=Math.ceil(400*Math.random()),n.xStart=-400,n.xEnd=-400+V[i].len,n.yStart=Math.ceil(Math.random()*d),n.yEnd=n.yStart),n.xStart+=V[i].animationX,n.xEnd+=V[i].animationX,e(V[i])}e(r),t()},l.timeInterval)},t}),i(\"zrender/loadingEffect/Ring\",[\"require\",\"./Base\",\"../tool/util\",\"../tool/color\",\"../shape/Ring\",\"../shape/Sector\"],function(e){function t(e){i.call(this,e)}var i=e(\"./Base\"),n=e(\"../tool/util\"),a=e(\"../tool/color\"),o=e(\"../shape/Ring\"),r=e(\"../shape/Sector\");return n.inherits(t,i),t.prototype._start=function(e,t){var i=n.merge(this.options,{textStyle:{color:\"#07a\"},backgroundColor:\"rgba(250, 250, 250, 0.8)\",effect:{x:this.canvasWidth/2,y:this.canvasHeight/2,r0:60,r:100,color:\"#bbdcff\",brushType:\"fill\",textPosition:\"inside\",textFont:\"normal 30px verdana\",textColor:\"rgba(30, 144, 255, 0.6)\",timeInterval:100}}),s=i.effect,l=i.textStyle;\n\nnull==l.x&&(l.x=s.x),null==l.y&&(l.y=s.y+(s.r0+s.r)/2-5);for(var h=this.createTextShape(i.textStyle),m=this.createBackgroundShape(i.backgroundColor),V=s.x,U=s.y,d=s.r0+6,p=s.r-6,c=s.color,u=a.lift(c,.1),y=new o({highlightStyle:n.clone(s)}),g=[],b=a.getGradientColors([\"#ff6400\",\"#ffe100\",\"#97ff00\"],25),f=15,k=240,x=0;16>x;x++)g.push(new r({highlightStyle:{x:V,y:U,r0:d,r:p,startAngle:k-f,endAngle:k,brushType:\"fill\",color:u},_color:a.getLinearGradient(V+d*Math.cos(k,!0),U-d*Math.sin(k,!0),V+d*Math.cos(k-f,!0),U-d*Math.sin(k-f,!0),[[0,b[2*x]],[1,b[2*x+1]]])})),k-=f;k=360;for(var x=0;4>x;x++)g.push(new r({highlightStyle:{x:V,y:U,r0:d,r:p,startAngle:k-f,endAngle:k,brushType:\"fill\",color:u},_color:a.getLinearGradient(V+d*Math.cos(k,!0),U-d*Math.sin(k,!0),V+d*Math.cos(k-f,!0),U-d*Math.sin(k-f,!0),[[0,b[2*x+32]],[1,b[2*x+33]]])})),k-=f;var _=0;if(null!=i.progress){e(m),_=100*this.adjust(i.progress,[0,1]).toFixed(2)/5,y.highlightStyle.text=5*_+\"%\",e(y);for(var x=0;20>x;x++)g[x].highlightStyle.color=_>x?g[x]._color:u,e(g[x]);return e(h),void t()}return setInterval(function(){e(m),_+=_>=20?-20:1,e(y);for(var i=0;20>i;i++)g[i].highlightStyle.color=_>i?g[i]._color:u,e(g[i]);e(h),t()},s.timeInterval)},t}),i(\"zrender/loadingEffect/Spin\",[\"require\",\"./Base\",\"../tool/util\",\"../tool/color\",\"../tool/area\",\"../shape/Sector\"],function(e){function t(e){i.call(this,e)}var i=e(\"./Base\"),n=e(\"../tool/util\"),a=e(\"../tool/color\"),o=e(\"../tool/area\"),r=e(\"../shape/Sector\");return n.inherits(t,i),t.prototype._start=function(e,t){var i=n.merge(this.options,{textStyle:{color:\"#fff\",textAlign:\"start\"},backgroundColor:\"rgba(0, 0, 0, 0.8)\"}),s=this.createTextShape(i.textStyle),l=10,h=o.getTextWidth(s.highlightStyle.text,s.highlightStyle.textFont),m=o.getTextHeight(s.highlightStyle.text,s.highlightStyle.textFont),V=n.merge(this.options.effect||{},{r0:9,r:15,n:18,color:\"#fff\",timeInterval:100}),U=this.getLocation(this.options.textStyle,h+l+2*V.r,Math.max(2*V.r,m));V.x=U.x+V.r,V.y=s.highlightStyle.y=U.y+U.height/2,s.highlightStyle.x=V.x+V.r+l;for(var d=this.createBackgroundShape(i.backgroundColor),p=V.n,c=V.x,u=V.y,y=V.r0,g=V.r,b=V.color,f=[],k=Math.round(180/p),x=0;p>x;x++)f[x]=new r({highlightStyle:{x:c,y:u,r0:y,r:g,startAngle:k*x*2,endAngle:k*x*2+k,color:a.alpha(b,(x+1)/p),brushType:\"fill\"}});var _=[0,c,u];return setInterval(function(){e(d),_[0]-=.3;for(var i=0;p>i;i++)f[i].rotation=_,e(f[i]);e(s),t()},V.timeInterval)},t}),i(\"zrender/loadingEffect/Whirling\",[\"require\",\"./Base\",\"../tool/util\",\"../tool/area\",\"../shape/Ring\",\"../shape/Droplet\",\"../shape/Circle\"],function(e){function t(e){i.call(this,e)}var i=e(\"./Base\"),n=e(\"../tool/util\"),a=e(\"../tool/area\"),o=e(\"../shape/Ring\"),r=e(\"../shape/Droplet\"),s=e(\"../shape/Circle\");return n.inherits(t,i),t.prototype._start=function(e,t){var i=n.merge(this.options,{textStyle:{color:\"#888\",textAlign:\"start\"},backgroundColor:\"rgba(250, 250, 250, 0.8)\"}),l=this.createTextShape(i.textStyle),h=10,m=a.getTextWidth(l.highlightStyle.text,l.highlightStyle.textFont),V=a.getTextHeight(l.highlightStyle.text,l.highlightStyle.textFont),U=n.merge(this.options.effect||{},{r:18,colorIn:\"#fff\",colorOut:\"#555\",colorWhirl:\"#6cf\",timeInterval:50}),d=this.getLocation(this.options.textStyle,m+h+2*U.r,Math.max(2*U.r,V));U.x=d.x+U.r,U.y=l.highlightStyle.y=d.y+d.height/2,l.highlightStyle.x=U.x+U.r+h;var p=this.createBackgroundShape(i.backgroundColor),c=new r({highlightStyle:{a:Math.round(U.r/2),b:Math.round(U.r-U.r/6),brushType:\"fill\",color:U.colorWhirl}}),u=new s({highlightStyle:{r:Math.round(U.r/6),brushType:\"fill\",color:U.colorIn}}),y=new o({highlightStyle:{r0:Math.round(U.r-U.r/3),r:U.r,brushType:\"fill\",color:U.colorOut}}),g=[0,U.x,U.y];return c.highlightStyle.x=u.highlightStyle.x=y.highlightStyle.x=g[1],c.highlightStyle.y=u.highlightStyle.y=y.highlightStyle.y=g[2],setInterval(function(){e(p),e(y),g[0]-=.3,c.rotation=g,e(c),e(u),e(l),t()},U.timeInterval)},t}),i(\"echarts/theme/macarons\",[],function(){var e={color:[\"#2ec7c9\",\"#b6a2de\",\"#5ab1ef\",\"#ffb980\",\"#d87a80\",\"#8d98b3\",\"#e5cf0d\",\"#97b552\",\"#95706d\",\"#dc69aa\",\"#07a2a4\",\"#9a7fd1\",\"#588dd5\",\"#f5994e\",\"#c05050\",\"#59678c\",\"#c9ab00\",\"#7eb00a\",\"#6f5553\",\"#c14089\"],title:{textStyle:{fontWeight:\"normal\",color:\"#008acd\"}},dataRange:{itemWidth:15,color:[\"#5ab1ef\",\"#e0ffff\"]},toolbox:{color:[\"#1e90ff\",\"#1e90ff\",\"#1e90ff\",\"#1e90ff\"],effectiveColor:\"#ff4500\"},tooltip:{backgroundColor:\"rgba(50,50,50,0.5)\",axisPointer:{type:\"line\",lineStyle:{color:\"#008acd\"},crossStyle:{color:\"#008acd\"},shadowStyle:{color:\"rgba(200,200,200,0.2)\"}}},dataZoom:{dataBackgroundColor:\"#efefff\",fillerColor:\"rgba(182,162,222,0.2)\",handleColor:\"#008acd\"},grid:{borderColor:\"#eee\"},categoryAxis:{axisLine:{lineStyle:{color:\"#008acd\"}},splitLine:{lineStyle:{color:[\"#eee\"]}}},valueAxis:{axisLine:{lineStyle:{color:\"#008acd\"}},splitArea:{show:!0,areaStyle:{color:[\"rgba(250,250,250,0.1)\",\"rgba(200,200,200,0.1)\"]}},splitLine:{lineStyle:{color:[\"#eee\"]}}},polar:{axisLine:{lineStyle:{color:\"#ddd\"}},splitArea:{show:!0,areaStyle:{color:[\"rgba(250,250,250,0.2)\",\"rgba(200,200,200,0.2)\"]}},splitLine:{lineStyle:{color:\"#ddd\"}}},timeline:{lineStyle:{color:\"#008acd\"},controlStyle:{normal:{color:\"#008acd\"},emphasis:{color:\"#008acd\"}},symbol:\"emptyCircle\",symbolSize:3},bar:{itemStyle:{normal:{barBorderRadius:5},emphasis:{barBorderRadius:5}}},line:{smooth:!0,symbol:\"emptyCircle\",symbolSize:3},k:{itemStyle:{normal:{color:\"#d87a80\",color0:\"#2ec7c9\",lineStyle:{color:\"#d87a80\",color0:\"#2ec7c9\"}}}},scatter:{symbol:\"circle\",symbolSize:4},radar:{symbol:\"emptyCircle\",symbolSize:3},map:{itemStyle:{normal:{areaStyle:{color:\"#ddd\"},label:{textStyle:{color:\"#d87a80\"}}},emphasis:{areaStyle:{color:\"#fe994e\"}}}},force:{itemStyle:{normal:{linkStyle:{color:\"#1e90ff\"}}}},chord:{itemStyle:{normal:{borderWidth:1,borderColor:\"rgba(128, 128, 128, 0.5)\",chordStyle:{lineStyle:{color:\"rgba(128, 128, 128, 0.5)\"}}},emphasis:{borderWidth:1,borderColor:\"rgba(128, 128, 128, 0.5)\",chordStyle:{lineStyle:{color:\"rgba(128, 128, 128, 0.5)\"}}}}},gauge:{axisLine:{lineStyle:{color:[[.2,\"#2ec7c9\"],[.8,\"#5ab1ef\"],[1,\"#d87a80\"]],width:10}},axisTick:{splitNumber:10,length:15,lineStyle:{color:\"auto\"}},splitLine:{length:22,lineStyle:{color:\"auto\"}},pointer:{width:5}},textStyle:{fontFamily:\"微软雅黑, Arial, Verdana, sans-serif\"}};return e}),i(\"echarts/theme/infographic\",[],function(){var e={color:[\"#C1232B\",\"#B5C334\",\"#FCCE10\",\"#E87C25\",\"#27727B\",\"#FE8463\",\"#9BCA63\",\"#FAD860\",\"#F3A43B\",\"#60C0DD\",\"#D7504B\",\"#C6E579\",\"#F4E001\",\"#F0805A\",\"#26C0C0\"],title:{textStyle:{fontWeight:\"normal\",color:\"#27727B\"}},dataRange:{x:\"right\",y:\"center\",itemWidth:5,itemHeight:25,color:[\"#C1232B\",\"#FCCE10\"]},toolbox:{color:[\"#C1232B\",\"#B5C334\",\"#FCCE10\",\"#E87C25\",\"#27727B\",\"#FE8463\",\"#9BCA63\",\"#FAD860\",\"#F3A43B\",\"#60C0DD\"],effectiveColor:\"#ff4500\"},tooltip:{backgroundColor:\"rgba(50,50,50,0.5)\",axisPointer:{type:\"line\",lineStyle:{color:\"#27727B\",type:\"dashed\"},crossStyle:{color:\"#27727B\"},shadowStyle:{color:\"rgba(200,200,200,0.3)\"}}},dataZoom:{dataBackgroundColor:\"rgba(181,195,52,0.3)\",fillerColor:\"rgba(181,195,52,0.2)\",handleColor:\"#27727B\"},grid:{borderWidth:0},categoryAxis:{axisLine:{lineStyle:{color:\"#27727B\"}},splitLine:{show:!1}},valueAxis:{axisLine:{show:!1},splitArea:{show:!1},splitLine:{lineStyle:{color:[\"#ccc\"],type:\"dashed\"}}},polar:{axisLine:{lineStyle:{color:\"#ddd\"}},splitArea:{show:!0,areaStyle:{color:[\"rgba(250,250,250,0.2)\",\"rgba(200,200,200,0.2)\"]}},splitLine:{lineStyle:{color:\"#ddd\"}}},timeline:{lineStyle:{color:\"#27727B\"},controlStyle:{normal:{color:\"#27727B\"},emphasis:{color:\"#27727B\"}},symbol:\"emptyCircle\",symbolSize:3},line:{itemStyle:{normal:{borderWidth:2,borderColor:\"#fff\",lineStyle:{width:3}},emphasis:{borderWidth:0}},symbol:\"circle\",symbolSize:3.5},k:{itemStyle:{normal:{color:\"#C1232B\",color0:\"#B5C334\",lineStyle:{width:1,color:\"#C1232B\",color0:\"#B5C334\"}}}},scatter:{itemStyle:{normal:{borderWidth:1,borderColor:\"rgba(200,200,200,0.5)\"},emphasis:{borderWidth:0}},symbol:\"star4\",symbolSize:4},radar:{symbol:\"emptyCircle\",symbolSize:3},map:{itemStyle:{normal:{areaStyle:{color:\"#ddd\"},label:{textStyle:{color:\"#C1232B\"}}},emphasis:{areaStyle:{color:\"#fe994e\"},label:{textStyle:{color:\"rgb(100,0,0)\"}}}}},force:{itemStyle:{normal:{linkStyle:{color:\"#27727B\"}}}},chord:{itemStyle:{normal:{borderWidth:1,borderColor:\"rgba(128, 128, 128, 0.5)\",chordStyle:{lineStyle:{color:\"rgba(128, 128, 128, 0.5)\"}}},emphasis:{borderWidth:1,borderColor:\"rgba(128, 128, 128, 0.5)\",chordStyle:{lineStyle:{color:\"rgba(128, 128, 128, 0.5)\"}}}}},gauge:{center:[\"50%\",\"80%\"],radius:\"100%\",startAngle:180,endAngle:0,axisLine:{show:!0,lineStyle:{color:[[.2,\"#B5C334\"],[.8,\"#27727B\"],[1,\"#C1232B\"]],width:\"40%\"}},axisTick:{splitNumber:2,length:5,lineStyle:{color:\"#fff\"}},axisLabel:{textStyle:{color:\"#fff\",fontWeight:\"bolder\"}},splitLine:{length:\"5%\",lineStyle:{color:\"#fff\"}},pointer:{width:\"40%\",length:\"80%\",color:\"#fff\"},title:{offsetCenter:[0,-20],textStyle:{color:\"auto\",fontSize:20}},detail:{offsetCenter:[0,0],textStyle:{color:\"auto\",fontSize:40}}},textStyle:{fontFamily:\"微软雅黑, Arial, Verdana, sans-serif\"}};return e}),i(\"zrender/dep/excanvas\",[\"require\"],function(){return document.createElement(\"canvas\").getContext?G_vmlCanvasManager=!1:!function(){function e(){return this.context_||(this.context_=new f(this))}function t(e,t){var i=O.call(arguments,2);return function(){return e.apply(t,i.concat(O.call(arguments)))}}function i(e){return String(e).replace(/&/g,\"&amp;\").replace(/\"/g,\"&quot;\")}function n(e,t,i){e.namespaces[t]||e.namespaces.add(t,i,\"#default#VML\")}function a(e){if(n(e,\"g_vml_\",\"urn:schemas-microsoft-com:vml\"),n(e,\"g_o_\",\"urn:schemas-microsoft-com:office:office\"),!e.styleSheets.ex_canvas_){var t=e.createStyleSheet();t.owningElement.id=\"ex_canvas_\",t.cssText=\"canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}\"}}function o(e){var t=e.srcElement;switch(e.propertyName){case\"width\":t.getContext().clearRect(),t.style.width=t.attributes.width.nodeValue+\"px\",t.firstChild.style.width=t.clientWidth+\"px\";break;case\"height\":t.getContext().clearRect(),t.style.height=t.attributes.height.nodeValue+\"px\",t.firstChild.style.height=t.clientHeight+\"px\"}}function r(e){var t=e.srcElement;t.firstChild&&(t.firstChild.style.width=t.clientWidth+\"px\",t.firstChild.style.height=t.clientHeight+\"px\")}function s(){return[[1,0,0],[0,1,0],[0,0,1]]}function l(e,t){for(var i=s(),n=0;3>n;n++)for(var a=0;3>a;a++){for(var o=0,r=0;3>r;r++)o+=e[n][r]*t[r][a];i[n][a]=o}return i}function h(e,t){t.fillStyle=e.fillStyle,t.lineCap=e.lineCap,t.lineJoin=e.lineJoin,t.lineWidth=e.lineWidth,t.miterLimit=e.miterLimit,t.shadowBlur=e.shadowBlur,t.shadowColor=e.shadowColor,t.shadowOffsetX=e.shadowOffsetX,t.shadowOffsetY=e.shadowOffsetY,t.strokeStyle=e.strokeStyle,t.globalAlpha=e.globalAlpha,t.font=e.font,t.textAlign=e.textAlign,t.textBaseline=e.textBaseline,t.scaleX_=e.scaleX_,t.scaleY_=e.scaleY_,t.lineScale_=e.lineScale_}function m(e){var t=e.indexOf(\"(\",3),i=e.indexOf(\")\",t+1),n=e.substring(t+1,i).split(\",\");return(4!=n.length||\"a\"!=e.charAt(3))&&(n[3]=1),n}function V(e){return parseFloat(e)/100}function U(e,t,i){return Math.min(i,Math.max(t,e))}function d(e){var t,i,n,a,o,r;if(a=parseFloat(e[0])/360%360,0>a&&a++,o=U(V(e[1]),0,1),r=U(V(e[2]),0,1),0==o)t=i=n=r;else{var s=.5>r?r*(1+o):r+o-r*o,l=2*r-s;t=p(l,s,a+1/3),i=p(l,s,a),n=p(l,s,a-1/3)}return\"#\"+D[Math.floor(255*t)]+D[Math.floor(255*i)]+D[Math.floor(255*n)]}function p(e,t,i){return 0>i&&i++,i>1&&i--,1>6*i?e+6*(t-e)*i:1>2*i?t:2>3*i?e+(t-e)*(2/3-i)*6:e}function c(e){if(e in R)return R[e];var t,i=1;if(e=String(e),\"#\"==e.charAt(0))t=e;else if(/^rgb/.test(e)){for(var n,a=m(e),t=\"#\",o=0;3>o;o++)n=-1!=a[o].indexOf(\"%\")?Math.floor(255*V(a[o])):+a[o],t+=D[U(n,0,255)];i=+a[3]}else if(/^hsl/.test(e)){var a=m(e);t=d(a),i=a[3]}else t=H[e]||e;return R[e]={color:t,alpha:i}}function u(e){if(Y[e])return Y[e];var t,i=document.createElement(\"div\"),n=i.style;try{n.font=e,t=n.fontFamily.split(\",\")[0]}catch(a){}return Y[e]={style:n.fontStyle||G.style,variant:n.fontVariant||G.variant,weight:n.fontWeight||G.weight,size:n.fontSize||G.size,family:t||G.family}}function y(e,t){var i={};for(var n in e)i[n]=e[n];var a=parseFloat(t.currentStyle.fontSize),o=parseFloat(e.size);return i.size=\"number\"==typeof e.size?e.size:-1!=e.size.indexOf(\"px\")?o:-1!=e.size.indexOf(\"em\")?a*o:-1!=e.size.indexOf(\"%\")?a/100*o:-1!=e.size.indexOf(\"pt\")?o/.75:a,i}function g(e){return e.style+\" \"+e.variant+\" \"+e.weight+\" \"+e.size+\"px '\"+e.family+\"'\"}function b(e){return Q[e]||\"square\"}function f(e){this.m_=s(),this.mStack_=[],this.aStack_=[],this.currentPath_=[],this.strokeStyle=\"#000\",this.fillStyle=\"#000\",this.lineWidth=1,this.lineJoin=\"miter\",this.lineCap=\"butt\",this.miterLimit=1*A,this.globalAlpha=1,this.font=\"12px 微软雅黑\",this.textAlign=\"left\",this.textBaseline=\"alphabetic\",this.canvas=e;var t=\"width:\"+e.clientWidth+\"px;height:\"+e.clientHeight+\"px;overflow:hidden;position:absolute\",i=e.ownerDocument.createElement(\"div\");i.style.cssText=t,e.appendChild(i);var n=i.cloneNode(!1);n.style.backgroundColor=\"#fff\",n.style.filter=\"alpha(opacity=0)\",e.appendChild(n),this.element_=i,this.scaleX_=1,this.scaleY_=1,this.lineScale_=1}function k(e,t,i,n){e.currentPath_.push({type:\"bezierCurveTo\",cp1x:t.x,cp1y:t.y,cp2x:i.x,cp2y:i.y,x:n.x,y:n.y}),e.currentX_=n.x,e.currentY_=n.y}function x(e,t){var i=c(e.strokeStyle),n=i.color,a=i.alpha*e.globalAlpha,o=e.lineScale_*e.lineWidth;1>o&&(a*=o),t.push(\"<g_vml_:stroke\",' opacity=\"',a,'\"',' joinstyle=\"',e.lineJoin,'\"',' miterlimit=\"',e.miterLimit,'\"',' endcap=\"',b(e.lineCap),'\"',' weight=\"',o,'px\"',' color=\"',n,'\" />')}function _(e,t,i,n){var a=e.fillStyle,o=e.scaleX_,r=e.scaleY_,s=n.x-i.x,l=n.y-i.y;if(a instanceof v){var h=0,m={x:0,y:0},V=0,U=1;if(\"gradient\"==a.type_){var d=a.x0_/o,p=a.y0_/r,u=a.x1_/o,y=a.y1_/r,g=L(e,d,p),b=L(e,u,y),f=b.x-g.x,k=b.y-g.y;h=180*Math.atan2(f,k)/Math.PI,0>h&&(h+=360),1e-6>h&&(h=0)}else{var g=L(e,a.x0_,a.y0_);m={x:(g.x-i.x)/s,y:(g.y-i.y)/l},s/=o*A,l/=r*A;var x=C.max(s,l);V=2*a.r0_/x,U=2*a.r1_/x-V}var _=a.colors_;_.sort(function(e,t){return e.offset-t.offset});for(var W=_.length,X=_[0].color,K=_[W-1].color,I=_[0].alpha*e.globalAlpha,J=_[W-1].alpha*e.globalAlpha,S=[],E=0;W>E;E++){var F=_[E];S.push(F.offset*U+V+\" \"+F.color)}t.push('<g_vml_:fill type=\"',a.type_,'\"',' method=\"none\" focus=\"100%\"',' color=\"',X,'\"',' color2=\"',K,'\"',' colors=\"',S.join(\",\"),'\"',' opacity=\"',J,'\"',' g_o_:opacity2=\"',I,'\"',' angle=\"',h,'\"',' focusposition=\"',m.x,\",\",m.y,'\" />')}else if(a instanceof w){if(s&&l){var T=-i.x,z=-i.y;t.push(\"<g_vml_:fill\",' position=\"',T/s*o*o,\",\",z/l*r*r,'\"',' type=\"tile\"',' src=\"',a.src_,'\" />')}}else{var M=c(e.fillStyle),O=M.color,P=M.alpha*e.globalAlpha;t.push('<g_vml_:fill color=\"',O,'\" opacity=\"',P,'\" />')}}function L(e,t,i){var n=e.m_;return{x:A*(t*n[0][0]+i*n[1][0]+n[2][0])-M,y:A*(t*n[0][1]+i*n[1][1]+n[2][1])-M}}function W(e){return isFinite(e[0][0])&&isFinite(e[0][1])&&isFinite(e[1][0])&&isFinite(e[1][1])&&isFinite(e[2][0])&&isFinite(e[2][1])}function X(e,t,i){if(W(t)&&(e.m_=t,e.scaleX_=Math.sqrt(t[0][0]*t[0][0]+t[0][1]*t[0][1]),e.scaleY_=Math.sqrt(t[1][0]*t[1][0]+t[1][1]*t[1][1]),i)){var n=t[0][0]*t[1][1]-t[0][1]*t[1][0];e.lineScale_=z(T(n))}}function v(e){this.type_=e,this.x0_=0,this.y0_=0,this.r0_=0,this.x1_=0,this.y1_=0,this.r1_=0,this.colors_=[]}function w(e,t){switch(I(e),t){case\"repeat\":case null:case\"\":this.repetition_=\"repeat\";break;case\"repeat-x\":case\"repeat-y\":case\"no-repeat\":this.repetition_=t;break;default:K(\"SYNTAX_ERR\")}this.src_=e.src,this.width_=e.width,this.height_=e.height}function K(e){throw new J(e)}function I(e){e&&1==e.nodeType&&\"IMG\"==e.tagName||K(\"TYPE_MISMATCH_ERR\"),\"complete\"!=e.readyState&&K(\"INVALID_STATE_ERR\")}function J(e){this.code=this[e],this.message=e+\": DOM Exception \"+this.code}var C=Math,S=C.round,E=C.sin,F=C.cos,T=C.abs,z=C.sqrt,A=10,M=A/2,O=(+navigator.userAgent.match(/MSIE ([\\d.]+)?/)[1],Array.prototype.slice);a(document);var P={init:function(e){var i=e||document;i.createElement(\"canvas\"),i.attachEvent(\"onreadystatechange\",t(this.init_,this,i))},init_:function(e){for(var t=e.getElementsByTagName(\"canvas\"),i=0;i<t.length;i++)this.initElement(t[i])},initElement:function(t){if(!t.getContext){t.getContext=e,a(t.ownerDocument),t.innerHTML=\"\",t.attachEvent(\"onpropertychange\",o),t.attachEvent(\"onresize\",r);var i=t.attributes;i.width&&i.width.specified?t.style.width=i.width.nodeValue+\"px\":t.width=t.clientWidth,i.height&&i.height.specified?t.style.height=i.height.nodeValue+\"px\":t.height=t.clientHeight}return t}};P.init();for(var D=[],N=0;16>N;N++)for(var B=0;16>B;B++)D[16*N+B]=N.toString(16)+B.toString(16);var H={aliceblue:\"#F0F8FF\",antiquewhite:\"#FAEBD7\",aquamarine:\"#7FFFD4\",azure:\"#F0FFFF\",beige:\"#F5F5DC\",bisque:\"#FFE4C4\",black:\"#000000\",blanchedalmond:\"#FFEBCD\",blueviolet:\"#8A2BE2\",brown:\"#A52A2A\",burlywood:\"#DEB887\",cadetblue:\"#5F9EA0\",chartreuse:\"#7FFF00\",chocolate:\"#D2691E\",coral:\"#FF7F50\",cornflowerblue:\"#6495ED\",cornsilk:\"#FFF8DC\",crimson:\"#DC143C\",cyan:\"#00FFFF\",darkblue:\"#00008B\",darkcyan:\"#008B8B\",darkgoldenrod:\"#B8860B\",darkgray:\"#A9A9A9\",darkgreen:\"#006400\",darkgrey:\"#A9A9A9\",darkkhaki:\"#BDB76B\",darkmagenta:\"#8B008B\",darkolivegreen:\"#556B2F\",darkorange:\"#FF8C00\",darkorchid:\"#9932CC\",darkred:\"#8B0000\",darksalmon:\"#E9967A\",darkseagreen:\"#8FBC8F\",darkslateblue:\"#483D8B\",darkslategray:\"#2F4F4F\",darkslategrey:\"#2F4F4F\",darkturquoise:\"#00CED1\",darkviolet:\"#9400D3\",deeppink:\"#FF1493\",deepskyblue:\"#00BFFF\",dimgray:\"#696969\",dimgrey:\"#696969\",dodgerblue:\"#1E90FF\",firebrick:\"#B22222\",floralwhite:\"#FFFAF0\",forestgreen:\"#228B22\",gainsboro:\"#DCDCDC\",ghostwhite:\"#F8F8FF\",gold:\"#FFD700\",goldenrod:\"#DAA520\",grey:\"#808080\",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\",lightgreen:\"#90EE90\",lightgrey:\"#D3D3D3\",lightpink:\"#FFB6C1\",lightsalmon:\"#FFA07A\",lightseagreen:\"#20B2AA\",lightskyblue:\"#87CEFA\",lightslategray:\"#778899\",lightslategrey:\"#778899\",lightsteelblue:\"#B0C4DE\",lightyellow:\"#FFFFE0\",limegreen:\"#32CD32\",linen:\"#FAF0E6\",magenta:\"#FF00FF\",mediumaquamarine:\"#66CDAA\",mediumblue:\"#0000CD\",mediumorchid:\"#BA55D3\",mediumpurple:\"#9370DB\",mediumseagreen:\"#3CB371\",mediumslateblue:\"#7B68EE\",mediumspringgreen:\"#00FA9A\",mediumturquoise:\"#48D1CC\",mediumvioletred:\"#C71585\",midnightblue:\"#191970\",mintcream:\"#F5FFFA\",mistyrose:\"#FFE4E1\",moccasin:\"#FFE4B5\",navajowhite:\"#FFDEAD\",oldlace:\"#FDF5E6\",olivedrab:\"#6B8E23\",orange:\"#FFA500\",orangered:\"#FF4500\",orchid:\"#DA70D6\",palegoldenrod:\"#EEE8AA\",palegreen:\"#98FB98\",paleturquoise:\"#AFEEEE\",palevioletred:\"#DB7093\",papayawhip:\"#FFEFD5\",peachpuff:\"#FFDAB9\",peru:\"#CD853F\",pink:\"#FFC0CB\",plum:\"#DDA0DD\",powderblue:\"#B0E0E6\",rosybrown:\"#BC8F8F\",royalblue:\"#4169E1\",saddlebrown:\"#8B4513\",salmon:\"#FA8072\",sandybrown:\"#F4A460\",seagreen:\"#2E8B57\",seashell:\"#FFF5EE\",sienna:\"#A0522D\",skyblue:\"#87CEEB\",slateblue:\"#6A5ACD\",slategray:\"#708090\",slategrey:\"#708090\",snow:\"#FFFAFA\",springgreen:\"#00FF7F\",steelblue:\"#4682B4\",tan:\"#D2B48C\",thistle:\"#D8BFD8\",tomato:\"#FF6347\",turquoise:\"#40E0D0\",violet:\"#EE82EE\",wheat:\"#F5DEB3\",whitesmoke:\"#F5F5F5\",yellowgreen:\"#9ACD32\"},R={},G={style:\"normal\",variant:\"normal\",weight:\"normal\",size:12,family:\"微软雅黑\"},Y={},Q={butt:\"flat\",round:\"round\"},Z=f.prototype;Z.clearRect=function(){this.textMeasureEl_&&(this.textMeasureEl_.removeNode(!0),this.textMeasureEl_=null),this.element_.innerHTML=\"\"},Z.beginPath=function(){this.currentPath_=[]},Z.moveTo=function(e,t){var i=L(this,e,t);this.currentPath_.push({type:\"moveTo\",x:i.x,y:i.y}),this.currentX_=i.x,this.currentY_=i.y},Z.lineTo=function(e,t){var i=L(this,e,t);this.currentPath_.push({type:\"lineTo\",x:i.x,y:i.y}),this.currentX_=i.x,this.currentY_=i.y},Z.bezierCurveTo=function(e,t,i,n,a,o){var r=L(this,a,o),s=L(this,e,t),l=L(this,i,n);k(this,s,l,r)},Z.quadraticCurveTo=function(e,t,i,n){var a=L(this,e,t),o=L(this,i,n),r={x:this.currentX_+2/3*(a.x-this.currentX_),y:this.currentY_+2/3*(a.y-this.currentY_)},s={x:r.x+(o.x-this.currentX_)/3,y:r.y+(o.y-this.currentY_)/3};k(this,r,s,o)},Z.arc=function(e,t,i,n,a,o){i*=A;var r=o?\"at\":\"wa\",s=e+F(n)*i-M,l=t+E(n)*i-M,h=e+F(a)*i-M,m=t+E(a)*i-M;s!=h||o||(s+=.125);var V=L(this,e,t),U=L(this,s,l),d=L(this,h,m);this.currentPath_.push({type:r,x:V.x,y:V.y,radius:i,xStart:U.x,yStart:U.y,xEnd:d.x,yEnd:d.y})},Z.rect=function(e,t,i,n){this.moveTo(e,t),this.lineTo(e+i,t),this.lineTo(e+i,t+n),this.lineTo(e,t+n),this.closePath()},Z.strokeRect=function(e,t,i,n){var a=this.currentPath_;this.beginPath(),this.moveTo(e,t),this.lineTo(e+i,t),this.lineTo(e+i,t+n),this.lineTo(e,t+n),this.closePath(),this.stroke(),this.currentPath_=a},Z.fillRect=function(e,t,i,n){var a=this.currentPath_;this.beginPath(),this.moveTo(e,t),this.lineTo(e+i,t),this.lineTo(e+i,t+n),this.lineTo(e,t+n),this.closePath(),this.fill(),this.currentPath_=a},Z.createLinearGradient=function(e,t,i,n){var a=new v(\"gradient\");return a.x0_=e,a.y0_=t,a.x1_=i,a.y1_=n,a},Z.createRadialGradient=function(e,t,i,n,a,o){var r=new v(\"gradientradial\");return r.x0_=e,r.y0_=t,r.r0_=i,r.x1_=n,r.y1_=a,r.r1_=o,r},Z.drawImage=function(e){var t,i,n,a,o,r,s,l,h=e.runtimeStyle.width,m=e.runtimeStyle.height;e.runtimeStyle.width=\"auto\",e.runtimeStyle.height=\"auto\";var V=e.width,U=e.height;if(e.runtimeStyle.width=h,e.runtimeStyle.height=m,3==arguments.length)t=arguments[1],i=arguments[2],o=r=0,s=n=V,l=a=U;else if(5==arguments.length)t=arguments[1],i=arguments[2],n=arguments[3],a=arguments[4],o=r=0,s=V,l=U;else{if(9!=arguments.length)throw Error(\"Invalid number of arguments\");o=arguments[1],r=arguments[2],s=arguments[3],l=arguments[4],t=arguments[5],i=arguments[6],n=arguments[7],a=arguments[8]}var d=L(this,t,i),p=[],c=10,u=10,y=b=1;if(p.push(\" <g_vml_:group\",' coordsize=\"',A*c,\",\",A*u,'\"',' coordorigin=\"0,0\"',' style=\"width:',c,\"px;height:\",u,\"px;position:absolute;\"),1!=this.m_[0][0]||this.m_[0][1]||1!=this.m_[1][1]||this.m_[1][0]){var g=[],y=this.scaleX_,b=this.scaleY_;g.push(\"M11=\",this.m_[0][0]/y,\",\",\"M12=\",this.m_[1][0]/b,\",\",\"M21=\",this.m_[0][1]/y,\",\",\"M22=\",this.m_[1][1]/b,\",\",\"Dx=\",S(d.x/A),\",\",\"Dy=\",S(d.y/A),\"\");var f=d,k=L(this,t+n,i),x=L(this,t,i+a),_=L(this,t+n,i+a);f.x=C.max(f.x,k.x,x.x,_.x),f.y=C.max(f.y,k.y,x.y,_.y),p.push(\"padding:0 \",S(f.x/A),\"px \",S(f.y/A),\"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(\",g.join(\"\"),\", SizingMethod='clip');\")}else p.push(\"top:\",S(d.y/A),\"px;left:\",S(d.x/A),\"px;\");p.push(' \">'),(o||r)&&p.push('<div style=\"overflow: hidden; width:',Math.ceil((n+o*n/s)*y),\"px;\",\" height:\",Math.ceil((a+r*a/l)*b),\"px;\",\" filter:progid:DxImageTransform.Microsoft.Matrix(Dx=\",-o*n/s*y,\",Dy=\",-r*a/l*b,');\">'),p.push('<div style=\"width:',Math.round(y*V*n/s),\"px;\",\" height:\",Math.round(b*U*a/l),\"px;\",\" filter:\"),this.globalAlpha<1&&p.push(\" progid:DXImageTransform.Microsoft.Alpha(opacity=\"+100*this.globalAlpha+\")\"),p.push(\" progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\",e.src,',sizingMethod=scale)\">'),(o||r)&&p.push(\"</div>\"),p.push(\"</div></div>\"),this.element_.insertAdjacentHTML(\"BeforeEnd\",p.join(\"\"))},Z.stroke=function(e){var t=[],i=10,n=10;t.push(\"<g_vml_:shape\",' filled=\"',!!e,'\"',' style=\"position:absolute;width:',i,\"px;height:\",n,'px;\"',' coordorigin=\"0,0\"',' coordsize=\"',A*i,\",\",A*n,'\"',' stroked=\"',!e,'\"',' path=\"');for(var a={x:null,y:null},o={x:null,y:null},r=0;r<this.currentPath_.length;r++){var s,l=this.currentPath_[r];switch(l.type){case\"moveTo\":s=l,t.push(\" m \",S(l.x),\",\",S(l.y));break;case\"lineTo\":t.push(\" l \",S(l.x),\",\",S(l.y));break;case\"close\":t.push(\" x \"),l=null;break;case\"bezierCurveTo\":t.push(\" c \",S(l.cp1x),\",\",S(l.cp1y),\",\",S(l.cp2x),\",\",S(l.cp2y),\",\",S(l.x),\",\",S(l.y));break;case\"at\":case\"wa\":t.push(\" \",l.type,\" \",S(l.x-this.scaleX_*l.radius),\",\",S(l.y-this.scaleY_*l.radius),\" \",S(l.x+this.scaleX_*l.radius),\",\",S(l.y+this.scaleY_*l.radius),\" \",S(l.xStart),\",\",S(l.yStart),\" \",S(l.xEnd),\",\",S(l.yEnd))}l&&((null==a.x||l.x<a.x)&&(a.x=l.x),(null==o.x||l.x>o.x)&&(o.x=l.x),(null==a.y||l.y<a.y)&&(a.y=l.y),(null==o.y||l.y>o.y)&&(o.y=l.y))}t.push(' \">'),e?_(this,t,a,o):x(this,t),t.push(\"</g_vml_:shape>\"),this.element_.insertAdjacentHTML(\"beforeEnd\",t.join(\"\"))},Z.fill=function(){this.stroke(!0)},Z.closePath=function(){this.currentPath_.push({type:\"close\"})},Z.save=function(){var e={};h(this,e),this.aStack_.push(e),this.mStack_.push(this.m_),this.m_=l(s(),this.m_)},Z.restore=function(){this.aStack_.length&&(h(this.aStack_.pop(),this),this.m_=this.mStack_.pop())},Z.translate=function(e,t){var i=[[1,0,0],[0,1,0],[e,t,1]];X(this,l(i,this.m_),!1)},Z.rotate=function(e){var t=F(e),i=E(e),n=[[t,i,0],[-i,t,0],[0,0,1]];X(this,l(n,this.m_),!1)},Z.scale=function(e,t){var i=[[e,0,0],[0,t,0],[0,0,1]];X(this,l(i,this.m_),!0)},Z.transform=function(e,t,i,n,a,o){var r=[[e,t,0],[i,n,0],[a,o,1]];X(this,l(r,this.m_),!0)},Z.setTransform=function(e,t,i,n,a,o){var r=[[e,t,0],[i,n,0],[a,o,1]];X(this,r,!0)},Z.drawText_=function(e,t,n,a,o){var r=this.m_,s=1e3,l=0,h=s,m={x:0,y:0},V=[],U=y(u(this.font),this.element_),d=g(U),p=this.element_.currentStyle,c=this.textAlign.toLowerCase();switch(c){case\"left\":case\"center\":case\"right\":break;case\"end\":c=\"ltr\"==p.direction?\"right\":\"left\";break;case\"start\":c=\"rtl\"==p.direction?\"right\":\"left\";break;default:c=\"left\"}switch(this.textBaseline){case\"hanging\":case\"top\":m.y=U.size/1.75;break;case\"middle\":break;default:case null:case\"alphabetic\":case\"ideographic\":case\"bottom\":m.y=-U.size/2.25}switch(c){case\"right\":l=s,h=.05;break;case\"center\":l=h=s/2}var b=L(this,t+m.x,n+m.y);V.push('<g_vml_:line from=\"',-l,' 0\" to=\"',h,' 0.05\" ',' coordsize=\"100 100\" coordorigin=\"0 0\"',' filled=\"',!o,'\" stroked=\"',!!o,'\" style=\"position:absolute;width:1px;height:1px;\">'),o?x(this,V):_(this,V,{x:-l,y:0},{x:h,y:U.size});var f=r[0][0].toFixed(3)+\",\"+r[1][0].toFixed(3)+\",\"+r[0][1].toFixed(3)+\",\"+r[1][1].toFixed(3)+\",0,0\",k=S(b.x/A)+\",\"+S(b.y/A);V.push('<g_vml_:skew on=\"t\" matrix=\"',f,'\" ',' offset=\"',k,'\" origin=\"',l,' 0\" />','<g_vml_:path textpathok=\"true\" />','<g_vml_:textpath on=\"true\" string=\"',i(e),'\" style=\"v-text-align:',c,\";font:\",i(d),'\" /></g_vml_:line>'),this.element_.insertAdjacentHTML(\"beforeEnd\",V.join(\"\"))},Z.fillText=function(e,t,i,n){this.drawText_(e,t,i,n,!1)},Z.strokeText=function(e,t,i,n){this.drawText_(e,t,i,n,!0)},Z.measureText=function(e){if(!this.textMeasureEl_){var t='<span style=\"position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;\"></span>';this.element_.insertAdjacentHTML(\"beforeEnd\",t),this.textMeasureEl_=this.element_.lastChild}var i=this.element_.ownerDocument;this.textMeasureEl_.innerHTML=\"\";try{this.textMeasureEl_.style.font=this.font}catch(n){}return this.textMeasureEl_.appendChild(i.createTextNode(e)),{width:this.textMeasureEl_.offsetWidth}},Z.clip=function(){},Z.arcTo=function(){},Z.createPattern=function(e,t){return new w(e,t)},v.prototype.addColorStop=function(e,t){t=c(t),this.colors_.push({offset:e,color:t.color,alpha:t.alpha})};var q=J.prototype=new Error;q.INDEX_SIZE_ERR=1,q.DOMSTRING_SIZE_ERR=2,q.HIERARCHY_REQUEST_ERR=3,q.WRONG_DOCUMENT_ERR=4,q.INVALID_CHARACTER_ERR=5,q.NO_DATA_ALLOWED_ERR=6,q.NO_MODIFICATION_ALLOWED_ERR=7,q.NOT_FOUND_ERR=8,q.NOT_SUPPORTED_ERR=9,q.INUSE_ATTRIBUTE_ERR=10,q.INVALID_STATE_ERR=11,q.SYNTAX_ERR=12,q.INVALID_MODIFICATION_ERR=13,q.NAMESPACE_ERR=14,q.INVALID_ACCESS_ERR=15,q.VALIDATION_ERR=16,q.TYPE_MISMATCH_ERR=17,G_vmlCanvasManager=P,CanvasRenderingContext2D=f,CanvasGradient=v,CanvasPattern=w,DOMException=J}(),G_vmlCanvasManager}),i(\"zrender/mixin/Eventful\",[\"require\"],function(){var e=function(){this._handlers={}};return e.prototype.one=function(e,t,i){var n=this._handlers;return t&&e?(n[e]||(n[e]=[]),n[e].push({h:t,one:!0,ctx:i||this}),this):this},e.prototype.bind=function(e,t,i){var n=this._handlers;return t&&e?(n[e]||(n[e]=[]),n[e].push({h:t,one:!1,ctx:i||this}),this):this},e.prototype.unbind=function(e,t){var i=this._handlers;if(!e)return this._handlers={},this;if(t){if(i[e]){for(var n=[],a=0,o=i[e].length;o>a;a++)i[e][a].h!=t&&n.push(i[e][a]);i[e]=n}i[e]&&0===i[e].length&&delete i[e]}else delete i[e];return this},e.prototype.dispatch=function(e){if(this._handlers[e]){var t=arguments,i=t.length;i>3&&(t=Array.prototype.slice.call(t,1));for(var n=this._handlers[e],a=n.length,o=0;a>o;){switch(i){case 1:n[o].h.call(n[o].ctx);break;case 2:n[o].h.call(n[o].ctx,t[1]);break;case 3:n[o].h.call(n[o].ctx,t[1],t[2]);break;default:n[o].h.apply(n[o].ctx,t)}n[o].one?(n.splice(o,1),a--):o++}}return this},e.prototype.dispatchWithContext=function(e){if(this._handlers[e]){var t=arguments,i=t.length;i>4&&(t=Array.prototype.slice.call(t,1,t.length-1));for(var n=t[t.length-1],a=this._handlers[e],o=a.length,r=0;o>r;){switch(i){case 1:a[r].h.call(n);break;case 2:a[r].h.call(n,t[1]);break;case 3:a[r].h.call(n,t[1],t[2]);break;default:a[r].h.apply(n,t)}a[r].one?(a.splice(r,1),o--):r++}}return this},e}),i(\"zrender/tool/log\",[\"require\",\"../config\"],function(e){var t=e(\"../config\");return function(){if(0!==t.debugMode)if(1==t.debugMode)for(var e in arguments)throw new Error(arguments[e]);else if(t.debugMode>1)for(var e in arguments)console.log(arguments[e])}}),i(\"zrender/tool/guid\",[],function(){var e=2311;return function(){return\"zrender__\"+e++}}),i(\"zrender/Handler\",[\"require\",\"./config\",\"./tool/env\",\"./tool/event\",\"./tool/util\",\"./tool/vector\",\"./tool/matrix\",\"./mixin/Eventful\"],function(e){\"use strict\";function t(e,t){return function(i,n){return e.call(t,i,n)}}function i(e,t){return function(i,n,a){return e.call(t,i,n,a)}}function n(e){for(var i=d.length;i--;){var n=d[i];e[\"_\"+n+\"Handler\"]=t(c[n],e)}}function a(e,t,i){if(this._draggingTarget&&this._draggingTarget.id==e.id||e.isSilent())return!1;var n=this._event;if(e.isCover(t,i)){e.hoverable&&this.storage.addHover(e);for(var a=e.parent;a;){if(a.clipShape&&!a.clipShape.isCover(this._mouseX,this._mouseY))return!1;a=a.parent}return this._lastHover!=e&&(this._processOutShape(n),this._processDragLeave(n),this._lastHover=e,this._processDragEnter(n)),this._processOverShape(n),this._processDragOver(n),this._hasfound=1,!0}return!1}var o=e(\"./config\"),r=e(\"./tool/env\"),s=e(\"./tool/event\"),l=e(\"./tool/util\"),h=e(\"./tool/vector\"),m=e(\"./tool/matrix\"),V=o.EVENT,U=e(\"./mixin/Eventful\"),d=[\"resize\",\"click\",\"dblclick\",\"mousewheel\",\"mousemove\",\"mouseout\",\"mouseup\",\"mousedown\",\"touchstart\",\"touchend\",\"touchmove\"],p=function(e){if(window.G_vmlCanvasManager)return!0;e=e||window.event;var t=e.toElement||e.relatedTarget||e.srcElement||e.target;return t&&t.className.match(o.elementClassName)},c={resize:function(e){e=e||window.event,this._lastHover=null,this._isMouseDown=0,this.dispatch(V.RESIZE,e)},click:function(e,t){if(p(e)||t){e=this._zrenderEventFixed(e);var i=this._lastHover;(i&&i.clickable||!i)&&this._clickThreshold<5&&this._dispatchAgency(i,V.CLICK,e),this._mousemoveHandler(e)}},dblclick:function(e,t){if(p(e)||t){e=e||window.event,e=this._zrenderEventFixed(e);var i=this._lastHover;(i&&i.clickable||!i)&&this._clickThreshold<5&&this._dispatchAgency(i,V.DBLCLICK,e),this._mousemoveHandler(e)}},mousewheel:function(e,t){if(p(e)||t){e=this._zrenderEventFixed(e);var i=e.wheelDelta||-e.detail,n=i>0?1.1:1/1.1,a=!1,o=this._mouseX,r=this._mouseY;this.painter.eachBuildinLayer(function(t){var i=t.position;if(t.zoomable){t.__zoom=t.__zoom||1;var l=t.__zoom;l*=n,l=Math.max(Math.min(t.maxZoom,l),t.minZoom),n=l/t.__zoom,t.__zoom=l,i[0]-=(o-i[0])*(n-1),i[1]-=(r-i[1])*(n-1),t.scale[0]*=n,t.scale[1]*=n,t.dirty=!0,a=!0,s.stop(e)}}),a&&this.painter.refresh(),this._dispatchAgency(this._lastHover,V.MOUSEWHEEL,e),this._mousemoveHandler(e)}},mousemove:function(e,t){if((p(e)||t)&&!this.painter.isLoading()){e=this._zrenderEventFixed(e),this._lastX=this._mouseX,this._lastY=this._mouseY,this._mouseX=s.getX(e),this._mouseY=s.getY(e);var i=this._mouseX-this._lastX,n=this._mouseY-this._lastY;this._processDragStart(e),this._hasfound=0,this._event=e,this._iterateAndFindHover(),this._hasfound||((!this._draggingTarget||this._lastHover&&this._lastHover!=this._draggingTarget)&&(this._processOutShape(e),\nthis._processDragLeave(e)),this._lastHover=null,this.storage.delHover(),this.painter.clearHover());var a=\"default\";if(this._draggingTarget)this.storage.drift(this._draggingTarget.id,i,n),this._draggingTarget.modSelf(),this.storage.addHover(this._draggingTarget),this._clickThreshold++;else if(this._isMouseDown){var o=!1;this.painter.eachBuildinLayer(function(e){e.panable&&(a=\"move\",e.position[0]+=i,e.position[1]+=n,o=!0,e.dirty=!0)}),o&&this.painter.refresh()}this._draggingTarget||this._hasfound&&this._lastHover.draggable?a=\"move\":this._hasfound&&this._lastHover.clickable&&(a=\"pointer\"),this.root.style.cursor=a,this._dispatchAgency(this._lastHover,V.MOUSEMOVE,e),(this._draggingTarget||this._hasfound||this.storage.hasHoverShape())&&this.painter.refreshHover()}},mouseout:function(e,t){if(p(e)||t){e=this._zrenderEventFixed(e);var i=e.toElement||e.relatedTarget;if(i!=this.root)for(;i&&9!=i.nodeType;){if(i==this.root)return void this._mousemoveHandler(e);i=i.parentNode}e.zrenderX=this._lastX,e.zrenderY=this._lastY,this.root.style.cursor=\"default\",this._isMouseDown=0,this._processOutShape(e),this._processDrop(e),this._processDragEnd(e),this.painter.isLoading()||this.painter.refreshHover(),this.dispatch(V.GLOBALOUT,e)}},mousedown:function(e,t){if(p(e)||t){if(this._clickThreshold=0,2==this._lastDownButton)return this._lastDownButton=e.button,void(this._mouseDownTarget=null);this._lastMouseDownMoment=new Date,e=this._zrenderEventFixed(e),this._isMouseDown=1,this._mouseDownTarget=this._lastHover,this._dispatchAgency(this._lastHover,V.MOUSEDOWN,e),this._lastDownButton=e.button}},mouseup:function(e,t){(p(e)||t)&&(e=this._zrenderEventFixed(e),this.root.style.cursor=\"default\",this._isMouseDown=0,this._mouseDownTarget=null,this._dispatchAgency(this._lastHover,V.MOUSEUP,e),this._processDrop(e),this._processDragEnd(e))},touchstart:function(e,t){(p(e)||t)&&(e=this._zrenderEventFixed(e,!0),this._lastTouchMoment=new Date,this._mobileFindFixed(e),this._mousedownHandler(e))},touchmove:function(e,t){(p(e)||t)&&(e=this._zrenderEventFixed(e,!0),this._mousemoveHandler(e),this._isDragging&&s.stop(e))},touchend:function(e,t){if(p(e)||t){e=this._zrenderEventFixed(e,!0),this._mouseupHandler(e);var i=new Date;i-this._lastTouchMoment<V.touchClickDelay&&(this._mobileFindFixed(e),this._clickHandler(e),i-this._lastClickMoment<V.touchClickDelay/2&&(this._dblclickHandler(e),this._lastHover&&this._lastHover.clickable&&s.stop(e)),this._lastClickMoment=i),this.painter.clearHover()}}},u=function(e,t,o){U.call(this),this.root=e,this.storage=t,this.painter=o,this._lastX=this._lastY=this._mouseX=this._mouseY=0,this._findHover=i(a,this),this._domHover=o.getDomHover(),n(this),window.addEventListener?(window.addEventListener(\"resize\",this._resizeHandler),r.os.tablet||r.os.phone?(e.addEventListener(\"touchstart\",this._touchstartHandler),e.addEventListener(\"touchmove\",this._touchmoveHandler),e.addEventListener(\"touchend\",this._touchendHandler)):(e.addEventListener(\"click\",this._clickHandler),e.addEventListener(\"dblclick\",this._dblclickHandler),e.addEventListener(\"mousewheel\",this._mousewheelHandler),e.addEventListener(\"mousemove\",this._mousemoveHandler),e.addEventListener(\"mousedown\",this._mousedownHandler),e.addEventListener(\"mouseup\",this._mouseupHandler)),e.addEventListener(\"DOMMouseScroll\",this._mousewheelHandler),e.addEventListener(\"mouseout\",this._mouseoutHandler)):(window.attachEvent(\"onresize\",this._resizeHandler),e.attachEvent(\"onclick\",this._clickHandler),e.ondblclick=this._dblclickHandler,e.attachEvent(\"onmousewheel\",this._mousewheelHandler),e.attachEvent(\"onmousemove\",this._mousemoveHandler),e.attachEvent(\"onmouseout\",this._mouseoutHandler),e.attachEvent(\"onmousedown\",this._mousedownHandler),e.attachEvent(\"onmouseup\",this._mouseupHandler))};u.prototype.on=function(e,t,i){return this.bind(e,t,i),this},u.prototype.un=function(e,t){return this.unbind(e,t),this},u.prototype.trigger=function(e,t){switch(e){case V.RESIZE:case V.CLICK:case V.DBLCLICK:case V.MOUSEWHEEL:case V.MOUSEMOVE:case V.MOUSEDOWN:case V.MOUSEUP:case V.MOUSEOUT:this[\"_\"+e+\"Handler\"](t,!0)}},u.prototype.dispose=function(){var e=this.root;window.removeEventListener?(window.removeEventListener(\"resize\",this._resizeHandler),r.os.tablet||r.os.phone?(e.removeEventListener(\"touchstart\",this._touchstartHandler),e.removeEventListener(\"touchmove\",this._touchmoveHandler),e.removeEventListener(\"touchend\",this._touchendHandler)):(e.removeEventListener(\"click\",this._clickHandler),e.removeEventListener(\"dblclick\",this._dblclickHandler),e.removeEventListener(\"mousewheel\",this._mousewheelHandler),e.removeEventListener(\"mousemove\",this._mousemoveHandler),e.removeEventListener(\"mousedown\",this._mousedownHandler),e.removeEventListener(\"mouseup\",this._mouseupHandler)),e.removeEventListener(\"DOMMouseScroll\",this._mousewheelHandler),e.removeEventListener(\"mouseout\",this._mouseoutHandler)):(window.detachEvent(\"onresize\",this._resizeHandler),e.detachEvent(\"onclick\",this._clickHandler),e.detachEvent(\"dblclick\",this._dblclickHandler),e.detachEvent(\"onmousewheel\",this._mousewheelHandler),e.detachEvent(\"onmousemove\",this._mousemoveHandler),e.detachEvent(\"onmouseout\",this._mouseoutHandler),e.detachEvent(\"onmousedown\",this._mousedownHandler),e.detachEvent(\"onmouseup\",this._mouseupHandler)),this.root=this._domHover=this.storage=this.painter=null,this.un()},u.prototype._processDragStart=function(e){var t=this._lastHover;if(this._isMouseDown&&t&&t.draggable&&!this._draggingTarget&&this._mouseDownTarget==t){if(t.dragEnableTime&&new Date-this._lastMouseDownMoment<t.dragEnableTime)return;var i=t;this._draggingTarget=i,this._isDragging=1,i.invisible=!0,this.storage.mod(i.id),this._dispatchAgency(i,V.DRAGSTART,e),this.painter.refresh()}},u.prototype._processDragEnter=function(e){this._draggingTarget&&this._dispatchAgency(this._lastHover,V.DRAGENTER,e,this._draggingTarget)},u.prototype._processDragOver=function(e){this._draggingTarget&&this._dispatchAgency(this._lastHover,V.DRAGOVER,e,this._draggingTarget)},u.prototype._processDragLeave=function(e){this._draggingTarget&&this._dispatchAgency(this._lastHover,V.DRAGLEAVE,e,this._draggingTarget)},u.prototype._processDrop=function(e){this._draggingTarget&&(this._draggingTarget.invisible=!1,this.storage.mod(this._draggingTarget.id),this.painter.refresh(),this._dispatchAgency(this._lastHover,V.DROP,e,this._draggingTarget))},u.prototype._processDragEnd=function(e){this._draggingTarget&&(this._dispatchAgency(this._draggingTarget,V.DRAGEND,e),this._lastHover=null),this._isDragging=0,this._draggingTarget=null},u.prototype._processOverShape=function(e){this._dispatchAgency(this._lastHover,V.MOUSEOVER,e)},u.prototype._processOutShape=function(e){this._dispatchAgency(this._lastHover,V.MOUSEOUT,e)},u.prototype._dispatchAgency=function(e,t,i,n){var a=\"on\"+t,o={type:t,event:i,target:e,cancelBubble:!1},r=e;for(n&&(o.dragged=n);r&&(r[a]&&(o.cancelBubble=r[a](o)),r.dispatch(t,o),r=r.parent,!o.cancelBubble););if(e)o.cancelBubble||this.dispatch(t,o);else if(!n){var s={type:t,event:i};this.dispatch(t,s),this.painter.eachOtherLayer(function(e){\"function\"==typeof e[a]&&e[a](s),e.dispatch&&e.dispatch(t,s)})}},u.prototype._iterateAndFindHover=function(){var e=m.create();return function(){for(var t,i,n=this.storage.getShapeList(),a=[0,0],o=n.length-1;o>=0;o--){var r=n[o];if(t!==r.zlevel&&(i=this.painter.getLayer(r.zlevel,i),a[0]=this._mouseX,a[1]=this._mouseY,i.needTransform&&(m.invert(e,i.transform),h.applyTransform(a,a,e))),this._findHover(r,a[0],a[1]))break}}}();var y=[{x:10},{x:-20},{x:10,y:10},{y:-20}];return u.prototype._mobileFindFixed=function(e){this._lastHover=null,this._mouseX=e.zrenderX,this._mouseY=e.zrenderY,this._event=e,this._iterateAndFindHover();for(var t=0;!this._lastHover&&t<y.length;t++){var i=y[t];i.x&&(this._mouseX+=i.x),i.y&&(this._mouseY+=i.y),this._iterateAndFindHover()}this._lastHover&&(e.zrenderX=this._mouseX,e.zrenderY=this._mouseY)},u.prototype._zrenderEventFixed=function(e,t){if(e.zrenderFixed)return e;if(t){var i=\"touchend\"!=e.type?e.targetTouches[0]:e.changedTouches[0];if(i){var n=this.painter._domRoot.getBoundingClientRect();e.zrenderX=i.clientX-n.left,e.zrenderY=i.clientY-n.top}}else{e=e||window.event;var a=e.toElement||e.relatedTarget||e.srcElement||e.target;a&&a!=this._domHover&&(e.zrenderX=(\"undefined\"!=typeof e.offsetX?e.offsetX:e.layerX)+a.offsetLeft,e.zrenderY=(\"undefined\"!=typeof e.offsetY?e.offsetY:e.layerY)+a.offsetTop)}return e.zrenderFixed=1,e},l.merge(u.prototype,U.prototype,!0),u}),i(\"zrender/Painter\",[\"require\",\"./config\",\"./tool/util\",\"./tool/log\",\"./loadingEffect/Base\",\"./Layer\",\"./shape/Image\"],function(e){\"use strict\";function t(){return!1}function i(){}function n(e){return e?e.isBuildin?!0:\"function\"!=typeof e.resize||\"function\"!=typeof e.refresh?!1:!0:!1}var a=e(\"./config\"),o=e(\"./tool/util\"),r=e(\"./tool/log\"),s=e(\"./loadingEffect/Base\"),l=e(\"./Layer\"),h=function(e,i){this.root=e,e.style[\"-webkit-tap-highlight-color\"]=\"transparent\",e.style[\"-webkit-user-select\"]=\"none\",e.style[\"user-select\"]=\"none\",e.style[\"-webkit-touch-callout\"]=\"none\",this.storage=i,e.innerHTML=\"\",this._width=this._getWidth(),this._height=this._getHeight();var n=document.createElement(\"div\");this._domRoot=n,n.style.position=\"relative\",n.style.overflow=\"hidden\",n.style.width=this._width+\"px\",n.style.height=this._height+\"px\",e.appendChild(n),this._layers={},this._zlevelList=[],this._layerConfig={},this._loadingEffect=new s({}),this.shapeToImage=this._createShapeToImageProcessor(),this._bgDom=document.createElement(\"div\"),this._bgDom.style.cssText=[\"position:absolute;left:0px;top:0px;width:\",this._width,\"px;height:\",this._height+\"px;\",\"-webkit-user-select:none;user-select;none;\",\"-webkit-touch-callout:none;\"].join(\"\"),this._bgDom.setAttribute(\"data-zr-dom-id\",\"bg\"),this._bgDom.className=a.elementClassName,n.appendChild(this._bgDom),this._bgDom.onselectstart=t;var o=new l(\"_zrender_hover_\",this);this._layers.hover=o,n.appendChild(o.dom),o.initContext(),o.dom.onselectstart=t,o.dom.style[\"-webkit-user-select\"]=\"none\",o.dom.style[\"user-select\"]=\"none\",o.dom.style[\"-webkit-touch-callout\"]=\"none\",this.refreshNextFrame=null};return h.prototype.render=function(e){return this.isLoading()&&this.hideLoading(),this.refresh(e,!0),this},h.prototype.refresh=function(e,t){var i=this.storage.getShapeList(!0);this._paintList(i,t);for(var n=0;n<this._zlevelList.length;n++){var a=this._zlevelList[n],o=this._layers[a];!o.isBuildin&&o.refresh&&o.refresh()}return\"function\"==typeof e&&e(),this},h.prototype._preProcessLayer=function(e){e.unusedCount++,e.updateTransform()},h.prototype._postProcessLayer=function(e){e.dirty=!1,1==e.unusedCount&&e.clear()},h.prototype._paintList=function(e,t){\"undefined\"==typeof t&&(t=!1),this._updateLayerStatus(e);var i,n,o;this.eachBuildinLayer(this._preProcessLayer);for(var s=0,l=e.length;l>s;s++){var h=e[s];if(n!==h.zlevel&&(i&&(i.needTransform&&o.restore(),o.flush&&o.flush()),n=h.zlevel,i=this.getLayer(n),i.isBuildin||r(\"ZLevel \"+n+\" has been used by unkown layer \"+i.id),o=i.ctx,i.unusedCount=0,(i.dirty||t)&&i.clear(),i.needTransform&&(o.save(),i.setTransform(o))),(i.dirty||t)&&!h.invisible&&(!h.onbrush||h.onbrush&&!h.onbrush(o,!1)))if(a.catchBrushException)try{h.brush(o,!1,this.refreshNextFrame)}catch(m){r(m,\"brush error of \"+h.type,h)}else h.brush(o,!1,this.refreshNextFrame);h.__dirty=!1}i&&(i.needTransform&&o.restore(),o.flush&&o.flush()),this.eachBuildinLayer(this._postProcessLayer)},h.prototype.getLayer=function(e){var t=this._layers[e];return t||(t=new l(e,this),t.isBuildin=!0,this._layerConfig[e]&&o.merge(t,this._layerConfig[e],!0),t.updateTransform(),this.insertLayer(e,t),t.initContext()),t},h.prototype.insertLayer=function(e,t){if(this._layers[e])return void r(\"ZLevel \"+e+\" has been used already\");if(!n(t))return void r(\"Layer of zlevel \"+e+\" is not valid\");var i=this._zlevelList.length,a=null,o=-1;if(i>0&&e>this._zlevelList[0]){for(o=0;i-1>o&&!(this._zlevelList[o]<e&&this._zlevelList[o+1]>e);o++);a=this._layers[this._zlevelList[o]]}this._zlevelList.splice(o+1,0,e);var s=a?a.dom:this._bgDom;s.nextSibling?s.parentNode.insertBefore(t.dom,s.nextSibling):s.parentNode.appendChild(t.dom),this._layers[e]=t},h.prototype.eachLayer=function(e,t){for(var i=0;i<this._zlevelList.length;i++){var n=this._zlevelList[i];e.call(t,this._layers[n],n)}},h.prototype.eachBuildinLayer=function(e,t){for(var i=0;i<this._zlevelList.length;i++){var n=this._zlevelList[i],a=this._layers[n];a.isBuildin&&e.call(t,a,n)}},h.prototype.eachOtherLayer=function(e,t){for(var i=0;i<this._zlevelList.length;i++){var n=this._zlevelList[i],a=this._layers[n];a.isBuildin||e.call(t,a,n)}},h.prototype.getLayers=function(){return this._layers},h.prototype._updateLayerStatus=function(e){var t=this._layers,i={};this.eachBuildinLayer(function(e,t){i[t]=e.elCount,e.elCount=0});for(var n=0,a=e.length;a>n;n++){var o=e[n],r=o.zlevel,s=t[r];if(s){if(s.elCount++,s.dirty)continue;s.dirty=o.__dirty}}this.eachBuildinLayer(function(e,t){i[t]!==e.elCount&&(e.dirty=!0)})},h.prototype.refreshShapes=function(e,t){for(var i=0,n=e.length;n>i;i++){var a=e[i];a.modSelf()}return this.refresh(t),this},h.prototype.setLoadingEffect=function(e){return this._loadingEffect=e,this},h.prototype.clear=function(){return this.eachBuildinLayer(this._clearLayer),this},h.prototype._clearLayer=function(e){e.clear()},h.prototype.modLayer=function(e,t){if(t){this._layerConfig[e]?o.merge(this._layerConfig[e],t,!0):this._layerConfig[e]=t;var i=this._layers[e];i&&o.merge(i,this._layerConfig[e],!0)}},h.prototype.delLayer=function(e){var t=this._layers[e];t&&(this.modLayer(e,{position:t.position,rotation:t.rotation,scale:t.scale}),t.dom.parentNode.removeChild(t.dom),delete this._layers[e],this._zlevelList.splice(o.indexOf(this._zlevelList,e),1))},h.prototype.refreshHover=function(){this.clearHover();for(var e=this.storage.getHoverShapes(!0),t=0,i=e.length;i>t;t++)this._brushHover(e[t]);var n=this._layers.hover.ctx;return n.flush&&n.flush(),this.storage.delHover(),this},h.prototype.clearHover=function(){var e=this._layers.hover;return e&&e.clear(),this},h.prototype.showLoading=function(e){return this._loadingEffect&&this._loadingEffect.stop(),e&&this.setLoadingEffect(e),this._loadingEffect.start(this),this.loading=!0,this},h.prototype.hideLoading=function(){return this._loadingEffect.stop(),this.clearHover(),this.loading=!1,this},h.prototype.isLoading=function(){return this.loading},h.prototype.resize=function(){var e=this._domRoot;e.style.display=\"none\";var t=this._getWidth(),i=this._getHeight();if(e.style.display=\"\",this._width!=t||i!=this._height){this._width=t,this._height=i,e.style.width=t+\"px\",e.style.height=i+\"px\";for(var n in this._layers)this._layers[n].resize(t,i);this.refresh(null,!0)}return this},h.prototype.clearLayer=function(e){var t=this._layers[e];t&&t.clear()},h.prototype.dispose=function(){this.isLoading()&&this.hideLoading(),this.root.innerHTML=\"\",this.root=this.storage=this._domRoot=this._layers=null},h.prototype.getDomHover=function(){return this._layers.hover.dom},h.prototype.toDataURL=function(e,t,i){if(window.G_vmlCanvasManager)return null;var n=new l(\"image\",this);this._bgDom.appendChild(n.dom),n.initContext();var o=n.ctx;n.clearColor=t||\"#fff\",n.clear();var s=this;this.storage.iterShape(function(e){if(!e.invisible&&(!e.onbrush||e.onbrush&&!e.onbrush(o,!1)))if(a.catchBrushException)try{e.brush(o,!1,s.refreshNextFrame)}catch(t){r(t,\"brush error of \"+e.type,e)}else e.brush(o,!1,s.refreshNextFrame)},{normal:\"up\",update:!0});var h=n.dom.toDataURL(e,i);return o=null,this._bgDom.removeChild(n.dom),h},h.prototype.getWidth=function(){return this._width},h.prototype.getHeight=function(){return this._height},h.prototype._getWidth=function(){var e=this.root,t=e.currentStyle||document.defaultView.getComputedStyle(e);return((e.clientWidth||parseInt(t.width,10))-parseInt(t.paddingLeft,10)-parseInt(t.paddingRight,10)).toFixed(0)-0},h.prototype._getHeight=function(){var e=this.root,t=e.currentStyle||document.defaultView.getComputedStyle(e);return((e.clientHeight||parseInt(t.height,10))-parseInt(t.paddingTop,10)-parseInt(t.paddingBottom,10)).toFixed(0)-0},h.prototype._brushHover=function(e){var t=this._layers.hover.ctx;if(!e.onbrush||e.onbrush&&!e.onbrush(t,!0)){var i=this.getLayer(e.zlevel);if(i.needTransform&&(t.save(),i.setTransform(t)),a.catchBrushException)try{e.brush(t,!0,this.refreshNextFrame)}catch(n){r(n,\"hoverBrush error of \"+e.type,e)}else e.brush(t,!0,this.refreshNextFrame);i.needTransform&&t.restore()}},h.prototype._shapeToImage=function(t,i,n,a,o){var r=document.createElement(\"canvas\"),s=r.getContext(\"2d\");r.style.width=n+\"px\",r.style.height=a+\"px\",r.setAttribute(\"width\",n*o),r.setAttribute(\"height\",a*o),s.clearRect(0,0,n*o,a*o);var l={position:i.position,rotation:i.rotation,scale:i.scale};i.position=[0,0,0],i.rotation=0,i.scale=[1,1],i&&i.brush(s,!1);var h=e(\"./shape/Image\"),m=new h({id:t,style:{x:0,y:0,image:r}});return null!=l.position&&(m.position=i.position=l.position),null!=l.rotation&&(m.rotation=i.rotation=l.rotation),null!=l.scale&&(m.scale=i.scale=l.scale),m},h.prototype._createShapeToImageProcessor=function(){if(window.G_vmlCanvasManager)return i;var e=this;return function(t,i,n,o){return e._shapeToImage(t,i,n,o,a.devicePixelRatio)}},h}),i(\"zrender/Storage\",[\"require\",\"./tool/util\",\"./Group\"],function(e){\"use strict\";function t(e,t){return e.zlevel==t.zlevel?e.z==t.z?e.__renderidx-t.__renderidx:e.z-t.z:e.zlevel-t.zlevel}var i=e(\"./tool/util\"),n=e(\"./Group\"),a={hover:!1,normal:\"down\",update:!1},o=function(){this._elements={},this._hoverElements=[],this._roots=[],this._shapeList=[],this._shapeListOffset=0};return o.prototype.iterShape=function(e,t){if(t||(t=a),t.hover)for(var i=0,n=this._hoverElements.length;n>i;i++){var o=this._hoverElements[i];if(o.updateTransform(),e(o))return this}switch(t.update&&this.updateShapeList(),t.normal){case\"down\":for(var n=this._shapeList.length;n--;)if(e(this._shapeList[n]))return this;break;default:for(var i=0,n=this._shapeList.length;n>i;i++)if(e(this._shapeList[i]))return this}return this},o.prototype.getHoverShapes=function(e){for(var i=[],n=0,a=this._hoverElements.length;a>n;n++){i.push(this._hoverElements[n]);var o=this._hoverElements[n].hoverConnect;if(o){var r;o=o instanceof Array?o:[o];for(var s=0,l=o.length;l>s;s++)r=o[s].id?o[s]:this.get(o[s]),r&&i.push(r)}}if(i.sort(t),e)for(var n=0,a=i.length;a>n;n++)i[n].updateTransform();return i},o.prototype.getShapeList=function(e){return e&&this.updateShapeList(),this._shapeList},o.prototype.updateShapeList=function(){this._shapeListOffset=0;for(var e=0,i=this._roots.length;i>e;e++){var n=this._roots[e];this._updateAndAddShape(n)}this._shapeList.length=this._shapeListOffset;for(var e=0,i=this._shapeList.length;i>e;e++)this._shapeList[e].__renderidx=e;this._shapeList.sort(t)},o.prototype._updateAndAddShape=function(e,t){if(!e.ignore)if(e.updateTransform(),e.clipShape&&(e.clipShape.parent=e,e.clipShape.updateTransform(),t?(t=t.slice(),t.push(e.clipShape)):t=[e.clipShape]),\"group\"==e.type){for(var i=0;i<e._children.length;i++){var n=e._children[i];n.__dirty=e.__dirty||n.__dirty,this._updateAndAddShape(n,t)}e.__dirty=!1}else e.__clipShapes=t,this._shapeList[this._shapeListOffset++]=e},o.prototype.mod=function(e,t){if(\"string\"==typeof e&&(e=this._elements[e]),e&&(e.modSelf(),t))if(t.parent||t._storage||t.__clipShapes){var n={};for(var a in t)\"parent\"!==a&&\"_storage\"!==a&&\"__clipShapes\"!==a&&t.hasOwnProperty(a)&&(n[a]=t[a]);i.merge(e,n,!0)}else i.merge(e,t,!0);return this},o.prototype.drift=function(e,t,i){var n=this._elements[e];return n&&(n.needTransform=!0,\"horizontal\"===n.draggable?i=0:\"vertical\"===n.draggable&&(t=0),(!n.ondrift||n.ondrift&&!n.ondrift(t,i))&&n.drift(t,i)),this},o.prototype.addHover=function(e){return e.updateNeedTransform(),this._hoverElements.push(e),this},o.prototype.delHover=function(){return this._hoverElements=[],this},o.prototype.hasHoverShape=function(){return this._hoverElements.length>0},o.prototype.addRoot=function(e){this._elements[e.id]||(e instanceof n&&e.addChildrenToStorage(this),this.addToMap(e),this._roots.push(e))},o.prototype.delRoot=function(e){if(\"undefined\"==typeof e){for(var t=0;t<this._roots.length;t++){var a=this._roots[t];a instanceof n&&a.delChildrenFromStorage(this)}return this._elements={},this._hoverElements=[],this._roots=[],this._shapeList=[],void(this._shapeListOffset=0)}if(e instanceof Array)for(var t=0,o=e.length;o>t;t++)this.delRoot(e[t]);else{var r;r=\"string\"==typeof e?this._elements[e]:e;var s=i.indexOf(this._roots,r);s>=0&&(this.delFromMap(r.id),this._roots.splice(s,1),r instanceof n&&r.delChildrenFromStorage(this))}},o.prototype.addToMap=function(e){return e instanceof n&&(e._storage=this),e.modSelf(),this._elements[e.id]=e,this},o.prototype.get=function(e){return this._elements[e]},o.prototype.delFromMap=function(e){var t=this._elements[e];return t&&(delete this._elements[e],t instanceof n&&(t._storage=null)),this},o.prototype.dispose=function(){this._elements=this._renderList=this._roots=this._hoverElements=null},o}),i(\"zrender/animation/Animation\",[\"require\",\"./Clip\",\"../tool/color\",\"../tool/util\",\"../tool/event\"],function(e){\"use strict\";function t(e,t){return e[t]}function i(e,t,i){e[t]=i}function n(e,t,i){return(t-e)*i+e}function a(e,t,i,a,o){var r=e.length;if(1==o)for(var s=0;r>s;s++)a[s]=n(e[s],t[s],i);else for(var l=e[0].length,s=0;r>s;s++)for(var h=0;l>h;h++)a[s][h]=n(e[s][h],t[s][h],i)}function o(e){switch(typeof e){case\"undefined\":case\"string\":return!1}return\"undefined\"!=typeof e.length}function r(e,t,i,n,a,o,r,l,h){var m=e.length;if(1==h)for(var V=0;m>V;V++)l[V]=s(e[V],t[V],i[V],n[V],a,o,r);else for(var U=e[0].length,V=0;m>V;V++)for(var d=0;U>d;d++)l[V][d]=s(e[V][d],t[V][d],i[V][d],n[V][d],a,o,r)}function s(e,t,i,n,a,o,r){var s=.5*(i-e),l=.5*(n-t);return(2*(t-i)+s+l)*r+(-3*(t-i)-2*s-l)*o+s*a+t}function l(e){if(o(e)){var t=e.length;if(o(e[0])){for(var i=[],n=0;t>n;n++)i.push(c.call(e[n]));return i}return c.call(e)}return e}function h(e){return e[0]=Math.floor(e[0]),e[1]=Math.floor(e[1]),e[2]=Math.floor(e[2]),\"rgba(\"+e.join(\",\")+\")\"}var m=e(\"./Clip\"),V=e(\"../tool/color\"),U=e(\"../tool/util\"),d=e(\"../tool/event\").Dispatcher,p=window.requestAnimationFrame||window.msRequestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||function(e){setTimeout(e,16)},c=Array.prototype.slice,u=function(e){e=e||{},this.stage=e.stage||{},this.onframe=e.onframe||function(){},this._clips=[],this._running=!1,this._time=0,d.call(this)};u.prototype={add:function(e){this._clips.push(e)},remove:function(e){if(e.__inStep)e.__needsRemove=!0;else{var t=U.indexOf(this._clips,e);t>=0&&this._clips.splice(t,1)}},_update:function(){for(var e=(new Date).getTime(),t=e-this._time,i=this._clips,n=i.length,a=[],o=[],r=0;n>r;r++){var s=i[r];s.__inStep=!0;var l=s.step(e);s.__inStep=!1,l&&(a.push(l),o.push(s))}for(var r=0;n>r;)i[r].__needsRemove?(i[r]=i[n-1],i.pop(),n--):r++;n=a.length;for(var r=0;n>r;r++)o[r].fire(a[r]);this._time=e,this.onframe(t),this.dispatch(\"frame\",t),this.stage.update&&this.stage.update()},start:function(){function e(){t._running&&(p(e),t._update())}var t=this;this._running=!0,this._time=(new Date).getTime(),p(e)},stop:function(){this._running=!1},clear:function(){this._clips=[]},animate:function(e,t){t=t||{};var i=new y(e,t.loop,t.getter,t.setter);return i.animation=this,i},constructor:u},U.merge(u.prototype,d.prototype,!0);var y=function(e,n,a,o){this._tracks={},this._target=e,this._loop=n||!1,this._getter=a||t,this._setter=o||i,this._clipCount=0,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]};return y.prototype={when:function(e,t){for(var i in t)this._tracks[i]||(this._tracks[i]=[],0!==e&&this._tracks[i].push({time:0,value:l(this._getter(this._target,i))})),this._tracks[i].push({time:parseInt(e,10),value:t[i]});return this},during:function(e){return this._onframeList.push(e),this},start:function(e){var t=this,i=this._setter,l=this._getter,U=\"spline\"===e,d=function(){if(t._clipCount--,0===t._clipCount){t._tracks={};for(var e=t._doneList.length,i=0;e>i;i++)t._doneList[i].call(t)}},p=function(p,c){var u=p.length;if(u){var y=p[0].value,g=o(y),b=!1,f=g&&o(y[0])?2:1;p.sort(function(e,t){return e.time-t.time});var k;if(u){k=p[u-1].time;for(var x=[],_=[],L=0;u>L;L++){x.push(p[L].time/k);var W=p[L].value;\"string\"==typeof W&&(W=V.toArray(W),0===W.length&&(W[0]=W[1]=W[2]=0,W[3]=1),b=!0),_.push(W)}var X,L,v,w,K,I,J,C=0,S=0;if(b)var E=[0,0,0,0];var F=function(e,o){if(S>o){for(X=Math.min(C+1,u-1),L=X;L>=0&&!(x[L]<=o);L--);L=Math.min(L,u-2)}else{for(L=C;u>L&&!(x[L]>o);L++);L=Math.min(L-1,u-2)}C=L,S=o;var m=x[L+1]-x[L];if(0!==m){if(v=(o-x[L])/m,U)if(K=_[L],w=_[0===L?L:L-1],I=_[L>u-2?u-1:L+1],J=_[L>u-3?u-1:L+2],g)r(w,K,I,J,v,v*v,v*v*v,l(e,c),f);else{var V;b?(V=r(w,K,I,J,v,v*v,v*v*v,E,1),V=h(E)):V=s(w,K,I,J,v,v*v,v*v*v),i(e,c,V)}else if(g)a(_[L],_[L+1],v,l(e,c),f);else{var V;b?(a(_[L],_[L+1],v,E,1),V=h(E)):V=n(_[L],_[L+1],v),i(e,c,V)}for(L=0;L<t._onframeList.length;L++)t._onframeList[L](e,o)}},T=new m({target:t._target,life:k,loop:t._loop,delay:t._delay,onframe:F,ondestroy:d});e&&\"spline\"!==e&&(T.easing=e),t._clipList.push(T),t._clipCount++,t.animation.add(T)}}};for(var c in this._tracks)p(this._tracks[c],c);return this},stop:function(){for(var e=0;e<this._clipList.length;e++){var t=this._clipList[e];this.animation.remove(t)}this._clipList=[]},delay:function(e){return this._delay=e,this},done:function(e){return e&&this._doneList.push(e),this}},u}),i(\"zrender/tool/vector\",[],function(){var e=\"undefined\"==typeof Float32Array?Array:Float32Array,t={create:function(t,i){var n=new e(2);return n[0]=t||0,n[1]=i||0,n},copy:function(e,t){return e[0]=t[0],e[1]=t[1],e},clone:function(t){var i=new e(2);return i[0]=t[0],i[1]=t[1],i},set:function(e,t,i){return e[0]=t,e[1]=i,e},add:function(e,t,i){return e[0]=t[0]+i[0],e[1]=t[1]+i[1],e},scaleAndAdd:function(e,t,i,n){return e[0]=t[0]+i[0]*n,e[1]=t[1]+i[1]*n,e},sub:function(e,t,i){return e[0]=t[0]-i[0],e[1]=t[1]-i[1],e},len:function(e){return Math.sqrt(this.lenSquare(e))},lenSquare:function(e){return e[0]*e[0]+e[1]*e[1]},mul:function(e,t,i){return e[0]=t[0]*i[0],e[1]=t[1]*i[1],e},div:function(e,t,i){return e[0]=t[0]/i[0],e[1]=t[1]/i[1],e},dot:function(e,t){return e[0]*t[0]+e[1]*t[1]},scale:function(e,t,i){return e[0]=t[0]*i,e[1]=t[1]*i,e},normalize:function(e,i){var n=t.len(i);return 0===n?(e[0]=0,e[1]=0):(e[0]=i[0]/n,e[1]=i[1]/n),e},distance:function(e,t){return Math.sqrt((e[0]-t[0])*(e[0]-t[0])+(e[1]-t[1])*(e[1]-t[1]))},distanceSquare:function(e,t){return(e[0]-t[0])*(e[0]-t[0])+(e[1]-t[1])*(e[1]-t[1])},negate:function(e,t){return e[0]=-t[0],e[1]=-t[1],e},lerp:function(e,t,i,n){return e[0]=t[0]+n*(i[0]-t[0]),e[1]=t[1]+n*(i[1]-t[1]),e},applyTransform:function(e,t,i){var n=t[0],a=t[1];return e[0]=i[0]*n+i[2]*a+i[4],e[1]=i[1]*n+i[3]*a+i[5],e},min:function(e,t,i){return e[0]=Math.min(t[0],i[0]),e[1]=Math.min(t[1],i[1]),e},max:function(e,t,i){return e[0]=Math.max(t[0],i[0]),e[1]=Math.max(t[1],i[1]),e}};return t.length=t.len,t.lengthSquare=t.lenSquare,t.dist=t.distance,t.distSquare=t.distanceSquare,t}),i(\"zrender/tool/matrix\",[],function(){var e=\"undefined\"==typeof Float32Array?Array:Float32Array,t={create:function(){var i=new e(6);return t.identity(i),i},identity:function(e){return e[0]=1,e[1]=0,e[2]=0,e[3]=1,e[4]=0,e[5]=0,e},copy:function(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e},mul:function(e,t,i){return e[0]=t[0]*i[0]+t[2]*i[1],e[1]=t[1]*i[0]+t[3]*i[1],e[2]=t[0]*i[2]+t[2]*i[3],e[3]=t[1]*i[2]+t[3]*i[3],e[4]=t[0]*i[4]+t[2]*i[5]+t[4],e[5]=t[1]*i[4]+t[3]*i[5]+t[5],e},translate:function(e,t,i){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4]+i[0],e[5]=t[5]+i[1],e},rotate:function(e,t,i){var n=t[0],a=t[2],o=t[4],r=t[1],s=t[3],l=t[5],h=Math.sin(i),m=Math.cos(i);return e[0]=n*m+r*h,e[1]=-n*h+r*m,e[2]=a*m+s*h,e[3]=-a*h+m*s,e[4]=m*o+h*l,e[5]=m*l-h*o,e},scale:function(e,t,i){var n=i[0],a=i[1];return e[0]=t[0]*n,e[1]=t[1]*a,e[2]=t[2]*n,e[3]=t[3]*a,e[4]=t[4]*n,e[5]=t[5]*a,e},invert:function(e,t){var i=t[0],n=t[2],a=t[4],o=t[1],r=t[3],s=t[5],l=i*r-o*n;return l?(l=1/l,e[0]=r*l,e[1]=-o*l,e[2]=-n*l,e[3]=i*l,e[4]=(n*s-r*a)*l,e[5]=(o*a-i*s)*l,e):null}};return t}),i(\"zrender/loadingEffect/Base\",[\"require\",\"../tool/util\",\"../shape/Text\",\"../shape/Rectangle\"],function(e){function t(e){this.setOptions(e)}var i=e(\"../tool/util\"),n=e(\"../shape/Text\"),a=e(\"../shape/Rectangle\"),o=\"Loading...\",r=\"normal 16px Arial\";return t.prototype.createTextShape=function(e){return new n({highlightStyle:i.merge({x:this.canvasWidth/2,y:this.canvasHeight/2,text:o,textAlign:\"center\",textBaseline:\"middle\",textFont:r,color:\"#333\",brushType:\"fill\"},e,!0)})},t.prototype.createBackgroundShape=function(e){return new a({highlightStyle:{x:0,y:0,width:this.canvasWidth,height:this.canvasHeight,brushType:\"fill\",color:e}})},t.prototype.start=function(e){function t(t){e.storage.addHover(t)}function i(){e.refreshHover()}this.canvasWidth=e._width,this.canvasHeight=e._height,this.loadingTimer=this._start(t,i)},t.prototype._start=function(){return setInterval(function(){},1e4)},t.prototype.stop=function(){clearInterval(this.loadingTimer)},t.prototype.setOptions=function(e){this.options=e||{}},t.prototype.adjust=function(e,t){return e<=t[0]?e=t[0]:e>=t[1]&&(e=t[1]),e},t.prototype.getLocation=function(e,t,i){var n=null!=e.x?e.x:\"center\";switch(n){case\"center\":n=Math.floor((this.canvasWidth-t)/2);break;case\"left\":n=0;break;case\"right\":n=this.canvasWidth-t}var a=null!=e.y?e.y:\"center\";switch(a){case\"center\":a=Math.floor((this.canvasHeight-i)/2);break;case\"top\":a=0;break;case\"bottom\":a=this.canvasHeight-i}return{x:n,y:a,width:t,height:i}},t}),i(\"zrender/Layer\",[\"require\",\"./mixin/Transformable\",\"./tool/util\",\"./config\"],function(e){function t(){return!1}function i(e,t,i){var n=document.createElement(t),a=i.getWidth(),o=i.getHeight();return n.style.position=\"absolute\",n.style.left=0,n.style.top=0,n.style.width=a+\"px\",n.style.height=o+\"px\",n.width=a*r.devicePixelRatio,n.height=o*r.devicePixelRatio,n.setAttribute(\"data-zr-dom-id\",e),n}var n=e(\"./mixin/Transformable\"),a=e(\"./tool/util\"),o=window.G_vmlCanvasManager,r=e(\"./config\"),s=function(e,a){this.id=e,this.dom=i(e,\"canvas\",a),this.dom.onselectstart=t,this.dom.style[\"-webkit-user-select\"]=\"none\",this.dom.style[\"user-select\"]=\"none\",this.dom.style[\"-webkit-touch-callout\"]=\"none\",this.dom.style[\"-webkit-tap-highlight-color\"]=\"rgba(0,0,0,0)\",this.dom.className=r.elementClassName,o&&o.initElement(this.dom),this.domBack=null,this.ctxBack=null,this.painter=a,this.unusedCount=0,this.config=null,this.dirty=!0,this.elCount=0,this.clearColor=0,this.motionBlur=!1,this.lastFrameAlpha=.7,this.zoomable=!1,this.panable=!1,this.maxZoom=1/0,this.minZoom=0,n.call(this)};return s.prototype.initContext=function(){this.ctx=this.dom.getContext(\"2d\");var e=r.devicePixelRatio;1!=e&&this.ctx.scale(e,e)},s.prototype.createBackBuffer=function(){if(!o){this.domBack=i(\"back-\"+this.id,\"canvas\",this.painter),this.ctxBack=this.domBack.getContext(\"2d\");var e=r.devicePixelRatio;1!=e&&this.ctxBack.scale(e,e)}},s.prototype.resize=function(e,t){var i=r.devicePixelRatio;this.dom.style.width=e+\"px\",this.dom.style.height=t+\"px\",this.dom.setAttribute(\"width\",e*i),this.dom.setAttribute(\"height\",t*i),1!=i&&this.ctx.scale(i,i),this.domBack&&(this.domBack.setAttribute(\"width\",e*i),this.domBack.setAttribute(\"height\",t*i),1!=i&&this.ctxBack.scale(i,i))},s.prototype.clear=function(){var e=this.dom,t=this.ctx,i=e.width,n=e.height,a=this.clearColor&&!o,s=this.motionBlur&&!o,l=this.lastFrameAlpha,h=r.devicePixelRatio;if(s&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation=\"copy\",this.ctxBack.drawImage(e,0,0,i/h,n/h)),t.clearRect(0,0,i/h,n/h),a&&(t.save(),t.fillStyle=this.clearColor,t.fillRect(0,0,i/h,n/h),t.restore()),s){var m=this.domBack;t.save(),t.globalAlpha=l,t.drawImage(m,0,0,i/h,n/h),t.restore()}},a.merge(s.prototype,n.prototype),s}),i(\"zrender/shape/Text\",[\"require\",\"../tool/area\",\"./Base\",\"../tool/util\"],function(e){\nvar t=e(\"../tool/area\"),i=e(\"./Base\"),n=function(e){i.call(this,e)};return n.prototype={type:\"text\",brush:function(e,i){var n=this.style;if(i&&(n=this.getHighlightStyle(n,this.highlightStyle||{})),\"undefined\"!=typeof n.text&&n.text!==!1){e.save(),this.doClip(e),this.setContext(e,n),this.setTransform(e),n.textFont&&(e.font=n.textFont),e.textAlign=n.textAlign||\"start\",e.textBaseline=n.textBaseline||\"middle\";var a,o=(n.text+\"\").split(\"\\n\"),r=t.getTextHeight(\"国\",n.textFont),s=this.getRect(n),l=n.x;a=\"top\"==n.textBaseline?s.y:\"bottom\"==n.textBaseline?s.y+r:s.y+r/2;for(var h=0,m=o.length;m>h;h++){if(n.maxWidth)switch(n.brushType){case\"fill\":e.fillText(o[h],l,a,n.maxWidth);break;case\"stroke\":e.strokeText(o[h],l,a,n.maxWidth);break;case\"both\":e.fillText(o[h],l,a,n.maxWidth),e.strokeText(o[h],l,a,n.maxWidth);break;default:e.fillText(o[h],l,a,n.maxWidth)}else switch(n.brushType){case\"fill\":e.fillText(o[h],l,a);break;case\"stroke\":e.strokeText(o[h],l,a);break;case\"both\":e.fillText(o[h],l,a),e.strokeText(o[h],l,a);break;default:e.fillText(o[h],l,a)}a+=r}e.restore()}},getRect:function(e){if(e.__rect)return e.__rect;var i=t.getTextWidth(e.text,e.textFont),n=t.getTextHeight(e.text,e.textFont),a=e.x;\"end\"==e.textAlign||\"right\"==e.textAlign?a-=i:\"center\"==e.textAlign&&(a-=i/2);var o;return o=\"top\"==e.textBaseline?e.y:\"bottom\"==e.textBaseline?e.y-n:e.y-n/2,e.__rect={x:a,y:o,width:i,height:n},e.__rect}},e(\"../tool/util\").inherits(n,i),n}),i(\"zrender/shape/Rectangle\",[\"require\",\"./Base\",\"../tool/util\"],function(e){var t=e(\"./Base\"),i=function(e){t.call(this,e)};return i.prototype={type:\"rectangle\",_buildRadiusPath:function(e,t){var i,n,a,o,r=t.x,s=t.y,l=t.width,h=t.height,m=t.radius;\"number\"==typeof m?i=n=a=o=m:m instanceof Array?1===m.length?i=n=a=o=m[0]:2===m.length?(i=a=m[0],n=o=m[1]):3===m.length?(i=m[0],n=o=m[1],a=m[2]):(i=m[0],n=m[1],a=m[2],o=m[3]):i=n=a=o=0;var V;i+n>l&&(V=i+n,i*=l/V,n*=l/V),a+o>l&&(V=a+o,a*=l/V,o*=l/V),n+a>h&&(V=n+a,n*=h/V,a*=h/V),i+o>h&&(V=i+o,i*=h/V,o*=h/V),e.moveTo(r+i,s),e.lineTo(r+l-n,s),0!==n&&e.quadraticCurveTo(r+l,s,r+l,s+n),e.lineTo(r+l,s+h-a),0!==a&&e.quadraticCurveTo(r+l,s+h,r+l-a,s+h),e.lineTo(r+o,s+h),0!==o&&e.quadraticCurveTo(r,s+h,r,s+h-o),e.lineTo(r,s+i),0!==i&&e.quadraticCurveTo(r,s,r+i,s)},buildPath:function(e,t){t.radius?this._buildRadiusPath(e,t):(e.moveTo(t.x,t.y),e.lineTo(t.x+t.width,t.y),e.lineTo(t.x+t.width,t.y+t.height),e.lineTo(t.x,t.y+t.height),e.lineTo(t.x,t.y)),e.closePath()},getRect:function(e){if(e.__rect)return e.__rect;var t;return t=\"stroke\"==e.brushType||\"fill\"==e.brushType?e.lineWidth||1:0,e.__rect={x:Math.round(e.x-t/2),y:Math.round(e.y-t/2),width:e.width+t,height:e.height+t},e.__rect}},e(\"../tool/util\").inherits(i,t),i}),i(\"zrender/tool/area\",[\"require\",\"./util\",\"./curve\"],function(e){\"use strict\";function t(e){return e%=C,0>e&&(e+=C),e}function i(e,t,i,o){if(!t||!e)return!1;var r=e.type;L=L||W.getContext();var s=n(e,t,i,o);if(\"undefined\"!=typeof s)return s;if(e.buildPath&&L.isPointInPath)return a(e,L,t,i,o);switch(r){case\"ellipse\":return!0;case\"trochoid\":var l=\"out\"==t.location?t.r1+t.r2+t.d:t.r1-t.r2+t.d;return d(t,i,o,l);case\"rose\":return d(t,i,o,t.maxr);default:return!1}}function n(e,t,i,n){var a=e.type;switch(a){case\"bezier-curve\":return\"undefined\"==typeof t.cpX2?l(t.xStart,t.yStart,t.cpX1,t.cpY1,t.xEnd,t.yEnd,t.lineWidth,i,n):s(t.xStart,t.yStart,t.cpX1,t.cpY1,t.cpX2,t.cpY2,t.xEnd,t.yEnd,t.lineWidth,i,n);case\"line\":return r(t.xStart,t.yStart,t.xEnd,t.yEnd,t.lineWidth,i,n);case\"polyline\":return m(t.pointList,t.lineWidth,i,n);case\"ring\":return V(t.x,t.y,t.r0,t.r,i,n);case\"circle\":return d(t.x,t.y,t.r,i,n);case\"sector\":var o=t.startAngle*Math.PI/180,h=t.endAngle*Math.PI/180;return t.clockWise||(o=-o,h=-h),p(t.x,t.y,t.r0,t.r,o,h,!t.clockWise,i,n);case\"path\":return t.pathArray&&k(t.pathArray,Math.max(t.lineWidth,5),t.brushType,i,n);case\"polygon\":case\"star\":case\"isogon\":return c(t.pointList,i,n);case\"text\":var u=t.__rect||e.getRect(t);return U(u.x,u.y,u.width,u.height,i,n);case\"rectangle\":case\"image\":return U(t.x,t.y,t.width,t.height,i,n)}}function a(e,t,i,n,a){return t.beginPath(),e.buildPath(t,i),t.closePath(),t.isPointInPath(n,a)}function o(e,t,n,a){return!i(e,t,n,a)}function r(e,t,i,n,a,o,r){if(0===a)return!1;var s=Math.max(a,5),l=0,h=e;if(r>t+s&&r>n+s||t-s>r&&n-s>r||o>e+s&&o>i+s||e-s>o&&i-s>o)return!1;if(e===i)return Math.abs(o-e)<=s/2;l=(t-n)/(e-i),h=(e*n-i*t)/(e-i);var m=l*o-r+h,V=m*m/(l*l+1);return s/2*s/2>=V}function s(e,t,i,n,a,o,r,s,l,h,m){if(0===l)return!1;var V=Math.max(l,5);if(m>t+V&&m>n+V&&m>o+V&&m>s+V||t-V>m&&n-V>m&&o-V>m&&s-V>m||h>e+V&&h>i+V&&h>a+V&&h>r+V||e-V>h&&i-V>h&&a-V>h&&r-V>h)return!1;var U=X.cubicProjectPoint(e,t,i,n,a,o,r,s,h,m,null);return V/2>=U}function l(e,t,i,n,a,o,r,s,l){if(0===r)return!1;var h=Math.max(r,5);if(l>t+h&&l>n+h&&l>o+h||t-h>l&&n-h>l&&o-h>l||s>e+h&&s>i+h&&s>a+h||e-h>s&&i-h>s&&a-h>s)return!1;var m=X.quadraticProjectPoint(e,t,i,n,a,o,s,l,null);return h/2>=m}function h(e,i,n,a,o,r,s,l,h){if(0===s)return!1;var m=Math.max(s,5);l-=e,h-=i;var V=Math.sqrt(l*l+h*h);if(V-m>n||n>V+m)return!1;if(Math.abs(a-o)>=C)return!0;if(r){var U=a;a=t(o),o=t(U)}else a=t(a),o=t(o);a>o&&(o+=C);var d=Math.atan2(h,l);return 0>d&&(d+=C),d>=a&&o>=d||d+C>=a&&o>=d+C}function m(e,t,i,n){for(var t=Math.max(t,10),a=0,o=e.length-1;o>a;a++){var s=e[a][0],l=e[a][1],h=e[a+1][0],m=e[a+1][1];if(r(s,l,h,m,t,i,n))return!0}return!1}function V(e,t,i,n,a,o){var r=(a-e)*(a-e)+(o-t)*(o-t);return n*n>r&&r>i*i}function U(e,t,i,n,a,o){return a>=e&&e+i>=a&&o>=t&&t+n>=o}function d(e,t,i,n,a){return i*i>(n-e)*(n-e)+(a-t)*(a-t)}function p(e,t,i,n,a,o,r,s,l){return h(e,t,(i+n)/2,a,o,r,n-i,s,l)}function c(e,t,i){for(var n=e.length,a=0,o=0,r=n-1;n>o;o++){var s=e[r][0],l=e[r][1],h=e[o][0],m=e[o][1];a+=u(s,l,h,m,t,i),r=o}return 0!==a}function u(e,t,i,n,a,o){if(o>t&&o>n||t>o&&n>o)return 0;if(n==t)return 0;var r=t>n?1:-1,s=(o-t)/(n-t),l=s*(i-e)+e;return l>a?r:0}function y(){var e=E[0];E[0]=E[1],E[1]=e}function g(e,t,i,n,a,o,r,s,l,h){if(h>t&&h>n&&h>o&&h>s||t>h&&n>h&&o>h&&s>h)return 0;var m=X.cubicRootAt(t,n,o,s,h,S);if(0===m)return 0;for(var V,U,d=0,p=-1,c=0;m>c;c++){var u=S[c],g=X.cubicAt(e,i,a,r,u);l>g||(0>p&&(p=X.cubicExtrema(t,n,o,s,E),E[1]<E[0]&&p>1&&y(),V=X.cubicAt(t,n,o,s,E[0]),p>1&&(U=X.cubicAt(t,n,o,s,E[1]))),d+=2==p?u<E[0]?t>V?1:-1:u<E[1]?V>U?1:-1:U>s?1:-1:u<E[0]?t>V?1:-1:V>s?1:-1)}return d}function b(e,t,i,n,a,o,r,s){if(s>t&&s>n&&s>o||t>s&&n>s&&o>s)return 0;var l=X.quadraticRootAt(t,n,o,s,S);if(0===l)return 0;var h=X.quadraticExtremum(t,n,o);if(h>=0&&1>=h){for(var m=0,V=X.quadraticAt(t,n,o,h),U=0;l>U;U++){var d=X.quadraticAt(e,i,a,S[U]);r>d||(m+=S[U]<h?t>V?1:-1:V>o?1:-1)}return m}var d=X.quadraticAt(e,i,a,S[0]);return r>d?0:t>o?1:-1}function f(e,i,n,a,o,r,s,l){if(l-=i,l>n||-n>l)return 0;var h=Math.sqrt(n*n-l*l);if(S[0]=-h,S[1]=h,Math.abs(a-o)>=C){a=0,o=C;var m=r?1:-1;return s>=S[0]+e&&s<=S[1]+e?m:0}if(r){var h=a;a=t(o),o=t(h)}else a=t(a),o=t(o);a>o&&(o+=C);for(var V=0,U=0;2>U;U++){var d=S[U];if(d+e>s){var p=Math.atan2(l,d),m=r?1:-1;0>p&&(p=C+p),(p>=a&&o>=p||p+C>=a&&o>=p+C)&&(p>Math.PI/2&&p<1.5*Math.PI&&(m=-m),V+=m)}}return V}function k(e,t,i,n,a){var o=0,m=0,V=0,U=0,d=0,p=!0,c=!0;i=i||\"fill\";for(var y=\"stroke\"===i||\"both\"===i,k=\"fill\"===i||\"both\"===i,x=0;x<e.length;x++){var _=e[x],L=_.points;if(p||\"M\"===_.command){if(x>0&&(k&&(o+=u(m,V,U,d,n,a)),0!==o))return!0;U=L[L.length-2],d=L[L.length-1],p=!1,c&&\"A\"!==_.command&&(c=!1,m=U,V=d)}switch(_.command){case\"M\":m=L[0],V=L[1];break;case\"L\":if(y&&r(m,V,L[0],L[1],t,n,a))return!0;k&&(o+=u(m,V,L[0],L[1],n,a)),m=L[0],V=L[1];break;case\"C\":if(y&&s(m,V,L[0],L[1],L[2],L[3],L[4],L[5],t,n,a))return!0;k&&(o+=g(m,V,L[0],L[1],L[2],L[3],L[4],L[5],n,a)),m=L[4],V=L[5];break;case\"Q\":if(y&&l(m,V,L[0],L[1],L[2],L[3],t,n,a))return!0;k&&(o+=b(m,V,L[0],L[1],L[2],L[3],n,a)),m=L[2],V=L[3];break;case\"A\":var W=L[0],X=L[1],v=L[2],w=L[3],K=L[4],I=L[5],J=Math.cos(K)*v+W,C=Math.sin(K)*w+X;c?(c=!1,U=J,d=C):o+=u(m,V,J,C);var S=(n-W)*w/v+W;if(y&&h(W,X,w,K,K+I,1-L[7],t,S,a))return!0;k&&(o+=f(W,X,w,K,K+I,1-L[7],S,a)),m=Math.cos(K+I)*v+W,V=Math.sin(K+I)*w+X;break;case\"z\":if(y&&r(m,V,U,d,t,n,a))return!0;p=!0}}return k&&(o+=u(m,V,U,d,n,a)),0!==o}function x(e,t){var i=e+\":\"+t;if(v[i])return v[i];L=L||W.getContext(),L.save(),t&&(L.font=t),e=(e+\"\").split(\"\\n\");for(var n=0,a=0,o=e.length;o>a;a++)n=Math.max(L.measureText(e[a]).width,n);return L.restore(),v[i]=n,++K>J&&(K=0,v={}),n}function _(e,t){var i=e+\":\"+t;if(w[i])return w[i];L=L||W.getContext(),L.save(),t&&(L.font=t),e=(e+\"\").split(\"\\n\");var n=(L.measureText(\"国\").width+2)*e.length;return L.restore(),w[i]=n,++I>J&&(I=0,w={}),n}var L,W=e(\"./util\"),X=e(\"./curve\"),v={},w={},K=0,I=0,J=5e3,C=2*Math.PI,S=[-1,-1,-1],E=[-1,-1];return{isInside:i,isOutside:o,getTextWidth:x,getTextHeight:_,isInsidePath:k,isInsidePolygon:c,isInsideSector:p,isInsideCircle:d,isInsideLine:r,isInsideRect:U,isInsidePolyline:m,isInsideCubicStroke:s,isInsideQuadraticStroke:l}}),i(\"zrender/shape/Base\",[\"require\",\"../tool/matrix\",\"../tool/guid\",\"../tool/util\",\"../tool/log\",\"../mixin/Transformable\",\"../mixin/Eventful\",\"../tool/area\",\"../tool/color\"],function(e){function t(t,n,a,o,r,s,l){r&&(t.font=r),t.textAlign=s,t.textBaseline=l;var h=i(n,a,o,r,s,l);n=(n+\"\").split(\"\\n\");var m=e(\"../tool/area\").getTextHeight(\"国\",r);switch(l){case\"top\":o=h.y;break;case\"bottom\":o=h.y+m;break;default:o=h.y+m/2}for(var V=0,U=n.length;U>V;V++)t.fillText(n[V],a,o),o+=m}function i(t,i,n,a,o,r){var s=e(\"../tool/area\"),l=s.getTextWidth(t,a),h=s.getTextHeight(\"国\",a);switch(t=(t+\"\").split(\"\\n\"),o){case\"end\":case\"right\":i-=l;break;case\"center\":i-=l/2}switch(r){case\"top\":break;case\"bottom\":n-=h*t.length;break;default:n-=h*t.length/2}return{x:i,y:n,width:l,height:h*t.length}}var n=window.G_vmlCanvasManager,a=e(\"../tool/matrix\"),o=e(\"../tool/guid\"),r=e(\"../tool/util\"),s=e(\"../tool/log\"),l=e(\"../mixin/Transformable\"),h=e(\"../mixin/Eventful\"),m=function(e){e=e||{},this.id=e.id||o();for(var t in e)this[t]=e[t];this.style=this.style||{},this.highlightStyle=this.highlightStyle||null,this.parent=null,this.__dirty=!0,this.__clipShapes=[],l.call(this),h.call(this)};m.prototype.invisible=!1,m.prototype.ignore=!1,m.prototype.zlevel=0,m.prototype.draggable=!1,m.prototype.clickable=!1,m.prototype.hoverable=!0,m.prototype.z=0,m.prototype.brush=function(e,t){var i=this.beforeBrush(e,t);switch(e.beginPath(),this.buildPath(e,i),i.brushType){case\"both\":e.fill();case\"stroke\":i.lineWidth>0&&e.stroke();break;default:e.fill()}this.drawText(e,i,this.style),this.afterBrush(e)},m.prototype.beforeBrush=function(e,t){var i=this.style;return this.brushTypeOnly&&(i.brushType=this.brushTypeOnly),t&&(i=this.getHighlightStyle(i,this.highlightStyle||{},this.brushTypeOnly)),\"stroke\"==this.brushTypeOnly&&(i.strokeColor=i.strokeColor||i.color),e.save(),this.doClip(e),this.setContext(e,i),this.setTransform(e),i},m.prototype.afterBrush=function(e){e.restore()};var V=[[\"color\",\"fillStyle\"],[\"strokeColor\",\"strokeStyle\"],[\"opacity\",\"globalAlpha\"],[\"lineCap\",\"lineCap\"],[\"lineJoin\",\"lineJoin\"],[\"miterLimit\",\"miterLimit\"],[\"lineWidth\",\"lineWidth\"],[\"shadowBlur\",\"shadowBlur\"],[\"shadowColor\",\"shadowColor\"],[\"shadowOffsetX\",\"shadowOffsetX\"],[\"shadowOffsetY\",\"shadowOffsetY\"]];m.prototype.setContext=function(e,t){for(var i=0,n=V.length;n>i;i++){var a=V[i][0],o=t[a],r=V[i][1];\"undefined\"!=typeof o&&(e[r]=o)}};var U=a.create();return m.prototype.doClip=function(e){if(this.__clipShapes&&!n)for(var t=0;t<this.__clipShapes.length;t++){var i=this.__clipShapes[t];if(i.needTransform){var o=i.transform;a.invert(U,o),e.transform(o[0],o[1],o[2],o[3],o[4],o[5])}if(e.beginPath(),i.buildPath(e,i.style),e.clip(),i.needTransform){var o=U;e.transform(o[0],o[1],o[2],o[3],o[4],o[5])}}},m.prototype.getHighlightStyle=function(t,i,n){var a={};for(var o in t)a[o]=t[o];var r=e(\"../tool/color\"),s=r.getHighlightColor();\"stroke\"!=t.brushType?(a.strokeColor=s,a.lineWidth=(t.lineWidth||1)+this.getHighlightZoom(),a.brushType=\"both\"):\"stroke\"!=n?(a.strokeColor=s,a.lineWidth=(t.lineWidth||1)+this.getHighlightZoom()):a.strokeColor=i.strokeColor||r.mix(t.strokeColor,r.toRGB(s));for(var o in i)\"undefined\"!=typeof i[o]&&(a[o]=i[o]);return a},m.prototype.getHighlightZoom=function(){return\"text\"!=this.type?6:2},m.prototype.drift=function(e,t){this.position[0]+=e,this.position[1]+=t},m.prototype.buildPath=function(){s(\"buildPath not implemented in \"+this.type)},m.prototype.getRect=function(){s(\"getRect not implemented in \"+this.type)},m.prototype.isCover=function(t,i){var n=this.transformCoordToLocal(t,i);return t=n[0],i=n[1],this.isCoverRect(t,i)?e(\"../tool/area\").isInside(this,this.style,t,i):!1},m.prototype.isCoverRect=function(e,t){var i=this.style.__rect;return i||(i=this.style.__rect=this.getRect(this.style)),e>=i.x&&e<=i.x+i.width&&t>=i.y&&t<=i.y+i.height},m.prototype.drawText=function(e,i,n){if(\"undefined\"!=typeof i.text&&i.text!==!1){var a=i.textColor||i.color||i.strokeColor;e.fillStyle=a;var o,r,s,l,h=10,m=i.textPosition||this.textPosition||\"top\";switch(m){case\"inside\":case\"top\":case\"bottom\":case\"left\":case\"right\":if(this.getRect){var V=(n||i).__rect||this.getRect(n||i);switch(m){case\"inside\":s=V.x+V.width/2,l=V.y+V.height/2,o=\"center\",r=\"middle\",\"stroke\"!=i.brushType&&a==i.color&&(e.fillStyle=\"#fff\");break;case\"left\":s=V.x-h,l=V.y+V.height/2,o=\"end\",r=\"middle\";break;case\"right\":s=V.x+V.width+h,l=V.y+V.height/2,o=\"start\",r=\"middle\";break;case\"top\":s=V.x+V.width/2,l=V.y-h,o=\"center\",r=\"bottom\";break;case\"bottom\":s=V.x+V.width/2,l=V.y+V.height+h,o=\"center\",r=\"top\"}}break;case\"start\":case\"end\":var U=i.pointList||[[i.xStart||0,i.yStart||0],[i.xEnd||0,i.yEnd||0]],d=U.length;if(2>d)return;var p,c,u,y;switch(m){case\"start\":p=U[1][0],c=U[0][0],u=U[1][1],y=U[0][1];break;case\"end\":p=U[d-2][0],c=U[d-1][0],u=U[d-2][1],y=U[d-1][1]}s=c,l=y;var g=Math.atan((u-y)/(c-p))/Math.PI*180;0>c-p?g+=180:0>u-y&&(g+=360),h=5,g>=30&&150>=g?(o=\"center\",r=\"bottom\",l-=h):g>150&&210>g?(o=\"right\",r=\"middle\",s-=h):g>=210&&330>=g?(o=\"center\",r=\"top\",l+=h):(o=\"left\",r=\"middle\",s+=h);break;case\"specific\":s=i.textX||0,l=i.textY||0,o=\"start\",r=\"middle\"}null!=s&&null!=l&&t(e,i.text,s,l,i.textFont,i.textAlign||o,i.textBaseline||r)}},m.prototype.modSelf=function(){this.__dirty=!0,this.style&&(this.style.__rect=null),this.highlightStyle&&(this.highlightStyle.__rect=null)},m.prototype.isSilent=function(){return!(this.hoverable||this.draggable||this.clickable||this.onmousemove||this.onmouseover||this.onmouseout||this.onmousedown||this.onmouseup||this.onclick||this.ondragenter||this.ondragover||this.ondragleave||this.ondrop)},r.merge(m.prototype,l.prototype,!0),r.merge(m.prototype,h.prototype,!0),m}),i(\"zrender/tool/curve\",[\"require\",\"./vector\"],function(e){function t(e){return e>-u&&u>e}function i(e){return e>u||-u>e}function n(e,t,i,n,a){var o=1-a;return o*o*(o*e+3*a*t)+a*a*(a*n+3*o*i)}function a(e,t,i,n,a){var o=1-a;return 3*(((t-e)*o+2*(i-t)*a)*o+(n-i)*a*a)}function o(e,i,n,a,o,r){var s=a+3*(i-n)-e,l=3*(n-2*i+e),h=3*(i-e),m=e-o,V=l*l-3*s*h,U=l*h-9*s*m,d=h*h-3*l*m,p=0;if(t(V)&&t(U))if(t(l))r[0]=0;else{var c=-h/l;c>=0&&1>=c&&(r[p++]=c)}else{var u=U*U-4*V*d;if(t(u)){var b=U/V,c=-l/s+b,f=-b/2;c>=0&&1>=c&&(r[p++]=c),f>=0&&1>=f&&(r[p++]=f)}else if(u>0){var k=Math.sqrt(u),x=V*l+1.5*s*(-U+k),_=V*l+1.5*s*(-U-k);x=0>x?-Math.pow(-x,g):Math.pow(x,g),_=0>_?-Math.pow(-_,g):Math.pow(_,g);var c=(-l-(x+_))/(3*s);c>=0&&1>=c&&(r[p++]=c)}else{var L=(2*V*l-3*s*U)/(2*Math.sqrt(V*V*V)),W=Math.acos(L)/3,X=Math.sqrt(V),v=Math.cos(W),c=(-l-2*X*v)/(3*s),f=(-l+X*(v+y*Math.sin(W)))/(3*s),w=(-l+X*(v-y*Math.sin(W)))/(3*s);c>=0&&1>=c&&(r[p++]=c),f>=0&&1>=f&&(r[p++]=f),w>=0&&1>=w&&(r[p++]=w)}}return p}function r(e,n,a,o,r){var s=6*a-12*n+6*e,l=9*n+3*o-3*e-9*a,h=3*n-3*e,m=0;if(t(l)){if(i(s)){var V=-h/s;V>=0&&1>=V&&(r[m++]=V)}}else{var U=s*s-4*l*h;if(t(U))r[0]=-s/(2*l);else if(U>0){var d=Math.sqrt(U),V=(-s+d)/(2*l),p=(-s-d)/(2*l);V>=0&&1>=V&&(r[m++]=V),p>=0&&1>=p&&(r[m++]=p)}}return m}function s(e,t,i,n,a,o){var r=(t-e)*a+e,s=(i-t)*a+t,l=(n-i)*a+i,h=(s-r)*a+r,m=(l-s)*a+s,V=(m-h)*a+h;o[0]=e,o[1]=r,o[2]=h,o[3]=V,o[4]=V,o[5]=m,o[6]=l,o[7]=n}function l(e,t,i,a,o,r,s,l,h,m,V){var U,d=.005,p=1/0;b[0]=h,b[1]=m;for(var y=0;1>y;y+=.05){f[0]=n(e,i,o,s,y),f[1]=n(t,a,r,l,y);var g=c.distSquare(b,f);p>g&&(U=y,p=g)}p=1/0;for(var x=0;32>x&&!(u>d);x++){var _=U-d,L=U+d;f[0]=n(e,i,o,s,_),f[1]=n(t,a,r,l,_);var g=c.distSquare(f,b);if(_>=0&&p>g)U=_,p=g;else{k[0]=n(e,i,o,s,L),k[1]=n(t,a,r,l,L);var W=c.distSquare(k,b);1>=L&&p>W?(U=L,p=W):d*=.5}}return V&&(V[0]=n(e,i,o,s,U),V[1]=n(t,a,r,l,U)),Math.sqrt(p)}function h(e,t,i,n){var a=1-n;return a*(a*e+2*n*t)+n*n*i}function m(e,t,i,n){return 2*((1-n)*(t-e)+n*(i-t))}function V(e,n,a,o,r){var s=e-2*n+a,l=2*(n-e),h=e-o,m=0;if(t(s)){if(i(l)){var V=-h/l;V>=0&&1>=V&&(r[m++]=V)}}else{var U=l*l-4*s*h;if(t(U)){var V=-l/(2*s);V>=0&&1>=V&&(r[m++]=V)}else if(U>0){var d=Math.sqrt(U),V=(-l+d)/(2*s),p=(-l-d)/(2*s);V>=0&&1>=V&&(r[m++]=V),p>=0&&1>=p&&(r[m++]=p)}}return m}function U(e,t,i){var n=e+i-2*t;return 0===n?.5:(e-t)/n}function d(e,t,i,n,a){var o=(t-e)*n+e,r=(i-t)*n+t,s=(r-o)*n+o;a[0]=e,a[1]=o,a[2]=s,a[3]=s,a[4]=r,a[5]=i}function p(e,t,i,n,a,o,r,s,l){var m,V=.005,U=1/0;b[0]=r,b[1]=s;for(var d=0;1>d;d+=.05){f[0]=h(e,i,a,d),f[1]=h(t,n,o,d);var p=c.distSquare(b,f);U>p&&(m=d,U=p)}U=1/0;for(var y=0;32>y&&!(u>V);y++){var g=m-V,x=m+V;f[0]=h(e,i,a,g),f[1]=h(t,n,o,g);var p=c.distSquare(f,b);if(g>=0&&U>p)m=g,U=p;else{k[0]=h(e,i,a,x),k[1]=h(t,n,o,x);var _=c.distSquare(k,b);1>=x&&U>_?(m=x,U=_):V*=.5}}return l&&(l[0]=h(e,i,a,m),l[1]=h(t,n,o,m)),Math.sqrt(U)}var c=e(\"./vector\"),u=1e-4,y=Math.sqrt(3),g=1/3,b=c.create(),f=c.create(),k=c.create();return{cubicAt:n,cubicDerivativeAt:a,cubicRootAt:o,cubicExtrema:r,cubicSubdivide:s,cubicProjectPoint:l,quadraticAt:h,quadraticDerivativeAt:m,quadraticRootAt:V,quadraticExtremum:U,quadraticSubdivide:d,quadraticProjectPoint:p}}),i(\"zrender/mixin/Transformable\",[\"require\",\"../tool/matrix\",\"../tool/vector\"],function(e){\"use strict\";function t(e){return e>-s&&s>e}function i(e){return e>s||-s>e}var n=e(\"../tool/matrix\"),a=e(\"../tool/vector\"),o=[0,0],r=n.translate,s=5e-5,l=function(){this.position||(this.position=[0,0]),\"undefined\"==typeof this.rotation&&(this.rotation=[0,0,0]),this.scale||(this.scale=[1,1,0,0]),this.needLocalTransform=!1,this.needTransform=!1};return l.prototype={constructor:l,updateNeedTransform:function(){this.needLocalTransform=i(this.rotation[0])||i(this.position[0])||i(this.position[1])||i(this.scale[0]-1)||i(this.scale[1]-1)},updateTransform:function(){this.updateNeedTransform();var e=this.parent&&this.parent.needTransform;if(this.needTransform=this.needLocalTransform||e,this.needTransform){var t=this.transform||n.create();if(n.identity(t),this.needLocalTransform){var a=this.scale;if(i(a[0])||i(a[1])){o[0]=-a[2]||0,o[1]=-a[3]||0;var s=i(o[0])||i(o[1]);s&&r(t,t,o),n.scale(t,t,a),s&&(o[0]=-o[0],o[1]=-o[1],r(t,t,o))}if(this.rotation instanceof Array){if(0!==this.rotation[0]){o[0]=-this.rotation[1]||0,o[1]=-this.rotation[2]||0;var s=i(o[0])||i(o[1]);s&&r(t,t,o),n.rotate(t,t,this.rotation[0]),s&&(o[0]=-o[0],o[1]=-o[1],r(t,t,o))}}else 0!==this.rotation&&n.rotate(t,t,this.rotation);(i(this.position[0])||i(this.position[1]))&&r(t,t,this.position)}e&&(this.needLocalTransform?n.mul(t,this.parent.transform,t):n.copy(t,this.parent.transform)),this.transform=t,this.invTransform=this.invTransform||n.create(),n.invert(this.invTransform,t)}},setTransform:function(e){if(this.needTransform){var t=this.transform;e.transform(t[0],t[1],t[2],t[3],t[4],t[5])}},lookAt:function(){var e=a.create();return function(i){this.transform||(this.transform=n.create());var o=this.transform;if(a.sub(e,i,this.position),!t(e[0])||!t(e[1])){a.normalize(e,e);var r=this.scale;o[2]=e[0]*r[1],o[3]=e[1]*r[1],o[0]=e[1]*r[0],o[1]=-e[0]*r[0],o[4]=this.position[0],o[5]=this.position[1],this.decomposeTransform()}}}(),decomposeTransform:function(){if(this.transform){var e=this.transform,t=e[0]*e[0]+e[1]*e[1],n=this.position,a=this.scale,o=this.rotation;i(t-1)&&(t=Math.sqrt(t));var r=e[2]*e[2]+e[3]*e[3];i(r-1)&&(r=Math.sqrt(r)),n[0]=e[4],n[1]=e[5],a[0]=t,a[1]=r,a[2]=a[3]=0,o[0]=Math.atan2(-e[1]/r,e[0]/t),o[1]=o[2]=0}},transformCoordToLocal:function(e,t){var i=[e,t];return this.needTransform&&this.invTransform&&a.applyTransform(i,i,this.invTransform),i}},l}),i(\"zrender/Group\",[\"require\",\"./tool/guid\",\"./tool/util\",\"./mixin/Transformable\",\"./mixin/Eventful\"],function(e){var t=e(\"./tool/guid\"),i=e(\"./tool/util\"),n=e(\"./mixin/Transformable\"),a=e(\"./mixin/Eventful\"),o=function(e){e=e||{},this.id=e.id||t();for(var i in e)this[i]=e[i];this.type=\"group\",this.clipShape=null,this._children=[],this._storage=null,this.__dirty=!0,n.call(this),a.call(this)};return o.prototype.ignore=!1,o.prototype.children=function(){return this._children.slice()},o.prototype.childAt=function(e){return this._children[e]},o.prototype.addChild=function(e){e!=this&&e.parent!=this&&(e.parent&&e.parent.removeChild(e),this._children.push(e),e.parent=this,this._storage&&this._storage!==e._storage&&(this._storage.addToMap(e),e instanceof o&&e.addChildrenToStorage(this._storage)))},o.prototype.removeChild=function(e){var t=i.indexOf(this._children,e);t>=0&&this._children.splice(t,1),e.parent=null,this._storage&&(this._storage.delFromMap(e.id),e instanceof o&&e.delChildrenFromStorage(this._storage))},o.prototype.clearChildren=function(){for(var e=0;e<this._children.length;e++){var t=this._children[e];this._storage&&(this._storage.delFromMap(t.id),t instanceof o&&t.delChildrenFromStorage(this._storage))}this._children.length=0},o.prototype.eachChild=function(e,t){for(var i=!!t,n=0;n<this._children.length;n++){var a=this._children[n];i?e.call(t,a):e(a)}},o.prototype.traverse=function(e,t){for(var i=!!t,n=0;n<this._children.length;n++){var a=this._children[n];i?e.call(t,a):e(a),\"group\"===a.type&&a.traverse(e,t)}},o.prototype.addChildrenToStorage=function(e){for(var t=0;t<this._children.length;t++){var i=this._children[t];e.addToMap(i),i instanceof o&&i.addChildrenToStorage(e)}},o.prototype.delChildrenFromStorage=function(e){for(var t=0;t<this._children.length;t++){var i=this._children[t];e.delFromMap(i.id),i instanceof o&&i.delChildrenFromStorage(e)}},o.prototype.modSelf=function(){this.__dirty=!0},i.merge(o.prototype,n.prototype,!0),i.merge(o.prototype,a.prototype,!0),o}),i(\"zrender/animation/Clip\",[\"require\",\"./easing\"],function(e){function t(e){this._targetPool=e.target||{},this._targetPool instanceof Array||(this._targetPool=[this._targetPool]),this._life=e.life||1e3,this._delay=e.delay||0,this._startTime=(new Date).getTime()+this._delay,this._endTime=this._startTime+1e3*this._life,this.loop=\"undefined\"==typeof e.loop?!1:e.loop,this.gap=e.gap||0,this.easing=e.easing||\"Linear\",this.onframe=e.onframe,this.ondestroy=e.ondestroy,this.onrestart=e.onrestart}var i=e(\"./easing\");return t.prototype={step:function(e){var t=(e-this._startTime)/this._life;if(!(0>t)){t=Math.min(t,1);var n=\"string\"==typeof this.easing?i[this.easing]:this.easing,a=\"function\"==typeof n?n(t):t;return this.fire(\"frame\",a),1==t?this.loop?(this.restart(),\"restart\"):(this.__needsRemove=!0,\"destroy\"):null}},restart:function(){var e=(new Date).getTime(),t=(e-this._startTime)%this._life;this._startTime=(new Date).getTime()-t+this.gap,this.__needsRemove=!1},fire:function(e,t){for(var i=0,n=this._targetPool.length;n>i;i++)this[\"on\"+e]&&this[\"on\"+e](this._targetPool[i],t)},constructor:t},t}),i(\"zrender/animation/easing\",[],function(){var e={Linear:function(e){return e},QuadraticIn:function(e){return e*e},QuadraticOut:function(e){return e*(2-e)},QuadraticInOut:function(e){return(e*=2)<1?.5*e*e:-.5*(--e*(e-2)-1)},CubicIn:function(e){return e*e*e},CubicOut:function(e){return--e*e*e+1},CubicInOut:function(e){return(e*=2)<1?.5*e*e*e:.5*((e-=2)*e*e+2)},QuarticIn:function(e){return e*e*e*e},QuarticOut:function(e){return 1- --e*e*e*e},QuarticInOut:function(e){return(e*=2)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2)},QuinticIn:function(e){return e*e*e*e*e},QuinticOut:function(e){return--e*e*e*e*e+1},QuinticInOut:function(e){return(e*=2)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2)},SinusoidalIn:function(e){return 1-Math.cos(e*Math.PI/2)},SinusoidalOut:function(e){return Math.sin(e*Math.PI/2)},SinusoidalInOut:function(e){return.5*(1-Math.cos(Math.PI*e))},ExponentialIn:function(e){return 0===e?0:Math.pow(1024,e-1)},ExponentialOut:function(e){return 1===e?1:1-Math.pow(2,-10*e)},ExponentialInOut:function(e){return 0===e?0:1===e?1:(e*=2)<1?.5*Math.pow(1024,e-1):.5*(-Math.pow(2,-10*(e-1))+2)},CircularIn:function(e){return 1-Math.sqrt(1-e*e)},CircularOut:function(e){return Math.sqrt(1- --e*e)},CircularInOut:function(e){return(e*=2)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1)},ElasticIn:function(e){var t,i=.1,n=.4;return 0===e?0:1===e?1:(!i||1>i?(i=1,t=n/4):t=n*Math.asin(1/i)/(2*Math.PI),-(i*Math.pow(2,10*(e-=1))*Math.sin(2*(e-t)*Math.PI/n)))},ElasticOut:function(e){var t,i=.1,n=.4;return 0===e?0:1===e?1:(!i||1>i?(i=1,t=n/4):t=n*Math.asin(1/i)/(2*Math.PI),i*Math.pow(2,-10*e)*Math.sin(2*(e-t)*Math.PI/n)+1)},ElasticInOut:function(e){var t,i=.1,n=.4;return 0===e?0:1===e?1:(!i||1>i?(i=1,t=n/4):t=n*Math.asin(1/i)/(2*Math.PI),(e*=2)<1?-.5*i*Math.pow(2,10*(e-=1))*Math.sin(2*(e-t)*Math.PI/n):i*Math.pow(2,-10*(e-=1))*Math.sin(2*(e-t)*Math.PI/n)*.5+1)},BackIn:function(e){var t=1.70158;return e*e*((t+1)*e-t)},BackOut:function(e){var t=1.70158;return--e*e*((t+1)*e+t)+1},BackInOut:function(e){var t=2.5949095;return(e*=2)<1?.5*e*e*((t+1)*e-t):.5*((e-=2)*e*((t+1)*e+t)+2)},BounceIn:function(t){return 1-e.BounceOut(1-t)},BounceOut:function(e){return 1/2.75>e?7.5625*e*e:2/2.75>e?7.5625*(e-=1.5/2.75)*e+.75:2.5/2.75>e?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375},BounceInOut:function(t){return.5>t?.5*e.BounceIn(2*t):.5*e.BounceOut(2*t-1)+.5}};return e}),i(\"echarts/chart/base\",[\"require\",\"zrender/shape/Image\",\"../util/shape/Icon\",\"../util/shape/MarkLine\",\"../util/shape/Symbol\",\"zrender/shape/Polyline\",\"zrender/shape/ShapeBundle\",\"../config\",\"../util/ecData\",\"../util/ecAnimation\",\"../util/ecEffect\",\"../util/accMath\",\"../component/base\",\"../layout/EdgeBundling\",\"zrender/tool/util\",\"zrender/tool/area\"],function(e){function t(e){return null!=e.x&&null!=e.y}function i(e,t,i,n,a){p.call(this,e,t,i,n,a);var o=this;this.selectedMap={},this.lastShapeList=[],this.shapeHandler={onclick:function(){o.isClick=!0},ondragover:function(e){var t=e.target;t.highlightStyle=t.highlightStyle||{};var i=t.highlightStyle,n=i.brushTyep,a=i.strokeColor,r=i.lineWidth;i.brushType=\"stroke\",i.strokeColor=o.ecTheme.calculableColor||h.calculableColor,i.lineWidth=\"icon\"===t.type?30:10,o.zr.addHoverShape(t),setTimeout(function(){i&&(i.brushType=n,i.strokeColor=a,i.lineWidth=r)},20)},ondrop:function(e){null!=m.get(e.dragged,\"data\")&&(o.isDrop=!0)},ondragend:function(){o.isDragend=!0}}}var n=e(\"zrender/shape/Image\"),a=e(\"../util/shape/Icon\"),o=e(\"../util/shape/MarkLine\"),r=e(\"../util/shape/Symbol\"),s=e(\"zrender/shape/Polyline\"),l=e(\"zrender/shape/ShapeBundle\"),h=e(\"../config\"),m=e(\"../util/ecData\"),V=e(\"../util/ecAnimation\"),U=e(\"../util/ecEffect\"),d=e(\"../util/accMath\"),p=e(\"../component/base\"),c=e(\"../layout/EdgeBundling\"),u=e(\"zrender/tool/util\"),y=e(\"zrender/tool/area\");return i.prototype={setCalculable:function(e){return e.dragEnableTime=this.ecTheme.DRAG_ENABLE_TIME||h.DRAG_ENABLE_TIME,e.ondragover=this.shapeHandler.ondragover,e.ondragend=this.shapeHandler.ondragend,e.ondrop=this.shapeHandler.ondrop,e},ondrop:function(e,t){if(this.isDrop&&e.target&&!t.dragIn){var i,n=e.target,a=e.dragged,o=m.get(n,\"seriesIndex\"),r=m.get(n,\"dataIndex\"),s=this.series,l=this.component.legend;if(-1===r){if(m.get(a,\"seriesIndex\")==o)return t.dragOut=t.dragIn=t.needRefresh=!0,void(this.isDrop=!1);i={value:m.get(a,\"value\"),name:m.get(a,\"name\")},this.type===h.CHART_TYPE_PIE&&i.value<0&&(i.value=0);for(var V=!1,U=s[o].data,p=0,c=U.length;c>p;p++)U[p].name===i.name&&\"-\"===U[p].value&&(s[o].data[p].value=i.value,V=!0);!V&&s[o].data.push(i),l&&l.add(i.name,a.style.color||a.style.strokeColor)}else i=s[o].data[r]||\"-\",null!=i.value?(s[o].data[r].value=\"-\"!=i.value?d.accAdd(s[o].data[r].value,m.get(a,\"value\")):m.get(a,\"value\"),(this.type===h.CHART_TYPE_FUNNEL||this.type===h.CHART_TYPE_PIE)&&(l&&1===l.getRelatedAmount(i.name)&&this.component.legend.del(i.name),i.name+=this.option.nameConnector+m.get(a,\"name\"),l&&l.add(i.name,a.style.color||a.style.strokeColor))):s[o].data[r]=\"-\"!=i?d.accAdd(s[o].data[r],m.get(a,\"value\")):m.get(a,\"value\");t.dragIn=t.dragIn||!0,this.isDrop=!1;var u=this;setTimeout(function(){u.zr.trigger(\"mousemove\",e.event)},300)}},ondragend:function(e,t){if(this.isDragend&&e.target&&!t.dragOut){var i=e.target,n=m.get(i,\"seriesIndex\"),a=m.get(i,\"dataIndex\"),o=this.series;if(null!=o[n].data[a].value){o[n].data[a].value=\"-\";var r=o[n].data[a].name,s=this.component.legend;s&&0===s.getRelatedAmount(r)&&s.del(r)}else o[n].data[a]=\"-\";t.dragOut=!0,t.needRefresh=!0,this.isDragend=!1}},onlegendSelected:function(e,t){var i=e.selected;for(var n in this.selectedMap)this.selectedMap[n]!=i[n]&&(t.needRefresh=!0),this.selectedMap[n]=i[n]},_buildPosition:function(){this._symbol=this.option.symbolList,this._sIndex2ShapeMap={},this._sIndex2ColorMap={},this.selectedMap={},this.xMarkMap={};for(var e,t,i,n,a=this.series,o={top:[],bottom:[],left:[],right:[],other:[]},r=0,s=a.length;s>r;r++)a[r].type===this.type&&(a[r]=this.reformOption(a[r]),this.legendHoverLink=a[r].legendHoverLink||this.legendHoverLink,e=a[r].xAxisIndex,t=a[r].yAxisIndex,i=this.component.xAxis.getAxis(e),n=this.component.yAxis.getAxis(t),i.type===h.COMPONENT_TYPE_AXIS_CATEGORY?o[i.getPosition()].push(r):n.type===h.COMPONENT_TYPE_AXIS_CATEGORY?o[n.getPosition()].push(r):o.other.push(r));for(var l in o)o[l].length>0&&this._buildSinglePosition(l,o[l]);this.addShapeList()},_buildSinglePosition:function(e,t){var i=this._mapData(t),n=i.locationMap,a=i.maxDataLength;if(0!==a&&0!==n.length){switch(e){case\"bottom\":case\"top\":this._buildHorizontal(t,a,n,this.xMarkMap);break;case\"left\":case\"right\":this._buildVertical(t,a,n,this.xMarkMap);break;case\"other\":this._buildOther(t,a,n,this.xMarkMap)}for(var o=0,r=t.length;r>o;o++)this.buildMark(t[o])}},_mapData:function(e){for(var t,i,n,a,o=this.series,r=0,s={},l=\"__kener__stack__\",m=this.component.legend,V=[],U=0,d=0,p=e.length;p>d;d++){if(t=o[e[d]],n=t.name,this._sIndex2ShapeMap[e[d]]=this._sIndex2ShapeMap[e[d]]||this.query(t,\"symbol\")||this._symbol[d%this._symbol.length],m){if(this.selectedMap[n]=m.isSelected(n),this._sIndex2ColorMap[e[d]]=m.getColor(n),a=m.getItemShape(n)){var c=a.style;if(this.type==h.CHART_TYPE_LINE)c.iconType=\"legendLineIcon\",c.symbol=this._sIndex2ShapeMap[e[d]];else if(t.itemStyle.normal.barBorderWidth>0){var u=a.highlightStyle;c.brushType=\"both\",c.x+=1,c.y+=1,c.width-=2,c.height-=2,c.strokeColor=u.strokeColor=t.itemStyle.normal.barBorderColor,u.lineWidth=3}m.setItemShape(n,a)}}else this.selectedMap[n]=!0,this._sIndex2ColorMap[e[d]]=this.zr.getColor(e[d]);this.selectedMap[n]&&(i=t.stack||l+e[d],null==s[i]?(s[i]=r,V[r]=[e[d]],r++):V[s[i]].push(e[d])),U=Math.max(U,t.data.length)}return{locationMap:V,maxDataLength:U}},_calculMarkMapXY:function(e,t,i){for(var n=this.series,a=0,o=t.length;o>a;a++)for(var r=0,s=t[a].length;s>r;r++){var l=t[a][r],h=\"xy\"==i?0:\"\",m=this.component.grid,V=e[l];if(\"-1\"!=i.indexOf(\"x\")){V[\"counter\"+h]>0&&(V[\"average\"+h]=V[\"sum\"+h]/V[\"counter\"+h]);var U=this.component.xAxis.getAxis(n[l].xAxisIndex||0).getCoord(V[\"average\"+h]);V[\"averageLine\"+h]=[[U,m.getYend()],[U,m.getY()]],V[\"minLine\"+h]=[[V[\"minX\"+h],m.getYend()],[V[\"minX\"+h],m.getY()]],V[\"maxLine\"+h]=[[V[\"maxX\"+h],m.getYend()],[V[\"maxX\"+h],m.getY()]],V.isHorizontal=!1}if(h=\"xy\"==i?1:\"\",\"-1\"!=i.indexOf(\"y\")){V[\"counter\"+h]>0&&(V[\"average\"+h]=V[\"sum\"+h]/V[\"counter\"+h]);var d=this.component.yAxis.getAxis(n[l].yAxisIndex||0).getCoord(V[\"average\"+h]);V[\"averageLine\"+h]=[[m.getX(),d],[m.getXend(),d]],V[\"minLine\"+h]=[[m.getX(),V[\"minY\"+h]],[m.getXend(),V[\"minY\"+h]]],V[\"maxLine\"+h]=[[m.getX(),V[\"maxY\"+h]],[m.getXend(),V[\"maxY\"+h]]],V.isHorizontal=!0}}},addLabel:function(e,t,i,n,a){var o=[i,t],r=this.deepMerge(o,\"itemStyle.normal.label\"),s=this.deepMerge(o,\"itemStyle.emphasis.label\"),l=r.textStyle||{},h=s.textStyle||{};\n\nif(r.show){var m=e.style;m.text=this._getLabelText(t,i,n,\"normal\"),m.textPosition=null==r.position?\"horizontal\"===a?\"right\":\"top\":r.position,m.textColor=l.color,m.textFont=this.getFont(l),m.textAlign=l.align,m.textBaseline=l.baseline}if(s.show){var V=e.highlightStyle;V.text=this._getLabelText(t,i,n,\"emphasis\"),V.textPosition=r.show?e.style.textPosition:null==s.position?\"horizontal\"===a?\"right\":\"top\":s.position,V.textColor=h.color,V.textFont=this.getFont(h),V.textAlign=h.align,V.textBaseline=h.baseline}return e},_getLabelText:function(e,t,i,n){var a=this.deepQuery([t,e],\"itemStyle.\"+n+\".label.formatter\");a||\"emphasis\"!==n||(a=this.deepQuery([t,e],\"itemStyle.normal.label.formatter\"));var o=this.getDataFromOption(t,\"-\");return a?\"function\"==typeof a?a.call(this.myChart,{seriesName:e.name,series:e,name:i,value:o,data:t,status:n}):\"string\"==typeof a?a=a.replace(\"{a}\",\"{a0}\").replace(\"{b}\",\"{b0}\").replace(\"{c}\",\"{c0}\").replace(\"{a0}\",e.name).replace(\"{b0}\",i).replace(\"{c0}\",this.numAddCommas(o)):void 0:o instanceof Array?null!=o[2]?this.numAddCommas(o[2]):o[0]+\" , \"+o[1]:this.numAddCommas(o)},buildMark:function(e){var t=this.series[e];this.selectedMap[t.name]&&(t.markLine&&this._buildMarkLine(e),t.markPoint&&this._buildMarkPoint(e))},_buildMarkPoint:function(e){for(var t,i,n=(this.markAttachStyle||{})[e],a=this.series[e],o=u.clone(a.markPoint),r=0,s=o.data.length;s>r;r++)t=o.data[r],i=this.getMarkCoord(e,t),t.x=null!=t.x?t.x:i[0],t.y=null!=t.y?t.y:i[1],!t.type||\"max\"!==t.type&&\"min\"!==t.type||(t.value=i[3],t.name=t.name||t.type,t.symbolSize=t.symbolSize||y.getTextWidth(i[3],this.getFont())/2+5);for(var l=this._markPoint(e,o),r=0,s=l.length;s>r;r++){var m=l[r];m.zlevel=a.zlevel,m.z=a.z+1;for(var V in n)m[V]=u.clone(n[V]);this.shapeList.push(m)}if(this.type===h.CHART_TYPE_FORCE||this.type===h.CHART_TYPE_CHORD)for(var r=0,s=l.length;s>r;r++)this.zr.addShape(l[r])},_buildMarkLine:function(e){for(var t,i=(this.markAttachStyle||{})[e],n=this.series[e],a=u.clone(n.markLine),o=0,r=a.data.length;r>o;o++){var s=a.data[o];!s.type||\"max\"!==s.type&&\"min\"!==s.type&&\"average\"!==s.type?t=[this.getMarkCoord(e,s[0]),this.getMarkCoord(e,s[1])]:(t=this.getMarkCoord(e,s),a.data[o]=[u.clone(s),{}],a.data[o][0].name=s.name||s.type,a.data[o][0].value=\"average\"!==s.type?t[3]:+t[3].toFixed(null!=a.precision?a.precision:this.deepQuery([this.ecTheme,h],\"markLine.precision\")),t=t[2],s=[{},{}]),null!=t&&null!=t[0]&&null!=t[1]&&(a.data[o][0].x=null!=s[0].x?s[0].x:t[0][0],a.data[o][0].y=null!=s[0].y?s[0].y:t[0][1],a.data[o][1].x=null!=s[1].x?s[1].x:t[1][0],a.data[o][1].y=null!=s[1].y?s[1].y:t[1][1])}var m=this._markLine(e,a),V=a.large;if(V){var U=new l({style:{shapeList:m}}),d=m[0];if(d){u.merge(U.style,d.style),u.merge(U.highlightStyle={},d.highlightStyle),U.style.brushType=\"stroke\",U.zlevel=n.zlevel,U.z=n.z+1,U.hoverable=!1;for(var p in i)U[p]=u.clone(i[p])}this.shapeList.push(U),this.zr.addShape(U),U._mark=\"largeLine\";var c=a.effect;c.show&&(U.effect=c)}else{for(var o=0,r=m.length;r>o;o++){var y=m[o];y.zlevel=n.zlevel,y.z=n.z+1;for(var p in i)y[p]=u.clone(i[p]);this.shapeList.push(y)}if(this.type===h.CHART_TYPE_FORCE||this.type===h.CHART_TYPE_CHORD)for(var o=0,r=m.length;r>o;o++)this.zr.addShape(m[o])}},_markPoint:function(e,t){var i=this.series[e],n=this.component;u.merge(u.merge(t,u.clone(this.ecTheme.markPoint||{})),u.clone(h.markPoint)),t.name=i.name;var a,o,r,s,l,V,U,d=[],p=t.data,c=n.dataRange,y=n.legend,g=this.zr.getWidth(),b=this.zr.getHeight();if(t.large)a=this.getLargeMarkPointShape(e,t),a._mark=\"largePoint\",a&&d.push(a);else for(var f=0,k=p.length;k>f;f++)null!=p[f].x&&null!=p[f].y&&(r=null!=p[f].value?p[f].value:\"\",y&&(o=y.getColor(i.name)),c&&(o=isNaN(r)?o:c.getColor(r),s=[p[f],t],l=this.deepQuery(s,\"itemStyle.normal.color\")||o,V=this.deepQuery(s,\"itemStyle.emphasis.color\")||l,null==l&&null==V)||(o=null==o?this.zr.getColor(e):o,p[f].tooltip=p[f].tooltip||t.tooltip||{trigger:\"item\"},p[f].name=null!=p[f].name?p[f].name:\"\",p[f].value=r,a=this.getSymbolShape(t,e,p[f],f,p[f].name,this.parsePercent(p[f].x,g),this.parsePercent(p[f].y,b),\"pin\",o,\"rgba(0,0,0,0)\",\"horizontal\"),a._mark=\"point\",U=this.deepMerge([p[f],t],\"effect\"),U.show&&(a.effect=U),i.type===h.CHART_TYPE_MAP&&(a._geo=this.getMarkGeo(p[f])),m.pack(a,i,e,p[f],f,p[f].name,r),d.push(a)));return d},_markLine:function(){function e(e,t){e[t]=e[t]instanceof Array?e[t].length>1?e[t]:[e[t][0],e[t][0]]:[e[t],e[t]]}return function(i,n){var a=this.series[i],o=this.component,r=o.dataRange,s=o.legend;u.merge(u.merge(n,u.clone(this.ecTheme.markLine||{})),u.clone(h.markLine));var l=s?s.getColor(a.name):this.zr.getColor(i);e(n,\"symbol\"),e(n,\"symbolSize\"),e(n,\"symbolRotate\");for(var V=n.data,U=[],d=this.zr.getWidth(),p=this.zr.getHeight(),y=0;y<V.length;y++){var g=V[y];if(t(g[0])&&t(g[1])){var b=this.deepMerge(g),f=[b,n],k=l,x=null!=b.value?b.value:\"\";if(r){k=isNaN(x)?k:r.getColor(x);var _=this.deepQuery(f,\"itemStyle.normal.color\")||k,L=this.deepQuery(f,\"itemStyle.emphasis.color\")||_;if(null==_&&null==L)continue}g[0].tooltip=b.tooltip||n.tooltip||{trigger:\"item\"},g[0].name=g[0].name||\"\",g[1].name=g[1].name||\"\",g[0].value=x,U.push({points:[[this.parsePercent(g[0].x,d),this.parsePercent(g[0].y,p)],[this.parsePercent(g[1].x,d),this.parsePercent(g[1].y,p)]],rawData:g,color:k})}}var W=this.query(n,\"bundling.enable\");if(W){var X=new c;X.maxTurningAngle=this.query(n,\"bundling.maxTurningAngle\")/180*Math.PI,U=X.run(U)}n.name=a.name;for(var v=[],y=0,w=U.length;w>y;y++){var K=U[y],I=K.rawEdge||K,g=I.rawData,x=null!=g.value?g.value:\"\",J=this.getMarkLineShape(n,i,g,y,K.points,W,I.color);J._mark=\"line\";var C=this.deepMerge([g[0],g[1],n],\"effect\");C.show&&(J.effect=C,J.effect.large=n.large),a.type===h.CHART_TYPE_MAP&&(J._geo=[this.getMarkGeo(g[0]),this.getMarkGeo(g[1])]),m.pack(J,a,i,g[0],y,g[0].name+(\"\"!==g[1].name?\" > \"+g[1].name:\"\"),x),v.push(J)}return v}}(),getMarkCoord:function(){return[0,0]},getSymbolShape:function(e,t,i,o,r,s,l,h,V,U,d){var p=[i,e],c=this.getDataFromOption(i,\"-\");h=this.deepQuery(p,\"symbol\")||h;var u=this.deepQuery(p,\"symbolSize\");u=\"function\"==typeof u?u(c):u,\"number\"==typeof u&&(u=[u,u]);var y=this.deepQuery(p,\"symbolRotate\"),g=this.deepMerge(p,\"itemStyle.normal\"),b=this.deepMerge(p,\"itemStyle.emphasis\"),f=null!=g.borderWidth?g.borderWidth:g.lineStyle&&g.lineStyle.width;null==f&&(f=h.match(\"empty\")?2:0);var k=null!=b.borderWidth?b.borderWidth:b.lineStyle&&b.lineStyle.width;null==k&&(k=f+2);var x=this.getItemStyleColor(g.color,t,o,i),_=this.getItemStyleColor(b.color,t,o,i),L=u[0],W=u[1],X=new a({style:{iconType:h.replace(\"empty\",\"\").toLowerCase(),x:s-L,y:l-W,width:2*L,height:2*W,brushType:\"both\",color:h.match(\"empty\")?U:x||V,strokeColor:g.borderColor||x||V,lineWidth:f},highlightStyle:{color:h.match(\"empty\")?U:_||x||V,strokeColor:b.borderColor||g.borderColor||_||x||V,lineWidth:k},clickable:this.deepQuery(p,\"clickable\")});return h.match(\"image\")&&(X.style.image=h.replace(new RegExp(\"^image:\\\\/\\\\/\"),\"\"),X=new n({style:X.style,highlightStyle:X.highlightStyle,clickable:this.deepQuery(p,\"clickable\")})),null!=y&&(X.rotation=[y*Math.PI/180,s,l]),h.match(\"star\")&&(X.style.iconType=\"star\",X.style.n=h.replace(\"empty\",\"\").replace(\"star\",\"\")-0||5),\"none\"===h&&(X.invisible=!0,X.hoverable=!1),X=this.addLabel(X,e,i,r,d),h.match(\"empty\")&&(null==X.style.textColor&&(X.style.textColor=X.style.strokeColor),null==X.highlightStyle.textColor&&(X.highlightStyle.textColor=X.highlightStyle.strokeColor)),m.pack(X,e,t,i,o,r),X._x=s,X._y=l,X._dataIndex=o,X._seriesIndex=t,X},getMarkLineShape:function(e,t,i,n,a,r,l){var h=null!=i[0].value?i[0].value:\"-\",m=null!=i[1].value?i[1].value:\"-\",V=[i[0].symbol||e.symbol[0],i[1].symbol||e.symbol[1]],U=[i[0].symbolSize||e.symbolSize[0],i[1].symbolSize||e.symbolSize[1]];U[0]=\"function\"==typeof U[0]?U[0](h):U[0],U[1]=\"function\"==typeof U[1]?U[1](m):U[1];var d=[this.query(i[0],\"symbolRotate\")||e.symbolRotate[0],this.query(i[1],\"symbolRotate\")||e.symbolRotate[1]],p=[i[0],i[1],e],c=this.deepMerge(p,\"itemStyle.normal\");c.color=this.getItemStyleColor(c.color,t,n,i);var u=this.deepMerge(p,\"itemStyle.emphasis\");u.color=this.getItemStyleColor(u.color,t,n,i);var y=c.lineStyle,g=u.lineStyle,b=y.width;null==b&&(b=c.borderWidth);var f=g.width;null==f&&(f=null!=u.borderWidth?u.borderWidth:b+2);var k=this.deepQuery(p,\"smoothness\");this.deepQuery(p,\"smooth\")||(k=0);var x=r?s:o,_=new x({style:{symbol:V,symbolSize:U,symbolRotate:d,brushType:\"both\",lineType:y.type,shadowColor:y.shadowColor||y.color||c.borderColor||c.color||l,shadowBlur:y.shadowBlur,shadowOffsetX:y.shadowOffsetX,shadowOffsetY:y.shadowOffsetY,color:c.color||l,strokeColor:y.color||c.borderColor||c.color||l,lineWidth:b,symbolBorderColor:c.borderColor||c.color||l,symbolBorder:c.borderWidth},highlightStyle:{shadowColor:g.shadowColor,shadowBlur:g.shadowBlur,shadowOffsetX:g.shadowOffsetX,shadowOffsetY:g.shadowOffsetY,color:u.color||c.color||l,strokeColor:g.color||y.color||u.borderColor||c.borderColor||u.color||c.color||l,lineWidth:f,symbolBorderColor:u.borderColor||c.borderColor||u.color||c.color||l,symbolBorder:null==u.borderWidth?c.borderWidth+2:u.borderWidth},clickable:this.deepQuery(p,\"clickable\")}),L=_.style;return r?(L.pointList=a,L.smooth=k):(L.xStart=a[0][0],L.yStart=a[0][1],L.xEnd=a[1][0],L.yEnd=a[1][1],L.curveness=k,_.updatePoints(_.style)),_=this.addLabel(_,e,i[0],i[0].name+\" : \"+i[1].name)},getLargeMarkPointShape:function(e,t){var i,n,a,o,s,l,h=this.series[e],m=this.component,V=t.data,U=m.dataRange,d=m.legend,p=[V[0],t];if(d&&(n=d.getColor(h.name)),!U||(a=null!=V[0].value?V[0].value:\"\",n=isNaN(a)?n:U.getColor(a),o=this.deepQuery(p,\"itemStyle.normal.color\")||n,s=this.deepQuery(p,\"itemStyle.emphasis.color\")||o,null!=o||null!=s)){n=this.deepMerge(p,\"itemStyle.normal\").color||n;var c=this.deepQuery(p,\"symbol\")||\"circle\";c=c.replace(\"empty\",\"\").replace(/\\d/g,\"\"),l=this.deepMerge([V[0],t],\"effect\");var u=window.devicePixelRatio||1;return i=new r({style:{pointList:V,color:n,strokeColor:n,shadowColor:l.shadowColor||n,shadowBlur:(null!=l.shadowBlur?l.shadowBlur:8)*u,size:this.deepQuery(p,\"symbolSize\"),iconType:c,brushType:\"fill\",lineWidth:1},draggable:!1,hoverable:!1}),l.show&&(i.effect=l),i}},backupShapeList:function(){this.shapeList&&this.shapeList.length>0?(this.lastShapeList=this.shapeList,this.shapeList=[]):this.lastShapeList=[]},addShapeList:function(){var e,t,i=this.option.animationThreshold/(this.canvasSupported?2:4),n=this.lastShapeList,a=this.shapeList,o=n.length>0,r=o?this.query(this.option,\"animationDurationUpdate\"):this.query(this.option,\"animationDuration\"),s=this.query(this.option,\"animationEasing\"),l={},m={};if(this.option.animation&&!this.option.renderAsImage&&a.length<i&&!this.motionlessOnce){for(var V=0,U=n.length;U>V;V++)t=this._getAnimationKey(n[V]),t.match(\"undefined\")?this.zr.delShape(n[V].id):(t+=n[V].type,l[t]?this.zr.delShape(n[V].id):l[t]=n[V]);for(var V=0,U=a.length;U>V;V++)t=this._getAnimationKey(a[V]),t.match(\"undefined\")?this.zr.addShape(a[V]):(t+=a[V].type,m[t]=a[V]);for(t in l)m[t]||this.zr.delShape(l[t].id);for(t in m)l[t]?(this.zr.delShape(l[t].id),this._animateMod(l[t],m[t],r,s,0,o)):(e=this.type!=h.CHART_TYPE_LINE&&this.type!=h.CHART_TYPE_RADAR||0===t.indexOf(\"icon\")?0:r/2,this._animateMod(!1,m[t],r,s,e,o));this.zr.refresh(),this.animationEffect()}else{this.motionlessOnce=!1,this.zr.delShape(n);for(var V=0,U=a.length;U>V;V++)this.zr.addShape(a[V])}},_getAnimationKey:function(e){return this.type!=h.CHART_TYPE_MAP&&this.type!=h.CHART_TYPE_TREEMAP&&this.type!=h.CHART_TYPE_VENN&&this.type!=h.CHART_TYPE_TREE?m.get(e,\"seriesIndex\")+\"_\"+m.get(e,\"dataIndex\")+(e._mark?e._mark:\"\")+(this.type===h.CHART_TYPE_RADAR?m.get(e,\"special\"):\"\"):m.get(e,\"seriesIndex\")+\"_\"+m.get(e,\"dataIndex\")+(e._mark?e._mark:\"undefined\")},_animateMod:function(e,t,i,n,a,o){switch(t.type){case\"polyline\":case\"half-smooth-polygon\":V.pointList(this.zr,e,t,i,n);break;case\"rectangle\":V.rectangle(this.zr,e,t,i,n);break;case\"image\":case\"icon\":V.icon(this.zr,e,t,i,n,a);break;case\"candle\":o?this.zr.addShape(t):V.candle(this.zr,e,t,i,n);break;case\"ring\":case\"sector\":case\"circle\":o?\"sector\"===t.type?V.sector(this.zr,e,t,i,n):this.zr.addShape(t):V.ring(this.zr,e,t,i+(m.get(t,\"dataIndex\")||0)%20*100,n);break;case\"text\":V.text(this.zr,e,t,i,n);break;case\"polygon\":o?V.pointList(this.zr,e,t,i,n):V.polygon(this.zr,e,t,i,n);break;case\"ribbon\":V.ribbon(this.zr,e,t,i,n);break;case\"gauge-pointer\":V.gaugePointer(this.zr,e,t,i,n);break;case\"mark-line\":V.markline(this.zr,e,t,i,n);break;case\"bezier-curve\":case\"line\":V.line(this.zr,e,t,i,n);break;default:this.zr.addShape(t)}},animationMark:function(e,t,i){for(var i=i||this.shapeList,n=0,a=i.length;a>n;n++)i[n]._mark&&this._animateMod(!1,i[n],e,t,0,!0);this.animationEffect(i)},animationEffect:function(e){if(!e&&this.clearEffectShape(),e=e||this.shapeList,null!=e){var t=h.EFFECT_ZLEVEL;this.canvasSupported&&this.zr.modLayer(t,{motionBlur:!0,lastFrameAlpha:this.option.effectBlendAlpha||h.effectBlendAlpha});for(var i,n=0,a=e.length;a>n;n++)i=e[n],i._mark&&i.effect&&i.effect.show&&U[i._mark]&&(U[i._mark](this.zr,this.effectList,i,t),this.effectList[this.effectList.length-1]._mark=i._mark)}},clearEffectShape:function(e){var t=this.effectList;if(this.zr&&t&&t.length>0){e&&this.zr.modLayer(h.EFFECT_ZLEVEL,{motionBlur:!1}),this.zr.delShape(t);for(var i=0;i<t.length;i++)t[i].effectAnimator&&t[i].effectAnimator.stop()}this.effectList=[]},addMark:function(e,t,i){var n=this.series[e];if(this.selectedMap[n.name]){var a=this.query(this.option,\"animationDurationUpdate\"),o=this.query(this.option,\"animationEasing\"),r=n[i].data,s=this.shapeList.length;if(n[i].data=t.data,this[\"_build\"+i.replace(\"m\",\"M\")](e),this.option.animation&&!this.option.renderAsImage)this.animationMark(a,o,this.shapeList.slice(s));else{for(var l=s,h=this.shapeList.length;h>l;l++)this.zr.addShape(this.shapeList[l]);this.zr.refreshNextFrame()}n[i].data=r}},delMark:function(e,t,i){i=i.replace(\"mark\",\"\").replace(\"large\",\"\").toLowerCase();var n=this.series[e];if(this.selectedMap[n.name]){for(var a=!1,o=[this.shapeList,this.effectList],r=2;r--;)for(var s=0,l=o[r].length;l>s;s++)if(o[r][s]._mark==i&&m.get(o[r][s],\"seriesIndex\")==e&&m.get(o[r][s],\"name\")==t){this.zr.delShape(o[r][s].id),o[r].splice(s,1),a=!0;break}a&&this.zr.refreshNextFrame()}}},u.inherits(i,p),i}),i(\"zrender/shape/Circle\",[\"require\",\"./Base\",\"../tool/util\"],function(e){\"use strict\";var t=e(\"./Base\"),i=function(e){t.call(this,e)};return i.prototype={type:\"circle\",buildPath:function(e,t){e.moveTo(t.x+t.r,t.y),e.arc(t.x,t.y,t.r,0,2*Math.PI,!0)},getRect:function(e){if(e.__rect)return e.__rect;var t;return t=\"stroke\"==e.brushType||\"fill\"==e.brushType?e.lineWidth||1:0,e.__rect={x:Math.round(e.x-e.r-t/2),y:Math.round(e.y-e.r-t/2),width:2*e.r+t,height:2*e.r+t},e.__rect}},e(\"../tool/util\").inherits(i,t),i}),i(\"echarts/util/accMath\",[],function(){function e(e,t){var i=e.toString(),n=t.toString(),a=0;try{a=n.split(\".\")[1].length}catch(o){}try{a-=i.split(\".\")[1].length}catch(o){}return(i.replace(\".\",\"\")-0)/(n.replace(\".\",\"\")-0)*Math.pow(10,a)}function t(e,t){var i=e.toString(),n=t.toString(),a=0;try{a+=i.split(\".\")[1].length}catch(o){}try{a+=n.split(\".\")[1].length}catch(o){}return(i.replace(\".\",\"\")-0)*(n.replace(\".\",\"\")-0)/Math.pow(10,a)}function i(e,t){var i=0,n=0;try{i=e.toString().split(\".\")[1].length}catch(a){}try{n=t.toString().split(\".\")[1].length}catch(a){}var o=Math.pow(10,Math.max(i,n));return(Math.round(e*o)+Math.round(t*o))/o}function n(e,t){return i(e,-t)}return{accDiv:e,accMul:t,accAdd:i,accSub:n}}),i(\"echarts/util/shape/Icon\",[\"require\",\"zrender/tool/util\",\"zrender/shape/Star\",\"zrender/shape/Heart\",\"zrender/shape/Droplet\",\"zrender/shape/Image\",\"zrender/shape/Base\"],function(e){function t(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;e.moveTo(i,n+t.height),e.lineTo(i+5*a,n+14*o),e.lineTo(i+t.width,n+3*o),e.lineTo(i+13*a,n),e.lineTo(i+2*a,n+11*o),e.lineTo(i,n+t.height),e.moveTo(i+6*a,n+10*o),e.lineTo(i+14*a,n+2*o),e.moveTo(i+10*a,n+13*o),e.lineTo(i+t.width,n+13*o),e.moveTo(i+13*a,n+10*o),e.lineTo(i+13*a,n+t.height)}function i(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;e.moveTo(i,n+t.height),e.lineTo(i+5*a,n+14*o),e.lineTo(i+t.width,n+3*o),e.lineTo(i+13*a,n),e.lineTo(i+2*a,n+11*o),e.lineTo(i,n+t.height),e.moveTo(i+6*a,n+10*o),e.lineTo(i+14*a,n+2*o),e.moveTo(i+10*a,n+13*o),e.lineTo(i+t.width,n+13*o)}function n(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;e.moveTo(i+4*a,n+15*o),e.lineTo(i+9*a,n+13*o),e.lineTo(i+14*a,n+8*o),e.lineTo(i+11*a,n+5*o),e.lineTo(i+6*a,n+10*o),e.lineTo(i+4*a,n+15*o),e.moveTo(i+5*a,n),e.lineTo(i+11*a,n),e.moveTo(i+5*a,n+o),e.lineTo(i+11*a,n+o),e.moveTo(i,n+2*o),e.lineTo(i+t.width,n+2*o),e.moveTo(i,n+5*o),e.lineTo(i+3*a,n+t.height),e.lineTo(i+13*a,n+t.height),e.lineTo(i+t.width,n+5*o)}function a(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;e.moveTo(i,n+3*o),e.lineTo(i+6*a,n+3*o),e.moveTo(i+3*a,n),e.lineTo(i+3*a,n+6*o),e.moveTo(i+3*a,n+8*o),e.lineTo(i+3*a,n+t.height),e.lineTo(i+t.width,n+t.height),e.lineTo(i+t.width,n+3*o),e.lineTo(i+8*a,n+3*o)}function o(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;e.moveTo(i+6*a,n),e.lineTo(i+2*a,n+3*o),e.lineTo(i+6*a,n+6*o),e.moveTo(i+2*a,n+3*o),e.lineTo(i+14*a,n+3*o),e.lineTo(i+14*a,n+11*o),e.moveTo(i+2*a,n+5*o),e.lineTo(i+2*a,n+13*o),e.lineTo(i+14*a,n+13*o),e.moveTo(i+10*a,n+10*o),e.lineTo(i+14*a,n+13*o),e.lineTo(i+10*a,n+t.height)}function r(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16,r=t.width/2;e.lineWidth=1.5,e.arc(i+r,n+r,r-a,0,2*Math.PI/3),e.moveTo(i+3*a,n+t.height),e.lineTo(i+0*a,n+12*o),e.lineTo(i+5*a,n+11*o),e.moveTo(i,n+8*o),e.arc(i+r,n+r,r-a,Math.PI,5*Math.PI/3),e.moveTo(i+13*a,n),e.lineTo(i+t.width,n+4*o),e.lineTo(i+11*a,n+5*o)}function s(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;e.moveTo(i,n),e.lineTo(i,n+t.height),e.lineTo(i+t.width,n+t.height),e.moveTo(i+2*a,n+14*o),e.lineTo(i+7*a,n+6*o),e.lineTo(i+11*a,n+11*o),e.lineTo(i+15*a,n+2*o)}function l(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;e.moveTo(i,n),e.lineTo(i,n+t.height),e.lineTo(i+t.width,n+t.height),e.moveTo(i+3*a,n+14*o),e.lineTo(i+3*a,n+6*o),e.lineTo(i+4*a,n+6*o),e.lineTo(i+4*a,n+14*o),e.moveTo(i+7*a,n+14*o),e.lineTo(i+7*a,n+2*o),e.lineTo(i+8*a,n+2*o),e.lineTo(i+8*a,n+14*o),e.moveTo(i+11*a,n+14*o),e.lineTo(i+11*a,n+9*o),e.lineTo(i+12*a,n+9*o),e.lineTo(i+12*a,n+14*o)}function h(e,t){var i=t.x,n=t.y,a=t.width-2,o=t.height-2,r=Math.min(a,o)/2;n+=2,e.moveTo(i+r+3,n+r-3),e.arc(i+r+3,n+r-3,r-1,0,-Math.PI/2,!0),e.lineTo(i+r+3,n+r-3),e.moveTo(i+r,n),e.lineTo(i+r,n+r),e.arc(i+r,n+r,r,-Math.PI/2,2*Math.PI,!0),e.lineTo(i+r,n+r),e.lineWidth=1.5}function m(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;n-=o,e.moveTo(i+1*a,n+2*o),e.lineTo(i+15*a,n+2*o),e.lineTo(i+14*a,n+3*o),e.lineTo(i+2*a,n+3*o),e.moveTo(i+3*a,n+6*o),e.lineTo(i+13*a,n+6*o),e.lineTo(i+12*a,n+7*o),e.lineTo(i+4*a,n+7*o),e.moveTo(i+5*a,n+10*o),e.lineTo(i+11*a,n+10*o),e.lineTo(i+10*a,n+11*o),e.lineTo(i+6*a,n+11*o),e.moveTo(i+7*a,n+14*o),e.lineTo(i+9*a,n+14*o),e.lineTo(i+8*a,n+15*o),e.lineTo(i+7*a,n+15*o)}function V(e,t){var i=t.x,n=t.y,a=t.width,o=t.height,r=a/16,s=o/16,l=2*Math.min(r,s);e.moveTo(i+r+l,n+s+l),e.arc(i+r,n+s,l,Math.PI/4,3*Math.PI),e.lineTo(i+7*r-l,n+6*s-l),e.arc(i+7*r,n+6*s,l,Math.PI/4*5,4*Math.PI),e.arc(i+7*r,n+6*s,l/2,Math.PI/4*5,4*Math.PI),e.moveTo(i+7*r-l/2,n+6*s+l),e.lineTo(i+r+l,n+14*s-l),e.arc(i+r,n+14*s,l,-Math.PI/4,2*Math.PI),e.moveTo(i+7*r+l/2,n+6*s),e.lineTo(i+14*r-l,n+10*s-l/2),e.moveTo(i+16*r,n+10*s),e.arc(i+14*r,n+10*s,l,0,3*Math.PI),e.lineWidth=1.5}function U(e,t){var i=t.x,n=t.y,a=t.width,o=t.height,r=Math.min(a,o)/2;e.moveTo(i+a,n+o/2),e.arc(i+r,n+r,r,0,2*Math.PI),e.arc(i+r,n,r,Math.PI/4,Math.PI/5*4),e.arc(i,n+r,r,-Math.PI/3,Math.PI/3),e.arc(i+a,n+o,r,Math.PI,Math.PI/2*3),e.lineWidth=1.5}function d(e,t){for(var i=t.x,n=t.y,a=t.width,o=t.height,r=Math.round(o/3),s=Math.round((r-2)/2),l=3;l--;)e.rect(i,n+r*l+s,a,2)}function p(e,t){for(var i=t.x,n=t.y,a=t.width,o=t.height,r=Math.round(a/3),s=Math.round((r-2)/2),l=3;l--;)e.rect(i+r*l+s,n,2,o)}function c(e,t){var i=t.x,n=t.y,a=t.width/16;e.moveTo(i+a,n),e.lineTo(i+a,n+t.height),e.lineTo(i+15*a,n+t.height),e.lineTo(i+15*a,n),e.lineTo(i+a,n),e.moveTo(i+3*a,n+3*a),e.lineTo(i+13*a,n+3*a),e.moveTo(i+3*a,n+6*a),e.lineTo(i+13*a,n+6*a),e.moveTo(i+3*a,n+9*a),e.lineTo(i+13*a,n+9*a),e.moveTo(i+3*a,n+12*a),e.lineTo(i+9*a,n+12*a)}function u(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;e.moveTo(i,n),e.lineTo(i,n+t.height),e.lineTo(i+t.width,n+t.height),e.lineTo(i+t.width,n),e.lineTo(i,n),e.moveTo(i+4*a,n),e.lineTo(i+4*a,n+8*o),e.lineTo(i+12*a,n+8*o),e.lineTo(i+12*a,n),e.moveTo(i+6*a,n+11*o),e.lineTo(i+6*a,n+13*o),e.lineTo(i+10*a,n+13*o),e.lineTo(i+10*a,n+11*o),e.lineTo(i+6*a,n+11*o)}function y(e,t){var i=t.x,n=t.y,a=t.width,o=t.height;e.moveTo(i,n+o/2),e.lineTo(i+a,n+o/2),e.moveTo(i+a/2,n),e.lineTo(i+a/2,n+o)}function g(e,t){var i=t.width/2,n=t.height/2,a=Math.min(i,n);e.moveTo(t.x+i+a,t.y+n),e.arc(t.x+i,t.y+n,a,0,2*Math.PI),e.closePath()}function b(e,t){e.rect(t.x,t.y,t.width,t.height),e.closePath()}function f(e,t){var i=t.width/2,n=t.height/2,a=t.x+i,o=t.y+n,r=Math.min(i,n);e.moveTo(a,o-r),e.lineTo(a+r,o+r),e.lineTo(a-r,o+r),e.lineTo(a,o-r),e.closePath()}function k(e,t){var i=t.width/2,n=t.height/2,a=t.x+i,o=t.y+n,r=Math.min(i,n);e.moveTo(a,o-r),e.lineTo(a+r,o),e.lineTo(a,o+r),e.lineTo(a-r,o),e.lineTo(a,o-r),e.closePath()}function x(e,t){var i=t.x,n=t.y,a=t.width/16;e.moveTo(i+8*a,n),e.lineTo(i+a,n+t.height),e.lineTo(i+8*a,n+t.height/4*3),e.lineTo(i+15*a,n+t.height),e.lineTo(i+8*a,n),e.closePath()}function _(t,i){var n=e(\"zrender/shape/Star\"),a=i.width/2,o=i.height/2;n.prototype.buildPath(t,{x:i.x+a,y:i.y+o,r:Math.min(a,o),n:i.n||5})}function L(t,i){var n=e(\"zrender/shape/Heart\");n.prototype.buildPath(t,{x:i.x+i.width/2,y:i.y+.2*i.height,a:i.width/2,b:.8*i.height})}function W(t,i){var n=e(\"zrender/shape/Droplet\");n.prototype.buildPath(t,{x:i.x+.5*i.width,y:i.y+.5*i.height,a:.5*i.width,b:.8*i.height})}function X(e,t){var i=t.x,n=t.y-t.height/2*1.5,a=t.width/2,o=t.height/2,r=Math.min(a,o);e.arc(i+a,n+o,r,Math.PI/5*4,Math.PI/5),e.lineTo(i+a,n+o+1.5*r),e.closePath()}function v(t,i,n){var a=e(\"zrender/shape/Image\");this._imageShape=this._imageShape||new a({style:{}});for(var o in i)this._imageShape.style[o]=i[o];this._imageShape.brush(t,!1,n)}function w(e){I.call(this,e)}var K=e(\"zrender/tool/util\"),I=e(\"zrender/shape/Base\");return w.prototype={type:\"icon\",iconLibrary:{mark:t,markUndo:i,markClear:n,dataZoom:a,dataZoomReset:o,restore:r,lineChart:s,barChart:l,pieChart:h,funnelChart:m,forceChart:V,chordChart:U,stackChart:d,tiledChart:p,dataView:c,saveAsImage:u,cross:y,circle:g,rectangle:b,triangle:f,diamond:k,arrow:x,star:_,heart:L,droplet:W,pin:X,image:v},brush:function(t,i,n){var a=i?this.highlightStyle:this.style;a=a||{};var o=a.iconType||this.style.iconType;if(\"image\"===o){var r=e(\"zrender/shape/Image\");r.prototype.brush.call(this,t,i,n)}else{var a=this.beforeBrush(t,i);switch(t.beginPath(),this.buildPath(t,a,n),a.brushType){case\"both\":t.fill();case\"stroke\":a.lineWidth>0&&t.stroke();break;default:t.fill()}this.drawText(t,a,this.style),this.afterBrush(t)}},buildPath:function(e,t,i){this.iconLibrary[t.iconType]?this.iconLibrary[t.iconType].call(this,e,t,i):(e.moveTo(t.x,t.y),e.lineTo(t.x+t.width,t.y),e.lineTo(t.x+t.width,t.y+t.height),e.lineTo(t.x,t.y+t.height),e.lineTo(t.x,t.y),e.closePath())},getRect:function(e){return e.__rect?e.__rect:(e.__rect={x:Math.round(e.x),y:Math.round(e.y-(\"pin\"==e.iconType?e.height/2*1.5:0)),width:e.width,height:e.height*(\"pin\"===e.iconType?1.25:1)},e.__rect)},isCover:function(e,t){var i=this.transformCoordToLocal(e,t);e=i[0],t=i[1];var n=this.style.__rect;n||(n=this.style.__rect=this.getRect(this.style));var a=n.height<8||n.width<8?4:0;return e>=n.x-a&&e<=n.x+n.width+a&&t>=n.y-a&&t<=n.y+n.height+a}},K.inherits(w,I),w}),i(\"echarts/util/shape/MarkLine\",[\"require\",\"zrender/shape/Base\",\"./Icon\",\"zrender/shape/Line\",\"zrender/shape/BezierCurve\",\"zrender/tool/area\",\"zrender/shape/util/dashedLineTo\",\"zrender/tool/util\",\"zrender/tool/curve\"],function(e){function t(e){i.call(this,e),this.style.curveness>0&&this.updatePoints(this.style),this.highlightStyle.curveness>0&&this.updatePoints(this.highlightStyle)}var i=e(\"zrender/shape/Base\"),n=e(\"./Icon\"),a=e(\"zrender/shape/Line\"),o=new a({}),r=e(\"zrender/shape/BezierCurve\"),s=new r({}),l=e(\"zrender/tool/area\"),h=e(\"zrender/shape/util/dashedLineTo\"),m=e(\"zrender/tool/util\"),V=e(\"zrender/tool/curve\");return t.prototype={type:\"mark-line\",brush:function(e,t){var i=this.style;t&&(i=this.getHighlightStyle(i,this.highlightStyle||{})),e.save(),this.setContext(e,i),this.setTransform(e),e.save(),e.beginPath(),this.buildPath(e,i),e.stroke(),e.restore(),this.brushSymbol(e,i,0),this.brushSymbol(e,i,1),this.drawText(e,i,this.style),e.restore()},buildPath:function(e,t){var i=t.lineType||\"solid\";if(e.moveTo(t.xStart,t.yStart),t.curveness>0){var n=null;switch(i){case\"dashed\":n=[5,5];break;case\"dotted\":n=[1,1]}n&&e.setLineDash&&e.setLineDash(n),e.quadraticCurveTo(t.cpX1,t.cpY1,t.xEnd,t.yEnd)}else if(\"solid\"==i)e.lineTo(t.xEnd,t.yEnd);else{var a=(t.lineWidth||1)*(\"dashed\"==t.lineType?5:1);h(e,t.xStart,t.yStart,t.xEnd,t.yEnd,a)}},updatePoints:function(e){var t=e.curveness||0,i=1,n=e.xStart,a=e.yStart,o=e.xEnd,r=e.yEnd,s=(n+o)/2-i*(a-r)*t,l=(a+r)/2-i*(o-n)*t;e.cpX1=s,e.cpY1=l},brushSymbol:function(e,t,i){if(\"none\"!=t.symbol[i]){e.save(),e.beginPath(),e.lineWidth=t.symbolBorder,e.strokeStyle=t.symbolBorderColor;var a=t.symbol[i].replace(\"empty\",\"\").toLowerCase();t.symbol[i].match(\"empty\")&&(e.fillStyle=\"#fff\");var o=t.xStart,r=t.yStart,s=t.xEnd,l=t.yEnd,h=0===i?o:s,m=0===i?r:l,U=t.curveness||0,d=null!=t.symbolRotate[i]?t.symbolRotate[i]-0:0;if(d=d/180*Math.PI,\"arrow\"==a&&0===d)if(0===U){var p=0===i?-1:1;d=Math.PI/2+Math.atan2(p*(l-r),p*(s-o))}else{var c=t.cpX1,u=t.cpY1,y=V.quadraticDerivativeAt,g=y(o,c,s,i),b=y(r,u,l,i);d=Math.PI/2+Math.atan2(b,g)}e.translate(h,m),0!==d&&e.rotate(d);var f=t.symbolSize[i];n.prototype.buildPath(e,{x:-f,y:-f,width:2*f,height:2*f,iconType:a}),e.closePath(),e.fill(),e.stroke(),e.restore()}},getRect:function(e){return e.curveness>0?s.getRect(e):o.getRect(e),e.__rect},isCover:function(e,t){var i=this.transformCoordToLocal(e,t);return e=i[0],t=i[1],this.isCoverRect(e,t)?this.style.curveness>0?l.isInside(s,this.style,e,t):l.isInside(o,this.style,e,t):!1}},m.inherits(t,i),t}),i(\"echarts/util/shape/Symbol\",[\"require\",\"zrender/shape/Base\",\"zrender/shape/Polygon\",\"zrender/tool/util\",\"./normalIsCover\"],function(e){function t(e){i.call(this,e)}var i=e(\"zrender/shape/Base\"),n=e(\"zrender/shape/Polygon\"),a=new n({}),o=e(\"zrender/tool/util\");return t.prototype={type:\"symbol\",buildPath:function(e,t){var i=t.pointList,n=i.length;if(0!==n)for(var a,o,r,s,l,h=1e4,m=Math.ceil(n/h),V=i[0]instanceof Array,U=t.size?t.size:2,d=U,p=U/2,c=2*Math.PI,u=0;m>u;u++){e.beginPath(),a=u*h,o=a+h,o=o>n?n:o;for(var y=a;o>y;y++)if(t.random&&(r=t[\"randomMap\"+y%20]/100,d=U*r*r,p=d/2),V?(s=i[y][0],l=i[y][1]):(s=i[y].x,l=i[y].y),3>d)e.rect(s-p,l-p,d,d);else switch(t.iconType){case\"circle\":e.moveTo(s,l),e.arc(s,l,p,0,c,!0);break;case\"diamond\":e.moveTo(s,l-p),e.lineTo(s+p/3,l-p/3),e.lineTo(s+p,l),e.lineTo(s+p/3,l+p/3),e.lineTo(s,l+p),e.lineTo(s-p/3,l+p/3),e.lineTo(s-p,l),e.lineTo(s-p/3,l-p/3),e.lineTo(s,l-p);break;default:e.rect(s-p,l-p,d,d)}if(e.closePath(),m-1>u)switch(t.brushType){case\"both\":e.fill(),t.lineWidth>0&&e.stroke();break;case\"stroke\":t.lineWidth>0&&e.stroke();break;default:e.fill()}}},getRect:function(e){return e.__rect||a.getRect(e)},isCover:e(\"./normalIsCover\")},o.inherits(t,i),t}),i(\"zrender/shape/Polyline\",[\"require\",\"./Base\",\"./util/smoothSpline\",\"./util/smoothBezier\",\"./util/dashedLineTo\",\"./Polygon\",\"../tool/util\"],function(e){var t=e(\"./Base\"),i=e(\"./util/smoothSpline\"),n=e(\"./util/smoothBezier\"),a=e(\"./util/dashedLineTo\"),o=function(e){this.brushTypeOnly=\"stroke\",this.textPosition=\"end\",t.call(this,e)};return o.prototype={type:\"polyline\",buildPath:function(e,t){var n=t.pointList;if(!(n.length<2)){var o=Math.min(t.pointList.length,Math.round(t.pointListLength||t.pointList.length));if(t.smooth&&\"spline\"!==t.smooth){t.controlPointList||this.updateControlPoints(t);var r=t.controlPointList;e.moveTo(n[0][0],n[0][1]);for(var s,l,h,m=0;o-1>m;m++)s=r[2*m],l=r[2*m+1],h=n[m+1],e.bezierCurveTo(s[0],s[1],l[0],l[1],h[0],h[1])}else if(\"spline\"===t.smooth&&(n=i(n),o=n.length),t.lineType&&\"solid\"!=t.lineType){if(\"dashed\"==t.lineType||\"dotted\"==t.lineType){var V=(t.lineWidth||1)*(\"dashed\"==t.lineType?5:1);e.moveTo(n[0][0],n[0][1]);for(var m=1;o>m;m++)a(e,n[m-1][0],n[m-1][1],n[m][0],n[m][1],V)}}else{e.moveTo(n[0][0],n[0][1]);for(var m=1;o>m;m++)e.lineTo(n[m][0],n[m][1])}}},updateControlPoints:function(e){e.controlPointList=n(e.pointList,e.smooth,!1,e.smoothConstraint)},getRect:function(t){return e(\"./Polygon\").prototype.getRect(t)}},e(\"../tool/util\").inherits(o,t),o}),i(\"zrender/shape/ShapeBundle\",[\"require\",\"./Base\",\"../tool/util\"],function(e){var t=e(\"./Base\"),i=function(e){t.call(this,e)};return i.prototype={constructor:i,type:\"shape-bundle\",brush:function(e,t){var i=this.beforeBrush(e,t);e.beginPath();for(var n=0;n<i.shapeList.length;n++){var a=i.shapeList[n],o=a.style;t&&(o=a.getHighlightStyle(o,a.highlightStyle||{},a.brushTypeOnly)),a.buildPath(e,o)}switch(i.brushType){case\"both\":e.fill();case\"stroke\":i.lineWidth>0&&e.stroke();break;default:e.fill()}this.drawText(e,i,this.style),this.afterBrush(e)},getRect:function(e){if(e.__rect)return e.__rect;for(var t=1/0,i=-(1/0),n=1/0,a=-(1/0),o=0;o<e.shapeList.length;o++)var r=e.shapeList[o],s=r.getRect(r.style),t=Math.min(s.x,t),n=Math.min(s.y,n),i=Math.max(s.x+s.width,i),a=Math.max(s.y+s.height,a);return e.__rect={x:t,y:n,width:i-t,height:a-n},e.__rect},isCover:function(e,t){var i=this.transformCoordToLocal(e,t);if(e=i[0],t=i[1],this.isCoverRect(e,t))for(var n=0;n<this.style.shapeList.length;n++){var a=this.style.shapeList[n];if(a.isCover(e,t))return!0}return!1}},e(\"../tool/util\").inherits(i,t),i}),i(\"echarts/util/ecAnimation\",[\"require\",\"zrender/tool/util\",\"zrender/tool/curve\",\"zrender/shape/Polygon\"],function(e){function t(e,t,i,n,a){var o,r=i.style.pointList,s=r.length;if(!t){if(o=[],\"vertical\"!=i._orient)for(var l=r[0][1],h=0;s>h;h++)o[h]=[r[h][0],l];else for(var m=r[0][0],h=0;s>h;h++)o[h]=[m,r[h][1]];\"half-smooth-polygon\"==i.type&&(o[s-1]=p.clone(r[s-1]),o[s-2]=p.clone(r[s-2])),t={style:{pointList:o}}}o=t.style.pointList;var V=o.length;i.style.pointList=V==s?o:s>V?o.concat(r.slice(V)):o.slice(0,s),e.addShape(i),i.__animating=!0,e.animate(i.id,\"style\").when(n,{pointList:r}).during(function(){i.updateControlPoints&&i.updateControlPoints(i.style)}).done(function(){i.__animating=!1}).start(a)}function i(e,t){for(var i=arguments.length,n=2;i>n;n++){var a=arguments[n];e.style[a]=t.style[a]}}function n(e,t,n,a,o){var r=n.style;t||(t={position:n.position,style:{x:r.x,y:\"vertical\"==n._orient?r.y+r.height:r.y,width:\"vertical\"==n._orient?r.width:0,height:\"vertical\"!=n._orient?r.height:0}});var s=r.x,l=r.y,h=r.width,m=r.height,V=[n.position[0],n.position[1]];i(n,t,\"x\",\"y\",\"width\",\"height\"),n.position=t.position,e.addShape(n),(V[0]!=t.position[0]||V[1]!=t.position[1])&&e.animate(n.id,\"\").when(a,{position:V}).start(o),n.__animating=!0,e.animate(n.id,\"style\").when(a,{x:s,y:l,width:h,height:m}).done(function(){n.__animating=!1}).start(o)}function a(e,t,i,n,a){if(!t){var o=i.style.y;t={style:{y:[o[0],o[0],o[0],o[0]]}}}var r=i.style.y;i.style.y=t.style.y,e.addShape(i),i.__animating=!0,e.animate(i.id,\"style\").when(n,{y:r}).done(function(){i.__animating=!1}).start(a)}function o(e,t,i,n,a){var o=i.style.x,r=i.style.y,s=i.style.r0,l=i.style.r;i.__animating=!0,\"r\"!=i._animationAdd?(i.style.r0=0,i.style.r=0,i.rotation=[2*Math.PI,o,r],e.addShape(i),e.animate(i.id,\"style\").when(n,{r0:s,r:l}).done(function(){i.__animating=!1}).start(a),e.animate(i.id,\"\").when(n,{rotation:[0,o,r]}).start(a)):(i.style.r0=i.style.r,e.addShape(i),e.animate(i.id,\"style\").when(n,{r0:s}).done(function(){i.__animating=!1}).start(a))}function r(e,t,n,a,o){t||(t=\"r\"!=n._animationAdd?{\nstyle:{startAngle:n.style.startAngle,endAngle:n.style.startAngle}}:{style:{r0:n.style.r}});var r=n.style.startAngle,s=n.style.endAngle;i(n,t,\"startAngle\",\"endAngle\"),e.addShape(n),n.__animating=!0,e.animate(n.id,\"style\").when(a,{startAngle:r,endAngle:s}).done(function(){n.__animating=!1}).start(o)}function s(e,t,n,a,o){t||(t={style:{x:\"left\"==n.style.textAlign?n.style.x+100:n.style.x-100,y:n.style.y}});var r=n.style.x,s=n.style.y;i(n,t,\"x\",\"y\"),e.addShape(n),n.__animating=!0,e.animate(n.id,\"style\").when(a,{x:r,y:s}).done(function(){n.__animating=!1}).start(o)}function l(t,i,n,a,o){var r=e(\"zrender/shape/Polygon\").prototype.getRect(n.style),s=r.x+r.width/2,l=r.y+r.height/2;n.scale=[.1,.1,s,l],t.addShape(n),n.__animating=!0,t.animate(n.id,\"\").when(a,{scale:[1,1,s,l]}).done(function(){n.__animating=!1}).start(o)}function h(e,t,n,a,o){t||(t={style:{source0:0,source1:n.style.source1>0?360:-360,target0:0,target1:n.style.target1>0?360:-360}});var r=n.style.source0,s=n.style.source1,l=n.style.target0,h=n.style.target1;t.style&&i(n,t,\"source0\",\"source1\",\"target0\",\"target1\"),e.addShape(n),n.__animating=!0,e.animate(n.id,\"style\").when(a,{source0:r,source1:s,target0:l,target1:h}).done(function(){n.__animating=!1}).start(o)}function m(e,t,i,n,a){t||(t={style:{angle:i.style.startAngle}});var o=i.style.angle;i.style.angle=t.style.angle,e.addShape(i),i.__animating=!0,e.animate(i.id,\"style\").when(n,{angle:o}).done(function(){i.__animating=!1}).start(a)}function V(e,t,i,a,o,r){if(i.style._x=i.style.x,i.style._y=i.style.y,i.style._width=i.style.width,i.style._height=i.style.height,t)n(e,t,i,a,o);else{var s=i._x||0,l=i._y||0;i.scale=[.01,.01,s,l],e.addShape(i),i.__animating=!0,e.animate(i.id,\"\").delay(r).when(a,{scale:[1,1,s,l]}).done(function(){i.__animating=!1}).start(o||\"QuinticOut\")}}function U(e,t,n,a,o){t||(t={style:{xStart:n.style.xStart,yStart:n.style.yStart,xEnd:n.style.xStart,yEnd:n.style.yStart}});var r=n.style.xStart,s=n.style.xEnd,l=n.style.yStart,h=n.style.yEnd;i(n,t,\"xStart\",\"xEnd\",\"yStart\",\"yEnd\"),e.addShape(n),n.__animating=!0,e.animate(n.id,\"style\").when(a,{xStart:r,xEnd:s,yStart:l,yEnd:h}).done(function(){n.__animating=!1}).start(o)}function d(e,t,i,n,a){a=a||\"QuinticOut\",i.__animating=!0,e.addShape(i);var o=i.style,r=function(){i.__animating=!1},s=o.xStart,l=o.yStart,h=o.xEnd,m=o.yEnd;if(o.curveness>0){i.updatePoints(o);var V={p:0},U=o.cpX1,d=o.cpY1,p=[],u=[],y=c.quadraticSubdivide;e.animation.animate(V).when(n,{p:1}).during(function(){y(s,U,h,V.p,p),y(l,d,m,V.p,u),o.cpX1=p[1],o.cpY1=u[1],o.xEnd=p[2],o.yEnd=u[2],e.modShape(i)}).done(r).start(a)}else e.animate(i.id,\"style\").when(0,{xEnd:s,yEnd:l}).when(n,{xEnd:h,yEnd:m}).done(r).start(a)}var p=e(\"zrender/tool/util\"),c=e(\"zrender/tool/curve\");return{pointList:t,rectangle:n,candle:a,ring:o,sector:r,text:s,polygon:l,ribbon:h,gaugePointer:m,icon:V,line:U,markline:d}}),i(\"echarts/util/ecEffect\",[\"require\",\"../util/ecData\",\"zrender/shape/Circle\",\"zrender/shape/Image\",\"zrender/tool/curve\",\"../util/shape/Icon\",\"../util/shape/Symbol\",\"zrender/shape/ShapeBundle\",\"zrender/shape/Polyline\",\"zrender/tool/vector\",\"zrender/tool/env\"],function(e){function t(e,t,i,n){var a,r=i.effect,l=r.color||i.style.strokeColor||i.style.color,m=r.shadowColor||l,V=r.scaleSize,U=r.bounceDistance,d=\"undefined\"!=typeof r.shadowBlur?r.shadowBlur:V;\"image\"!==i.type?(a=new h({zlevel:n,style:{brushType:\"stroke\",iconType:\"droplet\"!=i.style.iconType?i.style.iconType:\"circle\",x:d+1,y:d+1,n:i.style.n,width:i.style._width*V,height:i.style._height*V,lineWidth:1,strokeColor:l,shadowColor:m,shadowBlur:d},draggable:!1,hoverable:!1}),\"pin\"==i.style.iconType&&(a.style.y+=a.style.height/2*1.5),p&&(a.style.image=e.shapeToImage(a,a.style.width+2*d+2,a.style.height+2*d+2).style.image,a=new s({zlevel:a.zlevel,style:a.style,draggable:!1,hoverable:!1}))):a=new s({zlevel:n,style:i.style,draggable:!1,hoverable:!1}),o.clone(i,a),a.position=i.position,t.push(a),e.addShape(a);var c=\"image\"!==i.type?window.devicePixelRatio||1:1,u=(a.style.width/c-i.style._width)/2;a.style.x=i.style._x-u,a.style.y=i.style._y-u,\"pin\"==i.style.iconType&&(a.style.y-=i.style.height/2*1.5);var y=100*(r.period+10*Math.random());e.modShape(i.id,{invisible:!0});var g=a.style.x+a.style.width/2/c,b=a.style.y+a.style.height/2/c;\"scale\"===r.type?(e.modShape(a.id,{scale:[.1,.1,g,b]}),e.animate(a.id,\"\",r.loop).when(y,{scale:[1,1,g,b]}).done(function(){i.effect.show=!1,e.delShape(a.id)}).start()):e.animate(a.id,\"style\",r.loop).when(y,{y:a.style.y-U}).when(2*y,{y:a.style.y}).done(function(){i.effect.show=!1,e.delShape(a.id)}).start()}function i(e,t,i,n){var a=i.effect,o=a.color||i.style.strokeColor||i.style.color,r=a.scaleSize,s=a.shadowColor||o,l=\"undefined\"!=typeof a.shadowBlur?a.shadowBlur:2*r,h=window.devicePixelRatio||1,V=new m({zlevel:n,position:i.position,scale:i.scale,style:{pointList:i.style.pointList,iconType:i.style.iconType,color:o,strokeColor:o,shadowColor:s,shadowBlur:l*h,random:!0,brushType:\"fill\",lineWidth:1,size:i.style.size},draggable:!1,hoverable:!1});t.push(V),e.addShape(V),e.modShape(i.id,{invisible:!0});for(var U=Math.round(100*a.period),d={},p={},c=0;20>c;c++)V.style[\"randomMap\"+c]=0,d={},d[\"randomMap\"+c]=100,p={},p[\"randomMap\"+c]=0,V.style[\"randomMap\"+c]=100*Math.random(),e.animate(V.id,\"style\",!0).when(U,d).when(2*U,p).when(3*U,d).when(4*U,d).delay(Math.random()*U*c).start()}function n(e,t,i,n,a){var s=i.effect,h=i.style,m=s.color||h.strokeColor||h.color,V=s.shadowColor||h.strokeColor||m,c=h.lineWidth*s.scaleSize,u=\"undefined\"!=typeof s.shadowBlur?s.shadowBlur:c,y=new r({zlevel:n,style:{x:u,y:u,r:c,color:m,shadowColor:V,shadowBlur:u},hoverable:!1}),g=0;if(p&&!a){var n=y.zlevel;y=e.shapeToImage(y,2*(c+u),2*(c+u)),y.zlevel=n,y.hoverable=!1,g=u}a||(o.clone(i,y),y.position=i.position,t.push(y),e.addShape(y));var b=function(){a||(i.effect.show=!1,e.delShape(y.id)),y.effectAnimator=null};if(i instanceof U){for(var f=[0],k=0,x=h.pointList,_=h.controlPointList,L=1;L<x.length;L++){if(_){var W=_[2*(L-1)],X=_[2*(L-1)+1];k+=d.dist(x[L-1],W)+d.dist(W,X)+d.dist(X,x[L])}else k+=d.dist(x[L-1],x[L]);f.push(k)}for(var v={p:0},w=e.animation.animate(v,{loop:s.loop}),L=0;L<f.length;L++)w.when(f[L]*s.period,{p:L});w.during(function(){var t,i,n=Math.floor(v.p);if(n==x.length-1)t=x[n][0],i=x[n][1];else{var o=v.p-n,r=x[n],s=x[n+1];if(_){var h=_[2*n],m=_[2*n+1];t=l.cubicAt(r[0],h[0],m[0],s[0],o),i=l.cubicAt(r[1],h[1],m[1],s[1],o)}else t=(s[0]-r[0])*o+r[0],i=(s[1]-r[1])*o+r[1]}y.style.x=t,y.style.y=i,a||e.modShape(y)}).done(b).start(),w.duration=k*s.period,y.effectAnimator=w}else{var K=h.xStart-g,I=h.yStart-g,J=h.xEnd-g,C=h.yEnd-g;y.style.x=K,y.style.y=I;var S=(J-K)*(J-K)+(C-I)*(C-I),E=Math.round(Math.sqrt(Math.round(S*s.period*s.period)));if(i.style.curveness>0){var F=h.cpX1-g,T=h.cpY1-g;y.effectAnimator=e.animation.animate(y,{loop:s.loop}).when(E,{p:1}).during(function(t,i){y.style.x=l.quadraticAt(K,F,J,i),y.style.y=l.quadraticAt(I,T,C,i),a||e.modShape(y)}).done(b).start()}else y.effectAnimator=e.animation.animate(y.style,{loop:s.loop}).when(E,{x:J,y:C}).during(function(){a||e.modShape(y)}).done(b).start();y.effectAnimator.duration=E}return y}function a(e,t,i,a){var o=new V({style:{shapeList:[]},zlevel:a,hoverable:!1}),r=i.style.shapeList,s=i.effect;o.position=i.position;for(var l=0,h=[],m=0;m<r.length;m++){r[m].effect=s;var U=n(e,null,r[m],a,!0),d=U.effectAnimator;o.style.shapeList.push(U),d.duration>l&&(l=d.duration),0===m&&(o.style.color=U.style.color,o.style.shadowBlur=U.style.shadowBlur,o.style.shadowColor=U.style.shadowColor),h.push(d)}t.push(o),e.addShape(o);var p=function(){for(var e=0;e<h.length;e++)h[e].stop()};if(l){o.__dummy=0;var c=e.animate(o.id,\"\",s.loop).when(l,{__dummy:1}).during(function(){e.modShape(o)}).done(function(){i.effect.show=!1,e.delShape(o.id)}).start(),u=c.stop;c.stop=function(){p(),u.call(this)}}}var o=e(\"../util/ecData\"),r=e(\"zrender/shape/Circle\"),s=e(\"zrender/shape/Image\"),l=e(\"zrender/tool/curve\"),h=e(\"../util/shape/Icon\"),m=e(\"../util/shape/Symbol\"),V=e(\"zrender/shape/ShapeBundle\"),U=e(\"zrender/shape/Polyline\"),d=e(\"zrender/tool/vector\"),p=e(\"zrender/tool/env\").canvasSupported;return{point:t,largePoint:i,line:n,largeLine:a}}),i(\"echarts/component/base\",[\"require\",\"../config\",\"../util/ecData\",\"../util/ecQuery\",\"../util/number\",\"zrender/tool/util\",\"zrender/tool/env\"],function(e){function t(e,t,a,o,r){this.ecTheme=e,this.messageCenter=t,this.zr=a,this.option=o,this.series=o.series,this.myChart=r,this.component=r.component,this.shapeList=[],this.effectList=[];var s=this;s._onlegendhoverlink=function(e){if(s.legendHoverLink)for(var t,a=e.target,o=s.shapeList.length-1;o>=0;o--)t=s.type==i.CHART_TYPE_PIE||s.type==i.CHART_TYPE_FUNNEL?n.get(s.shapeList[o],\"name\"):(n.get(s.shapeList[o],\"series\")||{}).name,t!=a||s.shapeList[o].invisible||s.shapeList[o].__animating||s.zr.addHoverShape(s.shapeList[o])},t&&t.bind(i.EVENT.LEGEND_HOVERLINK,this._onlegendhoverlink)}var i=e(\"../config\"),n=e(\"../util/ecData\"),a=e(\"../util/ecQuery\"),o=e(\"../util/number\"),r=e(\"zrender/tool/util\");return t.prototype={canvasSupported:e(\"zrender/tool/env\").canvasSupported,_getZ:function(e){if(null!=this[e])return this[e];var t=this.ecTheme[this.type];return t&&null!=t[e]?t[e]:(t=i[this.type],t&&null!=t[e]?t[e]:0)},getZlevelBase:function(){return this._getZ(\"zlevel\")},getZBase:function(){return this._getZ(\"z\")},reformOption:function(e){return e=r.merge(r.merge(e||{},r.clone(this.ecTheme[this.type]||{})),r.clone(i[this.type]||{})),this.z=e.z,this.zlevel=e.zlevel,e},reformCssArray:function(e){if(!(e instanceof Array))return[e,e,e,e];switch(e.length+\"\"){case\"4\":return e;case\"3\":return[e[0],e[1],e[2],e[1]];case\"2\":return[e[0],e[1],e[0],e[1]];case\"1\":return[e[0],e[0],e[0],e[0]];case\"0\":return[0,0,0,0]}},getShapeById:function(e){for(var t=0,i=this.shapeList.length;i>t;t++)if(this.shapeList[t].id===e)return this.shapeList[t];return null},getFont:function(e){var t=this.getTextStyle(r.clone(e));return t.fontStyle+\" \"+t.fontWeight+\" \"+t.fontSize+\"px \"+t.fontFamily},getTextStyle:function(e){return r.merge(r.merge(e||{},this.ecTheme.textStyle),i.textStyle)},getItemStyleColor:function(e,t,i,n){return\"function\"==typeof e?e.call(this.myChart,{seriesIndex:t,series:this.series[t],dataIndex:i,data:n}):e},getDataFromOption:function(e,t){return null!=e?null!=e.value?e.value:e:t},subPixelOptimize:function(e,t){return e=t%2===1?Math.floor(e)+.5:Math.round(e)},resize:function(){this.refresh&&this.refresh(),this.clearEffectShape&&this.clearEffectShape(!0);var e=this;setTimeout(function(){e.animationEffect&&e.animationEffect()},200)},clear:function(){this.clearEffectShape&&this.clearEffectShape(),this.zr&&this.zr.delShape(this.shapeList),this.shapeList=[]},dispose:function(){this.onbeforDispose&&this.onbeforDispose(),this.clear(),this.shapeList=null,this.effectList=null,this.messageCenter&&this.messageCenter.unbind(i.EVENT.LEGEND_HOVERLINK,this._onlegendhoverlink),this.onafterDispose&&this.onafterDispose()},query:a.query,deepQuery:a.deepQuery,deepMerge:a.deepMerge,parsePercent:o.parsePercent,parseCenter:o.parseCenter,parseRadius:o.parseRadius,numAddCommas:o.addCommas,getPrecision:o.getPrecision},t}),i(\"echarts/layout/EdgeBundling\",[\"require\",\"../data/KDTree\",\"zrender/tool/vector\"],function(e){function t(e,t){e=e.array,t=t.array;var i=t[0]-e[0],n=t[1]-e[1],a=t[2]-e[2],o=t[3]-e[3];return i*i+n*n+a*a+o*o}function i(e){this.points=[e.mp0,e.mp1],this.group=e}function n(e){var t=e.points;t[0][1]<t[1][1]||e instanceof i?(this.array=[t[0][0],t[0][1],t[1][0],t[1][1]],this._startPoint=t[0],this._endPoint=t[1]):(this.array=[t[1][0],t[1][1],t[0][0],t[0][1]],this._startPoint=t[1],this._endPoint=t[0]),this.ink=m(t[0],t[1]),this.edge=e,this.group=null}function a(){this.edgeList=[],this.mp0=l(),this.mp1=l(),this.ink=0}function o(){this.maxNearestEdge=6,this.maxTurningAngle=Math.PI/4,this.maxIteration=20}var r=e(\"../data/KDTree\"),s=e(\"zrender/tool/vector\"),l=s.create,h=s.distSquare,m=s.dist,V=s.copy,U=s.clone;return n.prototype.getStartPoint=function(){return this._startPoint},n.prototype.getEndPoint=function(){return this._endPoint},a.prototype.addEdge=function(e){e.group=this,this.edgeList.push(e)},a.prototype.removeEdge=function(e){e.group=null,this.edgeList.splice(this.edgeList.indexOf(e),1)},o.prototype={constructor:o,run:function(e){function t(e,t){return h(e,t)<1e-10}function n(e,i){for(var n=[],a=0,o=0;o<e.length;o++)a>0&&t(e[o],n[a-1])||(n[a++]=U(e[o]));return i[0]&&!t(n[0],i[0])&&(n=n.reverse()),n}for(var a=this._iterate(e),o=0;o++<this.maxIteration;){for(var r=[],s=0;s<a.groups.length;s++)r.push(new i(a.groups[s]));var l=this._iterate(r);if(l.savedInk<=0)break;a=l}var m=[],V=function(e,t){for(var a,o=0;o<e.length;o++){var r=e[o];if(r.edgeList[0]&&r.edgeList[0].edge instanceof i){for(var s=[],l=0;l<r.edgeList.length;l++)s.push(r.edgeList[l].edge.group);a=t?t.slice():[],a.unshift(r.mp0),a.push(r.mp1),V(s,a)}else for(var l=0;l<r.edgeList.length;l++){var h=r.edgeList[l];a=t?t.slice():[],a.unshift(r.mp0),a.push(r.mp1),a.unshift(h.getStartPoint()),a.push(h.getEndPoint()),m.push({points:n(a,h.edge.points),rawEdge:h.edge})}}};return V(a.groups),m},_iterate:function(e){for(var i=[],o=[],s=0,h=0;h<e.length;h++){var m=new n(e[h]);i.push(m)}for(var U=new r(i,4),d=[],p=l(),c=l(),u=0,y=l(),g=l(),b=0,h=0;h<i.length;h++){var m=i[h];if(!m.group){U.nearestN(m,this.maxNearestEdge,t,d);for(var f=0,k=null,x=null,_=0;_<d.length;_++){var L=d[_],W=0;L.group?L.group!==x&&(x=L.group,u=this._calculateGroupEdgeInk(L.group,m,p,c),W=L.group.ink+m.ink-u):(u=this._calculateEdgeEdgeInk(m,L,p,c),W=L.ink+m.ink-u),W>f&&(f=W,k=L,V(g,c),V(y,p),b=u)}if(k){s+=f;var X;k.group||(X=new a,o.push(X),X.addEdge(k)),X=k.group,V(X.mp0,y),V(X.mp1,g),X.ink=b,k.group.addEdge(m)}else{var X=new a;o.push(X),V(X.mp0,m.getStartPoint()),V(X.mp1,m.getEndPoint()),X.ink=m.ink,X.addEdge(m)}}}return{groups:o,edges:i,savedInk:s}},_calculateEdgeEdgeInk:function(){var e=[],t=[];return function(i,n,a,o){e[0]=i.getStartPoint(),e[1]=n.getStartPoint(),t[0]=i.getEndPoint(),t[1]=n.getEndPoint(),this._calculateMeetPoints(e,t,a,o);var r=m(e[0],a)+m(a,o)+m(o,t[0])+m(e[1],a)+m(o,t[1]);return r}}(),_calculateGroupEdgeInk:function(e,t,i,n){for(var a=[],o=[],r=0;r<e.edgeList.length;r++){var s=e.edgeList[r];a.push(s.getStartPoint()),o.push(s.getEndPoint())}a.push(t.getStartPoint()),o.push(t.getEndPoint()),this._calculateMeetPoints(a,o,i,n);for(var l=m(i,n),r=0;r<a.length;r++)l+=m(a[r],i)+m(o[r],n);return l},_calculateMeetPoints:function(){var e=l(),t=l();return function(i,n,a,o){s.set(e,0,0),s.set(t,0,0);for(var r=i.length,l=0;r>l;l++)s.add(e,e,i[l]);s.scale(e,e,1/r),r=n.length;for(var l=0;r>l;l++)s.add(t,t,n[l]);s.scale(t,t,1/r),this._limitTurningAngle(i,e,t,a),this._limitTurningAngle(n,t,e,o)}}(),_limitTurningAngle:function(){var e=l(),t=l(),i=l(),n=l();return function(a,o,r,l){var V=Math.cos(this.maxTurningAngle),U=Math.tan(this.maxTurningAngle);s.sub(e,o,r),s.normalize(e,e),s.copy(l,o);for(var d=0,p=0;p<a.length;p++){var c=a[p];s.sub(t,c,o);var u=s.len(t);s.scale(t,t,1/u);var y=s.dot(t,e);if(V>y){s.scaleAndAdd(i,o,e,u*y);var g=m(i,c),b=g/U;s.scaleAndAdd(n,i,e,-b);var f=h(n,o);f>d&&(d=f,s.copy(l,n))}}}}()},o}),i(\"zrender/shape/Star\",[\"require\",\"../tool/math\",\"./Base\",\"../tool/util\"],function(e){var t=e(\"../tool/math\"),i=t.sin,n=t.cos,a=Math.PI,o=e(\"./Base\"),r=function(e){o.call(this,e)};return r.prototype={type:\"star\",buildPath:function(e,t){var o=t.n;if(o&&!(2>o)){var r=t.x,s=t.y,l=t.r,h=t.r0;null==h&&(h=o>4?l*n(2*a/o)/n(a/o):l/3);var m=a/o,V=-a/2,U=r+l*n(V),d=s+l*i(V);V+=m;var p=t.pointList=[];p.push([U,d]);for(var c,u=0,y=2*o-1;y>u;u++)c=u%2===0?h:l,p.push([r+c*n(V),s+c*i(V)]),V+=m;p.push([U,d]),e.moveTo(p[0][0],p[0][1]);for(var u=0;u<p.length;u++)e.lineTo(p[u][0],p[u][1]);e.closePath()}},getRect:function(e){if(e.__rect)return e.__rect;var t;return t=\"stroke\"==e.brushType||\"fill\"==e.brushType?e.lineWidth||1:0,e.__rect={x:Math.round(e.x-e.r-t/2),y:Math.round(e.y-e.r-t/2),width:2*e.r+t,height:2*e.r+t},e.__rect}},e(\"../tool/util\").inherits(r,o),r}),i(\"zrender/shape/Heart\",[\"require\",\"./Base\",\"./util/PathProxy\",\"../tool/area\",\"../tool/util\"],function(e){\"use strict\";var t=e(\"./Base\"),i=e(\"./util/PathProxy\"),n=e(\"../tool/area\"),a=function(e){t.call(this,e),this._pathProxy=new i};return a.prototype={type:\"heart\",buildPath:function(e,t){var n=this._pathProxy||new i;n.begin(e),n.moveTo(t.x,t.y),n.bezierCurveTo(t.x+t.a/2,t.y-2*t.b/3,t.x+2*t.a,t.y+t.b/3,t.x,t.y+t.b),n.bezierCurveTo(t.x-2*t.a,t.y+t.b/3,t.x-t.a/2,t.y-2*t.b/3,t.x,t.y),n.closePath()},getRect:function(e){return e.__rect?e.__rect:(this._pathProxy.isEmpty()||this.buildPath(null,e),this._pathProxy.fastBoundingRect())},isCover:function(e,t){var i=this.transformCoordToLocal(e,t);return e=i[0],t=i[1],this.isCoverRect(e,t)?n.isInsidePath(this._pathProxy.pathCommands,this.style.lineWidth,this.style.brushType,e,t):void 0}},e(\"../tool/util\").inherits(a,t),a}),i(\"zrender/shape/Droplet\",[\"require\",\"./Base\",\"./util/PathProxy\",\"../tool/area\",\"../tool/util\"],function(e){\"use strict\";var t=e(\"./Base\"),i=e(\"./util/PathProxy\"),n=e(\"../tool/area\"),a=function(e){t.call(this,e),this._pathProxy=new i};return a.prototype={type:\"droplet\",buildPath:function(e,t){var n=this._pathProxy||new i;n.begin(e),n.moveTo(t.x,t.y+t.a),n.bezierCurveTo(t.x+t.a,t.y+t.a,t.x+3*t.a/2,t.y-t.a/3,t.x,t.y-t.b),n.bezierCurveTo(t.x-3*t.a/2,t.y-t.a/3,t.x-t.a,t.y+t.a,t.x,t.y+t.a),n.closePath()},getRect:function(e){return e.__rect?e.__rect:(this._pathProxy.isEmpty()||this.buildPath(null,e),this._pathProxy.fastBoundingRect())},isCover:function(e,t){var i=this.transformCoordToLocal(e,t);return e=i[0],t=i[1],this.isCoverRect(e,t)?n.isInsidePath(this._pathProxy.pathCommands,this.style.lineWidth,this.style.brushType,e,t):void 0}},e(\"../tool/util\").inherits(a,t),a}),i(\"zrender/tool/math\",[],function(){function e(e,t){return Math.sin(t?e*a:e)}function t(e,t){return Math.cos(t?e*a:e)}function i(e){return e*a}function n(e){return e/a}var a=Math.PI/180;return{sin:e,cos:t,degreeToRadian:i,radianToDegree:n}}),i(\"zrender/shape/util/PathProxy\",[\"require\",\"../../tool/vector\"],function(e){var t=e(\"../../tool/vector\"),i=function(e,t){this.command=e,this.points=t||null},n=function(){this.pathCommands=[],this._ctx=null,this._min=[],this._max=[]};return n.prototype.fastBoundingRect=function(){var e=this._min,i=this._max;e[0]=e[1]=1/0,i[0]=i[1]=-(1/0);for(var n=0;n<this.pathCommands.length;n++){var a=this.pathCommands[n],o=a.points;switch(a.command){case\"M\":t.min(e,e,o),t.max(i,i,o);break;case\"L\":t.min(e,e,o),t.max(i,i,o);break;case\"C\":for(var r=0;6>r;r+=2)e[0]=Math.min(e[0],e[0],o[r]),e[1]=Math.min(e[1],e[1],o[r+1]),i[0]=Math.max(i[0],i[0],o[r]),i[1]=Math.max(i[1],i[1],o[r+1]);break;case\"Q\":for(var r=0;4>r;r+=2)e[0]=Math.min(e[0],e[0],o[r]),e[1]=Math.min(e[1],e[1],o[r+1]),i[0]=Math.max(i[0],i[0],o[r]),i[1]=Math.max(i[1],i[1],o[r+1]);break;case\"A\":var s=o[0],l=o[1],h=o[2],m=o[3];e[0]=Math.min(e[0],e[0],s-h),e[1]=Math.min(e[1],e[1],l-m),i[0]=Math.max(i[0],i[0],s+h),i[1]=Math.max(i[1],i[1],l+m)}}return{x:e[0],y:e[1],width:i[0]-e[0],height:i[1]-e[1]}},n.prototype.begin=function(e){return this._ctx=e||null,this.pathCommands.length=0,this},n.prototype.moveTo=function(e,t){return this.pathCommands.push(new i(\"M\",[e,t])),this._ctx&&this._ctx.moveTo(e,t),this},n.prototype.lineTo=function(e,t){return this.pathCommands.push(new i(\"L\",[e,t])),this._ctx&&this._ctx.lineTo(e,t),this},n.prototype.bezierCurveTo=function(e,t,n,a,o,r){return this.pathCommands.push(new i(\"C\",[e,t,n,a,o,r])),this._ctx&&this._ctx.bezierCurveTo(e,t,n,a,o,r),this},n.prototype.quadraticCurveTo=function(e,t,n,a){return this.pathCommands.push(new i(\"Q\",[e,t,n,a])),this._ctx&&this._ctx.quadraticCurveTo(e,t,n,a),this},n.prototype.arc=function(e,t,n,a,o,r){return this.pathCommands.push(new i(\"A\",[e,t,n,n,a,o-a,0,r?0:1])),this._ctx&&this._ctx.arc(e,t,n,a,o,r),this},n.prototype.arcTo=function(e,t,i,n,a){return this._ctx&&this._ctx.arcTo(e,t,i,n,a),this},n.prototype.rect=function(e,t,i,n){return this._ctx&&this._ctx.rect(e,t,i,n),this},n.prototype.closePath=function(){return this.pathCommands.push(new i(\"z\")),this._ctx&&this._ctx.closePath(),this},n.prototype.isEmpty=function(){return 0===this.pathCommands.length},n.PathSegment=i,n}),i(\"zrender/shape/Line\",[\"require\",\"./Base\",\"./util/dashedLineTo\",\"../tool/util\"],function(e){var t=e(\"./Base\"),i=e(\"./util/dashedLineTo\"),n=function(e){this.brushTypeOnly=\"stroke\",this.textPosition=\"end\",t.call(this,e)};return n.prototype={type:\"line\",buildPath:function(e,t){if(t.lineType&&\"solid\"!=t.lineType){if(\"dashed\"==t.lineType||\"dotted\"==t.lineType){var n=(t.lineWidth||1)*(\"dashed\"==t.lineType?5:1);i(e,t.xStart,t.yStart,t.xEnd,t.yEnd,n)}}else e.moveTo(t.xStart,t.yStart),e.lineTo(t.xEnd,t.yEnd)},getRect:function(e){if(e.__rect)return e.__rect;var t=e.lineWidth||1;return e.__rect={x:Math.min(e.xStart,e.xEnd)-t,y:Math.min(e.yStart,e.yEnd)-t,width:Math.abs(e.xStart-e.xEnd)+t,height:Math.abs(e.yStart-e.yEnd)+t},e.__rect}},e(\"../tool/util\").inherits(n,t),n}),i(\"zrender/shape/BezierCurve\",[\"require\",\"./Base\",\"../tool/util\"],function(e){\"use strict\";var t=e(\"./Base\"),i=function(e){this.brushTypeOnly=\"stroke\",this.textPosition=\"end\",t.call(this,e)};return i.prototype={type:\"bezier-curve\",buildPath:function(e,t){e.moveTo(t.xStart,t.yStart),\"undefined\"!=typeof t.cpX2&&\"undefined\"!=typeof t.cpY2?e.bezierCurveTo(t.cpX1,t.cpY1,t.cpX2,t.cpY2,t.xEnd,t.yEnd):e.quadraticCurveTo(t.cpX1,t.cpY1,t.xEnd,t.yEnd)},getRect:function(e){if(e.__rect)return e.__rect;var t=Math.min(e.xStart,e.xEnd,e.cpX1),i=Math.min(e.yStart,e.yEnd,e.cpY1),n=Math.max(e.xStart,e.xEnd,e.cpX1),a=Math.max(e.yStart,e.yEnd,e.cpY1),o=e.cpX2,r=e.cpY2;\"undefined\"!=typeof o&&\"undefined\"!=typeof r&&(t=Math.min(t,o),i=Math.min(i,r),n=Math.max(n,o),a=Math.max(a,r));var s=e.lineWidth||1;return e.__rect={x:t-s,y:i-s,width:n-t+s,height:a-i+s},e.__rect}},e(\"../tool/util\").inherits(i,t),i}),i(\"zrender/shape/util/dashedLineTo\",[],function(){var e=[5,5];return function(t,i,n,a,o,r){if(t.setLineDash)return e[0]=e[1]=r,t.setLineDash(e),t.moveTo(i,n),void t.lineTo(a,o);r=\"number\"!=typeof r?5:r;var s=a-i,l=o-n,h=Math.floor(Math.sqrt(s*s+l*l)/r);s/=h,l/=h;for(var m=!0,V=0;h>V;++V)m?t.moveTo(i,n):t.lineTo(i,n),m=!m,i+=s,n+=l;t.lineTo(a,o)}}),i(\"zrender/shape/Polygon\",[\"require\",\"./Base\",\"./util/smoothSpline\",\"./util/smoothBezier\",\"./util/dashedLineTo\",\"../tool/util\"],function(e){var t=e(\"./Base\"),i=e(\"./util/smoothSpline\"),n=e(\"./util/smoothBezier\"),a=e(\"./util/dashedLineTo\"),o=function(e){t.call(this,e)};return o.prototype={type:\"polygon\",buildPath:function(e,t){var o=t.pointList;if(!(o.length<2)){if(t.smooth&&\"spline\"!==t.smooth){var r=n(o,t.smooth,!0,t.smoothConstraint);e.moveTo(o[0][0],o[0][1]);for(var s,l,h,m=o.length,V=0;m>V;V++)s=r[2*V],l=r[2*V+1],h=o[(V+1)%m],e.bezierCurveTo(s[0],s[1],l[0],l[1],h[0],h[1])}else if(\"spline\"===t.smooth&&(o=i(o,!0)),t.lineType&&\"solid\"!=t.lineType){if(\"dashed\"==t.lineType||\"dotted\"==t.lineType){var U=t._dashLength||(t.lineWidth||1)*(\"dashed\"==t.lineType?5:1);t._dashLength=U,e.moveTo(o[0][0],o[0][1]);for(var V=1,d=o.length;d>V;V++)a(e,o[V-1][0],o[V-1][1],o[V][0],o[V][1],U);a(e,o[o.length-1][0],o[o.length-1][1],o[0][0],o[0][1],U)}}else{e.moveTo(o[0][0],o[0][1]);for(var V=1,d=o.length;d>V;V++)e.lineTo(o[V][0],o[V][1]);e.lineTo(o[0][0],o[0][1])}e.closePath()}},getRect:function(e){if(e.__rect)return e.__rect;for(var t=Number.MAX_VALUE,i=Number.MIN_VALUE,n=Number.MAX_VALUE,a=Number.MIN_VALUE,o=e.pointList,r=0,s=o.length;s>r;r++)o[r][0]<t&&(t=o[r][0]),o[r][0]>i&&(i=o[r][0]),o[r][1]<n&&(n=o[r][1]),o[r][1]>a&&(a=o[r][1]);var l;return l=\"stroke\"==e.brushType||\"fill\"==e.brushType?e.lineWidth||1:0,e.__rect={x:Math.round(t-l/2),y:Math.round(n-l/2),width:i-t+l,height:a-n+l},e.__rect}},e(\"../tool/util\").inherits(o,t),o}),i(\"echarts/util/shape/normalIsCover\",[],function(){return function(e,t){var i=this.transformCoordToLocal(e,t);return e=i[0],t=i[1],this.isCoverRect(e,t)}}),i(\"zrender/shape/util/smoothSpline\",[\"require\",\"../../tool/vector\"],function(e){function t(e,t,i,n,a,o,r){var s=.5*(i-e),l=.5*(n-t);return(2*(t-i)+s+l)*r+(-3*(t-i)-2*s-l)*o+s*a+t}var i=e(\"../../tool/vector\");return function(e,n){for(var a=e.length,o=[],r=0,s=1;a>s;s++)r+=i.distance(e[s-1],e[s]);var l=r/5;l=a>l?a:l;for(var s=0;l>s;s++){var h,m,V,U=s/(l-1)*(n?a:a-1),d=Math.floor(U),p=U-d,c=e[d%a];n?(h=e[(d-1+a)%a],m=e[(d+1)%a],V=e[(d+2)%a]):(h=e[0===d?d:d-1],m=e[d>a-2?a-1:d+1],V=e[d>a-3?a-1:d+2]);var u=p*p,y=p*u;o.push([t(h[0],c[0],m[0],V[0],p,u,y),t(h[1],c[1],m[1],V[1],p,u,y)])}return o}}),i(\"zrender/shape/util/smoothBezier\",[\"require\",\"../../tool/vector\"],function(e){var t=e(\"../../tool/vector\");return function(e,i,n,a){var o,r,s,l,h=[],m=[],V=[],U=[],d=!!a;if(d){s=[1/0,1/0],l=[-(1/0),-(1/0)];for(var p=0,c=e.length;c>p;p++)t.min(s,s,e[p]),t.max(l,l,e[p]);t.min(s,s,a[0]),t.max(l,l,a[1])}for(var p=0,c=e.length;c>p;p++){var o,r,u=e[p];if(n)o=e[p?p-1:c-1],r=e[(p+1)%c];else{if(0===p||p===c-1){h.push(t.clone(e[p]));continue}o=e[p-1],r=e[p+1]}t.sub(m,r,o),t.scale(m,m,i);var y=t.distance(u,o),g=t.distance(u,r),b=y+g;0!==b&&(y/=b,g/=b),t.scale(V,m,-y),t.scale(U,m,g);var f=t.add([],u,V),k=t.add([],u,U);d&&(t.max(f,f,s),t.min(f,f,l),t.max(k,k,s),t.min(k,k,l)),h.push(f),h.push(k)}return n&&h.push(t.clone(h.shift())),h}}),i(\"echarts/util/ecQuery\",[\"require\",\"zrender/tool/util\"],function(e){function t(e,t){if(\"undefined\"!=typeof e){if(!t)return e;t=t.split(\".\");for(var i=t.length,n=0;i>n;){if(e=e[t[n]],\"undefined\"==typeof e)return;n++}return e}}function i(e,i){for(var n,a=0,o=e.length;o>a;a++)if(n=t(e[a],i),\"undefined\"!=typeof n)return n}function n(e,i){for(var n,o=e.length;o--;){var r=t(e[o],i);\"undefined\"!=typeof r&&(\"undefined\"==typeof n?n=a.clone(r):a.merge(n,r,!0))}return n}var a=e(\"zrender/tool/util\");return{query:t,deepQuery:i,deepMerge:n}}),i(\"echarts/util/number\",[],function(){function e(e){return e.replace(/^\\s+/,\"\").replace(/\\s+$/,\"\")}function t(t,i){return\"string\"==typeof t?e(t).match(/%$/)?parseFloat(t)/100*i:parseFloat(t):t}function i(e,i){return[t(i[0],e.getWidth()),t(i[1],e.getHeight())]}function n(e,i){i instanceof Array||(i=[0,i]);var n=Math.min(e.getWidth(),e.getHeight())/2;return[t(i[0],n),t(i[1],n)]}function a(e){return isNaN(e)?\"-\":(e=(e+\"\").split(\".\"),e[0].replace(/(\\d{1,3})(?=(?:\\d{3})+(?!\\d))/g,\"$1,\")+(e.length>1?\".\"+e[1]:\"\"))}function o(e){for(var t=1,i=0;Math.round(e*t)/t!==e;)t*=10,i++;return i}return{parsePercent:t,parseCenter:i,parseRadius:n,addCommas:a,getPrecision:o}}),i(\"echarts/data/KDTree\",[\"require\",\"./quickSelect\"],function(e){function t(e,t){this.left=null,this.right=null,this.axis=e,this.data=t}var i=e(\"./quickSelect\"),n=function(e,t){e.length&&(t||(t=e[0].array.length),this.dimension=t,this.root=this._buildTree(e,0,e.length-1,0),this._stack=[],this._nearstNList=[])};return n.prototype._buildTree=function(e,n,a,o){if(n>a)return null;var r=Math.floor((n+a)/2);r=i(e,n,a,r,function(e,t){return e.array[o]-t.array[o]});var s=e[r],l=new t(o,s);return o=(o+1)%this.dimension,a>n&&(l.left=this._buildTree(e,n,r-1,o),l.right=this._buildTree(e,r+1,a,o)),l},n.prototype.nearest=function(e,t){var i=this.root,n=this._stack,a=0,o=1/0,r=null;for(i.data!==e&&(o=t(i.data,e),r=i),e.array[i.axis]<i.data.array[i.axis]?(i.right&&(n[a++]=i.right),i.left&&(n[a++]=i.left)):(i.left&&(n[a++]=i.left),i.right&&(n[a++]=i.right));a--;){i=n[a];var s=e.array[i.axis]-i.data.array[i.axis],l=0>s,h=!1;s*=s,o>s&&(s=t(i.data,e),o>s&&i.data!==e&&(o=s,r=i),h=!0),l?(h&&i.right&&(n[a++]=i.right),i.left&&(n[a++]=i.left)):(h&&i.left&&(n[a++]=i.left),i.right&&(n[a++]=i.right))}return r.data},n.prototype._addNearest=function(e,t,i){for(var n=this._nearstNList,a=e-1;a>0&&!(t>=n[a-1].dist);a--)n[a].dist=n[a-1].dist,n[a].node=n[a-1].node;n[a].dist=t,n[a].node=i},n.prototype.nearestN=function(e,t,i,n){if(0>=t)return n.length=0,n;for(var a=this.root,o=this._stack,r=0,s=this._nearstNList,l=0;t>l;l++)s[l]||(s[l]={}),s[l].dist=0,s[l].node=null;var h=i(a.data,e),m=0;for(a.data!==e&&(m++,this._addNearest(m,h,a)),e.array[a.axis]<a.data.array[a.axis]?(a.right&&(o[r++]=a.right),a.left&&(o[r++]=a.left)):(a.left&&(o[r++]=a.left),a.right&&(o[r++]=a.right));r--;){a=o[r];var h=e.array[a.axis]-a.data.array[a.axis],V=0>h,U=!1;h*=h,(t>m||h<s[m-1].dist)&&(h=i(a.data,e),(t>m||h<s[m-1].dist)&&a.data!==e&&(t>m&&m++,this._addNearest(m,h,a)),U=!0),V?(U&&a.right&&(o[r++]=a.right),a.left&&(o[r++]=a.left)):(U&&a.left&&(o[r++]=a.left),a.right&&(o[r++]=a.right))}for(var l=0;m>l;l++)n[l]=s[l].node.data;return n.length=m,n},n}),i(\"echarts/data/quickSelect\",[\"require\"],function(){function e(e,t){return e-t}function t(e,t,i){var n=e[t];e[t]=e[i],e[i]=n}function i(e,i,n,a,o){for(var r=i;n>i;){var r=Math.round((n+i)/2),s=e[r];t(e,r,n),r=i;for(var l=i;n-1>=l;l++)o(s,e[l])>=0&&(t(e,l,r),r++);if(t(e,n,r),r===a)return r;a>r?i=r+1:n=r-1}return i}function n(t,n,a,o,r){return arguments.length<=3&&(o=n,r=2==arguments.length?e:a,n=0,a=t.length-1),i(t,n,a,o,r)}return n}),i(\"echarts/component/dataView\",[\"require\",\"./base\",\"../config\",\"zrender/tool/util\",\"../component\"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.dom=o.dom,this._tDom=document.createElement(\"div\"),this._textArea=document.createElement(\"textArea\"),this._buttonRefresh=document.createElement(\"button\"),this._buttonRefresh.setAttribute(\"type\",\"button\"),this._buttonClose=document.createElement(\"button\"),this._buttonClose.setAttribute(\"type\",\"button\"),this._hasShow=!1,this._zrHeight=n.getHeight(),this._zrWidth=n.getWidth(),this._tDom.className=\"echarts-dataview\",this.hide(),this.dom.firstChild.appendChild(this._tDom),window.addEventListener?(this._tDom.addEventListener(\"click\",this._stop),this._tDom.addEventListener(\"mousewheel\",this._stop),this._tDom.addEventListener(\"mousemove\",this._stop),this._tDom.addEventListener(\"mousedown\",this._stop),this._tDom.addEventListener(\"mouseup\",this._stop),this._tDom.addEventListener(\"touchstart\",this._stop),this._tDom.addEventListener(\"touchmove\",this._stop),this._tDom.addEventListener(\"touchend\",this._stop)):(this._tDom.attachEvent(\"onclick\",this._stop),this._tDom.attachEvent(\"onmousewheel\",this._stop),this._tDom.attachEvent(\"onmousemove\",this._stop),this._tDom.attachEvent(\"onmousedown\",this._stop),this._tDom.attachEvent(\"onmouseup\",this._stop))}var i=e(\"./base\"),n=e(\"../config\"),a=e(\"zrender/tool/util\");return t.prototype={type:n.COMPONENT_TYPE_DATAVIEW,_lang:[\"Data View\",\"close\",\"refresh\"],_gCssText:\"position:absolute;display:block;overflow:hidden;transition:height 0.8s,background-color 1s;-moz-transition:height 0.8s,background-color 1s;-webkit-transition:height 0.8s,background-color 1s;-o-transition:height 0.8s,background-color 1s;z-index:1;left:0;top:0;\",hide:function(){this._sizeCssText=\"width:\"+this._zrWidth+\"px;height:0px;background-color:#f0ffff;\",this._tDom.style.cssText=this._gCssText+this._sizeCssText},show:function(e){this._hasShow=!0;var t=this.query(this.option,\"toolbox.feature.dataView.lang\")||this._lang;this.option=e,this._tDom.innerHTML='<p style=\"padding:8px 0;margin:0 0 10px 0;border-bottom:1px solid #eee\">'+(t[0]||this._lang[0])+\"</p>\";var i=this.query(this.option,\"toolbox.feature.dataView.optionToContent\");\"function\"!=typeof i?this._textArea.value=this._optionToContent():(this._textArea=document.createElement(\"div\"),this._textArea.innerHTML=i(this.option)),this._textArea.style.cssText=\"display:block;margin:0 0 8px 0;padding:4px 6px;overflow:auto;width:100%;height:\"+(this._zrHeight-100)+\"px;\",this._tDom.appendChild(this._textArea),this._buttonClose.style.cssText=\"float:right;padding:1px 6px;\",this._buttonClose.innerHTML=t[1]||this._lang[1];var n=this;this._buttonClose.onclick=function(){n.hide()},this._tDom.appendChild(this._buttonClose),this.query(this.option,\"toolbox.feature.dataView.readOnly\")===!1?(this._buttonRefresh.style.cssText=\"float:right;margin-right:10px;padding:1px 6px;\",this._buttonRefresh.innerHTML=t[2]||this._lang[2],this._buttonRefresh.onclick=function(){n._save()},this._textArea.readOnly=!1,this._textArea.style.cursor=\"default\"):(this._buttonRefresh.style.cssText=\"display:none\",\nthis._textArea.readOnly=!0,this._textArea.style.cursor=\"text\"),this._tDom.appendChild(this._buttonRefresh),this._sizeCssText=\"width:\"+this._zrWidth+\"px;height:\"+this._zrHeight+\"px;background-color:#fff;\",this._tDom.style.cssText=this._gCssText+this._sizeCssText},_optionToContent:function(){var e,t,i,a,o,r,s=[],l=\"\";if(this.option.xAxis)for(s=this.option.xAxis instanceof Array?this.option.xAxis:[this.option.xAxis],e=0,a=s.length;a>e;e++)if(\"category\"==(s[e].type||\"category\")){for(r=[],t=0,i=s[e].data.length;i>t;t++)r.push(this.getDataFromOption(s[e].data[t]));l+=r.join(\", \")+\"\\n\\n\"}if(this.option.yAxis)for(s=this.option.yAxis instanceof Array?this.option.yAxis:[this.option.yAxis],e=0,a=s.length;a>e;e++)if(\"category\"==s[e].type){for(r=[],t=0,i=s[e].data.length;i>t;t++)r.push(this.getDataFromOption(s[e].data[t]));l+=r.join(\", \")+\"\\n\\n\"}var h,m=this.option.series;for(e=0,a=m.length;a>e;e++){for(r=[],t=0,i=m[e].data.length;i>t;t++)o=m[e].data[t],h=m[e].type==n.CHART_TYPE_PIE||m[e].type==n.CHART_TYPE_MAP?(o.name||\"-\")+\":\":\"\",m[e].type==n.CHART_TYPE_SCATTER&&(o=this.getDataFromOption(o).join(\", \")),r.push(h+this.getDataFromOption(o));l+=(m[e].name||\"-\")+\" : \\n\",l+=r.join(m[e].type==n.CHART_TYPE_SCATTER?\"\\n\":\", \"),l+=\"\\n\\n\"}return l},_save:function(){var e=this.query(this.option,\"toolbox.feature.dataView.contentToOption\");if(\"function\"!=typeof e){for(var t=this._textArea.value.split(\"\\n\"),i=[],a=0,o=t.length;o>a;a++)t[a]=this._trim(t[a]),\"\"!==t[a]&&i.push(t[a]);this._contentToOption(i)}else e(this._textArea,this.option);this.hide();var r=this;setTimeout(function(){r.messageCenter&&r.messageCenter.dispatch(n.EVENT.DATA_VIEW_CHANGED,null,{option:r.option},r.myChart)},r.canvasSupported?800:100)},_contentToOption:function(e){var t,i,a,o,r,s,l,h=[],m=0;if(this.option.xAxis)for(h=this.option.xAxis instanceof Array?this.option.xAxis:[this.option.xAxis],t=0,o=h.length;o>t;t++)if(\"category\"==(h[t].type||\"category\")){for(s=e[m].split(\",\"),i=0,a=h[t].data.length;a>i;i++)l=this._trim(s[i]||\"\"),r=h[t].data[i],\"undefined\"!=typeof h[t].data[i].value?h[t].data[i].value=l:h[t].data[i]=l;m++}if(this.option.yAxis)for(h=this.option.yAxis instanceof Array?this.option.yAxis:[this.option.yAxis],t=0,o=h.length;o>t;t++)if(\"category\"==h[t].type){for(s=e[m].split(\",\"),i=0,a=h[t].data.length;a>i;i++)l=this._trim(s[i]||\"\"),r=h[t].data[i],\"undefined\"!=typeof h[t].data[i].value?h[t].data[i].value=l:h[t].data[i]=l;m++}var V=this.option.series;for(t=0,o=V.length;o>t;t++)if(m++,V[t].type==n.CHART_TYPE_SCATTER)for(var i=0,a=V[t].data.length;a>i;i++)s=e[m],l=s.replace(\" \",\"\").split(\",\"),\"undefined\"!=typeof V[t].data[i].value?V[t].data[i].value=l:V[t].data[i]=l,m++;else{s=e[m].split(\",\");for(var i=0,a=V[t].data.length;a>i;i++)l=(s[i]||\"\").replace(/.*:/,\"\"),l=this._trim(l),l=\"-\"!=l&&\"\"!==l?l-0:\"-\",\"undefined\"!=typeof V[t].data[i].value?V[t].data[i].value=l:V[t].data[i]=l;m++}},_trim:function(e){var t=new RegExp(\"(^[\\\\s\\\\t\\\\xa0\\\\u3000]+)|([\\\\u3000\\\\xa0\\\\s\\\\t]+$)\",\"g\");return e.replace(t,\"\")},_stop:function(e){e=e||window.event,e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},resize:function(){this._zrHeight=this.zr.getHeight(),this._zrWidth=this.zr.getWidth(),this._tDom.offsetHeight>10&&(this._sizeCssText=\"width:\"+this._zrWidth+\"px;height:\"+this._zrHeight+\"px;background-color:#fff;\",this._tDom.style.cssText=this._gCssText+this._sizeCssText,this._textArea.style.cssText=\"display:block;margin:0 0 8px 0;padding:4px 6px;overflow:auto;width:100%;height:\"+(this._zrHeight-100)+\"px;\")},dispose:function(){window.removeEventListener?(this._tDom.removeEventListener(\"click\",this._stop),this._tDom.removeEventListener(\"mousewheel\",this._stop),this._tDom.removeEventListener(\"mousemove\",this._stop),this._tDom.removeEventListener(\"mousedown\",this._stop),this._tDom.removeEventListener(\"mouseup\",this._stop),this._tDom.removeEventListener(\"touchstart\",this._stop),this._tDom.removeEventListener(\"touchmove\",this._stop),this._tDom.removeEventListener(\"touchend\",this._stop)):(this._tDom.detachEvent(\"onclick\",this._stop),this._tDom.detachEvent(\"onmousewheel\",this._stop),this._tDom.detachEvent(\"onmousemove\",this._stop),this._tDom.detachEvent(\"onmousedown\",this._stop),this._tDom.detachEvent(\"onmouseup\",this._stop)),this._buttonRefresh.onclick=null,this._buttonClose.onclick=null,this._hasShow&&(this._tDom.removeChild(this._textArea),this._tDom.removeChild(this._buttonRefresh),this._tDom.removeChild(this._buttonClose)),this._textArea=null,this._buttonRefresh=null,this._buttonClose=null,this.dom.firstChild.removeChild(this._tDom),this._tDom=null}},a.inherits(t,i),e(\"../component\").define(\"dataView\",t),t}),i(\"echarts/util/shape/Cross\",[\"require\",\"zrender/shape/Base\",\"zrender/shape/Line\",\"zrender/tool/util\",\"./normalIsCover\"],function(e){function t(e){i.call(this,e)}var i=e(\"zrender/shape/Base\"),n=e(\"zrender/shape/Line\"),a=e(\"zrender/tool/util\");return t.prototype={type:\"cross\",buildPath:function(e,t){var i=t.rect;t.xStart=i.x,t.xEnd=i.x+i.width,t.yStart=t.yEnd=t.y,n.prototype.buildPath(e,t),t.xStart=t.xEnd=t.x,t.yStart=i.y,t.yEnd=i.y+i.height,n.prototype.buildPath(e,t)},getRect:function(e){return e.rect},isCover:e(\"./normalIsCover\")},a.inherits(t,i),t}),i(\"zrender/shape/Sector\",[\"require\",\"../tool/math\",\"../tool/computeBoundingBox\",\"../tool/vector\",\"./Base\",\"../tool/util\"],function(e){var t=e(\"../tool/math\"),i=e(\"../tool/computeBoundingBox\"),n=e(\"../tool/vector\"),a=e(\"./Base\"),o=n.create(),r=n.create(),s=n.create(),l=n.create(),h=function(e){a.call(this,e)};return h.prototype={type:\"sector\",buildPath:function(e,i){var n=i.x,a=i.y,o=i.r0||0,r=i.r,s=i.startAngle,l=i.endAngle,h=i.clockWise||!1;s=t.degreeToRadian(s),l=t.degreeToRadian(l),h||(s=-s,l=-l);var m=t.cos(s),V=t.sin(s);e.moveTo(m*o+n,V*o+a),e.lineTo(m*r+n,V*r+a),e.arc(n,a,r,s,l,!h),e.lineTo(t.cos(l)*o+n,t.sin(l)*o+a),0!==o&&e.arc(n,a,o,l,s,h),e.closePath()},getRect:function(e){if(e.__rect)return e.__rect;var a=e.x,h=e.y,m=e.r0||0,V=e.r,U=t.degreeToRadian(e.startAngle),d=t.degreeToRadian(e.endAngle),p=e.clockWise;return p||(U=-U,d=-d),m>1?i.arc(a,h,m,U,d,!p,o,s):(o[0]=s[0]=a,o[1]=s[1]=h),i.arc(a,h,V,U,d,!p,r,l),n.min(o,o,r),n.max(s,s,l),e.__rect={x:o[0],y:o[1],width:s[0]-o[0],height:s[1]-o[1]},e.__rect}},e(\"../tool/util\").inherits(h,a),h}),i(\"echarts/util/shape/Candle\",[\"require\",\"zrender/shape/Base\",\"zrender/tool/util\",\"./normalIsCover\"],function(e){function t(e){i.call(this,e)}var i=e(\"zrender/shape/Base\"),n=e(\"zrender/tool/util\");return t.prototype={type:\"candle\",_numberOrder:function(e,t){return t-e},buildPath:function(e,t){var i=n.clone(t.y).sort(this._numberOrder);e.moveTo(t.x,i[3]),e.lineTo(t.x,i[2]),e.moveTo(t.x-t.width/2,i[2]),e.rect(t.x-t.width/2,i[2],t.width,i[1]-i[2]),e.moveTo(t.x,i[1]),e.lineTo(t.x,i[0])},getRect:function(e){if(!e.__rect){var t=0;(\"stroke\"==e.brushType||\"fill\"==e.brushType)&&(t=e.lineWidth||1);var i=n.clone(e.y).sort(this._numberOrder);e.__rect={x:Math.round(e.x-e.width/2-t/2),y:Math.round(i[3]-t/2),width:e.width+t,height:i[0]-i[3]+t}}return e.__rect},isCover:e(\"./normalIsCover\")},n.inherits(t,i),t}),i(\"zrender/tool/computeBoundingBox\",[\"require\",\"./vector\",\"./curve\"],function(e){function t(e,t,i){if(0!==e.length){for(var n=e[0][0],a=e[0][0],o=e[0][1],r=e[0][1],s=1;s<e.length;s++){var l=e[s];l[0]<n&&(n=l[0]),l[0]>a&&(a=l[0]),l[1]<o&&(o=l[1]),l[1]>r&&(r=l[1])}t[0]=n,t[1]=o,i[0]=a,i[1]=r}}function i(e,t,i,n,a,r){var s=[];o.cubicExtrema(e[0],t[0],i[0],n[0],s);for(var l=0;l<s.length;l++)s[l]=o.cubicAt(e[0],t[0],i[0],n[0],s[l]);var h=[];o.cubicExtrema(e[1],t[1],i[1],n[1],h);for(var l=0;l<h.length;l++)h[l]=o.cubicAt(e[1],t[1],i[1],n[1],h[l]);s.push(e[0],n[0]),h.push(e[1],n[1]);var m=Math.min.apply(null,s),V=Math.max.apply(null,s),U=Math.min.apply(null,h),d=Math.max.apply(null,h);a[0]=m,a[1]=U,r[0]=V,r[1]=d}function n(e,t,i,n,a){var r=o.quadraticExtremum(e[0],t[0],i[0]),s=o.quadraticExtremum(e[1],t[1],i[1]);r=Math.max(Math.min(r,1),0),s=Math.max(Math.min(s,1),0);var l=1-r,h=1-s,m=l*l*e[0]+2*l*r*t[0]+r*r*i[0],V=l*l*e[1]+2*l*r*t[1]+r*r*i[1],U=h*h*e[0]+2*h*s*t[0]+s*s*i[0],d=h*h*e[1]+2*h*s*t[1]+s*s*i[1];n[0]=Math.min(e[0],i[0],m,U),n[1]=Math.min(e[1],i[1],V,d),a[0]=Math.max(e[0],i[0],m,U),a[1]=Math.max(e[1],i[1],V,d)}var a=e(\"./vector\"),o=e(\"./curve\"),r=a.create(),s=a.create(),l=a.create(),h=function(e,t,i,n,o,h,m,V){if(Math.abs(n-o)>=2*Math.PI)return m[0]=e-i,m[1]=t-i,V[0]=e+i,void(V[1]=t+i);if(r[0]=Math.cos(n)*i+e,r[1]=Math.sin(n)*i+t,s[0]=Math.cos(o)*i+e,s[1]=Math.sin(o)*i+t,a.min(m,r,s),a.max(V,r,s),n%=2*Math.PI,0>n&&(n+=2*Math.PI),o%=2*Math.PI,0>o&&(o+=2*Math.PI),n>o&&!h?o+=2*Math.PI:o>n&&h&&(n+=2*Math.PI),h){var U=o;o=n,n=U}for(var d=0;o>d;d+=Math.PI/2)d>n&&(l[0]=Math.cos(d)*i+e,l[1]=Math.sin(d)*i+t,a.min(m,l,m),a.max(V,l,V))};return t.cubeBezier=i,t.quadraticBezier=n,t.arc=h,t}),i(\"echarts/util/shape/Chain\",[\"require\",\"zrender/shape/Base\",\"./Icon\",\"zrender/shape/util/dashedLineTo\",\"zrender/tool/util\",\"zrender/tool/matrix\"],function(e){function t(e){i.call(this,e)}var i=e(\"zrender/shape/Base\"),n=e(\"./Icon\"),a=e(\"zrender/shape/util/dashedLineTo\"),o=e(\"zrender/tool/util\"),r=e(\"zrender/tool/matrix\");return t.prototype={type:\"chain\",brush:function(e,t){var i=this.style;t&&(i=this.getHighlightStyle(i,this.highlightStyle||{})),e.save(),this.setContext(e,i),this.setTransform(e),e.save(),e.beginPath(),this.buildLinePath(e,i),e.stroke(),e.restore(),this.brushSymbol(e,i),e.restore()},buildLinePath:function(e,t){var i=t.x,n=t.y+5,o=t.width,r=t.height/2-10;if(e.moveTo(i,n),e.lineTo(i,n+r),e.moveTo(i+o,n),e.lineTo(i+o,n+r),e.moveTo(i,n+r/2),t.lineType&&\"solid\"!=t.lineType){if(\"dashed\"==t.lineType||\"dotted\"==t.lineType){var s=(t.lineWidth||1)*(\"dashed\"==t.lineType?5:1);a(e,i,n+r/2,i+o,n+r/2,s)}}else e.lineTo(i+o,n+r/2)},brushSymbol:function(e,t){var i=t.y+t.height/4;e.save();for(var a,o=t.chainPoint,r=0,s=o.length;s>r;r++){if(a=o[r],\"none\"!=a.symbol){e.beginPath();var l=a.symbolSize;n.prototype.buildPath(e,{iconType:a.symbol,x:a.x-l,y:i-l,width:2*l,height:2*l,n:a.n}),e.fillStyle=a.isEmpty?\"#fff\":t.strokeColor,e.closePath(),e.fill(),e.stroke()}a.showLabel&&(e.font=a.textFont,e.fillStyle=a.textColor,e.textAlign=a.textAlign,e.textBaseline=a.textBaseline,a.rotation?(e.save(),this._updateTextTransform(e,a.rotation),e.fillText(a.name,a.textX,a.textY),e.restore()):e.fillText(a.name,a.textX,a.textY))}e.restore()},_updateTextTransform:function(e,t){var i=r.create();if(r.identity(i),0!==t[0]){var n=t[1]||0,a=t[2]||0;(n||a)&&r.translate(i,i,[-n,-a]),r.rotate(i,i,t[0]),(n||a)&&r.translate(i,i,[n,a])}e.transform.apply(e,i)},isCover:function(e,t){var i=this.style;return e>=i.x&&e<=i.x+i.width&&t>=i.y&&t<=i.y+i.height?!0:!1}},o.inherits(t,i),t}),i(\"zrender/shape/Ring\",[\"require\",\"./Base\",\"../tool/util\"],function(e){var t=e(\"./Base\"),i=function(e){t.call(this,e)};return i.prototype={type:\"ring\",buildPath:function(e,t){e.arc(t.x,t.y,t.r,0,2*Math.PI,!1),e.moveTo(t.x+t.r0,t.y),e.arc(t.x,t.y,t.r0,0,2*Math.PI,!0)},getRect:function(e){if(e.__rect)return e.__rect;var t;return t=\"stroke\"==e.brushType||\"fill\"==e.brushType?e.lineWidth||1:0,e.__rect={x:Math.round(e.x-e.r-t/2),y:Math.round(e.y-e.r-t/2),width:2*e.r+t,height:2*e.r+t},e.__rect}},e(\"../tool/util\").inherits(i,t),i}),i(\"echarts/component/axis\",[\"require\",\"./base\",\"zrender/shape/Line\",\"../config\",\"../util/ecData\",\"zrender/tool/util\",\"zrender/tool/color\",\"./categoryAxis\",\"./valueAxis\",\"../component\"],function(e){function t(e,t,n,a,o,r){i.call(this,e,t,n,a,o),this.axisType=r,this._axisList=[],this.refresh(a)}var i=e(\"./base\"),n=e(\"zrender/shape/Line\"),a=e(\"../config\"),o=e(\"../util/ecData\"),r=e(\"zrender/tool/util\"),s=e(\"zrender/tool/color\");return t.prototype={type:a.COMPONENT_TYPE_AXIS,axisBase:{_buildAxisLine:function(){var e=this.option.axisLine.lineStyle.width,t=e/2,i={_axisShape:\"axisLine\",zlevel:this.getZlevelBase(),z:this.getZBase()+3,hoverable:!1},a=this.grid;switch(this.option.position){case\"left\":i.style={xStart:a.getX()-t,yStart:a.getYend(),xEnd:a.getX()-t,yEnd:a.getY(),lineCap:\"round\"};break;case\"right\":i.style={xStart:a.getXend()+t,yStart:a.getYend(),xEnd:a.getXend()+t,yEnd:a.getY(),lineCap:\"round\"};break;case\"bottom\":i.style={xStart:a.getX(),yStart:a.getYend()+t,xEnd:a.getXend(),yEnd:a.getYend()+t,lineCap:\"round\"};break;case\"top\":i.style={xStart:a.getX(),yStart:a.getY()-t,xEnd:a.getXend(),yEnd:a.getY()-t,lineCap:\"round\"}}var o=i.style;\"\"!==this.option.name&&(o.text=this.option.name,o.textPosition=this.option.nameLocation,o.textFont=this.getFont(this.option.nameTextStyle),this.option.nameTextStyle.align&&(o.textAlign=this.option.nameTextStyle.align),this.option.nameTextStyle.baseline&&(o.textBaseline=this.option.nameTextStyle.baseline),this.option.nameTextStyle.color&&(o.textColor=this.option.nameTextStyle.color)),o.strokeColor=this.option.axisLine.lineStyle.color,o.lineWidth=e,this.isHorizontal()?o.yStart=o.yEnd=this.subPixelOptimize(o.yEnd,e):o.xStart=o.xEnd=this.subPixelOptimize(o.xEnd,e),o.lineType=this.option.axisLine.lineStyle.type,i=new n(i),this.shapeList.push(i)},_axisLabelClickable:function(e,t){return e?(o.pack(t,void 0,-1,void 0,-1,t.style.text),t.hoverable=!0,t.clickable=!0,t.highlightStyle={color:s.lift(t.style.color,1),brushType:\"fill\"},t):t},refixAxisShape:function(e,t){if(this.option.axisLine.onZero){var i;if(this.isHorizontal()&&null!=t)for(var n=0,a=this.shapeList.length;a>n;n++)\"axisLine\"===this.shapeList[n]._axisShape?(this.shapeList[n].style.yStart=this.shapeList[n].style.yEnd=this.subPixelOptimize(t,this.shapeList[n].stylelineWidth),this.zr.modShape(this.shapeList[n].id)):\"axisTick\"===this.shapeList[n]._axisShape&&(i=this.shapeList[n].style.yEnd-this.shapeList[n].style.yStart,this.shapeList[n].style.yStart=t-i,this.shapeList[n].style.yEnd=t,this.zr.modShape(this.shapeList[n].id));if(!this.isHorizontal()&&null!=e)for(var n=0,a=this.shapeList.length;a>n;n++)\"axisLine\"===this.shapeList[n]._axisShape?(this.shapeList[n].style.xStart=this.shapeList[n].style.xEnd=this.subPixelOptimize(e,this.shapeList[n].stylelineWidth),this.zr.modShape(this.shapeList[n].id)):\"axisTick\"===this.shapeList[n]._axisShape&&(i=this.shapeList[n].style.xEnd-this.shapeList[n].style.xStart,this.shapeList[n].style.xStart=e,this.shapeList[n].style.xEnd=e+i,this.zr.modShape(this.shapeList[n].id))}},getPosition:function(){return this.option.position},isHorizontal:function(){return\"bottom\"===this.option.position||\"top\"===this.option.position}},reformOption:function(e){if(!e||e instanceof Array&&0===e.length?e=[{type:a.COMPONENT_TYPE_AXIS_VALUE}]:e instanceof Array||(e=[e]),e.length>2&&(e=[e[0],e[1]]),\"xAxis\"===this.axisType){(!e[0].position||\"bottom\"!=e[0].position&&\"top\"!=e[0].position)&&(e[0].position=\"bottom\"),e.length>1&&(e[1].position=\"bottom\"===e[0].position?\"top\":\"bottom\");for(var t=0,i=e.length;i>t;t++)e[t].type=e[t].type||\"category\",e[t].xAxisIndex=t,e[t].yAxisIndex=-1}else{(!e[0].position||\"left\"!=e[0].position&&\"right\"!=e[0].position)&&(e[0].position=\"left\"),e.length>1&&(e[1].position=\"left\"===e[0].position?\"right\":\"left\");for(var t=0,i=e.length;i>t;t++)e[t].type=e[t].type||\"value\",e[t].xAxisIndex=-1,e[t].yAxisIndex=t}return e},refresh:function(t){var i;t&&(this.option=t,\"xAxis\"===this.axisType?(this.option.xAxis=this.reformOption(t.xAxis),i=this.option.xAxis):(this.option.yAxis=this.reformOption(t.yAxis),i=this.option.yAxis),this.series=t.series);for(var n=e(\"./categoryAxis\"),a=e(\"./valueAxis\"),o=Math.max(i&&i.length||0,this._axisList.length),r=0;o>r;r++)!this._axisList[r]||!t||i[r]&&this._axisList[r].type==i[r].type||(this._axisList[r].dispose&&this._axisList[r].dispose(),this._axisList[r]=!1),this._axisList[r]?this._axisList[r].refresh&&this._axisList[r].refresh(i?i[r]:!1,this.series):i&&i[r]&&(this._axisList[r]=\"category\"===i[r].type?new n(this.ecTheme,this.messageCenter,this.zr,i[r],this.myChart,this.axisBase):new a(this.ecTheme,this.messageCenter,this.zr,i[r],this.myChart,this.axisBase,this.series))},getAxis:function(e){return this._axisList[e]},getAxisCount:function(){return this._axisList.length},clear:function(){for(var e=0,t=this._axisList.length;t>e;e++)this._axisList[e].dispose&&this._axisList[e].dispose();this._axisList=[]}},r.inherits(t,i),e(\"../component\").define(\"axis\",t),t}),i(\"echarts/component/grid\",[\"require\",\"./base\",\"zrender/shape/Rectangle\",\"../config\",\"zrender/tool/util\",\"../component\"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e(\"./base\"),n=e(\"zrender/shape/Rectangle\"),a=e(\"../config\");a.grid={zlevel:0,z:0,x:80,y:60,x2:80,y2:60,backgroundColor:\"rgba(0,0,0,0)\",borderWidth:1,borderColor:\"#ccc\"};var o=e(\"zrender/tool/util\");return t.prototype={type:a.COMPONENT_TYPE_GRID,getX:function(){return this._x},getY:function(){return this._y},getWidth:function(){return this._width},getHeight:function(){return this._height},getXend:function(){return this._x+this._width},getYend:function(){return this._y+this._height},getArea:function(){return{x:this._x,y:this._y,width:this._width,height:this._height}},getBbox:function(){return[[this._x,this._y],[this.getXend(),this.getYend()]]},refixAxisShape:function(e){for(var t,i,n,o=e.xAxis._axisList.concat(e.yAxis?e.yAxis._axisList:[]),r=o.length;r--;)n=o[r],n.type==a.COMPONENT_TYPE_AXIS_VALUE&&n._min<0&&n._max>=0&&(n.isHorizontal()?t=n.getCoord(0):i=n.getCoord(0));if(\"undefined\"!=typeof t||\"undefined\"!=typeof i)for(r=o.length;r--;)o[r].refixAxisShape(t,i)},refresh:function(e){if(e||this._zrWidth!=this.zr.getWidth()||this._zrHeight!=this.zr.getHeight()){this.clear(),this.option=e||this.option,this.option.grid=this.reformOption(this.option.grid);var t=this.option.grid;this._zrWidth=this.zr.getWidth(),this._zrHeight=this.zr.getHeight(),this._x=this.parsePercent(t.x,this._zrWidth),this._y=this.parsePercent(t.y,this._zrHeight);var i=this.parsePercent(t.x2,this._zrWidth),a=this.parsePercent(t.y2,this._zrHeight);this._width=\"undefined\"==typeof t.width?this._zrWidth-this._x-i:this.parsePercent(t.width,this._zrWidth),this._width=this._width<=0?10:this._width,this._height=\"undefined\"==typeof t.height?this._zrHeight-this._y-a:this.parsePercent(t.height,this._zrHeight),this._height=this._height<=0?10:this._height,this._x=this.subPixelOptimize(this._x,t.borderWidth),this._y=this.subPixelOptimize(this._y,t.borderWidth),this.shapeList.push(new n({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._x,y:this._y,width:this._width,height:this._height,brushType:t.borderWidth>0?\"both\":\"fill\",color:t.backgroundColor,strokeColor:t.borderColor,lineWidth:t.borderWidth}})),this.zr.addShape(this.shapeList[0])}}},o.inherits(t,i),e(\"../component\").define(\"grid\",t),t}),i(\"echarts/component/dataZoom\",[\"require\",\"./base\",\"zrender/shape/Rectangle\",\"zrender/shape/Polygon\",\"../util/shape/Icon\",\"../config\",\"../util/date\",\"zrender/tool/util\",\"../component\"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o);var r=this;r._ondrift=function(e,t){return r.__ondrift(this,e,t)},r._ondragend=function(){return r.__ondragend()},this._fillerSize=30,this._isSilence=!1,this._zoom={},this.option.dataZoom=this.reformOption(this.option.dataZoom),this.zoomOption=this.option.dataZoom,this._handleSize=this.zoomOption.handleSize,this.myChart.canvasSupported||(this.zoomOption.realtime=!1),this._location=this._getLocation(),this._zoom=this._getZoom(),this._backupData(),this.option.dataZoom.show&&this._buildShape(),this._syncData()}var i=e(\"./base\"),n=e(\"zrender/shape/Rectangle\"),a=e(\"zrender/shape/Polygon\"),o=e(\"../util/shape/Icon\"),r=e(\"../config\");r.dataZoom={zlevel:0,z:4,show:!1,orient:\"horizontal\",backgroundColor:\"rgba(0,0,0,0)\",dataBackgroundColor:\"#eee\",fillerColor:\"rgba(144,197,237,0.2)\",handleColor:\"rgba(70,130,180,0.8)\",handleSize:8,showDetail:!0,realtime:!0};var s=e(\"../util/date\"),l=e(\"zrender/tool/util\");return t.prototype={type:r.COMPONENT_TYPE_DATAZOOM,_buildShape:function(){this._buildBackground(),this._buildFiller(),this._buildHandle(),this._buildFrame();for(var e=0,t=this.shapeList.length;t>e;e++)this.zr.addShape(this.shapeList[e]);this._syncFrameShape()},_getLocation:function(){var e,t,i,n,a=this.component.grid;return\"horizontal\"==this.zoomOption.orient?(i=this.zoomOption.width||a.getWidth(),n=this.zoomOption.height||this._fillerSize,e=null!=this.zoomOption.x?this.zoomOption.x:a.getX(),t=null!=this.zoomOption.y?this.zoomOption.y:this.zr.getHeight()-n-2):(i=this.zoomOption.width||this._fillerSize,n=this.zoomOption.height||a.getHeight(),e=null!=this.zoomOption.x?this.zoomOption.x:2,t=null!=this.zoomOption.y?this.zoomOption.y:a.getY()),{x:e,y:t,width:i,height:n}},_getZoom:function(){var e=this.option.series,t=this.option.xAxis;!t||t instanceof Array||(t=[t],this.option.xAxis=t);var i=this.option.yAxis;!i||i instanceof Array||(i=[i],this.option.yAxis=i);var n,a,o=[],s=this.zoomOption.xAxisIndex;if(t&&null==s){n=[];for(var l=0,h=t.length;h>l;l++)(\"category\"==t[l].type||null==t[l].type)&&n.push(l)}else n=s instanceof Array?s:null!=s?[s]:[];if(s=this.zoomOption.yAxisIndex,i&&null==s){a=[];for(var l=0,h=i.length;h>l;l++)\"category\"==i[l].type&&a.push(l)}else a=s instanceof Array?s:null!=s?[s]:[];for(var m,l=0,h=e.length;h>l;l++)if(m=e[l],m.type==r.CHART_TYPE_LINE||m.type==r.CHART_TYPE_BAR||m.type==r.CHART_TYPE_SCATTER||m.type==r.CHART_TYPE_K){for(var V=0,U=n.length;U>V;V++)if(n[V]==(m.xAxisIndex||0)){o.push(l);break}for(var V=0,U=a.length;U>V;V++)if(a[V]==(m.yAxisIndex||0)){o.push(l);break}null==this.zoomOption.xAxisIndex&&null==this.zoomOption.yAxisIndex&&m.data&&this.getDataFromOption(m.data[0])instanceof Array&&(m.type==r.CHART_TYPE_SCATTER||m.type==r.CHART_TYPE_LINE||m.type==r.CHART_TYPE_BAR)&&o.push(l)}var d=null!=this._zoom.start?this._zoom.start:null!=this.zoomOption.start?this.zoomOption.start:0,p=null!=this._zoom.end?this._zoom.end:null!=this.zoomOption.end?this.zoomOption.end:100;d>p&&(d+=p,p=d-p,d-=p);var c=Math.round((p-d)/100*(\"horizontal\"==this.zoomOption.orient?this._location.width:this._location.height));return{start:d,end:p,start2:0,end2:100,size:c,xAxisIndex:n,yAxisIndex:a,seriesIndex:o,scatterMap:this._zoom.scatterMap||{}}},_backupData:function(){this._originalData={xAxis:{},yAxis:{},series:{}};for(var e=this.option.xAxis,t=this._zoom.xAxisIndex,i=0,n=t.length;n>i;i++)this._originalData.xAxis[t[i]]=e[t[i]].data;for(var a=this.option.yAxis,o=this._zoom.yAxisIndex,i=0,n=o.length;n>i;i++)this._originalData.yAxis[o[i]]=a[o[i]].data;for(var s,l=this.option.series,h=this._zoom.seriesIndex,i=0,n=h.length;n>i;i++)s=l[h[i]],this._originalData.series[h[i]]=s.data,s.data&&this.getDataFromOption(s.data[0])instanceof Array&&(s.type==r.CHART_TYPE_SCATTER||s.type==r.CHART_TYPE_LINE||s.type==r.CHART_TYPE_BAR)&&(this._backupScale(),this._calculScatterMap(h[i]))},_calculScatterMap:function(t){this._zoom.scatterMap=this._zoom.scatterMap||{},this._zoom.scatterMap[t]=this._zoom.scatterMap[t]||{};var i=e(\"../component\"),n=i.get(\"axis\"),a=l.clone(this.option.xAxis);\"category\"==a[0].type&&(a[0].type=\"value\"),a[1]&&\"category\"==a[1].type&&(a[1].type=\"value\");var o=new n(this.ecTheme,null,!1,{xAxis:a,series:this.option.series},this,\"xAxis\"),r=this.option.series[t].xAxisIndex||0;this._zoom.scatterMap[t].x=o.getAxis(r).getExtremum(),o.dispose(),a=l.clone(this.option.yAxis),\"category\"==a[0].type&&(a[0].type=\"value\"),a[1]&&\"category\"==a[1].type&&(a[1].type=\"value\"),o=new n(this.ecTheme,null,!1,{yAxis:a,series:this.option.series},this,\"yAxis\"),r=this.option.series[t].yAxisIndex||0,this._zoom.scatterMap[t].y=o.getAxis(r).getExtremum(),o.dispose()},_buildBackground:function(){var e=this._location.width,t=this._location.height;this.shapeList.push(new n({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._location.x,y:this._location.y,width:e,height:t,color:this.zoomOption.backgroundColor}}));for(var i=0,o=this._originalData.xAxis,s=this._zoom.xAxisIndex,l=0,h=s.length;h>l;l++)i=Math.max(i,o[s[l]].length);for(var m=this._originalData.yAxis,V=this._zoom.yAxisIndex,l=0,h=V.length;h>l;l++)i=Math.max(i,m[V[l]].length);for(var U,d=this._zoom.seriesIndex[0],p=this._originalData.series[d],c=Number.MIN_VALUE,u=Number.MAX_VALUE,l=0,h=p.length;h>l;l++)U=this.getDataFromOption(p[l],0),this.option.series[d].type==r.CHART_TYPE_K&&(U=U[1]),isNaN(U)&&(U=0),c=Math.max(c,U),u=Math.min(u,U);var y=c-u,g=[],b=e/(i-(i>1?1:0)),f=t/(i-(i>1?1:0)),k=1;\"horizontal\"==this.zoomOption.orient&&1>b?k=Math.floor(3*i/e):\"vertical\"==this.zoomOption.orient&&1>f&&(k=Math.floor(3*i/t));for(var l=0,h=i;h>l;l+=k)U=this.getDataFromOption(p[l],0),this.option.series[d].type==r.CHART_TYPE_K&&(U=U[1]),isNaN(U)&&(U=0),g.push(\"horizontal\"==this.zoomOption.orient?[this._location.x+b*l,this._location.y+t-1-Math.round((U-u)/y*(t-10))]:[this._location.x+1+Math.round((U-u)/y*(e-10)),this._location.y+f*(h-l-1)]);\"horizontal\"==this.zoomOption.orient?(g.push([this._location.x+e,this._location.y+t]),g.push([this._location.x,this._location.y+t])):(g.push([this._location.x,this._location.y]),g.push([this._location.x,this._location.y+t])),this.shapeList.push(new a({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{pointList:g,color:this.zoomOption.dataBackgroundColor},hoverable:!1}))},_buildFiller:function(){this._fillerShae={zlevel:this.getZlevelBase(),z:this.getZBase(),draggable:!0,ondrift:this._ondrift,ondragend:this._ondragend,_type:\"filler\"},this._fillerShae.style=\"horizontal\"==this.zoomOption.orient?{x:this._location.x+Math.round(this._zoom.start/100*this._location.width)+this._handleSize,y:this._location.y,width:this._zoom.size-2*this._handleSize,height:this._location.height,color:this.zoomOption.fillerColor,text:\":::\",textPosition:\"inside\"}:{x:this._location.x,y:this._location.y+Math.round(this._zoom.start/100*this._location.height)+this._handleSize,width:this._location.width,height:this._zoom.size-2*this._handleSize,color:this.zoomOption.fillerColor,text:\"::\",textPosition:\"inside\"},this._fillerShae.highlightStyle={brushType:\"fill\",color:\"rgba(0,0,0,0)\"},this._fillerShae=new n(this._fillerShae),this.shapeList.push(this._fillerShae)},_buildHandle:function(){var e=this.zoomOption.showDetail?this._getDetail():{start:\"\",end:\"\"};this._startShape={zlevel:this.getZlevelBase(),z:this.getZBase(),draggable:!0,style:{iconType:\"rectangle\",x:this._location.x,y:this._location.y,width:this._handleSize,height:this._handleSize,color:this.zoomOption.handleColor,text:\"=\",textPosition:\"inside\"},highlightStyle:{text:e.start,brushType:\"fill\",textPosition:\"left\"},ondrift:this._ondrift,ondragend:this._ondragend},\"horizontal\"==this.zoomOption.orient?(this._startShape.style.height=this._location.height,this._endShape=l.clone(this._startShape),this._startShape.style.x=this._fillerShae.style.x-this._handleSize,this._endShape.style.x=this._fillerShae.style.x+this._fillerShae.style.width,this._endShape.highlightStyle.text=e.end,this._endShape.highlightStyle.textPosition=\"right\"):(this._startShape.style.width=this._location.width,this._endShape=l.clone(this._startShape),this._startShape.style.y=this._fillerShae.style.y+this._fillerShae.style.height,this._startShape.highlightStyle.textPosition=\"bottom\",this._endShape.style.y=this._fillerShae.style.y-this._handleSize,this._endShape.highlightStyle.text=e.end,this._endShape.highlightStyle.textPosition=\"top\"),this._startShape=new o(this._startShape),this._endShape=new o(this._endShape),this.shapeList.push(this._startShape),this.shapeList.push(this._endShape)},_buildFrame:function(){var e=this.subPixelOptimize(this._location.x,1),t=this.subPixelOptimize(this._location.y,1);this._startFrameShape={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:e,y:t,width:this._location.width-(e>this._location.x?1:0),height:this._location.height-(t>this._location.y?1:0),lineWidth:1,brushType:\"stroke\",strokeColor:this.zoomOption.handleColor}},this._endFrameShape=l.clone(this._startFrameShape),this._startFrameShape=new n(this._startFrameShape),this._endFrameShape=new n(this._endFrameShape),this.shapeList.push(this._startFrameShape),this.shapeList.push(this._endFrameShape)},_syncHandleShape:function(){\"horizontal\"==this.zoomOption.orient?(this._startShape.style.x=this._fillerShae.style.x-this._handleSize,this._endShape.style.x=this._fillerShae.style.x+this._fillerShae.style.width,this._zoom.start=(this._startShape.style.x-this._location.x)/this._location.width*100,this._zoom.end=(this._endShape.style.x+this._handleSize-this._location.x)/this._location.width*100):(this._startShape.style.y=this._fillerShae.style.y+this._fillerShae.style.height,this._endShape.style.y=this._fillerShae.style.y-this._handleSize,this._zoom.start=(this._location.y+this._location.height-this._startShape.style.y)/this._location.height*100,this._zoom.end=(this._location.y+this._location.height-this._endShape.style.y-this._handleSize)/this._location.height*100),this.zr.modShape(this._startShape.id),this.zr.modShape(this._endShape.id),this._syncFrameShape(),this.zr.refreshNextFrame()},_syncFillerShape:function(){var e,t;\"horizontal\"==this.zoomOption.orient?(e=this._startShape.style.x,t=this._endShape.style.x,this._fillerShae.style.x=Math.min(e,t)+this._handleSize,this._fillerShae.style.width=Math.abs(e-t)-this._handleSize,this._zoom.start=(Math.min(e,t)-this._location.x)/this._location.width*100,this._zoom.end=(Math.max(e,t)+this._handleSize-this._location.x)/this._location.width*100):(e=this._startShape.style.y,t=this._endShape.style.y,this._fillerShae.style.y=Math.min(e,t)+this._handleSize,this._fillerShae.style.height=Math.abs(e-t)-this._handleSize,this._zoom.start=(this._location.y+this._location.height-Math.max(e,t))/this._location.height*100,this._zoom.end=(this._location.y+this._location.height-Math.min(e,t)-this._handleSize)/this._location.height*100),this.zr.modShape(this._fillerShae.id),this._syncFrameShape(),this.zr.refreshNextFrame()},_syncFrameShape:function(){\"horizontal\"==this.zoomOption.orient?(this._startFrameShape.style.width=this._fillerShae.style.x-this._location.x,this._endFrameShape.style.x=this._fillerShae.style.x+this._fillerShae.style.width,this._endFrameShape.style.width=this._location.x+this._location.width-this._endFrameShape.style.x):(this._startFrameShape.style.y=this._fillerShae.style.y+this._fillerShae.style.height,this._startFrameShape.style.height=this._location.y+this._location.height-this._startFrameShape.style.y,this._endFrameShape.style.height=this._fillerShae.style.y-this._location.y),this.zr.modShape(this._startFrameShape.id),this.zr.modShape(this._endFrameShape.id)},_syncShape:function(){this.zoomOption.show&&(\"horizontal\"==this.zoomOption.orient?(this._startShape.style.x=this._location.x+this._zoom.start/100*this._location.width,this._endShape.style.x=this._location.x+this._zoom.end/100*this._location.width-this._handleSize,this._fillerShae.style.x=this._startShape.style.x+this._handleSize,this._fillerShae.style.width=this._endShape.style.x-this._startShape.style.x-this._handleSize):(this._startShape.style.y=this._location.y+this._location.height-this._zoom.start/100*this._location.height,this._endShape.style.y=this._location.y+this._location.height-this._zoom.end/100*this._location.height-this._handleSize,this._fillerShae.style.y=this._endShape.style.y+this._handleSize,this._fillerShae.style.height=this._startShape.style.y-this._endShape.style.y-this._handleSize),this.zr.modShape(this._startShape.id),this.zr.modShape(this._endShape.id),this.zr.modShape(this._fillerShae.id),this._syncFrameShape(),this.zr.refresh())},_syncData:function(e){var t,i,n,a,o;for(var s in this._originalData){t=this._originalData[s];for(var l in t)o=t[l],null!=o&&(a=o.length,i=Math.floor(this._zoom.start/100*a),n=Math.ceil(this._zoom.end/100*a),this.getDataFromOption(o[0])instanceof Array&&this.option[s][l].type!=r.CHART_TYPE_K?(this._setScale(),this.option[s][l].data=this._synScatterData(l,o)):this.option[s][l].data=o.slice(i,n))}this._isSilence||!this.zoomOption.realtime&&!e||this.messageCenter.dispatch(r.EVENT.DATA_ZOOM,null,{zoom:this._zoom},this.myChart)},_synScatterData:function(e,t){if(0===this._zoom.start&&100==this._zoom.end&&0===this._zoom.start2&&100==this._zoom.end2)return t;var i,n,a,o,r,s=[],l=this._zoom.scatterMap[e];\n\n\"horizontal\"==this.zoomOption.orient?(i=l.x.max-l.x.min,n=this._zoom.start/100*i+l.x.min,a=this._zoom.end/100*i+l.x.min,i=l.y.max-l.y.min,o=this._zoom.start2/100*i+l.y.min,r=this._zoom.end2/100*i+l.y.min):(i=l.x.max-l.x.min,n=this._zoom.start2/100*i+l.x.min,a=this._zoom.end2/100*i+l.x.min,i=l.y.max-l.y.min,o=this._zoom.start/100*i+l.y.min,r=this._zoom.end/100*i+l.y.min);var h;(h=l.x.dataMappingMethods)&&(n=h.coord2Value(n),a=h.coord2Value(a)),(h=l.y.dataMappingMethods)&&(o=h.coord2Value(o),r=h.coord2Value(r));for(var m,V=0,U=t.length;U>V;V++)m=t[V].value||t[V],m[0]>=n&&m[0]<=a&&m[1]>=o&&m[1]<=r&&s.push(t[V]);return s},_setScale:function(){var e=0!==this._zoom.start||100!==this._zoom.end||0!==this._zoom.start2||100!==this._zoom.end2,t={xAxis:this.option.xAxis,yAxis:this.option.yAxis};for(var i in t)for(var n=0,a=t[i].length;a>n;n++)t[i][n].scale=e||t[i][n]._scale},_backupScale:function(){var e={xAxis:this.option.xAxis,yAxis:this.option.yAxis};for(var t in e)for(var i=0,n=e[t].length;n>i;i++)e[t][i]._scale=e[t][i].scale},_getDetail:function(){for(var e=[\"xAxis\",\"yAxis\"],t=0,i=e.length;i>t;t++){var n=this._originalData[e[t]];for(var a in n){var o=n[a];if(null!=o){var r=o.length,l=Math.floor(this._zoom.start/100*r),h=Math.ceil(this._zoom.end/100*r);return h-=h>0?1:0,{start:this.getDataFromOption(o[l]),end:this.getDataFromOption(o[h])}}}}e=\"horizontal\"==this.zoomOption.orient?\"xAxis\":\"yAxis\";var m=this._zoom.seriesIndex[0],V=this.option.series[m][e+\"Index\"]||0,U=this.option[e][V].type,d=this._zoom.scatterMap[m][e.charAt(0)].min,p=this._zoom.scatterMap[m][e.charAt(0)].max,c=p-d;if(\"value\"==U)return{start:d+c*this._zoom.start/100,end:d+c*this._zoom.end/100};if(\"time\"==U){p=d+c*this._zoom.end/100,d+=c*this._zoom.start/100;var u=s.getAutoFormatter(d,p).formatter;return{start:s.format(u,d),end:s.format(u,p)}}return{start:\"\",end:\"\"}},__ondrift:function(e,t,i){this.zoomOption.zoomLock&&(e=this._fillerShae);var n=\"filler\"==e._type?this._handleSize:0;if(\"horizontal\"==this.zoomOption.orient?e.style.x+t-n<=this._location.x?e.style.x=this._location.x+n:e.style.x+t+e.style.width+n>=this._location.x+this._location.width?e.style.x=this._location.x+this._location.width-e.style.width-n:e.style.x+=t:e.style.y+i-n<=this._location.y?e.style.y=this._location.y+n:e.style.y+i+e.style.height+n>=this._location.y+this._location.height?e.style.y=this._location.y+this._location.height-e.style.height-n:e.style.y+=i,\"filler\"==e._type?this._syncHandleShape():this._syncFillerShape(),this.zoomOption.realtime&&this._syncData(),this.zoomOption.showDetail){var a=this._getDetail();this._startShape.style.text=this._startShape.highlightStyle.text=a.start,this._endShape.style.text=this._endShape.highlightStyle.text=a.end,this._startShape.style.textPosition=this._startShape.highlightStyle.textPosition,this._endShape.style.textPosition=this._endShape.highlightStyle.textPosition}return!0},__ondragend:function(){this.zoomOption.showDetail&&(this._startShape.style.text=this._endShape.style.text=\"=\",this._startShape.style.textPosition=this._endShape.style.textPosition=\"inside\",this.zr.modShape(this._startShape.id),this.zr.modShape(this._endShape.id),this.zr.refreshNextFrame()),this.isDragend=!0},ondragend:function(e,t){this.isDragend&&e.target&&(!this.zoomOption.realtime&&this._syncData(),t.dragOut=!0,t.dragIn=!0,this._isSilence||this.zoomOption.realtime||this.messageCenter.dispatch(r.EVENT.DATA_ZOOM,null,{zoom:this._zoom},this.myChart),t.needRefresh=!1,this.isDragend=!1)},ondataZoom:function(e,t){t.needRefresh=!0},absoluteZoom:function(e){this._zoom.start=e.start,this._zoom.end=e.end,this._zoom.start2=e.start2,this._zoom.end2=e.end2,this._syncShape(),this._syncData(!0)},rectZoom:function(e){if(!e)return this._zoom.start=this._zoom.start2=0,this._zoom.end=this._zoom.end2=100,this._syncShape(),this._syncData(!0),this._zoom;var t=this.component.grid.getArea(),i={x:e.x,y:e.y,width:e.width,height:e.height};if(i.width<0&&(i.x+=i.width,i.width=-i.width),i.height<0&&(i.y+=i.height,i.height=-i.height),i.x>t.x+t.width||i.y>t.y+t.height)return!1;i.x<t.x&&(i.x=t.x),i.x+i.width>t.x+t.width&&(i.width=t.x+t.width-i.x),i.y+i.height>t.y+t.height&&(i.height=t.y+t.height-i.y);var n,a=(i.x-t.x)/t.width,o=1-(i.x+i.width-t.x)/t.width,r=1-(i.y+i.height-t.y)/t.height,s=(i.y-t.y)/t.height;return\"horizontal\"==this.zoomOption.orient?(n=this._zoom.end-this._zoom.start,this._zoom.start+=n*a,this._zoom.end-=n*o,n=this._zoom.end2-this._zoom.start2,this._zoom.start2+=n*r,this._zoom.end2-=n*s):(n=this._zoom.end-this._zoom.start,this._zoom.start+=n*r,this._zoom.end-=n*s,n=this._zoom.end2-this._zoom.start2,this._zoom.start2+=n*a,this._zoom.end2-=n*o),this._syncShape(),this._syncData(!0),this._zoom},syncBackupData:function(e){for(var t,i,n=this._originalData.series,a=e.series,o=0,r=a.length;r>o;o++){i=a[o].data||a[o].eventList,t=n[o]?Math.floor(this._zoom.start/100*n[o].length):0;for(var s=0,l=i.length;l>s;s++)n[o]&&(n[o][s+t]=i[s])}},syncOption:function(e){this.silence(!0),this.option=e,this.option.dataZoom=this.reformOption(this.option.dataZoom),this.zoomOption=this.option.dataZoom,this.myChart.canvasSupported||(this.zoomOption.realtime=!1),this.clear(),this._location=this._getLocation(),this._zoom=this._getZoom(),this._backupData(),this.option.dataZoom&&this.option.dataZoom.show&&this._buildShape(),this._syncData(),this.silence(!1)},silence:function(e){this._isSilence=e},getRealDataIndex:function(e,t){if(!this._originalData||0===this._zoom.start&&100==this._zoom.end)return t;var i=this._originalData.series;return i[e]?Math.floor(this._zoom.start/100*i[e].length)+t:-1},resize:function(){this.clear(),this._location=this._getLocation(),this._zoom=this._getZoom(),this.option.dataZoom.show&&this._buildShape()}},l.inherits(t,i),e(\"../component\").define(\"dataZoom\",t),t}),i(\"echarts/component/categoryAxis\",[\"require\",\"./base\",\"zrender/shape/Text\",\"zrender/shape/Line\",\"zrender/shape/Rectangle\",\"../config\",\"zrender/tool/util\",\"zrender/tool/area\",\"../component\"],function(e){function t(e,t,n,a,o,r){if(a.data.length<1)return void console.error(\"option.data.length < 1.\");i.call(this,e,t,n,a,o),this.grid=this.component.grid;for(var s in r)this[s]=r[s];this.refresh(a)}var i=e(\"./base\"),n=e(\"zrender/shape/Text\"),a=e(\"zrender/shape/Line\"),o=e(\"zrender/shape/Rectangle\"),r=e(\"../config\");r.categoryAxis={zlevel:0,z:0,show:!0,position:\"bottom\",name:\"\",nameLocation:\"end\",nameTextStyle:{},boundaryGap:!0,axisLine:{show:!0,onZero:!0,lineStyle:{color:\"#48b\",width:2,type:\"solid\"}},axisTick:{show:!0,interval:\"auto\",inside:!1,length:5,lineStyle:{color:\"#333\",width:1}},axisLabel:{show:!0,interval:\"auto\",rotate:0,margin:8,textStyle:{color:\"#333\"}},splitLine:{show:!0,lineStyle:{color:[\"#ccc\"],width:1,type:\"solid\"}},splitArea:{show:!1,areaStyle:{color:[\"rgba(250,250,250,0.3)\",\"rgba(200,200,200,0.3)\"]}}};var s=e(\"zrender/tool/util\"),l=e(\"zrender/tool/area\");return t.prototype={type:r.COMPONENT_TYPE_AXIS_CATEGORY,_getReformedLabel:function(e){var t=this.getDataFromOption(this.option.data[e]),i=this.option.data[e].formatter||this.option.axisLabel.formatter;return i&&(\"function\"==typeof i?t=i.call(this.myChart,t):\"string\"==typeof i&&(t=i.replace(\"{value}\",t))),t},_getInterval:function(){var e=this.option.axisLabel.interval;if(\"auto\"==e){var t=this.option.axisLabel.textStyle.fontSize,i=this.option.data,n=this.option.data.length;if(this.isHorizontal())if(n>3){var a,o,r=this.getGap(),h=!1,m=Math.floor(.5/r);for(m=1>m?1:m,e=Math.floor(15/r);!h&&n>e;){e+=m,h=!0,a=Math.floor(r*e);for(var V=Math.floor((n-1)/e)*e;V>=0;V-=e){if(0!==this.option.axisLabel.rotate)o=t;else if(i[V].textStyle)o=l.getTextWidth(this._getReformedLabel(V),this.getFont(s.merge(i[V].textStyle,this.option.axisLabel.textStyle)));else{var U=this._getReformedLabel(V)+\"\",d=(U.match(/\\w/g)||\"\").length,p=U.length-d;o=d*t*2/3+p*t}if(o>a){h=!1;break}}}}else e=1;else if(n>3){var r=this.getGap();for(e=Math.floor(11/r);t>r*e-6&&n>e;)e++}else e=1}else e=\"function\"==typeof e?1:e-0+1;return e},_buildShape:function(){if(this._interval=this._getInterval(),this.option.show){this.option.splitArea.show&&this._buildSplitArea(),this.option.splitLine.show&&this._buildSplitLine(),this.option.axisLine.show&&this._buildAxisLine(),this.option.axisTick.show&&this._buildAxisTick(),this.option.axisLabel.show&&this._buildAxisLabel();for(var e=0,t=this.shapeList.length;t>e;e++)this.zr.addShape(this.shapeList[e])}},_buildAxisTick:function(){var e,t=this.option.data,i=this.option.data.length,n=this.option.axisTick,o=n.length,r=n.lineStyle.color,s=n.lineStyle.width,l=\"function\"==typeof n.interval?n.interval:\"auto\"==n.interval&&\"function\"==typeof this.option.axisLabel.interval?this.option.axisLabel.interval:!1,h=l?1:\"auto\"==n.interval?this._interval:n.interval-0+1,m=n.onGap,V=m?this.getGap()/2:\"undefined\"==typeof m&&this.option.boundaryGap?this.getGap()/2:0,U=V>0?-h:0;if(this.isHorizontal())for(var d,p=\"bottom\"==this.option.position?n.inside?this.grid.getYend()-o-1:this.grid.getYend()+1:n.inside?this.grid.getY()+1:this.grid.getY()-o-1,c=U;i>c;c+=h)(!l||l(c,t[c]))&&(d=this.subPixelOptimize(this.getCoordByIndex(c)+(c>=0?V:0),s),e={_axisShape:\"axisTick\",zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:d,yStart:p,xEnd:d,yEnd:p+o,strokeColor:r,lineWidth:s}},this.shapeList.push(new a(e)));else for(var u,y=\"left\"==this.option.position?n.inside?this.grid.getX()+1:this.grid.getX()-o-1:n.inside?this.grid.getXend()-o-1:this.grid.getXend()+1,c=U;i>c;c+=h)(!l||l(c,t[c]))&&(u=this.subPixelOptimize(this.getCoordByIndex(c)-(c>=0?V:0),s),e={_axisShape:\"axisTick\",zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:y,yStart:u,xEnd:y+o,yEnd:u,strokeColor:r,lineWidth:s}},this.shapeList.push(new a(e)))},_buildAxisLabel:function(){var e,t,i=this.option.data,a=this.option.data.length,o=this.option.axisLabel,r=o.rotate,l=o.margin,h=o.clickable,m=o.textStyle,V=\"function\"==typeof o.interval?o.interval:!1;if(this.isHorizontal()){var U,d;\"bottom\"==this.option.position?(U=this.grid.getYend()+l,d=\"top\"):(U=this.grid.getY()-l,d=\"bottom\");for(var p=0;a>p;p+=this._interval)V&&!V(p,i[p])||\"\"===this._getReformedLabel(p)||(t=s.merge(i[p].textStyle||{},m),e={zlevel:this.getZlevelBase(),z:this.getZBase()+3,hoverable:!1,style:{x:this.getCoordByIndex(p),y:U,color:t.color,text:this._getReformedLabel(p),textFont:this.getFont(t),textAlign:t.align||\"center\",textBaseline:t.baseline||d}},r&&(e.style.textAlign=r>0?\"bottom\"==this.option.position?\"right\":\"left\":\"bottom\"==this.option.position?\"left\":\"right\",e.rotation=[r*Math.PI/180,e.style.x,e.style.y]),this.shapeList.push(new n(this._axisLabelClickable(h,e))))}else{var c,u;\"left\"==this.option.position?(c=this.grid.getX()-l,u=\"right\"):(c=this.grid.getXend()+l,u=\"left\");for(var p=0;a>p;p+=this._interval)V&&!V(p,i[p])||\"\"===this._getReformedLabel(p)||(t=s.merge(i[p].textStyle||{},m),e={zlevel:this.getZlevelBase(),z:this.getZBase()+3,hoverable:!1,style:{x:c,y:this.getCoordByIndex(p),color:t.color,text:this._getReformedLabel(p),textFont:this.getFont(t),textAlign:t.align||u,textBaseline:t.baseline||0===p&&\"\"!==this.option.name?\"bottom\":p==a-1&&\"\"!==this.option.name?\"top\":\"middle\"}},r&&(e.rotation=[r*Math.PI/180,e.style.x,e.style.y]),this.shapeList.push(new n(this._axisLabelClickable(h,e))))}},_buildSplitLine:function(){var e,t=this.option.data,i=this.option.data.length,n=this.option.splitLine,o=n.lineStyle.type,r=n.lineStyle.width,s=n.lineStyle.color;s=s instanceof Array?s:[s];var l=s.length,h=\"function\"==typeof this.option.axisLabel.interval?this.option.axisLabel.interval:!1,m=n.onGap,V=m?this.getGap()/2:\"undefined\"==typeof m&&this.option.boundaryGap?this.getGap()/2:0;if(i-=m||\"undefined\"==typeof m&&this.option.boundaryGap?1:0,this.isHorizontal())for(var U,d=this.grid.getY(),p=this.grid.getYend(),c=0;i>c;c+=this._interval)(!h||h(c,t[c]))&&(U=this.subPixelOptimize(this.getCoordByIndex(c)+V,r),e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:U,yStart:d,xEnd:U,yEnd:p,strokeColor:s[c/this._interval%l],lineType:o,lineWidth:r}},this.shapeList.push(new a(e)));else for(var u,y=this.grid.getX(),g=this.grid.getXend(),c=0;i>c;c+=this._interval)(!h||h(c,t[c]))&&(u=this.subPixelOptimize(this.getCoordByIndex(c)-V,r),e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:y,yStart:u,xEnd:g,yEnd:u,strokeColor:s[c/this._interval%l],lineType:o,lineWidth:r}},this.shapeList.push(new a(e)))},_buildSplitArea:function(){var e,t=this.option.data,i=this.option.splitArea,n=i.areaStyle.color;if(n instanceof Array){var a=n.length,r=this.option.data.length,s=\"function\"==typeof this.option.axisLabel.interval?this.option.axisLabel.interval:!1,l=i.onGap,h=l?this.getGap()/2:\"undefined\"==typeof l&&this.option.boundaryGap?this.getGap()/2:0;if(this.isHorizontal())for(var m,V=this.grid.getY(),U=this.grid.getHeight(),d=this.grid.getX(),p=0;r>=p;p+=this._interval)s&&!s(p,t[p])&&r>p||(m=r>p?this.getCoordByIndex(p)+h:this.grid.getXend(),e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:d,y:V,width:m-d,height:U,color:n[p/this._interval%a]}},this.shapeList.push(new o(e)),d=m);else for(var c,u=this.grid.getX(),y=this.grid.getWidth(),g=this.grid.getYend(),p=0;r>=p;p+=this._interval)s&&!s(p,t[p])&&r>p||(c=r>p?this.getCoordByIndex(p)-h:this.grid.getY(),e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:u,y:c,width:y,height:g-c,color:n[p/this._interval%a]}},this.shapeList.push(new o(e)),g=c)}else e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this.grid.getX(),y:this.grid.getY(),width:this.grid.getWidth(),height:this.grid.getHeight(),color:n}},this.shapeList.push(new o(e))},refresh:function(e){e&&(this.option=this.reformOption(e),this.option.axisLabel.textStyle=this.getTextStyle(this.option.axisLabel.textStyle)),this.clear(),this._buildShape()},getGap:function(){var e=this.option.data.length,t=this.isHorizontal()?this.grid.getWidth():this.grid.getHeight();return this.option.boundaryGap?t/e:t/(e>1?e-1:1)},getCoord:function(e){for(var t=this.option.data,i=t.length,n=this.getGap(),a=this.option.boundaryGap?n/2:0,o=0;i>o;o++){if(this.getDataFromOption(t[o])==e)return a=this.isHorizontal()?this.grid.getX()+a:this.grid.getYend()-a;a+=n}},getCoordByIndex:function(e){if(0>e)return this.isHorizontal()?this.grid.getX():this.grid.getYend();if(e>this.option.data.length-1)return this.isHorizontal()?this.grid.getXend():this.grid.getY();var t=this.getGap(),i=this.option.boundaryGap?t/2:0;return i+=e*t,i=this.isHorizontal()?this.grid.getX()+i:this.grid.getYend()-i},getNameByIndex:function(e){return this.getDataFromOption(this.option.data[e])},getIndexByName:function(e){for(var t=this.option.data,i=t.length,n=0;i>n;n++)if(this.getDataFromOption(t[n])==e)return n;return-1},getValueFromCoord:function(){return\"\"},isMainAxis:function(e){return e%this._interval===0}},s.inherits(t,i),e(\"../component\").define(\"categoryAxis\",t),t}),i(\"echarts/component/valueAxis\",[\"require\",\"./base\",\"zrender/shape/Text\",\"zrender/shape/Line\",\"zrender/shape/Rectangle\",\"../config\",\"../util/date\",\"zrender/tool/util\",\"../util/smartSteps\",\"../util/accMath\",\"../util/smartLogSteps\",\"../component\"],function(e){function t(e,t,n,a,o,r,s){if(!s||0===s.length)return void console.err(\"option.series.length == 0.\");i.call(this,e,t,n,a,o),this.series=s,this.grid=this.component.grid;for(var l in r)this[l]=r[l];this.refresh(a,s)}var i=e(\"./base\"),n=e(\"zrender/shape/Text\"),a=e(\"zrender/shape/Line\"),o=e(\"zrender/shape/Rectangle\"),r=e(\"../config\");r.valueAxis={zlevel:0,z:0,show:!0,position:\"left\",name:\"\",nameLocation:\"end\",nameTextStyle:{},boundaryGap:[0,0],axisLine:{show:!0,onZero:!0,lineStyle:{color:\"#48b\",width:2,type:\"solid\"}},axisTick:{show:!1,inside:!1,length:5,lineStyle:{color:\"#333\",width:1}},axisLabel:{show:!0,rotate:0,margin:8,textStyle:{color:\"#333\"}},splitLine:{show:!0,lineStyle:{color:[\"#ccc\"],width:1,type:\"solid\"}},splitArea:{show:!1,areaStyle:{color:[\"rgba(250,250,250,0.3)\",\"rgba(200,200,200,0.3)\"]}}};var s=e(\"../util/date\"),l=e(\"zrender/tool/util\");return t.prototype={type:r.COMPONENT_TYPE_AXIS_VALUE,_buildShape:function(){if(this._hasData=!1,this._calculateValue(),this._hasData&&this.option.show){this.option.splitArea.show&&this._buildSplitArea(),this.option.splitLine.show&&this._buildSplitLine(),this.option.axisLine.show&&this._buildAxisLine(),this.option.axisTick.show&&this._buildAxisTick(),this.option.axisLabel.show&&this._buildAxisLabel();for(var e=0,t=this.shapeList.length;t>e;e++)this.zr.addShape(this.shapeList[e])}},_buildAxisTick:function(){var e,t=this._valueList,i=this._valueList.length,n=this.option.axisTick,o=n.length,r=n.lineStyle.color,s=n.lineStyle.width;if(this.isHorizontal())for(var l,h=\"bottom\"===this.option.position?n.inside?this.grid.getYend()-o-1:this.grid.getYend()+1:n.inside?this.grid.getY()+1:this.grid.getY()-o-1,m=0;i>m;m++)l=this.subPixelOptimize(this.getCoord(t[m]),s),e={_axisShape:\"axisTick\",zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:l,yStart:h,xEnd:l,yEnd:h+o,strokeColor:r,lineWidth:s}},this.shapeList.push(new a(e));else for(var V,U=\"left\"===this.option.position?n.inside?this.grid.getX()+1:this.grid.getX()-o-1:n.inside?this.grid.getXend()-o-1:this.grid.getXend()+1,m=0;i>m;m++)V=this.subPixelOptimize(this.getCoord(t[m]),s),e={_axisShape:\"axisTick\",zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:U,yStart:V,xEnd:U+o,yEnd:V,strokeColor:r,lineWidth:s}},this.shapeList.push(new a(e))},_buildAxisLabel:function(){var e,t=this._valueList,i=this._valueList.length,a=this.option.axisLabel.rotate,o=this.option.axisLabel.margin,r=this.option.axisLabel.clickable,s=this.option.axisLabel.textStyle;if(this.isHorizontal()){var l,h;\"bottom\"===this.option.position?(l=this.grid.getYend()+o,h=\"top\"):(l=this.grid.getY()-o,h=\"bottom\");for(var m=0;i>m;m++)e={zlevel:this.getZlevelBase(),z:this.getZBase()+3,hoverable:!1,style:{x:this.getCoord(t[m]),y:l,color:\"function\"==typeof s.color?s.color(t[m]):s.color,text:this._valueLabel[m],textFont:this.getFont(s),textAlign:s.align||\"center\",textBaseline:s.baseline||h}},a&&(e.style.textAlign=a>0?\"bottom\"===this.option.position?\"right\":\"left\":\"bottom\"===this.option.position?\"left\":\"right\",e.rotation=[a*Math.PI/180,e.style.x,e.style.y]),this.shapeList.push(new n(this._axisLabelClickable(r,e)))}else{var V,U;\"left\"===this.option.position?(V=this.grid.getX()-o,U=\"right\"):(V=this.grid.getXend()+o,U=\"left\");for(var m=0;i>m;m++)e={zlevel:this.getZlevelBase(),z:this.getZBase()+3,hoverable:!1,style:{x:V,y:this.getCoord(t[m]),color:\"function\"==typeof s.color?s.color(t[m]):s.color,text:this._valueLabel[m],textFont:this.getFont(s),textAlign:s.align||U,textBaseline:s.baseline||(0===m&&\"\"!==this.option.name?\"bottom\":m===i-1&&\"\"!==this.option.name?\"top\":\"middle\")}},a&&(e.rotation=[a*Math.PI/180,e.style.x,e.style.y]),this.shapeList.push(new n(this._axisLabelClickable(r,e)))}},_buildSplitLine:function(){var e,t=this._valueList,i=this._valueList.length,n=this.option.splitLine,o=n.lineStyle.type,r=n.lineStyle.width,s=n.lineStyle.color;s=s instanceof Array?s:[s];var l=s.length;if(this.isHorizontal())for(var h,m=this.grid.getY(),V=this.grid.getYend(),U=0;i>U;U++)h=this.subPixelOptimize(this.getCoord(t[U]),r),e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:h,yStart:m,xEnd:h,yEnd:V,strokeColor:s[U%l],lineType:o,lineWidth:r}},this.shapeList.push(new a(e));else for(var d,p=this.grid.getX(),c=this.grid.getXend(),U=0;i>U;U++)d=this.subPixelOptimize(this.getCoord(t[U]),r),e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:p,yStart:d,xEnd:c,yEnd:d,strokeColor:s[U%l],lineType:o,lineWidth:r}},this.shapeList.push(new a(e))},_buildSplitArea:function(){var e,t=this.option.splitArea.areaStyle.color;if(t instanceof Array){var i=t.length,n=this._valueList,a=this._valueList.length;if(this.isHorizontal())for(var r,s=this.grid.getY(),l=this.grid.getHeight(),h=this.grid.getX(),m=0;a>=m;m++)r=a>m?this.getCoord(n[m]):this.grid.getXend(),e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:h,y:s,width:r-h,height:l,color:t[m%i]}},this.shapeList.push(new o(e)),h=r;else for(var V,U=this.grid.getX(),d=this.grid.getWidth(),p=this.grid.getYend(),m=0;a>=m;m++)V=a>m?this.getCoord(n[m]):this.grid.getY(),e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:U,y:V,width:d,height:p-V,color:t[m%i]}},this.shapeList.push(new o(e)),p=V}else e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this.grid.getX(),y:this.grid.getY(),width:this.grid.getWidth(),height:this.grid.getHeight(),color:t}},this.shapeList.push(new o(e))},_calculateValue:function(){if(isNaN(this.option.min-0)||isNaN(this.option.max-0)){for(var e,t,i={},n=this.component.legend,a=0,o=this.series.length;o>a;a++)!(this.series[a].type!=r.CHART_TYPE_LINE&&this.series[a].type!=r.CHART_TYPE_BAR&&this.series[a].type!=r.CHART_TYPE_SCATTER&&this.series[a].type!=r.CHART_TYPE_K&&this.series[a].type!=r.CHART_TYPE_EVENTRIVER||n&&!n.isSelected(this.series[a].name)||(e=this.series[a].xAxisIndex||0,t=this.series[a].yAxisIndex||0,this.option.xAxisIndex!=e&&this.option.yAxisIndex!=t||!this._calculSum(i,a)));var s;for(var a in i){s=i[a];for(var l=0,h=s.length;h>l;l++)if(!isNaN(s[l])){this._hasData=!0,this._min=s[l],this._max=s[l];break}if(this._hasData)break}for(var a in i){s=i[a];for(var l=0,h=s.length;h>l;l++)isNaN(s[l])||(this._min=Math.min(this._min,s[l]),this._max=Math.max(this._max,s[l]))}var m=\"log\"!==this.option.type?this.option.boundaryGap:[0,0],V=Math.abs(this._max-this._min);this._min=isNaN(this.option.min-0)?this._min-Math.abs(V*m[0]):this.option.min-0,this._max=isNaN(this.option.max-0)?this._max+Math.abs(V*m[1]):this.option.max-0,this._min===this._max&&(0===this._max?this._max=1:this._max>0?this._min=this._max/this.option.splitNumber!=null?this.option.splitNumber:5:this._max=this._max/this.option.splitNumber!=null?this.option.splitNumber:5),\"time\"===this.option.type?this._reformTimeValue():\"log\"===this.option.type?this._reformLogValue():this._reformValue(this.option.scale)}else this._hasData=!0,this._min=this.option.min-0,this._max=this.option.max-0,\"time\"===this.option.type?this._reformTimeValue():\"log\"===this.option.type?this._reformLogValue():this._customerValue()},_calculSum:function(e,t){var i,n,a=this.series[t].name||\"kener\";if(this.series[t].stack){var o=\"__Magic_Key_Positive__\"+this.series[t].stack,l=\"__Magic_Key_Negative__\"+this.series[t].stack;e[o]=e[o]||[],e[l]=e[l]||[],e[a]=e[a]||[],n=this.series[t].data;for(var h=0,m=n.length;m>h;h++)i=this.getDataFromOption(n[h]),\"-\"!==i&&(i-=0,i>=0?null!=e[o][h]?e[o][h]+=i:e[o][h]=i:null!=e[l][h]?e[l][h]+=i:e[l][h]=i,this.option.scale&&e[a].push(i))}else if(e[a]=e[a]||[],this.series[t].type!=r.CHART_TYPE_EVENTRIVER){n=this.series[t].data;for(var h=0,m=n.length;m>h;h++)i=this.getDataFromOption(n[h]),this.series[t].type===r.CHART_TYPE_K?(e[a].push(i[0]),e[a].push(i[1]),e[a].push(i[2]),e[a].push(i[3])):i instanceof Array?(-1!=this.option.xAxisIndex&&e[a].push(\"time\"!=this.option.type?i[0]:s.getNewDate(i[0])),-1!=this.option.yAxisIndex&&e[a].push(\"time\"!=this.option.type?i[1]:s.getNewDate(i[1]))):e[a].push(i)}else{n=this.series[t].data;for(var h=0,m=n.length;m>h;h++)for(var V=n[h].evolution,U=0,d=V.length;d>U;U++)e[a].push(s.getNewDate(V[U].time))}},_reformValue:function(t){var i=e(\"../util/smartSteps\"),n=this.option.splitNumber;!t&&this._min>=0&&this._max>=0&&(this._min=0),!t&&this._min<=0&&this._max<=0&&(this._max=0);var a=i(this._min,this._max,n);n=null!=n?n:a.secs,this._min=a.min,this._max=a.max,this._valueList=a.pnts,this._reformLabelData()},_reformTimeValue:function(){var e=null!=this.option.splitNumber?this.option.splitNumber:5,t=s.getAutoFormatter(this._min,this._max,e),i=t.formatter,n=t.gapValue;this._valueList=[s.getNewDate(this._min)];var a;switch(i){case\"week\":a=s.nextMonday(this._min);break;case\"month\":a=s.nextNthOnMonth(this._min,1);break;case\"quarter\":a=s.nextNthOnQuarterYear(this._min,1);break;case\"half-year\":a=s.nextNthOnHalfYear(this._min,1);break;case\"year\":a=s.nextNthOnYear(this._min,1);break;default:72e5>=n?a=(Math.floor(this._min/n)+1)*n:(a=s.getNewDate(this._min- -n),a.setHours(6*Math.round(a.getHours()/6)),a.setMinutes(0),a.setSeconds(0))}for(a-this._min<n/2&&(a-=-n),t=s.getNewDate(a),e*=1.5;e-->=0&&((\"month\"==i||\"quarter\"==i||\"half-year\"==i||\"year\"==i)&&t.setDate(1),!(this._max-t<n/2));)this._valueList.push(t),t=s.getNewDate(t- -n);this._valueList.push(s.getNewDate(this._max)),this._reformLabelData(function(e){return function(t){return s.format(e,t)}}(i))},_customerValue:function(){var t=e(\"../util/accMath\"),i=null!=this.option.splitNumber?this.option.splitNumber:5,n=(this._max-this._min)/i;this._valueList=[];for(var a=0;i>=a;a++)this._valueList.push(t.accAdd(this._min,t.accMul(n,a)));this._reformLabelData()},_reformLogValue:function(){var t=this.option,i=e(\"../util/smartLogSteps\")({dataMin:this._min,dataMax:this._max,logPositive:t.logPositive,logLabelBase:t.logLabelBase,splitNumber:t.splitNumber});this._min=i.dataMin,this._max=i.dataMax,this._valueList=i.tickList,this._dataMappingMethods=i.dataMappingMethods,this._reformLabelData(i.labelFormatter)},_reformLabelData:function(e){this._valueLabel=[];var t=this.option.axisLabel.formatter;if(t)for(var i=0,n=this._valueList.length;n>i;i++)\"function\"==typeof t?this._valueLabel.push(e?t.call(this.myChart,this._valueList[i],e):t.call(this.myChart,this._valueList[i])):\"string\"==typeof t&&this._valueLabel.push(e?s.format(t,this._valueList[i]):t.replace(\"{value}\",this._valueList[i]));else for(var i=0,n=this._valueList.length;n>i;i++)this._valueLabel.push(e?e(this._valueList[i]):this.numAddCommas(this._valueList[i]))},getExtremum:function(){this._calculateValue();var e=this._dataMappingMethods;return{min:this._min,max:this._max,dataMappingMethods:e?l.merge({},e):null}},refresh:function(e,t){e&&(this.option=this.reformOption(e),this.option.axisLabel.textStyle=l.merge(this.option.axisLabel.textStyle||{},this.ecTheme.textStyle),this.series=t),this.zr&&(this.clear(),this._buildShape())},getCoord:function(e){this._dataMappingMethods&&(e=this._dataMappingMethods.value2Coord(e)),e=e<this._min?this._min:e,e=e>this._max?this._max:e;var t;return t=this.isHorizontal()?this.grid.getX()+(e-this._min)/(this._max-this._min)*this.grid.getWidth():this.grid.getYend()-(e-this._min)/(this._max-this._min)*this.grid.getHeight()},getCoordSize:function(e){return Math.abs(this.isHorizontal()?e/(this._max-this._min)*this.grid.getWidth():e/(this._max-this._min)*this.grid.getHeight())},getValueFromCoord:function(e){var t;return this.isHorizontal()?(e=e<this.grid.getX()?this.grid.getX():e,e=e>this.grid.getXend()?this.grid.getXend():e,t=this._min+(e-this.grid.getX())/this.grid.getWidth()*(this._max-this._min)):(e=e<this.grid.getY()?this.grid.getY():e,e=e>this.grid.getYend()?this.grid.getYend():e,t=this._max-(e-this.grid.getY())/this.grid.getHeight()*(this._max-this._min)),this._dataMappingMethods&&(t=this._dataMappingMethods.coord2Value(t)),t.toFixed(2)-0},isMaindAxis:function(e){for(var t=0,i=this._valueList.length;i>t;t++)if(this._valueList[t]===e)return!0;return!1}},l.inherits(t,i),e(\"../component\").define(\"valueAxis\",t),t}),i(\"echarts/util/date\",[],function(){function e(e,t,i){i=i>1?i:2;for(var n,a,o,r,s=0,l=m.length;l>s;s++)if(n=m[s].value,a=Math.ceil(t/n)*n-Math.floor(e/n)*n,Math.round(a/n)<=1.2*i){o=m[s].formatter,r=m[s].value;break}return null==o&&(o=\"year\",n=317088e5,a=Math.ceil(t/n)*n-Math.floor(e/n)*n,r=Math.round(a/(i-1)/n)*n),{formatter:o,gapValue:r}}function t(e){return 10>e?\"0\"+e:e}function i(e,i){(\"week\"==e||\"month\"==e||\"quarter\"==e||\"half-year\"==e||\"year\"==e)&&(e=\"MM - dd\\nyyyy\");var n=h(i),a=n.getFullYear(),o=n.getMonth()+1,r=n.getDate(),s=n.getHours(),l=n.getMinutes(),m=n.getSeconds();return e=e.replace(\"MM\",t(o)),e=e.toLowerCase(),e=e.replace(\"yyyy\",a),e=e.replace(\"yy\",a%100),e=e.replace(\"dd\",t(r)),e=e.replace(\"d\",r),e=e.replace(\"hh\",t(s)),e=e.replace(\"h\",s),e=e.replace(\"mm\",t(l)),e=e.replace(\"m\",l),e=e.replace(\"ss\",t(m)),e=e.replace(\"s\",m)}function n(e){return e=h(e),e.setDate(e.getDate()+8-e.getDay()),e}function a(e,t,i){return e=h(e),e.setMonth(Math.ceil((e.getMonth()+1)/i)*i),e.setDate(t),e}function o(e,t){return a(e,t,1)}function r(e,t){return a(e,t,3)}function s(e,t){return a(e,t,6)}function l(e,t){return a(e,t,12)}function h(e){return e instanceof Date?e:new Date(\"string\"==typeof e?e.replace(/-/g,\"/\"):e)}var m=[{formatter:\"hh : mm : ss\",value:1e3},{formatter:\"hh : mm : ss\",value:5e3},{formatter:\"hh : mm : ss\",value:1e4},{formatter:\"hh : mm : ss\",value:15e3},{formatter:\"hh : mm : ss\",value:3e4},{formatter:\"hh : mm\\nMM - dd\",value:6e4},{formatter:\"hh : mm\\nMM - dd\",value:3e5},{formatter:\"hh : mm\\nMM - dd\",value:6e5},{formatter:\"hh : mm\\nMM - dd\",value:9e5},{formatter:\"hh : mm\\nMM - dd\",value:18e5},{formatter:\"hh : mm\\nMM - dd\",value:36e5},{formatter:\"hh : mm\\nMM - dd\",value:72e5},{formatter:\"hh : mm\\nMM - dd\",value:216e5},{formatter:\"hh : mm\\nMM - dd\",value:432e5},{formatter:\"MM - dd\\nyyyy\",value:864e5},{formatter:\"week\",value:6048e5},{formatter:\"month\",value:26784e5},{formatter:\"quarter\",value:8208e6},{formatter:\"half-year\",value:16416e6},{formatter:\"year\",value:32832e6}];return{getAutoFormatter:e,getNewDate:h,format:i,nextMonday:n,nextNthPerNmonth:a,nextNthOnMonth:o,nextNthOnQuarterYear:r,nextNthOnHalfYear:s,nextNthOnYear:l}}),i(\"echarts/util/smartSteps\",[],function(){function e(e){return X.log(I(e))/X.LN10}function t(e){return X.pow(10,e)}function i(e){return e===w(e)}function n(e,t,n,a){b=a||{},f=b.steps||L,k=b.secs||W,n=v(+n||0)%99,e=+e||0,t=+t||0,x=_=0,\"min\"in b&&(e=+b.min||0,x=1),\"max\"in b&&(t=+b.max||0,_=1),e>t&&(t=[e,e=t][0]);var o=t-e;if(x&&_)return g(e,t,n);if((n||5)>o){if(i(e)&&i(t))return d(e,t,n);if(0===o)return p(e,t,n)}return h(e,t,n)}function a(e,i,n,a){a=a||0;var s=o((i-e)/n,-1),l=o(e,-1,1),h=o(i,-1),m=X.min(s.e,l.e,h.e);0===l.c?m=X.min(s.e,h.e):0===h.c&&(m=X.min(s.e,l.e)),r(s,{c:0,e:m}),r(l,s,1),r(h,s),a+=m,e=l.c,i=h.c;for(var V=(i-e)/n,U=t(a),d=0,p=[],c=n+1;c--;)p[c]=(e+V*c)*U;if(0>a){d=u(U),V=+(V*U).toFixed(d),e=+(e*U).toFixed(d),i=+(i*U).toFixed(d);for(var c=p.length;c--;)p[c]=p[c].toFixed(d),0===+p[c]&&(p[c]=\"0\")}else e*=U,i*=U,V*=U;return k=0,f=0,b=0,{min:e,max:i,secs:n,step:V,fix:d,exp:a,pnts:p}}function o(n,a,o){a=v(a%10)||2,0>a&&(i(n)?a=(\"\"+I(n)).replace(/0+$/,\"\").length||1:(n=n.toFixed(15).replace(/0+$/,\"\"),a=n.replace(\".\",\"\").replace(/^[-0]+/,\"\").length,n=+n));var r=w(e(n))-a+1,s=+(n*t(-r)).toFixed(15)||0;return s=o?w(s):K(s),!s&&(r=0),(\"\"+I(s)).length>a&&(r+=1,s/=10),{c:s,e:r}}function r(e,i,n){var a=i.e-e.e;a&&(e.e+=a,e.c*=t(-a),e.c=n?w(e.c):K(e.c))}function s(e,t,i){e.e<t.e?r(t,e,i):r(e,t,i)}function l(e,t){t=t||L,e=o(e);for(var i=e.c,n=0;i>t[n];)n++;if(!t[n])for(i/=10,e.e+=1,n=0;i>t[n];)n++;return e.c=t[n],e}function h(e,t,n){var s,h=n||+k.slice(-1),p=l((t-e)/h,f),u=o(t-e),g=o(e,-1,1),b=o(t,-1);if(r(u,p),r(g,p,1),r(b,p),n?s=V(g,b,h):h=m(g,b),i(e)&&i(t)&&e*t>=0){if(h>t-e)return d(e,t,h);h=U(e,t,n,g,b,h)}var L=c(e,t,g.c,b.c);return g.c=L[0],b.c=L[1],(x||_)&&y(e,t,g,b),a(g.c,b.c,h,b.e)}function m(e,i){for(var n,a,o,r,s=[],h=k.length;h--;)n=k[h],a=l((i.c-e.c)/n,f),a=a.c*t(a.e),o=w(e.c/a)*a,r=K(i.c/a)*a,s[h]={min:o,max:r,step:a,span:r-o};return s.sort(function(e,t){var i=e.span-t.span;return 0===i&&(i=e.step-t.step),i}),s=s[0],n=s.span/s.step,e.c=s.min,i.c=s.max,3>n?2*n:n}function V(e,i,n){for(var a,o,r=i.c,s=(i.c-e.c)/n-1;r>e.c;)s=l(s+1,f),s=s.c*t(s.e),a=s*n,o=K(i.c/s)*s,r=o-a;var h=e.c-r,m=o-i.c,V=h-m;return V>1.1*s&&(V=v(V/s/2)*s,r+=V,o+=V),e.c=r,i.c=o,s}function U(e,n,a,o,r,s){var l=r.c-o.c,h=l/s*t(r.e);if(!i(h)&&(h=w(h),l=h*s,n-e>l&&(h+=1,l=h*s,!a&&h*(s-1)>=n-e&&(s-=1,l=h*s)),l>=n-e)){var m=l-(n-e);o.c=v(e-m/2),r.c=v(n+m/2),o.e=0,r.e=0}return s}function d(e,t,i){if(i=i||5,x)t=e+i;else if(_)e=t-i;else{var n=i-(t-e),o=v(e-n/2),r=v(t+n/2),s=c(e,t,o,r);e=s[0],t=s[1]}return a(e,t,i)}function p(e,t,i){i=i||5;var n=X.min(I(t/i),i)/2.1;return x?t=e+n:_?e=t-n:(e-=n,t+=n),h(e,t,i)}function c(e,t,i,n){\nreturn e>=0&&0>i?(n-=i,i=0):0>=t&&n>0&&(i-=n,n=0),[i,n]}function u(e){return e=(+e).toFixed(15).split(\".\"),e.pop().replace(/0+$/,\"\").length}function y(e,t,i,n){if(x){var a=o(e,4,1);i.e-a.e>6&&(a={c:0,e:i.e}),s(i,a),s(n,a),n.c+=a.c-i.c,i.c=a.c}else if(_){var r=o(t,4);n.e-r.e>6&&(r={c:0,e:n.e}),s(i,r),s(n,r),i.c+=r.c-n.c,n.c=r.c}}function g(e,t,i){var n=i?[i]:k,s=t-e;if(0===s)return t=o(t,3),i=n[0],t.c=v(t.c+i/2),a(t.c-i,t.c,i,t.e);I(t/s)<1e-6&&(t=0),I(e/s)<1e-6&&(e=0);var l,h,m,V=[[5,10],[10,2],[50,10],[100,2]],U=[],d=[],p=o(t-e,3),c=o(e,-1,1),u=o(t,-1);r(c,p,1),r(u,p),s=u.c-c.c,p.c=s;for(var y=n.length;y--;){i=n[y],l=K(s/i),h=l*i-s,m=3*(h+3),m+=2*(i-n[0]+2),i%5===0&&(m-=10);for(var g=V.length;g--;)l%V[g][0]===0&&(m/=V[g][1]);d[y]=[i,l,h,m].join(),U[y]={secs:i,step:l,delta:h,score:m}}return U.sort(function(e,t){return e.score-t.score}),U=U[0],c.c=v(c.c-U.delta/2),u.c=v(u.c+U.delta/2),a(c.c,u.c,U.secs,p.e)}var b,f,k,x,_,L=[10,20,25,50],W=[4,5,6],X=Math,v=X.round,w=X.floor,K=X.ceil,I=X.abs;return n}),i(\"echarts/util/smartLogSteps\",[\"require\",\"./number\"],function(e){function t(e){return i(),u=e||{},n(),a(),[o(),i()][0]}function i(){U=u=g=c=b=f=y=k=d=p=null}function n(){d=u.logLabelBase,null==d?(p=\"plain\",d=10,c=I):(d=+d,1>d&&(d=10),p=\"exponent\",c=L(d)),y=u.splitNumber,null==y&&(y=E);var e=parseFloat(u.dataMin),t=parseFloat(u.dataMax);isFinite(e)||isFinite(t)?isFinite(e)?isFinite(t)?e>t&&(t=[e,e=t][0]):t=e:e=t:e=t=1,U=u.logPositive,null==U&&(U=t>0||0===e),b=U?e:-t,f=U?t:-e,S>b&&(b=S),S>f&&(f=S)}function a(){function e(){y>m&&(y=m);var e=w(l(m/y)),t=v(l(m/e)),i=e*t,n=(i-U)/2,a=w(l(r-n));V(a-r)&&(a-=1),g=-a*c;for(var s=a;o>=s-e;s+=e)k.push(W(d,s))}function t(){for(var e=i(h,0),t=e+2;t>e&&a(e+1)+n(e+1)*C<r;)e++;for(var l=i(s,0),t=l-2;l>t&&a(l-1)+n(l-1)*C>o;)l--;g=-(a(e)*I+n(e)*J);for(var m=e;l>=m;m++){var V=a(m),U=n(m);k.push(W(10,V)*W(2,U))}}function i(e,t){return 3*e+t}function n(e){return e-3*a(e)}function a(e){return w(l(e/3))}k=[];var o=l(L(f)/c),r=l(L(b)/c),s=v(o),h=w(r),m=s-h,U=o-r;\"exponent\"===p?e():F>=m&&y>F?t():e()}function o(){for(var e=[],t=0,i=k.length;i>t;t++)e[t]=(U?1:-1)*k[t];!U&&e.reverse();var n=s(),a=n.value2Coord,o=a(e[0]),l=a(e[e.length-1]);return o===l&&(o-=1,l+=1),{dataMin:o,dataMax:l,tickList:e,logPositive:U,labelFormatter:r(),dataMappingMethods:n}}function r(){if(\"exponent\"===p){var e=d,t=c;return function(i){if(!isFinite(parseFloat(i)))return\"\";var n=\"\";return 0>i&&(i=-i,n=\"-\"),n+e+m(L(i)/t)}}return function(e){return isFinite(parseFloat(e))?x.addCommas(h(e)):\"\"}}function s(){var e=U,t=g;return{value2Coord:function(i){return null==i||isNaN(i)||!isFinite(i)?i:(i=parseFloat(i),isFinite(i)?e&&S>i?i=S:!e&&i>-S&&(i=-S):i=S,i=X(i),(e?1:-1)*(L(i)+t))},coord2Value:function(i){return null==i||isNaN(i)||!isFinite(i)?i:(i=parseFloat(i),isFinite(i)||(i=S),e?W(K,i-t):-W(K,-i+t))}}}function l(e){return+Number(+e).toFixed(14)}function h(e){return Number(e).toFixed(15).replace(/\\.?0*$/,\"\")}function m(e){e=h(Math.round(e));for(var t=[],i=0,n=e.length;n>i;i++){var a=e.charAt(i);t.push(T[a]||\"\")}return t.join(\"\")}function V(e){return e>-S&&S>e}var U,d,p,c,u,y,g,b,f,k,x=e(\"./number\"),_=Math,L=_.log,W=_.pow,X=_.abs,v=_.ceil,w=_.floor,K=_.E,I=_.LN10,J=_.LN2,C=J/I,S=1e-9,E=5,F=2,T={0:\"⁰\",1:\"¹\",2:\"²\",3:\"³\",4:\"⁴\",5:\"⁵\",6:\"⁶\",7:\"⁷\",8:\"⁸\",9:\"⁹\",\"-\":\"⁻\"};return t}),i(\"echarts/chart/line\",[\"require\",\"./base\",\"zrender/shape/Polyline\",\"../util/shape/Icon\",\"../util/shape/HalfSmoothPolygon\",\"../component/axis\",\"../component/grid\",\"../component/dataZoom\",\"../config\",\"../util/ecData\",\"zrender/tool/util\",\"zrender/tool/color\",\"../chart\"],function(e){function t(e,t,i,a,o){n.call(this,e,t,i,a,o),this.refresh(a)}function i(e,t,i){var n=t.x,a=t.y,r=t.width,s=t.height,l=s/2;t.symbol.match(\"empty\")&&(e.fillStyle=\"#fff\"),t.brushType=\"both\";var h=t.symbol.replace(\"empty\",\"\").toLowerCase();h.match(\"star\")?(l=h.replace(\"star\",\"\")-0||5,a-=1,h=\"star\"):(\"rectangle\"===h||\"arrow\"===h)&&(n+=(r-s)/2,r=s);var m=\"\";if(h.match(\"image\")&&(m=h.replace(new RegExp(\"^image:\\\\/\\\\/\"),\"\"),h=\"image\",n+=Math.round((r-s)/2)-1,r=s+=2),h=o.prototype.iconLibrary[h]){var V=t.x,U=t.y;e.moveTo(V,U+l),e.lineTo(V+5,U+l),e.moveTo(V+t.width-5,U+l),e.lineTo(V+t.width,U+l);var d=this;h(e,{x:n+4,y:a+4,width:r-8,height:s-8,n:l,image:m},function(){d.modSelf(),i()})}else e.moveTo(n,a+l),e.lineTo(n+r,a+l)}var n=e(\"./base\"),a=e(\"zrender/shape/Polyline\"),o=e(\"../util/shape/Icon\"),r=e(\"../util/shape/HalfSmoothPolygon\");e(\"../component/axis\"),e(\"../component/grid\"),e(\"../component/dataZoom\");var s=e(\"../config\");s.line={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,xAxisIndex:0,yAxisIndex:0,dataFilter:\"nearest\",itemStyle:{normal:{label:{show:!1},lineStyle:{width:2,type:\"solid\",shadowColor:\"rgba(0,0,0,0)\",shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0}},emphasis:{label:{show:!1}}},symbolSize:2,showAllSymbol:!1};var l=e(\"../util/ecData\"),h=e(\"zrender/tool/util\"),m=e(\"zrender/tool/color\");return t.prototype={type:s.CHART_TYPE_LINE,_buildShape:function(){this.finalPLMap={},this._buildPosition()},_buildHorizontal:function(e,t,i,n){for(var a,o,r,s,l,h,m,V,U,d=this.series,p=i[0][0],c=d[p],u=this.component.xAxis.getAxis(c.xAxisIndex||0),y={},g=0,b=t;b>g&&null!=u.getNameByIndex(g);g++){o=u.getCoordByIndex(g);for(var f=0,k=i.length;k>f;f++){a=this.component.yAxis.getAxis(d[i[f][0]].yAxisIndex||0),l=s=m=h=a.getCoord(0);for(var x=0,_=i[f].length;_>x;x++)p=i[f][x],c=d[p],V=c.data[g],U=this.getDataFromOption(V,\"-\"),y[p]=y[p]||[],n[p]=n[p]||{min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY,sum:0,counter:0,average:0},\"-\"!==U?(U>=0?(s-=x>0?a.getCoordSize(U):l-a.getCoord(U),r=s):0>U&&(h+=x>0?a.getCoordSize(U):a.getCoord(U)-m,r=h),y[p].push([o,r,g,u.getNameByIndex(g),o,l]),n[p].min>U&&(n[p].min=U,n[p].minY=r,n[p].minX=o),n[p].max<U&&(n[p].max=U,n[p].maxY=r,n[p].maxX=o),n[p].sum+=U,n[p].counter++):y[p].length>0&&(this.finalPLMap[p]=this.finalPLMap[p]||[],this.finalPLMap[p].push(y[p]),y[p]=[])}s=this.component.grid.getY();for(var L,f=0,k=i.length;k>f;f++)for(var x=0,_=i[f].length;_>x;x++)p=i[f][x],c=d[p],V=c.data[g],U=this.getDataFromOption(V,\"-\"),\"-\"==U&&this.deepQuery([V,c,this.option],\"calculable\")&&(L=this.deepQuery([V,c],\"symbolSize\"),s+=2*L+5,r=s,this.shapeList.push(this._getCalculableItem(p,g,u.getNameByIndex(g),o,r,\"horizontal\")))}for(var W in y)y[W].length>0&&(this.finalPLMap[W]=this.finalPLMap[W]||[],this.finalPLMap[W].push(y[W]),y[W]=[]);this._calculMarkMapXY(n,i,\"y\"),this._buildBorkenLine(e,this.finalPLMap,u,\"horizontal\")},_buildVertical:function(e,t,i,n){for(var a,o,r,s,l,h,m,V,U,d=this.series,p=i[0][0],c=d[p],u=this.component.yAxis.getAxis(c.yAxisIndex||0),y={},g=0,b=t;b>g&&null!=u.getNameByIndex(g);g++){r=u.getCoordByIndex(g);for(var f=0,k=i.length;k>f;f++){a=this.component.xAxis.getAxis(d[i[f][0]].xAxisIndex||0),l=s=m=h=a.getCoord(0);for(var x=0,_=i[f].length;_>x;x++)p=i[f][x],c=d[p],V=c.data[g],U=this.getDataFromOption(V,\"-\"),y[p]=y[p]||[],n[p]=n[p]||{min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY,sum:0,counter:0,average:0},\"-\"!==U?(U>=0?(s+=x>0?a.getCoordSize(U):a.getCoord(U)-l,o=s):0>U&&(h-=x>0?a.getCoordSize(U):m-a.getCoord(U),o=h),y[p].push([o,r,g,u.getNameByIndex(g),l,r]),n[p].min>U&&(n[p].min=U,n[p].minX=o,n[p].minY=r),n[p].max<U&&(n[p].max=U,n[p].maxX=o,n[p].maxY=r),n[p].sum+=U,n[p].counter++):y[p].length>0&&(this.finalPLMap[p]=this.finalPLMap[p]||[],this.finalPLMap[p].push(y[p]),y[p]=[])}s=this.component.grid.getXend();for(var L,f=0,k=i.length;k>f;f++)for(var x=0,_=i[f].length;_>x;x++)p=i[f][x],c=d[p],V=c.data[g],U=this.getDataFromOption(V,\"-\"),\"-\"==U&&this.deepQuery([V,c,this.option],\"calculable\")&&(L=this.deepQuery([V,c],\"symbolSize\"),s-=2*L+5,o=s,this.shapeList.push(this._getCalculableItem(p,g,u.getNameByIndex(g),o,r,\"vertical\")))}for(var W in y)y[W].length>0&&(this.finalPLMap[W]=this.finalPLMap[W]||[],this.finalPLMap[W].push(y[W]),y[W]=[]);this._calculMarkMapXY(n,i,\"x\"),this._buildBorkenLine(e,this.finalPLMap,u,\"vertical\")},_buildOther:function(e,t,i,n){for(var a,o=this.series,r={},s=0,l=i.length;l>s;s++)for(var h=0,m=i[s].length;m>h;h++){var V=i[s][h],U=o[V];a=this.component.xAxis.getAxis(U.xAxisIndex||0);var d=this.component.yAxis.getAxis(U.yAxisIndex||0),p=d.getCoord(0);r[V]=r[V]||[],n[V]=n[V]||{min0:Number.POSITIVE_INFINITY,min1:Number.POSITIVE_INFINITY,max0:Number.NEGATIVE_INFINITY,max1:Number.NEGATIVE_INFINITY,sum0:0,sum1:0,counter0:0,counter1:0,average0:0,average1:0};for(var c=0,u=U.data.length;u>c;c++){var y=U.data[c],g=this.getDataFromOption(y,\"-\");if(g instanceof Array){var b=a.getCoord(g[0]),f=d.getCoord(g[1]);r[V].push([b,f,c,g[0],b,p]),n[V].min0>g[0]&&(n[V].min0=g[0],n[V].minY0=f,n[V].minX0=b),n[V].max0<g[0]&&(n[V].max0=g[0],n[V].maxY0=f,n[V].maxX0=b),n[V].sum0+=g[0],n[V].counter0++,n[V].min1>g[1]&&(n[V].min1=g[1],n[V].minY1=f,n[V].minX1=b),n[V].max1<g[1]&&(n[V].max1=g[1],n[V].maxY1=f,n[V].maxX1=b),n[V].sum1+=g[1],n[V].counter1++}}}for(var k in r)r[k].length>0&&(this.finalPLMap[k]=this.finalPLMap[k]||[],this.finalPLMap[k].push(r[k]),r[k]=[]);this._calculMarkMapXY(n,i,\"xy\"),this._buildBorkenLine(e,this.finalPLMap,a,\"other\")},_buildBorkenLine:function(e,t,i,n){for(var o,s=\"other\"==n?\"horizontal\":n,V=this.series,U=e.length-1;U>=0;U--){var d=e[U],p=V[d],c=t[d];if(p.type===this.type&&null!=c)for(var u=this._getBbox(d,s),y=this._sIndex2ColorMap[d],g=this.query(p,\"itemStyle.normal.lineStyle.width\"),b=this.query(p,\"itemStyle.normal.lineStyle.type\"),f=this.query(p,\"itemStyle.normal.lineStyle.color\"),k=this.getItemStyleColor(this.query(p,\"itemStyle.normal.color\"),d,-1),x=null!=this.query(p,\"itemStyle.normal.areaStyle\"),_=this.query(p,\"itemStyle.normal.areaStyle.color\"),L=0,W=c.length;W>L;L++){var X=c[L],v=\"other\"!=n&&this._isLarge(s,X);if(v)X=this._getLargePointList(s,X,p.dataFilter);else for(var w=0,K=X.length;K>w;w++)o=p.data[X[w][2]],(this.deepQuery([o,p,this.option],\"calculable\")||this.deepQuery([o,p],\"showAllSymbol\")||\"categoryAxis\"===i.type&&i.isMainAxis(X[w][2])&&\"none\"!=this.deepQuery([o,p],\"symbol\"))&&this.shapeList.push(this._getSymbol(d,X[w][2],X[w][3],X[w][0],X[w][1],s));var I=new a({zlevel:p.zlevel,z:p.z,style:{miterLimit:g,pointList:X,strokeColor:f||k||y,lineWidth:g,lineType:b,smooth:this._getSmooth(p.smooth),smoothConstraint:u,shadowColor:this.query(p,\"itemStyle.normal.lineStyle.shadowColor\"),shadowBlur:this.query(p,\"itemStyle.normal.lineStyle.shadowBlur\"),shadowOffsetX:this.query(p,\"itemStyle.normal.lineStyle.shadowOffsetX\"),shadowOffsetY:this.query(p,\"itemStyle.normal.lineStyle.shadowOffsetY\")},hoverable:!1,_main:!0,_seriesIndex:d,_orient:s});if(l.pack(I,V[d],d,0,L,V[d].name),this.shapeList.push(I),x){var J=new r({zlevel:p.zlevel,z:p.z,style:{miterLimit:g,pointList:h.clone(X).concat([[X[X.length-1][4],X[X.length-1][5]],[X[0][4],X[0][5]]]),brushType:\"fill\",smooth:this._getSmooth(p.smooth),smoothConstraint:u,color:_?_:m.alpha(y,.5)},highlightStyle:{brushType:\"fill\"},hoverable:!1,_main:!0,_seriesIndex:d,_orient:s});l.pack(J,V[d],d,0,L,V[d].name),this.shapeList.push(J)}}}},_getBbox:function(e,t){var i=this.component.grid.getBbox(),n=this.xMarkMap[e];return null!=n.minX0?[[Math.min(n.minX0,n.maxX0,n.minX1,n.maxX1),Math.min(n.minY0,n.maxY0,n.minY1,n.maxY1)],[Math.max(n.minX0,n.maxX0,n.minX1,n.maxX1),Math.max(n.minY0,n.maxY0,n.minY1,n.maxY1)]]:(\"horizontal\"===t?(i[0][1]=Math.min(n.minY,n.maxY),i[1][1]=Math.max(n.minY,n.maxY)):(i[0][0]=Math.min(n.minX,n.maxX),i[1][0]=Math.max(n.minX,n.maxX)),i)},_isLarge:function(e,t){return t.length<2?!1:\"horizontal\"===e?Math.abs(t[0][0]-t[1][0])<.5:Math.abs(t[0][1]-t[1][1])<.5},_getLargePointList:function(e,t,i){var n;n=\"horizontal\"===e?this.component.grid.getWidth():this.component.grid.getHeight();var a=t.length,o=[];if(\"function\"!=typeof i)switch(i){case\"min\":i=function(e){return Math.max.apply(null,e)};break;case\"max\":i=function(e){return Math.min.apply(null,e)};break;case\"average\":i=function(e){for(var t=0,i=0;i<e.length;i++)t+=e[i];return t/e.length};break;default:i=function(e){return e[0]}}for(var r=[],s=0;n>s;s++){var l=Math.floor(a/n*s),h=Math.min(Math.floor(a/n*(s+1)),a);if(!(l>=h)){for(var m=l;h>m;m++)r[m-l]=\"horizontal\"===e?t[m][1]:t[m][0];r.length=h-l;for(var V=i(r),U=-1,d=1/0,m=l;h>m;m++){var p=\"horizontal\"===e?t[m][1]:t[m][0],c=Math.abs(p-V);d>c&&(U=m,d=c)}var u=t[U].slice();\"horizontal\"===e?u[1]=V:u[0]=V,o.push(u)}}return o},_getSmooth:function(e){return e?.3:0},_getCalculableItem:function(e,t,i,n,a,o){var r=this.series,l=r[e].calculableHolderColor||this.ecTheme.calculableHolderColor||s.calculableHolderColor,h=this._getSymbol(e,t,i,n,a,o);return h.style.color=l,h.style.strokeColor=l,h.rotation=[0,0],h.hoverable=!1,h.draggable=!1,h.style.text=void 0,h},_getSymbol:function(e,t,i,n,a,o){var r=this.series,s=r[e],l=s.data[t],h=this.getSymbolShape(s,e,l,t,i,n,a,this._sIndex2ShapeMap[e],this._sIndex2ColorMap[e],\"#fff\",\"vertical\"===o?\"horizontal\":\"vertical\");return h.zlevel=s.zlevel,h.z=s.z+1,this.deepQuery([l,s,this.option],\"calculable\")&&(this.setCalculable(h),h.draggable=!0),h},getMarkCoord:function(e,t){var i=this.series[e],n=this.xMarkMap[e],a=this.component.xAxis.getAxis(i.xAxisIndex),o=this.component.yAxis.getAxis(i.yAxisIndex);if(t.type&&(\"max\"===t.type||\"min\"===t.type||\"average\"===t.type)){var r=null!=t.valueIndex?t.valueIndex:null!=n.maxX0?\"1\":\"\";return[n[t.type+\"X\"+r],n[t.type+\"Y\"+r],n[t.type+\"Line\"+r],n[t.type+r]]}return[\"string\"!=typeof t.xAxis&&a.getCoordByIndex?a.getCoordByIndex(t.xAxis||0):a.getCoord(t.xAxis||0),\"string\"!=typeof t.yAxis&&o.getCoordByIndex?o.getCoordByIndex(t.yAxis||0):o.getCoord(t.yAxis||0)]},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()},ontooltipHover:function(e,t){for(var i,n,a=e.seriesIndex,o=e.dataIndex,r=a.length;r--;)if(i=this.finalPLMap[a[r]])for(var s=0,l=i.length;l>s;s++){n=i[s];for(var h=0,m=n.length;m>h;h++)o===n[h][2]&&t.push(this._getSymbol(a[r],n[h][2],n[h][3],n[h][0],n[h][1],\"horizontal\"))}},addDataAnimation:function(e,t){function i(){c--,0===c&&t&&t()}function n(e){e.style.controlPointList=null}for(var a=this.series,o={},r=0,s=e.length;s>r;r++)o[e[r][0]]=e[r];for(var l,h,m,V,U,d,p,c=0,r=this.shapeList.length-1;r>=0;r--)if(U=this.shapeList[r]._seriesIndex,o[U]&&!o[U][3]){if(this.shapeList[r]._main&&this.shapeList[r].style.pointList.length>1){if(d=this.shapeList[r].style.pointList,h=Math.abs(d[0][0]-d[1][0]),V=Math.abs(d[0][1]-d[1][1]),p=\"horizontal\"===this.shapeList[r]._orient,o[U][2]){if(\"half-smooth-polygon\"===this.shapeList[r].type){var u=d.length;this.shapeList[r].style.pointList[u-3]=d[u-2],this.shapeList[r].style.pointList[u-3][p?0:1]=d[u-4][p?0:1],this.shapeList[r].style.pointList[u-2]=d[u-1]}this.shapeList[r].style.pointList.pop(),p?(l=h,m=0):(l=0,m=-V)}else{if(this.shapeList[r].style.pointList.shift(),\"half-smooth-polygon\"===this.shapeList[r].type){var y=this.shapeList[r].style.pointList.pop();p?y[0]=d[0][0]:y[1]=d[0][1],this.shapeList[r].style.pointList.push(y)}p?(l=-h,m=0):(l=0,m=V)}this.shapeList[r].style.controlPointList=null,this.zr.modShape(this.shapeList[r])}else{if(o[U][2]&&this.shapeList[r]._dataIndex===a[U].data.length-1){this.zr.delShape(this.shapeList[r].id);continue}if(!o[U][2]&&0===this.shapeList[r]._dataIndex){this.zr.delShape(this.shapeList[r].id);continue}}this.shapeList[r].position=[0,0],c++,this.zr.animate(this.shapeList[r].id,\"\").when(this.query(this.option,\"animationDurationUpdate\"),{position:[l,m]}).during(n).done(i).start()}c||t&&t()}},o.prototype.iconLibrary.legendLineIcon=i,h.inherits(t,n),e(\"../chart\").define(\"line\",t),t}),i(\"echarts/util/shape/HalfSmoothPolygon\",[\"require\",\"zrender/shape/Base\",\"zrender/shape/util/smoothBezier\",\"zrender/tool/util\",\"zrender/shape/Polygon\"],function(e){function t(e){i.call(this,e)}var i=e(\"zrender/shape/Base\"),n=e(\"zrender/shape/util/smoothBezier\"),a=e(\"zrender/tool/util\");return t.prototype={type:\"half-smooth-polygon\",buildPath:function(t,i){var a=i.pointList;if(!(a.length<2))if(i.smooth){var o=n(a.slice(0,-2),i.smooth,!1,i.smoothConstraint);t.moveTo(a[0][0],a[0][1]);for(var r,s,l,h=a.length,m=0;h-3>m;m++)r=o[2*m],s=o[2*m+1],l=a[m+1],t.bezierCurveTo(r[0],r[1],s[0],s[1],l[0],l[1]);t.lineTo(a[h-2][0],a[h-2][1]),t.lineTo(a[h-1][0],a[h-1][1]),t.lineTo(a[0][0],a[0][1])}else e(\"zrender/shape/Polygon\").prototype.buildPath(t,i)}},a.inherits(t,i),t}),i(\"echarts/chart/bar\",[\"require\",\"./base\",\"zrender/shape/Rectangle\",\"../component/axis\",\"../component/grid\",\"../component/dataZoom\",\"../config\",\"../util/ecData\",\"zrender/tool/util\",\"zrender/tool/color\",\"../chart\"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e(\"./base\"),n=e(\"zrender/shape/Rectangle\");e(\"../component/axis\"),e(\"../component/grid\"),e(\"../component/dataZoom\");var a=e(\"../config\");a.bar={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,xAxisIndex:0,yAxisIndex:0,barMinHeight:0,barGap:\"30%\",barCategoryGap:\"20%\",itemStyle:{normal:{barBorderColor:\"#fff\",barBorderRadius:0,barBorderWidth:0,label:{show:!1}},emphasis:{barBorderColor:\"#fff\",barBorderRadius:0,barBorderWidth:0,label:{show:!1}}}};var o=e(\"../util/ecData\"),r=e(\"zrender/tool/util\"),s=e(\"zrender/tool/color\");return t.prototype={type:a.CHART_TYPE_BAR,_buildShape:function(){this._buildPosition()},_buildNormal:function(e,t,i,o,r){for(var s,l,h,m,V,U,d,p,c,u,y,g,b=this.series,f=i[0][0],k=b[f],x=\"horizontal\"==r,_=this.component.xAxis,L=this.component.yAxis,W=x?_.getAxis(k.xAxisIndex):L.getAxis(k.yAxisIndex),X=this._mapSize(W,i),v=X.gap,w=X.barGap,K=X.barWidthMap,I=X.barMaxWidthMap,J=X.barWidth,C=X.barMinHeightMap,S=X.interval,E=this.deepQuery([this.ecTheme,a],\"island.r\"),F=0,T=t;T>F&&null!=W.getNameByIndex(F);F++){x?m=W.getCoordByIndex(F)-v/2:V=W.getCoordByIndex(F)+v/2;for(var z=0,A=i.length;A>z;z++){var M=b[i[z][0]].yAxisIndex||0,O=b[i[z][0]].xAxisIndex||0;s=x?L.getAxis(M):_.getAxis(O),d=U=c=p=s.getCoord(0);for(var P=0,D=i[z].length;D>P;P++)f=i[z][P],k=b[f],y=k.data[F],g=this.getDataFromOption(y,\"-\"),o[f]=o[f]||{min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY,sum:0,counter:0,average:0},h=Math.min(I[f]||Number.MAX_VALUE,K[f]||J),\"-\"!==g&&(g>0?(l=P>0?s.getCoordSize(g):x?d-s.getCoord(g):s.getCoord(g)-d,1===D&&C[f]>l&&(l=C[f]),x?(U-=l,V=U):(m=U,U+=l)):0>g?(l=P>0?s.getCoordSize(g):x?s.getCoord(g)-c:c-s.getCoord(g),1===D&&C[f]>l&&(l=C[f]),x?(V=p,p+=l):(p-=l,m=p)):(l=0,x?(U-=l,V=U):(m=U,U+=l)),o[f][F]=x?m+h/2:V-h/2,o[f].min>g&&(o[f].min=g,x?(o[f].minY=V,o[f].minX=o[f][F]):(o[f].minX=m+l,o[f].minY=o[f][F])),o[f].max<g&&(o[f].max=g,x?(o[f].maxY=V,o[f].maxX=o[f][F]):(o[f].maxX=m+l,o[f].maxY=o[f][F])),o[f].sum+=g,o[f].counter++,F%S===0&&(u=this._getBarItem(f,F,W.getNameByIndex(F),m,V-(x?0:h),x?h:l,x?l:h,x?\"vertical\":\"horizontal\"),this.shapeList.push(new n(u))));for(var P=0,D=i[z].length;D>P;P++)f=i[z][P],k=b[f],y=k.data[F],g=this.getDataFromOption(y,\"-\"),h=Math.min(I[f]||Number.MAX_VALUE,K[f]||J),\"-\"==g&&this.deepQuery([y,k,this.option],\"calculable\")&&(x?(U-=E,V=U):(m=U,U+=E),u=this._getBarItem(f,F,W.getNameByIndex(F),m,V-(x?0:h),x?h:E,x?E:h,x?\"vertical\":\"horizontal\"),u.hoverable=!1,u.draggable=!1,u.style.lineWidth=1,u.style.brushType=\"stroke\",u.style.strokeColor=k.calculableHolderColor||this.ecTheme.calculableHolderColor||a.calculableHolderColor,this.shapeList.push(new n(u)));x?m+=h+w:V-=h+w}}this._calculMarkMapXY(o,i,x?\"y\":\"x\")},_buildHorizontal:function(e,t,i,n){return this._buildNormal(e,t,i,n,\"horizontal\")},_buildVertical:function(e,t,i,n){return this._buildNormal(e,t,i,n,\"vertical\")},_buildOther:function(e,t,i,a){for(var o=this.series,r=0,s=i.length;s>r;r++)for(var l=0,h=i[r].length;h>l;l++){var m=i[r][l],V=o[m],U=V.xAxisIndex||0,d=this.component.xAxis.getAxis(U),p=d.getCoord(0),c=V.yAxisIndex||0,u=this.component.yAxis.getAxis(c),y=u.getCoord(0);a[m]=a[m]||{min0:Number.POSITIVE_INFINITY,min1:Number.POSITIVE_INFINITY,max0:Number.NEGATIVE_INFINITY,max1:Number.NEGATIVE_INFINITY,sum0:0,sum1:0,counter0:0,counter1:0,average0:0,average1:0};for(var g=0,b=V.data.length;b>g;g++){var f=V.data[g],k=this.getDataFromOption(f,\"-\");if(k instanceof Array){var x,_,L=d.getCoord(k[0]),W=u.getCoord(k[1]),X=[f,V],v=this.deepQuery(X,\"barWidth\")||10,w=this.deepQuery(X,\"barHeight\");null!=w?(x=\"horizontal\",k[0]>0?(v=L-p,L-=v):v=k[0]<0?p-L:0,_=this._getBarItem(m,g,k[0],L,W-w/2,v,w,x)):(x=\"vertical\",k[1]>0?w=y-W:k[1]<0?(w=W-y,W-=w):w=0,_=this._getBarItem(m,g,k[0],L-v/2,W,v,w,x)),this.shapeList.push(new n(_)),L=d.getCoord(k[0]),W=u.getCoord(k[1]),a[m].min0>k[0]&&(a[m].min0=k[0],a[m].minY0=W,a[m].minX0=L),a[m].max0<k[0]&&(a[m].max0=k[0],a[m].maxY0=W,a[m].maxX0=L),a[m].sum0+=k[0],a[m].counter0++,a[m].min1>k[1]&&(a[m].min1=k[1],a[m].minY1=W,a[m].minX1=L),a[m].max1<k[1]&&(a[m].max1=k[1],a[m].maxY1=W,a[m].maxX1=L),a[m].sum1+=k[1],a[m].counter1++}}}this._calculMarkMapXY(a,i,\"xy\")},_mapSize:function(e,t,i){var n,a,o=this._findSpecialBarSzie(t,i),r=o.barWidthMap,s=o.barMaxWidthMap,l=o.barMinHeightMap,h=o.sBarWidthCounter,m=o.sBarWidthTotal,V=o.barGap,U=o.barCategoryGap,d=1;if(t.length!=h){if(i)n=e.getGap(),V=0,a=+(n/t.length).toFixed(2),0>=a&&(d=Math.floor(t.length/n),a=1);else if(n=\"string\"==typeof U&&U.match(/%$/)?(e.getGap()*(100-parseFloat(U))/100).toFixed(2)-0:e.getGap()-U,\"string\"==typeof V&&V.match(/%$/)?(V=parseFloat(V)/100,a=+((n-m)/((t.length-1)*V+t.length-h)).toFixed(2),V=a*V):(V=parseFloat(V),a=+((n-m-V*(t.length-1))/(t.length-h)).toFixed(2)),0>=a)return this._mapSize(e,t,!0)}else if(n=h>1?\"string\"==typeof U&&U.match(/%$/)?+(e.getGap()*(100-parseFloat(U))/100).toFixed(2):e.getGap()-U:m,a=0,V=h>1?+((n-m)/(h-1)).toFixed(2):0,0>V)return this._mapSize(e,t,!0);return this._recheckBarMaxWidth(t,r,s,l,n,a,V,d)},_findSpecialBarSzie:function(e,t){for(var i,n,a,o,r=this.series,s={},l={},h={},m=0,V=0,U=0,d=e.length;d>U;U++)for(var p={barWidth:!1,barMaxWidth:!1},c=0,u=e[U].length;u>c;c++){var y=e[U][c],g=r[y];if(!t){if(p.barWidth)s[y]=i;else if(i=this.query(g,\"barWidth\"),null!=i){s[y]=i,V+=i,m++,p.barWidth=!0;for(var b=0,f=c;f>b;b++){var k=e[U][b];s[k]=i}}if(p.barMaxWidth)l[y]=n;else if(n=this.query(g,\"barMaxWidth\"),null!=n){l[y]=n,p.barMaxWidth=!0;for(var b=0,f=c;f>b;b++){var k=e[U][b];l[k]=n}}}h[y]=this.query(g,\"barMinHeight\"),a=null!=a?a:this.query(g,\"barGap\"),o=null!=o?o:this.query(g,\"barCategoryGap\")}return{barWidthMap:s,barMaxWidthMap:l,barMinHeightMap:h,sBarWidth:i,sBarMaxWidth:n,sBarWidthCounter:m,sBarWidthTotal:V,barGap:a,barCategoryGap:o}},_recheckBarMaxWidth:function(e,t,i,n,a,o,r,s){for(var l=0,h=e.length;h>l;l++){var m=e[l][0];i[m]&&i[m]<o&&(a-=o-i[m])}return{barWidthMap:t,barMaxWidthMap:i,barMinHeightMap:n,gap:a,barWidth:o,barGap:r,interval:s}},_getBarItem:function(e,t,i,n,a,r,l,h){var m,V=this.series,U=V[e],d=U.data[t],p=this._sIndex2ColorMap[e],c=[d,U],u=this.deepMerge(c,\"itemStyle.normal\"),y=this.deepMerge(c,\"itemStyle.emphasis\"),g=u.barBorderWidth;m={zlevel:U.zlevel,z:U.z,clickable:this.deepQuery(c,\"clickable\"),style:{x:n,y:a,width:r,height:l,brushType:\"both\",color:this.getItemStyleColor(this.deepQuery(c,\"itemStyle.normal.color\")||p,e,t,d),radius:u.barBorderRadius,lineWidth:g,strokeColor:u.barBorderColor},highlightStyle:{color:this.getItemStyleColor(this.deepQuery(c,\"itemStyle.emphasis.color\"),e,t,d),radius:y.barBorderRadius,lineWidth:y.barBorderWidth,strokeColor:y.barBorderColor},_orient:h};var b=m.style;m.highlightStyle.color=m.highlightStyle.color||(\"string\"==typeof b.color?s.lift(b.color,-.3):b.color),b.x=Math.floor(b.x),b.y=Math.floor(b.y),b.height=Math.ceil(b.height),b.width=Math.ceil(b.width),g>0&&b.height>g&&b.width>g?(b.y+=g/2,b.height-=g,b.x+=g/2,b.width-=g):b.brushType=\"fill\",m.highlightStyle.textColor=m.highlightStyle.color,m=this.addLabel(m,U,d,i,h);for(var f=[b,m.highlightStyle],k=0,x=f.length;x>k;k++){var _=f[k].textPosition;if(\"insideLeft\"===_||\"insideRight\"===_||\"insideTop\"===_||\"insideBottom\"===_){var L=5;switch(_){case\"insideLeft\":f[k].textX=b.x+L,f[k].textY=b.y+b.height/2,f[k].textAlign=\"left\",f[k].textBaseline=\"middle\";break;case\"insideRight\":f[k].textX=b.x+b.width-L,f[k].textY=b.y+b.height/2,f[k].textAlign=\"right\",f[k].textBaseline=\"middle\";break;case\"insideTop\":f[k].textX=b.x+b.width/2,f[k].textY=b.y+L/2,f[k].textAlign=\"center\",f[k].textBaseline=\"top\";break;case\"insideBottom\":f[k].textX=b.x+b.width/2,f[k].textY=b.y+b.height-L/2,f[k].textAlign=\"center\",f[k].textBaseline=\"bottom\"}f[k].textPosition=\"specific\",f[k].textColor=f[k].textColor||\"#fff\"}}return this.deepQuery([d,U,this.option],\"calculable\")&&(this.setCalculable(m),m.draggable=!0),o.pack(m,V[e],e,V[e].data[t],t,i),m},getMarkCoord:function(e,t){var i,n,a=this.series[e],o=this.xMarkMap[e],r=this.component.xAxis.getAxis(a.xAxisIndex),s=this.component.yAxis.getAxis(a.yAxisIndex);if(!t.type||\"max\"!==t.type&&\"min\"!==t.type&&\"average\"!==t.type)if(o.isHorizontal){i=\"string\"==typeof t.xAxis&&r.getIndexByName?r.getIndexByName(t.xAxis):t.xAxis||0;var l=o[i];l=null!=l?l:\"string\"!=typeof t.xAxis&&r.getCoordByIndex?r.getCoordByIndex(t.xAxis||0):r.getCoord(t.xAxis||0),n=[l,s.getCoord(t.yAxis||0)]}else{i=\"string\"==typeof t.yAxis&&s.getIndexByName?s.getIndexByName(t.yAxis):t.yAxis||0;var h=o[i];h=null!=h?h:\"string\"!=typeof t.yAxis&&s.getCoordByIndex?s.getCoordByIndex(t.yAxis||0):s.getCoord(t.yAxis||0),n=[r.getCoord(t.xAxis||0),h]}else{var m=null!=t.valueIndex?t.valueIndex:null!=o.maxX0?\"1\":\"\";n=[o[t.type+\"X\"+m],o[t.type+\"Y\"+m],o[t.type+\"Line\"+m],o[t.type+m]]}return n},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()},addDataAnimation:function(e,t){function i(){c--,0===c&&t&&t()}for(var n=this.series,a={},r=0,s=e.length;s>r;r++)a[e[r][0]]=e[r];for(var l,h,m,V,U,d,p,c=0,r=this.shapeList.length-1;r>=0;r--)if(d=o.get(this.shapeList[r],\"seriesIndex\"),a[d]&&!a[d][3]&&\"rectangle\"===this.shapeList[r].type){if(p=o.get(this.shapeList[r],\"dataIndex\"),U=n[d],a[d][2]&&p===U.data.length-1){this.zr.delShape(this.shapeList[r].id);continue}if(!a[d][2]&&0===p){this.zr.delShape(this.shapeList[r].id);continue}\"horizontal\"===this.shapeList[r]._orient?(V=this.component.yAxis.getAxis(U.yAxisIndex||0).getGap(),m=a[d][2]?-V:V,l=0):(h=this.component.xAxis.getAxis(U.xAxisIndex||0).getGap(),l=a[d][2]?h:-h,m=0),this.shapeList[r].position=[0,0],c++,this.zr.animate(this.shapeList[r].id,\"\").when(this.query(this.option,\"animationDurationUpdate\"),{position:[l,m]}).done(i).start()}c||t&&t()}},r.inherits(t,i),e(\"../chart\").define(\"bar\",t),t}),i(\"echarts/chart/scatter\",[\"require\",\"./base\",\"../util/shape/Symbol\",\"../component/axis\",\"../component/grid\",\"../component/dataZoom\",\"../component/dataRange\",\"../config\",\"zrender/tool/util\",\"zrender/tool/color\",\"../chart\"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e(\"./base\"),n=e(\"../util/shape/Symbol\");e(\"../component/axis\"),e(\"../component/grid\"),e(\"../component/dataZoom\"),e(\"../component/dataRange\");var a=e(\"../config\");a.scatter={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,xAxisIndex:0,yAxisIndex:0,symbolSize:4,large:!1,largeThreshold:2e3,itemStyle:{normal:{label:{show:!1}},emphasis:{label:{show:!1}}}};var o=e(\"zrender/tool/util\"),r=e(\"zrender/tool/color\");return t.prototype={type:a.CHART_TYPE_SCATTER,_buildShape:function(){var e=this.series;this._sIndex2ColorMap={},this._symbol=this.option.symbolList,this._sIndex2ShapeMap={},this.selectedMap={},this.xMarkMap={};for(var t,i,n,o,s=this.component.legend,l=[],h=0,m=e.length;m>h;h++)if(t=e[h],i=t.name,t.type===a.CHART_TYPE_SCATTER){if(e[h]=this.reformOption(e[h]),this.legendHoverLink=e[h].legendHoverLink||this.legendHoverLink,this._sIndex2ShapeMap[h]=this.query(t,\"symbol\")||this._symbol[h%this._symbol.length],s){if(this.selectedMap[i]=s.isSelected(i),this._sIndex2ColorMap[h]=r.alpha(s.getColor(i),.5),n=s.getItemShape(i)){var o=this._sIndex2ShapeMap[h];n.style.brushType=o.match(\"empty\")?\"stroke\":\"both\",o=o.replace(\"empty\",\"\").toLowerCase(),o.match(\"rectangle\")&&(n.style.x+=Math.round((n.style.width-n.style.height)/2),n.style.width=n.style.height),o.match(\"star\")&&(n.style.n=o.replace(\"star\",\"\")-0||5,o=\"star\"),o.match(\"image\")&&(n.style.image=o.replace(new RegExp(\"^image:\\\\/\\\\/\"),\"\"),n.style.x+=Math.round((n.style.width-n.style.height)/2),n.style.width=n.style.height,o=\"image\"),n.style.iconType=o,s.setItemShape(i,n)}}else this.selectedMap[i]=!0,this._sIndex2ColorMap[h]=r.alpha(this.zr.getColor(h),.5);this.selectedMap[i]&&l.push(h)}this._buildSeries(l),this.addShapeList()},_buildSeries:function(e){if(0!==e.length){for(var t,i,n,a,o,r,s,l,h=this.series,m={},V=0,U=e.length;U>V;V++)if(t=e[V],i=h[t],0!==i.data.length){o=this.component.xAxis.getAxis(i.xAxisIndex||0),r=this.component.yAxis.getAxis(i.yAxisIndex||0),m[t]=[];for(var d=0,p=i.data.length;p>d;d++)n=i.data[d],a=this.getDataFromOption(n,\"-\"),\"-\"===a||a.length<2||(s=o.getCoord(a[0]),l=r.getCoord(a[1]),m[t].push([s,l,d,n.name||\"\"]));this.xMarkMap[t]=this._markMap(o,r,i.data,m[t]),this.buildMark(t)}this._buildPointList(m)}},_markMap:function(e,t,i,n){for(var a,o={min0:Number.POSITIVE_INFINITY,max0:Number.NEGATIVE_INFINITY,sum0:0,counter0:0,average0:0,min1:Number.POSITIVE_INFINITY,max1:Number.NEGATIVE_INFINITY,sum1:0,counter1:0,average1:0},r=0,s=n.length;s>r;r++)a=i[n[r][2]].value||i[n[r][2]],o.min0>a[0]&&(o.min0=a[0],o.minY0=n[r][1],o.minX0=n[r][0]),o.max0<a[0]&&(o.max0=a[0],o.maxY0=n[r][1],o.maxX0=n[r][0]),o.sum0+=a[0],o.counter0++,o.min1>a[1]&&(o.min1=a[1],o.minY1=n[r][1],o.minX1=n[r][0]),o.max1<a[1]&&(o.max1=a[1],o.maxY1=n[r][1],o.maxX1=n[r][0]),o.sum1+=a[1],o.counter1++;var l=this.component.grid.getX(),h=this.component.grid.getXend(),m=this.component.grid.getY(),V=this.component.grid.getYend();o.average0=o.sum0/o.counter0;var U=e.getCoord(o.average0);o.averageLine0=[[U,V],[U,m]],o.minLine0=[[o.minX0,V],[o.minX0,m]],o.maxLine0=[[o.maxX0,V],[o.maxX0,m]],o.average1=o.sum1/o.counter1;var d=t.getCoord(o.average1);return o.averageLine1=[[l,d],[h,d]],o.minLine1=[[l,o.minY1],[h,o.minY1]],o.maxLine1=[[l,o.maxY1],[h,o.maxY1]],o},_buildPointList:function(e){var t,i,n,a,o=this.series;for(var r in e)if(t=o[r],i=e[r],t.large&&t.data.length>t.largeThreshold)this.shapeList.push(this._getLargeSymbol(t,i,this.getItemStyleColor(this.query(t,\"itemStyle.normal.color\"),r,-1)||this._sIndex2ColorMap[r]));else for(var s=0,l=i.length;l>s;s++)n=i[s],a=this._getSymbol(r,n[2],n[3],n[0],n[1]),a&&this.shapeList.push(a)},_getSymbol:function(e,t,i,n,a){var o,r=this.series,s=r[e],l=s.data[t],h=this.component.dataRange;if(h){if(o=isNaN(l[2])?this._sIndex2ColorMap[e]:h.getColor(l[2]),!o)return null}else o=this._sIndex2ColorMap[e];var m=this.getSymbolShape(s,e,l,t,i,n,a,this._sIndex2ShapeMap[e],o,\"rgba(0,0,0,0)\",\"vertical\");return m.zlevel=s.zlevel,m.z=s.z,m._main=!0,m},_getLargeSymbol:function(e,t,i){return new n({zlevel:e.zlevel,z:e.z,_main:!0,hoverable:!1,style:{pointList:t,color:i,strokeColor:i},highlightStyle:{pointList:[]}})},getMarkCoord:function(e,t){var i,n=this.series[e],a=this.xMarkMap[e],o=this.component.xAxis.getAxis(n.xAxisIndex),r=this.component.yAxis.getAxis(n.yAxisIndex);if(!t.type||\"max\"!==t.type&&\"min\"!==t.type&&\"average\"!==t.type)i=[\"string\"!=typeof t.xAxis&&o.getCoordByIndex?o.getCoordByIndex(t.xAxis||0):o.getCoord(t.xAxis||0),\"string\"!=typeof t.yAxis&&r.getCoordByIndex?r.getCoordByIndex(t.yAxis||0):r.getCoord(t.yAxis||0)];else{var s=null!=t.valueIndex?t.valueIndex:1;i=[a[t.type+\"X\"+s],a[t.type+\"Y\"+s],a[t.type+\"Line\"+s],a[t.type+s]]}return i},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()},ondataRange:function(e,t){this.component.dataRange&&(this.refresh(),t.needRefresh=!0)}},o.inherits(t,i),e(\"../chart\").define(\"scatter\",t),t}),i(\"echarts/component/dataRange\",[\"require\",\"./base\",\"zrender/shape/Text\",\"zrender/shape/Rectangle\",\"../util/shape/HandlePolygon\",\"../config\",\"zrender/tool/util\",\"zrender/tool/event\",\"zrender/tool/area\",\"zrender/tool/color\",\"../component\"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o);var s=this;s._ondrift=function(e,t){return s.__ondrift(this,e,t)},s._ondragend=function(){return s.__ondragend()},s._dataRangeSelected=function(e){return s.__dataRangeSelected(e)},s._dispatchHoverLink=function(e){return s.__dispatchHoverLink(e)},s._onhoverlink=function(e){return s.__onhoverlink(e);\n\n},this._selectedMap={},this._range={},this.refresh(a),t.bind(r.EVENT.HOVER,this._onhoverlink)}var i=e(\"./base\"),n=e(\"zrender/shape/Text\"),a=e(\"zrender/shape/Rectangle\"),o=e(\"../util/shape/HandlePolygon\"),r=e(\"../config\");r.dataRange={zlevel:0,z:4,show:!0,orient:\"vertical\",x:\"left\",y:\"bottom\",backgroundColor:\"rgba(0,0,0,0)\",borderColor:\"#ccc\",borderWidth:0,padding:5,itemGap:10,itemWidth:20,itemHeight:14,precision:0,splitNumber:5,splitList:null,calculable:!1,selectedMode:!0,hoverLink:!0,realtime:!0,color:[\"#006edd\",\"#e0ffff\"],textStyle:{color:\"#333\"}};var s=e(\"zrender/tool/util\"),l=e(\"zrender/tool/event\"),h=e(\"zrender/tool/area\"),m=e(\"zrender/tool/color\");return t.prototype={type:r.COMPONENT_TYPE_DATARANGE,_textGap:10,_buildShape:function(){if(this._itemGroupLocation=this._getItemGroupLocation(),this._buildBackground(),this._isContinuity()?this._buildGradient():this._buildItem(),this.dataRangeOption.show)for(var e=0,t=this.shapeList.length;t>e;e++)this.zr.addShape(this.shapeList[e]);this._syncShapeFromRange()},_buildItem:function(){var e,t,i,o,r=this._valueTextList,s=r.length,l=this.getFont(this.dataRangeOption.textStyle),m=this._itemGroupLocation.x,V=this._itemGroupLocation.y,U=this.dataRangeOption.itemWidth,d=this.dataRangeOption.itemHeight,p=this.dataRangeOption.itemGap,c=h.getTextHeight(\"国\",l);\"vertical\"==this.dataRangeOption.orient&&\"right\"==this.dataRangeOption.x&&(m=this._itemGroupLocation.x+this._itemGroupLocation.width-U);var u=!0;this.dataRangeOption.text&&(u=!1,this.dataRangeOption.text[0]&&(i=this._getTextShape(m,V,this.dataRangeOption.text[0]),\"horizontal\"==this.dataRangeOption.orient?m+=h.getTextWidth(this.dataRangeOption.text[0],l)+this._textGap:(V+=c+this._textGap,i.style.y+=c/2+this._textGap,i.style.textBaseline=\"bottom\"),this.shapeList.push(new n(i))));for(var y=0;s>y;y++)e=r[y],o=this.getColorByIndex(y),t=this._getItemShape(m,V,U,d,this._selectedMap[y]?o:\"#ccc\"),t._idx=y,t.onmousemove=this._dispatchHoverLink,this.dataRangeOption.selectedMode&&(t.clickable=!0,t.onclick=this._dataRangeSelected),this.shapeList.push(new a(t)),u&&(i={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:m+U+5,y:V,color:this._selectedMap[y]?this.dataRangeOption.textStyle.color:\"#ccc\",text:r[y],textFont:l,textBaseline:\"top\"},highlightStyle:{brushType:\"fill\"}},\"vertical\"==this.dataRangeOption.orient&&\"right\"==this.dataRangeOption.x&&(i.style.x-=U+10,i.style.textAlign=\"right\"),i._idx=y,i.onmousemove=this._dispatchHoverLink,this.dataRangeOption.selectedMode&&(i.clickable=!0,i.onclick=this._dataRangeSelected),this.shapeList.push(new n(i))),\"horizontal\"==this.dataRangeOption.orient?m+=U+(u?5:0)+(u?h.getTextWidth(e,l):0)+p:V+=d+p;!u&&this.dataRangeOption.text[1]&&(\"horizontal\"==this.dataRangeOption.orient?m=m-p+this._textGap:V=V-p+this._textGap,i=this._getTextShape(m,V,this.dataRangeOption.text[1]),\"horizontal\"!=this.dataRangeOption.orient&&(i.style.y-=5,i.style.textBaseline=\"top\"),this.shapeList.push(new n(i)))},_buildGradient:function(){var t,i,o=this.getFont(this.dataRangeOption.textStyle),r=this._itemGroupLocation.x,s=this._itemGroupLocation.y,l=this.dataRangeOption.itemWidth,m=this.dataRangeOption.itemHeight,V=h.getTextHeight(\"国\",o),U=10,d=!0;this.dataRangeOption.text&&(d=!1,this.dataRangeOption.text[0]&&(i=this._getTextShape(r,s,this.dataRangeOption.text[0]),\"horizontal\"==this.dataRangeOption.orient?r+=h.getTextWidth(this.dataRangeOption.text[0],o)+this._textGap:(s+=V+this._textGap,i.style.y+=V/2+this._textGap,i.style.textBaseline=\"bottom\"),this.shapeList.push(new n(i))));for(var p=e(\"zrender/tool/color\"),c=1/(this.dataRangeOption.color.length-1),u=[],y=0,g=this.dataRangeOption.color.length;g>y;y++)u.push([y*c,this.dataRangeOption.color[y]]);\"horizontal\"==this.dataRangeOption.orient?(t={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:r,y:s,width:l*U,height:m,color:p.getLinearGradient(r,s,r+l*U,s,u)},hoverable:!1},r+=l*U+this._textGap):(t={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:r,y:s,width:l,height:m*U,color:p.getLinearGradient(r,s,r,s+m*U,u)},hoverable:!1},s+=m*U+this._textGap),this.shapeList.push(new a(t)),this._calculableLocation=t.style,this.dataRangeOption.calculable&&(this._buildFiller(),this._bulidMask(),this._bulidHandle()),this._buildIndicator(),!d&&this.dataRangeOption.text[1]&&(i=this._getTextShape(r,s,this.dataRangeOption.text[1]),this.shapeList.push(new n(i)))},_buildIndicator:function(){var e,t,i=this._calculableLocation.x,n=this._calculableLocation.y,a=this._calculableLocation.width,r=this._calculableLocation.height,s=5;\"horizontal\"==this.dataRangeOption.orient?\"bottom\"!=this.dataRangeOption.y?(e=[[i,n+r],[i-s,n+r+s],[i+s,n+r+s]],t=\"bottom\"):(e=[[i,n],[i-s,n-s],[i+s,n-s]],t=\"top\"):\"right\"!=this.dataRangeOption.x?(e=[[i+a,n],[i+a+s,n-s],[i+a+s,n+s]],t=\"right\"):(e=[[i,n],[i-s,n-s],[i-s,n+s]],t=\"left\"),this._indicatorShape={style:{pointList:e,color:\"#fff\",__rect:{x:Math.min(e[0][0],e[1][0]),y:Math.min(e[0][1],e[1][1]),width:s*(\"horizontal\"==this.dataRangeOption.orient?2:1),height:s*(\"horizontal\"==this.dataRangeOption.orient?1:2)}},highlightStyle:{brushType:\"fill\",textPosition:t,textColor:this.dataRangeOption.textStyle.color},hoverable:!1},this._indicatorShape=new o(this._indicatorShape)},_buildFiller:function(){this._fillerShape={zlevel:this.getZlevelBase(),z:this.getZBase()+1,style:{x:this._calculableLocation.x,y:this._calculableLocation.y,width:this._calculableLocation.width,height:this._calculableLocation.height,color:\"rgba(255,255,255,0)\"},highlightStyle:{strokeColor:\"rgba(255,255,255,0.5)\",lineWidth:1},draggable:!0,ondrift:this._ondrift,ondragend:this._ondragend,onmousemove:this._dispatchHoverLink,_type:\"filler\"},this._fillerShape=new a(this._fillerShape),this.shapeList.push(this._fillerShape)},_bulidHandle:function(){var e,t,i,n,a,r,s,l,m=this._calculableLocation.x,V=this._calculableLocation.y,U=this._calculableLocation.width,d=this._calculableLocation.height,p=this.getFont(this.dataRangeOption.textStyle),c=h.getTextHeight(\"国\",p),u=Math.max(h.getTextWidth(this._textFormat(this.dataRangeOption.max),p),h.getTextWidth(this._textFormat(this.dataRangeOption.min),p))+2;\"horizontal\"==this.dataRangeOption.orient?\"bottom\"!=this.dataRangeOption.y?(e=[[m,V],[m,V+d+c],[m-c,V+d+c],[m-1,V+d],[m-1,V]],t=m-u/2-c,i=V+d+c/2+2,n={x:m-u-c,y:V+d,width:u+c,height:c},a=[[m+U,V],[m+U,V+d+c],[m+U+c,V+d+c],[m+U+1,V+d],[m+U+1,V]],r=m+U+u/2+c,s=i,l={x:m+U,y:V+d,width:u+c,height:c}):(e=[[m,V+d],[m,V-c],[m-c,V-c],[m-1,V],[m-1,V+d]],t=m-u/2-c,i=V-c/2-2,n={x:m-u-c,y:V-c,width:u+c,height:c},a=[[m+U,V+d],[m+U,V-c],[m+U+c,V-c],[m+U+1,V],[m+U+1,V+d]],r=m+U+u/2+c,s=i,l={x:m+U,y:V-c,width:u+c,height:c}):(u+=c,\"right\"!=this.dataRangeOption.x?(e=[[m,V],[m+U+c,V],[m+U+c,V-c],[m+U,V-1],[m,V-1]],t=m+U+u/2+c/2,i=V-c/2,n={x:m+U,y:V-c,width:u+c,height:c},a=[[m,V+d],[m+U+c,V+d],[m+U+c,V+c+d],[m+U,V+1+d],[m,V+d+1]],r=t,s=V+d+c/2,l={x:m+U,y:V+d,width:u+c,height:c}):(e=[[m+U,V],[m-c,V],[m-c,V-c],[m,V-1],[m+U,V-1]],t=m-u/2-c/2,i=V-c/2,n={x:m-u-c,y:V-c,width:u+c,height:c},a=[[m+U,V+d],[m-c,V+d],[m-c,V+c+d],[m,V+1+d],[m+U,V+d+1]],r=t,s=V+d+c/2,l={x:m-u-c,y:V+d,width:u+c,height:c})),this._startShape={style:{pointList:e,text:this._textFormat(this.dataRangeOption.max),textX:t,textY:i,textFont:p,color:this.getColor(this.dataRangeOption.max),rect:n,x:e[0][0],y:e[0][1],_x:e[0][0],_y:e[0][1]}},this._startShape.highlightStyle={strokeColor:this._startShape.style.color,lineWidth:1},this._endShape={style:{pointList:a,text:this._textFormat(this.dataRangeOption.min),textX:r,textY:s,textFont:p,color:this.getColor(this.dataRangeOption.min),rect:l,x:a[0][0],y:a[0][1],_x:a[0][0],_y:a[0][1]}},this._endShape.highlightStyle={strokeColor:this._endShape.style.color,lineWidth:1},this._startShape.zlevel=this._endShape.zlevel=this.getZlevelBase(),this._startShape.z=this._endShape.z=this.getZBase()+1,this._startShape.draggable=this._endShape.draggable=!0,this._startShape.ondrift=this._endShape.ondrift=this._ondrift,this._startShape.ondragend=this._endShape.ondragend=this._ondragend,this._startShape.style.textColor=this._endShape.style.textColor=this.dataRangeOption.textStyle.color,this._startShape.style.textAlign=this._endShape.style.textAlign=\"center\",this._startShape.style.textPosition=this._endShape.style.textPosition=\"specific\",this._startShape.style.textBaseline=this._endShape.style.textBaseline=\"middle\",this._startShape.style.width=this._endShape.style.width=0,this._startShape.style.height=this._endShape.style.height=0,this._startShape.style.textPosition=this._endShape.style.textPosition=\"specific\",this._startShape=new o(this._startShape),this._endShape=new o(this._endShape),this.shapeList.push(this._startShape),this.shapeList.push(this._endShape)},_bulidMask:function(){var e=this._calculableLocation.x,t=this._calculableLocation.y,i=this._calculableLocation.width,n=this._calculableLocation.height;this._startMask={zlevel:this.getZlevelBase(),z:this.getZBase()+1,style:{x:e,y:t,width:\"horizontal\"==this.dataRangeOption.orient?0:i,height:\"horizontal\"==this.dataRangeOption.orient?n:0,color:\"#ccc\"},hoverable:!1},this._endMask={zlevel:this.getZlevelBase(),z:this.getZBase()+1,style:{x:\"horizontal\"==this.dataRangeOption.orient?e+i:e,y:\"horizontal\"==this.dataRangeOption.orient?t:t+n,width:\"horizontal\"==this.dataRangeOption.orient?0:i,height:\"horizontal\"==this.dataRangeOption.orient?n:0,color:\"#ccc\"},hoverable:!1},this._startMask=new a(this._startMask),this._endMask=new a(this._endMask),this.shapeList.push(this._startMask),this.shapeList.push(this._endMask)},_buildBackground:function(){var e=this.reformCssArray(this.dataRangeOption.padding);this.shapeList.push(new a({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._itemGroupLocation.x-e[3],y:this._itemGroupLocation.y-e[0],width:this._itemGroupLocation.width+e[3]+e[1],height:this._itemGroupLocation.height+e[0]+e[2],brushType:0===this.dataRangeOption.borderWidth?\"fill\":\"both\",color:this.dataRangeOption.backgroundColor,strokeColor:this.dataRangeOption.borderColor,lineWidth:this.dataRangeOption.borderWidth}}))},_getItemGroupLocation:function(){var e=this._valueTextList,t=e.length,i=this.dataRangeOption.itemGap,n=this.dataRangeOption.itemWidth,a=this.dataRangeOption.itemHeight,o=0,r=0,s=this.getFont(this.dataRangeOption.textStyle),l=h.getTextHeight(\"国\",s),m=10;if(\"horizontal\"==this.dataRangeOption.orient){if(this.dataRangeOption.text||this._isContinuity())o=(this._isContinuity()?n*m+i:t*(n+i))+(this.dataRangeOption.text&&\"undefined\"!=typeof this.dataRangeOption.text[0]?h.getTextWidth(this.dataRangeOption.text[0],s)+this._textGap:0)+(this.dataRangeOption.text&&\"undefined\"!=typeof this.dataRangeOption.text[1]?h.getTextWidth(this.dataRangeOption.text[1],s)+this._textGap:0);else{n+=5;for(var V=0;t>V;V++)o+=n+h.getTextWidth(e[V],s)+i}o-=i,r=Math.max(l,a)}else{var U;if(this.dataRangeOption.text||this._isContinuity())r=(this._isContinuity()?a*m+i:t*(a+i))+(this.dataRangeOption.text&&\"undefined\"!=typeof this.dataRangeOption.text[0]?this._textGap+l:0)+(this.dataRangeOption.text&&\"undefined\"!=typeof this.dataRangeOption.text[1]?this._textGap+l:0),U=Math.max(h.getTextWidth(this.dataRangeOption.text&&this.dataRangeOption.text[0]||\"\",s),h.getTextWidth(this.dataRangeOption.text&&this.dataRangeOption.text[1]||\"\",s)),o=Math.max(n,U);else{r=(a+i)*t,n+=5,U=0;for(var V=0;t>V;V++)U=Math.max(U,h.getTextWidth(e[V],s));o=n+U}r-=i}var d,p=this.reformCssArray(this.dataRangeOption.padding),c=this.zr.getWidth();switch(this.dataRangeOption.x){case\"center\":d=Math.floor((c-o)/2);break;case\"left\":d=p[3]+this.dataRangeOption.borderWidth;break;case\"right\":d=c-o-p[1]-this.dataRangeOption.borderWidth;break;default:d=this.parsePercent(this.dataRangeOption.x,c),d=isNaN(d)?0:d}var u,y=this.zr.getHeight();switch(this.dataRangeOption.y){case\"top\":u=p[0]+this.dataRangeOption.borderWidth;break;case\"bottom\":u=y-r-p[2]-this.dataRangeOption.borderWidth;break;case\"center\":u=Math.floor((y-r)/2);break;default:u=this.parsePercent(this.dataRangeOption.y,y),u=isNaN(u)?0:u}if(this.dataRangeOption.calculable){var g=Math.max(h.getTextWidth(this.dataRangeOption.max,s),h.getTextWidth(this.dataRangeOption.min,s))+l;\"horizontal\"==this.dataRangeOption.orient?(g>d&&(d=g),d+o+g>c&&(d-=g)):(l>u&&(u=l),u+r+l>y&&(u-=l))}return{x:d,y:u,width:o,height:r}},_getTextShape:function(e,t,i){return{zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:\"horizontal\"==this.dataRangeOption.orient?e:this._itemGroupLocation.x+this._itemGroupLocation.width/2,y:\"horizontal\"==this.dataRangeOption.orient?this._itemGroupLocation.y+this._itemGroupLocation.height/2:t,color:this.dataRangeOption.textStyle.color,text:i,textFont:this.getFont(this.dataRangeOption.textStyle),textBaseline:\"horizontal\"==this.dataRangeOption.orient?\"middle\":\"top\",textAlign:\"horizontal\"==this.dataRangeOption.orient?\"left\":\"center\"},hoverable:!1}},_getItemShape:function(e,t,i,n,a){return{zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:e,y:t+1,width:i,height:n-2,color:a},highlightStyle:{strokeColor:a,lineWidth:1}}},__ondrift:function(e,t,i){var n=this._calculableLocation.x,a=this._calculableLocation.y,o=this._calculableLocation.width,r=this._calculableLocation.height;return\"horizontal\"==this.dataRangeOption.orient?e.style.x+t<=n?e.style.x=n:e.style.x+t+e.style.width>=n+o?e.style.x=n+o-e.style.width:e.style.x+=t:e.style.y+i<=a?e.style.y=a:e.style.y+i+e.style.height>=a+r?e.style.y=a+r-e.style.height:e.style.y+=i,\"filler\"==e._type?this._syncHandleShape():this._syncFillerShape(e),this.dataRangeOption.realtime&&this._dispatchDataRange(),!0},__ondragend:function(){this.isDragend=!0},ondragend:function(e,t){this.isDragend&&e.target&&(t.dragOut=!0,t.dragIn=!0,this.dataRangeOption.realtime||this._dispatchDataRange(),t.needRefresh=!1,this.isDragend=!1)},_syncShapeFromRange:function(){var e=this.dataRangeOption.range||{},t=e.start,i=e.end;if(t>i&&(t=[i,i=t][0]),this._range.end=null!=t?t:null!=this._range.end?this._range.end:0,this._range.start=null!=i?i:null!=this._range.start?this._range.start:100,100!=this._range.start||0!==this._range.end){if(\"horizontal\"==this.dataRangeOption.orient){var n=this._fillerShape.style.width;this._fillerShape.style.x+=n*(100-this._range.start)/100,this._fillerShape.style.width=n*(this._range.start-this._range.end)/100}else{var a=this._fillerShape.style.height;this._fillerShape.style.y+=a*(100-this._range.start)/100,this._fillerShape.style.height=a*(this._range.start-this._range.end)/100}this.zr.modShape(this._fillerShape.id),this._syncHandleShape()}},_syncHandleShape:function(){var e=this._calculableLocation.x,t=this._calculableLocation.y,i=this._calculableLocation.width,n=this._calculableLocation.height;\"horizontal\"==this.dataRangeOption.orient?(this._startShape.style.x=this._fillerShape.style.x,this._startMask.style.width=this._startShape.style.x-e,this._endShape.style.x=this._fillerShape.style.x+this._fillerShape.style.width,this._endMask.style.x=this._endShape.style.x,this._endMask.style.width=e+i-this._endShape.style.x,this._range.start=Math.ceil(100-(this._startShape.style.x-e)/i*100),this._range.end=Math.floor(100-(this._endShape.style.x-e)/i*100)):(this._startShape.style.y=this._fillerShape.style.y,this._startMask.style.height=this._startShape.style.y-t,this._endShape.style.y=this._fillerShape.style.y+this._fillerShape.style.height,this._endMask.style.y=this._endShape.style.y,this._endMask.style.height=t+n-this._endShape.style.y,this._range.start=Math.ceil(100-(this._startShape.style.y-t)/n*100),this._range.end=Math.floor(100-(this._endShape.style.y-t)/n*100)),this._syncShape()},_syncFillerShape:function(e){var t,i,n=this._calculableLocation.x,a=this._calculableLocation.y,o=this._calculableLocation.width,r=this._calculableLocation.height;\"horizontal\"==this.dataRangeOption.orient?(t=this._startShape.style.x,i=this._endShape.style.x,e.id==this._startShape.id&&t>=i?(i=t,this._endShape.style.x=t):e.id==this._endShape.id&&t>=i&&(t=i,this._startShape.style.x=t),this._fillerShape.style.x=t,this._fillerShape.style.width=i-t,this._startMask.style.width=t-n,this._endMask.style.x=i,this._endMask.style.width=n+o-i,this._range.start=Math.ceil(100-(t-n)/o*100),this._range.end=Math.floor(100-(i-n)/o*100)):(t=this._startShape.style.y,i=this._endShape.style.y,e.id==this._startShape.id&&t>=i?(i=t,this._endShape.style.y=t):e.id==this._endShape.id&&t>=i&&(t=i,this._startShape.style.y=t),this._fillerShape.style.y=t,this._fillerShape.style.height=i-t,this._startMask.style.height=t-a,this._endMask.style.y=i,this._endMask.style.height=a+r-i,this._range.start=Math.ceil(100-(t-a)/r*100),this._range.end=Math.floor(100-(i-a)/r*100)),this._syncShape()},_syncShape:function(){this._startShape.position=[this._startShape.style.x-this._startShape.style._x,this._startShape.style.y-this._startShape.style._y],this._startShape.style.text=this._textFormat(this._gap*this._range.start+this.dataRangeOption.min),this._startShape.style.color=this._startShape.highlightStyle.strokeColor=this.getColor(this._gap*this._range.start+this.dataRangeOption.min),this._endShape.position=[this._endShape.style.x-this._endShape.style._x,this._endShape.style.y-this._endShape.style._y],this._endShape.style.text=this._textFormat(this._gap*this._range.end+this.dataRangeOption.min),this._endShape.style.color=this._endShape.highlightStyle.strokeColor=this.getColor(this._gap*this._range.end+this.dataRangeOption.min),this.zr.modShape(this._startShape.id),this.zr.modShape(this._endShape.id),this.zr.modShape(this._startMask.id),this.zr.modShape(this._endMask.id),this.zr.modShape(this._fillerShape.id),this.zr.refreshNextFrame()},_dispatchDataRange:function(){this.messageCenter.dispatch(r.EVENT.DATA_RANGE,null,{range:{start:this._range.end,end:this._range.start}},this.myChart)},__dataRangeSelected:function(e){if(\"single\"===this.dataRangeOption.selectedMode)for(var t in this._selectedMap)this._selectedMap[t]=!1;var i=e.target._idx;this._selectedMap[i]=!this._selectedMap[i];var n,a;this._useCustomizedSplit()?(n=this._splitList[i].max,a=this._splitList[i].min):(n=(this._colorList.length-i)*this._gap+this.dataRangeOption.min,a=n-this._gap),this.messageCenter.dispatch(r.EVENT.DATA_RANGE_SELECTED,e.event,{selected:this._selectedMap,target:i,valueMax:n,valueMin:a},this.myChart),this.messageCenter.dispatch(r.EVENT.REFRESH,null,null,this.myChart)},__dispatchHoverLink:function(e){var t,i;if(this.dataRangeOption.calculable){var n,a=this.dataRangeOption.max-this.dataRangeOption.min;n=\"horizontal\"==this.dataRangeOption.orient?(1-(l.getX(e.event)-this._calculableLocation.x)/this._calculableLocation.width)*a:(1-(l.getY(e.event)-this._calculableLocation.y)/this._calculableLocation.height)*a,t=n-.05*a,i=n+.05*a}else if(this._useCustomizedSplit()){var o=e.target._idx;i=this._splitList[o].max,t=this._splitList[o].min}else{var o=e.target._idx;i=(this._colorList.length-o)*this._gap+this.dataRangeOption.min,t=i-this._gap}this.messageCenter.dispatch(r.EVENT.DATA_RANGE_HOVERLINK,e.event,{valueMin:t,valueMax:i},this.myChart)},__onhoverlink:function(e){if(this.dataRangeOption.show&&this.dataRangeOption.hoverLink&&this._indicatorShape&&e&&null!=e.seriesIndex&&null!=e.dataIndex){var t=e.value;if(\"\"===t||isNaN(t))return;t<this.dataRangeOption.min?t=this.dataRangeOption.min:t>this.dataRangeOption.max&&(t=this.dataRangeOption.max),this._indicatorShape.position=\"horizontal\"==this.dataRangeOption.orient?[(this.dataRangeOption.max-t)/(this.dataRangeOption.max-this.dataRangeOption.min)*this._calculableLocation.width,0]:[0,(this.dataRangeOption.max-t)/(this.dataRangeOption.max-this.dataRangeOption.min)*this._calculableLocation.height],this._indicatorShape.style.text=this._textFormat(e.value),this._indicatorShape.style.color=this.getColor(t),this.zr.addHoverShape(this._indicatorShape)}},_textFormat:function(e,t){var i=this.dataRangeOption;if(e!==-Number.MAX_VALUE&&(e=(+e).toFixed(i.precision)),null!=t&&t!==Number.MAX_VALUE&&(t=(+t).toFixed(i.precision)),i.formatter){if(\"string\"==typeof i.formatter)return i.formatter.replace(\"{value}\",e===-Number.MAX_VALUE?\"min\":e).replace(\"{value2}\",t===Number.MAX_VALUE?\"max\":t);if(\"function\"==typeof i.formatter)return i.formatter.call(this.myChart,e,t)}return null==t?e:e===-Number.MAX_VALUE?\"< \"+t:t===Number.MAX_VALUE?\"> \"+e:e+\" - \"+t},_isContinuity:function(){var e=this.dataRangeOption;return!(e.splitList?e.splitList.length>0:e.splitNumber>0)||e.calculable},_useCustomizedSplit:function(){var e=this.dataRangeOption;return e.splitList&&e.splitList.length>0},_buildColorList:function(e){if(this._colorList=m.getGradientColors(this.dataRangeOption.color,Math.max((e-this.dataRangeOption.color.length)/(this.dataRangeOption.color.length-1),0)+1),this._colorList.length>e){for(var t=this._colorList.length,i=[this._colorList[0]],n=t/(e-1),a=1;e-1>a;a++)i.push(this._colorList[Math.floor(a*n)]);i.push(this._colorList[t-1]),this._colorList=i}if(this._useCustomizedSplit())for(var o=this._splitList,a=0,t=o.length;t>a;a++)o[a].color&&(this._colorList[a]=o[a].color)},_buildGap:function(e){if(!this._useCustomizedSplit()){var t=this.dataRangeOption.precision;for(this._gap=(this.dataRangeOption.max-this.dataRangeOption.min)/e;this._gap.toFixed(t)-0!=this._gap&&5>t;)t++;this.dataRangeOption.precision=t,this._gap=((this.dataRangeOption.max-this.dataRangeOption.min)/e).toFixed(t)-0}},_buildDataList:function(e){for(var t=this._valueTextList=[],i=this.dataRangeOption,n=this._useCustomizedSplit(),a=0;e>a;a++){this._selectedMap[a]=!0;var o=\"\";if(n){var r=this._splitList[e-1-a];o=null!=r.label?r.label:null!=r.single?this._textFormat(r.single):this._textFormat(r.min,r.max)}else o=this._textFormat(a*this._gap+i.min,(a+1)*this._gap+i.min);t.unshift(o)}},_buildSplitList:function(){if(this._useCustomizedSplit())for(var e=this.dataRangeOption.splitList,t=this._splitList=[],i=0,n=e.length;n>i;i++){var a=e[i];if(!a||null==a.start&&null==a.end)throw new Error(\"Empty item exists in splitList!\");var o={label:a.label,color:a.color};o.min=a.start,o.max=a.end,o.min>o.max&&(o.min=[o.max,o.max=o.min][0]),o.min===o.max&&(o.single=o.max),null==o.min&&(o.min=-Number.MAX_VALUE),null==o.max&&(o.max=Number.MAX_VALUE),t.push(o)}},refresh:function(e){if(e){this.option=e,this.option.dataRange=this.reformOption(this.option.dataRange);var t=this.dataRangeOption=this.option.dataRange;if(!this._useCustomizedSplit()&&(null==t.min||null==t.max))throw new Error(\"option.dataRange.min or option.dataRange.max has not been defined.\");this.myChart.canvasSupported||(t.realtime=!1);var i=this._isContinuity()?100:this._useCustomizedSplit()?t.splitList.length:t.splitNumber;this._buildSplitList(),this._buildColorList(i),this._buildGap(i),this._buildDataList(i)}this.clear(),this._buildShape()},getColor:function(e){if(isNaN(e))return null;var t;if(this._useCustomizedSplit()){for(var i=this._splitList,n=0,a=i.length;a>n;n++)if(i[n].min<=e&&i[n].max>=e){t=n;break}}else{if(this.dataRangeOption.min==this.dataRangeOption.max)return this._colorList[0];if(e<this.dataRangeOption.min?e=this.dataRangeOption.min:e>this.dataRangeOption.max&&(e=this.dataRangeOption.max),this.dataRangeOption.calculable&&(e-(this._gap*this._range.start+this.dataRangeOption.min)>5e-5||e-(this._gap*this._range.end+this.dataRangeOption.min)<-5e-5))return null;t=this._colorList.length-Math.ceil((e-this.dataRangeOption.min)/(this.dataRangeOption.max-this.dataRangeOption.min)*this._colorList.length),t==this._colorList.length&&t--}return this._selectedMap[t]?this._colorList[t]:null},getColorByIndex:function(e){return e>=this._colorList.length?e=this._colorList.length-1:0>e&&(e=0),this._colorList[e]},onbeforDispose:function(){this.messageCenter.unbind(r.EVENT.HOVER,this._onhoverlink)}},s.inherits(t,i),e(\"../component\").define(\"dataRange\",t),t}),i(\"echarts/util/shape/HandlePolygon\",[\"require\",\"zrender/shape/Base\",\"zrender/shape/Polygon\",\"zrender/tool/util\"],function(e){function t(e){i.call(this,e)}var i=e(\"zrender/shape/Base\"),n=e(\"zrender/shape/Polygon\"),a=e(\"zrender/tool/util\");return t.prototype={type:\"handle-polygon\",buildPath:function(e,t){n.prototype.buildPath(e,t)},isCover:function(e,t){var i=this.transformCoordToLocal(e,t);e=i[0],t=i[1];var n=this.style.rect;return e>=n.x&&e<=n.x+n.width&&t>=n.y&&t<=n.y+n.height?!0:!1}},a.inherits(t,i),t}),i(\"echarts/chart/k\",[\"require\",\"./base\",\"../util/shape/Candle\",\"../component/axis\",\"../component/grid\",\"../component/dataZoom\",\"../config\",\"../util/ecData\",\"zrender/tool/util\",\"../chart\"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e(\"./base\"),n=e(\"../util/shape/Candle\");e(\"../component/axis\"),e(\"../component/grid\"),e(\"../component/dataZoom\");var a=e(\"../config\");a.k={zlevel:0,z:2,clickable:!0,hoverable:!0,legendHoverLink:!1,xAxisIndex:0,yAxisIndex:0,itemStyle:{normal:{color:\"#fff\",color0:\"#00aa11\",lineStyle:{width:1,color:\"#ff3200\",color0:\"#00aa11\"},label:{show:!1}},emphasis:{label:{show:!1}}}};var o=e(\"../util/ecData\"),r=e(\"zrender/tool/util\");return t.prototype={type:a.CHART_TYPE_K,_buildShape:function(){var e=this.series;this.selectedMap={};for(var t,i={top:[],bottom:[]},n=0,o=e.length;o>n;n++)e[n].type===a.CHART_TYPE_K&&(e[n]=this.reformOption(e[n]),this.legendHoverLink=e[n].legendHoverLink||this.legendHoverLink,t=this.component.xAxis.getAxis(e[n].xAxisIndex),t.type===a.COMPONENT_TYPE_AXIS_CATEGORY&&i[t.getPosition()].push(n));for(var r in i)i[r].length>0&&this._buildSinglePosition(r,i[r]);this.addShapeList()},_buildSinglePosition:function(e,t){var i=this._mapData(t),n=i.locationMap,a=i.maxDataLength;if(0!==a&&0!==n.length){this._buildHorizontal(t,a,n);for(var o=0,r=t.length;r>o;o++)this.buildMark(t[o])}},_mapData:function(e){for(var t,i,n=this.series,a=this.component.legend,o=[],r=0,s=0,l=e.length;l>s;s++)t=n[e[s]],i=t.name,this.selectedMap[i]=a?a.isSelected(i):!0,this.selectedMap[i]&&o.push(e[s]),r=Math.max(r,t.data.length);return{locationMap:o,maxDataLength:r}},_buildHorizontal:function(e,t,i){for(var n,a,o,r,s,l,h,m,V,U,d=this.series,p={},c=0,u=i.length;u>c;c++){n=i[c],a=d[n],o=a.xAxisIndex||0,r=this.component.xAxis.getAxis(o),h=a.barWidth||Math.floor(r.getGap()/2),U=a.barMaxWidth,U&&h>U&&(h=U),s=a.yAxisIndex||0,l=this.component.yAxis.getAxis(s),p[n]=[];for(var y=0,g=t;g>y&&null!=r.getNameByIndex(y);y++)m=a.data[y],V=this.getDataFromOption(m,\"-\"),\"-\"!==V&&4==V.length&&p[n].push([r.getCoordByIndex(y),h,l.getCoord(V[0]),l.getCoord(V[1]),l.getCoord(V[2]),l.getCoord(V[3]),y,r.getNameByIndex(y)])}this._buildKLine(e,p)},_buildKLine:function(e,t){for(var i,n,o,r,s,l,h,m,V,U,d,p,c,u,y,g,b,f=this.series,k=0,x=e.length;x>k;k++)if(b=e[k],d=f[b],u=t[b],this._isLarge(u)&&(u=this._getLargePointList(u)),d.type===a.CHART_TYPE_K&&null!=u){p=d,i=this.query(p,\"itemStyle.normal.lineStyle.width\"),n=this.query(p,\"itemStyle.normal.lineStyle.color\"),o=this.query(p,\"itemStyle.normal.lineStyle.color0\"),r=this.query(p,\"itemStyle.normal.color\"),s=this.query(p,\"itemStyle.normal.color0\"),l=this.query(p,\"itemStyle.emphasis.lineStyle.width\"),h=this.query(p,\"itemStyle.emphasis.lineStyle.color\"),m=this.query(p,\"itemStyle.emphasis.lineStyle.color0\"),V=this.query(p,\"itemStyle.emphasis.color\"),U=this.query(p,\"itemStyle.emphasis.color0\");for(var _=0,L=u.length;L>_;_++)y=u[_],c=d.data[y[6]],p=c,g=y[3]<y[2],this.shapeList.push(this._getCandle(b,y[6],y[7],y[0],y[1],y[2],y[3],y[4],y[5],g?this.query(p,\"itemStyle.normal.color\")||r:this.query(p,\"itemStyle.normal.color0\")||s,this.query(p,\"itemStyle.normal.lineStyle.width\")||i,g?this.query(p,\"itemStyle.normal.lineStyle.color\")||n:this.query(p,\"itemStyle.normal.lineStyle.color0\")||o,g?this.query(p,\"itemStyle.emphasis.color\")||V||r:this.query(p,\"itemStyle.emphasis.color0\")||U||s,this.query(p,\"itemStyle.emphasis.lineStyle.width\")||l||i,g?this.query(p,\"itemStyle.emphasis.lineStyle.color\")||h||n:this.query(p,\"itemStyle.emphasis.lineStyle.color0\")||m||o))}},_isLarge:function(e){return e[0][1]<.5},_getLargePointList:function(e){for(var t=this.component.grid.getWidth(),i=e.length,n=[],a=0;t>a;a++)n[a]=e[Math.floor(i/t*a)];return n},_getCandle:function(e,t,i,a,r,s,l,h,m,V,U,d,p,c,u){var y=this.series,g=y[e],b=g.data[t],f=[b,g],k={zlevel:g.zlevel,z:g.z,clickable:this.deepQuery(f,\"clickable\"),hoverable:this.deepQuery(f,\"hoverable\"),style:{x:a,y:[s,l,h,m],width:r,color:V,strokeColor:d,lineWidth:U,brushType:\"both\"},highlightStyle:{color:p,strokeColor:u,lineWidth:c},_seriesIndex:e};return k=this.addLabel(k,g,b,i),o.pack(k,g,e,b,t,i),k=new n(k)},getMarkCoord:function(e,t){var i=this.series[e],n=this.component.xAxis.getAxis(i.xAxisIndex),a=this.component.yAxis.getAxis(i.yAxisIndex);return[\"string\"!=typeof t.xAxis&&n.getCoordByIndex?n.getCoordByIndex(t.xAxis||0):n.getCoord(t.xAxis||0),\"string\"!=typeof t.yAxis&&a.getCoordByIndex?a.getCoordByIndex(t.yAxis||0):a.getCoord(t.yAxis||0)]},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()},addDataAnimation:function(e,t){function i(){p--,0===p&&t&&t()}for(var n=this.series,a={},r=0,s=e.length;s>r;r++)a[e[r][0]]=e[r];for(var l,h,m,V,U,d,p=0,r=0,s=this.shapeList.length;s>r;r++)if(U=this.shapeList[r]._seriesIndex,a[U]&&!a[U][3]&&\"candle\"===this.shapeList[r].type){if(d=o.get(this.shapeList[r],\"dataIndex\"),V=n[U],a[U][2]&&d===V.data.length-1){this.zr.delShape(this.shapeList[r].id);continue}if(!a[U][2]&&0===d){this.zr.delShape(this.shapeList[r].id);continue}h=this.component.xAxis.getAxis(V.xAxisIndex||0).getGap(),l=a[U][2]?h:-h,m=0,p++,this.zr.animate(this.shapeList[r].id,\"\").when(this.query(this.option,\"animationDurationUpdate\"),{position:[l,m]}).done(i).start()}p||t&&t()}},r.inherits(t,i),e(\"../chart\").define(\"k\",t),t}),i(\"echarts/chart/pie\",[\"require\",\"./base\",\"zrender/shape/Text\",\"zrender/shape/Ring\",\"zrender/shape/Circle\",\"zrender/shape/Sector\",\"zrender/shape/Polyline\",\"../config\",\"../util/ecData\",\"zrender/tool/util\",\"zrender/tool/math\",\"zrender/tool/color\",\"../chart\"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o);var r=this;r.shapeHandler.onmouseover=function(e){var t=e.target,i=h.get(t,\"seriesIndex\"),n=h.get(t,\"dataIndex\"),a=h.get(t,\"special\"),o=[t.style.x,t.style.y],s=t.style.startAngle,l=t.style.endAngle,m=((l+s)/2+360)%360,V=t.highlightStyle.color,U=r.getLabel(i,n,a,o,m,V,!0);U&&r.zr.addHoverShape(U);var d=r.getLabelLine(i,n,o,t.style.r0,t.style.r,m,V,!0);d&&r.zr.addHoverShape(d)},this.refresh(a)}var i=e(\"./base\"),n=e(\"zrender/shape/Text\"),a=e(\"zrender/shape/Ring\"),o=e(\"zrender/shape/Circle\"),r=e(\"zrender/shape/Sector\"),s=e(\"zrender/shape/Polyline\"),l=e(\"../config\");l.pie={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,center:[\"50%\",\"50%\"],radius:[0,\"75%\"],clockWise:!0,startAngle:90,minAngle:0,selectedOffset:10,itemStyle:{normal:{borderColor:\"rgba(0,0,0,0)\",borderWidth:1,label:{show:!0,position:\"outer\"},labelLine:{show:!0,length:20,lineStyle:{width:1,type:\"solid\"}}},emphasis:{borderColor:\"rgba(0,0,0,0)\",borderWidth:1,label:{show:!1},labelLine:{show:!1,length:20,lineStyle:{width:1,type:\"solid\"}}}}};var h=e(\"../util/ecData\"),m=e(\"zrender/tool/util\"),V=e(\"zrender/tool/math\"),U=e(\"zrender/tool/color\");return t.prototype={type:l.CHART_TYPE_PIE,_buildShape:function(){var e=this.series,t=this.component.legend;this.selectedMap={},this._selected={};var i,n,r;this._selectedMode=!1;for(var s,m=0,V=e.length;V>m;m++)if(e[m].type===l.CHART_TYPE_PIE){if(e[m]=this.reformOption(e[m]),this.legendHoverLink=e[m].legendHoverLink||this.legendHoverLink,s=e[m].name||\"\",this.selectedMap[s]=t?t.isSelected(s):!0,!this.selectedMap[s])continue;i=this.parseCenter(this.zr,e[m].center),n=this.parseRadius(this.zr,e[m].radius),this._selectedMode=this._selectedMode||e[m].selectedMode,this._selected[m]=[],this.deepQuery([e[m],this.option],\"calculable\")&&(r={zlevel:e[m].zlevel,z:e[m].z,hoverable:!1,style:{x:i[0],y:i[1],r0:n[0]<=10?0:n[0]-10,r:n[1]+10,brushType:\"stroke\",lineWidth:1,strokeColor:e[m].calculableHolderColor||this.ecTheme.calculableHolderColor||l.calculableHolderColor}},h.pack(r,e[m],m,void 0,-1),this.setCalculable(r),r=n[0]<=10?new o(r):new a(r),this.shapeList.push(r)),this._buildSinglePie(m),this.buildMark(m)}this.addShapeList()},_buildSinglePie:function(e){for(var t,i=this.series,n=i[e],a=n.data,o=this.component.legend,r=0,s=0,l=0,h=Number.NEGATIVE_INFINITY,m=[],V=0,U=a.length;U>V;V++)t=a[V].name,\nthis.selectedMap[t]=o?o.isSelected(t):!0,this.selectedMap[t]&&!isNaN(a[V].value)&&(0!==+a[V].value?r++:s++,l+=+a[V].value,h=Math.max(h,+a[V].value));if(0!==l){for(var d,p,c,u,y,g,b=100,f=n.clockWise,k=(n.startAngle.toFixed(2)-0+360)%360,x=n.minAngle||.01,_=360-x*r-.01*s,L=n.roseType,V=0,U=a.length;U>V;V++)if(t=a[V].name,this.selectedMap[t]&&!isNaN(a[V].value)){if(p=o?o.getColor(t):this.zr.getColor(V),b=a[V].value/l,d=\"area\"!=L?f?k-b*_-(0!==b?x:.01):b*_+k+(0!==b?x:.01):f?k-360/U:360/U+k,d=d.toFixed(2)-0,b=(100*b).toFixed(2),c=this.parseCenter(this.zr,n.center),u=this.parseRadius(this.zr,n.radius),y=+u[0],g=+u[1],\"radius\"===L?g=a[V].value/h*(g-y)*.8+.2*(g-y)+y:\"area\"===L&&(g=Math.sqrt(a[V].value/h)*(g-y)+y),f){var W;W=k,k=d,d=W}this._buildItem(m,e,V,b,a[V].selected,c,y,g,k,d,p),f||(k=d)}this._autoLabelLayout(m,c,g);for(var V=0,U=m.length;U>V;V++)this.shapeList.push(m[V]);m=null}},_buildItem:function(e,t,i,n,a,o,r,s,l,m,V){var U=this.series,d=((m+l)/2+360)%360,p=this.getSector(t,i,n,a,o,r,s,l,m,V);h.pack(p,U[t],t,U[t].data[i],i,U[t].data[i].name,n),e.push(p);var c=this.getLabel(t,i,n,o,d,V,!1),u=this.getLabelLine(t,i,o,r,s,d,V,!1);u&&(h.pack(u,U[t],t,U[t].data[i],i,U[t].data[i].name,n),e.push(u)),c&&(h.pack(c,U[t],t,U[t].data[i],i,U[t].data[i].name,n),c._labelLine=u,e.push(c))},getSector:function(e,t,i,n,a,o,s,l,h,m){var d=this.series,p=d[e],c=p.data[t],u=[c,p],y=this.deepMerge(u,\"itemStyle.normal\")||{},g=this.deepMerge(u,\"itemStyle.emphasis\")||{},b=this.getItemStyleColor(y.color,e,t,c)||m,f=this.getItemStyleColor(g.color,e,t,c)||(\"string\"==typeof b?U.lift(b,-.2):b),k={zlevel:p.zlevel,z:p.z,clickable:this.deepQuery(u,\"clickable\"),style:{x:a[0],y:a[1],r0:o,r:s,startAngle:l,endAngle:h,brushType:\"both\",color:b,lineWidth:y.borderWidth,strokeColor:y.borderColor,lineJoin:\"round\"},highlightStyle:{color:f,lineWidth:g.borderWidth,strokeColor:g.borderColor,lineJoin:\"round\"},_seriesIndex:e,_dataIndex:t};if(n){var x=((k.style.startAngle+k.style.endAngle)/2).toFixed(2)-0;k.style._hasSelected=!0,k.style._x=k.style.x,k.style._y=k.style.y;var _=this.query(p,\"selectedOffset\");k.style.x+=V.cos(x,!0)*_,k.style.y-=V.sin(x,!0)*_,this._selected[e][t]=!0}else this._selected[e][t]=!1;return this._selectedMode&&(k.onclick=this.shapeHandler.onclick),this.deepQuery([c,p,this.option],\"calculable\")&&(this.setCalculable(k),k.draggable=!0),(this._needLabel(p,c,!0)||this._needLabelLine(p,c,!0))&&(k.onmouseover=this.shapeHandler.onmouseover),k=new r(k)},getLabel:function(e,t,i,a,o,r,s){var l=this.series,h=l[e],U=h.data[t];if(this._needLabel(h,U,s)){var d,p,c,u=s?\"emphasis\":\"normal\",y=m.merge(m.clone(U.itemStyle)||{},h.itemStyle),g=y[u].label,b=g.textStyle||{},f=a[0],k=a[1],x=this.parseRadius(this.zr,h.radius),_=\"middle\";g.position=g.position||y.normal.label.position,\"center\"===g.position?(d=f,p=k,c=\"center\"):\"inner\"===g.position||\"inside\"===g.position?(x=(x[0]+x[1])*(g.distance||.5),d=Math.round(f+x*V.cos(o,!0)),p=Math.round(k-x*V.sin(o,!0)),r=\"#fff\",c=\"center\"):(x=x[1]- -y[u].labelLine.length,d=Math.round(f+x*V.cos(o,!0)),p=Math.round(k-x*V.sin(o,!0)),c=o>=90&&270>=o?\"right\":\"left\"),\"center\"!=g.position&&\"inner\"!=g.position&&\"inside\"!=g.position&&(d+=\"left\"===c?20:-20),U.__labelX=d-(\"left\"===c?5:-5),U.__labelY=p;var L=new n({zlevel:h.zlevel,z:h.z+1,hoverable:!1,style:{x:d,y:p,color:b.color||r,text:this.getLabelText(e,t,i,u),textAlign:b.align||c,textBaseline:b.baseline||_,textFont:this.getFont(b)},highlightStyle:{brushType:\"fill\"}});return L._radius=x,L._labelPosition=g.position||\"outer\",L._rect=L.getRect(L.style),L._seriesIndex=e,L._dataIndex=t,L}},getLabelText:function(e,t,i,n){var a=this.series,o=a[e],r=o.data[t],s=this.deepQuery([r,o],\"itemStyle.\"+n+\".label.formatter\");return s?\"function\"==typeof s?s.call(this.myChart,{seriesIndex:e,seriesName:o.name||\"\",series:o,dataIndex:t,data:r,name:r.name,value:r.value,percent:i}):\"string\"==typeof s?(s=s.replace(\"{a}\",\"{a0}\").replace(\"{b}\",\"{b0}\").replace(\"{c}\",\"{c0}\").replace(\"{d}\",\"{d0}\"),s=s.replace(\"{a0}\",o.name).replace(\"{b0}\",r.name).replace(\"{c0}\",r.value).replace(\"{d0}\",i)):void 0:r.name},getLabelLine:function(e,t,i,n,a,o,r,l){var h=this.series,U=h[e],d=U.data[t];if(this._needLabelLine(U,d,l)){var p=l?\"emphasis\":\"normal\",c=m.merge(m.clone(d.itemStyle)||{},U.itemStyle),u=c[p].labelLine,y=u.lineStyle||{},g=i[0],b=i[1],f=a,k=this.parseRadius(this.zr,U.radius)[1]- -u.length,x=V.cos(o,!0),_=V.sin(o,!0);return new s({zlevel:U.zlevel,z:U.z+1,hoverable:!1,style:{pointList:[[g+f*x,b-f*_],[g+k*x,b-k*_],[d.__labelX,d.__labelY]],strokeColor:y.color||r,lineType:y.type,lineWidth:y.width},_seriesIndex:e,_dataIndex:t})}},_needLabel:function(e,t,i){return this.deepQuery([t,e],\"itemStyle.\"+(i?\"emphasis\":\"normal\")+\".label.show\")},_needLabelLine:function(e,t,i){return this.deepQuery([t,e],\"itemStyle.\"+(i?\"emphasis\":\"normal\")+\".labelLine.show\")},_autoLabelLayout:function(e,t,i){for(var n=[],a=[],o=0,r=e.length;r>o;o++)(\"outer\"===e[o]._labelPosition||\"outside\"===e[o]._labelPosition)&&(e[o]._rect._y=e[o]._rect.y,e[o]._rect.x<t[0]?n.push(e[o]):a.push(e[o]));this._layoutCalculate(n,t,i,-1),this._layoutCalculate(a,t,i,1)},_layoutCalculate:function(e,t,i,n){function a(t,i,n){for(var a=t;i>a;a++)if(e[a]._rect.y+=n,e[a].style.y+=n,e[a]._labelLine&&(e[a]._labelLine.style.pointList[1][1]+=n,e[a]._labelLine.style.pointList[2][1]+=n),a>t&&i>a+1&&e[a+1]._rect.y>e[a]._rect.y+e[a]._rect.height)return void o(a,n/2);o(i-1,n/2)}function o(t,i){for(var n=t;n>=0&&(e[n]._rect.y-=i,e[n].style.y-=i,e[n]._labelLine&&(e[n]._labelLine.style.pointList[1][1]-=i,e[n]._labelLine.style.pointList[2][1]-=i),!(n>0&&e[n]._rect.y>e[n-1]._rect.y+e[n-1]._rect.height));n--);}function r(e,t,i,n,a){for(var o,r,s,l=i[0],h=i[1],m=a>0?t?Number.MAX_VALUE:0:t?Number.MAX_VALUE:0,V=0,U=e.length;U>V;V++)r=Math.abs(e[V]._rect.y-h),s=e[V]._radius-n,o=n+s>r?Math.sqrt((n+s+20)*(n+s+20)-Math.pow(e[V]._rect.y-h,2)):Math.abs(e[V]._rect.x+(a>0?0:e[V]._rect.width)-l),t&&o>=m&&(o=m-10),!t&&m>=o&&(o=m+10),e[V]._rect.x=e[V].style.x=l+o*a,e[V]._labelLine&&(e[V]._labelLine.style.pointList[2][0]=l+(o-5)*a,e[V]._labelLine.style.pointList[1][0]=l+(o-20)*a),m=o}e.sort(function(e,t){return e._rect.y-t._rect.y});for(var s,l=0,h=e.length,m=[],V=[],U=0;h>U;U++)s=e[U]._rect.y-l,0>s&&a(U,h,-s,n),l=e[U]._rect.y+e[U]._rect.height;this.zr.getHeight()-l<0&&o(h-1,l-this.zr.getHeight());for(var U=0;h>U;U++)e[U]._rect.y>=t[1]?V.push(e[U]):m.push(e[U]);r(V,!0,t,i,n),r(m,!1,t,i,n)},reformOption:function(e){var t=m.merge;return e=t(t(e||{},m.clone(this.ecTheme.pie||{})),m.clone(l.pie)),e.itemStyle.normal.label.textStyle=this.getTextStyle(e.itemStyle.normal.label.textStyle),e.itemStyle.emphasis.label.textStyle=this.getTextStyle(e.itemStyle.emphasis.label.textStyle),this.z=e.z,this.zlevel=e.zlevel,e},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()},addDataAnimation:function(e,t){function i(){s--,0===s&&t&&t()}for(var n=this.series,a={},o=0,r=e.length;r>o;o++)a[e[o][0]]=e[o];var s=0,h={},m={},V={},U=this.shapeList;this.shapeList=[];for(var d,p,c,u={},o=0,r=e.length;r>o;o++)d=e[o][0],p=e[o][2],c=e[o][3],n[d]&&n[d].type===l.CHART_TYPE_PIE&&(p?(c||(h[d+\"_\"+n[d].data.length]=\"delete\"),u[d]=1):c?u[d]=0:(h[d+\"_-1\"]=\"delete\",u[d]=-1),this._buildSinglePie(d));for(var y,g,o=0,r=this.shapeList.length;r>o;o++)switch(d=this.shapeList[o]._seriesIndex,y=this.shapeList[o]._dataIndex,g=d+\"_\"+y,this.shapeList[o].type){case\"sector\":h[g]=this.shapeList[o];break;case\"text\":m[g]=this.shapeList[o];break;case\"polyline\":V[g]=this.shapeList[o]}this.shapeList=[];for(var b,o=0,r=U.length;r>o;o++)if(d=U[o]._seriesIndex,a[d]){if(y=U[o]._dataIndex+u[d],g=d+\"_\"+y,b=h[g],!b)continue;if(\"sector\"===U[o].type)\"delete\"!=b?(s++,this.zr.animate(U[o].id,\"style\").when(400,{startAngle:b.style.startAngle,endAngle:b.style.endAngle}).done(i).start()):(s++,this.zr.animate(U[o].id,\"style\").when(400,u[d]<0?{startAngle:U[o].style.startAngle}:{endAngle:U[o].style.endAngle}).done(i).start());else if(\"text\"===U[o].type||\"polyline\"===U[o].type)if(\"delete\"===b)this.zr.delShape(U[o].id);else switch(U[o].type){case\"text\":s++,b=m[g],this.zr.animate(U[o].id,\"style\").when(400,{x:b.style.x,y:b.style.y}).done(i).start();break;case\"polyline\":s++,b=V[g],this.zr.animate(U[o].id,\"style\").when(400,{pointList:b.style.pointList}).done(i).start()}}this.shapeList=U,s||t&&t()},onclick:function(e){var t=this.series;if(this.isClick&&e.target){this.isClick=!1;for(var i,n=e.target,a=n.style,o=h.get(n,\"seriesIndex\"),r=h.get(n,\"dataIndex\"),s=0,m=this.shapeList.length;m>s;s++)if(this.shapeList[s].id===n.id){if(o=h.get(n,\"seriesIndex\"),r=h.get(n,\"dataIndex\"),a._hasSelected)n.style.x=n.style._x,n.style.y=n.style._y,n.style._hasSelected=!1,this._selected[o][r]=!1;else{var U=((a.startAngle+a.endAngle)/2).toFixed(2)-0;n.style._hasSelected=!0,this._selected[o][r]=!0,n.style._x=n.style.x,n.style._y=n.style.y,i=this.query(t[o],\"selectedOffset\"),n.style.x+=V.cos(U,!0)*i,n.style.y-=V.sin(U,!0)*i}this.zr.modShape(n.id)}else this.shapeList[s].style._hasSelected&&\"single\"===this._selectedMode&&(o=h.get(this.shapeList[s],\"seriesIndex\"),r=h.get(this.shapeList[s],\"dataIndex\"),this.shapeList[s].style.x=this.shapeList[s].style._x,this.shapeList[s].style.y=this.shapeList[s].style._y,this.shapeList[s].style._hasSelected=!1,this._selected[o][r]=!1,this.zr.modShape(this.shapeList[s].id));this.messageCenter.dispatch(l.EVENT.PIE_SELECTED,e.event,{selected:this._selected,target:h.get(n,\"name\")},this.myChart),this.zr.refreshNextFrame()}}},m.inherits(t,i),e(\"../chart\").define(\"pie\",t),t}),i(\"echarts/chart/radar\",[\"require\",\"./base\",\"zrender/shape/Polygon\",\"../component/polar\",\"../config\",\"../util/ecData\",\"zrender/tool/util\",\"zrender/tool/color\",\"../util/accMath\",\"../chart\"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e(\"./base\"),n=e(\"zrender/shape/Polygon\");e(\"../component/polar\");var a=e(\"../config\");a.radar={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,polarIndex:0,itemStyle:{normal:{label:{show:!1},lineStyle:{width:2,type:\"solid\"}},emphasis:{label:{show:!1}}},symbolSize:2};var o=e(\"../util/ecData\"),r=e(\"zrender/tool/util\"),s=e(\"zrender/tool/color\");return t.prototype={type:a.CHART_TYPE_RADAR,_buildShape:function(){this.selectedMap={},this._symbol=this.option.symbolList,this._queryTarget,this._dropBoxList=[],this._radarDataCounter=0;for(var e,t=this.series,i=this.component.legend,n=0,o=t.length;o>n;n++)t[n].type===a.CHART_TYPE_RADAR&&(this.serie=this.reformOption(t[n]),this.legendHoverLink=t[n].legendHoverLink||this.legendHoverLink,e=this.serie.name||\"\",this.selectedMap[e]=i?i.isSelected(e):!0,this.selectedMap[e]&&(this._queryTarget=[this.serie,this.option],this.deepQuery(this._queryTarget,\"calculable\")&&this._addDropBox(n),this._buildSingleRadar(n),this.buildMark(n)));this.addShapeList()},_buildSingleRadar:function(e){for(var t,i,n,a,o=this.component.legend,r=this.serie.data,s=this.deepQuery(this._queryTarget,\"calculable\"),l=0;l<r.length;l++)n=r[l].name||\"\",this.selectedMap[n]=o?o.isSelected(n):!0,this.selectedMap[n]&&(o?(i=o.getColor(n),t=o.getItemShape(n),t&&(t.style.brushType=this.deepQuery([r[l],this.serie],\"itemStyle.normal.areaStyle\")?\"both\":\"stroke\",o.setItemShape(n,t))):i=this.zr.getColor(l),a=this._getPointList(this.serie.polarIndex,r[l]),this._addSymbol(a,i,l,e,this.serie.polarIndex),this._addDataShape(a,i,r[l],e,l,s),this._radarDataCounter++)},_getPointList:function(e,t){for(var i,n,a=[],o=this.component.polar,r=0,s=t.value.length;s>r;r++)n=this.getDataFromOption(t.value[r]),i=\"-\"!=n?o.getVector(e,r,n):!1,i&&a.push(i);return a},_addSymbol:function(e,t,i,n,a){for(var r,s=this.series,l=this.component.polar,h=0,m=e.length;m>h;h++)r=this.getSymbolShape(this.deepMerge([s[n].data[i],s[n]]),n,s[n].data[i].value[h],h,l.getIndicatorText(a,h),e[h][0],e[h][1],this._symbol[this._radarDataCounter%this._symbol.length],t,\"#fff\",\"vertical\"),r.zlevel=this.getZlevelBase(),r.z=this.getZBase()+1,o.set(r,\"data\",s[n].data[i]),o.set(r,\"value\",s[n].data[i].value),o.set(r,\"dataIndex\",i),o.set(r,\"special\",h),this.shapeList.push(r)},_addDataShape:function(e,t,i,a,r,l){var h=this.series,m=[i,this.serie],V=this.getItemStyleColor(this.deepQuery(m,\"itemStyle.normal.color\"),a,r,i),U=this.deepQuery(m,\"itemStyle.normal.lineStyle.width\"),d=this.deepQuery(m,\"itemStyle.normal.lineStyle.type\"),p=this.deepQuery(m,\"itemStyle.normal.areaStyle.color\"),c=this.deepQuery(m,\"itemStyle.normal.areaStyle\"),u={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{pointList:e,brushType:c?\"both\":\"stroke\",color:p||V||(\"string\"==typeof t?s.alpha(t,.5):t),strokeColor:V||t,lineWidth:U,lineType:d},highlightStyle:{brushType:this.deepQuery(m,\"itemStyle.emphasis.areaStyle\")||c?\"both\":\"stroke\",color:this.deepQuery(m,\"itemStyle.emphasis.areaStyle.color\")||p||V||(\"string\"==typeof t?s.alpha(t,.5):t),strokeColor:this.getItemStyleColor(this.deepQuery(m,\"itemStyle.emphasis.color\"),a,r,i)||V||t,lineWidth:this.deepQuery(m,\"itemStyle.emphasis.lineStyle.width\")||U,lineType:this.deepQuery(m,\"itemStyle.emphasis.lineStyle.type\")||d}};o.pack(u,h[a],a,i,r,i.name,this.component.polar.getIndicator(h[a].polarIndex)),l&&(u.draggable=!0,this.setCalculable(u)),u=new n(u),this.shapeList.push(u)},_addDropBox:function(e){var t=this.series,i=this.deepQuery(this._queryTarget,\"polarIndex\");if(!this._dropBoxList[i]){var n=this.component.polar.getDropBox(i);n.zlevel=this.getZlevelBase(),n.z=this.getZBase(),this.setCalculable(n),o.pack(n,t,e,void 0,-1),this.shapeList.push(n),this._dropBoxList[i]=!0}},ondragend:function(e,t){var i=this.series;if(this.isDragend&&e.target){var n=e.target,a=o.get(n,\"seriesIndex\"),r=o.get(n,\"dataIndex\");this.component.legend&&this.component.legend.del(i[a].data[r].name),i[a].data.splice(r,1),t.dragOut=!0,t.needRefresh=!0,this.isDragend=!1}},ondrop:function(t,i){var n=this.series;if(this.isDrop&&t.target){var a,r,s=t.target,l=t.dragged,h=o.get(s,\"seriesIndex\"),m=o.get(s,\"dataIndex\"),V=this.component.legend;if(-1===m)a={value:o.get(l,\"value\"),name:o.get(l,\"name\")},n[h].data.push(a),V&&V.add(a.name,l.style.color||l.style.strokeColor);else{var U=e(\"../util/accMath\");a=n[h].data[m],V&&V.del(a.name),a.name+=this.option.nameConnector+o.get(l,\"name\"),r=o.get(l,\"value\");for(var d=0;d<r.length;d++)a.value[d]=U.accAdd(a.value[d],r[d]);V&&V.add(a.name,l.style.color||l.style.strokeColor)}i.dragIn=i.dragIn||!0,this.isDrop=!1}},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()}},r.inherits(t,i),e(\"../chart\").define(\"radar\",t),t}),i(\"echarts/component/polar\",[\"require\",\"./base\",\"zrender/shape/Text\",\"zrender/shape/Line\",\"zrender/shape/Polygon\",\"zrender/shape/Circle\",\"zrender/shape/Ring\",\"../config\",\"zrender/tool/util\",\"../util/coordinates\",\"../util/accMath\",\"../util/smartSteps\",\"../component\"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e(\"./base\"),n=e(\"zrender/shape/Text\"),a=e(\"zrender/shape/Line\"),o=e(\"zrender/shape/Polygon\"),r=e(\"zrender/shape/Circle\"),s=e(\"zrender/shape/Ring\"),l=e(\"../config\");l.polar={zlevel:0,z:0,center:[\"50%\",\"50%\"],radius:\"75%\",startAngle:90,boundaryGap:[0,0],splitNumber:5,name:{show:!0,textStyle:{color:\"#333\"}},axisLine:{show:!0,lineStyle:{color:\"#ccc\",width:1,type:\"solid\"}},axisLabel:{show:!1,textStyle:{color:\"#333\"}},splitArea:{show:!0,areaStyle:{color:[\"rgba(250,250,250,0.3)\",\"rgba(200,200,200,0.3)\"]}},splitLine:{show:!0,lineStyle:{width:1,color:\"#ccc\"}},type:\"polygon\"};var h=e(\"zrender/tool/util\"),m=e(\"../util/coordinates\");return t.prototype={type:l.COMPONENT_TYPE_POLAR,_buildShape:function(){for(var e=0;e<this.polar.length;e++)this._index=e,this.reformOption(this.polar[e]),this._queryTarget=[this.polar[e],this.option],this._createVector(e),this._buildSpiderWeb(e),this._buildText(e),this._adjustIndicatorValue(e),this._addAxisLabel(e);for(var e=0;e<this.shapeList.length;e++)this.zr.addShape(this.shapeList[e])},_createVector:function(e){for(var t,i=this.polar[e],n=this.deepQuery(this._queryTarget,\"indicator\"),a=n.length,o=i.startAngle,r=2*Math.PI/a,s=this._getRadius(),l=i.__ecIndicator=[],h=0;a>h;h++)t=m.polar2cartesian(s,o*Math.PI/180+r*h),l.push({vector:[t[1],-t[0]]})},_getRadius:function(){var e=this.polar[this._index];return this.parsePercent(e.radius,Math.min(this.zr.getWidth(),this.zr.getHeight())/2)},_buildSpiderWeb:function(e){var t=this.polar[e],i=t.__ecIndicator,n=t.splitArea,a=t.splitLine,o=this.getCenter(e),r=t.splitNumber,s=a.lineStyle.color,l=a.lineStyle.width,h=a.show,m=this.deepQuery(this._queryTarget,\"axisLine\");this._addArea(i,r,o,n,s,l,h),m.show&&this._addLine(i,o,m)},_addAxisLabel:function(t){for(var i,a,o,r,a,s,l,m,V,U,d=e(\"../util/accMath\"),p=this.polar[t],c=this.deepQuery(this._queryTarget,\"indicator\"),u=p.__ecIndicator,y=this.deepQuery(this._queryTarget,\"splitNumber\"),g=this.getCenter(t),b=0;b<c.length;b++)if(i=this.deepQuery([c[b],p,this.option],\"axisLabel\"),i.show){var f=this.deepQuery([i,p,this.option],\"textStyle\"),k=this.deepQuery([i,p],\"formatter\");if(o={},o.textFont=this.getFont(f),o.color=f.color,o=h.merge(o,i),o.lineWidth=o.width,a=u[b].vector,s=u[b].value,m=b/c.length*2*Math.PI,V=i.offset||10,U=i.interval||0,!s)return;for(var x=1;y>=x;x+=U+1)r=h.merge({},o),l=d.accAdd(s.min,d.accMul(s.step,x)),l=\"function\"==typeof k?k(l):\"string\"==typeof k?k.replace(\"{a}\",\"{a0}\").replace(\"{a0}\",l):this.numAddCommas(l),r.text=l,r.x=x*a[0]/y+Math.cos(m)*V+g[0],r.y=x*a[1]/y+Math.sin(m)*V+g[1],this.shapeList.push(new n({zlevel:this.getZlevelBase(),z:this.getZBase(),style:r,draggable:!1,hoverable:!1}))}},_buildText:function(e){for(var t,i,a,o,r,s,l,h=this.polar[e],m=h.__ecIndicator,V=this.deepQuery(this._queryTarget,\"indicator\"),U=this.getCenter(e),d=0,p=0,c=0;c<V.length;c++)o=this.deepQuery([V[c],h,this.option],\"name\"),o.show&&(l=this.deepQuery([o,h,this.option],\"textStyle\"),i={},i.textFont=this.getFont(l),i.color=l.color,i.text=\"function\"==typeof o.formatter?o.formatter.call(this.myChart,V[c].text,c):\"string\"==typeof o.formatter?o.formatter.replace(\"{value}\",V[c].text):V[c].text,m[c].text=i.text,t=m[c].vector,a=Math.round(t[0])>0?\"left\":Math.round(t[0])<0?\"right\":\"center\",null==o.margin?t=this._mapVector(t,U,1.1):(s=o.margin,d=t[0]>0?s:-s,p=t[1]>0?s:-s,d=0===t[0]?0:d,p=0===t[1]?0:p,t=this._mapVector(t,U,1)),i.textAlign=a,i.x=t[0]+d,i.y=t[1]+p,r=o.rotate?[o.rotate/180*Math.PI,t[0],t[1]]:[0,0,0],this.shapeList.push(new n({zlevel:this.getZlevelBase(),z:this.getZBase(),style:i,draggable:!1,hoverable:!1,rotation:r})))},getIndicatorText:function(e,t){return this.polar[e]&&this.polar[e].__ecIndicator[t]&&this.polar[e].__ecIndicator[t].text},getDropBox:function(e){var t,i,e=e||0,n=this.polar[e],a=this.getCenter(e),o=n.__ecIndicator,r=o.length,s=[],l=n.type;if(\"polygon\"==l){for(var h=0;r>h;h++)t=o[h].vector,s.push(this._mapVector(t,a,1.2));i=this._getShape(s,\"fill\",\"rgba(0,0,0,0)\",\"\",1)}else\"circle\"==l&&(i=this._getCircle(\"\",1,1.2,a,\"fill\",\"rgba(0,0,0,0)\"));return i},_addArea:function(e,t,i,n,a,o,r){for(var s,l,h,m,V=this.deepQuery(this._queryTarget,\"type\"),U=0;t>U;U++)l=(t-U)/t,r&&(\"polygon\"==V?(m=this._getPointList(e,l,i),s=this._getShape(m,\"stroke\",\"\",a,o)):\"circle\"==V&&(s=this._getCircle(a,o,l,i,\"stroke\")),this.shapeList.push(s)),n.show&&(h=(t-U-1)/t,this._addSplitArea(e,n,l,h,i,U))},_getCircle:function(e,t,i,n,a,o){var s=this._getRadius();return new r({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:n[0],y:n[1],r:s*i,brushType:a,strokeColor:e,lineWidth:t,color:o},hoverable:!1,draggable:!1})},_getRing:function(e,t,i,n){var a=this._getRadius();return new s({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:n[0],y:n[1],r:t*a,r0:i*a,color:e,brushType:\"fill\"},hoverable:!1,draggable:!1})},_getPointList:function(e,t,i){for(var n,a=[],o=e.length,r=0;o>r;r++)n=e[r].vector,a.push(this._mapVector(n,i,t));return a},_getShape:function(e,t,i,n,a){return new o({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{pointList:e,brushType:t,color:i,strokeColor:n,lineWidth:a},hoverable:!1,draggable:!1})},_addSplitArea:function(e,t,i,n,a,o){var r,s,l,h,m,V=e.length,U=t.areaStyle.color,d=[],V=e.length,p=this.deepQuery(this._queryTarget,\"type\");if(\"string\"==typeof U&&(U=[U]),s=U.length,r=U[o%s],\"polygon\"==p)for(var c=0;V>c;c++)d=[],l=e[c].vector,h=e[(c+1)%V].vector,d.push(this._mapVector(l,a,i)),d.push(this._mapVector(l,a,n)),d.push(this._mapVector(h,a,n)),d.push(this._mapVector(h,a,i)),m=this._getShape(d,\"fill\",r,\"\",1),this.shapeList.push(m);else\"circle\"==p&&(m=this._getRing(r,i,n,a),this.shapeList.push(m))},_mapVector:function(e,t,i){return[e[0]*i+t[0],e[1]*i+t[1]]},getCenter:function(e){var e=e||0;return this.parseCenter(this.zr,this.polar[e].center)},_addLine:function(e,t,i){for(var n,a,o=e.length,r=i.lineStyle,s=r.color,l=r.width,h=r.type,m=0;o>m;m++)a=e[m].vector,n=this._getLine(t[0],t[1],a[0]+t[0],a[1]+t[1],s,l,h),this.shapeList.push(n)},_getLine:function(e,t,i,n,o,r,s){return new a({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{xStart:e,yStart:t,xEnd:i,yEnd:n,strokeColor:o,lineWidth:r,lineType:s},hoverable:!1})},_adjustIndicatorValue:function(t){for(var i,n,a,o=this.polar[t],r=this.deepQuery(this._queryTarget,\"indicator\"),s=r.length,l=o.__ecIndicator,h=this._getSeriesData(t),m=o.boundaryGap,V=o.splitNumber,U=o.scale,d=e(\"../util/smartSteps\"),p=0;s>p;p++){if(\"number\"==typeof r[p].max)i=r[p].max,n=r[p].min||0,a={max:i,min:n};else{var c=this._findValue(h,p,V,m);n=c.min,i=c.max}!U&&n>=0&&i>=0&&(n=0),!U&&0>=n&&0>=i&&(i=0);var u=d(n,i,V,a);l[p].value={min:u.min,max:u.max,step:u.step}}},_getSeriesData:function(e){for(var t,i,n,a=[],o=this.component.legend,r=0;r<this.series.length;r++)if(t=this.series[r],t.type==l.CHART_TYPE_RADAR){i=t.data||[];for(var s=0;s<i.length;s++)n=this.deepQuery([i[s],t,this.option],\"polarIndex\")||0,n!=e||o&&!o.isSelected(i[s].name)||a.push(i[s])}return a},_findValue:function(e,t,i,n){function a(e){(e>o||void 0===o)&&(o=e),(r>e||void 0===r)&&(r=e)}var o,r,s;if(e&&0!==e.length){if(1==e.length&&(r=0),1!=e.length)for(var l=0;l<e.length;l++)a(this.getDataFromOption(e[l].value[t]));else{s=e[0];for(var l=0;l<s.value.length;l++)a(this.getDataFromOption(s.value[l]))}var h=Math.abs(o-r);return r-=Math.abs(h*n[0]),o+=Math.abs(h*n[1]),r===o&&(0===o?o=1:o>0?r=o/i:o/=i),{max:o,min:r}}},getVector:function(e,t,i){e=e||0,t=t||0;var n=this.polar[e].__ecIndicator;if(!(t>=n.length)){var a,o=this.polar[e].__ecIndicator[t],r=this.getCenter(e),s=o.vector,l=o.value.max,h=o.value.min;if(\"undefined\"==typeof i)return r;switch(i){case\"min\":i=h;break;case\"max\":i=l;break;case\"center\":i=(l+h)/2}return a=l!=h?(i-h)/(l-h):.5,this._mapVector(s,r,a)}},isInside:function(e){var t=this.getNearestIndex(e);return t?t.polarIndex:-1},getNearestIndex:function(e){for(var t,i,n,a,o,r,s,l,h,V=0;V<this.polar.length;V++){if(t=this.polar[V],i=this.getCenter(V),e[0]==i[0]&&e[1]==i[1])return{polarIndex:V,valueIndex:0};if(n=this._getRadius(),o=t.startAngle,r=t.indicator,s=r.length,l=2*Math.PI/s,a=m.cartesian2polar(e[0]-i[0],i[1]-e[1]),e[0]-i[0]<0&&(a[1]+=Math.PI),a[1]<0&&(a[1]+=2*Math.PI),h=a[1]-o/180*Math.PI+2*Math.PI,Math.abs(Math.cos(h%(l/2)))*n>a[0])return{polarIndex:V,valueIndex:Math.floor((h+l/2)/l)%s}}},getIndicator:function(e){var e=e||0;return this.polar[e].indicator},refresh:function(e){e&&(this.option=e,this.polar=this.option.polar,this.series=this.option.series),this.clear(),this._buildShape()}},h.inherits(t,i),e(\"../component\").define(\"polar\",t),t}),i(\"echarts/util/coordinates\",[\"require\",\"zrender/tool/math\"],function(e){function t(e,t){return[e*n.sin(t),e*n.cos(t)]}function i(e,t){return[Math.sqrt(e*e+t*t),Math.atan(t/e)]}var n=e(\"zrender/tool/math\");return{polar2cartesian:t,cartesian2polar:i}}),i(\"echarts/chart/chord\",[\"require\",\"./base\",\"zrender/shape/Text\",\"zrender/shape/Line\",\"zrender/shape/Sector\",\"../util/shape/Ribbon\",\"../util/shape/Icon\",\"zrender/shape/BezierCurve\",\"../config\",\"../util/ecData\",\"zrender/tool/util\",\"zrender/tool/vector\",\"../data/Graph\",\"../layout/Chord\",\"../chart\"],function(e){\"use strict\";function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.scaleLineLength=4,this.scaleUnitAngle=4,this.refresh(a)}var i=e(\"./base\"),n=e(\"zrender/shape/Text\"),a=e(\"zrender/shape/Line\"),o=e(\"zrender/shape/Sector\"),r=e(\"../util/shape/Ribbon\"),s=e(\"../util/shape/Icon\"),l=e(\"zrender/shape/BezierCurve\"),h=e(\"../config\");h.chord={zlevel:0,z:2,clickable:!0,radius:[\"65%\",\"75%\"],center:[\"50%\",\"50%\"],padding:2,sort:\"none\",sortSub:\"none\",startAngle:90,clockWise:!0,ribbonType:!0,minRadius:10,maxRadius:20,symbol:\"circle\",showScale:!1,showScaleText:!1,itemStyle:{normal:{borderWidth:0,borderColor:\"#000\",label:{show:!0,rotate:!1,distance:5},chordStyle:{width:1,color:\"black\",borderWidth:1,borderColor:\"#999\",opacity:.5}},emphasis:{borderWidth:0,borderColor:\"#000\",chordStyle:{width:1,color:\"black\",borderWidth:1,borderColor:\"#999\"}}}};var m=e(\"../util/ecData\"),V=e(\"zrender/tool/util\"),U=e(\"zrender/tool/vector\"),d=e(\"../data/Graph\"),p=e(\"../layout/Chord\");return t.prototype={type:h.CHART_TYPE_CHORD,_init:function(){var e=this.series;this.selectedMap={};for(var t={},i={},n=0,a=e.length;a>n;n++)if(e[n].type===this.type){var o=this.isSelected(e[n].name);this.selectedMap[e[n].name]=o,o&&this.buildMark(n),this.reformOption(e[n]),t[e[n].name]=e[n]}for(var n=0,a=e.length;a>n;n++)if(e[n].type===this.type)if(e[n].insertToSerie){var r=t[e[n].insertToSerie];e[n]._referenceSerie=r}else i[e[n].name]=[e[n]];for(var n=0,a=e.length;a>n;n++)if(e[n].type===this.type&&e[n].insertToSerie){for(var s=e[n]._referenceSerie;s&&s._referenceSerie;)s=s._referenceSerie;i[s.name]&&this.selectedMap[e[n].name]&&i[s.name].push(e[n])}for(var l in i)this._buildChords(i[l]);this.addShapeList()},_getNodeCategory:function(e,t){return e.categories&&e.categories[t.category||0]},_getNodeQueryTarget:function(e,t){var i=this._getNodeCategory(e,t);return[t,i,e]},_getEdgeQueryTarget:function(e,t,i){return i=i||\"normal\",[t.itemStyle&&t.itemStyle[i],e.itemStyle[i].chordStyle]},_buildChords:function(e){for(var t=[],i=e[0],n=function(e){return e.layout.size>0},a=function(e){return function(t){return e.getEdge(t.node2,t.node1)}},o=0;o<e.length;o++){var r=e[o];if(this.selectedMap[r.name]){var s;r.matrix?s=this._getSerieGraphFromDataMatrix(r,i):r.links&&(s=this._getSerieGraphFromNodeLinks(r,i)),s.filterNode(n,this),r.ribbonType&&s.filterEdge(a(s)),t.push(s),s.__serie=r}}if(t.length){var l=t[0];if(!i.ribbonType){var h=i.minRadius,m=i.maxRadius,V=1/0,U=-(1/0);l.eachNode(function(e){U=Math.max(e.layout.size,U),V=Math.min(e.layout.size,V)});var d=(m-h)/(U-V);l.eachNode(function(e){var t=this._getNodeQueryTarget(i,e),n=this.query(t,\"symbolSize\");e.layout.size=U===V?n||V:n||(e.layout.size-V)*d+h},this)}var c=new p;c.clockWise=i.clockWise,c.startAngle=i.startAngle*Math.PI/180,c.clockWise||(c.startAngle=-c.startAngle),c.padding=i.padding*Math.PI/180,c.sort=i.sort,c.sortSub=i.sortSub,c.directed=i.ribbonType,c.run(t);var u=this.query(i,\"itemStyle.normal.label.show\");if(i.ribbonType){this._buildSectors(i,0,l,i,t),u&&this._buildLabels(i,0,l,i,t);for(var o=0,y=0;o<e.length;o++)this.selectedMap[e[o].name]&&this._buildRibbons(e,o,t[y++],i);i.showScale&&this._buildScales(i,0,l)}else{this._buildNodeIcons(i,0,l,i,t),u&&this._buildLabels(i,0,l,i,t);for(var o=0,y=0;o<e.length;o++)this.selectedMap[e[o].name]&&this._buildEdgeCurves(e,o,t[y++],i,l)}this._initHoverHandler(e,t)}},_getSerieGraphFromDataMatrix:function(e,t){for(var i=[],n=0,a=[],o=0;o<e.matrix.length;o++)a[o]=e.matrix[o].slice();for(var r=e.data||e.nodes,o=0;o<r.length;o++){var s={},l=r[o];l.rawIndex=o;for(var h in l)\"name\"===h?s.id=l.name:s[h]=l[h];var m=this._getNodeCategory(t,l),V=m?m.name:l.name;if(this.selectedMap[V]=this.isSelected(V),this.selectedMap[V])i.push(s),n++;else{a.splice(n,1);for(var U=0;U<a.length;U++)a[U].splice(n,1)}}var p=d.fromMatrix(i,a,!0);return p.eachNode(function(e){e.layout={size:e.data.outValue},e.rawIndex=e.data.rawIndex}),p.eachEdge(function(e){e.layout={weight:e.data.weight}}),p},_getSerieGraphFromNodeLinks:function(e,t){for(var i=new d(!0),n=e.data||e.nodes,a=0,o=n.length;o>a;a++){var r=n[a];if(r&&!r.ignore){var s=this._getNodeCategory(t,r),l=s?s.name:r.name;if(this.selectedMap[l]=this.isSelected(l),this.selectedMap[l]){var h=i.addNode(r.name,r);h.rawIndex=a}}}for(var a=0,o=e.links.length;o>a;a++){var m=e.links[a],V=m.source,U=m.target;\"number\"==typeof V&&(V=n[V],V&&(V=V.name)),\"number\"==typeof U&&(U=n[U],U&&(U=U.name));var p=i.addEdge(V,U,m);p&&(p.rawIndex=a)}return i.eachNode(function(e){var i=e.data.value;if(null==i)if(i=0,t.ribbonType)for(var n=0;n<e.outEdges.length;n++)i+=e.outEdges[n].data.weight||0;else for(var n=0;n<e.edges.length;n++)i+=e.edges[n].data.weight||0;e.layout={size:i}}),i.eachEdge(function(e){e.layout={weight:null==e.data.weight?1:e.data.weight}}),i},_initHoverHandler:function(e,t){var i=e[0],n=t[0],a=this;n.eachNode(function(e){e.shape.onmouseover=function(){n.eachNode(function(e){e.shape.style.opacity=.1,e.labelShape&&(e.labelShape.style.opacity=.1,e.labelShape.modSelf()),e.shape.modSelf()});for(var i=0;i<t.length;i++)for(var o=0;o<t[i].edges.length;o++){var r=t[i].edges[o],s=a._getEdgeQueryTarget(t[i].__serie,r.data);r.shape.style.opacity=.1*a.deepQuery(s,\"opacity\"),r.shape.modSelf()}e.shape.style.opacity=1,e.labelShape&&(e.labelShape.style.opacity=1);for(var i=0;i<t.length;i++){var l=t[i].getNodeById(e.id);if(l)for(var o=0;o<l.outEdges.length;o++){var r=l.outEdges[o],s=a._getEdgeQueryTarget(t[i].__serie,r.data);r.shape.style.opacity=a.deepQuery(s,\"opacity\");var h=t[0].getNodeById(r.node2.id);h&&(h.shape&&(h.shape.style.opacity=1),h.labelShape&&(h.labelShape.style.opacity=1))}}a.zr.refreshNextFrame()},e.shape.onmouseout=function(){n.eachNode(function(e){e.shape.style.opacity=1,e.labelShape&&(e.labelShape.style.opacity=1,e.labelShape.modSelf()),e.shape.modSelf()});for(var e=0;e<t.length;e++)for(var o=0;o<t[e].edges.length;o++){var r=t[e].edges[o],s=[r.data,i];r.shape.style.opacity=a.deepQuery(s,\"itemStyle.normal.chordStyle.opacity\"),r.shape.modSelf()}a.zr.refreshNextFrame()}})},_buildSectors:function(e,t,i,n){var a=this.parseCenter(this.zr,n.center),r=this.parseRadius(this.zr,n.radius),s=n.clockWise,l=s?1:-1;i.eachNode(function(i){var h=this._getNodeCategory(n,i.data),V=this.getColor(h?h.name:i.id),U=i.layout.startAngle/Math.PI*180*l,d=i.layout.endAngle/Math.PI*180*l,p=new o({zlevel:e.zlevel,z:e.z,style:{x:a[0],y:a[1],r0:r[0],r:r[1],startAngle:U,endAngle:d,brushType:\"fill\",opacity:1,color:V,clockWise:s},clickable:n.clickable,highlightStyle:{brushType:\"fill\"}});p.style.lineWidth=this.deepQuery([i.data,n],\"itemStyle.normal.borderWidth\"),p.highlightStyle.lineWidth=this.deepQuery([i.data,n],\"itemStyle.emphasis.borderWidth\"),p.style.strokeColor=this.deepQuery([i.data,n],\"itemStyle.normal.borderColor\"),p.highlightStyle.strokeColor=this.deepQuery([i.data,n],\"itemStyle.emphasis.borderColor\"),p.style.lineWidth>0&&(p.style.brushType=\"both\"),p.highlightStyle.lineWidth>0&&(p.highlightStyle.brushType=\"both\"),m.pack(p,e,t,i.data,i.rawIndex,i.id,i.category),this.shapeList.push(p),i.shape=p},this)},_buildNodeIcons:function(e,t,i,n){var a=this.parseCenter(this.zr,n.center),o=this.parseRadius(this.zr,n.radius),r=o[1];i.eachNode(function(i){var o=i.layout.startAngle,l=i.layout.endAngle,h=(o+l)/2,V=r*Math.cos(h),U=r*Math.sin(h),d=this._getNodeQueryTarget(n,i.data),p=this._getNodeCategory(n,i.data),c=this.deepQuery(d,\"itemStyle.normal.color\");c||(c=this.getColor(p?p.name:i.id));var u=new s({zlevel:e.zlevel,z:e.z+1,style:{x:-i.layout.size,y:-i.layout.size,width:2*i.layout.size,height:2*i.layout.size,iconType:this.deepQuery(d,\"symbol\"),color:c,brushType:\"both\",lineWidth:this.deepQuery(d,\"itemStyle.normal.borderWidth\"),strokeColor:this.deepQuery(d,\"itemStyle.normal.borderColor\")},highlightStyle:{color:this.deepQuery(d,\"itemStyle.emphasis.color\"),lineWidth:this.deepQuery(d,\"itemStyle.emphasis.borderWidth\"),strokeColor:this.deepQuery(d,\"itemStyle.emphasis.borderColor\")},clickable:n.clickable,position:[V+a[0],U+a[1]]});m.pack(u,e,t,i.data,i.rawIndex,i.id,i.category),this.shapeList.push(u),i.shape=u},this)},_buildLabels:function(e,t,i,a){var o=this.query(a,\"itemStyle.normal.label.rotate\"),r=this.query(a,\"itemStyle.normal.label.distance\"),s=this.parseCenter(this.zr,a.center),l=this.parseRadius(this.zr,a.radius),h=a.clockWise,m=h?1:-1;\n\ni.eachNode(function(t){var i=t.layout.startAngle/Math.PI*180*m,h=t.layout.endAngle/Math.PI*180*m,V=(i*-m+h*-m)/2;V%=360,0>V&&(V+=360);var d=90>=V||V>=270;V=V*Math.PI/180;var p=[Math.cos(V),-Math.sin(V)],c=0;c=a.ribbonType?a.showScaleText?35+r:r:r+t.layout.size;var u=U.scale([],p,l[1]+c);U.add(u,u,s);var y={zlevel:e.zlevel,z:e.z+1,hoverable:!1,style:{text:null==t.data.label?t.id:t.data.label,textAlign:d?\"left\":\"right\"}};o?(y.rotation=d?V:Math.PI+V,y.style.x=d?l[1]+c:-l[1]-c,y.style.y=0,y.position=s.slice()):(y.style.x=u[0],y.style.y=u[1]),y.style.color=this.deepQuery([t.data,a],\"itemStyle.normal.label.textStyle.color\")||\"#000000\",y.style.textFont=this.getFont(this.deepQuery([t.data,a],\"itemStyle.normal.label.textStyle\")),y=new n(y),this.shapeList.push(y),t.labelShape=y},this)},_buildRibbons:function(e,t,i,n){var a=e[t],o=this.parseCenter(this.zr,n.center),s=this.parseRadius(this.zr,n.radius);i.eachEdge(function(l,h){var V,U=i.getEdge(l.node2,l.node1);if(U&&!l.shape){if(U.shape)return void(l.shape=U.shape);var d=l.layout.startAngle/Math.PI*180,p=l.layout.endAngle/Math.PI*180,c=U.layout.startAngle/Math.PI*180,u=U.layout.endAngle/Math.PI*180;V=this.getColor(1===e.length?l.layout.weight<=U.layout.weight?l.node1.id:l.node2.id:a.name);var y,g,b=this._getEdgeQueryTarget(a,l.data),f=this._getEdgeQueryTarget(a,l.data,\"emphasis\"),k=new r({zlevel:a.zlevel,z:a.z,style:{x:o[0],y:o[1],r:s[0],source0:d,source1:p,target0:c,target1:u,brushType:\"both\",opacity:this.deepQuery(b,\"opacity\"),color:V,lineWidth:this.deepQuery(b,\"borderWidth\"),strokeColor:this.deepQuery(b,\"borderColor\"),clockWise:n.clockWise},clickable:n.clickable,highlightStyle:{brushType:\"both\",opacity:this.deepQuery(f,\"opacity\"),lineWidth:this.deepQuery(f,\"borderWidth\"),strokeColor:this.deepQuery(f,\"borderColor\")}});l.layout.weight<=U.layout.weight?(y=U.node1,g=U.node2):(y=l.node1,g=l.node2),m.pack(k,a,t,l.data,null==l.rawIndex?h:l.rawIndex,l.data.name||y.id+\"-\"+g.id,y.id,g.id),this.shapeList.push(k),l.shape=k}},this)},_buildEdgeCurves:function(e,t,i,n,a){var o=e[t],r=this.parseCenter(this.zr,n.center);i.eachEdge(function(e,i){var n=a.getNodeById(e.node1.id),s=a.getNodeById(e.node2.id),h=n.shape,V=s.shape,U=this._getEdgeQueryTarget(o,e.data),d=this._getEdgeQueryTarget(o,e.data,\"emphasis\"),p=new l({zlevel:o.zlevel,z:o.z,style:{xStart:h.position[0],yStart:h.position[1],xEnd:V.position[0],yEnd:V.position[1],cpX1:r[0],cpY1:r[1],lineWidth:this.deepQuery(U,\"width\"),strokeColor:this.deepQuery(U,\"color\"),opacity:this.deepQuery(U,\"opacity\")},highlightStyle:{lineWidth:this.deepQuery(d,\"width\"),strokeColor:this.deepQuery(d,\"color\"),opacity:this.deepQuery(d,\"opacity\")}});m.pack(p,o,t,e.data,null==e.rawIndex?i:e.rawIndex,e.data.name||e.node1.id+\"-\"+e.node2.id,e.node1.id,e.node2.id),this.shapeList.push(p),e.shape=p},this)},_buildScales:function(e,t,i){var o,r,s=e.clockWise,l=this.parseCenter(this.zr,e.center),h=this.parseRadius(this.zr,e.radius),m=s?1:-1,V=0,d=-(1/0);e.showScaleText&&(i.eachNode(function(e){var t=e.data.value;t>d&&(d=t),V+=t}),d>1e10?(o=\"b\",r=1e-9):d>1e7?(o=\"m\",r=1e-6):d>1e4?(o=\"k\",r=.001):(o=\"\",r=1));var p=V/(360-e.padding);i.eachNode(function(t){for(var i=t.layout.startAngle/Math.PI*180,V=t.layout.endAngle/Math.PI*180,d=i;;){if(s&&d>V||!s&&V>d)break;var c=d/180*Math.PI,u=[Math.cos(c),Math.sin(c)],y=U.scale([],u,h[1]+1);U.add(y,y,l);var g=U.scale([],u,h[1]+this.scaleLineLength);U.add(g,g,l);var b=new a({zlevel:e.zlevel,z:e.z-1,hoverable:!1,style:{xStart:y[0],yStart:y[1],xEnd:g[0],yEnd:g[1],lineCap:\"round\",brushType:\"stroke\",strokeColor:\"#666\",lineWidth:1}});this.shapeList.push(b),d+=m*this.scaleUnitAngle}if(e.showScaleText)for(var f=i,k=5*p*this.scaleUnitAngle,x=0;;){if(s&&f>V||!s&&V>f)break;var c=f;c%=360,0>c&&(c+=360);var _=90>=c||c>=270,L=new n({zlevel:e.zlevel,z:e.z-1,hoverable:!1,style:{x:_?h[1]+this.scaleLineLength+4:-h[1]-this.scaleLineLength-4,y:0,text:Math.round(10*x)/10+o,textAlign:_?\"left\":\"right\"},position:l.slice(),rotation:_?[-c/180*Math.PI,0,0]:[-(c+180)/180*Math.PI,0,0]});this.shapeList.push(L),x+=k*r,f+=m*this.scaleUnitAngle*5}},this)},refresh:function(e){if(e&&(this.option=e,this.series=e.series),this.legend=this.component.legend,this.legend)this.getColor=function(e){return this.legend.getColor(e)},this.isSelected=function(e){return this.legend.isSelected(e)};else{var t={},i=0;this.getColor=function(e){return t[e]?t[e]:(t[e]||(t[e]=this.zr.getColor(i++)),t[e])},this.isSelected=function(){return!0}}this.backupShapeList(),this._init()},reformOption:function(e){var t=V.merge;e=t(t(e||{},this.ecTheme.chord),h.chord),e.itemStyle.normal.label.textStyle=this.getTextStyle(e.itemStyle.normal.label.textStyle),this.z=e.z,this.zlevel=e.zlevel}},V.inherits(t,i),e(\"../chart\").define(\"chord\",t),t}),i(\"echarts/util/shape/Ribbon\",[\"require\",\"zrender/shape/Base\",\"zrender/shape/util/PathProxy\",\"zrender/tool/util\",\"zrender/tool/area\"],function(e){function t(e){i.call(this,e),this._pathProxy=new n}var i=e(\"zrender/shape/Base\"),n=e(\"zrender/shape/util/PathProxy\"),a=e(\"zrender/tool/util\"),o=e(\"zrender/tool/area\");return t.prototype={type:\"ribbon\",buildPath:function(e,t){var i=t.clockWise||!1,n=this._pathProxy;n.begin(e);var a=t.x,o=t.y,r=t.r,s=t.source0/180*Math.PI,l=t.source1/180*Math.PI,h=t.target0/180*Math.PI,m=t.target1/180*Math.PI,V=a+Math.cos(s)*r,U=o+Math.sin(s)*r,d=a+Math.cos(l)*r,p=o+Math.sin(l)*r,c=a+Math.cos(h)*r,u=o+Math.sin(h)*r,y=a+Math.cos(m)*r,g=o+Math.sin(m)*r;n.moveTo(V,U),n.arc(a,o,t.r,s,l,!i),n.bezierCurveTo(.7*(a-d)+d,.7*(o-p)+p,.7*(a-c)+c,.7*(o-u)+u,c,u),(t.source0!==t.target0||t.source1!==t.target1)&&(n.arc(a,o,t.r,h,m,!i),n.bezierCurveTo(.7*(a-y)+y,.7*(o-g)+g,.7*(a-V)+V,.7*(o-U)+U,V,U))},getRect:function(e){return e.__rect?e.__rect:(this._pathProxy.isEmpty()||this.buildPath(null,e),this._pathProxy.fastBoundingRect())},isCover:function(e,t){var i=this.getRect(this.style);return e>=i.x&&e<=i.x+i.width&&t>=i.y&&t<=i.y+i.height?o.isInsidePath(this._pathProxy.pathCommands,0,\"fill\",e,t):void 0}},a.inherits(t,i),t}),i(\"echarts/data/Graph\",[\"require\",\"zrender/tool/util\"],function(e){var t=e(\"zrender/tool/util\"),i=function(e){this._directed=e||!1,this.nodes=[],this.edges=[],this._nodesMap={},this._edgesMap={}};i.prototype.isDirected=function(){return this._directed},i.prototype.addNode=function(e,t){if(this._nodesMap[e])return this._nodesMap[e];var n=new i.Node(e,t);return this.nodes.push(n),this._nodesMap[e]=n,n},i.prototype.getNodeById=function(e){return this._nodesMap[e]},i.prototype.addEdge=function(e,t,n){if(\"string\"==typeof e&&(e=this._nodesMap[e]),\"string\"==typeof t&&(t=this._nodesMap[t]),e&&t){var a=e.id+\"-\"+t.id;if(this._edgesMap[a])return this._edgesMap[a];var o=new i.Edge(e,t,n);return this._directed&&(e.outEdges.push(o),t.inEdges.push(o)),e.edges.push(o),e!==t&&t.edges.push(o),this.edges.push(o),this._edgesMap[a]=o,o}},i.prototype.removeEdge=function(e){var i=e.node1,n=e.node2,a=i.id+\"-\"+n.id;this._directed&&(i.outEdges.splice(t.indexOf(i.outEdges,e),1),n.inEdges.splice(t.indexOf(n.inEdges,e),1)),i.edges.splice(t.indexOf(i.edges,e),1),i!==n&&n.edges.splice(t.indexOf(n.edges,e),1),delete this._edgesMap[a],this.edges.splice(t.indexOf(this.edges,e),1)},i.prototype.getEdge=function(e,t){return\"string\"!=typeof e&&(e=e.id),\"string\"!=typeof t&&(t=t.id),this._directed?this._edgesMap[e+\"-\"+t]:this._edgesMap[e+\"-\"+t]||this._edgesMap[t+\"-\"+e]},i.prototype.removeNode=function(e){if(\"string\"!=typeof e||(e=this._nodesMap[e])){delete this._nodesMap[e.id],this.nodes.splice(t.indexOf(this.nodes,e),1);for(var i=0;i<this.edges.length;){var n=this.edges[i];n.node1===e||n.node2===e?this.removeEdge(n):i++}}},i.prototype.filterNode=function(e,t){for(var i=this.nodes.length,n=0;i>n;)e.call(t,this.nodes[n],n)?n++:(this.removeNode(this.nodes[n]),i--)},i.prototype.filterEdge=function(e,t){for(var i=this.edges.length,n=0;i>n;)e.call(t,this.edges[n],n)?n++:(this.removeEdge(this.edges[n]),i--)},i.prototype.eachNode=function(e,t){for(var i=this.nodes.length,n=0;i>n;n++)this.nodes[n]&&e.call(t,this.nodes[n],n)},i.prototype.eachEdge=function(e,t){for(var i=this.edges.length,n=0;i>n;n++)this.edges[n]&&e.call(t,this.edges[n],n)},i.prototype.clear=function(){this.nodes.length=0,this.edges.length=0,this._nodesMap={},this._edgesMap={}},i.prototype.breadthFirstTraverse=function(e,t,i,n){if(\"string\"==typeof t&&(t=this._nodesMap[t]),t){var a=\"edges\";\"out\"===i?a=\"outEdges\":\"in\"===i&&(a=\"inEdges\");for(var o=0;o<this.nodes.length;o++)this.nodes[o].__visited=!1;if(!e.call(n,t,null))for(var r=[t];r.length;)for(var s=r.shift(),l=s[a],o=0;o<l.length;o++){var h=l[o],m=h.node1===s?h.node2:h.node1;if(!m.__visited){if(e.call(m,m,s))return;r.push(m),m.__visited=!0}}}},i.prototype.clone=function(){for(var e=new i(this._directed),t=0;t<this.nodes.length;t++)e.addNode(this.nodes[t].id,this.nodes[t].data);for(var t=0;t<this.edges.length;t++){var n=this.edges[t];e.addEdge(n.node1.id,n.node2.id,n.data)}return e};var n=function(e,t){this.id=e,this.data=t||null,this.inEdges=[],this.outEdges=[],this.edges=[]};n.prototype.degree=function(){return this.edges.length},n.prototype.inDegree=function(){return this.inEdges.length},n.prototype.outDegree=function(){return this.outEdges.length};var a=function(e,t,i){this.node1=e,this.node2=t,this.data=i||null};return i.Node=n,i.Edge=a,i.fromMatrix=function(e,t,n){if(t&&t.length&&t[0].length===t.length&&e.length===t.length){for(var a=t.length,o=new i(n),r=0;a>r;r++){var s=o.addNode(e[r].id,e[r]);s.data.value=0,n&&(s.data.outValue=s.data.inValue=0)}for(var r=0;a>r;r++)for(var l=0;a>l;l++){var h=t[r][l];n&&(o.nodes[r].data.outValue+=h,o.nodes[l].data.inValue+=h),o.nodes[r].data.value+=h,o.nodes[l].data.value+=h}for(var r=0;a>r;r++)for(var l=r;a>l;l++){var h=t[r][l];if(0!==h){var m=o.nodes[r],V=o.nodes[l],U=o.addEdge(m,V,{});if(U.data.weight=h,r!==l&&n&&t[l][r]){var d=o.addEdge(V,m,{});d.data.weight=t[l][r]}}}return o}},i}),i(\"echarts/layout/Chord\",[\"require\"],function(){var e=function(e){e=e||{},this.sort=e.sort||null,this.sortSub=e.sortSub||null,this.padding=.05,this.startAngle=e.startAngle||0,this.clockWise=null==e.clockWise?!1:e.clockWise,this.center=e.center||[0,0],this.directed=!0};e.prototype.run=function(e){e instanceof Array||(e=[e]);var n=e.length;if(n){for(var a=e[0],o=a.nodes.length,r=[],s=0,l=0;o>l;l++){var h=a.nodes[l],m={size:0,subGroups:[],node:h};r.push(m);for(var V=0,U=0;U<e.length;U++){var d=e[U],p=d.getNodeById(h.id);if(p){m.size+=p.layout.size;for(var c=this.directed?p.outEdges:p.edges,u=0;u<c.length;u++){var y=c[u],g=y.layout.weight;m.subGroups.push({weight:g,edge:y,graph:d}),V+=g}}}s+=m.size;for(var b=m.size/V,u=0;u<m.subGroups.length;u++)m.subGroups[u].weight*=b;\"ascending\"===this.sortSub?m.subGroups.sort(t):\"descending\"===this.sort&&(m.subGroups.sort(t),m.subGroups.reverse())}\"ascending\"===this.sort?r.sort(i):\"descending\"===this.sort&&(r.sort(i),r.reverse());for(var b=(2*Math.PI-this.padding*o)/s,f=this.startAngle,k=this.clockWise?1:-1,l=0;o>l;l++){var m=r[l];m.node.layout.startAngle=f,m.node.layout.endAngle=f+k*m.size*b,m.node.layout.subGroups=[];for(var u=0;u<m.subGroups.length;u++){var x=m.subGroups[u];x.edge.layout.startAngle=f,f+=k*x.weight*b,x.edge.layout.endAngle=f}f=m.node.layout.endAngle+k*this.padding}}};var t=function(e,t){return e.weight-t.weight},i=function(e,t){return e.size-t.size};return e}),i(\"echarts/chart/force\",[\"require\",\"./base\",\"../data/Graph\",\"../layout/Force\",\"zrender/shape/Line\",\"zrender/shape/BezierCurve\",\"zrender/shape/Image\",\"../util/shape/Icon\",\"../config\",\"../util/ecData\",\"zrender/tool/util\",\"zrender/config\",\"zrender/tool/vector\",\"../chart\"],function(e){\"use strict\";function t(e,t,o,h,m){var V=this;r.call(this,e,t,o,h,m),this.__nodePositionMap={},this._graph=new s(!0),this._layout=new l,this._layout.onupdate=function(){V._step()},this._steps=1,this.ondragstart=function(){i.apply(V,arguments)},this.ondragend=function(){a.apply(V,arguments)},this.ondrop=function(){},this.shapeHandler.ondragstart=function(){V.isDragstart=!0},this.onmousemove=function(){n.apply(V,arguments)},this.refresh(h)}function i(e){if(this.isDragstart&&e.target){var t=e.target;t.fixed=!0,this.isDragstart=!1,this.zr.on(u.EVENT.MOUSEMOVE,this.onmousemove)}}function n(){this._layout.temperature=.8,this._step()}function a(e,t){if(this.isDragend&&e.target){var i=e.target;i.fixed=!1,t.dragIn=!0,t.needRefresh=!1,this.isDragend=!1,this.zr.un(u.EVENT.MOUSEMOVE,this.onmousemove)}}function o(e,t,i){var n=y.create();return n[0]=(Math.random()-.5)*i+e,n[1]=(Math.random()-.5)*i+t,n}var r=e(\"./base\"),s=e(\"../data/Graph\"),l=e(\"../layout/Force\"),h=e(\"zrender/shape/Line\"),m=e(\"zrender/shape/BezierCurve\"),V=e(\"zrender/shape/Image\"),U=e(\"../util/shape/Icon\"),d=e(\"../config\");d.force={zlevel:1,z:2,center:[\"50%\",\"50%\"],size:\"100%\",preventOverlap:!1,coolDown:.99,minRadius:10,maxRadius:20,ratioScaling:!1,large:!1,useWorker:!1,steps:1,scaling:1,gravity:1,symbol:\"circle\",symbolSize:0,linkSymbol:null,linkSymbolSize:[10,15],draggable:!0,clickable:!0,roam:!1,itemStyle:{normal:{label:{show:!1,position:\"inside\"},nodeStyle:{brushType:\"both\",borderColor:\"#5182ab\",borderWidth:1},linkStyle:{color:\"#5182ab\",width:1,type:\"line\"}},emphasis:{label:{show:!1},nodeStyle:{},linkStyle:{opacity:0}}}};var p=e(\"../util/ecData\"),c=e(\"zrender/tool/util\"),u=e(\"zrender/config\"),y=e(\"zrender/tool/vector\");return t.prototype={constructor:t,type:d.CHART_TYPE_FORCE,_init:function(){this.selectedMap={};var e,t=this.component.legend,i=this.series;this.clear();for(var n=0,a=i.length;a>n;n++){var o=i[n];if(o.type===d.CHART_TYPE_FORCE){if(i[n]=this.reformOption(i[n]),e=i[n].name||\"\",this.selectedMap[e]=t?t.isSelected(e):!0,!this.selectedMap[e])continue;this.buildMark(n),this._initSerie(o,n);break}}this.animationEffect()},_getNodeCategory:function(e,t){return e.categories&&e.categories[t.category||0]},_getNodeQueryTarget:function(e,t,i){i=i||\"normal\";var n=this._getNodeCategory(e,t)||{};return[t.itemStyle&&t.itemStyle[i],n&&n.itemStyle&&n.itemStyle[i],e.itemStyle[i].nodeStyle]},_getEdgeQueryTarget:function(e,t,i){return i=i||\"normal\",[t.itemStyle&&t.itemStyle[i],e.itemStyle[i].linkStyle]},_initSerie:function(e,t){this._temperature=1,e.matrix?this._graph=this._getSerieGraphFromDataMatrix(e):e.links&&(this._graph=this._getSerieGraphFromNodeLinks(e)),this._buildLinkShapes(e,t),this._buildNodeShapes(e,t);var i=e.roam===!0||\"move\"===e.roam,n=e.roam===!0||\"scale\"===e.roam;this.zr.modLayer(this.getZlevelBase(),{panable:i,zoomable:n}),(this.query(\"markPoint.effect.show\")||this.query(\"markLine.effect.show\"))&&this.zr.modLayer(d.EFFECT_ZLEVEL,{panable:i,zoomable:n}),this._initLayout(e),this._step()},_getSerieGraphFromDataMatrix:function(e){for(var t=[],i=0,n=[],a=0;a<e.matrix.length;a++)n[a]=e.matrix[a].slice();for(var o=e.data||e.nodes,a=0;a<o.length;a++){var r={},l=o[a];for(var h in l)\"name\"===h?r.id=l.name:r[h]=l[h];var m=this._getNodeCategory(e,l),V=m?m.name:l.name;if(this.selectedMap[V]=this.isSelected(V),this.selectedMap[V])t.push(r),i++;else{n.splice(i,1);for(var U=0;U<n.length;U++)n[U].splice(i,1)}}var d=s.fromMatrix(t,n,!0);return d.eachNode(function(e,t){e.layout={size:e.data.value,mass:0},e.rawIndex=t}),d.eachEdge(function(e){e.layout={weight:e.data.weight}}),d},_getSerieGraphFromNodeLinks:function(e){for(var t=new s(!0),i=e.data||e.nodes,n=0,a=i.length;a>n;n++){var o=i[n];if(o&&!o.ignore){var r=this._getNodeCategory(e,o),l=r?r.name:o.name;if(this.selectedMap[l]=this.isSelected(l),this.selectedMap[l]){var h=t.addNode(o.name,o);h.rawIndex=n}}}for(var n=0,a=e.links.length;a>n;n++){var m=e.links[n],V=m.source,U=m.target;\"number\"==typeof V&&(V=i[V],V&&(V=V.name)),\"number\"==typeof U&&(U=i[U],U&&(U=U.name));var d=t.addEdge(V,U,m);d&&(d.rawIndex=n)}return t.eachNode(function(e){var t=e.data.value;if(null==t){t=0;for(var i=0;i<e.edges.length;i++)t+=e.edges[i].data.weight||0}e.layout={size:t,mass:0}}),t.eachEdge(function(e){e.layout={weight:null==e.data.weight?1:e.data.weight}}),t},_initLayout:function(e){var t=this._graph,i=t.nodes.length,n=this.query(e,\"minRadius\"),a=this.query(e,\"maxRadius\");this._steps=e.steps||1;var r=this._layout;r.center=this.parseCenter(this.zr,e.center),r.width=this.parsePercent(e.size,this.zr.getWidth()),r.height=this.parsePercent(e.size,this.zr.getHeight()),r.large=e.large,r.scaling=e.scaling,r.ratioScaling=e.ratioScaling,r.gravity=e.gravity,r.temperature=1,r.coolDown=e.coolDown,r.preventNodeEdgeOverlap=e.preventOverlap,r.preventNodeOverlap=e.preventOverlap;for(var s=1/0,l=-(1/0),h=0;i>h;h++){var m=t.nodes[h];l=Math.max(m.layout.size,l),s=Math.min(m.layout.size,s)}for(var V=l-s,h=0;i>h;h++){var m=t.nodes[h];V>0?(m.layout.size=(m.layout.size-s)*(a-n)/V+n,m.layout.mass=m.layout.size/a):(m.layout.size=(a-n)/2,m.layout.mass=.5)}for(var h=0;i>h;h++){var m=t.nodes[h];if(\"undefined\"!=typeof this.__nodePositionMap[m.id])m.layout.position=y.create(),y.copy(m.layout.position,this.__nodePositionMap[m.id]);else if(\"undefined\"!=typeof m.data.initial)m.layout.position=y.create(),y.copy(m.layout.position,m.data.initial);else{var U=this._layout.center,d=Math.min(this._layout.width,this._layout.height);m.layout.position=o(U[0],U[1],.8*d)}var p=m.shape.style,c=m.layout.size;p.width=p.width||2*c,p.height=p.height||2*c,p.x=-p.width/2,p.y=-p.height/2,y.copy(m.shape.position,m.layout.position)}i=t.edges.length,l=-(1/0);for(var h=0;i>h;h++){var u=t.edges[h];u.layout.weight>l&&(l=u.layout.weight)}for(var h=0;i>h;h++){var u=t.edges[h];u.layout.weight/=l}this._layout.init(t,e.useWorker)},_buildNodeShapes:function(e,t){var i=this._graph,n=this.query(e,\"categories\");i.eachNode(function(i){var a=this._getNodeCategory(e,i.data),o=[i.data,a,e],r=this._getNodeQueryTarget(e,i.data),s=this._getNodeQueryTarget(e,i.data,\"emphasis\"),l=new U({style:{x:0,y:0,color:this.deepQuery(r,\"color\"),brushType:\"both\",strokeColor:this.deepQuery(r,\"strokeColor\")||this.deepQuery(r,\"borderColor\"),lineWidth:this.deepQuery(r,\"lineWidth\")||this.deepQuery(r,\"borderWidth\")},highlightStyle:{color:this.deepQuery(s,\"color\"),strokeColor:this.deepQuery(s,\"strokeColor\")||this.deepQuery(s,\"borderColor\"),lineWidth:this.deepQuery(s,\"lineWidth\")||this.deepQuery(s,\"borderWidth\")},clickable:e.clickable,zlevel:this.getZlevelBase(),z:this.getZBase()});l.style.color||(l.style.color=this.getColor(a?a.name:i.id)),l.style.iconType=this.deepQuery(o,\"symbol\");var h=this.deepQuery(o,\"symbolSize\")||0;\"number\"==typeof h&&(h=[h,h]),l.style.width=2*h[0],l.style.height=2*h[1],l.style.iconType.match(\"image\")&&(l.style.image=l.style.iconType.replace(new RegExp(\"^image:\\\\/\\\\/\"),\"\"),l=new V({style:l.style,highlightStyle:l.highlightStyle,clickable:l.clickable,zlevel:this.getZlevelBase(),z:this.getZBase()})),this.deepQuery(o,\"itemStyle.normal.label.show\")&&(l.style.text=null==i.data.label?i.id:i.data.label,l.style.textPosition=this.deepQuery(o,\"itemStyle.normal.label.position\"),l.style.textColor=this.deepQuery(o,\"itemStyle.normal.label.textStyle.color\"),l.style.textFont=this.getFont(this.deepQuery(o,\"itemStyle.normal.label.textStyle\")||{})),this.deepQuery(o,\"itemStyle.emphasis.label.show\")&&(l.highlightStyle.textPosition=this.deepQuery(o,\"itemStyle.emphasis.label.position\"),l.highlightStyle.textColor=this.deepQuery(o,\"itemStyle.emphasis.label.textStyle.color\"),l.highlightStyle.textFont=this.getFont(this.deepQuery(o,\"itemStyle.emphasis.label.textStyle\")||{})),this.deepQuery(o,\"draggable\")&&(this.setCalculable(l),l.dragEnableTime=0,l.draggable=!0,l.ondragstart=this.shapeHandler.ondragstart,l.ondragover=null);var m=\"\";if(\"undefined\"!=typeof i.category){var a=n[i.category];m=a&&a.name||\"\"}p.pack(l,e,t,i.data,i.rawIndex,i.data.name||\"\",i.category),this.shapeList.push(l),this.zr.addShape(l),i.shape=l},this)},_buildLinkShapes:function(e,t){for(var i=this._graph,n=i.edges.length,a=0;n>a;a++){var o=i.edges[a],r=o.data,s=o.node1,l=o.node2,V=i.getEdge(l,s),d=this._getEdgeQueryTarget(e,r),u=this.deepQuery(d,\"type\");e.linkSymbol&&\"none\"!==e.linkSymbol&&(u=\"line\");var y=\"line\"===u?h:m,g=new y({style:{xStart:0,yStart:0,xEnd:0,yEnd:0},clickable:this.query(e,\"clickable\"),highlightStyle:{},zlevel:this.getZlevelBase(),z:this.getZBase()});if(V&&V.shape&&(g.style.offset=4,V.shape.style.offset=4),c.merge(g.style,this.query(e,\"itemStyle.normal.linkStyle\"),!0),c.merge(g.highlightStyle,this.query(e,\"itemStyle.emphasis.linkStyle\"),!0),\"undefined\"!=typeof r.itemStyle&&(r.itemStyle.normal&&c.merge(g.style,r.itemStyle.normal,!0),r.itemStyle.emphasis&&c.merge(g.highlightStyle,r.itemStyle.emphasis,!0)),g.style.lineWidth=g.style.lineWidth||g.style.width,g.style.strokeColor=g.style.strokeColor||g.style.color,g.highlightStyle.lineWidth=g.highlightStyle.lineWidth||g.highlightStyle.width,g.highlightStyle.strokeColor=g.highlightStyle.strokeColor||g.highlightStyle.color,p.pack(g,e,t,o.data,null==o.rawIndex?a:o.rawIndex,o.data.name||s.id+\" - \"+l.id,s.id,l.id),this.shapeList.push(g),this.zr.addShape(g),o.shape=g,e.linkSymbol&&\"none\"!==e.linkSymbol){var b=new U({style:{x:-5,y:0,width:e.linkSymbolSize[0],height:e.linkSymbolSize[1],iconType:e.linkSymbol,brushType:\"fill\",color:g.style.strokeColor},highlightStyle:{brushType:\"fill\"},position:[0,0],rotation:0,zlevel:this.getZlevelBase(),z:this.getZBase()});g._symbolShape=b,this.shapeList.push(b),this.zr.addShape(b)}}},_updateLinkShapes:function(){for(var e=y.create(),t=y.create(),i=y.create(),n=y.create(),a=this._graph.edges,o=0,r=a.length;r>o;o++){var s=a[o],l=s.node1.shape,h=s.node2.shape;y.copy(i,l.position),y.copy(n,h.position);var m=s.shape.style;if(y.sub(e,i,n),y.normalize(e,e),m.offset?(t[0]=e[1],t[1]=-e[0],y.scaleAndAdd(i,i,t,m.offset),y.scaleAndAdd(n,n,t,m.offset)):\"bezier-curve\"===s.shape.type&&(m.cpX1=(i[0]+n[0])/2-(n[1]-i[1])/4,m.cpY1=(i[1]+n[1])/2-(i[0]-n[0])/4),m.xStart=i[0],m.yStart=i[1],m.xEnd=n[0],m.yEnd=n[1],s.shape.modSelf(),s.shape._symbolShape){var V=s.shape._symbolShape;y.copy(V.position,n),y.scaleAndAdd(V.position,V.position,e,h.style.width/2+2);var U=Math.atan2(e[1],e[0]);V.rotation=Math.PI/2-U,V.modSelf()}}},_syncNodePositions:function(){for(var e=this._graph,t=0;t<e.nodes.length;t++){var i=e.nodes[t],n=i.layout.position,a=i.data,o=i.shape,r=o.fixed||a.fixX,s=o.fixed||a.fixY;r===!0?r=1:isNaN(r)&&(r=0),s===!0?s=1:isNaN(s)&&(s=0),o.position[0]+=(n[0]-o.position[0])*(1-r),o.position[1]+=(n[1]-o.position[1])*(1-s),y.copy(n,o.position);var l=a.name;if(l){var h=this.__nodePositionMap[l];h||(h=this.__nodePositionMap[l]=y.create()),y.copy(h,n)}o.modSelf()}},_step:function(){this._syncNodePositions(),this._updateLinkShapes(),this.zr.refreshNextFrame(),this._layout.temperature>.01?this._layout.step(this._steps):this.messageCenter.dispatch(d.EVENT.FORCE_LAYOUT_END,{},{},this.myChart)},refresh:function(e){if(e&&(this.option=e,this.series=this.option.series),this.legend=this.component.legend,this.legend)this.getColor=function(e){return this.legend.getColor(e)},this.isSelected=function(e){return this.legend.isSelected(e)};else{var t={},i=0;this.getColor=function(e){return t[e]?t[e]:(t[e]||(t[e]=this.zr.getColor(i++)),t[e])},this.isSelected=function(){return!0}}this._init()},dispose:function(){this.clear(),this.shapeList=null,this.effectList=null,this._layout.dispose(),this._layout=null,this.__nodePositionMap={}},getPosition:function(){var e=[];return this._graph.eachNode(function(t){t.layout&&e.push({name:t.data.name,position:Array.prototype.slice.call(t.layout.position)})}),e}},c.inherits(t,r),e(\"../chart\").define(\"force\",t),t}),i(\"echarts/layout/Force\",[\"require\",\"./forceLayoutWorker\",\"zrender/tool/vector\"],function(e){function t(){if(\"undefined\"!=typeof Worker&&\"undefined\"!=typeof Blob)try{var e=new Blob([n.getWorkerCode()]);i=window.URL.createObjectURL(e)}catch(t){i=\"\"}return i}var i,n=e(\"./forceLayoutWorker\"),a=e(\"zrender/tool/vector\"),o=window.requestAnimationFrame||window.msRequestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||function(e){setTimeout(e,16)},r=\"undefined\"==typeof Float32Array?Array:Float32Array,s=function(e){\"undefined\"==typeof i&&t(),e=e||{},this.width=e.width||500,this.height=e.height||500,this.center=e.center||[this.width/2,this.height/2],this.ratioScaling=e.ratioScaling||!1,this.scaling=e.scaling||1,this.gravity=\"undefined\"!=typeof e.gravity?e.gravity:1,this.large=e.large||!1,this.preventNodeOverlap=e.preventNodeOverlap||!1,this.preventNodeEdgeOverlap=e.preventNodeEdgeOverlap||!1,this.maxSpeedIncrease=e.maxSpeedIncrease||1,this.onupdate=e.onupdate||function(){},this.temperature=e.temperature||1,this.coolDown=e.coolDown||.99,this._layout=null,this._layoutWorker=null;var n=this,a=this._$onupdate;this._$onupdate=function(e){a.call(n,e)}};return s.prototype.updateConfig=function(){var e=this.width,t=this.height,i=Math.min(e,t),n={center:this.center,width:this.ratioScaling?e:i,height:this.ratioScaling?t:i,scaling:this.scaling||1,gravity:this.gravity||1,barnesHutOptimize:this.large,preventNodeOverlap:this.preventNodeOverlap,preventNodeEdgeOverlap:this.preventNodeEdgeOverlap,maxSpeedIncrease:this.maxSpeedIncrease};if(this._layoutWorker)this._layoutWorker.postMessage({cmd:\"updateConfig\",config:n});else for(var a in n)this._layout[a]=n[a]},s.prototype.init=function(e,t){if(this._layoutWorker&&(this._layoutWorker.terminate(),this._layoutWorker=null),i&&t)try{this._layoutWorker||(this._layoutWorker=new Worker(i),this._layoutWorker.onmessage=this._$onupdate),this._layout=null}catch(a){this._layoutWorker=null,this._layout||(this._layout=new n)}else this._layout||(this._layout=new n);this.temperature=1,this.graph=e;for(var o=e.nodes.length,s=new r(2*o),l=new r(o),h=new r(o),m=0;o>m;m++){var V=e.nodes[m];s[2*m]=V.layout.position[0],s[2*m+1]=V.layout.position[1],l[m]=\"undefined\"==typeof V.layout.mass?1:V.layout.mass,h[m]=\"undefined\"==typeof V.layout.size?1:V.layout.size,V.layout.__index=m}o=e.edges.length;for(var U=new r(2*o),d=new r(o),m=0;o>m;m++){var p=e.edges[m];U[2*m]=p.node1.layout.__index,U[2*m+1]=p.node2.layout.__index,d[m]=p.layout.weight||1}this._layoutWorker?this._layoutWorker.postMessage({cmd:\"init\",nodesPosition:s,nodesMass:l,nodesSize:h,edges:U,edgesWeight:d}):(this._layout.initNodes(s,l,h),this._layout.initEdges(U,d)),this.updateConfig()},s.prototype.step=function(e){var t=this.graph.nodes;if(this._layoutWorker){for(var i=new r(2*t.length),n=0;n<t.length;n++){var s=t[n];i[2*n]=s.layout.position[0],i[2*n+1]=s.layout.position[1]}this._layoutWorker.postMessage(i.buffer,[i.buffer]),this._layoutWorker.postMessage({cmd:\"update\",steps:e,temperature:this.temperature,coolDown:this.coolDown});for(var n=0;e>n;n++)this.temperature*=this.coolDown}else{o(this._$onupdate);for(var n=0;n<t.length;n++){var s=t[n];a.copy(this._layout.nodes[n].position,s.layout.position)}for(var n=0;e>n;n++)this._layout.temperature=this.temperature,this._layout.update(),this.temperature*=this.coolDown}},s.prototype._$onupdate=function(e){if(this._layoutWorker){for(var t=new Float32Array(e.data),i=0;i<this.graph.nodes.length;i++){var n=this.graph.nodes[i];n.layout.position[0]=t[2*i],n.layout.position[1]=t[2*i+1]}this.onupdate&&this.onupdate()}else if(this._layout){for(var i=0;i<this.graph.nodes.length;i++){var n=this.graph.nodes[i];a.copy(n.layout.position,this._layout.nodes[i].position)}this.onupdate&&this.onupdate()}},s.prototype.dispose=function(){this._layoutWorker&&this._layoutWorker.terminate(),this._layoutWorker=null,this._layout=null},s}),i(\"echarts/layout/forceLayoutWorker\",[\"require\",\"zrender/tool/vector\"],function o(e){\"use strict\";function t(){this.subRegions=[],this.nSubRegions=0,this.node=null,this.mass=0,this.centerOfMass=null,this.bbox=new l(4),this.size=0}function i(){this.position=r.create(),this.force=r.create(),this.forcePrev=r.create(),this.speed=r.create(),this.speedPrev=r.create(),this.mass=1,this.inDegree=0,this.outDegree=0}function n(e,t){this.node1=e,this.node2=t,this.weight=1}function a(){this.barnesHutOptimize=!1,this.barnesHutTheta=1.5,this.repulsionByDegree=!1,this.preventNodeOverlap=!1,this.preventNodeEdgeOverlap=!1,this.strongGravity=!0,this.gravity=1,this.scaling=1,this.edgeWeightInfluence=1,this.center=[0,0],this.width=500,this.height=500,this.maxSpeedIncrease=1,this.nodes=[],this.edges=[],this.bbox=new l(4),this._rootRegion=new t,this._rootRegion.centerOfMass=r.create(),this._massArr=null,this._k=0}var r,s=\"undefined\"==typeof window&&\"undefined\"==typeof e;r=s?{create:function(e,t){var i=new Float32Array(2);return i[0]=e||0,i[1]=t||0,i},dist:function(e,t){var i=t[0]-e[0],n=t[1]-e[1];return Math.sqrt(i*i+n*n)},len:function(e){var t=e[0],i=e[1];return Math.sqrt(t*t+i*i)},scaleAndAdd:function(e,t,i,n){return e[0]=t[0]+i[0]*n,e[1]=t[1]+i[1]*n,e},scale:function(e,t,i){return e[0]=t[0]*i,e[1]=t[1]*i,e},add:function(e,t,i){return e[0]=t[0]+i[0],e[1]=t[1]+i[1],e},sub:function(e,t,i){return e[0]=t[0]-i[0],e[1]=t[1]-i[1],e},dot:function(e,t){return e[0]*t[0]+e[1]*t[1]},normalize:function(e,t){var i=t[0],n=t[1],a=i*i+n*n;return a>0&&(a=1/Math.sqrt(a),e[0]=t[0]*a,e[1]=t[1]*a),e},negate:function(e,t){return e[0]=-t[0],e[1]=-t[1],e},copy:function(e,t){return e[0]=t[0],e[1]=t[1],e},set:function(e,t,i){return e[0]=t,e[1]=i,e}}:e(\"zrender/tool/vector\");var l=\"undefined\"==typeof Float32Array?Array:Float32Array;if(t.prototype.beforeUpdate=function(){for(var e=0;e<this.nSubRegions;e++)this.subRegions[e].beforeUpdate();this.mass=0,this.centerOfMass&&(this.centerOfMass[0]=0,this.centerOfMass[1]=0),this.nSubRegions=0,this.node=null},t.prototype.afterUpdate=function(){this.subRegions.length=this.nSubRegions;for(var e=0;e<this.nSubRegions;e++)this.subRegions[e].afterUpdate()},t.prototype.addNode=function(e){if(0===this.nSubRegions){if(null==this.node)return void(this.node=e);this._addNodeToSubRegion(this.node),this.node=null}this._addNodeToSubRegion(e),this._updateCenterOfMass(e)},t.prototype.findSubRegion=function(e,t){for(var i=0;i<this.nSubRegions;i++){var n=this.subRegions[i];if(n.contain(e,t))return n}},t.prototype.contain=function(e,t){return this.bbox[0]<=e&&this.bbox[2]>=e&&this.bbox[1]<=t&&this.bbox[3]>=t},t.prototype.setBBox=function(e,t,i,n){this.bbox[0]=e,this.bbox[1]=t,this.bbox[2]=i,this.bbox[3]=n,this.size=(i-e+n-t)/2},t.prototype._newSubRegion=function(){var e=this.subRegions[this.nSubRegions];return e||(e=new t,this.subRegions[this.nSubRegions]=e),this.nSubRegions++,e},t.prototype._addNodeToSubRegion=function(e){var t=this.findSubRegion(e.position[0],e.position[1]),i=this.bbox;if(!t){var n=(i[0]+i[2])/2,a=(i[1]+i[3])/2,o=(i[2]-i[0])/2,r=(i[3]-i[1])/2,s=e.position[0]>=n?1:0,l=e.position[1]>=a?1:0,t=this._newSubRegion();t.setBBox(s*o+i[0],l*r+i[1],(s+1)*o+i[0],(l+1)*r+i[1])}t.addNode(e)},t.prototype._updateCenterOfMass=function(e){null==this.centerOfMass&&(this.centerOfMass=r.create());var t=this.centerOfMass[0]*this.mass,i=this.centerOfMass[1]*this.mass;t+=e.position[0]*e.mass,i+=e.position[1]*e.mass,this.mass+=e.mass,this.centerOfMass[0]=t/this.mass,this.centerOfMass[1]=i/this.mass},a.prototype.nodeToNodeRepulsionFactor=function(e,t,i){return i*i*e/t},a.prototype.edgeToNodeRepulsionFactor=function(e,t,i){return i*e/t},a.prototype.attractionFactor=function(e,t,i){return e*t/i},a.prototype.initNodes=function(e,t,n){this.temperature=1;var a=e.length/2;this.nodes.length=0;for(var o=\"undefined\"!=typeof n,r=0;a>r;r++){var s=new i;s.position[0]=e[2*r],s.position[1]=e[2*r+1],s.mass=t[r],o&&(s.size=n[r]),this.nodes.push(s)}this._massArr=t,o&&(this._sizeArr=n)},a.prototype.initEdges=function(e,t){var i=e.length/2;this.edges.length=0;for(var a=\"undefined\"!=typeof t,o=0;i>o;o++){var r=e[2*o],s=e[2*o+1],l=this.nodes[r],h=this.nodes[s];if(l&&h){l.outDegree++,h.inDegree++;var m=new n(l,h);a&&(m.weight=t[o]),this.edges.push(m)}}},a.prototype.update=function(){var e=this.nodes.length;if(this.updateBBox(),this._k=.4*this.scaling*Math.sqrt(this.width*this.height/e),this.barnesHutOptimize){this._rootRegion.setBBox(this.bbox[0],this.bbox[1],this.bbox[2],this.bbox[3]),this._rootRegion.beforeUpdate();for(var t=0;e>t;t++)this._rootRegion.addNode(this.nodes[t]);this._rootRegion.afterUpdate()}else{var i=0,n=this._rootRegion.centerOfMass;r.set(n,0,0);for(var t=0;e>t;t++){var a=this.nodes[t];i+=a.mass,r.scaleAndAdd(n,n,a.position,a.mass);\n\n}i>0&&r.scale(n,n,1/i)}this.updateForce(),this.updatePosition()},a.prototype.updateForce=function(){for(var e=this.nodes.length,t=0;e>t;t++){var i=this.nodes[t];r.copy(i.forcePrev,i.force),r.copy(i.speedPrev,i.speed),r.set(i.force,0,0)}this.updateNodeNodeForce(),this.gravity>0&&this.updateGravityForce(),this.updateEdgeForce(),this.preventNodeEdgeOverlap&&this.updateNodeEdgeForce()},a.prototype.updatePosition=function(){for(var e=this.nodes.length,t=r.create(),i=0;e>i;i++){var n=this.nodes[i],a=n.speed;r.scale(n.force,n.force,1/30);var o=r.len(n.force)+.1,s=Math.min(o,500)/o;r.scale(n.force,n.force,s),r.add(a,a,n.force),r.scale(a,a,this.temperature),r.sub(t,a,n.speedPrev);var l=r.len(t);if(l>0){r.scale(t,t,1/l);var h=r.len(n.speedPrev);h>0&&(l=Math.min(l/h,this.maxSpeedIncrease)*h,r.scaleAndAdd(a,n.speedPrev,t,l))}var m=r.len(a),s=Math.min(m,100)/(m+.1);r.scale(a,a,s),r.add(n.position,n.position,a)}},a.prototype.updateNodeNodeForce=function(){for(var e=this.nodes.length,t=0;e>t;t++){var i=this.nodes[t];if(this.barnesHutOptimize)this.applyRegionToNodeRepulsion(this._rootRegion,i);else for(var n=t+1;e>n;n++){var a=this.nodes[n];this.applyNodeToNodeRepulsion(i,a,!1)}}},a.prototype.updateGravityForce=function(){for(var e=0;e<this.nodes.length;e++)this.applyNodeGravity(this.nodes[e])},a.prototype.updateEdgeForce=function(){for(var e=0;e<this.edges.length;e++)this.applyEdgeAttraction(this.edges[e])},a.prototype.updateNodeEdgeForce=function(){for(var e=0;e<this.nodes.length;e++)for(var t=0;t<this.edges.length;t++)this.applyEdgeToNodeRepulsion(this.edges[t],this.nodes[e])},a.prototype.applyRegionToNodeRepulsion=function(){var e=r.create();return function(t,i){if(t.node)this.applyNodeToNodeRepulsion(t.node,i,!0);else{if(0===t.mass&&0===i.mass)return;r.sub(e,i.position,t.centerOfMass);var n=e[0]*e[0]+e[1]*e[1];if(n>this.barnesHutTheta*t.size*t.size){var a=this._k*this._k*(i.mass+t.mass)/(n+1);r.scaleAndAdd(i.force,i.force,e,2*a)}else for(var o=0;o<t.nSubRegions;o++)this.applyRegionToNodeRepulsion(t.subRegions[o],i)}}}(),a.prototype.applyNodeToNodeRepulsion=function(){var e=r.create();return function(t,i,n){if(t!==i&&(0!==t.mass||0!==i.mass)){r.sub(e,t.position,i.position);var a=e[0]*e[0]+e[1]*e[1];if(0!==a){var o,s=t.mass+i.mass,l=Math.sqrt(a);r.scale(e,e,1/l),this.preventNodeOverlap?(l=l-t.size-i.size,l>0?o=this.nodeToNodeRepulsionFactor(s,l,this._k):0>=l&&(o=this._k*this._k*10*s)):o=this.nodeToNodeRepulsionFactor(s,l,this._k),n||r.scaleAndAdd(t.force,t.force,e,2*o),r.scaleAndAdd(i.force,i.force,e,2*-o)}}}}(),a.prototype.applyEdgeAttraction=function(){var e=r.create();return function(t){var i=t.node1,n=t.node2;r.sub(e,i.position,n.position);var a,o=r.len(e);a=0===this.edgeWeightInfluence?1:1==this.edgeWeightInfluence?t.weight:Math.pow(t.weight,this.edgeWeightInfluence);var s;if(!(this.preventOverlap&&(o=o-i.size-n.size,0>=o))){var s=this.attractionFactor(a,o,this._k);r.scaleAndAdd(i.force,i.force,e,-s),r.scaleAndAdd(n.force,n.force,e,s)}}}(),a.prototype.applyNodeGravity=function(){var e=r.create();return function(t){r.sub(e,this.center,t.position),this.width>this.height?e[1]*=this.width/this.height:e[0]*=this.height/this.width;var i=r.len(e)/100;this.strongGravity?r.scaleAndAdd(t.force,t.force,e,i*this.gravity*t.mass):r.scaleAndAdd(t.force,t.force,e,this.gravity*t.mass/(i+1))}}(),a.prototype.applyEdgeToNodeRepulsion=function(){var e=r.create(),t=r.create(),i=r.create();return function(n,a){var o=n.node1,s=n.node2;if(o!==a&&s!==a){r.sub(e,s.position,o.position),r.sub(t,a.position,o.position);var l=r.len(e);r.scale(e,e,1/l);var h=r.dot(e,t);if(!(0>h||h>l)){r.scaleAndAdd(i,o.position,e,h);var m=r.dist(i,a.position)-a.size,V=this.edgeToNodeRepulsionFactor(a.mass,Math.max(m,.1),100);r.sub(e,a.position,i),r.normalize(e,e),r.scaleAndAdd(a.force,a.force,e,V),r.scaleAndAdd(o.force,o.force,e,-V),r.scaleAndAdd(s.force,s.force,e,-V)}}}}(),a.prototype.updateBBox=function(){for(var e=1/0,t=1/0,i=-(1/0),n=-(1/0),a=0;a<this.nodes.length;a++){var o=this.nodes[a].position;e=Math.min(e,o[0]),t=Math.min(t,o[1]),i=Math.max(i,o[0]),n=Math.max(n,o[1])}this.bbox[0]=e,this.bbox[1]=t,this.bbox[2]=i,this.bbox[3]=n},a.getWorkerCode=function(){var e=o.toString();return e.slice(e.indexOf(\"{\")+1,e.lastIndexOf(\"return\"))},s){var h=null;self.onmessage=function(e){if(e.data instanceof ArrayBuffer){if(!h)return;for(var t=new Float32Array(e.data),i=t.length/2,n=0;i>n;n++){var o=h.nodes[n];o.position[0]=t[2*n],o.position[1]=t[2*n+1]}}else switch(e.data.cmd){case\"init\":h||(h=new a),h.initNodes(e.data.nodesPosition,e.data.nodesMass,e.data.nodesSize),h.initEdges(e.data.edges,e.data.edgesWeight);break;case\"updateConfig\":if(h)for(var r in e.data.config)h[r]=e.data.config[r];break;case\"update\":var s=e.data.steps;if(h){var i=h.nodes.length,t=new Float32Array(2*i);h.temperature=e.data.temperature;for(var n=0;s>n;n++)h.update(),h.temperature*=e.data.coolDown;for(var n=0;i>n;n++){var o=h.nodes[n];t[2*n]=o.position[0],t[2*n+1]=o.position[1]}self.postMessage(t.buffer,[t.buffer])}else{var l=new Float32Array;self.postMessage(l.buffer,[l.buffer])}}}}return a}),i(\"echarts/chart/map\",[\"require\",\"./base\",\"zrender/shape/Text\",\"zrender/shape/Path\",\"zrender/shape/Circle\",\"zrender/shape/Rectangle\",\"zrender/shape/Line\",\"zrender/shape/Polygon\",\"zrender/shape/Ellipse\",\"zrender/shape/Image\",\"../component/dataRange\",\"../component/roamController\",\"../layer/heatmap\",\"../config\",\"../util/ecData\",\"zrender/tool/util\",\"zrender/config\",\"zrender/tool/event\",\"../util/mapData/params\",\"../util/mapData/textFixed\",\"../util/mapData/geoCoord\",\"../util/projection/svg\",\"../util/projection/normal\",\"../chart\"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o);var r=this;r._onmousewheel=function(e){return r.__onmousewheel(e)},r._onmousedown=function(e){return r.__onmousedown(e)},r._onmousemove=function(e){return r.__onmousemove(e)},r._onmouseup=function(e){return r.__onmouseup(e)},r._onroamcontroller=function(e){return r.__onroamcontroller(e)},r._ondrhoverlink=function(e){return r.__ondrhoverlink(e)},this._isAlive=!0,this._selectedMode={},this._activeMapType={},this._clickable={},this._hoverable={},this._showLegendSymbol={},this._selected={},this._mapTypeMap={},this._mapDataMap={},this._nameMap={},this._specialArea={},this._refreshDelayTicket,this._mapDataRequireCounter,this._markAnimation=!1,this._hoverLinkMap={},this._roamMap={},this._scaleLimitMap={},this._mx,this._my,this._mousedown,this._justMove,this._curMapType,this.refresh(a),this.zr.on(c.EVENT.MOUSEWHEEL,this._onmousewheel),this.zr.on(c.EVENT.MOUSEDOWN,this._onmousedown),t.bind(U.EVENT.ROAMCONTROLLER,this._onroamcontroller),t.bind(U.EVENT.DATA_RANGE_HOVERLINK,this._ondrhoverlink)}var i=e(\"./base\"),n=e(\"zrender/shape/Text\"),a=e(\"zrender/shape/Path\"),o=e(\"zrender/shape/Circle\"),r=e(\"zrender/shape/Rectangle\"),s=e(\"zrender/shape/Line\"),l=e(\"zrender/shape/Polygon\"),h=e(\"zrender/shape/Ellipse\"),m=e(\"zrender/shape/Image\");e(\"../component/dataRange\"),e(\"../component/roamController\");var V=e(\"../layer/heatmap\"),U=e(\"../config\");U.map={zlevel:0,z:2,mapType:\"china\",showLegendSymbol:!0,dataRangeHoverLink:!0,hoverable:!0,clickable:!0,itemStyle:{normal:{borderColor:\"rgba(0,0,0,0)\",borderWidth:1,areaStyle:{color:\"#ccc\"},label:{show:!1,textStyle:{color:\"rgb(139,69,19)\"}}},emphasis:{borderColor:\"rgba(0,0,0,0)\",borderWidth:1,areaStyle:{color:\"rgba(255,215,0,0.8)\"},label:{show:!1,textStyle:{color:\"rgb(100,0,0)\"}}}}};var d=e(\"../util/ecData\"),p=e(\"zrender/tool/util\"),c=e(\"zrender/config\"),u=e(\"zrender/tool/event\"),y=e(\"../util/mapData/params\").params,g=e(\"../util/mapData/textFixed\"),b=e(\"../util/mapData/geoCoord\");return t.prototype={type:U.CHART_TYPE_MAP,_buildShape:function(){var e=this.series;this.selectedMap={},this._activeMapType={};for(var t,i,n,a,o=this.component.legend,r={},s={},l={},h={},m=0,V=e.length;V>m;m++)if(e[m].type==U.CHART_TYPE_MAP&&(e[m]=this.reformOption(e[m]),i=e[m].mapType,s[i]=s[i]||{},s[i][m]=!0,l[i]=l[i]||e[m].mapValuePrecision,this._scaleLimitMap[i]=this._scaleLimitMap[i]||{},e[m].scaleLimit&&p.merge(this._scaleLimitMap[i],e[m].scaleLimit,!0),this._roamMap[i]=e[m].roam||this._roamMap[i],(null==this._hoverLinkMap[i]||this._hoverLinkMap[i])&&(this._hoverLinkMap[i]=e[m].dataRangeHoverLink),this._nameMap[i]=this._nameMap[i]||{},e[m].nameMap&&p.merge(this._nameMap[i],e[m].nameMap,!0),this._activeMapType[i]=!0,e[m].textFixed&&p.merge(g,e[m].textFixed,!0),e[m].geoCoord&&p.merge(b,e[m].geoCoord,!0),this._selectedMode[i]=this._selectedMode[i]||e[m].selectedMode,(null==this._hoverable[i]||this._hoverable[i])&&(this._hoverable[i]=e[m].hoverable),(null==this._clickable[i]||this._clickable[i])&&(this._clickable[i]=e[m].clickable),(null==this._showLegendSymbol[i]||this._showLegendSymbol[i])&&(this._showLegendSymbol[i]=e[m].showLegendSymbol),h[i]=h[i]||e[m].mapValueCalculation,t=e[m].name,this.selectedMap[t]=o?o.isSelected(t):!0,this.selectedMap[t])){r[i]=r[i]||{},n=e[m].data;for(var d=0,c=n.length;c>d;d++){a=this._nameChange(i,n[d].name),r[i][a]=r[i][a]||{seriesIndex:[],valueMap:{},precision:0};for(var u in n[d])\"value\"!=u?r[i][a][u]=n[d][u]:isNaN(n[d].value)||(null==r[i][a].value&&(r[i][a].value=0),r[i][a].precision=Math.max(this.getPrecision(+n[d].value),r[i][a].precision),r[i][a].value+=+n[d].value,r[i][a].valueMap[m]=+n[d].value);r[i][a].seriesIndex.push(m)}}this._mapDataRequireCounter=0;for(var f in r)this._mapDataRequireCounter++;this._clearSelected(),0===this._mapDataRequireCounter&&(this.clear(),this.zr&&this.zr.delShape(this.lastShapeList),this.lastShapeList=[]);for(var f in r){for(var c in r[f]){\"average\"==h[f]&&(r[f][c].value/=r[f][c].seriesIndex.length);var k=r[f][c].value;null!=k&&(r[f][c].value=k.toFixed(null==l[f]?r[f][c].precision:l[f])-0)}this._mapDataMap[f]=this._mapDataMap[f]||{},this._mapDataMap[f].mapData?this._mapDataCallback(f,r[f],s[f])(this._mapDataMap[f].mapData):y[f.replace(/\\|.*/,\"\")].getGeoJson&&(this._specialArea[f]=y[f.replace(/\\|.*/,\"\")].specialArea||this._specialArea[f],y[f.replace(/\\|.*/,\"\")].getGeoJson(this._mapDataCallback(f,r[f],s[f])))}},_mapDataCallback:function(t,i,n){var a=this;return function(o){a._isAlive&&null!=a._activeMapType[t]&&(-1!=t.indexOf(\"|\")&&(o=a._getSubMapData(t,o)),a._mapDataMap[t].mapData=o,o.firstChild?(a._mapDataMap[t].rate=1,a._mapDataMap[t].projection=e(\"../util/projection/svg\")):(a._mapDataMap[t].rate=.75,a._mapDataMap[t].projection=e(\"../util/projection/normal\")),a._buildMap(t,a._getProjectionData(t,o,n),i,n),a._buildMark(t,n),--a._mapDataRequireCounter<=0&&(a.addShapeList(),a.zr.refreshNextFrame()),a._buildHeatmap(t))}},_clearSelected:function(){for(var e in this._selected)this._activeMapType[this._mapTypeMap[e]]||(delete this._selected[e],delete this._mapTypeMap[e])},_getSubMapData:function(e,t){for(var i=e.replace(/^.*\\|/,\"\"),n=t.features,a=0,o=n.length;o>a;a++)if(n[a].properties&&n[a].properties.name==i){n=n[a],\"United States of America\"==i&&n.geometry.coordinates.length>1&&(n={geometry:{coordinates:n.geometry.coordinates.slice(5,6),type:n.geometry.type},id:n.id,properties:n.properties,type:n.type});break}return{type:\"FeatureCollection\",features:[n]}},_getProjectionData:function(e,t,i){var n,a=this._mapDataMap[e].projection,o=[],r=this._mapDataMap[e].bbox||a.getBbox(t,this._specialArea[e]);n=this._mapDataMap[e].hasRoam?this._mapDataMap[e].transform:this._getTransform(r,i,this._mapDataMap[e].rate);var s,l=this._mapDataMap[e].lastTransform||{scale:{}};n.left!=l.left||n.top!=l.top||n.scale.x!=l.scale.x||n.scale.y!=l.scale.y?(s=a.geoJson2Path(t,n,this._specialArea[e]),l=p.clone(n)):(n=this._mapDataMap[e].transform,s=this._mapDataMap[e].pathArray),this._mapDataMap[e].bbox=r,this._mapDataMap[e].transform=n,this._mapDataMap[e].lastTransform=l,this._mapDataMap[e].pathArray=s;for(var h=[n.left,n.top],m=0,V=s.length;V>m;m++)o.push(this._getSingleProvince(e,s[m],h));if(this._specialArea[e])for(var U in this._specialArea[e])o.push(this._getSpecialProjectionData(e,t,U,this._specialArea[e][U],h));if(\"china\"==e){var d=this.geo2pos(e,b[\"南海诸岛\"]||y[\"南海诸岛\"].textCoord),c=n.scale.x/10.5,u=[32*c+d[0],83*c+d[1]];g[\"南海诸岛\"]&&(u[0]+=g[\"南海诸岛\"][0],u[1]+=g[\"南海诸岛\"][1]),o.push({name:this._nameChange(e,\"南海诸岛\"),path:y[\"南海诸岛\"].getPath(d,c),position:h,textX:u[0],textY:u[1]})}return o},_getSpecialProjectionData:function(t,i,n,a,o){i=this._getSubMapData(\"x|\"+n,i);var r=e(\"../util/projection/normal\"),s=r.getBbox(i),l=this.geo2pos(t,[a.left,a.top]),h=this.geo2pos(t,[a.left+a.width,a.top+a.height]),m=Math.abs(h[0]-l[0]),V=Math.abs(h[1]-l[1]),U=s.width,d=s.height,p=m/.75/U,c=V/d;p>c?(p=.75*c,m=U*p):(c=p,p=.75*c,V=d*c);var u={OffsetLeft:l[0],OffsetTop:l[1],scale:{x:p,y:c}},y=r.geoJson2Path(i,u);return this._getSingleProvince(t,y[0],o)},_getSingleProvince:function(e,t,i){var n,a=t.properties.name,o=g[a]||[0,0];if(b[a])n=this.geo2pos(e,b[a]);else if(t.cp)n=[t.cp[0]+o[0],t.cp[1]+o[1]];else{var r=this._mapDataMap[e].bbox;n=this.geo2pos(e,[r.left+r.width/2,r.top+r.height/2]),n[0]+=o[0],n[1]+=o[1]}return t.name=this._nameChange(e,a),t.position=i,t.textX=n[0],t.textY=n[1],t},_getTransform:function(e,t,i){var n,a,o,r,s,l,h,m=this.series,V=this.zr.getWidth(),U=this.zr.getHeight(),d=Math.round(.02*Math.min(V,U));for(var p in t)n=m[p].mapLocation||{},o=n.x||o,s=n.y||s,l=n.width||l,h=n.height||h;a=this.parsePercent(o,V),a=isNaN(a)?d:a,r=this.parsePercent(s,U),r=isNaN(r)?d:r,l=null==l?V-a-2*d:this.parsePercent(l,V),h=null==h?U-r-2*d:this.parsePercent(h,U);var c=e.width,u=e.height,y=l/i/c,g=h/u;if(y>g?(y=g*i,l=c*y):(g=y,y=g*i,h=u*g),isNaN(o))switch(o=o||\"center\",o+\"\"){case\"center\":a=Math.floor((V-l)/2);break;case\"right\":a=V-l}if(isNaN(s))switch(s=s||\"center\",s+\"\"){case\"center\":r=Math.floor((U-h)/2);break;case\"bottom\":r=U-h}return{left:a,top:r,width:l,height:h,baseScale:1,scale:{x:y,y:g}}},_buildMap:function(e,t,i,m){for(var V,c,u,y,g,b,f,k,x,_,L,W=this.series,X=this.component.legend,v=this.component.dataRange,w=0,K=t.length;K>w;w++){if(k=p.clone(t[w]),x={name:k.name,path:k.path,position:p.clone(k.position)},c=k.name,u=i[c]){g=[u],V=\"\";for(var I=0,J=u.seriesIndex.length;J>I;I++){var C=W[u.seriesIndex[I]];g.push(C),V+=C.name+\" \",X&&this._showLegendSymbol[e]&&X.hasColor(C.name)&&this.shapeList.push(new o({zlevel:C.zlevel,z:C.z+1,position:p.clone(k.position),_mapType:e,style:{x:k.textX+3+7*I,y:k.textY-10,r:3,color:X.getColor(C.name)},hoverable:!1}))}y=u.value}else{u={name:c,value:\"-\"},V=\"\",g=[];for(var S in m)g.push(W[S]);y=\"-\"}switch(this.ecTheme.map&&g.push(this.ecTheme.map),g.push(U.map),b=v&&!isNaN(y)?v.getColor(y):null,k.color=k.color||b||this.getItemStyleColor(this.deepQuery(g,\"itemStyle.normal.color\"),u.seriesIndex,-1,u)||this.deepQuery(g,\"itemStyle.normal.areaStyle.color\"),k.strokeColor=k.strokeColor||this.deepQuery(g,\"itemStyle.normal.borderColor\"),k.lineWidth=k.lineWidth||this.deepQuery(g,\"itemStyle.normal.borderWidth\"),x.color=this.getItemStyleColor(this.deepQuery(g,\"itemStyle.emphasis.color\"),u.seriesIndex,-1,u)||this.deepQuery(g,\"itemStyle.emphasis.areaStyle.color\")||k.color,x.strokeColor=this.deepQuery(g,\"itemStyle.emphasis.borderColor\")||k.strokeColor,x.lineWidth=this.deepQuery(g,\"itemStyle.emphasis.borderWidth\")||k.lineWidth,k.brushType=x.brushType=k.brushType||\"both\",k.lineJoin=x.lineJoin=\"round\",k._name=x._name=c,f=this.deepQuery(g,\"itemStyle.normal.label.textStyle\"),L={zlevel:this.getZlevelBase(),z:this.getZBase()+1,position:p.clone(k.position),_mapType:e,_geo:this.pos2geo(e,[k.textX,k.textY]),style:{brushType:\"fill\",x:k.textX,y:k.textY,text:this.getLabelText(c,y,g,\"normal\"),_name:c,textAlign:\"center\",color:this.deepQuery(g,\"itemStyle.normal.label.show\")?this.deepQuery(g,\"itemStyle.normal.label.textStyle.color\"):\"rgba(0,0,0,0)\",textFont:this.getFont(f)}},L._style=p.clone(L.style),L.highlightStyle=p.clone(L.style),this.deepQuery(g,\"itemStyle.emphasis.label.show\")?(L.highlightStyle.text=this.getLabelText(c,y,g,\"emphasis\"),L.highlightStyle.color=this.deepQuery(g,\"itemStyle.emphasis.label.textStyle.color\")||L.style.color,f=this.deepQuery(g,\"itemStyle.emphasis.label.textStyle\")||f,L.highlightStyle.textFont=this.getFont(f)):L.highlightStyle.color=\"rgba(0,0,0,0)\",_={zlevel:this.getZlevelBase(),z:this.getZBase(),position:p.clone(k.position),style:k,highlightStyle:x,_style:p.clone(k),_mapType:e},null!=k.scale&&(_.scale=p.clone(k.scale)),L=new n(L),_.style.shapeType){case\"rectangle\":_=new r(_);break;case\"line\":_=new s(_);break;case\"circle\":_=new o(_);break;case\"polygon\":_=new l(_);break;case\"ellipse\":_=new h(_);break;default:_=new a(_),_.buildPathArray&&(_.style.pathArray=_.buildPathArray(_.style.path))}(this._selectedMode[e]&&this._selected[c]&&u.selected!==!1||u.selected===!0)&&(L.style=L.highlightStyle,_.style=_.highlightStyle),L.clickable=_.clickable=this._clickable[e]&&(null==u.clickable||u.clickable),this._selectedMode[e]&&(this._selected[c]=null!=this._selected[c]?this._selected[c]:u.selected,this._mapTypeMap[c]=e,(null==u.selectable||u.selectable)&&(_.clickable=L.clickable=!0,_.onclick=L.onclick=this.shapeHandler.onclick)),this._hoverable[e]&&(null==u.hoverable||u.hoverable)?(L.hoverable=_.hoverable=!0,_.hoverConnect=L.id,L.hoverConnect=_.id):L.hoverable=_.hoverable=!1,d.pack(L,{name:V,tooltip:this.deepQuery(g,\"tooltip\")},0,u,0,c),this.shapeList.push(L),d.pack(_,{name:V,tooltip:this.deepQuery(g,\"tooltip\")},0,u,0,c),this.shapeList.push(_)}},_buildMark:function(e,t){this._seriesIndexToMapType=this._seriesIndexToMapType||{},this.markAttachStyle=this.markAttachStyle||{};var i=[this._mapDataMap[e].transform.left,this._mapDataMap[e].transform.top];\"none\"==e&&(i=[0,0]);for(var n in t)this._seriesIndexToMapType[n]=e,this.markAttachStyle[n]={position:i,_mapType:e},this.buildMark(n)},_buildHeatmap:function(e){for(var t=this.series,i=0,n=t.length;n>i;i++)if(t[i].heatmap){var a=t[i].heatmap.data;if(t[i].heatmap.needsTransform===!1){for(var o=[],r=0,s=a.length;s>r;++r)o.push([a[r][3],a[r][4],a[r][2]]);var l=[0,0]}else{var h=t[i].heatmap._geoData;if(void 0===h){t[i].heatmap._geoData=[];for(var r=0,s=a.length;s>r;++r)t[i].heatmap._geoData[r]=a[r];h=t[i].heatmap._geoData}for(var s=a.length,U=0;s>U;++U)a[U]=this.geo2pos(e,[h[U][0],h[U][1]]);var l=[this._mapDataMap[e].transform.left,this._mapDataMap[e].transform.top]}var d=new V(t[i].heatmap),p=d.getCanvas(a[0][3]?o:a,this.zr.getWidth(),this.zr.getHeight()),c=new m({zlevel:this.getZlevelBase(),z:this.getZBase()+1,position:l,scale:[1,1],hoverable:!1,style:{x:0,y:0,image:p,width:p.width,height:p.height}});c.type=\"heatmap\",c._mapType=e,this.shapeList.push(c),this.zr.addShape(c)}},getMarkCoord:function(e,t){return t.geoCoord||b[t.name]?this.geo2pos(this._seriesIndexToMapType[e],t.geoCoord||b[t.name]):[0,0]},getMarkGeo:function(e){return e.geoCoord||b[e.name]},_nameChange:function(e,t){return this._nameMap[e][t]||t},getLabelText:function(e,t,i,n){var a=this.deepQuery(i,\"itemStyle.\"+n+\".label.formatter\");return a?\"function\"==typeof a?a.call(this.myChart,e,t):\"string\"==typeof a?(a=a.replace(\"{a}\",\"{a0}\").replace(\"{b}\",\"{b0}\"),a=a.replace(\"{a0}\",e).replace(\"{b0}\",t)):void 0:e},_findMapTypeByPos:function(e,t){var i,n,a,o,r;for(var s in this._mapDataMap)if(i=this._mapDataMap[s].transform,i&&this._roamMap[s]&&this._activeMapType[s]&&(n=i.left,a=i.top,o=i.width,r=i.height,e>=n&&n+o>=e&&t>=a&&a+r>=t))return s},__onmousewheel:function(e){function t(e,t){for(var i=0;i<e.pointList.length;i++){var n=e.pointList[i];n[0]*=t,n[1]*=t}var a=e.controlPointList;if(a)for(var i=0;i<a.length;i++){var n=a[i];n[0]*=t,n[1]*=t}}function i(e,t){e.xStart*=t,e.yStart*=t,e.xEnd*=t,e.yEnd*=t,null!=e.cpX1&&(e.cpX1*=t,e.cpY1*=t)}if(!(this.shapeList.length<=0)){for(var n=0,a=this.shapeList.length;a>n;n++){var o=this.shapeList[n];if(o.__animating)return}var r,s,l=e.event,h=u.getX(l),m=u.getY(l),V=u.getDelta(l),d=e.mapTypeControl;d||(d={},s=this._findMapTypeByPos(h,m),s&&this._roamMap[s]&&\"move\"!=this._roamMap[s]&&(d[s]=!0));var p=!1;for(s in d)if(d[s]){p=!0;var c=this._mapDataMap[s].transform,y=c.left,g=c.top,b=c.width,f=c.height,k=this.pos2geo(s,[h-y,m-g]);if(V>0){if(r=1.2,null!=this._scaleLimitMap[s].max&&c.baseScale>=this._scaleLimitMap[s].max)continue}else if(r=1/1.2,null!=this._scaleLimitMap[s].min&&c.baseScale<=this._scaleLimitMap[s].min)continue;c.baseScale*=r,c.scale.x*=r,c.scale.y*=r,c.width=b*r,c.height=f*r,this._mapDataMap[s].hasRoam=!0,this._mapDataMap[s].transform=c,k=this.geo2pos(s,k),c.left-=k[0]-(h-y),c.top-=k[1]-(m-g),this._mapDataMap[s].transform=c,this.clearEffectShape(!0);for(var n=0,a=this.shapeList.length;a>n;n++){var o=this.shapeList[n];if(o._mapType==s){var x=o.type,_=o.style;switch(o.position[0]=c.left,o.position[1]=c.top,x){case\"path\":case\"symbol\":case\"circle\":case\"rectangle\":case\"polygon\":case\"line\":case\"ellipse\":case\"heatmap\":o.scale[0]*=r,o.scale[1]*=r;break;case\"mark-line\":i(_,r);break;case\"polyline\":t(_,r);break;case\"shape-bundle\":for(var L=0;L<_.shapeList.length;L++){var W=_.shapeList[L];\"mark-line\"==W.type?i(W.style,r):\"polyline\"==W.type&&t(W.style,r)}break;case\"icon\":case\"image\":k=this.geo2pos(s,o._geo),_.x=_._x=k[0]-_.width/2,_.y=_._y=k[1]-_.height/2;break;default:k=this.geo2pos(s,o._geo),_.x=k[0],_.y=k[1],\"text\"==x&&(o._style.x=o.highlightStyle.x=k[0],o._style.y=o.highlightStyle.y=k[1])}this.zr.modShape(o.id)}}}if(p){u.stop(l),this.zr.refreshNextFrame();var X=this;clearTimeout(this._refreshDelayTicket),this._refreshDelayTicket=setTimeout(function(){X&&X.shapeList&&X.animationEffect()},100),this.messageCenter.dispatch(U.EVENT.MAP_ROAM,e.event,{type:\"scale\"},this.myChart)}}},__onmousedown:function(e){if(!(this.shapeList.length<=0)){var t=e.target;if(!t||!t.draggable){var i=e.event,n=u.getX(i),a=u.getY(i),o=this._findMapTypeByPos(n,a);if(o&&this._roamMap[o]&&\"scale\"!=this._roamMap[o]){this._mousedown=!0,this._mx=n,this._my=a,this._curMapType=o,this.zr.on(c.EVENT.MOUSEUP,this._onmouseup);var r=this;setTimeout(function(){r.zr.on(c.EVENT.MOUSEMOVE,r._onmousemove)},100)}}}},__onmousemove:function(e){if(this._mousedown&&this._isAlive){var t=e.event,i=u.getX(t),n=u.getY(t),a=this._mapDataMap[this._curMapType].transform;a.hasRoam=!0,a.left-=this._mx-i,a.top-=this._my-n,this._mx=i,this._my=n,this._mapDataMap[this._curMapType].transform=a;for(var o=0,r=this.shapeList.length;r>o;o++)this.shapeList[o]._mapType==this._curMapType&&(this.shapeList[o].position[0]=a.left,this.shapeList[o].position[1]=a.top,this.zr.modShape(this.shapeList[o].id));this.messageCenter.dispatch(U.EVENT.MAP_ROAM,e.event,{type:\"move\"},this.myChart),this.clearEffectShape(!0),this.zr.refreshNextFrame(),this._justMove=!0,u.stop(t)}},__onmouseup:function(e){var t=e.event;this._mx=u.getX(t),this._my=u.getY(t),this._mousedown=!1;var i=this;setTimeout(function(){i._justMove&&i.animationEffect(),i._justMove=!1,i.zr.un(c.EVENT.MOUSEMOVE,i._onmousemove),i.zr.un(c.EVENT.MOUSEUP,i._onmouseup)},120)},__onroamcontroller:function(e){var t=e.event;t.zrenderX=this.zr.getWidth()/2,t.zrenderY=this.zr.getHeight()/2;var i=e.mapTypeControl,n=0,a=0,o=e.step;switch(e.roamType){case\"scaleUp\":return t.zrenderDelta=1,void this.__onmousewheel({event:t,mapTypeControl:i});case\"scaleDown\":return t.zrenderDelta=-1,void this.__onmousewheel({event:t,mapTypeControl:i});case\"up\":n=-o;break;case\"down\":n=o;break;case\"left\":a=-o;break;case\"right\":a=o}var r,s;for(s in i)this._mapDataMap[s]&&this._activeMapType[s]&&(r=this._mapDataMap[s].transform,r.hasRoam=!0,r.left-=a,r.top-=n,this._mapDataMap[s].transform=r);for(var l=0,h=this.shapeList.length;h>l;l++)s=this.shapeList[l]._mapType,i[s]&&this._activeMapType[s]&&(r=this._mapDataMap[s].transform,this.shapeList[l].position[0]=r.left,this.shapeList[l].position[1]=r.top,this.zr.modShape(this.shapeList[l].id));this.messageCenter.dispatch(U.EVENT.MAP_ROAM,e.event,{type:\"move\"},this.myChart),this.clearEffectShape(!0),this.zr.refreshNextFrame(),clearTimeout(this.dircetionTimer);var m=this;this.dircetionTimer=setTimeout(function(){m.animationEffect()},150)},__ondrhoverlink:function(e){for(var t,i,n=0,a=this.shapeList.length;a>n;n++)t=this.shapeList[n]._mapType,this._hoverLinkMap[t]&&this._activeMapType[t]&&(i=d.get(this.shapeList[n],\"value\"),null!=i&&i>=e.valueMin&&i<=e.valueMax&&this.zr.addHoverShape(this.shapeList[n]))},onclick:function(e){if(this.isClick&&e.target&&!this._justMove&&\"icon\"!=e.target.type){this.isClick=!1;var t=e.target,i=t.style._name,n=this.shapeList.length,a=t._mapType||\"\";if(\"single\"==this._selectedMode[a])for(var o in this._selected)if(this._selected[o]&&this._mapTypeMap[o]==a){for(var r=0;n>r;r++)this.shapeList[r].style._name==o&&this.shapeList[r]._mapType==a&&(this.shapeList[r].style=this.shapeList[r]._style,this.zr.modShape(this.shapeList[r].id));o!=i&&(this._selected[o]=!1)}this._selected[i]=!this._selected[i];for(var r=0;n>r;r++)this.shapeList[r].style._name==i&&this.shapeList[r]._mapType==a&&(this.shapeList[r].style=this._selected[i]?this.shapeList[r].highlightStyle:this.shapeList[r]._style,this.zr.modShape(this.shapeList[r].id));this.messageCenter.dispatch(U.EVENT.MAP_SELECTED,e.event,{selected:this._selected,target:i},this.myChart),this.zr.refreshNextFrame();var s=this;setTimeout(function(){s.zr.trigger(c.EVENT.MOUSEMOVE,e.event)},100)}},refresh:function(e){e&&(this.option=e,this.series=e.series),this._mapDataRequireCounter>0?this.clear():this.backupShapeList(),this._buildShape(),this.zr.refreshHover()},ondataRange:function(e,t){this.component.dataRange&&(this.refresh(),t.needRefresh=!0)},pos2geo:function(e,t){return this._mapDataMap[e].transform?this._mapDataMap[e].projection.pos2geo(this._mapDataMap[e].transform,t):null},getGeoByPos:function(e,t){if(!this._mapDataMap[e].transform)return null;var i=[this._mapDataMap[e].transform.left,this._mapDataMap[e].transform.top];return t instanceof Array?(t[0]-=i[0],t[1]-=i[1]):(t.x-=i[0],t.y-=i[1]),this.pos2geo(e,t)},geo2pos:function(e,t){return this._mapDataMap[e].transform?this._mapDataMap[e].projection.geo2pos(this._mapDataMap[e].transform,t):null},getPosByGeo:function(e,t){if(!this._mapDataMap[e].transform)return null;var i=this.geo2pos(e,t);return i[0]+=this._mapDataMap[e].transform.left,i[1]+=this._mapDataMap[e].transform.top,i},getMapPosition:function(e){return this._mapDataMap[e].transform?[this._mapDataMap[e].transform.left,this._mapDataMap[e].transform.top]:null},onbeforDispose:function(){this._isAlive=!1,this.zr.un(c.EVENT.MOUSEWHEEL,this._onmousewheel),this.zr.un(c.EVENT.MOUSEDOWN,this._onmousedown),this.messageCenter.unbind(U.EVENT.ROAMCONTROLLER,this._onroamcontroller),this.messageCenter.unbind(U.EVENT.DATA_RANGE_HOVERLINK,this._ondrhoverlink)}},p.inherits(t,i),e(\"../chart\").define(\"map\",t),t}),i(\"zrender/shape/Path\",[\"require\",\"./Base\",\"./util/PathProxy\",\"../tool/util\"],function(e){var t=e(\"./Base\"),i=e(\"./util/PathProxy\"),n=i.PathSegment,a=function(e){return Math.sqrt(e[0]*e[0]+e[1]*e[1])},o=function(e,t){return(e[0]*t[0]+e[1]*t[1])/(a(e)*a(t))},r=function(e,t){return(e[0]*t[1]<e[1]*t[0]?-1:1)*Math.acos(o(e,t))},s=function(e){t.call(this,e)};return s.prototype={type:\"path\",buildPathArray:function(e,t,i){if(!e)return[];t=t||0,i=i||0;var a=e,o=[\"m\",\"M\",\"l\",\"L\",\"v\",\"V\",\"h\",\"H\",\"z\",\"Z\",\"c\",\"C\",\"q\",\"Q\",\"t\",\"T\",\"s\",\"S\",\"a\",\"A\"];a=a.replace(/-/g,\" -\"),a=a.replace(/  /g,\" \"),a=a.replace(/ /g,\",\"),a=a.replace(/,,/g,\",\");var r;for(r=0;r<o.length;r++)a=a.replace(new RegExp(o[r],\"g\"),\"|\"+o[r]);var s=a.split(\"|\"),l=[],h=0,m=0;for(r=1;r<s.length;r++){var V=s[r],U=V.charAt(0);V=V.slice(1),V=V.replace(new RegExp(\"e,-\",\"g\"),\"e-\");var d=V.split(\",\");d.length>0&&\"\"===d[0]&&d.shift();for(var p=0;p<d.length;p++)d[p]=parseFloat(d[p]);for(;d.length>0&&!isNaN(d[0]);){var c,u,y,g,b,f,k,x,_=null,L=[],W=h,X=m;switch(U){case\"l\":h+=d.shift(),m+=d.shift(),_=\"L\",L.push(h,m);break;case\"L\":h=d.shift(),m=d.shift(),L.push(h,m);break;case\"m\":h+=d.shift(),m+=d.shift(),_=\"M\",L.push(h,m),U=\"l\";break;case\"M\":h=d.shift(),m=d.shift(),_=\"M\",L.push(h,m),U=\"L\";break;case\"h\":h+=d.shift(),_=\"L\",L.push(h,m);break;case\"H\":h=d.shift(),_=\"L\",L.push(h,m);break;case\"v\":m+=d.shift(),_=\"L\",L.push(h,m);break;case\"V\":m=d.shift(),_=\"L\",L.push(h,m);break;case\"C\":L.push(d.shift(),d.shift(),d.shift(),d.shift()),h=d.shift(),m=d.shift(),L.push(h,m);break;case\"c\":L.push(h+d.shift(),m+d.shift(),h+d.shift(),m+d.shift()),h+=d.shift(),m+=d.shift(),_=\"C\",L.push(h,m);break;case\"S\":c=h,u=m,y=l[l.length-1],\"C\"===y.command&&(c=h+(h-y.points[2]),u=m+(m-y.points[3])),L.push(c,u,d.shift(),d.shift()),h=d.shift(),m=d.shift(),_=\"C\",L.push(h,m);break;case\"s\":c=h,u=m,y=l[l.length-1],\"C\"===y.command&&(c=h+(h-y.points[2]),u=m+(m-y.points[3])),L.push(c,u,h+d.shift(),m+d.shift()),h+=d.shift(),m+=d.shift(),_=\"C\",L.push(h,m);break;case\"Q\":L.push(d.shift(),d.shift()),h=d.shift(),m=d.shift(),L.push(h,m);break;case\"q\":L.push(h+d.shift(),m+d.shift()),h+=d.shift(),m+=d.shift(),_=\"Q\",L.push(h,m);break;case\"T\":c=h,u=m,y=l[l.length-1],\"Q\"===y.command&&(c=h+(h-y.points[0]),u=m+(m-y.points[1])),h=d.shift(),m=d.shift(),_=\"Q\",L.push(c,u,h,m);break;case\"t\":c=h,u=m,y=l[l.length-1],\"Q\"===y.command&&(c=h+(h-y.points[0]),u=m+(m-y.points[1])),h+=d.shift(),m+=d.shift(),_=\"Q\",L.push(c,u,h,m);break;case\"A\":g=d.shift(),b=d.shift(),f=d.shift(),k=d.shift(),x=d.shift(),W=h,X=m,h=d.shift(),m=d.shift(),_=\"A\",L=this._convertPoint(W,X,h,m,k,x,g,b,f);break;case\"a\":g=d.shift(),b=d.shift(),f=d.shift(),k=d.shift(),x=d.shift(),W=h,X=m,h+=d.shift(),m+=d.shift(),_=\"A\",L=this._convertPoint(W,X,h,m,k,x,g,b,f)}for(var v=0,w=L.length;w>v;v+=2)L[v]+=t,L[v+1]+=i;l.push(new n(_||U,L))}(\"z\"===U||\"Z\"===U)&&l.push(new n(\"z\",[]))}return l},_convertPoint:function(e,t,i,n,a,s,l,h,m){var V=m*(Math.PI/180),U=Math.cos(V)*(e-i)/2+Math.sin(V)*(t-n)/2,d=-1*Math.sin(V)*(e-i)/2+Math.cos(V)*(t-n)/2,p=U*U/(l*l)+d*d/(h*h);p>1&&(l*=Math.sqrt(p),h*=Math.sqrt(p));var c=Math.sqrt((l*l*h*h-l*l*d*d-h*h*U*U)/(l*l*d*d+h*h*U*U));a===s&&(c*=-1),isNaN(c)&&(c=0);var u=c*l*d/h,y=c*-h*U/l,g=(e+i)/2+Math.cos(V)*u-Math.sin(V)*y,b=(t+n)/2+Math.sin(V)*u+Math.cos(V)*y,f=r([1,0],[(U-u)/l,(d-y)/h]),k=[(U-u)/l,(d-y)/h],x=[(-1*U-u)/l,(-1*d-y)/h],_=r(k,x);return o(k,x)<=-1&&(_=Math.PI),o(k,x)>=1&&(_=0),0===s&&_>0&&(_-=2*Math.PI),1===s&&0>_&&(_+=2*Math.PI),[g,b,l,h,f,_,V,s]},buildPath:function(e,t){var i=t.path,n=t.x||0,a=t.y||0;t.pathArray=t.pathArray||this.buildPathArray(i,n,a);for(var o=t.pathArray,r=t.pointList=[],s=[],l=0,h=o.length;h>l;l++){\"M\"==o[l].command.toUpperCase()&&(s.length>0&&r.push(s),s=[]);for(var m=o[l].points,V=0,U=m.length;U>V;V+=2)s.push([m[V],m[V+1]])}s.length>0&&r.push(s);for(var l=0,h=o.length;h>l;l++){var d=o[l].command,m=o[l].points;switch(d){case\"L\":e.lineTo(m[0],m[1]);break;case\"M\":e.moveTo(m[0],m[1]);break;case\"C\":e.bezierCurveTo(m[0],m[1],m[2],m[3],m[4],m[5]);break;case\"Q\":e.quadraticCurveTo(m[0],m[1],m[2],m[3]);break;case\"A\":var p=m[0],c=m[1],u=m[2],y=m[3],g=m[4],b=m[5],f=m[6],k=m[7],x=u>y?u:y,_=u>y?1:u/y,L=u>y?y/u:1;e.translate(p,c),e.rotate(f),e.scale(_,L),e.arc(0,0,x,g,g+b,1-k),e.scale(1/_,1/L),e.rotate(-f),e.translate(-p,-c);break;case\"z\":e.closePath()}}},getRect:function(e){if(e.__rect)return e.__rect;var t;t=\"stroke\"==e.brushType||\"fill\"==e.brushType?e.lineWidth||1:0;for(var i=Number.MAX_VALUE,n=Number.MIN_VALUE,a=Number.MAX_VALUE,o=Number.MIN_VALUE,r=e.x||0,s=e.y||0,l=e.pathArray||this.buildPathArray(e.path),h=0;h<l.length;h++)for(var m=l[h].points,V=0;V<m.length;V++)V%2===0?(m[V]+r<i&&(i=m[V]),m[V]+r>n&&(n=m[V])):(m[V]+s<a&&(a=m[V]),m[V]+s>o&&(o=m[V]));var U;return U=i===Number.MAX_VALUE||n===Number.MIN_VALUE||a===Number.MAX_VALUE||o===Number.MIN_VALUE?{x:0,y:0,width:0,height:0}:{x:Math.round(i-t/2),y:Math.round(a-t/2),width:n-i+t,height:o-a+t},e.__rect=U,U}},e(\"../tool/util\").inherits(s,t),s}),i(\"zrender/shape/Ellipse\",[\"require\",\"./Base\",\"../tool/util\"],function(e){var t=e(\"./Base\"),i=function(e){t.call(this,e)};return i.prototype={type:\"ellipse\",buildPath:function(e,t){var i=.5522848,n=t.x,a=t.y,o=t.a,r=t.b,s=o*i,l=r*i;e.moveTo(n-o,a),e.bezierCurveTo(n-o,a-l,n-s,a-r,n,a-r),e.bezierCurveTo(n+s,a-r,n+o,a-l,n+o,a),e.bezierCurveTo(n+o,a+l,n+s,a+r,n,a+r),e.bezierCurveTo(n-s,a+r,n-o,a+l,n-o,a),e.closePath()},getRect:function(e){if(e.__rect)return e.__rect;var t;return t=\"stroke\"==e.brushType||\"fill\"==e.brushType?e.lineWidth||1:0,e.__rect={x:Math.round(e.x-e.a-t/2),\ny:Math.round(e.y-e.b-t/2),width:2*e.a+t,height:2*e.b+t},e.__rect}},e(\"../tool/util\").inherits(i,t),i}),i(\"echarts/component/roamController\",[\"require\",\"./base\",\"zrender/shape/Rectangle\",\"zrender/shape/Sector\",\"zrender/shape/Circle\",\"../config\",\"zrender/tool/util\",\"zrender/tool/color\",\"zrender/tool/event\",\"../component\"],function(e){function t(e,t,n,a,o){if(this.rcOption={},a.roamController&&a.roamController.show){if(!a.roamController.mapTypeControl)return void console.error(\"option.roamController.mapTypeControl has not been defined.\");i.call(this,e,t,n,a,o),this.rcOption=a.roamController;var r=this;this._drictionMouseDown=function(e){return r.__drictionMouseDown(e)},this._drictionMouseUp=function(e){return r.__drictionMouseUp(e)},this._drictionMouseMove=function(e){return r.__drictionMouseMove(e)},this._drictionMouseOut=function(e){return r.__drictionMouseOut(e)},this._scaleHandler=function(e){return r.__scaleHandler(e)},this.refresh(a)}}var i=e(\"./base\"),n=e(\"zrender/shape/Rectangle\"),a=e(\"zrender/shape/Sector\"),o=e(\"zrender/shape/Circle\"),r=e(\"../config\");r.roamController={zlevel:0,z:4,show:!0,x:\"left\",y:\"top\",width:80,height:120,backgroundColor:\"rgba(0,0,0,0)\",borderColor:\"#ccc\",borderWidth:0,padding:5,handleColor:\"#6495ed\",fillerColor:\"#fff\",step:15,mapTypeControl:null};var s=e(\"zrender/tool/util\"),l=e(\"zrender/tool/color\"),h=e(\"zrender/tool/event\");return t.prototype={type:r.COMPONENT_TYPE_ROAMCONTROLLER,_buildShape:function(){if(this.rcOption.show){this._itemGroupLocation=this._getItemGroupLocation(),this._buildBackground(),this._buildItem();for(var e=0,t=this.shapeList.length;t>e;e++)this.zr.addShape(this.shapeList[e])}},_buildItem:function(){this.shapeList.push(this._getDirectionShape(\"up\")),this.shapeList.push(this._getDirectionShape(\"down\")),this.shapeList.push(this._getDirectionShape(\"left\")),this.shapeList.push(this._getDirectionShape(\"right\")),this.shapeList.push(this._getScaleShape(\"scaleUp\")),this.shapeList.push(this._getScaleShape(\"scaleDown\"))},_getDirectionShape:function(e){var t=this._itemGroupLocation.r,i=this._itemGroupLocation.x+t,n=this._itemGroupLocation.y+t,o={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:i,y:n,r:t,startAngle:-45,endAngle:45,color:this.rcOption.handleColor,text:\">\",textX:i+t/2+4,textY:n-.5,textAlign:\"center\",textBaseline:\"middle\",textPosition:\"specific\",textColor:this.rcOption.fillerColor,textFont:Math.floor(t/2)+\"px arial\"},highlightStyle:{color:l.lift(this.rcOption.handleColor,-.2),brushType:\"fill\"},clickable:!0};switch(e){case\"up\":o.rotation=[Math.PI/2,i,n];break;case\"left\":o.rotation=[Math.PI,i,n];break;case\"down\":o.rotation=[-Math.PI/2,i,n]}return o=new a(o),o._roamType=e,o.onmousedown=this._drictionMouseDown,o.onmouseup=this._drictionMouseUp,o.onmousemove=this._drictionMouseMove,o.onmouseout=this._drictionMouseOut,o},_getScaleShape:function(e){var t=this._itemGroupLocation.width,i=this._itemGroupLocation.height-t;i=0>i?20:i;var n=Math.min(t/2-5,i)/2,a=this._itemGroupLocation.x+(\"scaleDown\"===e?t-n:n),r=this._itemGroupLocation.y+this._itemGroupLocation.height-n,s={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:a,y:r,r:n,color:this.rcOption.handleColor,text:\"scaleDown\"===e?\"-\":\"+\",textX:a,textY:r-2,textAlign:\"center\",textBaseline:\"middle\",textPosition:\"specific\",textColor:this.rcOption.fillerColor,textFont:Math.floor(n)+\"px verdana\"},highlightStyle:{color:l.lift(this.rcOption.handleColor,-.2),brushType:\"fill\"},clickable:!0};return s=new o(s),s._roamType=e,s.onmousedown=this._scaleHandler,s},_buildBackground:function(){var e=this.reformCssArray(this.rcOption.padding);this.shapeList.push(new n({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._itemGroupLocation.x-e[3],y:this._itemGroupLocation.y-e[0],width:this._itemGroupLocation.width+e[3]+e[1],height:this._itemGroupLocation.height+e[0]+e[2],brushType:0===this.rcOption.borderWidth?\"fill\":\"both\",color:this.rcOption.backgroundColor,strokeColor:this.rcOption.borderColor,lineWidth:this.rcOption.borderWidth}}))},_getItemGroupLocation:function(){var e,t=this.reformCssArray(this.rcOption.padding),i=this.rcOption.width,n=this.rcOption.height,a=this.zr.getWidth(),o=this.zr.getHeight();switch(this.rcOption.x){case\"center\":e=Math.floor((a-i)/2);break;case\"left\":e=t[3]+this.rcOption.borderWidth;break;case\"right\":e=a-i-t[1]-t[3]-2*this.rcOption.borderWidth;break;default:e=this.parsePercent(this.rcOption.x,a)}var r;switch(this.rcOption.y){case\"top\":r=t[0]+this.rcOption.borderWidth;break;case\"bottom\":r=o-n-t[0]-t[2]-2*this.rcOption.borderWidth;break;case\"center\":r=Math.floor((o-n)/2);break;default:r=this.parsePercent(this.rcOption.y,o)}return{x:e,y:r,r:i/2,width:i,height:n}},__drictionMouseDown:function(e){this.mousedown=!0,this._drictionHandlerOn(e)},__drictionMouseUp:function(e){this.mousedown=!1,this._drictionHandlerOff(e)},__drictionMouseMove:function(e){this.mousedown&&this._drictionHandlerOn(e)},__drictionMouseOut:function(e){this._drictionHandlerOff(e)},_drictionHandlerOn:function(e){this._dispatchEvent(e.event,e.target._roamType),clearInterval(this.dircetionTimer);var t=this;this.dircetionTimer=setInterval(function(){t._dispatchEvent(e.event,e.target._roamType)},100),h.stop(e.event)},_drictionHandlerOff:function(){clearInterval(this.dircetionTimer)},__scaleHandler:function(e){this._dispatchEvent(e.event,e.target._roamType),h.stop(e.event)},_dispatchEvent:function(e,t){this.messageCenter.dispatch(r.EVENT.ROAMCONTROLLER,e,{roamType:t,mapTypeControl:this.rcOption.mapTypeControl,step:this.rcOption.step},this.myChart)},refresh:function(e){e&&(this.option=e||this.option,this.option.roamController=this.reformOption(this.option.roamController),this.rcOption=this.option.roamController),this.clear(),this._buildShape()}},s.inherits(t,i),e(\"../component\").define(\"roamController\",t),t}),i(\"echarts/layer/heatmap\",[\"require\"],function(){function e(e){if(this.option=e,e)for(var i in t)this.option[i]=void 0!==e[i]?e[i]:t[i];else this.option=t}var t={blurSize:30,gradientColors:[\"blue\",\"cyan\",\"lime\",\"yellow\",\"red\"],minAlpha:.05,valueScale:1,opacity:1},i=20,n=256;return e.prototype={getCanvas:function(e,t,a){var o=this._getBrush(),r=this._getGradient(),s=i+this.option.blurSize,l=document.createElement(\"canvas\");l.width=t,l.height=a;for(var h=l.getContext(\"2d\"),m=e.length,V=0;m>V;++V){var U=e[V],d=U[0],p=U[1],c=U[2],u=Math.min(1,Math.max(c*this.option.valueScale||this.option.minAlpha,this.option.minAlpha));h.globalAlpha=u,h.drawImage(o,d-s,p-s)}for(var y=h.getImageData(0,0,l.width,l.height),g=y.data,m=g.length/4;m--;){var b=4*m+3,u=g[b]/256,f=Math.floor(u*(n-1));g[b-3]=r[4*f],g[b-2]=r[4*f+1],g[b-1]=r[4*f+2],g[b]*=this.option.opacity}return h.putImageData(y,0,0),l},_getBrush:function(){if(!this._brushCanvas){this._brushCanvas=document.createElement(\"canvas\");var e=i+this.option.blurSize,t=2*e;this._brushCanvas.width=t,this._brushCanvas.height=t;var n=this._brushCanvas.getContext(\"2d\");n.shadowOffsetX=t,n.shadowBlur=this.option.blurSize,n.shadowColor=\"black\",n.beginPath(),n.arc(-e,e,i,0,2*Math.PI,!0),n.closePath(),n.fill()}return this._brushCanvas},_getGradient:function(){if(!this._gradientPixels){var e=n,t=document.createElement(\"canvas\");t.width=1,t.height=e;for(var i=t.getContext(\"2d\"),a=i.createLinearGradient(0,0,0,e),o=this.option.gradientColors.length,r=0;o>r;++r)\"string\"==typeof this.option.gradientColors[r]?a.addColorStop((r+1)/o,this.option.gradientColors[r]):a.addColorStop(this.option.gradientColors[r].offset,this.option.gradientColors[r].color);i.fillStyle=a,i.fillRect(0,0,1,e),this._gradientPixels=i.getImageData(0,0,1,e).data}return this._gradientPixels}},e}),i(\"echarts/util/mapData/params\",[\"require\"],function(e){function t(e){if(!e.UTF8Encoding)return e;for(var t=e.features,n=0;n<t.length;n++)for(var a=t[n],o=a.geometry.coordinates,r=a.geometry.encodeOffsets,s=0;s<o.length;s++){var l=o[s];if(\"Polygon\"===a.geometry.type)o[s]=i(l,r[s]);else if(\"MultiPolygon\"===a.geometry.type)for(var h=0;h<l.length;h++){var m=l[h];l[h]=i(m,r[s][h])}}return e.UTF8Encoding=!1,e}function i(e,t){for(var i=[],n=t[0],a=t[1],o=0;o<e.length;o+=2){var r=e.charCodeAt(o)-64,s=e.charCodeAt(o+1)-64;r=r>>1^-(1&r),s=s>>1^-(1&s),r+=n,s+=a,n=r,a=s,i.push([r/1024,s/1024])}return i}var n={none:{getGeoJson:function(e){e({type:\"FeatureCollection\",features:[{type:\"Feature\",geometry:{coordinates:[],encodeOffsets:[],type:\"Polygon\"},properties:{}}]})}},world:{getGeoJson:function(i){e([\"./geoJson/world_geo\"],function(e){i(t(e))})}},china:{getGeoJson:function(i){e([\"./geoJson/china_geo\"],function(e){i(t(e))})}},\"南海诸岛\":{textCoord:[126,25],getPath:function(e,t){for(var i=[[[0,3.5],[7,11.2],[15,11.9],[30,7],[42,.7],[52,.7],[56,7.7],[59,.7],[64,.7],[64,0],[5,0],[0,3.5]],[[13,16.1],[19,14.7],[16,21.7],[11,23.1],[13,16.1]],[[12,32.2],[14,38.5],[15,38.5],[13,32.2],[12,32.2]],[[16,47.6],[12,53.2],[13,53.2],[18,47.6],[16,47.6]],[[6,64.4],[8,70],[9,70],[8,64.4],[6,64.4]],[[23,82.6],[29,79.8],[30,79.8],[25,82.6],[23,82.6]],[[37,70.7],[43,62.3],[44,62.3],[39,70.7],[37,70.7]],[[48,51.1],[51,45.5],[53,45.5],[50,51.1],[48,51.1]],[[51,35],[51,28.7],[53,28.7],[53,35],[51,35]],[[52,22.4],[55,17.5],[56,17.5],[53,22.4],[52,22.4]],[[58,12.6],[62,7],[63,7],[60,12.6],[58,12.6]],[[0,3.5],[0,93.1],[64,93.1],[64,0],[63,0],[63,92.4],[1,92.4],[1,3.5],[0,3.5]]],n=\"\",a=e[0],o=e[1],r=0,s=i.length;s>r;r++){n+=\"M \"+((i[r][0][0]*t+a).toFixed(2)-0)+\" \"+((i[r][0][1]*t+o).toFixed(2)-0)+\" \";for(var l=1,h=i[r].length;h>l;l++)n+=\"L \"+((i[r][l][0]*t+a).toFixed(2)-0)+\" \"+((i[r][l][1]*t+o).toFixed(2)-0)+\" \"}return n+\" Z\"}},\"新疆\":{getGeoJson:function(i){e([\"./geoJson/xin_jiang_geo\"],function(e){i(t(e))})}},\"西藏\":{getGeoJson:function(i){e([\"./geoJson/xi_zang_geo\"],function(e){i(t(e))})}},\"内蒙古\":{getGeoJson:function(i){e([\"./geoJson/nei_meng_gu_geo\"],function(e){i(t(e))})}},\"青海\":{getGeoJson:function(i){e([\"./geoJson/qing_hai_geo\"],function(e){i(t(e))})}},\"四川\":{getGeoJson:function(i){e([\"./geoJson/si_chuan_geo\"],function(e){i(t(e))})}},\"黑龙江\":{getGeoJson:function(i){e([\"./geoJson/hei_long_jiang_geo\"],function(e){i(t(e))})}},\"甘肃\":{getGeoJson:function(i){e([\"./geoJson/gan_su_geo\"],function(e){i(t(e))})}},\"云南\":{getGeoJson:function(i){e([\"./geoJson/yun_nan_geo\"],function(e){i(t(e))})}},\"广西\":{getGeoJson:function(i){e([\"./geoJson/guang_xi_geo\"],function(e){i(t(e))})}},\"湖南\":{getGeoJson:function(i){e([\"./geoJson/hu_nan_geo\"],function(e){i(t(e))})}},\"陕西\":{getGeoJson:function(i){e([\"./geoJson/shan_xi_1_geo\"],function(e){i(t(e))})}},\"广东\":{getGeoJson:function(i){e([\"./geoJson/guang_dong_geo\"],function(e){i(t(e))})}},\"吉林\":{getGeoJson:function(i){e([\"./geoJson/ji_lin_geo\"],function(e){i(t(e))})}},\"河北\":{getGeoJson:function(i){e([\"./geoJson/he_bei_geo\"],function(e){i(t(e))})}},\"湖北\":{getGeoJson:function(i){e([\"./geoJson/hu_bei_geo\"],function(e){i(t(e))})}},\"贵州\":{getGeoJson:function(i){e([\"./geoJson/gui_zhou_geo\"],function(e){i(t(e))})}},\"山东\":{getGeoJson:function(i){e([\"./geoJson/shan_dong_geo\"],function(e){i(t(e))})}},\"江西\":{getGeoJson:function(i){e([\"./geoJson/jiang_xi_geo\"],function(e){i(t(e))})}},\"河南\":{getGeoJson:function(i){e([\"./geoJson/he_nan_geo\"],function(e){i(t(e))})}},\"辽宁\":{getGeoJson:function(i){e([\"./geoJson/liao_ning_geo\"],function(e){i(t(e))})}},\"山西\":{getGeoJson:function(i){e([\"./geoJson/shan_xi_2_geo\"],function(e){i(t(e))})}},\"安徽\":{getGeoJson:function(i){e([\"./geoJson/an_hui_geo\"],function(e){i(t(e))})}},\"福建\":{getGeoJson:function(i){e([\"./geoJson/fu_jian_geo\"],function(e){i(t(e))})}},\"浙江\":{getGeoJson:function(i){e([\"./geoJson/zhe_jiang_geo\"],function(e){i(t(e))})}},\"江苏\":{getGeoJson:function(i){e([\"./geoJson/jiang_su_geo\"],function(e){i(t(e))})}},\"重庆\":{getGeoJson:function(i){e([\"./geoJson/chong_qing_geo\"],function(e){i(t(e))})}},\"宁夏\":{getGeoJson:function(i){e([\"./geoJson/ning_xia_geo\"],function(e){i(t(e))})}},\"海南\":{getGeoJson:function(i){e([\"./geoJson/hai_nan_geo\"],function(e){i(t(e))})}},\"台湾\":{getGeoJson:function(i){e([\"./geoJson/tai_wan_geo\"],function(e){i(t(e))})}},\"北京\":{getGeoJson:function(i){e([\"./geoJson/bei_jing_geo\"],function(e){i(t(e))})}},\"天津\":{getGeoJson:function(i){e([\"./geoJson/tian_jin_geo\"],function(e){i(t(e))})}},\"上海\":{getGeoJson:function(i){e([\"./geoJson/shang_hai_geo\"],function(e){i(t(e))})}},\"香港\":{getGeoJson:function(i){e([\"./geoJson/xiang_gang_geo\"],function(e){i(t(e))})}},\"澳门\":{getGeoJson:function(i){e([\"./geoJson/ao_men_geo\"],function(e){i(t(e))})}}};return{decode:t,params:n}}),i(\"echarts/util/mapData/textFixed\",[],function(){return{\"广东\":[0,-10],\"香港\":[10,10],\"澳门\":[-10,18],\"黑龙江\":[0,20],\"天津\":[5,5],\"深圳市\":[-35,0],\"红河哈尼族彝族自治州\":[0,20],\"楚雄彝族自治州\":[-5,15],\"石河子市\":[-5,5],\"五家渠市\":[0,-10],\"昌吉回族自治州\":[10,10],\"昌江黎族自治县\":[0,20],\"陵水黎族自治县\":[0,20],\"东方市\":[0,20],\"渭南市\":[0,20]}}),i(\"echarts/util/mapData/geoCoord\",[],function(){return{Russia:[100,60],\"United States of America\":[-99,38]}}),i(\"echarts/util/projection/svg\",[\"require\",\"zrender/shape/Path\"],function(e){function t(e){return parseFloat(e||0)}function i(e){for(var i=e.firstChild;\"svg\"!=i.nodeName.toLowerCase()||1!=i.nodeType;)i=i.nextSibling;var n=t(i.getAttribute(\"x\")),a=t(i.getAttribute(\"y\")),o=t(i.getAttribute(\"width\")),r=t(i.getAttribute(\"height\"));return{left:n,top:a,width:o,height:r}}function n(e,t){function i(e){var t=e.tagName;if(m[t]){var o=m[t](e,n);o&&(o.scale=n,o.properties={name:e.getAttribute(\"name\")||\"\"},o.id=e.id,s(o,e),a.push(o))}for(var r=e.childNodes,l=0,h=r.length;h>l;l++)i(r[l])}var n=[t.scale.x,t.scale.y],a=[];return i(e),a}function a(e,t){var i=t instanceof Array?[1*t[0],1*t[1]]:[1*t.x,1*t.y];return[i[0]/e.scale.x,i[1]/e.scale.y]}function o(e,t){var i=t instanceof Array?[1*t[0],1*t[1]]:[1*t.x,1*t.y];return[i[0]*e.scale.x,i[1]*e.scale.y]}function r(e){return e.replace(/^\\s\\s*/,\"\").replace(/\\s\\s*$/,\"\")}function s(e,t){var i=t.getAttribute(\"fill\"),n=t.getAttribute(\"stroke\"),a=t.getAttribute(\"stroke-width\"),o=t.getAttribute(\"opacity\");i&&\"none\"!=i?(e.color=i,n?(e.brushType=\"both\",e.strokeColor=n):e.brushType=\"fill\"):n&&\"none\"!=n&&(e.strokeColor=n,e.brushType=\"stroke\"),a&&\"none\"!=a&&(e.lineWidth=parseFloat(a)),o&&\"none\"!=o&&(e.opacity=parseFloat(o))}function l(e){for(var t=r(e).replace(/,/g,\" \").split(/\\s+/),i=[],n=0;n<t.length;){var a=parseFloat(t[n++]),o=parseFloat(t[n++]);i.push([a,o])}return i}var h=e(\"zrender/shape/Path\"),m={path:function(e,t){var i=e.getAttribute(\"d\"),n=h.prototype.getRect({path:i});return{shapeType:\"path\",path:i,cp:[(n.x+n.width/2)*t[0],(n.y+n.height/2)*t[1]]}},rect:function(e,i){var n=t(e.getAttribute(\"x\")),a=t(e.getAttribute(\"y\")),o=t(e.getAttribute(\"width\")),r=t(e.getAttribute(\"height\"));return{shapeType:\"rectangle\",x:n,y:a,width:o,height:r,cp:[(n+o/2)*i[0],(a+r/2)*i[1]]}},line:function(e,i){var n=t(e.getAttribute(\"x1\")),a=t(e.getAttribute(\"y1\")),o=t(e.getAttribute(\"x2\")),r=t(e.getAttribute(\"y2\"));return{shapeType:\"line\",xStart:n,yStart:a,xEnd:o,yEnd:r,cp:[.5*(n+o)*i[0],.5*(a+r)*i[1]]}},circle:function(e,i){var n=t(e.getAttribute(\"cx\")),a=t(e.getAttribute(\"cy\")),o=t(e.getAttribute(\"r\"));return{shapeType:\"circle\",x:n,y:a,r:o,cp:[n*i[0],a*i[1]]}},ellipse:function(e,t){var i=parseFloat(e.getAttribute(\"cx\")||0),n=parseFloat(e.getAttribute(\"cy\")||0),a=parseFloat(e.getAttribute(\"rx\")||0),o=parseFloat(e.getAttribute(\"ry\")||0);return{shapeType:\"ellipse\",x:i,y:n,a:a,b:o,cp:[i*t[0],n*t[1]]}},polygon:function(e,t){var i=e.getAttribute(\"points\"),n=[1/0,1/0],a=[-(1/0),-(1/0)];if(i){i=l(i);for(var o=0;o<i.length;o++){var r=i[o];n[0]=Math.min(r[0],n[0]),n[1]=Math.min(r[1],n[1]),a[0]=Math.max(r[0],a[0]),a[1]=Math.max(r[1],a[1])}return{shapeType:\"polygon\",pointList:i,cp:[(n[0]+a[0])/2*t[0],(n[1]+a[1])/2*t[0]]}}},polyline:function(e,t){var i=m.polygon(e,t);return i}};return{getBbox:i,geoJson2Path:n,pos2geo:a,geo2pos:o}}),i(\"echarts/util/projection/normal\",[],function(){function e(e,i){return i=i||{},e.srcSize||t(e,i),e.srcSize}function t(e,t){t=t||{},r.xmin=360,r.xmax=-360,r.ymin=180,r.ymax=-180;for(var i,n,a=e.features,o=0,s=a.length;s>o;o++)if(n=a[o],!n.properties.name||!t[n.properties.name])switch(n.type){case\"Feature\":r[n.geometry.type](n.geometry.coordinates);break;case\"GeometryCollection\":i=n.geometries;for(var l=0,h=i.length;h>l;l++)r[i[l].type](i[l].coordinates)}return e.srcSize={left:1*r.xmin.toFixed(4),top:1*r.ymin.toFixed(4),width:1*(r.xmax-r.xmin).toFixed(4),height:1*(r.ymax-r.ymin).toFixed(4)},e}function i(e,i,n){function a(e,t){c=e.type,u=e.coordinates,o._bbox={xmin:360,xmax:-360,ymin:180,ymax:-180},y=o[c](u),m.push({path:y,cp:o.makePoint(t.properties.cp?t.properties.cp:[(o._bbox.xmin+o._bbox.xmax)/2,(o._bbox.ymin+o._bbox.ymax)/2]),properties:t.properties,id:t.id})}n=n||{},o.scale=null,o.offset=null,e.srcSize||t(e,n),i.offset={x:e.srcSize.left,y:e.srcSize.top,left:i.OffsetLeft||0,top:i.OffsetTop||0},o.scale=i.scale,o.offset=i.offset;for(var r,s,l,h=e.features,m=[],V=0,U=h.length;U>V;V++)if(l=h[V],!l.properties.name||!n[l.properties.name])if(\"Feature\"==l.type)a(l.geometry,l);else if(\"GeometryCollection\"==l.type){r=l.geometries;for(var d=0,p=r.length;p>d;d++)s=r[d],a(s,s)}var c,u,y;return m}function n(e,t){var i,n;return t instanceof Array?(i=1*t[0],n=1*t[1]):(i=1*t.x,n=1*t.y),i=i/e.scale.x+e.offset.x-168.5,i=i>180?i-360:i,n=90-(n/e.scale.y+e.offset.y),[i,n]}function a(e,t){return o.offset=e.offset,o.scale=e.scale,o.makePoint(t instanceof Array?[1*t[0],1*t[1]]:[1*t.x,1*t.y])}var o={formatPoint:function(e){return[(e[0]<-168.5&&e[1]>63.8?e[0]+360:e[0])+168.5,90-e[1]]},makePoint:function(e){var t=this,i=t.formatPoint(e);t._bbox.xmin>e[0]&&(t._bbox.xmin=e[0]),t._bbox.xmax<e[0]&&(t._bbox.xmax=e[0]),t._bbox.ymin>e[1]&&(t._bbox.ymin=e[1]),t._bbox.ymax<e[1]&&(t._bbox.ymax=e[1]);var n=(i[0]-o.offset.x)*o.scale.x+o.offset.left,a=(i[1]-o.offset.y)*o.scale.y+o.offset.top;return[n,a]},Point:function(e){return e=this.makePoint(e),e.join(\",\")},LineString:function(e){for(var t,i=\"\",n=0,a=e.length;a>n;n++)t=o.makePoint(e[n]),i=0===n?\"M\"+t.join(\",\"):i+\"L\"+t.join(\",\");return i},Polygon:function(e){for(var t=\"\",i=0,n=e.length;n>i;i++)t=t+o.LineString(e[i])+\"z\";return t},MultiPoint:function(e){for(var t=[],i=0,n=e.length;n>i;i++)t.push(o.Point(e[i]));return t},MultiLineString:function(e){for(var t=\"\",i=0,n=e.length;n>i;i++)t+=o.LineString(e[i]);return t},MultiPolygon:function(e){for(var t=\"\",i=0,n=e.length;n>i;i++)t+=o.Polygon(e[i]);return t}},r={formatPoint:o.formatPoint,makePoint:function(e){var t=this,i=t.formatPoint(e),n=i[0],a=i[1];t.xmin>n&&(t.xmin=n),t.xmax<n&&(t.xmax=n),t.ymin>a&&(t.ymin=a),t.ymax<a&&(t.ymax=a)},Point:function(e){this.makePoint(e)},LineString:function(e){for(var t=0,i=e.length;i>t;t++)this.makePoint(e[t])},Polygon:function(e){for(var t=0,i=e.length;i>t;t++)this.LineString(e[t])},MultiPoint:function(e){for(var t=0,i=e.length;i>t;t++)this.Point(e[t])},MultiLineString:function(e){for(var t=0,i=e.length;i>t;t++)this.LineString(e[t])},MultiPolygon:function(e){for(var t=0,i=e.length;i>t;t++)this.Polygon(e[t])}};return{getBbox:e,geoJson2Path:i,pos2geo:n,geo2pos:a}}),i(\"echarts/util/mapData/geoJson/an_hui_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"3415\",properties:{name:\"六安市\",cp:[116.3123,31.8329],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@nJUXUV°UÑnU@mlLVaVln@@bn@VU@xlb@lLnKlVIJUVxnI@lVL@b°VX@bxnVVUnVVnU@kX@VwV@al¥UUnUWa@@wĸULU¥lKUa@aUI@alLVaU¯anWkUKm@XV@VaXlW@aU_UWVUI¯@ma¯W¯I@UU@WWU@U@@UU@VkV@@WUUm@UaU@lK@IUKL@KWmXUWaXI@@a@a@U@U@KV¥lwk°b²JVIVKlV@UXlaUl`UVLVVVUJU@Lnm@_VK@KUIW@J@Xk@WW@UmmXmWk@kK@aUUVmmkUwUmWL@WmU@UJmUULkKWakLWVkIlwULW@X°lUJ@°ULWVwmJ@bmb¯Vkm@@WkWm¯wL@lkXWmXym¯UImJUbkV@Vn¯@V@lUb@mk@maUxmlUbULWn@JLmKUkWKkwUKbmXWxkVUKmLkVV@JUUWL@xkJUUV@X@VVlUbVX@xk¤x¼xWxnnn@Þ¼JVb°aVn@mlnXUJlbVlkz@lUlXJmxVxXnWxXÈWlU@UxU@VX@xUL@UÆmLnV@lWXk@@JlbXblnlJ\"],encodeOffsets:[[118710,33351]]}},{type:\"Feature\",id:\"3408\",properties:{name:\"安庆市\",cp:[116.7517,30.5255],childNum:9},geometry:{type:\"Polygon\",coordinates:[\"@@n°znWXlW@kK°xXnl@Xn@l°Una@anIxXUVK@¯VIkW¯X@VKxklJXUlKXblLVKnVVIV@Xn@XKVnVxlnnUlmV@²óUkVlWbln@VVVIn@lw@WVIXblV@ÈxaUaVIVVnKVLKln@b²K@»U£ÑķġÝÅbKa@Im@Û@kWÓkkmKÅnóJUÅ£W@wĕ@wĉţ¯¯UkK±l¯U¥UÑkÝUķ»Ý¥¯JIUVbUl¯ÈV¼VJU¼Vb@bkLUl@VJ@bUXÇ@lkVmXmKkLVxVL@VkVVVlzWkbmLUUUbVbUVlÒnJlUnLllUL@bUVxlLXVÆ¦ÈVU¦WJ\"],encodeOffsets:[[118834,31759]]}},{type:\"Feature\",id:\"3411\",properties:{name:\"滁州市\",cp:[118.1909,32.536],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@@`nnl@xK@X°KXVIXVlbXVWnXlL@È»LVan@VJêVVn@X@laÞbVayn@_xnWVXnWl@VnUVkI@lnXKVLVV@V@kW@LlVô@J@bVnnKnkVa@»lç@nwKmaUUUVÑ@nmWXalI@alVn@VwUaVU@nlaôJnUVVXlJaXXVK@UV@VWx@nXVWXVUlLUbVULVVnUVbUbVb@@aKÆnnKVK@U@UU@@a@V°¯ÈJVIlķ@aaUaVKU_@mkxUI@aUlyU@@wkKWmUbUnUVWbkJW_J@bn@Vm@@KULk@V@@bVbÅm@LW@UVVbkK@UkKWL@VULUKWIUJUbkK@_WVXUJka@XVa@ky@aVIUUW@@mUlLKWÑUKVan@UkVmmIXKaVaUwVU@UmykU¯@±UUL@WUIVUU@KkIWaaU@kUUaÇUó»mKk¯@y@kWK@bkI¯`mnl¯XWlkVUzUJlbUbVJl@nnm@VULV`XnWÆbmUUnJmUknJ¯km@yk@kUxL@VUbmnn¤lX@`z@JmaULUVl@Xn@xllkXWaaW@UVmUb@mVXWxXbWbUÒnVVnVVUL\"],encodeOffsets:[[120004,33520]]}},{type:\"Feature\",id:\"3418\",properties:{name:\"宣城市\",cp:[118.8062,30.6244],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@Vb@XLJXxlIXxlVlV@I²¤nlUnVU@VULWVUJ@Lnb@lV@UnV@@VVVlLnbnJUVkUUVWn@@anUVnVJVIV@@nUJVbUb@VUbVK@bn@VbnIlxkllXVlXKWUXUlL°¤UVVb@bUlkXWxXz@IlaUlnUlJVInVÆJULVUnVK°@VnlVnxV@XLlK@wVL@KnUlJXUbnKVLXlUw@VWlLXKm@@a@VLnmlIVVnKn@kVaVlwk@@a@k@VIUa@maUa@wna@kmWUUmVUIVÇ@aKmakUJ@InmUUaVaklX@Vk@m@VU@wnK@alKVUkUkKbmUkm@U£WVk@@UÝbbaÇx@b@WVUa¯@wVwUUV@VwnK@KWaÅ@KIUyUI@WmXóUbWaKm@km@IUyIUaWKx@zUKUL@llVUnkLVVkJWX@VUKUVIkVWakb@VWb@n@JkXUlmL@xkL@`VxLUÈUJ@Vm@@bmIUlUL@VUVVbknm@mKUwKVÈ@J@LV±kkJUIl\"],encodeOffsets:[[120803,31247]]}},{type:\"Feature\",id:\"3412\",properties:{name:\"阜阳市\",cp:[115.7629,32.9919],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@Vn@ak°a±@¥@UUI@aUmlwUUxb@¥XU@mmI@a@Kn@@_W@@WI@mUVVXUl@XaV@K@I@aLX@aVI°K@KVLUUwyXkK@kKÆbXnlK@k@aJlU@w@U@»@aXKWn_JXkVKn@°LlKXW@¯U@aUK@kmJUwVIUJkmLK@kka@wUVm@@am@UkUbkK@nmVÒ¯VUWVVmIULk@ma@kkK@nUbUamU`UUVUkKVkkW@@bkmnmUXVKXVL@VbUmbVXJ@nmKÅI@KWKUXVJUL@VUKUX@KUKWL@LUJmaXXm@kVVV@L@VUL@VlK@L@V@LUK@VUb@UUU@°@nVxU`Lkn@`@XVJ@XVmk@UKmV¯LVVn±Wm@Ub@JlLUl@VLk@lmVVn@bnV@V°IVaVJXI°K°V@XXVlVVUnKVlUbWXnV@bV`U@@m@@@nxmn@bXVlL@¤nbUl¦VVUnJVUVl@@bÞL\"],encodeOffsets:[[118418,34392]]}},{type:\"Feature\",id:\"3413\",properties:{name:\"宿州市\",cp:[117.5208,33.6841],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@@UWU@bkW@aWU@aUIkWVlLXblVIUVV@mn@V_n@VaUK@I@UaanJVU@lVUVnnKVVlaUaI@wnKLnll@nVlk@wVKXkl@@bbUJ@VU@UUUyVk@aVUXwlWXXWU¹@aU@WUI@mlUnJ@Il@aXbV@VKl@XxVL@WIJlb@al@IUUm@@aVK@¥¯@mUķ¯bWk£Vm@akm@VaÅ@UVWa@UJWkJUbWbU@UlXk@amV@K¯nk@lU@Uxmz@bU`ÇbUbÅVm£U@Wwx@akLUK@UlakwUJWVkLmaUal@n_mVUnKVUUmÅXWa@kJmx@XUJ@bVLXxl@VVUVVUbkLWbU@@lUVVVVXK@XkJ@nU@@bV@VxUVlbU@xXLWn@UxVbVĊV@b@XV`mnkJ@kUKmbaU@VbnbÆx@XU@@`k@@bl@@bkL@WakXWaU@Vmkx@XWW@@wUUUbJU¯V@¯ÞU@WxXlL@bkb@lVlnbJW@kkU@mbkaWJIVlmz¯`UnU@mb@@`@bkVlnV@b@V@aVxn@VxKXnl@nbVKbVK@a_V@Vw@WLlwnK@UmIU@VW@UÈ@lKnalw@@V°@aUmlUUw@V@@UXK\"],encodeOffsets:[[119836,35061]]}},{type:\"Feature\",id:\"3410\",properties:{name:\"黄山市\",cp:[118.0481,29.9542],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@lXnlWX@VUJVnUJVzXJVxkVJlI²lU@K@IUÇLVxnLn@lmUaVU@UVKVknJ@an@@UVIVÇKUw@_lK@wnKVklW@I@mXa@UlaXblUJVUVL@UXWlIUUlKVmkU@kVKVL@ywXLVbJVz@Jln@nLXbVaônW@la@UVWUa@@a@mk@WIk@VwUa¯¥m@UUVK@ImK@aX£kKÅVa_@±akXWWLnU@@a@¯mK@LJUWwUVVmbXX@lWLn`mzUJUbLk@makVWmkXambkKkna@ab@U@Unm@WV@VbUbUJWIk@@lmL@°UVUVmn@@kmWkb@x_m@@aU@b@JlUzlWxXn@b²@l`IVlUlL@VKnVbUl@VlIn@@bbVWUk@@bX@Valb@bnb°Vn@xVKlbVnV@VxL@ln@UXVVL\"],encodeOffsets:[[120747,31095]]}},{type:\"Feature\",id:\"3414\",properties:{name:\"巢湖市\",cp:[117.7734,31.4978],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@VV@blL@XlWnnn@VXXl@@WIX@VJ@LxŎxln@bXJVblX@VVbUVn@VbUVlb@LnJVbVLVXLÒVLÒVbVIVylUXk°Wknm°_lJ@aXL@lz°@lnLô¼VÈVUUaVKU@WW@@UUa@knmVLlaV@a@kak±@UmwkKmkǉÝUUkL@mlIVmnÝWkkUÝ@KƑĉa@»mma@mX¤¯Uw@@UU@bU±±L@akmLUKmLUUUJVbbÇw@kUWaUJ@Xkxm@UJUUm@kakXUVl±ôU@kn\"],encodeOffsets:[[119847,32007]]}},{type:\"Feature\",id:\"3416\",properties:{name:\"亳州市\",cp:[116.1914,33.4698],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@lU@Un@@anUlw@KVmUwlaX_lKna@KU@@kWKUU@ankWXK@@V²VVIÈU@al@VaÈamK@wU@klaUV@XVUU»WUUbkmUkVmk@aÈw@mWU@VkIkVWKUÑķXȭºU¯l@kkLWmÅaL@lLWlzVxVUK@L¯LUJ@bWK@b@JLU@Wbk@WVUUV@nJ@XX@@`m@@L@bnJ@nWV@¦awVVkxVn@bVJ@V¦@²¯blb@mUU@¼¦XbUV`@nnxUxWLkUkVWKkV@XV@@VVL@VX@lVV@L@blL@`L@xXKVL@VnU@lwnU@ml@XnV@@UVW°LnalUI@aUK@aa@UkXW@I@mWL@UXK@UVW@U@@kWn@@V@XblaVxL@bVKXbIlJ\"],encodeOffsets:[[119183,34594]]}},{type:\"Feature\",id:\"3417\",properties:{name:\"池州市\",cp:[117.3889,30.2014],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@V°°ĊŤ@xĖ@xXÆ¤VôIÆmnLllXÔ@lÜn@@JbLÆaĢÞĸ°VVUUKVanK@UV@VLVVnln@xnklxXamk@WV@Xa@naVkKlk@mkUWwkJWwIWK@UaUwWIUyVIUmVI@UXWmkkWKUUVWm@@kKw@UUUmkaULwm@¯Uma@akaUbW@@a@VlUXa@am@kJ@UVkUamL@UkKVUkJk_±@a@WmXwÇkkaVaUa±wV@VkwnyUaW@UU¯amLk@m@kmmU¯K@L@lUX¯WlkXVbbVUL@J@LVKnlJXnlb@`nXlalV@bnL@Vnb¼@lXbWlkLK@zUJmIUxUVUVmX\",\"@@llUL@VlxL@a@UwXa¯@\"],encodeOffsets:[[119543,30781],[120061,31152]]}},{type:\"Feature\",id:\"3401\",properties:{name:\"合肥市\",cp:[117.29,32.0581],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@LxVĊLÞkVlVVXaWaXwWnU@anVVUX@bXblWkk@wWmk@VUVKnb@Iy@_kWm£nmVa@UKwlVl@zn@°lIlmnVIVmnVaXÅWmU_VK@Unmmk@UIVakaaUÑUKÑWKUUKUamI@KkaVUUam@VUUa@UkWUaWI@akmōwwUL@`mn@KVIUVUUUKVk_VkbW@VkUULUJ±I¯alkxU¦@L@V@V@b@b@WJXbWVXn@LKVL@JkLV@Vbn@VV@XU@UlV@@VV@V@XXV@@VJ°°Xnb°@JUVVXV`@bkXWUbU@Wn@VLXlm°bVUbkK@bVJ@bVbkLV¦KķV@x@XbmVVVk¦\"],encodeOffsets:[[119678,33323]]}},{type:\"Feature\",id:\"3403\",properties:{name:\"蚌埠市\",cp:[117.4109,33.1073],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@VÒXLlUlJ@UXV@nÇx@bnlUVllnVaXVV¼UVWU@V²wVV@Vl@VnwlI@XbÆWVnUVmLUVnm`k@VbnblKXUVIlxkb@VVLlK@bwXxV@n¤ÆUVaÈaV_@anyVwV@kl@°m@LnUbl@WVkV@XaaVIXlIV@XbVUÆ@XKWwUkmW@_UmnIlJXkWKXmV@w@_XV@Kl@kU@KlX@@UUUUKWLm@klJVUUmk@mXUWmXw`m@zUbÝakbW@m@UUéUIm@UbKÇ¼@kKWXmWUkaWUJWU¯L@WLwk@mm@_ÅlUVkmWUnV@VWLUbbƑĬ¯l\"],encodeOffsets:[[119543,33722]]}},{type:\"Feature\",id:\"3402\",properties:{name:\"芜湖市\",cp:[118.3557,31.0858],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@bVaV@XllLXU°lL@V@VUnVl¯IkVUVU@@b@lUXUWmbn@¼bƒĊLÞ@lVXlmÞUnkJ@nlKVVÞXklWVaVI@aUKn»lL@Kn@XXwlm@mn°@V@WywXlWVk@aUaVU¯£kKWVXVWLUkkWlkkwmJUam@@aULVa@UVaUaVI@m@UUJUIUmmV@bm@UXVVUlVmImakKUU@UU@VmU@@kma@KVIXUVK@UVmUkVm±£@JkU@nlkLUlmb@WbU@@XnlWb\"],encodeOffsets:[[120814,31585]]}},{type:\"Feature\",id:\"3406\",properties:{name:\"淮北市\",cp:[116.6968,33.6896],childNum:3},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@lnnK@¦n@@VV@@VV@nIVV@VW²a@b@bVnUVVV@Vz@l@°UVIVaVV@x@XX@WlwUnV@XblWb@XlK@a@k@al@@_V@@WÅwmaUaV@bnaVL@llInmU_@W@aUUĉUaVwm@XWK@wVkaVUUwU@@aV@@mlI@WLWUUUVU@kV@XalKVaUVUUUk@WwUK@aVI@WUk@@UUU±xkb@lV@xnLÇbUbk@@bÇVUJ±U@U@WLXml@bVVXL@lV@@LmbkLW`kbVxUn@LkxmV@bm@@VkV\"],[\"@@VVVkV@¥@UV@U@VUUJkWakKUlXVJ@bXV@blX@aXV@V\"]],encodeOffsets:[[[119183,34594]],[[119836,35061]]]}},{type:\"Feature\",id:\"3404\",properties:{name:\"淮南市\",cp:[116.7847,32.7722],childNum:2},geometry:{type:\"Polygon\",coordinates:[\"@@°kƒīaVaXK@UUVmnXUlVÆkVKUUUmmUÑkUUÝlĉKUwKbU@UxW@@lmVUUVmUUmwaWkL¯K@mULWlIm`XWL@b@¼@V@xkVI@b@l@lkV°Ȯ¹ĸW\"],encodeOffsets:[[119543,33722]]}},{type:\"Feature\",id:\"3405\",properties:{name:\"马鞍山市\",cp:[118.6304,31.5363],childNum:2},geometry:{type:\"Polygon\",coordinates:[\"@@ǊnllLnxV@laXLVKmaaXbVIbVKVVVIVyn@n_W@@UnJlUVVXlLnaUWlV@VVIXW@_W@XK@K@UVUUwVamÑXmmwwKUnUKçU@JU¯@m@nknWxWm@@LkKm¼VL@bUJUbkXWl\"],encodeOffsets:[[121219,32288]]}},{type:\"Feature\",id:\"3407\",properties:{name:\"铜陵市\",cp:[117.9382,30.9375],childNum:3},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@ÒV¤@¼V²@aVV@@x°V£nW@nbnaVXVW@k@aV@VUUl°JUkVm@U@UkK¯WVkKWkU@Ubakwmlwm@kUmUUKU@@VmLUbVLUV¯U\"],[\"@@LllUL@VlxL@a@UwXamK\"]],encodeOffsets:[[[120522,31529]],[[120094,31146]]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/ao_men_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"8200\",properties:{name:\"澳门\",cp:[113.5715,22.1583],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@HQFMDIDGBI@E@EEKEGCEIGGEKEMGSEU@CBEDAJAP@F@LBT@JCHMPOdADCFADAB@LFLDFFP@DAB@@AF@D@B@@FBD@FADHBBHAD@FAJ@JEDCJI`gFIJW\"],encodeOffsets:[[116325,22699]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/bei_jing_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"110228\",properties:{name:\"密云县\",cp:[117.0923,40.5121],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@vIHZDZQtDLNMXIbHRCXXITbJ@H`LGPRDDJNCLHTOCWFGvGBUJMKGFO^IHWXITQCIY^AXGfRDXF`DJOLB~G\\\\DZIHHpErUVMhHb]\\\\MBVF@FTP`@zTbD\\\\@~M\\\\K`H^EVODWICAakAQXoIcCOCIgGYNWFWNGGKKGaJEGMEIKYJUT_J_Go@_SyQaSFMEGTcYOQLIIi@EKAUPCV[EEXQCW|aMUMAaYCYNIDGGACIMGGSKDQGaF_C[GaB@GOIiOKAYLmI@CN]F[SWWAcKKI@HMUimEKbeYQYISNUOcBKPIFBNgvDPGZYFSf]CMSIWGEUFgDIQ[MeDMJS@RR@LphFPCHaBAJKF@J]IBJO@HlO@@RKAMPJHCNDJTHFP@ZGNANBRFH@J_fM^ONJNF\\\\VTDJHDON@XRND\\\\XRCPVETCLBVKDFJINHRGPRV@\\\\CLJN@VbXbLVT\"],encodeOffsets:[[119561,41684]]}},{type:\"Feature\",id:\"110116\",properties:{name:\"怀柔区\",cp:[116.6377,40.6219],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@JHTVHXCHPfnDJGHNDJSB[JSBGVSAOH@PMPuDEHHXZN@PHF@ZLJ@LHVYJA\\\\OFWP]BMtMBSRGV[JeVAPQVIFENMD¡@^NV\\\\JH@NNL@NM\\\\kTQ\\\\I^FNIpBHGTBFFAZQfKDIXQTLXFXNNVMVHRGpCFLlRLEVBBH`IVO\\\\G`RDPAXLXBXORHZEHTDLLN@VGTMrQNFPeASKG@GMOAKBYMK@GTUHUXSHMVDNMOUEOZMJML@^KRACMZEZMRQLUHE@OFENPR@DI\\\\ChMHIDG\\\\GJMDWHCKGMDCIQCHO_K@GaIJSWWQDaGWJMNCKRsCYGYuJUSaKaW@UIMDK@[QUHOGQJMEILCAUDKFSOUQD[WMCQ@WPMGCCIUSE[IMPMN]`e@IEGAQBMHM@YEOSGCIDMIGNOLB@QP@GkP@AI^J@ILEBIbADGEOog@KQQWSekWQQUOFKZLF@PUNmIaHIUeBCTSHENcJa@_IWSaGu`GLSBKJQFOXGDXVQVOBIHcDSJWBEFGTMH[^mLaXcHiKElTRKtFXZ`MHMPCNRDxZB\\\\ICIHK@KHbIVFZ@BPnGTGbDXRDJaZKRiGEFSFEJhjFNZFjn\"],encodeOffsets:[[119314,41552]]}},{type:\"Feature\",id:\"110111\",properties:{name:\"房山区\",cp:[115.8453,39.7163],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@h@bl@HRJDZ``TA\\\\VVD^H`\\\\pF\\\\J`JGv@ZO\\\\GPSTEjPTR`FnEbDTDHEhLFMTK@ETSPULKEI@OVISKSJACEQNQbVIXGDIN@dMB[IIBcN]ZHNLP@XOWCFWCNRHTpATD@^NVNLED@Rh@jCEF}E[OOHUEW]W@QGGDIQSH_MmFmCUT_K]i@MHCMWFCFE{BMHMPOHKS]CFNGBELDH_@BcAKOACESAOBELaXAROB@FODMEDWJAG[aE@UM@DImEWJMC@OeCA{aE[@{L@MINUCQXKfUJORCHqJBF@TCXWNQX]M[EAJO@@KMBQJIC]EWMCCUBEBFHKDOTMBGNGF]MWDBRDdMDQVyE@LPVHDCP@JVVMTG~HNSH[CmRUvHPHBbA\\\\PTNRC\\\\YNJPRARPJDDR\"],encodeOffsets:[[118343,40770]]}},{type:\"Feature\",id:\"110229\",properties:{name:\"延庆县\",cp:[116.1543,40.5286],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@^AXOPEB[ZIGU@KKI@YGE@OYMGWFGvCNO@OPGTBHUTA\\\\ITACIGMIHmCOeDGGWSUIGimYEEMgiFITEFEjHLQbYCIWQaCSHmHAOY@UEaJG@LGLDJ[JAwYQCDMNONGY_EWLsSQFkMO[NWAIGaIYL@HMBOKiOQDWEUDMQSF_QIUBWdg@[NaAKQ@M]OQ@WhgLUMMFYQDIRCEUZOOCIOJ[KIUMKL@HIDKVEBM`HJAJSJUdBLGNEdMBMO[BYEWJSNKNaD]PE\\\\SjOT_RQVEZPpNQXfNA~lNG`@PNLp¼RFLfbdKbATUh@FSNWjGFZVLFHVA~X¨PPROfFJbNJPLFbENJPrEFNPFRHDDJdENJLVEPBJTVTHGHFRFH@PXP\\\\ORQHW\\\\BjWFDERLPPBbB\\\\E`B\\\\D\\\\L`@F]FCnJ^AZL\"],encodeOffsets:[[119262,41751]]}},{type:\"Feature\",id:\"110109\",properties:{name:\"门头沟区\",cp:[115.8,39.9957],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@V@XMnGPY²JQNEhH\\\\AZMPDVTTDZCPiJkHSHCjIdFtEHITCNITQEKUAMCEIKCECABYESKFWAKBEIIHABGDCKCAIHMHALKEI\\\\CFIBILIJQZS]BBEECS@E@@C]COKI@CABAAEEDMGCH]A[M@CJWHJaUMRFRBDTITLUJ@PFJKLOVST@FSLENgKGFSCaCmF_ESQiOSFOT[HYPu@IH_[IoE_[]GUC[USB__CYQI@Gakg@qZeHQNMNV\\\\FVLPgJAFJPRLCH[XcPELUT[JiV_EELFTADBXRTRLJC@fHXHHbPd`fR@NfT`@TLplHMpCEJHJBVLF@JTVnG^KXDXHNVGRLRXFJVdDHSNWLGfEzA\"],encodeOffsets:[[118635,41113]]}},{type:\"Feature\",id:\"110114\",properties:{name:\"昌平区\",cp:[116.1777,40.2134],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@VNLJI\\\\JPPDYPFVQDCJZRNEVNhKXgR@^P@NLRbB\\\\Mh@XcVARJE`RTCNFVXRCjPPLNA@GZKbJJHXB\\\\MNPjLdGbWnK\\\\]NGHSFEXATIdCJGPARUWUHCPWRELITAHKv_E@iYCaW_BQ\\\\Y@QIO@QDCIGZCEMWGFMFAFgHEDOCSqKCCFGAMKEAC@ODGCGs@WH@KQA@EE@CE@GEA@EH@GGUEEJEAYD@JM@@DAA@FHD@FTJEHUC@JUBKCKG@G[CIIQReAYhO@OXGDO@@FF@IHJFCPEBACBIAAKDOABXARHPNEHGbQAAKQFGIAM[C@WHKaGiCEGOAHUKCIokSCUSOCYN[BgGMFIR±OZmHWNU@ShbbXDHVXXGJ^lZ@PZ\\\\Nb@\\\\FHJAD\"],\nencodeOffsets:[[118750,41232]]}},{type:\"Feature\",id:\"110115\",properties:{name:\"大兴区\",cp:[116.4716,39.6352],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@F\\\\E~DFN@BDFEpHFCHBBEGCDCJBHUDSBB@ELCPbF@B\\\\J@BJVAFJ\\\\ADKTCBGECFMT@BMN@@FH@DaNBEnvB@FPBATK@FHEFIAKFBFL@@PKBFJHC@FXBRAFCDMPDTOL@JIVFDHH@DDH@BGRFCDLD@N^@@CNA@KNOAEBCECFEGCFGMGFIPMOEJOLBADBBHGG@GCHIECY@INC@DMGS\\\\AIOZAAEYA@GT@KKMBEETCGMVINFxA@MJADB@FlA@HJA@NND@DFA@DVAZBBOFKH_JA@K^GBC@EFEG@gAENMXKJigC@IbSJMqGOP£RGSMGE@kbQFDPEFiBSGGSBK]I{CDWCIDOic[C_G@SuSO@EWKCO@MNY@\\\\uZOPENQD[LKESSKGBKEG@EJGAGHoH¥CqhifeJkX_XFFGHFNEDFPENKHM^IFIVL^S`DVEnNnG`RTCJHH@R^XFXGVPP\"],encodeOffsets:[[119042,40704]]}},{type:\"Feature\",id:\"110113\",properties:{name:\"顺义区\",cp:[116.7242,40.1619],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@EhEBENXHFNYDJHCD@RJP@R[ZARX`DbjZF@bHXT`Jb@dIFMTGDSfAJVbGnJVM@OKELYPERVXRflXTT@NIfC\\\\NJRhCVEHFJXNT^DTeZEHYCOhuAMJELOdAVPTMOWBWNMNEJgl]@WGUFIC[T{EEDEHGCIGMI@SECUQI[D{A{GQESPUH]CsiMCmHUeoHENcAaDGCMDGMQCACCBaCGLMAHB@DIEQLOAAEEJ@CW@CDINGAAGKQOCgV@LG@BEGDKNeREFBNCFIDOPKD[@YRW@GFWDAFE@EHDDrLDTCPGF\",\"@@KrJEH[\\\\B@FF@CHFBHUNAJKADGECBCMAG^E@EbI@BEGP\"],encodeOffsets:[[119283,41084],[119377,41046]]}},{type:\"Feature\",id:\"110117\",properties:{name:\"平谷区\",cp:[117.1706,40.2052],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@ZJZRafFLjnVGNJ@LLBdXX\\\\T^EDMJ@nZKLBjPPJ@HbA\\\\H`DbERHLCFK^BZaFWXQLAGMHa\\\\OLO@SBIpBdCLVQfElO@GSAKEDQTC@GEBKG@ORIJBDAPDFA@CaOq@GGQAAEJK@KMUGAAGEAa@MGMBGCGSIIW@WSUCMDOJeWOM@IUF{WMWaDIMgIoRoCOKeEOEAG_I[cg@wLIFENQFDVTFJ@HNDJGHCFFFS|D\\\\EJHV@Xk^IhMFMNAXPX\"],encodeOffsets:[[119748,41190]]}},{type:\"Feature\",id:\"110112\",properties:{name:\"通州区\",cp:[116.7297,39.8131],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@FDAJTGDNDCTDDEDBBE@DT@@EHCDGJ@EIZ@@FDBR@ATFBBVFFE@@HNA\\\\VE@CLIFNJFNJBCP]A@LJFA@HJEDD\\\\C@DBCHLAEPF@@DH@APHAERDF\\\\GIxDTM@CFLBBFJ@CNUPMHECGDBF]BMFPDLRBHHBJMDCX@@DFIBFPBRKJF@CGANBHKbDDABDRDHNNCHDbCdBFMpGHiOYMefKJMC}HWAUNW\\\\NNBNAkNU|]HMTMN@MZBLFFF@RIRUTBMFIEGaAGGAOIIUGTSFcYKS@MSLYPKRUBU]EWDOI]CKGASgW@MTWKIMCS@uMAKKADMECGAKVUTSDy@IjWLMNBF@hHEF@FAD]H@LIBG`ELAPYAUB@CEB@CMC@MIB@GkB@ECAIB@NwBMEUJHNSDFFNALLS@@HZBBFYBJP[BHTCND@JMZ@FDGJHDH@GHAABCKAIPPFONEJNHEHHDEFFDADBFMP@L\"],encodeOffsets:[[119329,40782]]}},{type:\"Feature\",id:\"110105\",properties:{name:\"朝阳区\",cp:[116.4977,39.949],childNum:2},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@bFGHBHFBFIVFHHG@@FFB@HDFF@@FRB@LXGt@DHCH@PBDLFBNF@BEXCHEX@ZQ\\\\@LCPOJCDEAMFEfQLMHCAFH@@KhUNE^AAEHCFDNGVODMI@AEKADEN@CSJw[HCEFQGBBOG@@CE@FOKBDGCAD@C[FCGIB@IE@K^BDOIAEMMIJEDKF@[UMB@GF@EEAUEABSQ@CA@EY@FJI@CHGD@FS@@CAFCACFSCCDCMSHBIECMB@D]@@MKCDCQEAHG@CCG@CGUEIJK@SPOCCNEDQBDNDB@DJCDLFCBBALJB@BVGPBKVO@KHCCCD@FE@BNA@FNCTDDJA@FGB@NBDW@CL@hT@@ZHHQDDDAFSAANBC@HG@EFS@@DE@@PCB@Ue@CADNJB@FCBWA@LI^ix@FIHrH\"],[\"@@HUNAJKADGECBCMAG^E@EbI@BEGPKrJEH[\\\\B@FF@CHFB\"]],encodeOffsets:[[[119169,40992]],[[119398,41063]]]}},{type:\"Feature\",id:\"110108\",properties:{name:\"海淀区\",cp:[116.2202,40.0239],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@plDJVLGPBFHjDbHGL@X\\\\DBNHJREBLRBHaFGMGOBQAWPBLCBBAJBDFADOIEJGE@@EP@HCPWP@ZgfBRQJJ\\\\D@HLHLDVA@IVDFGSI@EGC@EBB@CN@@IZCAGHGaEqGJG@EjwJ]@K@GSA@e_I@NE@CA@Kg@KC@ENCFAKQAW@WIMK@V@I@@F@^EDFB@HcIaDYCBRRDCHD@EFLN@FE@CJUPEJOJMTBPEDIFCMIAKNOGMRFJNDVBFLSRMJSDGJsFcEiJGDGTIlOjYD\"],encodeOffsets:[[118834,41050]]}},{type:\"Feature\",id:\"110106\",properties:{name:\"丰台区\",cp:[116.2683,39.8309],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@hMN@NFTQCFRCBJFA@HJ@@HJ@HJ\\\\FTACD@@UNLXJX@@MA@@IECAQlDFEHBDI~D@GXCFMVDFCH@@NF@ANJC@FnAB@AMF@@EDCDDLGP@LUOAUH@AIABKAAEDCKID@CCACMWA@EGDEILA@OK@AELEJBFEEGL@BSOA@EuAFmMACbG@@EM@ANS@ENFDAHSDCL[BEIUBAII@A[E@OaKD@FAACTGVIACDHDAFGAEDoGEFACM@ig@@QFCMKMU@]SCoBGSMQDEXXDWPO@MKYGM^AdJJA\\\\cNB\\\\G^DNHFCBFABDBJ@PL^D@DF@T@FDAF^A\"],encodeOffsets:[[118958,40846]]}},{type:\"Feature\",id:\"110107\",properties:{name:\"石景山区\",cp:[116.1887,39.9346],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@NQPHLMJBDNJEFCAONSPIFIVODIF@@EKMFEC@DGQCAQZDbCdJ@GEAFC@]@EJ@DCSB[EGII@@GI@@GEBAIQDDESRMEM@gNYTIRKJAJEJ[DFJKLGBGNBJLDCDAHGBJJAFBLEXTLZFBAFDLD\"],encodeOffsets:[[118940,40953]]}},{type:\"Feature\",id:\"110102\",properties:{name:\"西城区\",cp:[116.3631,39.9353],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@XBDA@EIACM@IJAD]BC@SFABISAD]H@@OAEDQEW@BLEMD@FLDh@@LDBF@@M`J@fTB@H\"],encodeOffsets:[[119175,40932]]}},{type:\"Feature\",id:\"110101\",properties:{name:\"东城区\",cp:[116.418,39.9367],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@DBf@@VDA@OF@@CT@FEH@@GADBMTBBECCRCGG@YS@@gDK@AC@PG@C^TBAJEB@TADC^IB@J\"],encodeOffsets:[[119182,40921]]}},{type:\"Feature\",id:\"110104\",properties:{name:\"宣武区\",cp:[116.3603,39.8852],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@RBX@RFFCBFU@aK@WA}CCJGAEFkCBRFD@JB@@N\"],encodeOffsets:[[119118,40855]]}},{type:\"Feature\",id:\"110103\",properties:{name:\"崇文区\",cp:[116.4166,39.8811],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@XBL@@bEVD@BX@AC@MHA@EIBCCDSEMmB@EIDBME@@MG@EDUCENWD@H\"],encodeOffsets:[[119175,40829]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/china_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"xin_jiang\",properties:{name:\"新疆\",cp:[84.9023,41.748],childNum:18},geometry:{type:\"Polygon\",coordinates:[\"@@@ρȁôƧƦóəʵסʵóƪԫʵѵͩƧͩړυࡓɛʵ@ȃ@óᇑѵƨɝɚôóНѺͩɜ̏ԭʵôƧɞñ@υƩ݇ȂóƩƧ@ѵȂυƥŌਗ॥ɛóʵѵƧѹ݇̍ࢯəɞυρͩ̏óਙƨƧŋôōó̍ͩóʵןóŋړͪƧѶ@ɜԭԫƦɛȄ̍ɝȄöςƩȂ̏ñȀ̏ƩóóŎə@Ő̎@ɞȀɝŎôƨóנѵȄƧ@óŏɝóɜôŎ̍ͨςŎ@ƨóôƨɞ݈ʶóƨφó̎Ȁƨ̍ԮòѸԮמ@ѺȀ@ƪၬֆòȂñ̐òȂɜóƨ̒Ŏ̑߼@φρȀ@Ő๐ς̎Ƨφ@ɝφڔ೦Ԯǿࢰ@ƦŏԮƨƨȄƧ۬ɜʶڔŐɚɚóŐôƨ߼ôƧƧó̐ƥóŏѺǿƦȁφƧςƨƧ̒@ɜƥƦυ̐ɛƪͩƩəƪʷ̑ə@ȃƨʵנŋྸōਚԭԪ@ɝƨŋ̒օςʵôƧ\"],encodeOffsets:[[98730,43786]]}},{type:\"Feature\",id:\"xi_zang\",properties:{name:\"西藏\",cp:[88.7695,31.6846],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@ôŌנôʶ̎ͪôóŎƨŌਚƧ̐ôςͪφɚɝࢰ݈̎ѺѶƨôʶ०ɜਘƦŋφѶȁ̍ôŏɚŋ@̑ə@ŏò̍ɜóƥôʷƧ̍φѹԪ̍ע@Ѹʷɜ@ôñנ@Ѷɛɞô̐ŏѶƨѸƧƥōƦôŏô@ƧôƩ̒ŋƨŌƦǿô̎ɜȁ̒óʶѶôôО̒ςƥɜНφσɛȁ̎υƨఱƧŏ@ʵƥ@ŌóóóͩƨƧóŋ̑õóɞóɝԩͪɝρôƧ̍ƧѹͨڑŎ̑ōóƧࢭͩ̏ѵɝóఱóóԪυô@̒ƥŌ̏Ƨ̑Ȅ݇ŎƧѵӏ@ɛõŏɛȄôӒƧŌѵǿɝƧŋԫ@̏ʴƥ@óǿ̑Ȁóǿ̍ςóóυô@ʶɛñρƦƩŐó̎óѵó̑ͪࢯОóɜןƧ̏ƥȄ߻̎̏̐ןŎɝɜöɞƩȀôöɛȀóͪ̐ƨƪ̍̎ȂƥԪυО@φɞôƪ\"],encodeOffsets:[[80911,35146]]}},{type:\"Feature\",id:\"nei_meng_gu\",properties:{name:\"内蒙古\",cp:[117.5977,44.3408],childNum:12},geometry:{type:\"Polygon\",coordinates:[\"@@ኊȁ૊ö߼ƩɜɛנñԮɛѶóԮô@ȁѸóמ̎ගѺၬ@߼ʶԮӒ߼̎@ŐѹӒ̒Ԫƨöග̑ѶȄ̒ς।ѶɚöɞɜʴڔôôȂ̎ѺȀςƨƪóԪɜôɛОਕڔԭѵ̍ѹȂԫɛƥ̍Ȃóɜ̎ô@ʶ݊ੲࢮʵږͪנƨôȂƧ̐ͪ@ŐƦƨφԬѶɜôƦ@ŐƧôôƦəŐ̏@ŐڒѶԬô̐ʳԩНςōôŏɞ@ƨȂѶəóƧ̒ػ̎ó̐Őנóƨô̒@ƨɚɚ@עԫɛɛ@ȁυͩƥʳòևρ̑ࡗƧͪ༃ॣԮփ̎Ʀ@ôô@ôō@@ȁѵóƨ̍υȃóʵɛƨƥóυȂóəƪ̐ρƧͩɜԭڔȄ̎عƧȁ̐ŏó̍ɛƥƧ̑óρŐ@Ƨ̏ɝəɛ߻ͩ̍ͩɝО̍ƪƧóóӓƨóƧʳ݇@ɝςƪ@ʴƩƧƦôƨɛȄəƧŋυóͩѵ@ɝǿóŌן̍ɛóО̍̑̏ôȁ̍ŏòȁñóƦͩ@ǿə@ɛƧ̑ρȁυô̍օѹóȃə@ȂσʵѷƪòƩ̍ôó߻ۯôʳƧóõʵѵóѹɜ̍ȂѹôɛŌφֈƩͨρóυӑóޟఱ̑݇ͪóƪƨŌóȄڔԬƩςםñ̑ȃѵŐԭŏƨȁɛǿρôõɚɛóƧОə@ѹ̐ѵöԪͨôͪɛ̒ןŏƧƥóôƥƧɛŌôóɝó@̒݇Ӓ̒Ō@Ŏԭࢰ\"],encodeOffsets:[[99540,43830]]}},{type:\"Feature\",id:\"qing_hai\",properties:{name:\"青海\",cp:[96.2402,35.4199],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@ƨ@ôƪ݈ȁƪ@φɝòóƨԮʶɛ̐ѹͪôОəóƧɞᇒѶ@ôږô@ǿѶƪȁςɜͩφςŋɞôѶɛƨŌɞ@ɚςŐñԪॢͩƨȂɞóƨŐ̎ŏעӏ̎óƧƦô̒ȁɜςͩ̒ɚɛƨôƨɝφɛóȁƨŋóóɚͩƨóóƩ@ƧəŋƦƩ̍@ƧƧôǿυ̑@ȁɞǿõŏρƥסɚƧóτԫɞôƧƦ@ñȃòñƥóυôôѹѵ@ŏ̏Ȅɝó@ȂəŌóəѹƦ@Ő̍Ōυ݈ԩŐƧóôƧ̑ôʵɞƧ̑ѵôƩɞƧ̑óНѵóôʵ̑ɛȂó̍ƥȀƧŋ̑Ōóƪ@ƨóóŐƥƦŎѷƨѵƧ̏Őɝóѵɜן@óòɛ@ѷʸס@ԩ̎υѺƨ̎óʸôƦɛñ̎@Őɚ@̒əŌóŐ̎\"],encodeOffsets:[[91890,36945]]}},{type:\"Feature\",id:\"si_chuan\",properties:{name:\"四川\",cp:[102.9199,30.1904],childNum:21},geometry:{type:\"Polygon\",coordinates:[\"@@ôôŋó̑Ԯ̒ɛОמͪƨōöͫ߼ƥôȃƨóóñôƧóƧôōڔŏƨŐ@ŎôòƥѺŎ@ōɜóנôǿôƦôԮ̍ɜôɚƧñɛɚȁ̍Ƨɛևυ@óóôŋρԭɝ@Ƨʸ̍ŏυɜƧƧóƧƨȁρ̍ƨȃɚôʵφóô̑̏Ȃ̑ʵɜʵɞ@ƨʳסƩóŎəóɜƧôƩƧρóôôô@ŎƧƨƨƪѹó̍̍Ʃ@̏ѹНôޟ̍ƩóƪυɝɛəƨôŎɛȀ@Ȃ@ñɝʶ@Ōρנ̏õóɛͨƨȂѵОɛʵ@̏ƩŐó߼Ƨల̍φɜȂυτɛОρƦɝƨóƪ̒Ѷɝƨóʶ̒óƨƨôԪŏφ݇̎ŋ@ŏѺƥôɚɚŋ@ȁɞô̐ȃ@ŐѶóѺφóƦôñòòȄ\"],encodeOffsets:[[104220,34336]]}},{type:\"Feature\",id:\"hei_long_jiang\",properties:{name:\"黑龙江\",cp:[128.1445,48.5156],childNum:13},geometry:{type:\"Polygon\",coordinates:[\"@@ᇔȂਚНƨŐѶŏöƥςŏñƧƦóƨȁ@óƨóȁφӑóóƨóǿ̎̑ôНɞó̑ɜə߼̎ǿ̒ôڒӑφ@Ƨȁ̎̏ƥƩ̎ρశôȂςƨφ@נɞ݈̑ƥƧɛƨʵƧȃƥ@Ƨƥ@ŏ̑ԩôɝρρóɛƧƩͩƧó߻ʸ̍ʷѹƥɞڕõ̍öɝυ̍ȂƧ̐̑ŏóƨñŋѹóóȁ̍̏Ԭõʸ̏ŏ@ǿ̍@ƧОυ@ñƨòȀƥŎ̑ŐѵóɛŌóȂԫōƧŎѹñ̍ʶóОן@Ƨ̎Ѷô@Ȃ@óŎó@@ó̍ƥԭք༄।ƨͩ̒ࡘςñֈƦʴφͪ@ȂɜɜסԬə@Ƨə̑@Ƨóןô̏ŏ̍ô̑ؼôƨѵɚƧȁɝ@óŐρŎԪО̏ʴ\"],encodeOffsets:[[124380,54630]]}},{type:\"Feature\",id:\"gan_su\",properties:{name:\"甘肃\",cp:[95.7129,40.166],childNum:14},geometry:{type:\"Polygon\",coordinates:[\"@@ڔôԮࢯ@ō̑ŋ݈ӑ@̑ɞôóôɜŋƦƨôóƨƦנŐɜ̑óͩԩͧѶõѺ̏ɚ@ƨНɜôöəςóɜȀƧȂԮŐѶŏ̒ȄמòƪρړԫôȃƧŋôƩ݈ͩɚ@@ǿɜ@φͩóŏɜӑƧōôǿ̎ôƥƪóõö@ôƨôƧƦôó̒ɜ@ɞŌõʶ̏Ő@ȀóôƨȂ@ʶע@@ƥ୾ӑó̑óŋôʵóɛړ@@ƩöóƩóρɛƨ̑@óʷƥƥ̎ɛƧôōƧǿôͩѵôɝȃɞȁõƧρóó@ōƧŏړŐóŎôƨóƨôòƧôóȄ߻ƦõͬƧŎםͩɜНԭ̑ô̒óŌóƥ@óƨɝσԬƨôעəςƦöŐɝȀ@Ȃφ̒óȀƨƨ̎@ƥƪɚŌ@ƨôƪƧôəͪôôƧŌôȂυɜƧɞƧóəɜ̑ρͪɛ̑Ȃóƨƥ̍ôסӐ̍ŐƧŏɝôƧȁॡͪòԩρŏ@əɝƧŋѵɜɝóρŌυɛͪρƩȂѵ@Ȁڕó@ȄɜʶφࡔڔƨͪѶͪԬʶôƩעʶɚʶƥôóƨςȂ\"],encodeOffsets:[[98730,43740]]}},{type:\"Feature\",id:\"yun_nan\",properties:{name:\"云南\",cp:[101.8652,25.1807],childNum:16},geometry:{type:\"Polygon\",coordinates:[\"@@ôɞôɝ̒öôŌƧƨôͪôô@ŋƦ@ʶƨŐô߻ƪŏ@̐ɜʶѶНƧȁɜͧöô̐ςן@ŋɞʵ@ò@ȁɜǿóōɚƧɜφɞôƩ̎ƪóޠѺО@̐̎ƪô̎ѺƧƩƨƧ@ōóóôóςƪƨƨóôɛó̑ԭƥŌɛǿɝƨɛͩô@ǿƨȁѺŌɚɛ̍ןѶНɛƧôóƥȁƦͩôŎɞƨ̑ɜòôφ@ƨʵ@ɛѹōóȃəƨυǿóʵρƧƧŌƩɛ̏ȄñƧƧȀɝ̍ԩʶƧ̑υóŌƥʳɚӑóНƥô̑óӒѵʵѹƧӐןôƪφõŌƪ̒ԫŌƧؼƨƨסρȁƧƨȂóʶó@@ʴƨôôφ̎Ŏ@ȀƨƪɚƨóƨôôôςóޤƧŌƩŋƧԪ\"],encodeOffsets:[[100530,28800]]}},{type:\"Feature\",id:\"guang_xi\",properties:{name:\"广西\",cp:[108.2813,23.6426],childNum:14},geometry:{type:\"Polygon\",coordinates:[\"@@ƦŋѺ̎ڔʵƨŐ@ƦמȄƪôóȂɜŌɚͩɜ@öóɜôôȂƦôɜȁ@ɞφóȄ̎ƨʶɞŋƨʴɚǿ̐̎Ԭ@ôñ@̏ƨρ۫ôɚƨƨНƪŐ̎ƥóƦʵƥŋ@ȃóƥƧ@@ŏɝǿôυƧȁѵɛ@əóŏ̑@@ə̍óƧó@ȁƩρóòНƥô@Ӓ̑@óŎ̍ƥσŎυ@̍ƨ@Ō̑ôóͪƨ̒óŌړ̏Ŏ@ŌôȄѺŎ@ɜƧʶυ@ñóɛƧ̒ɝóōƥͪ\"],encodeOffsets:[[107011,25335]]}},{type:\"Feature\",id:\"hu_nan\",properties:{name:\"湖南\",cp:[111.5332,27.3779],childNum:14},geometry:{type:\"Polygon\",coordinates:[\"@@@քɜОƨ@öŐמóƪôƩɚ̒Ő߼ȁςͩɜòƪɜȀòñɝòѺͪ@ŏƨŋóɝôǿƨɚȃóəƨȃѵͩó̍@ȃƨóóƥƨƧ@ʵƦóͩɜɛóñԭɛōυȂ̍ƧƦō@ɛƥɛȀ̑óʷóō̍ƩŏƧОəƧóς۬Ƨ@̐óòԫ@̏̍əȀƧʳɝŌóɞƧƨɜóŐƨò@ȄƧŌρŋóôԪОóʶ@̎óȄ\"],encodeOffsets:[[111870,29161]]}},{type:\"Feature\",id:\"shan_xi_1\",properties:{name:\"陕西\",cp:[109.5996,35.6396],childNum:10},geometry:{type:\"Polygon\",coordinates:[\"@@ςôöƨɝȂɞȄѶóóͪƨȀóŎƨ̍ɜƦƦôʸ̒@ɜƧςƪôõô@ƪڔ@ôɜóʶôŌô̒୽Ӓ@Ʀ@Ѻ̎ɜѺɛѶôöʶôƨóʴ߼۰óô̎ñƪѸƩτʶ@ȁòŋəѹóǿ̑ʵ@ȁ̒ʷυփô݉ôН̏ط@ȁƨóô̏ƪõ@ʳ̐ʵ@ɝɛŋƩŌɛóןôƧŋ̒ó@ŏ̐ƥ@ŏυ@ƧƧôן̏@ƥȂѹɜəɛóԭ̎ƥóóóȀןɛô@ŎѹōñƦ\"],encodeOffsets:[[108001,33705]]}},{type:\"Feature\",id:\"guang_dong\",properties:{name:\"广东\",cp:[113.4668,22.8076],childNum:21},geometry:{type:\"Polygon\",coordinates:[\"@@@Ȃôôƨ̎@ɚ̒@ôŐ@ɚѶɜƨȂóφɞȀ@Őƨ@ôƦ@ȄƦŌƥʶƦôôŎôʸ̒ɜǿƦ@ɜƥŎ̎ƨφȁɜŎòƥԮŎƨōóŏɛƧɝəɞƧ߼ɜςȃñȄƦŎ̒ōôòƨəƨɚН@əƨ̏ƪʵυŌəɛóəԭŏəóŏѹρʵɝƦ̏ƥʳѶöō̑óóŋρȀυƧƥɛѹōƧôןɛŏѵ@óŋôʵɝƪԩõ@Ƨō̍@Ƨ@@ƦɝԮƪО@@\",\"@@X¯aWĀ@l\"],encodeOffsets:[[112411,21916],[116325,22697]]}},{type:\"Feature\",id:\"ji_lin\",properties:{name:\"吉林\",cp:[126.4746,43.5938],childNum:9},geometry:{type:\"Polygon\",coordinates:[\"@@נ@ôН̎ʵѺòƨōԬŎôȁɜŋѶô̒ŏƦōñǿòƧφ@ƨН̎@@Ȁ̐Őöʷ̐ԫ̎ôȂѺôòŌôƧ̒Őƨ̏̎ȁφ@ŋƩͩםȃƨ@ȁ̑ʶ@Ōóôɛƥѹ̑συ݇@ɜρƧȃࢯƨôəȂɛōƩɛ̏υρóõƪʴυφ@ʶôŌóρք@ɜƧ@ɝǿƧͪρȀƩó̏ŐƨȂ̍غړȃɛԮƨͪ̏ςƩôɚφȁƦôɜƧôʶφȄ\"],encodeOffsets:[[126181,47341]]}},{type:\"Feature\",id:\"he_bei\",properties:{name:\"河北\",cp:[115.4004,37.9688],childNum:11},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@Ʃ̒̏ŌѺ̒ƩóȄƧŌƥͪòôñȂ̎ŐóȂ̒̐̎ôНɜנ̎ôŋɞȀѶ@ôͪφƨŌɚɜȃóƧƨƥƪ@ʳƩɞρ݈@υНφʵɜƦρƨƧ̍ɝóɛѹ̍ρŏ̑ôóƨ@ƧƦôƨɛ@ƥƨ@ȂƦ@@ôəŐƧʶƨŌυ̍̎ɛŋôōɝ@óƧ̍ƦʵѵʳôʵɜŏςôƪŋƨŌɚ@ôНƥƧ@ōѸɛ̐ô̎ʵѵНԭ@̍̍Ƨò@ȁɝ@əρυͩƪ̏ƩõƧŎƧōóॡȄɛʶɜȀ@ɞςѶƧƥςɛŐ@ɚɜɜ@Ŏôôςƪς\"],[\"@@õə@Ƨɛ@ŐóƦφô\"]],encodeOffsets:[[[117271,40455]],[[120061,41040]]]}},{type:\"Feature\",id:\"hu_bei\",properties:{name:\"湖北\",cp:[112.2363,31.1572],childNum:17},geometry:{type:\"Polygon\",coordinates:[\"@@ñȄυƦöŐƩóנƨƨφ@@Ő̏Ʀ@Ő̑ôƨŌנóɜôƪŋɜŌѶօڔə݈òɞōɜŎôӏƦóƨô̒óôȃƨó̎ŐôƧƪ@ƨȁςƧə̑̎Н@̍Ƨŏρôԭͩԫ̍ʵƧóȀôɞƧŌ@ŐѹͩñòɞñɛǿƩɛñρͪ߻Ȃ̑ŏƪəƩóםôõŏƧ@ɛНƥȄó̑ѺƧôφóƨƨƦƪóɜŐôóòôƨóφ̐ƨóƦ̎\"],encodeOffsets:[[112860,31905]]}},{type:\"Feature\",id:\"gui_zhou\",properties:{name:\"贵州\",cp:[106.6113,26.9385],childNum:9},geometry:{type:\"Polygon\",coordinates:[\"@@ɜȀƦŋԮô̒ɚôōעƪƧʴɝ@ɛʶ̒ʶ̐ȁƦóȂô@ôŏ@ōôƨʶѸô@ʶƨɞó@ōτöòυƨ@@əƨô@ɛ̒@Ʀɜôȃ@̍ôʵԩНôóςŌƨŋ@ȃƧñôŏƧɛƨôɝƧʵ̍ôȃυ@ɝɛȂƥóóȁɛóõôɛ@əͪɛŋôȁƩóםȃ@ƥƧŏړʶѹ̍ƥŌƦȂóôɜƨѵО̎נəɜѹŋƧȂ@ȀóɜͪɞƧ\"],encodeOffsets:[[106651,27901]]}},{type:\"Feature\",id:\"shan_dong\",properties:{name:\"山东\",cp:[118.7402,36.4307],childNum:17},geometry:{type:\"Polygon\",coordinates:[\"@@Ʃ̐φͪɚςɞ@@Ȃƨñ̎̎Ԯ@ѶОƨƧڔ@φН̑ŋ@Ʃ̒ǿ̎@ƨɜԬςôʶ̐ʶöԫƨƧנƥɜŎôō̎@ôŏóρƧŏԫôóƧԩó@ƥɜƧԭóƨʵɛƨ߻ӑɜНԩóô̑óƧʳəóɛƧ@õȀƧ̍ȃɛŐóŏυО̍óɝƩԩ@ƧɚԫȄɚʶƨɞʶԪ̐ړɛƪ̒\"],encodeOffsets:[[118261,37036]]}},{type:\"Feature\",id:\"jiang_xi\",properties:{name:\"江西\",cp:[116.0156,27.29],childNum:11},geometry:{type:\"Polygon\",coordinates:[\"@@ƧȄôɚəȄ̎ʶԬԮͪςóƨŐƪτɞƦōƥƧ@ŏςôóŐôô̒ʷѶƪƩƩǿ@ō̒ɛôυ@Ƨȁѹɛəƨѹ̑ƨ̏óƥѵʷô̍ɛȁôŏɝǿƧԫƧôʳƥōòȃρȄ߻ɛɝƨɞɚɜƨôŐƧŎԭōñƦòԮɜôɛôͪƥ@ʶƧƨôƦƧô@Ȅô̎Ѷͪ\"],encodeOffsets:[[117e3,29025]]}},{type:\"Feature\",id:\"he_nan\",properties:{name:\"河南\",cp:[113.4668,33.8818],childNum:17},geometry:{type:\"Polygon\",coordinates:[\"@@φ̎ƪ̐ɞȄɚ@@Ȃעó̎ŌѺ̒ôֆॢȃôƨŎƨōƪöƩ̑ڔɜԩ̏ɝʵƧəʵԬȃƨəԪ@@Ƨ̒ŏô̍υȁƧɚ̍ôóŋ@ɝƧŋõ̑σ@ŏɜŋôɝ̒ƧɚôôطρóóɛƩ@óƨ̍ŏƧôóȄ̑ôƧóƥôóӐɛōɝŎ݇ñړɚѵֆ@ɞ̏ʶ@ʴƩöó̐\"],encodeOffsets:[[113040,35416]]}},{type:\"Feature\",id:\"liao_ning\",properties:{name:\"辽宁\",cp:[122.3438,41.0889],childNum:14},geometry:{type:\"Polygon\",coordinates:[\"@@ƨʴƧôôӔƨô̎ƩɞН̎ͪ߼ͪɜɞɚ̐@ƨςŏ̒ôƦƨɜô̎ƪôςǿƨͩɞȀƨ@@ɛςփôóŋ@ʵφυƩʳö॥փρѹס@əɛ@ͩࢯ@ѹʵρƩʶφȀƧ݈̒۬óʸɝŎѵ@ԭԫןɛƧƨƥςɛυʶφО\"],encodeOffsets:[[122131,42301]]}},{type:\"Feature\",id:\"shan_xi_2\",properties:{name:\"山西\",cp:[112.4121,37.6611],childNum:11},geometry:{type:\"Polygon\",coordinates:[\"@@ɚѺñŌɚôȄѺ̎ֆφóςȂ̒ɜƨɚ@@Ȁƨŋôȃƪѹ̑̐ŋƪ̑Ʃρρóó@ōɛɛ@əɜŏƦρƨρѵ@ɝɛǿɜʵóօѹ̑̍ŋסô@ȁə@ɝȃ̏̍ƩυƧô@Ȃ̐ظóОó݊φք̑ʸ@Ȃ̒ʶôȀ\"],encodeOffsets:[[113581,39645]]}},{type:\"Feature\",id:\"an_hui\",properties:{name:\"安徽\",cp:[117.2461,32.0361],childNum:17},geometry:{type:\"Polygon\",coordinates:[\"@@ó̎̑Ő@ƨƪѶǿɜ̑φƦʵ̐ƧѵôóƪôôυςƨȂɞŏ@̍ԫôò̑ƥóȃѶͩƧƥôŏѺôŏƦ@ƥͩƧôȁυó@̑ƧɛѵʵƩƪѵ̑ʸóóôŏρó@ŐƦƨƥŎσɝƩ@̎̍Оɚ̒ρƨƧȂôɜςôóظəó̑ƨóɞɛŌ@Őτö̒ƨŌ@ɞôŌ̎óƨəφȂ\"],encodeOffsets:[[119431,34741]]}},{type:\"Feature\",id:\"fu_jian\",properties:{name:\"福建\",cp:[118.3008,25.9277],childNum:9},geometry:{type:\"Polygon\",coordinates:[\"@@̎óȁƨӑ̒̎ɚƨͩφŐƨɝ̎ŋóŏρ@ōƨòʳəóƨō̏õɛƧ@ƨѵƧōəŏóŋƧô̑ɝɛʳƥ@@óɛõ@Ƨ̑ƧóȁəƧ̑Ƨ̐@ɚəОƧƧɚóñ̑ŎóʴƨƨԬɞȀóŐɜȂó̎ѶʸôƦƧ̐Ѻ̒ɚƧѺɜƨȂ\"],encodeOffsets:[[121321,28981]]}},{type:\"Feature\",id:\"zhe_jiang\",properties:{name:\"浙江\",cp:[120.498,29.0918],childNum:11},geometry:{type:\"Polygon\",coordinates:[\"@@Ѷʶƨɜ@̒φôóȂƨƦͪ@̐Ѹ̍τȂ̒̑נŐמôƪƧôӑ̑@ƥρͩƨօ̏@@υɝó@ŋɛ@ôƩəóƧѵυó@ƩɜŋƧ@̍ŌƧɞυŏƧͪ̍ə̑ƧӒôȂ̍@óφ̑ɜ@ŎƪȀ\"],encodeOffsets:[[121051,30105]]}},{type:\"Feature\",id:\"jiang_su\",properties:{name:\"江苏\",cp:[120.0586,32.915],childNum:13},geometry:{type:\"Polygon\",coordinates:[\"@@ôɞ̎φНôŐɜŏ̎Ȅƨöǿƨ@ôɜɚƨʴ̒ôôó@Ƨ̎əԮȃԪૉöͩ̐ƧòʵφƧôʵ@óړɜóŏɜǿƧɝρσȁѷ̎̏ƥóŐѹóŐƨƦѵͪôȄƦñ̒Ԭó@̎ɝŐƧȁρóφƩóóôƨѶ̏ƥʶυɛ̒ѵȀ\"],encodeOffsets:[[119161,35460]]}},{type:\"Feature\",id:\"chong_qing\",properties:{name:\"重庆\",cp:[107.7539,30.1904],childNum:40},geometry:{type:\"Polygon\",coordinates:[\"@@əȂòɜƨѺɛƦȁ̐@ƪõŏφƥòȃƥ̍Ƨôυ̏ƧôñóóôɛŏƩôƧƥôƧóυƨ̒ѹôƦȃ@փƥɛ̑@@ɜƧó@ɚƧ@ñφσõ@ŎɝôƧ@ʵѷóƧʵó@ŎóŐó@ôȁƥó̒υôóʶəƧȄς̎ƧȂôƨƨƨφɛ̎Őƨʷɞ@ςԮóŌôôφ@ɜֈ̎ƨ\"],encodeOffsets:[[111150,32446]]}},{type:\"Feature\",id:\"ning_xia\",properties:{name:\"宁夏\",cp:[105.9961,37.3096],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@ల̒ôޠφӒςôƪͧυևɜŋѺó̎ȁ̍ɛ@ѹס@@ʵƧȁôó@ǿ̐ŏöʵɝŋɛ@ô̑ƥóóƨƧóôó@ƩôóƦ̍óȀƨŎɛӒôŐυͪɛ@@Ȁə@\"],encodeOffsets:[[106831,38340]]}},{type:\"Feature\",id:\"hai_nan\",properties:{name:\"海南\",cp:[109.9512,19.2041],childNum:18},geometry:{type:\"Polygon\",coordinates:[\"@@φɜƦʶ̐ôφô̎@ƨŎö@τʵƦԩ۫õН̏óƥȃƧ@Ʃəםƨ̑Ʀ@ޤ\"],encodeOffsets:[[111240,19846]]}},{type:\"Feature\",id:\"tai_wan\",properties:{name:\"台湾\",cp:[121.0254,23.5986],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@ôƩɝöƧɝѵəޣ̏ρƩԭóōóͪρɞƧОôԪ݈ଦѶɜ̒ɛ\"],encodeOffsets:[[124831,25650]]}},{type:\"Feature\",id:\"bei_jing\",properties:{name:\"北京\",cp:[116.4551,40.2539],childNum:19},geometry:{type:\"Polygon\",coordinates:[\"@@óóóυóôƥ@ŏóóə@ƧŋƩŌρóɛŐóʶѶʴƥʶ̎ôƨɞ@óŎɜŌ̎̍φƧŋƨʵ\"],encodeOffsets:[[120241,41176]]}},{type:\"Feature\",id:\"tian_jin\",properties:{name:\"天津\",cp:[117.4219,39.4189],childNum:18},geometry:{type:\"Polygon\",coordinates:[\"@@ôôɜ@ƨöɚôôôɚŏ@óƥ@@ȁƦƧɜ@óƧƨƥ@ƧóəН̏óѷɜ@ŎƦƨóО\"],encodeOffsets:[[119610,40545]]}},{type:\"Feature\",id:\"shang_hai\",properties:{name:\"上海\",cp:[121.4648,31.2891],childNum:19},geometry:{type:\"Polygon\",coordinates:[\"@@ɞςƨɛȀôŐڔɛóυô̍ןŏ̑̒\"],encodeOffsets:[[123840,31771]]}},{type:\"Feature\",id:\"xiang_gang\",properties:{name:\"香港\",cp:[114.2578,22.3242],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@óɛƩ@ρ@óôȀɚŎƨ@ö@@ōƨ@\"],encodeOffsets:[[117361,22950]]}},{type:\"Feature\",id:\"ao_men\",properties:{name:\"澳门\",cp:[113.5547,22.1484],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@X¯aWĀ@l\"],encodeOffsets:[[116325,22697]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/chong_qing_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"500242\",properties:{name:\"酉阳土家族苗族自治县\",cp:[108.8196,28.8666],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@XJ°lJX@lbl@XbV@VLnJlxnbUU@IVK@lVIVwnJlU@n@J@L@Jn@l_nWVLVln@@blLmV@@xÔ`nxVÈLlxLVxVVV_U»VWn_m¥XwVmnX°lmUUVwÞaVk@a@mmIUa@mwk@m@@U¯a@UV@@K@ykkmwkV@kU@ÑVkKWLÅamaUm@kyU@WkU@UaIUaVaUUmUUa@aVLXKWa¯UUbmJXnWnX`l@@xkzWÆ@VLU¦x@b@JkIkJ@LmbUamJwm@óxnk@V@xVnUVmVUVUbVlUbkXW\"],encodeOffsets:[[110914,29695]]}},{type:\"Feature\",id:\"500236\",properties:{name:\"奉节县\",cp:[109.3909,30.9265],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@WVXbUnK@x@b²kxmKkl¯_VV°VU@bnKVVV@@nk@nbn@°@VLČU@°WV@VnU@InKVl@nUbKnXWlknLlKUwnalLaVlUXmWk@UU@UWWIUyķ¹XaWW@XKUIVmU@W@UVU@KV@n»VkUkÇmUmVIUmULUbm@wUaKkkm¯ÑUL@bWVnx@VmxUI@klmkkK@aK@IlJ@I¯k@mak@mnkJVL@bV@UbW`UUUVI@VU@VVbUJVLUVVbUXVVxk¦VJUnVxnVVUJV@Ubl@@bXV@L\"],encodeOffsets:[[111781,31658]]}},{type:\"Feature\",id:\"500238\",properties:{name:\"巫溪县\",cp:[109.3359,31.4813],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@nLWbXVLVUV@KIVl@b@lbUVnU@JÆU@V@n°KĢUl@VbÞKV@_VKXUU@KX@wlkkU@mWKUU@UôJ@XV@aVmÞIVaVL@»km@UkLU@aU@WWLUUUKkbwWa@KU@kaXmWLamVk@UmL@JmVUU@¯X@ċVUK¯@ÅnWKLkKULWK@UXK@wW@LkV@bVLlXn`¯xU°LnlV@n°Lnl\"],encodeOffsets:[[111488,32361]]}},{type:\"Feature\",id:\"500234\",properties:{name:\"开县\",cp:[108.4131,31.2561],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@n@naIw@@VVKLVbVxnVÆUnanKWXamKmk¯K@mkUm¯KV°w@Wm@UIUUlKUU@a¯KWanwmUXamKkUWUnU@KkUwWKXaWLUWkImaUUUKka±k@l¯wwmbUkXm@UJkIWXXbmUJXUV@°KllVXV@xmbnV@blV@VU`UL@Va@bULlb°VXbÜ@V@bL@JxnLVb@lVb@V@@zbXWXKVLV@@bUVVL@blVna@ll@zl@@J\"],encodeOffsets:[[111150,32434]]}},{type:\"Feature\",id:\"500243\",properties:{name:\"彭水苗族土家族自治县\",cp:[108.2043,29.3994],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@Jlb@nVV@bXb@ÆlLUl`nVKU¼VxkbWnlUxlXX@°°WnnJ@VUn@Jk°L@VlV@nUJx@bVVVz@VnLlaKnalVlIU¼@nV@@anKUwVal@UlJlI@akU@UWXKVI¯Uak@@KmkXWÜkXWykIWwXw@laXamkVUUym_XmlkkmmakwmIUKU@Wak@kaW@kI¯WIk¦VUUmaUV@XkVUV±aUb¯b¯¥m@@ImJ@mmL@kUKUkkJbV¦\"],encodeOffsets:[[110408,29729]]}},{type:\"Feature\",id:\"500235\",properties:{name:\"云阳县\",cp:[108.8306,31.0089],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@lbLVVVnblJVXXKWbXLVxl@LmVXVVlnLWbnVmxXb°L@bVVkLVVVJn@@X_WmkUK@alUKX@@xWL@VXLVKlLKXLÆm@ma@ml@mU@UUmL@aVUU¯U°`lknLlw±@a@wmLVWaXU@KWU@ak@VaU@IUVmUUwVmUIl¥UwUVWUaVUUKVIUa@UUUUJUUmknl@@VWV@L¯aUbUlx@@b@VULUx@VUxVVU@bU@mxUU@mUVklkk@WxknlxK@amLKUK\"],encodeOffsets:[[111016,31742]]}},{type:\"Feature\",id:\"500101\",properties:{name:\"万州区\",cp:[108.3911,30.6958],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@ĸĊVInaWWXlJVIn@lWVnax°xkl@²LVLnK@bLkwlmXw@lllkUnVV@VnwV@@aVUUVw@UVwVK@U@a@kwVVa°b@KXU@U@mkÇÑamlkUVmn@VULUm@kUVkUawUWm@Uw¯mKUUmVUUULUKUW@XbWVkaWwkUUk@maUbmbVlk¦xUVUIWVUkJVVkL@UmJUUVU@lLUVUlx@@VbJUL¯¤@V\"],encodeOffsets:[[110464,31551]]}},{type:\"Feature\",id:\"500229\",properties:{name:\"城口县\",cp:[108.7756,31.9098],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@VK@w¯L@m@UÅV@ImVUVka@@aUkJ@LUUVUKmLmbÅVmUUwUaKUL@U@xJmbm@nVJ@X@VkVnlLXx@b@bUVLU`UnbU@@mVVX@JX@VLVVklV`@bUL@VLVKn@U@UJkn@lmLmK@X@Jn@mbnÞWVXnJkKČÑÆ@VK@knaÜmXlUČW°kôÇÆ@a@yÞ_VmUnU@K\"],encodeOffsets:[[111893,32513]]}},{type:\"Feature\",id:\"500116\",properties:{name:\"江津区\",cp:[106.2158,28.9874],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@InWUUlU@LValX@°²lÒXxlK@Ul@@Un@UaVJ@I@W@UUUVUwVIUKUaUUVwn@Üx@XUlnnbJ@¥VklKUUlk@ynU@kVUUVWnI@¥V£VWVIUKU@UVa@n@Vm@@nlUaVkUwJ@blLkLW@XWmXkmmLn@m@U@UVm@UVUUlakUVaVkV@@wnaWUk@VwklmVIkUUxmJ@U@KIkx±V@IUm@K@IUKkbWKUbnm@bmVnbmb@xkxUJ@ULW`@bX@WVXL@V¯mk¯@UJ@VmLUaWnX@WJ@nkKkxW@UIV@@KkImmkK@UW@XaWIU@UIkbWbxXlLVbnV@bWlX@VxVLnl@nÆÞVÜ\"],encodeOffsets:[[108585,30032]]}},{type:\"Feature\",id:\"500240\",properties:{name:\"石柱土家族自治县\",cp:[108.2813,30.1025],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@@kl@¼UbmVXJ@bV@nxVIVJULVVk@@LWbnJVU@bVbUJ@blLXnWV@mbnV@Vbn@VJVLnaVanbl@VlVXxlbXUWaX@VUUVwUUVm@I@WmI@amlLlK@alwnUV@kóVaÝk@UlbVK@VU»VUUVWU@U`ULkwm@@KmU@knK»VkJkUmbLkbmK@UUyUU@awm@@XXJ@VVLVVUbVnUJVX@Kk`WXXJWXUbmW@bkLUm`Xnb@JVL@LU@°VVXKVnUxVLUbmJ\"],encodeOffsets:[[110588,30769]]}},{type:\"Feature\",id:\"500237\",properties:{name:\"巫山县\",cp:[109.8853,31.1188],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@kVUbkKmbVxkLmKkllbV@@LXbxlaLVVVKXXV@@bVlKV@ln@¼°KXaU@Ulw°JXalIUaÝWXW@kVU@VUVWUUUamUw@aVamwn@VUUlLXWm£@wÇĉkKklmLUÒ¯Wn@ğ±kwmaWm¼U@@LUV@V@XVUnVJLW@XXWbĸºVzXJVXV@@VXlWn\"],encodeOffsets:[[112399,31917]]}},{type:\"Feature\",id:\"500102\",properties:{name:\"涪陵区\",cp:[107.3364,29.6796],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@nèVblĖVVnL@xVn@nJ@LUVVX@lbUJV@@nn@VVVK@zV@nzVJVUlmX@@_VVVbnaVal@@knW@wnaVK@aVIJ@£kUVW@wXUVJam@Ik_X¥@WwkKkwmkUxnÅmm¥WV@Um@UlVL@JU@@X@UVkKVkKVkKkb@bmJVXUVVUbU@@`W_UV¯b\"],encodeOffsets:[[109508,30207]]}},{type:\"Feature\",id:\"500230\",properties:{name:\"丰都县\",cp:[107.8418,29.9048],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@Þè@XUK@LlV@blbUJ@V@bnV@VVVXU@lbXal@VXnKV@maXUÞ@amk@aVKXVanb£°mnIVaUKVwUmWLUU¯V@@KUK@IaWmn_VlK@anXVaXWWIXWl_@LUWVIUmVaUUUK@UWI@Wn@VI@mkU@U¯Kl@ImVÅLwU¤óbUU@wWXkmm@LU@@VUIWVUL@JUnax@JnbUIWVx@UXlV@¤IUJ@bULmb@xmX@lk@UbmbUaUU@`W@kn\"],encodeOffsets:[[110048,30713]]}},{type:\"Feature\",id:\"500232\",properties:{name:\"武隆县\",cp:[107.655,29.35],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@lwbVm@IVKXUVJ@UV@@KnnWlX@xVVôaV£xÆKnUVm@UmIXm¯¯@WkWVwmkXlaUwV»ULmk_VkK@ÅWa@aUU@mkaIb@n¼nm_@mmK@ULUVVmI@aUJ@XWJ@U`UIkm±kk@@lULmUmKUnVnlUVmI@VkVlxbkIVmLUxkKUXn¦ÆnmVwlnlxlLXx@W¦`\"],encodeOffsets:[[110262,30291]]}},{type:\"Feature\",id:\"500119\",properties:{name:\"南川区\",cp:[107.1716,29.1302],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@VUbVJVUn@VLX@WVXVVI@VUVWxU@m@ĊX@@¼V°aVUX`@_V@VaUUVUWnI@alaLUlLUllLVU@@WV@@IUKVkn@@VlLVwnKUlJakwlU@UnJVUmkUVmXa@wVK@UUw@VVI@ak@alInwlKXUmaUW@wWLkKVak_ÇaUV@XbLVxUlWIk@UK@V@kU@VbUVUlVnLUV@lVXmxkV@L@V@Vk@WbUwmL@JUI@xVxkx\"],encodeOffsets:[[109463,29830]]}},{type:\"Feature\",id:\"500241\",properties:{name:\"秀山土家族苗族自治县\",cp:[109.0173,28.5205],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@XlV@lzn@VnbÆbXKlLUÒV@@llUnxll@z@LU@@V°b@Vn@l@VÑUnK@UU@aUakVm@K¯wklmnnUl`nI@almkIUwmWVkUakkJmUUa@K@aU@@_m@@wUyVUUa@Um@awl@Wka±UkUykIWVb@bUVk@aU@UXUUIWakUWmUxUV@nUVWb@XXVVmXX@VbVLkVWx\"],encodeOffsets:[[111330,29183]]}},{type:\"Feature\",id:\"500114\",properties:{name:\"黔江区\",cp:[108.7207,29.4708],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@VX@V@LV@VJUL@lVnnxlb@VXVXV@@W@UIVK@kUKna@£VWUaVUUalIVJVIUW_lm@bXKV@mn@JUUw@KnIVll@VanLVmUkVKXLVKUIVamw@UaU_lwKlwUWV_Ua@aUa@KUwm_Ó@wU@nkK@am@UkUKmXk`m@@I@K@I@mkVmIUxUJ@kUL@JVVlnklWnn`VzUVnlWbkb@WxXxlJXzWÛlWXnl@Ll@Vb°UJWLX@VlV@bkJ\"],encodeOffsets:[[111106,30420]]}},{type:\"Feature\",id:\"500117\",properties:{name:\"合川区\",cp:[106.3257,30.108],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@XKVXlKVL@UnV@aValXXKU@WVwUaVU@IV@@aVWL@U@anVV@@bVK@UVL@bnJWL@VnUnb@@JnIlVl@@bXIWbn@UKVLVKXLlaV@VVnK@bVLmIV@KmknUUWVI@aVJ@_WU_VmUwU@KVak@am¯mJU_UJUkU@WkIV`UI@JV@LmmU@@mbUzÅ@VK@nUKbakb@UWK@bkVVbVÛ@@`Xk@W@n@lXL@bmb@VVJUn@JnUlnUlmX@`XLlbkJW@kzlb@`@b@b\"],encodeOffsets:[[108529,31101]]}},{type:\"Feature\",id:\"500222\",properties:{name:\"綦江县\",cp:[106.6553,28.8171],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@@¦@XlVX@@UVKlVUX@lanVlUVbXWVXVVVUnKVUlwUwU@UJ@nmVkUVlwXam@VaUUUw@W@kk»mV@UmKkwVKVUU@@LUKVI@mV@XVWxnXVKUUUK@wWU@UUWnUlLXamUIam@wI@K@amImUUkI@makUkKWUUan@wamLVxk@UVmUUL@Vm@kV@I@ak@@bWVXJlLVbVL@@bn@@`Un@WbUKULWVXb@UVmbXWVb@bVmxUKUV@Un@V@V@nmnKlnnWWXX@lKkK@aIVxUlVbk@mn@@U@mbVUV@VLUJUXU¤\"],encodeOffsets:[[109137,29779]]}},{type:\"Feature\",id:\"500233\",properties:{name:\"忠县\",cp:[107.8967,30.3223],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@VLÞĊU@W@¼V@lk@w²mlVUllVnI@VlKUUlIVXUVJVUwl¥UkUKUIm@aU@mUna@XUWmkK@aVIUa@aUVmIXa@Kl@UUVKUIUJmwU@@aWInUVa»k@@l¯n¤mabWUUL@bnl@bÝWVnbU@mLUWk@Wbka@WVUU@UmUmVkUULVlVUxl@L@VbÈÒlb\"],encodeOffsets:[[110239,31146]]}},{type:\"Feature\",id:\"500228\",properties:{name:\"梁平县\",cp:[107.7429,30.6519],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@XLV@VV@b°°nnkb@bnJWVXblIUVxWnUJnVVLVUJlUnLVK@UnUVJ²nKVbVKla@aXlJkKlb@U°£KVIUa@@kwVVUkKV@VUkkUVk±n@xkl@U@»@XVÝĉUJnxWb@UXKkVUbUKWUkVmkkLU`b\"],encodeOffsets:[[109980,31247]]}},{type:\"Feature\",id:\"500113\",properties:{name:\"巴南区\",cp:[106.7322,29.4214],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@nxnVlJlUXL¦@x@Vl@nKVVX@V_V@@KlVXU@lKlxXIl@ÈĊ@Vl@n_VJlnVlnb²VVVJVVmUUkĕUamçU@»W@@ĉnV@XwVU@UUJWUXUW@UKm@UVUIVaUUVmLUVUUUWWXUakVmUkbW@UVkUL@VW@kUW@mJUXVVU@lmV@zklVVkLUl@¦I\"],encodeOffsets:[[108990,30061]]}},{type:\"Feature\",id:\"500223\",properties:{name:\"潼南县\",cp:[105.7764,30.1135],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@@a@a@_kalyX@lIkaWK@_nWVkkmmV@IVmUI@Una@aWK@k@mkbWaknmJUk@mk@@kUal@Ua@Wa@aXLlwUKlkk@KmI@VUJ@Lk@@VUUmL@amJU£kKUaWakLmU@bVVUbnbWV@xkL@bUbxUxVbXJVbUVWIUVU@kLWxkKWV@n¯VUbU@@VVX@VmaUL@VUK@VVbn@lVnI@@lnLULm@Ub@l@na@lK@XVVkJ@b@zl@@VnV@bVb@J@bnXV`lXXmVI@W@InbV@@aVKUblKVLUanLlmnLlK\"],encodeOffsets:[[108529,31101]]}},{type:\"Feature\",id:\"500118\",properties:{name:\"永川区\",cp:[105.8643,29.2566],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@@bÜnWVLXlxVVxXxlVn@@bVblK@a@UnLVJV@@UnLVU@VXaVKVX@n`WUÿ@IUKlaUUUkWyUÛÅÝ@mmkUKUwW@Xk@amUUakKWwXaK@VVLklXVlkxVUL@bm@Vxn`IVxUVkLVUl@@lkXmmVUn@VV@Xb\"],encodeOffsets:[[108192,30038]]}},{type:\"Feature\",id:\"500231\",properties:{name:\"垫江县\",cp:[107.4573,30.2454],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@Ċ°¤nÒ¼aV_lKnllUXVVLValULVW@XamwVIUKkaÇÑa@U@KkVwkUUVKlVnU@aU@VIka@akU@KVL@WÝçUV@VmbÅ¯@LKnnJWVkxlL@VX@VxmnXVWxUb@bkn\"],encodeOffsets:[[109812,30961]]}},{type:\"Feature\",id:\"500112\",properties:{name:\"渝北区\",cp:[106.7212,29.8499],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@@bVVXLa@lnbWn@L@XVlK@VVLUVlbkLUKVVVL@VnXVL@VV@UbVb@x@¦UxVb@bUJL@LVVxlK@nk@U@WUVLlKXV@VblU@UUKVU@wn@VJVanLlkX@VaVK¯@a@U@U@VaUKkUU±maUkm@UUkbm@@Vk@@JwU@Ub@I@JmwUL@a@@KkVÇLkWk@kUU@@xUVmKUnllUb\"],encodeOffsets:[[109013,30381]]}},{type:\"Feature\",id:\"500115\",properties:{name:\"长寿区\",cp:[107.1606,29.9762],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@VVUbXlX¥l@XnVmlxUx@@blVnnôĀlm@aVaXwWUnmUwW@@UkKlwUXmImL@KÆ°na@UUImyU@@yULUUm@@mU@VIkaW@UUV@KI@mmUw@mKUnUUIlVLUb@@V@V@b°ULUbW@klmKUbUIm@@xUVVL\"],encodeOffsets:[[109429,30747]]}},{type:\"Feature\",id:\"500225\",properties:{name:\"大足县\",cp:[105.7544,29.6136],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@XUmaVaUU@anVlKXbValU@aV@@IXK@@bV@VxVK@UXLlUJXa@_@@aVKÅWVkwWawUa@am@kUWLU@kWmX@ykI@W@UV@na@LlLV@UkwWUKmXX`mIVl@bXLWVkbkkx@`VXm@@J@U@UUKUxk@WbUIVl@VXLWJUkUlUImxXlmb@X@VUJUnVbW@UV@@VVX@bnW@LVxUnlJUV@n@VxVIn@l`UVVVL\"],encodeOffsets:[[108270,30578]]}},{type:\"Feature\",id:\"500224\",properties:{name:\"铜梁县\",cp:[106.0291,29.8059],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@VblLV¤nI@bnKVV@Ul@@KVI@UnJ@LlklVLkxWK@bXb@Vbk@Vb@ll@@nVlnIlmXblaXl@W@_Ü@UUalU@aXL@VlabaVL@mUL@UUÇXUWX_WaU»m_@UWULWb@UUVmK@VU@UImK@V@bkLxXblxXUÆUL@b@@`WbIkVWK@VULUwU@@a@WL@JU@@bkVUb\"],encodeOffsets:[[108316,30527]]}},{type:\"Feature\",id:\"500226\",properties:{name:\"荣昌县\",cp:[105.5127,29.4708],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@VI@U@WnaWknwVJVkVlIXWK@UUkVJXal@VwVL@V@V@In@UW@_wlllaXUWK@aUknJW_Û@aWaU@@UVmUUaUImJVnÅUmVUm`kUUVWLnVU@VVmXK@nxmULkxImJ@nU`@X@Vkn@`@nlV@nVJVaXVLnK@bVV@nV@lbXW@\"],encodeOffsets:[[108012,30392]]}},{type:\"Feature\",id:\"500227\",properties:{name:\"璧山县\",cp:[106.2048,29.5807],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@XzVlVVkbVL@JVĀX¼VXbW`XWVÈVVVkV@@UXa@alK@IU@UKWUyUI@wVUUWVak@VUkW¹@WXI@yVIUK@kWwkÑ¯±W@kUb@KkVVVmXJ\"],encodeOffsets:[[108585,30032]]}},{type:\"Feature\",id:\"500109\",properties:{name:\"北碚区\",cp:[106.5674,29.8883],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@XVLV@@JkL@bWb@VU@UlÆVya@nV@nn@KU@IVJU_lJXV@VlVIV`nIn°@blUbKVI@aUaVw@¥@wUaVaU@@UUKWm@UUKUUVLlKkaVUUK@UkLWU@@KXmma@kbWKUU@aUamLnÞ@VWLk@@Wm@ULU@@UKUVWI\"],encodeOffsets:[[108855,30449]]}},{type:\"Feature\",id:\"500110\",properties:{name:\"万盛区\",cp:[106.908,28.9325],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@VIV@@wVJ@InKVxXal@@U@U@KlUnwUW@kVUKUmVkUa@I@KW@@bk@@mU@m@k@a@aIUxmJk@wULwkKmVVX@VXV@xVLVVULmWXwWUU@@nUJVL@KV@UVULlxnL@VnUl¼@l@XVxVVUbn@WbkxUlVnU@m\"],encodeOffsets:[[109452,29779]]}},{type:\"Feature\",id:\"500107\",properties:{name:\"九龙坡区\",cp:[106.3586,29.4049],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@XKL@V@XbV@lW@UV@@VXIV@UVKlL@KnnJ@VV@VU@I@@mVUVWUUmL@V¯LUK@UV@UU@a@U@yU@WLUK@X@KUVmL@@aXI@w@ammVk@WÛwm@UxVVVbVLUJVxVUV@V@X@JUIVbm@@Vk@@VkL@lVLUJ@zWJ@X\"],encodeOffsets:[[108799,30241]]}},{type:\"Feature\",id:\"500106\",properties:{name:\"沙坪坝区\",cp:[106.3696,29.6191],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@XºlUVl@UbVXUV@xVJVzXJVUL@VV@VKn@@Xl@XK@UmÝnKVbVakkVm@kUK@UmIm@LkKULVU@WJ@UU@@VkXU@Wa@@UKWL\"],encodeOffsets:[[108799,30241]]}},{type:\"Feature\",id:\"500108\",properties:{name:\"南岸区\",cp:[106.6663,29.5367],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@VVJVL@bUVVnl`XIlwXJlw°nnlIXW@UÇĉk@WJkwkL@WVkU@LU@U`W@UXUV@n\"],encodeOffsets:[[109092,30241]]}},{type:\"Feature\",id:\"500105\",properties:{name:\"江北区\",cp:[106.8311,29.6191],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@nLVU@wV@lV@XllÈKlU@L@@bVKnx@I@JVaV@x@Il@@Un@laVVn@mkUIm`k@WXJmk¯mkxWIkxWJk_UmVUUK@UU@@l\"],encodeOffsets:[[109013,30319]]}},{type:\"Feature\",id:\"500104\",properties:{name:\"大渡口区\",cp:[106.4905,29.4214],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@k@@U@w¥WKkVkImUmwa@b@xWJ@b@nKVU@L@WVLXKV@@z@V@bVVU@@VVL°K@U\"],encodeOffsets:[[109080,30190]]}},{type:\"Feature\",id:\"500111\",properties:{name:\"双桥区\",cp:[105.7874,29.4928],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@WwUwU@kK@KmbU@@V@XlJ@znWlXV@XK\"],encodeOffsets:[[108372,30235]]}},{type:\"Feature\",id:\"500103\",properties:{name:\"渝中区\",cp:[106.5344,29.5477],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@VL@VV@VL@aUKIUU@@JUVU@\"],encodeOffsets:[[109036,30257]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/fu_jian_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"3507\",properties:{name:\"南平市\",cp:[118.136,27.2845],childNum:10},geometry:{type:\"Polygon\",coordinates:[\"@@@knyk@KU¥wV@nkWzUmk@@lKUa@aVI@UKUamKUUVaUI@X@UV@K±IUVVlUbUbUL@KWUXmWk@KkXmmkÅKUa@amUbkUkKWUnwUÇwVUUÝUKV£U@nKWwXLVKm¥@wUXkmWk@@wX@lU@yVImaXwV@knU@mbk@mlUXmU@mV@n@bnW@bUIWJImVUKWbUK@nkKaU@W_VUUmWmL@UU@bUWUL@V@bmVUz@`mUUVVbXL@VL@lmLUxmVamXkW@xWbUVbUxkU±@ÅUmmkLUbW@@`kLknVlV@lbXxlVUXVVUU@UbWkIWVUUUJkI@llbUxVL@VVUU°ULUmWXUV@VULWb@xm@UaVLVKUa@w@VbkmVambUUm@@VkK@@bxlxX@n¤@X@@lkLWV@nVkb@bWJXLWx@nkxmmbXn@VWVUn@VnJ@bVXl@VJXnWbX`lLUlJVI@@VXV@Vl@bn@@Æmn@VxXU@mVIlxVnIl@nVJaXI@mlU@aXkVm°klmnVV_na°@V@xÜ¦XKVnnUlVXbVKLXKV@naV@@VVl@@lXblXWnLlbVK²n@@VLUnlV@lXxô°V@UnaUUlKXLVUVVUbVVlUnJVX@VW@an@lb@nl@VU@anUVW@kaUm@InVVKVU@kUW@Uam@km@kVa@a@nwU@WlI@mVI@WXaW_n@nlkkW@U¥@kV@Uw@wU@@IXK¥VIn@nU@`@Xl@VVLnaWbVaUwnU@VIKlV\"],encodeOffsets:[[122119,28086]]}},{type:\"Feature\",id:\"3504\",properties:{name:\"三明市\",cp:[117.5317,26.3013],childNum:11},geometry:{type:\"Polygon\",coordinates:[\"@@lL@Un@VVnabnUla@Ux@VbULUKVbn@w@XaVK@UVUXWVnVKV¯VU@UUKVwka@klJVIVVXUlJXVaV@VUUVWkUWwkaU@UklmlK@_X@ValKnnÆV²@lVVwUaVXa@wlXnWbnUVwnK@kK@UWKUaVUnV@_VynU@a@UVKVXaV@@VnKnXVVUX`V@blL@mVLXaVLnUJXIVJ@amX@a@mnUV@nVWnkl@naV@ml@@KmKUam@UU@@UlKUVkUK@aVaUwVU¥UIkJ@wmI@mbkwkVW@UXKULU`IVKUa@LkkVmUU@WlULUWÅU@I@WWnU@@w@a@Uam_XyVIVWkk@mwVKXUV@nwVXkWÅU@aU¯KUnK@¯mULXVLnWVbVbUVm@Ub¯¼W@am`kbamLUUUaUXV`@x@XmJ@n@L@xkJUU@kU@mWm@kUUwUUVWl@VUkIy@kkaVUUmIWVXbWxU@kmVkK@nWVX¦WxU@@bkx@VU@Wk@kUbmJUUmkUW@_kKWK@knV¤kIUKWLUbV@Wbk@@VWL@VkI@lUXVxUVU@@mWIV@a¯nUaaUV@Jb@bÞ°VbU@XaUVmL@VXblnV°n@Vnx@VUUUlK@InJVb@Vlnn@VL@VWJUx@XlJUVVVl@LUUUJ@L@lUL°¦kVVnV@xVl@blLnlLVaXll@nVUn@xn@nml°X@lb\"],\nencodeOffsets:[[119858,27754]]}},{type:\"Feature\",id:\"3508\",properties:{name:\"龙岩市\",cp:[116.8066,25.2026],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@aI@VUbVb°m@bUXJ@nV@VUUwVW@klJ@UXK@Ul@Xa@UVaXKVLlJU£lm@XLlL@`VXnlVVnIVall@XV@@Ulw@aV@XwW¥XU@mlLnUlV@XwWaXUJVnUVlb@lzlJUVk@UXVVVxlVn@nXV@@lVVlI@w@K@mnI@W@wU_VWbVVVnKbla_nbX@°»Van@VUUaUamXUKWK@a@Uk@wWkXWW@wUUKw@_lywUkU@@U@kamVmXaUVUka@Wk@»UUUVKkbWUVUbk@mkxkKnIVUmW@kUKmXUmVaU@kU@m@KUWVkIWJ@U@UI@wUUUa@KW»nU@mVkUmm@XwWU@UUmL@w@mnVUU@aWak@@amxU@UxULWVXbVLU`mbUImVUbnV@@bVn@bnVWxLmyUbIUK@aVmakbVUXWUlKWbkV@WLUlk@@nbb@lkKmU@UIWJkw¯UUVVxm@@XkbWxXKlUzWJkUUL@bmKkV@@VUIUlWV@XK@VkbWx°xUb@LUbk@@VWb@LXJ@VWXU@@bUVVVVn@VVlLn@l@xk¦Vx@bVJXbn@JlnXxV@@nJ@X@V@lmxbUn@xVL@VVKlL@lnLVaVL@xkl@LxVl°XWVXVlJWnxlJ\"],encodeOffsets:[[119194,26657]]}},{type:\"Feature\",id:\"3509\",properties:{name:\"宁德市\",cp:[119.6521,26.9824],childNum:9},geometry:{type:\"Polygon\",coordinates:[\"@@@LVKVaVaUkVU²J@LVU@@WVJUbVVnLVbL@VUJ@bVbkL@l@VnyXmlU@xV¦L@lmz@lnL@bVVbVb@lnKVkVl¤@zXV@l@XJVLVKnXVKVnU@wUm@KU@UlVlw@U@U@UaUKlU@kXKlmXIWKXaVIVUVK@KU@@kJVUnLVJUL@VIVa@VnLKUnl`VbVV@Vbn@Vzn@lKnVlIVVKUalkXJl@XXVWVLVUUmVU@Unm£lK@Uk@WUXK@U@WVwVkĠkĢÇ°aUÅUwmaţɱUÇaw±V¹XalKôx@UVaÜʓͿVóbÅLJm¯Vk¦k@mamXkKUULakbk@mV@LkJWb@VkmXk@UVmaUV@amLUKUamI@KUaU@WbU@UUUUIWJUkm@wKkVJm@kxÇVUK@mUVUkmlkkVm@amwLVWU@UbVLkUb@VmK@XaVWU_VJnwV@@kUmWakx@kwWakIWxnbUJz@kVW@@x@XllnVW@xn¦ULWKXxmL@VU¤VLÞVVUÈxVmxXVlLlVanV@bbVLlÆnnlW@LXlWnXV\"],encodeOffsets:[[121816,27816]]}},{type:\"Feature\",id:\"3501\",properties:{name:\"福州市\",cp:[119.4543,25.9222],childNum:9},geometry:{type:\"Polygon\",coordinates:[\"@@lxna@nJ@xlIVJV¦UVxUb@bLVUlVkL@V@VVn@VbLn@LUlJXblx@lwXbVn@lU@mxUIV`UXWb@nLU@ValUKVaV@UXKnxbn@lUkllnUVnV@VLUÈlwn@UIlLxn@VlXIVJVVVV@XaV@Vb@LnJVbVLnK@bVUnbVUl@nWl@UXalI@KnUl@labVKVlLnWnbl@l¥°UnIÆKôa΀Ua@UUwÇWǓIUWUÅVkƨm@@£@KmLU¤ULˣJkUVǟUUķ@ĉVKUk@Ñ°wôÇç@īé@Åţ¥mīÛkm¼Å@VķVó°ō¦U°n@bVJXVVL@bUakLmx@xmxXzW`XbWnXV@bWLÛ@a@aXbWVkaÝwU@mlWKkLWWkLUKULW@kVmVUUÝUamV¤n@xUVUzkJV¦lJU\"],encodeOffsets:[[121253,26511]]}},{type:\"Feature\",id:\"3506\",properties:{name:\"漳州市\",cp:[117.5757,24.3732],childNum:10},geometry:{type:\"Polygon\",coordinates:[\"@@@bl@Xb@bVVUm@nx@nKVV@XVWxn@VnUl@nmVX¼@LVbVV@xVJV@@XIlJXUV@Ln@lVV@UbVnnWVL@lnXUVmJLlwnll@VaUXVlaLVUVV@¼Xl@lbUVVWbnnUlb@@VV@aVUmlUaUny@kU@Wkk@WaUVk@@ammk@@U@UlU@aUa@wl@mXLllnLU@anVnU@L@VVV@KlXnWVnVanUw@w@wmnÅ@waUam@UkmUl@@aa@U@¥kôKwÈ¯°w@ŻkwǕaKÑÛk@ĕōřċ£ĵUKW»kÅŻLU@Ulġw@¤VzVUbkKUbmLmlULU¼UxmbXl@bWVb@bUnVUVbULU@@VkbVL@`U@WX@XV@b°@b¯@¤@Xm@@b@`UVVUL\"],encodeOffsets:[[119712,24953]]}},{type:\"Feature\",id:\"3505\",properties:{name:\"泉州市\",cp:[118.3228,25.1147],childNum:9},geometry:{type:\"Polygon\",coordinates:[\"@@Vlxkz@`xLVV@xXXWXl@xl@V@bnV°@LVm°LVbV@ÆXWlUmxU@WVULnx@llUXUJWzn`Vb@@b@xV@mXX@@JÆVVXVKXkV@nVlUl@KVbULJV_VKLVWX@lUVkIU¥lIVyVU@wm£nUVWU@am@UmWw@UX@@amVUn@@aUUlUVanaWUXWmUnkK@VUlVVUUw@XLWWXma@knmbVbVXbVL@XJlInlLwmXów@çV»ÇçŋaķƧóƅóKġ°nÅUķƑUÇW@¯xÇ°öÆlVn@lla@Lb`@VXVVx@V@bULVJUkÇ@¼XUKk@mmULkaWbk@x@UkL@a@K@U@UmKmbU@kV@UmVUbUmmXkW@LUU@U@KmVmU@bVmKkkWKnk@@xVb@bkV@V@Vl@nn@bl@VUXbl@XlV@@lmzVVbknUVb\"],encodeOffsets:[[120398,25797]]}},{type:\"Feature\",id:\"3503\",properties:{name:\"莆田市\",cp:[119.0918,25.3455],childNum:2},geometry:{type:\"Polygon\",coordinates:[\"@@VbÞVVnUlUX@VKVLlKXXlKXLnkV@ÞxlbXUWab@bÜ@XK@aWUXmWaX_Wynw@wnwlKbV@aUKWUUI@amV¯Ŏ¥ô¯ĸUUÆ@n»¯aƿé@ţ¯nĉĬÝKóó@ÑU¼@èxWônxKmkkJWI@UKWaUUaamn@lnbWXXWK@VxUVkUV@ULmlnVWXXVmbUbkVVV@bm@UVn@bW@@VXxn@Vn@bVUX\"],encodeOffsets:[[121388,26264]]}},{type:\"Feature\",id:\"3502\",properties:{name:\"厦门市\",cp:[118.1689,24.6478],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@@VlUV@nanL@V@V@L@blK@Vwl@XalbVKnnl@VLW»È@lVUIVK@a@UUwWUU@_aK@bkkm@UkõÅxóLl@¦@Vb@bk@VnVln@Vbb@xmÆn@x@xx\"],encodeOffsets:[[120747,25465]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/gan_su_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"6209\",properties:{name:\"酒泉市\",cp:[96.2622,40.4517],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@ÇnÅaĉ@U¯¥UŹ£WUýUU±JkkUwyÞIČxĊĕĊ¯¥ÆUkţUÅÓ±¼IUx¯UÒƑÝÅ°KÝnğ°ÅU@@Vn@þ¼¯WnŎ°XLWlnVnbWnVXxmbabóUlǕUUaIUmlU¥k¥ĉwkkÝɛa@¯U¯°mVkVnKlōÑÇÑU@klUġkUŻnUW@¯k»mWV£UKnUmUww@UIVaXwm»Èmmwn¯ċ¯LĉUJUalka±Va@Uk@ÛÑ¯WmnUaɝ¤Ûmn¯m±x@wóxÛLġÒUx¯VÈJUbózÝÇKĉ¯ōlÝUÅWl¯nťbÝ@¯ǩLġmV@Æ¯ĢkÆmĊkVťLɃmÝXó°@ĢbVóVÝ¦ɱ@ƧaġUVĠÇÈV¼UVţwmbJÇwˋaXmÇ¯KkkmbXm¼V¼ǬŚ²¤ôŰÆƴô̐ŤǪnɆӨ¼ɆLÆłUĊxŎƞȘǔˎǬǪnƨŮǬö°»ġÞÜÆĸÒĊǀbƾèôÈ@¼¯þŤĸƧ°VĀ¯b@lÈĊʠń̐ȘKǀֲॗţÿǕý@ʊǓƨóÆÑǖŃôw@΋ʈƆÅÈVVĊVóĊÅ@ÞƒĬV@Þī@°V@ĸĢ°XτƜĠ@ÈaÜ¥ŐƅnğóĕVġUůƿŋĕa±VUťÇğÑ\"],encodeOffsets:[[101892,40821]]}},{type:\"Feature\",id:\"6207\",properties:{name:\"张掖市\",cp:[99.7998,38.7433],childNum:9},geometry:{type:\"Polygon\",coordinates:[\"@@ÈÒŎÒkmLUlU¯nV°@°ɜbÞĠaÈ»ĸlLVUÈ@Ċ@ýUm@@ÆVĠ¯ÞmLÆ¯ÞƒÑ°VVwJ²»ÆÔVlŤÅV¦ĉ°ĉĖċwÝJzVxll²IVVVþX¤źV°¦VĊ@ÆbÈmǔLĸĠ¯Ģaô¯ĸmÆÛUlÇĸk°XyĊUǔVǩnmV»a@ýnK°n@l¥@»żĊ¤mç@£ČU@mmVkÞUƐ±²¹°ĠwÅƑŃU¯V¯aÈŁÇ»ġn_°xŎKlxklx@Þw@Æm²bÇ²LlkWXať¯ĊaÑK±w@wUÅçV±Uk@@¯¯xU±±UU°ōxVxÅÔō°ó¯UÝ¦óbÝþ@ĉÈóUVUx@VUVÝwÅÈÇóVkk¯JÇkmmL@KÇx@bk@U°ķ²ó`mn¯°UwlÅkU`¦ɛôķz@ÅnÇ°U¼¯KmVk²J¼ƏÞķô¤UL@mnğ`ÇnUxÇ@ÛÿU@kŻ@x@móJkÅ¥VŹĉóÒĉlċ°ķUƽÜ@x\"],encodeOffsets:[[99720,40090]]}},{type:\"Feature\",id:\"6230\",properties:{name:\"甘南藏族自治州\",cp:[102.9199,34.6893],childNum:9},geometry:{type:\"Polygon\",coordinates:[\"@@ÞnKlnwX¥WÝXkxÞUn°aĊVnUUKlÞĶWXnĠ¥ô»@nmVL@¤°VzJanU@aÆwna@kU¯yX_aĉbwéXkWwÅa¯V¥m¯UI@@mb°aÈçU¥@»knwɜƇ°I°ÑÈmVU¯Xa@wW@wV¯Č¥l¯Uwnm@kaUaóKkk@Çab@ÒWa¯IÇxÛam¼VUxÒl@zÝÒ¯bÝaĉVĉwÇWzJmJn²mÜ¯U¯ĉ@ġ¤Åb@²nml@@ULVxVU¼Ålmab@°l@WIU¯@m@ó@UzţyXÇUÇVUUVLkbWakVWmUbkkKUÆ»n°Knk@aUVmnk»l¯Ģlw@_kKVU@na@lUk@¯¥mV@kmbWb¯Åõa@mkU@kÇkU@`@óóbl¼Uxn¼lVÈx@blVkVVn`XÈġÈ@ÇK£ÝJmUUnUĖmlUmKUnVÅaUwUĉ`¯n¯wW¼nxV@bĉnkIċŘkXU±ÒxÈ@X°`lVIÈ¯ĊVVVan@VaUVażVmblkÈWWIXaalL@wVbV¦lL@lĠnÒUnkL@ÆÞkÞKbñþW¦ÛċVULUºkÈlŎUxÆxÞUUxÒx@XbL@lÆ@ÒlXVln@bm¼J@Ånx@bnĠmxVXmbÈè@Ċ£ČWw\"],encodeOffsets:[[105210,36349]]}},{type:\"Feature\",id:\"6206\",properties:{name:\"武威市\",cp:[103.0188,38.1061],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@±¯¥@klwU»ÞÝmwKm¯ç@kVÇUL¯lVUKġġm@a@U@X£°l°LŎÇ@aōVÝwÔKUÅWJ¯lm@ÛVWa@klĉUmaLUanak¯J±KkXóÜÅx²Ç@nUÒĊb°@ÆkLXÇÆ@xÝnxWxţ¯¤I@ÆnVVVlU²ÆèV@x²xLÒĉbŦ°WbXklÞ@l¤XĊ`wl@ĢÈŎm@bnVUb@ÈÆÛLèÇUÒÅ¦lĸ`°ĮʟÆǓbĉôϚĊÆĢnŤé΀ÑĸĀĊ¦@@l°l¦Ȯ¦ɆÞĊKŤĵĸů»mŁyġķŭ@Çɱȭ¯mƧUĊķnŁŻ»UaUƛɞÝƨů\"],encodeOffsets:[[106336,38543]]}},{type:\"Feature\",id:\"6212\",properties:{name:\"陇南市\",cp:[105.304,33.5632],childNum:9},geometry:{type:\"Polygon\",coordinates:[\"@@ÈÞ@l`UmV¼@nnÆwVlnVVaLVÈ_ÿÞ@naxÆ@l_@VxnK@llLnxmÈŎJnbUxI°l@n¦lÈIlmX¥k°@kJk²é@klaUaVaU@@ÝnIWnmnxkºÞaV°V@nwKxôbÞ£VUbþLn»mVwIJ°@nb@°°IġUkÇKV@Å¯»lLnm£@anK@ÑÜn@»mL@£ykUUmbUÞÝ@kyÇbó»XUxWVzb±mÝbXawUamL¯»@wUKVwm¯ĵJ°ÅUWVkKVk°wÈVVÑlU¥kmVamknUw¯¯bċ¥ÅKkKkVċVk£kKVwÑa@kóyÛ¯ÇVkówXō¥Ç¼ów¯U±k@xIĉÒÅVmÈnÜ@n°bUbÝVUnnJ¯Į@m¦nVÜ@L°JXbÑ@aÈb@llôLVbb@lmnVxk°ċ¦U°@xX@xWb°UVÇn¯Ò¯Jɛƈmxl@¼\"],encodeOffsets:[[106527,34943]]}},{type:\"Feature\",id:\"6210\",properties:{name:\"庆阳市\",cp:[107.5342,36.2],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@kwĉ»VamV¯wIóVkl¯KmVō¯ÝWkL@bÝKō¦@@Lx@b@la@km@@l¯nm@UaÅ@óWUXm¥nw`@UUxķôÇ°ğ¦@VJ_nIVnalxkXJWn¯nVLxl¤nnVbklVX@xnxmV@bUK@nm@@xV°±aÅnkUWnUax@mn@¯LmUĀlU@lV@blLUblxklkIÇx¯°UXbaVUnV@°LUlnbX@`°nVmbnÆmVkLmK¦U@Xy@kl@U°K@¼XbW@bWnLVaVVz@xlVČ¥lbUxÞlVU@nÆWôn²VJlUƧLnmÜLXan@mw@wlUlV²mblwVÈlLÞ±@lVnUlxnkma@mkJ@kXVU@mn@¼VXUVlLnmVbôaVnWV»ÈUl°È¯ÆInÆU@kk»mKkÆġk¯@»mk¯@óÇlÇ@VykklUml¯Þ@w\"],encodeOffsets:[[111229,36383]]}},{type:\"Feature\",id:\"6204\",properties:{name:\"白银市\",cp:[104.8645,36.5076],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@VKUÈl@è°nLnxÝÞV¼kx@l¦²°ĊóĠĊ»@ÈxaĊxlwÈVŤa@¯²aÇ£Jk£lnUÞ@°ô@ywl»lIX¥Ǫnw@ÑÞWlaÅlL@Uwĉakl@¯mwna°JV¯nUVÓÞÑm£²óWaUÇ@óÝUçV»ÈkkW@¯xV@XlK@wX@Vmm_@wÈÝKU¯ÇwVwÅK¯VkJXkWVaIm¯UkÇlVĀV°mxók@¼óWxĉÜU@UbzÛJÇk@ÆnVlÔ@kxô@ĬWL¯K@aÛImm@IUa@UÇêU¤VÒÇx¯ÒVlk@Wbĉ¦UbkWV_y¯Laók@b@nmbkx°\"],encodeOffsets:[[106077,37885]]}},{type:\"Feature\",id:\"6211\",properties:{name:\"定西市\",cp:[104.5569,35.0848],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@aV²wVJV_@LlanÅllŦçÜÓ_lnWaôkxUbmV@È°lènk°l¦`@nnL@ÈlÜIyVaV@ĊÛXwô@»lônwU¯ÿUÈkl°VnJUblXWIl°UV@aVVVmnL@lUUwmk£bV¥VUVwÛlaÇÝÞmk£LUy¯L@WlkKW_XaWmġU@akakXkmVwmŹVUbWónmwnWW£KÈnV¥¥Æ_klWbU¯V°aôbnaVwmaōInÇmwkK@kmLUw@`kÅ@wb@mÝĀÇ`UKUbmUUkÅxmm@»nUVk_Ý@Ç¦VÇè¯ban@@JV°nU¦°ÆbXxWlêxĊabW`zV°@lmbÅx@bmVbI`¦@ÒUVUI@ÆL@b¼@@lmxnL°ULÞğÞ°kLUL°xVnKVl@zX@\"],encodeOffsets:[[106122,36794]]}},{type:\"Feature\",id:\"6205\",properties:{name:\"天水市\",cp:[105.6445,34.6289],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@UyÈVVUnn@VU`UblzJnk@VbKU°lwW°nkVUÈl£°V@n¥VklkU±Unlw¯UkwmKUlmkUmnkym@Å@UmWÈU°l°anlJkUKlU¯Èm@kmWV»kkÝLUWUx±b@¯ma@¯IJUxnm¼KýaVUÝ¤óawLmxU@¯UbÝ¹lmwmnXmJ@ÞV@UbVbkbl@±êlIl¯@lW¦knÇJkm¥k@¯Jmbóa¯bUV°akXlÅ`¦U¦ÇmLX¤mXnxmôXaVźUnUxlnlWbl@bĢVnXWbX`lLXk@°KVzKl¤nÞÝÈkbÜ\"],encodeOffsets:[[108180,35984]]}},{type:\"Feature\",id:\"6201\",properties:{name:\"兰州市\",cp:[103.5901,36.3043],childNum:5},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@lW²L°IlmbVbKnbĊVlk@XbÜU@kn°XIÆVLÓÞxŎUlôb°KzU`lXVaĊ¥Xal@kU°ÑÈwUÑV£ÈéV@VbJ@nnÜJ@bL°XK@īówl@kÓmUÅmK@m_k¥l¯mkçÇ¯@nUaVwólXbmk`ÛÔťèkkmÆkbK@U`UI±xUbWlXmbVbÅÒólkIWJk@zKŻ¼@xUxó¯LWb@ÅÒ±¦U`nbťĀUVbLU\"],[\"@@¯lwna@mōÈ¯K¯kW¤@@V@bĢnĢVLU°k\"]],encodeOffsets:[[[105188,37649]],[[106077,37885]]]}},{type:\"Feature\",id:\"6208\",properties:{name:\"平凉市\",cp:[107.0728,35.321],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@ÆLUxÈxV°LÇÞ@xn`Ü@X@nĊÆwnJmwUxaUkw@V@waVmlLXÝl@XVĢmV°@nl@UUUWK@wÿVI²Òlm@nÝĊýVV@nJ°Ułm@kV¼nKĢÈ¤ôKblnKllVk²aĠ¥È¯ĸóVw@V_xmn¦VWôXÆ@Vbn@°m@kn@@lb@ka@wK@@UlKVaWXW²¹lÓw@_°n@@_lKÅķW@mLUWn»Û@l_Ç`Ûmm°ÅbWb@VWbUUKÇÅaġlmkUġl»LlUm¦@¯U¤ÇkVUml¯Xx¯kVLUa@mlIkyVa_UV@mmUVUÇVzUxUVU¦a¤lnVxVk@mKUnUU@bU\",\"@@@ż@mlkġk\"],encodeOffsets:[[107877,36338],[108439,36265]]}},{type:\"Feature\",id:\"6229\",properties:{name:\"临夏回族自治州\",cp:[103.2715,35.5737],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@@ż»Ly@lXIJlôkÆÑUanaWXkW@yk@ULmUw¯KVlK¯ĠÝÝVK¯mKnwk@@»@aK@ÅVJVU@Ñ¥_Uy¯@£UKmn@ó¼ğ¦WmĵXÝkVLmVĉU¯bmÝVwWlXÞW¦xkmmLÝ±U@VÞ@ÅÈW°XÜ¼ƨyUĮnWnXÝxUx°lVXJlôV\"],encodeOffsets:[[105548,37075]]}},{type:\"Feature\",id:\"6203\",properties:{name:\"金昌市\",cp:[102.074,38.5126],childNum:2},geometry:{type:\"Polygon\",coordinates:[\"@@ĢÈ¼Çł°bU°VƒńÆǖŰnÆōĬǔaʠÅ¯ĭ_kķÆ¥VÑÈçÜKÅ@ÇVaUm@aōnġÇk@xĉ_Wk£@Ý±KÈ±aÅn@Ýx@kwlkwōL¯wm`\"],encodeOffsets:[[103849,38970]]}},{type:\"Feature\",id:\"6202\",properties:{name:\"嘉峪关市\",cp:[98.1738,39.8035],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@llĊx¦l¦kVVnJVbǖVkôVabnaWwUXmmamUXkWKō¯Xm°»ĉÇ@UVKķkÇ¼ğb\"],encodeOffsets:[[100182,40664]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/guang_dong_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"4418\",properties:{name:\"清远市\",cp:[112.9175,24.3292],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@lÇ¯kÿaV¯VaÈU¥ÆÇIlxmnbUxlUôl°kWl@ôVwUanUl@xVkaX¥kU»a¯±@kka@UwmUkwJk±k@L@ÝWUwVÝxÇU¯ÇX@mÅ@@yĉ£VmUwȗ»ÇUnlUnWU¯`Uk@@x@bÇxX¼VV¯LĀkÝL¯@VĀ¯lnĊW¦kVÇôkUÇUK@ţU@aóÜUU»@¦k@VxKVbn@Æl@xbWnlUlxÈlVÈ°Æ@¼@xWxŎVK°¥nÆkŎ@ÈÑmK@¥k@ô@nôV\"],encodeOffsets:[[115707,25527]]}},{type:\"Feature\",id:\"4402\",properties:{name:\"韶关市\",cp:[113.7964,24.7028],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@WXk±Ñ@UwmUwĉwlmn@Æwn£mkI¥ÇÅ@¥aón£nWWw£V`Þ@nVml@xô¼IV¥kUmkamUkVWwÛ»mó£UVÅKmn@x@kbmm¯aXkaVĉaUbÝ²lIlxnVVx@lb@l²°bV¼lW¦bUlwk@mVVbUxó@kX¯lókVkwVmankwJÅÈ¦ÇVUbU°blĀ°kÈ@x¦ÆÜ°@°¦óaVUôlUlbXl@nÜVnKlnIVÞ°W°U@bnm@¥IV²Ul°VnalzXyl_Vyƒ¦lLlx@ÞbKmknVWanwÑVwČº@n_ÞVaVÜIl@KÈVJ@a£È@@kmaV¯W@_a¯KmbkÇkLmw@Å¥\"],encodeOffsets:[[117147,25549]]}},{type:\"Feature\",id:\"4408\",properties:{name:\"湛江市\",cp:[110.3577,20.9894],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@@kX@aUUċlkJk@wVJXUWk°W@nKnwlUl²blU@lIl@XbWxnm@lW@wwUJX¯VU°`ŎóˋkÝÝkÅ@ÇmğÈřmwaĵVxUÛ»°ĠǷnýmóX¥ɅĵҏÇ@°²ĊUĖ±ĮU¤Ç°Ā¯ɐnżUĊĊĬV@è@ÔÒU¼l¤nĠbêVĠ°ÈyzVaVnUÆLabVlwÆ@\"],encodeOffsets:[[113040,22416]]}},{type:\"Feature\",id:\"4414\",properties:{name:\"梅州市\",cp:[116.1255,24.1534],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@nÔlW¼x¦@lVllLkèa@z¤Ė¼UxlnUKUbÝlU¼lb@VxVklJÈwV¯@ĠlÛĖnbkÆźÞUÈôklmL¥LWnKUkVa°Vx@IVV@x°bUkaa@mV@@ywLÑUwVUVUbÞVVann@XwÇÿ¯²aVamkXaÆ»@»nw@¥UXakbWa¯KUw@¥m@kwmLU»UUJ@kmU@UUWU@yanwmçÛl¯¯UmKUmwVkmÝXbW@XWÝbk¯@±w@»U@W¯Å@Ç¥UU@IUakJĀê°þXkam@_J°m@X\"],encodeOffsets:[[118125,24419]]}},{type:\"Feature\",id:\"4416\",properties:{name:\"河源市\",cp:[114.917,23.9722],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@°VlmX¹laĢÒlm@V£@¦Ģklynn¼lW°zW°VbÈV@lÆbnnJkXVÆaÅW@UUw@kaV»ÞkVaVLkmVw»ĕ£@yblçkKkU@k¥wX»kmÓ@Wn¯I`@nlbWý¯éÿlI@XUmWUw@@UJUÇmKUV@xţk¯¯LWnUxK@Å±»Vwa¯@¤WX@Û¦@¤ÇIÈ¼WxX@WxwUnVbÅèmVa±²UWl@klÈ¤nôÜ¼XxlUnVlbVnlU¦Jó»@wnkmUÝ@U_¤XxmXm¤ôb@¦ÈÆ¦lJn\"],encodeOffsets:[[117057,25167]]}},{type:\"Feature\",id:\"4412\",properties:{name:\"肇庆市\",cp:[112.1265,23.5822],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@l@¥@V¼VôÛ@bV@ŤVLÈlVÈólUX¥mĉ°kÿU°@ÞKlÿ°KUUW»Èw@aw@@nm@w£kÓVUVnKk¥£Vam@nkKkbÆǫmakmLU¥UmÛwmVUmUJÇaUxÇIn`mb@Þ¯b@nJ@nlUVlVULW¯Û`Ç_¯`m¯IbĉWċzx±Jx¯ÆU_k@J@UmbXôlLn¦@¼ĊxlUXxUbLĠUnVĊwlUb@lWXm²@ÞWxXUnb\"],encodeOffsets:[[114627,24818]]}},{type:\"Feature\",id:\"4413\",properties:{name:\"惠州市\",cp:[114.6204,23.1647],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@lbW°bnnla@@wnmÆLVUkÇl@XkV²±bnUÆçUaVmxXw@WXwÇ»ÈJ@£Ü¥@XW@£°bUx²¼@ÆLVwmX°K°Ťl@wVUnLÈVVIky±wkKU¯ÅkXġÑÛlwUwlm@mnKWaÅm¯óÇmğb¯alĉUwķbmb@lÞÒVnmĀŹ@VbVUnmakLm`@xĉkklVÔVJVnlVUnmJmaLUblzmkLaō@@zV¦UV²kJnÜU@VXUL@lJL@bÝ¤UnVb@xVnlK²Vx°VxlIlkVl²k¤@n\"],encodeOffsets:[[116776,24492]]}},{type:\"Feature\",id:\"4409\",properties:{name:\"茂名市\",cp:[111.0059,22.0221],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@LnÇlkKnkÆLUmÈxlUJló°n@ana@@X_@mÝóóU@aaU¯mL¯kV¯ÇVwkw@V±Ŏ£@@alw±Vk@mÅm¯ÿÅƧIÇ`ōô¯_UVW°IVx@xkX@mnwXWa@kkJ@kVa±kkVmxmL@¯XXlWVUI@xlIklVČV@blW@@nUxVblVxkôlxnynIÆ»Æ°aXwlKbVnXbL¤kLèVV¼²IlĠVXynz°KVx°@VlLlblK\"],encodeOffsets:[[113761,23237]]}},{type:\"Feature\",id:\"4407\",properties:{name:\"江门市\",cp:[112.6318,22.1484],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@lUXx°JWnnÆXVWX@ºVLV¯nUVnbôxaXmWXIUb°xlKl¯KxXÞ°XÈ¥Ü@ĉÞUç»nóVmax¯UÅU¥Ý¯@ç@ș@çĉÅUmUç±ĉKÝxÝ_ÅJk¯»ó¯nmèkǀWx¼mnUÜġ°@¦@xLkÇaVnUxVVlnIlbnÆÆKX¦\"],encodeOffsets:[[114852,22928]]}},{type:\"Feature\",id:\"4417\",properties:{name:\"阳江市\",cp:[111.8298,22.0715],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@°nKV°b@bôVÞô@nVlÒôÆUnlnn@lmkmVkaÈkÆÆk¥ÅÞ»ÆKXkW¥ÅLmÅkamJUkUVwUmÈblKw@@¥Ģ¯VÛnm»Xwlƿ@kbWaʵ@óLl¯ƽ@Ln°Æ@nUl²kxb@@ō¤U²@lxUxÈU°l\"],encodeOffsets:[[114053,22782]]}},{type:\"Feature\",id:\"4453\",properties:{name:\"云浮市\",cp:[111.7859,22.8516],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@@VIl@`V°Åw²IwČyĊXa°Jn°_È`Ü_°XKVkUUVk@mmI@°a@Ýnam_ÈJVwlĉX@lUómaUmVU°UK¹@WXUWmÅXm¯IWwkVWlÅLÝ¼Æl¦ÅÅÇlbUllnknm@kmVmóÅkÑUW`@@bmb@¯mkôIkVÇwnVÅKmlLklmÈKVĊK°²`n¤nUbWlxVxLUx@°nXm`VklVxmnnx\"],encodeOffsets:[[114053,23873]]}},{type:\"Feature\",id:\"4401\",properties:{name:\"广州市\",cp:[113.5107,23.2196],childNum:13},geometry:{type:\"Polygon\",coordinates:[\"@@Ș¼VxUnĊ¤@z@Æ@nÈW°ÈVwUÞVxÞX@Kl@ÞVaĊbU@ml£k±lUkkJw¯UUw±kLUm@waUVmÞ£@aKkI@KVUW@ÛVmlIU±VU¥@yğzƧÇƽĠřÅnī±m@²¯l°@nÝÆóUll@XnÝVU¦mVV°V¼Jnb@°mbn@²¯¯wVw@@nmxX¤¯L@VLUm@@l\"],encodeOffsets:[[115673,24019]]}},{type:\"Feature\",id:\"4415\",properties:{name:\"汕尾市\",cp:[115.5762,23.0438],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@@@VxnXWV@bVJV@ÞÅU¥Ċx£UWUwÅUU¥WVUkĊÇnkV`°LVwnU@lbĊ¯Vnal@@çkUÝ¥ġaó¯ÅaÅLŻÆUýmy¯ó@ĉÆóȯwÆXbmL@nknVxkxÜĢÒWÆlV°Ll²xlz\"],encodeOffsets:[[118193,23806]]}},{type:\"Feature\",id:\"4452\",properties:{name:\"揭阳市\",cp:[116.1255,23.313],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@VÈ¦Æ@X°V@@¼x²°@lÞaWXX@aÞWlnUxVnnL°V@kmĢl@ak@mlk°aX±nwm±²¯JV²@wW_maV»U@m¯ĉUÑJlabVnlĸLlƅÛÇ±wÝ@ĉxó@è@kmbUĉ°ka@mVxU¯KU_mlĉÈVlXUV¦ÆVxVVX¤ĉwV¦ÝÆ\"],encodeOffsets:[[118384,24036]]}},{type:\"Feature\",id:\"4404\",properties:{name:\"珠海市\",cp:[113.7305,22.1155],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@è@Þ°V¦VÆ°wnbUÆ»nçÆ@nxÜ¤²llU°VnÈJÞ°UôéķUklô£VVˌKÞV°£n¥£ȗÝy¯¯mÅkw¯bÇĔğ@Ýn¯ĊVğōŁŻķJ@Ț\",\"@@X¯kmèVbnJ\"],encodeOffsets:[[115774,22602],[116325,22697]]}},{type:\"Feature\",id:\"4406\",properties:{name:\"佛山市\",cp:[112.8955,23.1097],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@ÈbInVVnUÜxnVV¦nKlnbÅǬlalL@mnUb¤l¦LUmUVlÔ¤@xmnVl°_XVVmkVmÈ@kn@VUK@°KW£nw@m@Ux°x°@±mna@¯amIU»U¯nUV¥ÞUWmk@Vk¯UknÑWÝĊÛ@Ç¦W¯WÝwLk°kL¯wVaWJXWnbwkVW@kĊ\"],encodeOffsets:[[115088,23316]]}},{type:\"Feature\",id:\"4451\",properties:{name:\"潮州市\",cp:[116.7847,23.8293],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@°Üknèmxbz@VVX@VnV@lIVVV¼nKlxn@@¦Vx°LXblaWbV°£¯W@nW@aUñVwW»@¥ŤÅUÝǓÝóV@ńÇkUVmIUwÅVWÇX¹@W¯bkl@nlb@kġn@l\"],encodeOffsets:[[119161,24306]]}},{type:\"Feature\",id:\"4405\",properties:{name:\"汕头市\",cp:[117.1692,23.3405],childNum:2},geometry:{type:\"Polygon\",coordinates:[\"@@@U±°I±n²mx²@WºXÈÆUVxJUnlVÈ@ŃôUǔÞVçn»VyĢÛVm@»kaÝUÇ¼óÛÈķKċ¥X¥Wwğk¯@wķKkUmabkIVÒ°Ċ@nVU¼bn`Xx\"],encodeOffsets:[[119251,24059]]}},{type:\"Feature\",id:\"4403\",properties:{name:\"深圳市\",cp:[114.5435,22.5439],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@ÞL@xbVVK°X°Kô¥Vw@anUèlkĊl@wn_lKnbVmUaUź@nÿUmÝÑ¯Ubk@ÆkxŻ@aÇXwJ¯LķÝUĕóĸóêWº@b²nmĬÆ\"],encodeOffsets:[[116404,23265]]}},{type:\"Feature\",id:\"4419\",properties:{name:\"东莞市\",cp:[113.8953,22.901],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@Ŏ@blKnykVaKnbnIVmUkUmUIUÓçmV@bUxó¦¯LW¯LUUa@wÝKğŚƾƨÈĠy\"],encodeOffsets:[[116573,23670]]}},{type:\"Feature\",id:\"4420\",properties:{name:\"中山市\",cp:[113.4229,22.478],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@XÒlmV°ôÞÅ@m¯°k±@@aX¹¯VÝÇIUmV¯kk±Û£mw@ÅmèÅ¼mô¼èV\"],encodeOffsets:[[115887,23209]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/guang_xi_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"4510\",properties:{name:\"百色市\",cp:[106.6003,23.9227],childNum:12},geometry:{type:\"Polygon\",coordinates:[\"@@lklWXL@VIl@XnJn@VUUalk@mK@kny@UlU@a°UU@VmaU@Ua@UWw@n@KmLm@alkmnIm@an@VIUamWÅImwU@@a@KX@JVLUVmUaVkUa@m@@Ulmkk°UaVUlKXbVwVIkaVmUk@KVk@aaW¯m@w¥laX@KmakVmnUl@nxVKInU@yVaVIV@na°KlxX@@_lmXUV`VIVV@n@lbn@@WUkValK@²yl@VUV@@K°L@KU@@UVaXIVVV@naVkVa@K@UUK@UUaLWaw@m@K@UVV@mVUUVKnLmVLKbVK@UUIkmI@mUIVK@IUK@VkL@WU@mU@WmUk@I@VJk@WwX_@amK@UUWkIK@LVb@mVmakL@J@bU@Ux@xbmI@`Iwm@UbmKUaUWa¯UkJWV@XJUU¯LUmV@ma@kkamKwLUUmWVkkm@aVUUkVKnVVUmXK@UW@km@Ukkm@@W@UkUy@I@aUUmb¤U@kUmL@bmJU@Ua@wkLWWkL@U@VaU@LUakKWbkUWVkKkLVLUV@JVbz@V@VmUU@kVmK¯@VU_VWakVmIUKUaU@@bml@XU@@V@LmKUVmVUKKbkaUXKUL@x@V@l@mxU¦V@lL@V@Ln@@VV@nlKUaV@nLUbmJnL@VWLkbmV@@LWXLlxVVIVV@x@V²blUVmLVUK@kWWXUlV@Xl`LXl@@Vn@VnbV@lVUVUÈVb@@`UXU`l@@XUVm@k@xmVknUJVXUbmKULmbx@VlJ@LVbkKUbVLÇUUVUVmU@VaUkUKVUwmLkUUVVlbkaXmwKUVVU@@V±Uk@VWUUm»XamUbKk`U@UnWW_kKmbUVUVmnUV@nJVUlUbU@UV@n@JmI@VmbnVUXlx¯kKmnVV@L@VbkVUmm@Ub¯LmlUL@VWLkmkLmmn£WmnKU_mWbnbmx@U¦UJU@Xmlk¦@mnUUm@@Jn@lVÔVJnIVWI@aÆK@I@aVKIlÞnnl@nl`nbÆX²l@xV@llbVn²VVl@nnV@IlW@Un@@kVa°KnÈmVaVXUlaVÈUVlwôUlynIVaan@lVXbI@n¥la@K_n@bÆx@XnJVnKVz@`VXVU`@b¦UV@VIlxUnVKXÈbVllbVbnVn@\"],encodeOffsets:[[109126,25684]]}},{type:\"Feature\",id:\"4512\",properties:{name:\"河池市\",cp:[107.8638,24.5819],childNum:11},geometry:{type:\"Polygon\",coordinates:[\"@@lLVlbVV@nXVlI@JVXmnW°bIVV@ln@nalVUbnW@kVkÒlbVKn²°bUlV²@X@`nbaUI@°wlU@aXJVI@aVK@wUamIXm@XUV@@bV@VmImnUUwVaVKXUnVK@akVwV@nL@UV`n@@XlnIUJl@X¦V@aUIVm@anV@UwnL@VlbVL@KVVXUWwUUVUka@UVJnUlbnalbVVn@°LV`Þ@XVxV@@bVlUVVbXnWlXnml@XXWVXJmbUI@VllUVkn@@VWV@Vnb@VXUJVnn`lLVka»lVLnw@WV@lInw@WnU@U@mknUVóKwUmUXUU@@wVJVIl@XKVVVbVIJ@Un@lVLnmb@U@Ul@nU°VUVJnnVJV@@mVU@@wkUVwkKWkyUUkU@alkÈ@lJ@xIl@UUWVkUw@Kn@@kmaVUlUULÇUUKl@UUmL@aXU@mlUUwmKkUUVKVUaKUnK@U@Vl@XUWUKlwX@b@K@XkV@UwWJka@aUwmV@U@@U@wUm@»kLWVkIWXnmV@VkbmKLUbkVa@aa@@aVU@aVak£@±UkVU¯VUUJVUI@kxmUmWUbLw@K@aU@@aVU@Kma@aka@_VWkk@UWVUKULWKULU@KUnwVaUKxU@UmaLm@kVmVa@UkmI@@KmIkxU@@KU@mmakI@VLkmWkkJ_U@V@L@nxXbKVb@VVL@V@LUbUlmbU@UUWJUb@VV@@L¯K@LU@UVk@±z@kLUbVl@Xm@akm@U@UUJU_VWkn@`W@kw¯LmbU@UJUb@zmVJULmwk@mVUnlnb@LWkb¦@x°nXb@bUl@LVlUnlbUJUxWakLUVVb¯llkn@V@@nVbUlVbUnVUK@IW@L@bV@nxÆJnXVbUJm@@bnmJnkl@bnnK@Lm@Xx@VVbV@nb@UVV¯@bkV@Vmz@lnLl@kVbUVm@mI@WkJ@UWKkXkl\"],encodeOffsets:[[109126,25684]]}},{type:\"Feature\",id:\"4503\",properties:{name:\"桂林市\",cp:[110.5554,25.318],childNum:13},geometry:{type:\"Polygon\",coordinates:[\"@@nU@JX@`XLm¦Vb`lVXXW@VblČnVlanLnmVLK@_Va¥@kUa@VmVbaV@XVVzlVVK@knKVmX£VKLlbn@b@llL@xĊôXaV@°È@¤bnV@@Wl_VU@WnVamwwVbn@KVLX@VmVUxlV@nVV_nK@mI@Wn@@IUĊ@@wVWX@@I°VVm@wmU@m@IUVklkUmmkÅV@@aV@@Wn_UKla@kaVlVanb@k@@KlVn@@aV@nIWWUUaVU@kKmwU@UImKk@UU@w@W@k@UkW@mk_W@Ua@a@¯mV£@mUUam@kWakVama@UUm@nw@alaUmnUlVlIVLVyk£Vm@k@UUJkK@kmKUwKkWK@UXImyVwnI@mkUlkUKkUVmw@kkJWUÈm@_k@@aaW@UUJUwU@@IWKkmUUV@nVl@bVb@bUUXakw@WUkbkKbm@xUlkLm@@wmKUX@UaVWXVmU@@UUUxkmWXkKkUWaUaUbL@`UL@LV`UXmK@VmakLVbkLxUJUIVbUVVb¯KV@Xnl@lVXbmÒnV@L@VWKkVUIWJkIUamUUbm@UkU@JUbW@XWxUam@kbVVUnUJmUUV@bU@UUV@Vk@bmULV¦U@VU`VLUL@xVbn@UJ@nWJXXVVV@bkxVbUxL@x¦@UlXUVVlULV@@nUb@xlnJVnlVknUlVUbmU@bVx\"],encodeOffsets:[[112399,26500]]}},{type:\"Feature\",id:\"4501\",properties:{name:\"南宁市\",cp:[108.479,23.1152],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@lKnbnU@Ua@KLlJVX@VnL@bW`Xxl@I@UJl@nV@XV@nXV@lK@UVL@JULVJ@nnJlVJ@VULaLUKnmKULVVU@nU`lIXllnK@UlJnb@nV@LV@lwnJ@L@nJl@VUbUn@lnKnbVV@wVLUbxVm@LVVKXLVKVLXU@VllUX@`lb@bnbL@UV@bV@@b@LxKVanXVUUmVUUUaVUkyUUaImK@mUUVUkKU_@W@UVVVIUWUVaVU@UUKn@k@al@ll@bnL@bVUVX@V@@bKnblmn@V_@aUalL@a@akK@kVKUKlwUUnV¥VmU_VWVIVaX@VaalÅK@LVJnalL@LnKwlVUwmX@VXlLUVnblaUmVUVwXU@Wm¯Va@ÞKnw@wmk»UVW²a@_mW@U@IyLVUUKW@@LX@VUV@@yVU@UV@nwUUmJka@IU@mVkaW@UwUX@`@kLWUk@mkUUm@kUUWkUkWxk@@VK@nV@UVaUUJmIkV@UamLUbkVmamLka@kmL¯WI@wJmwx@akU@aUKmbkaW_nW@_U@Wm@a@wkwUKmk@bkbw@mKUkkU@J@bW@kVWz@bVUaVUx@ULkJWbXVVX`@mJUVU@@Lk@WbU@UJlnXlmVx@Ln@b@KLXWJUUW@kaUVUbmV@nnV@n@lVLVmLXmXkV±@kxÅLUbJWIÅJ@ImXalkUamKkkL±aVwKUU@mÞnbWJXm@lbmKULWUUVkabnn@Vl@VVV@VbVbnLWLXJWxXLV@@VV\"],encodeOffsets:[[109958,23806]]}},{type:\"Feature\",id:\"4502\",properties:{name:\"柳州市\",cp:[109.3799,24.9774],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@wUaV@nVaUVklmkUUmmIk@waVm@U@VKUkVUkWV@¥@wKVwUalw@aUUUWWXI@mVIm@Ua@wVKUKV_UV@U¥VKnal@U@VU@VV@aVUnVVIVmUUlan@VbXwWX@Va@IlVVn@VanVVblJXIVJlUXL@U@KmUnÑWakU@mkJUI@mk@wUmmUV@JXaWIXWmaUIJkk@WnJ@aUak@kkJ@kUKU_@myUóWUkm¥kUmL@KUKm@k_UmVa@k@@UmU@mm_JWIUVUWLUlbVUJÇVUIVwKUVk@mU@n@lUL@Km@@l@LVzJmUU¤m@UbV²U`U@@¼Vn@x@V@@VnUVx@blbXIVxU@Wl@@LaW@kxLXVWVk@@U@VmLVLbUVULVVlnLVxkV@nWV@bnKVVk@VLVÈVKVVkUnb@lm@@LVxUlVX@VkJ@wkIÇ@kl@blVVVzXllLUxlV@x@UV@nU@UImmUIUV¯mVk@@V@VamnUKkm@@VIUJUaUUWLk@UJUI@xV@VVWVnxLUômVV@VkVVVUnV@UVkL@VVV@bVxla@bkXVJVn`nU@bb@bVL@VnJ@l@VaU@@_lW@UUU@Unlll@XLl@@UX@°bVWVanLlknVV@VVX@VVnUVLmbXJ@nllXX@`VXlmaXVWk@WkwJ@VL@JbnU@bn@@bVKUnVJVIVVVL²a@bV@@Vl@nUVakalmUL@VUL@Va@mXl@nK@UlKL@Vl@@nkllb@Vnn@nVV°lVInwlKXxlU°n@@I@UnVlakUJWkUK@anUWK@_ÞJ@U\"],encodeOffsets:[[112399,26500]]}},{type:\"Feature\",id:\"4514\",properties:{name:\"崇左市\",cp:[107.3364,22.4725],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@@JVzl@V@Xn@ll@VlnX@@VWLnUVmUULVlUV@blnUlnXVVKxnLlb@lnbU@Vn°KVVI@WXUlI°VXbVVbnLVan@xJ@_nJa@wVwV@@a@IU@UU@WKXwWIXKmKUaa@UUUUk@@UmmalbVUXVVKnLa@knWXImanÝV@VLUx²blKlnLVbklWbn@JÆIXJIVaÆKlw²@lUnWWnKUUK@k@mmU@mnUVaVUb@lVXVXIWK@Lam@@KUwnWkkmVIV@Xal@@KV@VUnI@_UWWUkam@kkm@ka@mk@wkJWIUU@WXkWXkWWLUU@UakLWXV±VIVWUU@anUWaUK@IU@Vak@@UUKWa@m@ak@@wUkla@mUaUklakwV¯¯@WWUkLkKmakLUnV`UxWX@Jkn@bmlakkk@b@l¯bmbJb@VXnbVV@bJUkkKWVU@mÛVUUW@UVUJWXkVkKmUL@WW@UVl@XXKWXJ@XVlmbUxnnm@UlVnV@XVm¦VJb@mLkKÇbXblVkn@l@bWnX`V@@IVV@VV°n@@_naÆVVbUVVbUJnzlVUlXkV@Vlx@XVnxbKUK@b¯VVUVL\"],encodeOffsets:[[109227,23440]]}},{type:\"Feature\",id:\"4513\",properties:{name:\"来宾市\",cp:[109.7095,23.8403],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@nVlw@VJUIVVUV°lU²V@l¤Ub@bUV@b@b@bUblVaKnLla@UnUWmXlJXUlKV@V_U±Van@V£nVIyU@K@kn@@LVK@k@mnVl@VULUxVJÈUVIUaVkXKVVUXJIn`@nnV@Vl@@UbVnl`n@VL@LnKlVn¦VlôXVnz@V`VL@llIll@Vbb@mIXl@lIVJnbWXXJWb@IUnVVn@xl@nVJI@WU°LUaVUUaVJVIwlKUalKnb@UnLVWU_@KVK@_KVa@VKU¯VLVKn@laaUkU@maVUJ@k@Um@XmbkyVaUIUU@KV@laVn@KXKWUkUk@aWUUVw@aXKmVaUUkmIlUU@wUaxUmmU¯U@WLUmVIUym@UVmUa@wmw@çm@aWLUJUIUamKmL@ax¯¥kU¥U@±kUVmKU_mJUbkKmLÅÇ_@WWUXUmaVUkKUWW@nVxkUxmL@KkKmbUI@KLkÆbUbW@UbUJUXV`UnU¦mVVkxVLUL@llL@b@bkKVb@bU`m@knmaL@a@@UWVUU@amK@akkk@@b@lmVL@VUVUbVVXUJUU@V@XV`lLUVVV@nnLJVbVlzUVVbVVnUVVU\"],encodeOffsets:[[111083,24599]]}},{type:\"Feature\",id:\"4509\",properties:{name:\"玉林市\",cp:[110.2148,22.3792],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@VJUXVVXlWX@VxVnX@@`ULWUXÅbWK@mULUUmJ@n¯b@l@VULVxxXU`VXXJVIV@nm`@nUVXn@lWVn@b@Jn@nU@Lm`@Xn@WJ¦U@@VnLlV@@Xl`nIlJnkVLw@KVK@UaVL@bVKXlUUKVK@IVLa@U@WLUlVL@bU@@blb@VlbUxVbXUVJ@xVLUlV@VUbVLnKlXJ@Lb@an@VanL@`VLKV_UWl@U_a@WVInlVUUUVm@I@W@wVakIWm@U@XwlaVbnI@m»Va@aXaVLU»@aVa@kKkL@KmU@WzUK@wU@VWUUVUUKUa@mKmbUK@_nWVaUkVaUaVUVLXKVVUVmVI@UkKkLm`UkW@UwWW_UaU@WakXmK@xUXJkUUWUk@WlmJ@km@@aUKzmyVka@kkWVUU¯lmU@@wkkmV@Vk@mÅIUka@Ub@m@UUU`mUbWaWmbXXKWIXUWm@Å@y@UkIUJUUWLUWL@UkVUxW@kaWbKWnXxW¦nm`XLVlUbVbUxI@JmLUKUb@VW@@bkL@b@VlU@xk@L@lxXxWXX°V@VVVbUVV@UVVbULVnVJUb²baUb@VVVVInlV@VnXaVUlIVUb\"],encodeOffsets:[[112478,22872]]}},{type:\"Feature\",id:\"4504\",properties:{name:\"梧州市\",cp:[110.9949,23.5052],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@VbXblVlLXWlnwVV@VV@UnWUXVb@VWXa@kVKUaVaVkUlyX@VaVmUwUaVU@UÈymI@aU°@nWV@VaVaw@IV@VmnLVK@kmmna@VbVI@aV@XbW`ULUVVx@VbUV@bl@VLXblJn¦lL°°@n@K@UlLnKa°LWbnJ¦UÒVUllLlVnKnbWnnV`w@@Xa±nl@XKV_WVkVa@kVyUa@wU£UW@UIVW@@awWaX_WKkVmUULmak@UJUI@±m»k@m»VyUImnmmwnkUmVaVIUn_mW@»Vk@VwkmmUXa@IaVmm@Wm_U@mIUWóLmUk@laXmmkUK@UmKULUUmWUL@VakU@Ub@b¼VUKWb@bUbn¼@mJUakbWx@@VXnlJUb@x@X@JUnVVUVmkUJ@XbV`k@VXU`LUK@_mKUbm@@b@U`@nlV@bUnbVbn@@`VbUbVV¯bm@@mJXb@bVnUllVXUlbUl@LU¦VVmkLVb@bl@V@XlK@V@nUJUz°mwmLmlXbWVU@UUUlIU@VVmV@@¦bXbWxXWlXVWL@LUmkbU@@LVVVJUblzna@WVn@@lIUVnbV@Vlbkbm@ULUKV°UL@\"],encodeOffsets:[[112973,24863]]}},{type:\"Feature\",id:\"4511\",properties:{name:\"贺州市\",cp:[111.3135,24.4006],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@nL@xn@lKVkwn@alLlaXV@lxbVWV@aUa@aUk@mVUnVlXL@JV@VxVIVX@b@bl@@`ÇnXVlI@lxUnlVVLkllV@nmJUxnzWJ@VXLlLVxnL@lLlVI@V@lUnl¤UzK@Vl@LlLnb@VnVVU@kaKnxn@VkVJ@ÅUlakmWIUaVanm@_UK@UVWUa@klXamU@VmVIXW@lUVknVlKVLXVXW@b@VlnnVL@KXLKn@lb@UnW°@VaXWVb°aVa@I¯aUkUaVKVwaXk@aa@wkm@alanUVw@alK@Umkw@UaUmU@WXUaUK@UW@UaVWI@¥Xa@w@WWVXwU@mKUXUWVU@a¯kl@akU@UULmK¯VUVW@U_m`U@@xVbUz@lUbUlXU`WLk@m²Wb@@xU_mXmmamLkUkKVkUVÑ¥mIXa¯KbmLkK@V@Lm¯@¯kKm¥kIWaUKk@@aVUUa@UwVUKVX_WaU@@bUJUa@mbnn@lULmKUnU@@JxUbUbU@mX¯@V@bnJÇz@VUVVbVxUnUbW@kzVUlUbVbUL@lWb\"],encodeOffsets:[[113220,24947]]}},{type:\"Feature\",id:\"4507\",properties:{name:\"钦州市\",cp:[109.0283,22.0935],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@@IlVVlnL@xlaal@nVLlx@x@bXnV@@`mXX`lbnaVL@blV@bwnxI@xXJ°nKl@lbnKnblUVanKVb@lUnJVIVUb@VU@mL@Ul@XwllVVXV@lVnlVnl@XVlK@@_VWVxX@lbUnV@@JlbnIlmnVV@UwVK@U@k°a@mnIVVVK@nXLÆaVWXVK@_W@Umw@UXWWkUUVWUIVaUkJUVWbUmU@mkUJUU@UVab±aVaUIUmVKUaVUU@VUUaUUU@W¯XWWww@k@Kl@wkV@U@alK@aX@@UmIUWUI@mmkXU`U_WJUnUJmUk@@amLU@UVW@UkU@@VbUWVUk@@wmKkUWLUWX@JmIlUkkKWKkLWU@UKWa@bU@@a@_UKWUUUmJmw@nV_@ġğKóLmbU¼VÆ@xUX@Um@wklVnUnlkaUV@lV²WVklWXXbWlkVkIm`UULUU@UWx@XU@@lWLU@kbUbV`UXllUV@bmb@LnKVbULmnVVIV`X@\"],encodeOffsets:[[110881,22742]]}},{type:\"Feature\",id:\"4508\",properties:{name:\"贵港市\",cp:[109.9402,23.3459],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@n@VzUJnVK@XV°nVVnwVb@xVVknJlVVUbnWL@bUxVVXbl@lVXkWXwWaa@¥@nUUUV@JVkVVV@XUWanknKxn¯VyVI@m@UkL@W@Uk@aUalKnUUV¥@KVkkaWVkUVkUm@aWanI@n@°aUUVaUa@_m@UamaV@akU@mV_@a@KWIkmLUKaUVU@kVUK@wUIWVUaVwka@Uka@aV@@aUKVkK@X@VbKU@JULVLkVWUL@aUKb@VUL@LxUKmlkImJk_@WU@kmK@UV@¥XIm@@Wn_@KmVm@@I@aUmkXm@UWV@mn_@mUUJWIUWV_WwU@mUknVVmxU@@VUV@zU@UVW@K@X@VLUVKz@J@VnX@`±bUXV¼ln@xmxÝL@Ubn°@XWVUxUVVnkbWVXV@X`ÆÈKnlLVanIV`nLVUl²V@V¦l°¦wb@nKnLVbVJIVXK@bn@ènx@xVbUnV\"],encodeOffsets:[[112568,24255]]}},{type:\"Feature\",id:\"4506\",properties:{name:\"防城港市\",cp:[108.0505,21.9287],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@XV@X°°UlxkbVlVb@nkbVl@xl@@b@nXbVL@Vl@UbV@@JVLXbmV@bVVUXUJU²WXlKVb@VVXKlXWlXXWV@VXJlI@xl@nlbn@lln@lbXalIVK@VwUVbU@aXylUX@@aW@U_UJmUnVKUamL@Kna@aVUkkVWU_ValaV@XK@kV@@WwVXV@VKVVn_lJlUXkWaXWlkXU±kU@VUlbkVmUmlk¯ÝW@mb@¦VxULmkJUU@ma¯wmkX@VóJ±bUVUXÝWklWXXlxUabIğÇ@U@mVUKkkm@UJm@XnWV@x\"],encodeOffsets:[[110070,22174]]}},{type:\"Feature\",id:\"4505\",properties:{name:\"北海市\",cp:[109.314,21.6211],childNum:2},geometry:{type:\"Polygon\",coordinates:[\"@@VaVLnK@IJVwUaVaUkWKn_mX¥WwXmLXalbU£UyVÅ@Ýwm@°lLÅUmkmwÛaƑLÝUUm@ȣÆV_Ó@£UUV¼U°W̄ÞVbXbôx@b@bmV@ÇUÝ@@ĢU`m@nxnIVVVXVL@`@bV@@aXbVL@XVlKXLlLVlknJ@IWVXXKlVnL@xl@UVVXa@UV@VlX@VUV@nK@bl@nVVIVmXIV`V_lWnn@VJVXnJ\"],encodeOffsets:[[112242,22444]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/gui_zhou_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"5203\",properties:{name:\"遵义市\",cp:[106.908,28.1744],childNum:14},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@@UnUlJnwJU°VL@bnVUwlJ@XXVlU@klVUJknlUllL@bUJ@xULUlUblVkblbnwUXmla@wV@VK@L@UXaVKVLXWUVa@U@Im@@W@£UKUakKWIXU@al@@llUnL@W@Un@@VlUV@VIUanKl@Xb@lmxVb@b°bb@nlJVVnnJ@b@LV@ln@LmV@Vx@blnVKnlJXIlwJ@Òb@nlK@Un@UL@VVVVUUUVKl@VUVLJ@UVUUw@Wm@UVÈVlbUb@JLlX@@xLmk@@nlx@bUJUzVJ@@LVxUV@bWxnLnVVK@_K²xVbV@n¥@aVI@b@l@VaKnb@n`nmmýW@U_wV@VlVV@Vn@n@nI@Jn@°¦VaUU@mVVWVaUÅU@aVKnVbVUmmU@a@kUwm@aUUmUUJ¯lakUaXaWUUaVkkamkmUnVlULVlJ@XU@UJWUUwk@aU@WbkWL@U@WU@@XUKmV@aUVwUĕUJUamUUVUÑmnIVJ@kl@XalJVn@KVL¥@UWIXWmU@mVUKnUWLUKUaWUUKVU@U@anUny@UlUkK@w@a@aVU»UkVw@WmkJÅmUUVmwXalLXWWUnam@XkJ@UVU@U@W@@U@I@Wl@Ènlw@KXLWblVUkalKUUVVaV@@wnIlaUmkUKWU@KkUkLWaKUUWUn@VK@LnnWJUIVkUWVnV@V@@XK@VUIUJ@IWJkX@VVJIVkK@I@UVaUWk@m@wnUWKk@mxk@@lV@bxmb@x@VUmLkUJ@nVV@b@VkLVbU`¯Il@U_UW@UU@K¯wm@xL¯¥kI@bkb@Ua@m@kkW@XVbmV@kV@bWbUbV@¦xXlmVk@¦bkaWL@KUImK@wUK@VUIb@bmK@LÅy@akXW@kbWlXblL@ULUb`@UkUymX¯@mUJUUJL@Lm@@WX@lUVlXll@l@Èk°V°X@VU@UVll@XUJVXUVm@@VXLWlnV@Xk@mVULnxV@@bmkL@VWLUbU@UVm@b@ķ¥UnmJ@UUVkkJUlÔU`UIW@°kLUlUI@WVIU@mWKkXk@WU@bXW@J@xX@l@LVl@xLVxXX@xKnxVknbKVV@ULWlXU`@nUlX@llVXVUKlkUKlI@anKVLXKVaUIVWV_VK@VnLlU»VKVLm\"],[\"@@@KlKkUUVVX\"]],\nencodeOffsets:[[[108799,29239]],[[110532,27822]]]}},{type:\"Feature\",id:\"5226\",properties:{name:\"黔东南苗族侗族自治州\",cp:[108.4241,26.4166],childNum:17},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@VV@XkV@bUbWJU¼Vb@Vnb@b@J@bL@LV@UVlUI@aKULVb@bkJmxlLVxknVJkxnKmnnL@bn`WIXlWLU@UxVbUVmKVXI@JVIVJ@UL@W@@UmUXUlVUVJXImm@KL@UVmVXVLXblKlV@LXVLlVVnkbmJ@xnXl@bXa@VanaÒLmVnIlÞ¦°k@b@@lVnJlUnVX_@lVlKVUUxVLVWVIXJUlnnWlI@KUaUUVKn@VaVXV@na@mw¯@mUkJUamI@lk@@am@@IUmVImUUw@anUVaUU@LU@WaWUXWWwV@VwnU@L@ynbl@@X@aJ@nW@@Vn@lVLlxnIl@@UWKUnIlJXIVllIVV¼XK@aVIV@@bn@VKXLVKVVVInwJ@UWI@mX@WKnI@KmUUVJUL@VKW@@k@aU@@W@InJWUXwWI@W@¯wkaVaUIl@nValIXWWI@UUm@anwWkXWWIUbk@UJmIUamKVUUUVVama¯VkIVVUlKnXVwX@@WVaUUVa@IlaVmknawkUU@U@mUVUVwl°LVbnJVU¯la@mX@@UWKXU@aV_V@@JlkU¯@VnK@km¯kU@WUW@mmU@kmlU@wkL@WUkL@VmLJ@b@V@bknUUVK@UVKUK@Uk@Wa@LUVVnUbmVk@@UU@@aV¯K@U@UU@WmUL@aU@WVw@IxXll@UXK@KXXVJna@wWa£naUKVm@UU@mUmalm@@XkVm@U@VLmWU@kkWxU@@bVV@VkXVlV@UUk@@mI@KUwm@UmVUUwU@lwkV@IUa@mUaVIVKVa@w@U@UJkb@n@bmJ@XmlVUxWXkJmUkUUVWxUlU@aULUmbU@@WXkmL@xUV@nUxÇm@XLWbnlnVnnUVUnVVz@lbUVVlULVb@V@nUJkwm@Ux@bWbUK@UULkaJbUU@U@lUK@XUJmnJ@bU@UwWax@zkJWnUJUUVVV@bXn@xVb@JLm@Xw@`@bkb@VmXUV¯L@mW@@n@V@L@KIW@@aaUx¯@Um@XbW@@LV@bnVWVkKUzlV@bÆa@lnI@VV@@LnVVKUaV_VJVbnU@bn@nX@yVIVxXKVLlUVaXU°J\",\"@@@KlKkUUVVX\"],[\"@@UUVUkUmV@ln@VXVK@K\"]],encodeOffsets:[[[110318,27214],[110532,27822]],[[112219,27394]]]}},{type:\"Feature\",id:\"5224\",properties:{name:\"毕节地区\",cp:[105.1611,27.0648],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@UkV@kW@Xn@@KKVIVVIn°@nWVzl@V_VaVK@kKWaXklaX@lW@bÆz@KnL@aaVJ@UVL@xnLVJ@LXKlba¥l@nUWkw¥U@VaXa@amLkUKm¯kmkIUaKUIWkKm@anw@mlwXImUk¯@a@amU`kkKWVkxmUUak_mJmw@wmXUW¯X_@WnI@aVwkWWýÅU@WLkUaUbVV@lUVVnm@kUmV¯kKLwmVUUaWVaaWw¯wÈ@VULUVUUK@nWJkIl@Umxnbm@kbUJa¯bUbVxmLUVaU@VUUWxkVVV@bUV@XWbnlUbbUJlbUV¯b@z`WbXnmbawUwVWUbUxmbU@Uam@VkVawVaUWI@mUKóz@lUlÅ@WIb@xXxml@XklULWKUmwUa¯KUXWJkaULmKkLWbkKUVImWa@kUaULW¯LK¯@kbL@bx@J@bmnnlUlzU`U@@Ub@mn¦°bUVx@bkVm¼mx@mkmVV@bkxVnaVV@bU@mL@b²`lIVV@lXLlbVxn@@bl@XllIVnbVn°°wlbXw@mVa°lVnU@mVLVbn@@b@@WVnUV@Xlxn`VznJVb@L@bV`V@UnwU@WUXKV@UUlmUUlaXalLmbIVbnJVIlVVaUUnWVXnVLk@nWnblnlb²xxVKVXlVXLVWLlUVJna@wVL¼@JVX@`@nnx@nWJU@Vx@XXKUblxU°LVKVVlL@KnbVUnJIlUnKl£VWxIlJ@nVÞUVVnbVX@V_°lnK\",\"@@@UmWUwkU@Um@@VkL@V@VVkV@nbVa@\"],encodeOffsets:[[108552,28412],[107213,27445]]}},{type:\"Feature\",id:\"5227\",properties:{name:\"黔南布依族苗族自治州\",cp:[107.2485,25.8398],childNum:12},geometry:{type:\"Polygon\",coordinates:[\"@@V@IöalK@UV@@KUaVIVVLlaVbVWnX@@LnUlxl@naVLXVVaVUJ@lUUanWWI@VlV@Xbb@Vn@VmVVbk@kU@VV@XJ@zn`ULW@kK@_WVUK@LUb@Jlxn@nnWlU@@bx@XVVU@UbVb@n`VI@VVLUlUIUV@KmL@VV@XIV@@lVLVmXV@WLXLW@U`nkb@Vl@UL@VVVLllX@`lIXbJIXWLaVL@XXWĢb@bmK@L@°@VnxmxnK@xVn@VkL@VLakbl`VnnxVnUlV@@VVXV`@k°JV_UalK@U@aUU@mIlVnKV@U@wnaw@akU@l@nwl@XLmV@xnl@VXUb@V@JlLUJUI@UlWUnLVUUaVwV@XKWkXJm_@amKnmmLwlUIlmUwkKnwlI@aUaVKL@bVJkVUU@@KK@a@I@ama@UUaV»XIVa@alU@WUU¯IWVUbkVUKWLUwUJ@zmWm@@amVUaUIU`VbULmU@KU@@UmJ@kÅb@akUVylLXUmU@aU@KX@Wan@V°@Vwb@bX@J@LK@@U@mX@@n°KVUnW@Ula@a@_x@WnK@IUa@wWm@aUUUVVVIXmlI@ywXbVxV@@aInmVI@WVL@k@VVVaIlbVK@VVLXa@aVwn@lxVI@m@UUaVKUkVUka@UymUVVUmmUmmkXaWK@ÈnVw@mVU@wKlnXW@V@naVVKUk@KVIUW@mk@KXU@Um@@lVk@UVJna@UWaL@a@Xa@kmmVUUk@mkkamJImJUUmIm±aUUkambkamVUU@VlbUbVVxXWVUU@VUakU@UmUVU@mnUVVnUbVJ@bUW¥kLVamVkUaWJU_UVWKk@@nlUVVJUXm@Vm@UnVlmbnmJUbULU@@UUKWVIWxnJVb@xUL@bUJWIkxbkb@xVJbmU@kW±LkKUkVa@a¯am¥ULkalÑlKXUWXaVakImV@ka@UUJ¯aXmmbKWU@wUUaUaKmU@UXlWb¼WLUKUb°UlVbkbVL@VJ@nVlUbUXmJ@VX@lbUbU@@bWb@VnLVJ@bVVUzVL@lnL@bVVVULmKUkJkbm@xVb@VkKVnnV@b@WXUnVlVVXVJUXlVXbWV@VU@Ubk@@KWbUUmL@JnXV°XJ@_`UbkXVVlÆkb@VLXVV@V@kKXX@`V@@n\"],encodeOffsets:[[108912,26905]]}},{type:\"Feature\",id:\"5222\",properties:{name:\"铜仁地区\",cp:[108.6218,28.0096],childNum:10},geometry:{type:\"Polygon\",coordinates:[\"@@°a@aÈbVUlU@aVKnVVVUlyX¹lWVa@UVnUVU@m@mUl@mÞw@xnIVbna@KVIJ@kwV¥UXÇVkVW@kkKWU@aXUWmnIVa°VXbmL@VVbnVVVUbVbJVbVKXkVKVanU@aWnWUWa@Unk@mVIVK@wXxlLXbVJVlKbl@VI@maXalVVVbX@@aalnkx@b@Vb@Vnx@bVVUXn¤WXn@Vl@Vlzn@`@I@KUU@V£namVkXa@aVKnnU@anVlKa@UUU@amk@»kU¯@aVWnkWmkImU@akaVm@»VUV@UKnkW¯XWlkUKnIWa@nmlIXmWUnwUwWm@wULmaUJkIUaaWaklwkwmJmU@bkJ@XUJ¯W@XbWbUKUkWJUUVKnn@UmmXUWa@mU@@UI@WmXVykwm@kaULWwU@¯lKUUVU@mU@UkmaUbmV@bxVnVUJVn@Jn@@bl@@knJVblInV°@nx@mbU@UWUbm@ULVVVb@LkJmXkmVWIUJUXUKVwVUkLkU@W`UmkVmIU@k@@a¯lÝ¥kmJUnKÑmbUb@Wbak@mWU@UbUVVkLlbUVkXaWK@LkxÇmk@@X@J@V@@X@VUV@VIWln@mbXVWXkKWbnxVUnVÆInl@XUxVl¼UV@b@b@xlLkV@VmzmV@b@VUVVLXVVbVLXKmVVLU@nnVWXXJ@V¦UK@LUmkIWbk@@lUImJnVÒVUnVVbVIVĖUxV@bnUVL@WV@@X@VKlXXaV@@blVxXVVIV@@WkIUVKUkVmlnnbllUVbXVWbblVkb°VInVVV@bnVx@l@bnVVnUUamUL@bVVÆUbUXUn@VVUb\"],encodeOffsets:[[110667,29785]]}},{type:\"Feature\",id:\"5223\",properties:{name:\"黔西南布依族苗族自治州\",cp:[105.5347,25.3949],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@VL@Vl@@IXW@kVUVbnW@XlKVVnUVlL@baVbb@xX°ÔUxV@kbm@VxkxWJV¦@ÈnVKxWXJmV@nÒ@xVbn@@blLk`VX@bla²JVUlnn@U±lw@wnw@mlwVIX@@m@klKnkaKnwmmXkÆVmU¥l@nb°n@aVwVmVIVnI@a¯@mU°l@@VnI@JV@UV@b@IUbVJmXöºzllUbVa@aXUl@U@llLnKVaUa@UmK@UwVbnKV@VwVK@UXV@Vbn@w@UWnX@a@mI@UUKlaUaVk¯VaVLXK»XaWk¯mkğwmW@mIVkwJUIÇVwUUkVKkm@UkmU@WÅwm£Vm¤¯IkJWa_lUbmJzÝJkUÇVU@bUÝnm¯LUb@`mL@VkL@VUmmk@UU±Umka@kU@ķymUkk@mmkÝmUaUakImV@V@VÅL¦JUXmJXWb@n°Æx¼nV@LlbUUbmL¯@ÞbV¤nbVx@bUVlblI@KVVUnVJUn@VlLUlmLUUUxmK@I@@VW@@bU@UJmUkLVVUl@b@V\"],encodeOffsets:[[107157,25965]]}},{type:\"Feature\",id:\"5202\",properties:{name:\"六盘水市\",cp:[104.7546,26.0925],childNum:5},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@ôyVL@nXJVUbxbUlU@nVbV@naVwaVUXVxxbnaWmXa_@y°aVUkaVIaVamkXa@WVU@aUUlUXwVV@UVbVUnKUwVa°abVIlan@manw@VklJXI@mLVVVUVK@UÇk@KUa@UkaVU@UVWV_XWVXVWlLXKlLXaÆKwVL@akKm@Uw@@XUVk@VUI@wWK@aUVI@UkK@mLW@kImJUÅVmkXUW@UJkx@nmx@xkxV²m@kmUV±Ikb@aUWl_kK@am@Ua@wÑ@mnUWIXwULm@ÇU¥XIlwUwn@laU@Vw¯ÓW@waUab@akKUmVUUkL@WmXUaUV@lWX@Jk@@UUKULmLUJmzkKmVX°VUnWKULL@mU@UnVJ@b@UV@X`m_@l@@bmbXJmnn@°wnn@VLX@V@nVl@nk@@bl@nn°WlXzW`XXVKnUlxVbUb@VXb@VxÈbVlnbmn@kVUL@mLUVVL\"],[\"@@@@UmWUwkU@Um@@VkL@V@@V@VkV@nbVa\"]],encodeOffsets:[[[107089,27181]],[[107213,27479]]]}},{type:\"Feature\",id:\"5204\",properties:{name:\"安顺市\",cp:[105.9082,25.9882],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@lL@bUKxÅLWbkKWLkKUXUWWXU`UX@VUVlb@VVb@Ll°xXxbbXUVbVnUxKlL°nUlVn@UmVU@kUUVablVXKV@ÆXþlXUxnU@mVK@_@ml@UU@blU@KnLVyUw@@UmkWVw@UVK@VXzVK@nVVUUW@kVJnla@nKWkaWL@Uõb@JU@mU@@_WWL@lUU@WUUK@lakÅUUlWVa_@`WIU¯mW@InKVVXa@Ll@VaV@@UXUWakUVWUIUWUkUmVXW@@amUUmLl@UUawn@laIVlnLVKUUU@amK@kUKVyUU@aUImK@UXa@aV@VakaW@@UnIVWVaUkb@mWX@Vxm@UaU@W@VULUxU@mLaUx@VnL@VVbUbmLkK@kVk@WV@bUbVakkyõ¹nWUIVa@J@aVUU@@ImJ@Uk@¯V@n°@bmJUUJUnUxbm@¯mak@¦VUnÅWlnnmxLbmlkL@l@nWVnlÆUVnIlJ@XnK@lL@VJVU@bXL@xVJUl@VU@W@Vxn@\"],encodeOffsets:[[108237,26792]]}},{type:\"Feature\",id:\"5201\",properties:{name:\"贵阳市\",cp:[106.6992,26.7682],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@nlLXVJLVblJn°lnLlVnKlU@nUUa@WlX@ln@Vb@la@alJ°¦Kwn@°xLVkUmmwUmk_labK@UlK@UUm@wLmnwmw@U@¯@KnL@aaġXWW@UKbKWXJIWakJ@_kWkKUU@UVKk@@UlamV_X@WKXK@WUUnUK@kU@WJU@@UnK@LVUVJVkUK@UUJm_@UaVaV@UU@Ww@aV@Xkmmm@kw@IVa@KVLXU@`lLX@VKm_@yI@WU@UlVl@UanU@Um@UaWaU@Uk@XJmXVbkV@IUVUbWUUKmbk@kwmV@K@mWUXUakbKUUUJVb@LU@@VkL@VXKlbXmL@kbmUI@lVXUVU@mULWy@UUL@VUxXnl@V@VxUzmK@LkVa@VVk@@n@`UL@nmV@bmJ@X`WX°WVn@xnxnIl`VbnVlwXUlLl_nV@b@bl°VnWJkx@nmx@b\"],encodeOffsets:[[108945,27760]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/hai_nan_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"469003\",properties:{name:\"儋州市\",cp:[109.3291,19.5653],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@à®¼jpnr``pRVHÊÌ¤Zt^JÖA[CâlTébQhRPOhMBcRSQiROE[FYdGNOEIH]MgEAMLLIAG_WMCSL@ED]PCLYC[ZIHgjSxJTMbHNEFCMEE_HSDFHSLECRNSFDRICHNADGPI\\\\RZGIJTIAHLDQOHG`GTNCOIC@eIGDWHIS[kiE[FMbECZS@KKS[FDWsCeRuU_DUQNOE[LKGUBM¨EDQP@HWHGDImXCog_~I_fGDG|QDUWKBC\\\\ore|}[KLsISBHVXHCN`lNdQLOnFJSXcUEJMCKSHOUMDIm_DI`kNDIGEYFM\\\\YPEEIPMSGLIKOVAU_EBGQ@CIk`WGGDUM_XcIOLCJphHT_NCISG_R@V]\\\\OjSGAQSAKF]@q^mGFKSW^cQUC[]T}SGD@^_aRUTO@OHAT\"],encodeOffsets:[[111506,20018]]}},{type:\"Feature\",id:\"469005\",properties:{name:\"文昌市\",cp:[110.8905,19.7823],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@hĲ¤Ī¯LQDaFßL[VQìwGF~Z^Ab[¹ZYöpFº lN®D´INQQk]U[GSU©S_­c}aoSiA£cÅ¡©EiQeU­qWoESKSSOmwćõWkàmJMAAMMCWHGoM]gA[FGZLZCTURFNBncVOXCdGB@TSbk\\\\gDOKMNKWQHIvXDJ\\\\VDTXPERHJMFNj@OwX@LOTGzL^GHN^@RPHPE^KTDhhtBjZL[Pg@MNGLEdHV[HbRb@JHEV_NKLBRTPZhERHJcH^HDRlZJOPGdDJPOpXTETaV[GOZXTARQTRLBLWDa^QAF`ENUPBP\\\\Eji`yºEvåà\"],encodeOffsets:[[113115,20665]]}},{type:\"Feature\",id:\"469033\",properties:{name:\"乐东黎族自治县\",cp:[109.0283,18.6301],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@ªVLP`@PEdNRAHOPEAKHEVL`GZBJfvdTAXNNTZJFPrHHNpKTD\\\\ILHbEVd^JOHLh@NNBnHP`\\\\xH@NBRLJTlNv_^CTLd@bNDVFbxdFVUPBTKOGEOUO@OEBXQP[H_EI\\\\EbeYa@UO_JMEJ_IEDKJUGMDcNUd_FMTEJSGoZ]EIYGO[YWgEQ]a@WHEDQKUSDUGAbYBUpSCYNiWqOSQEoF[UcQISWWNMSDe_cLQ_UBiKQOOASQAWgS­ā]ZaSPÝZ]XMXS[^oVËNgNKlE RôEø\"],encodeOffsets:[[111263,19164]]}},{type:\"Feature\",id:\"4602\",properties:{name:\"三亚市\",cp:[109.3716,18.3698],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@®ĂhTBXTRPBRPjLVAR`dKf`TCNXMTXRJVdE\\\\FpTRrPjXZMTDVoZABaVHTCLVCRGF@X^bFRhZXP\\\\ZHHMA[^wBWXJlW¤EJ[bCTOFWWMm@ILMGWQ@DQ^QNWFSHEbF`OXNbOVNKTEPDTLTCCVTREfvfEHNbRAENH^RJXCFHNFRpVGHWISDOTMVCZeGamaLoLÛD¹¹ėgsia{OųETtlÉwr}jR±E{L}j]HąKÃT[P\"],encodeOffsets:[[111547,18737]]}},{type:\"Feature\",id:\"469036\",properties:{name:\"琼中黎族苗族自治县\",cp:[109.8413,19.0736],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@bRFnHNbHgN@NPEnbXP@bND`NT\\\\@\\\\QZb@`@J]V@XhDpWnCJGHGXO@CR§FANHVKLF\\\\MPVR`CvVfQtDPKpGHG@S`WJP~^dSTHWX\\\\RHTFACQTIAUPOU@MG__IaYSFQKNSbORHXCZeTFJgB`YBMNMFi~IVDV[tGJWXGDQRGF]JrALgESLSAYDGIaFeXQLS\\\\MKSLSQYJY}eKO[EHiGSaK[Yw[bmdURgEK^_kcSGEOHKIAS]aFSU@Y]IWFUTYlkP_CUOUEkmYbSQK@EMWUuAU\\\\M@EpK^_ZMDQ^OXwC_ZODBrERURGVVZ\\\\DTXcFWNIAWJWAYUUFYEWLQQaCIZeDM`cLKRGpanJZQd\"],encodeOffsets:[[112153,19488]]}},{type:\"Feature\",id:\"469007\",properties:{name:\"东方市\",cp:[108.8498,19.0414],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@ºxJYZQIYXLl@dR\\\\WZEn]bA\\\\S~F`KXaDeTiNO^EEKWEDQXITBXaWaDQMUJOIaTWf@NJV@dSxGZFu_@WMKAU}AQ@MwG_[GOAmMMg@GKP]IUcaFKG[JSCoLGMqGEOYIMSWMSBucIeYA_HUKGFBLOFGPQBcMOF_@KO©UAtERadwZQ\\\\@ÊJÒgòUĪRlR°KĮVLJ\"],encodeOffsets:[[111208,19833]]}},{type:\"Feature\",id:\"4601\",properties:{name:\"海口市\",cp:[110.3893,19.8516],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@ńZƂtĢ¬æßFuz¹j_Fi[AOVOFME_RBb]XCAKQKRSBQWSPY\\\\HbUFSWSPoIOcCOHIPkYCQ]GdGGIFQYgSOAQLK`MFUIGa@aQ\\\\GGUFcHKNMh@\\\\OYKAigsCgLSF]GOQO]@GM]HyKSHKPW@Pxi@EMINYREXWRQ@MQcFGWIAwXGRH\\\\yDI`KJIdOCGRNPNtd\\\\UTMbQYi@]JeYOWaL[EcICMUJqWGDNZEXGJWFEXNbZRELFV]XQbAZFrYVUBCLNFCHmJaMIDDHXHEhQNXZ_TARFHVB@DTQIRR@YHAJVnAbKFUEMLd\\\\c^ÍÞ\"],encodeOffsets:[[112711,20572]]}},{type:\"Feature\",id:\"469006\",properties:{name:\"万宁市\",cp:[110.3137,18.8388],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@^J@ZTVbET^JBGLFPTHld]`FLQhcVanx\\\\\\\\ZbLHTGj\\\\FLP~fIZRZPVTQFSVAFJE^NDLEE[~LjsxVTG\\\\NZZNGlLRRGLJTV@hPZANN^@T\\\\NEPPbDZXO`d^HSvcJDIV\\\\XZAJUFCLNP@PQ¤@[ïKLÑIÏ]ÇE±I{u­YśUćFcYUmsVeBSVgB[RO@aYYPO^]@UVaNeDShMLG\\\\EfFVE\\\\F`\"],encodeOffsets:[[112657,19182]]}},{type:\"Feature\",id:\"469027\",properties:{name:\"澄迈县\",cp:[109.9937,19.7314],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@T\\\\GJCXJH@fJDDPNCNJENN^NLHBNSx@DDYbBLLDRbjZTj@`XXTlG^Xr@PJLW\\\\WLTlWR@HDJTD@X_PO@STMDNTMVV@NLDM`M\\\\XM\\\\JNBH[PYZúYzŸ`Ċ\\\\ÎÝd]c[NKVFLEBaUmBIZGQ@JQSR@CUAEGBQ`SWYRMFgWGCGJCbNnIDGMEDKVAZUEqBYRa^WEUFKYQMaFWXEHIFWMYHCrXVIIiaK@aMCUYNSIISTwXALKH@XWXIEIJQCG[IEQDE_XSBaa[AIPW@]RS[FWS[CD]PEBYNGFSaSyJG]@ugEUDQlGHiBKHUIoNSKqHFaPMICK]UUHIPDJMuCA[SCPIDIOILGAEmU[POPBVSJDREBGS[QXWSGcT}]IO_X@TGHoHOLCX\\\\ELT@LYTDaFENF\\\\lj\"],encodeOffsets:[[112385,19987]]}},{type:\"Feature\",id:\"469030\",properties:{name:\"白沙黎族自治县\",cp:[109.3703,19.211],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@D\\\\RV]dTXELnHr]^@LETBBRTHPi^[@U`QTHDJ`MGSogDIPKdJ`WVNHCXHl_DJR@AH`FBVPUJLHKNTJOFFZON[ZEHFCJlMJ_Cn`CJVNGPLTNDFIdVTWEIPmRKMc_kDMWGGUTAtJLK~\\\\f{pqD[LAVXRCH{HC`eJ`}@W^U@I@_Ya[R[@MSC_aMO@aWFmMOM@haGGMEmaQ[@MESHaIQJQMckBIw[AOSKKAMPSDSLOAV_@@`KJRbKRDfMdHZERgAWVsDMTUHqOUr@VQXTT@TfgL^NH\\\\@heTCZaESNObHPHeZF\\\\X^ElM^F^\"],encodeOffsets:[[111665,19890]]}},{type:\"Feature\",id:\"469002\",properties:{name:\"琼海市\",cp:[110.4208,19.224],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@TP\\\\pATHTGlZDJGAQjE\\\\Rb@jVBDCN`JZ[NCNHNXbULPrP\\\\KNbMTLjJJRFP`pNLZz^FLRHjVPZ@hxVKbHBHMNNJFRlLzGPnNHhIrHHADcPWdUAmEMVQDSKYHY\\\\EhBN^HpXGNDBNNBnIßÅ_g{³So]Ã£@ORO@KMEDIVYB[WJUICudGTc]P_YWaCOOMFS[]@MMYBgOU@ISHKQQkKMHYY[MSHwUit}KF\\\\KFMCF]EIUBETSROUKTLT[NKTWREfJbCHBZKTFTKh\"],encodeOffsets:[[112763,19595]]}},{type:\"Feature\",id:\"469031\",properties:{name:\"昌江黎族自治县\",cp:[109.0407,19.2137],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@`ZĤd`òü BSPGP@VSbQ`@]HC~T^SE]N]FkW]E[fYGGOPaTMbFDYfS@g[MGK]he@SSSRW@UVqrPVGNStCXUhBFQGYNcCeLQQaLI@_`@EUwcEaCUaMc@SK]Du`MSkKI~BVNL@X`EvYwHcTU@MIe@SXJbIPNVCRXbWbSAWJCRXFFL]FMPSjCfWb_L}E[TaBm^YF[XcQk@WKZJYRIZw¹ \"],encodeOffsets:[[111208,19833]]}},{type:\"Feature\",id:\"469028\",properties:{name:\"临高县\",cp:[109.6957,19.8063],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@jD`hNd\\\\^dZädĒH´Op@ùZY\\\\OAGIMN[[W_NCNMKU@NUMSNCTSP@`O@WSCCI@GXQSkXKX[IK@OWqH]SkWW@_SiiYQaKCAKZaCCw@MTGAMKM]FMMIMDSM_HGHRPKCBGSJJIYH[QOJCHMBDGQJECMTDQKFGTCEGTF`NFEDMFaGSNwIiTGhYJD\\\\KZODC^@FTKND`XBHKJNKFBNhG^FJMPcHEZF\\\\QPRjQTAdgNOPgQaRSê\"],encodeOffsets:[[112122,20431]]}},{type:\"Feature\",id:\"469034\",properties:{name:\"陵水黎族自治县\",cp:[109.9924,18.5415],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@R]NC`YL]FoN@V[vBXVFNL@TRZalnVFVP`DlOZkVSXEE_F[EUFeH[NKTgfCbMVU^@P]ZObZP@\\\\QhATUfAtUasñiāEoI]eYǯ@aKmaeWuCºKÜKpnbHbYfUDSNCPJTRAHJTDJSfDNLHXC``VBNGTYCQDIXMDSP@xLNEFRNXBIpVNLXah@RgF@`qOML@LJNSPLbaHAh@Jdj\"],encodeOffsets:[[112409,19261]]}},{type:\"Feature\",id:\"469026\",properties:{name:\"屯昌县\",cp:[110.0377,19.362],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@\\\\OnVBFKHPJCJOJTDB\\\\vDINOCGJVVL^JDONEbrGTLpMVJLGjAHGRkVChF@vH^zIbTETMHAZOFC^\\\\DXT\\\\EffAP\\\\PdAV@UIYfS|S@YPICMeM@sC[_A]VQEwyHSMuNcAUlQJMVGMS@mVBZPFO\\\\CSFQK[LqDMACiUa@[QiFBRIHYCHkGSBS[oSOqBIE^QHCRWHIXsHU\\\\UC}JEjMNAN_ZAIhSEYfWDQGaPMTLERZTJb``NHV@\"],encodeOffsets:[[112513,19852]]}},{type:\"Feature\",id:\"469025\",properties:{name:\"定安县\",cp:[110.3384,19.4698],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@JjDNdJ\\\\FbKPXfZ^Ij@RZNaVSc[MsMOHQPDJcLIJ_zCG[HQxWJBHXdENRR@XQFWZQQGOFSWUCI[WCJuRGLXNMPLhCl[Ta@SqGgJMGOmyHkKEQMINMAGaGULgwY@UOGiKQ]EYyMKoO_QEIIKiNSMa[LqOKOaVMWMGMDY\\\\_IKrL\\\\ERT[DEPYOUA@nNTUHINkRBVMdNvGTxzRF^U`BD\\\\@tfNDNOJ@Z{TeTJZ@VUcB[OBOeeQT@^OXBJb\\\\AbWTF`RCJFH\\\\RDJIJFXW@WLGBKxWTSJJMTVZND@bbL\"],encodeOffsets:[[112903,20139]]}},{type:\"Feature\",id:\"469035\",properties:{name:\"保亭黎族苗族自治县\",cp:[109.6284,18.6108],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@FJp@fxpQ\\\\ApN\\\\GNPNBM`HLMrXLXj\\\\PEHnI@WUCEM\\\\GTc\\\\GZYHTPBHRCPTdH\\\\K\\\\@HXiBJILJJAVNTOZJNtFPC`YxDPWci@IBgbGKaTOIM@KNKrP@_hE@QbgKWUMJoWAQMFEKM@wTONCJWRCZDHSAM_UD_GWMKeCITSCGIQBGXUHQoMEEGWDQIG]FMQBMaFGueFeSQDUSDSKOCSFMLUaPWM_PaEGFETMX]RCRR@HXKN@JNnXXESPaDI\\\\£FkXWIAX]xB\\\\GN\"],encodeOffsets:[[112031,19071]]}},{type:\"Feature\",id:\"469001\",properties:{name:\"五指山市\",cp:[109.5282,18.8299],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@TCNOLBTLBPx\\\\AJdlNRRIbJTGNF\\\\@RcIYbmHoLQdKN_fCJYbDRRXKZFVEZVXBXIJBXMdESW[CUYHUVQFQAqsEIMPYMSBUIIJKAIjGW[@[LGScDOGQOAGSYZ[HSd[HFNVD@XmJFG[OWiWKNqGKN_MAMO[HoM[BoRewo@Y^HpITSFENc`MVCdHNIVCLJFI`NFIP`@VZbaf[FFJG`O\\\\WRFA@PVPFPPH\"],encodeOffsets:[[111973,19401]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/hei_long_jiang_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"2311\",properties:{name:\"黑河市\",cp:[127.1448,49.2957],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@VÈÞ@kxnX°VÈa°V@kôwbJVkXlVUx@lL@xkVV°VbxlVUnVxk@KkVbIl@°kVl@lÆnkll@@VVX@V²bUlVlVUVÇn@nkJlkVb@x²V@n°VUnlKUn`@n°bWLnVUblVUVVbknV`°kkl@@V°@nzJ@XxlWXb°n@bĠlbXbbVbJ@Vba@@lbUbVmn@lVmnIW@WbÞ@n@x°@ĢaƐéϚnlČ¯ĠŻÈwm@ôçUmm£Xy°UV@wÈ£Ǫ¯kõÝçUÑUķĢkVÑÆÞU°nŎ¥ČUĊx°m°¦żVƐx°Ç£@yUônÞÆ@Èĉ°Kô¦WkWUbÇ»@ÈĕWÇÈ£ŤU@n£ÆUUKVamanwÅmÝJ¯k@JIkaVaUUÇbkaÆÑkWmÝUÛÝ@wnU±@kkV¯KUkJ¼U¦Å@ówķaķůV¥Uaó@Åwm_kVwĉĉmmn_V»a@UVwķóU¦LǫéóXÇmōLǓÇķxÝkĉkmakbUĶ°@W¼@bÈÆ@ĖLl@°J¯mkl¯LÝ±LamJ@¼VƧUóUXċb¯ńVbkÆÝI@llxk°V²V@UxÞL@b@b`ÇzkókÝ¤@ğ¯WLĉÇLmmnċVkbUaL@¯bU°ğLÝÝ@\"],encodeOffsets:[[127744,50102]]}},{type:\"Feature\",id:\"2327\",properties:{name:\"大兴安岭地区\",cp:[124.1016,52.2345],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@kϙmƏêġb¯@@wmÝ@XV@Ill@bUxl¯VlVbV@ULVlUV_kxVVVÈÝJ@¯Ulm¯x@xóÒĉ¼m¯Wxţ@Uz¯WwnUwť@knW£óVUUwğyó¦WIVmmI@±kwÇ@@b@ĉ¼ó@¯wó@¯aó¼KÅaUwmWUwÅI@aKó@UaLaVÅwō¼UUÝl±I¤VxÇx@zkJmnnmbnzxll¯ČkJl°@kbmx@x@kêmVnWxôXxU°bWLóJnÇWĵV¦UUbbÆġKk¯VU±aXmċÑUwĉKġkVxkÇKkbIÛXWl¯bX¯KbĊÞVÆnĸ²lxU°n°òÈb¦xVb@¯Vx@¯VķÞČlĊ°KĸȘI°¤ČIôò»ƨnȰKǬ¦ôWŎÈƨwlnKVXmbX`lbwkVWXXL°aƾaĊ£n°@°¥ŎzÞ¥»alwôkƒJa@ĶK£bU°ĊxźVÈUĠ¥ƨVI@XU°x°Ln¥w°UmwXmÝV¥Ģ°@nU@mÆ£¯lKÜw@aÅU¥UaÝIkmV²nn@Ķ»@Uk¥VKÞ@ÞÛ@kVmĢa@_Jómǖ¯ÆwóÇa@alUwwĢřk@wÆWXUWXWam@_ƒ»ÇéXaĸwVa@ÝKkUWkXkKXxn@lĊV@¯m¯nřÆw¥\"],encodeOffsets:[[130084,52206]]}},{type:\"Feature\",id:\"2301\",properties:{name:\"哈尔滨市\",cp:[127.9688,45.368],childNum:11},geometry:{type:\"Polygon\",coordinates:[\"@@°`_JlU@@V¦°JUnLôlnŤ@@ÈaUÒVbkbl¤zk°ÇVÛô°IlVUVôUxÆU@bźĀº@¦b@l²UVl@°ÒĠxnXxÆVô¼Þ@Üx²KÞlVÑ°UȰôlwô@²ĸ°lanV@VŎUll@bÈnÜmwĢ@la@ÝÞb°UXblŎ²ÆkVI@nJnĠ°knÜbĢwna@akÞKƒĀaIVbU¥wĠwkôxnLċVçkaU±IUmnġW°WôĉalÞÅĵ¯@W¹XÝab¯a±X¯ºLaVmkLóbkaVUKVkkKV_@aÝykk±L@ÅU@yV_aU¥ówÇx@UkVn@lkÅlwWVwUkĉmkklW@abVwnWWwWL@UUÇLÇm@wJĉL¥@Ý_@a¯yUWw¯¯Uġx¯aÝXVmaU£ó±¯nwa¯óÅVXmanUlUXkWa@mkIğamIklÇUkĊzkKlUōĬl@nX°@llUxŹ²mKĉVWwk@UbUK@bmVmIVmwaWxXlWČmºÞÆbUxV@ĵńWÆĉLkWUbaWzkbĉ`U±LklōwUVÝ£UW`Uwk@mk¯VkaõVX@WbLK@XƧºWzxK@lmX@bkVVÆk¼Vbk@Vn\"],encodeOffsets:[[128712,46604]]}},{type:\"Feature\",id:\"2302\",properties:{name:\"齐齐哈尔市\",cp:[124.541,47.5818],childNum:11},geometry:{type:\"Polygon\",coordinates:[\"@@Þ@ÞĠKV¯a°@KVblaČUmnnKĊÈKX°Ġ@Þ£ôllÈy_@a@aKÝVwU@±¯Ulkw@kÞJlÅUa°ŃČaWVôƨVU@»nIb²KÞ°Klkn°¯I@kK@ĕÇÅ@aX»¯@VĵlaÿVamI@aÅÝउýĊȗJôȁÅkmƑÛ@kxġ@@laVk¯»īŹak¥Å¯JUaWU@@wa»KUkÆkUmUmwÛ±±UUbUUXwWwÆÝklkUanaWwnKlkal¯kaƽakÅxa¯@amb¯VlÇwÛĀV@xmêVÆVVaôVwÈx@ˌx¦VÞ¯VlmX@L@¯Ua¯LmV@°XċKV@UÈ@¥@wġIUkm¥Źw¦¯lmn@°kxVV@¦óamn¦l@nxlĉVómxnÒĉĀĊ¼þǔêÞ°ˌĠÞÒ°ĀɲĀƨźˤȤƨĊ°w@£nymwnkUUV¥ôÑVmkÆmUUVamVIkmôlxkXÞþbll@kVƆVxV@¼VÒ@UnnÞJ\"],encodeOffsets:[[127744,50102]]}},{type:\"Feature\",id:\"2310\",properties:{name:\"牡丹江市\",cp:[129.7815,44.7089],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@U`lLUlVLUlbaôlKnUbK°¹²W°baÞbknyUlUkamř²L@m°@lm²n`ôÅlKxÜKnxV@l@ÅXyW_k@wmŹĕmX»Ûl°ôÈ»ôô_WW@Ual»wU@@wUV@VXI@wĢ͑ÞȻaU_@mUkly@¯óV»XmWUXUWmnm¥nUUaWLk»Æ²IÇawÅaÝ°¯nUa±a@¦õÆğ@@ÅbxUÜnÇłlb¯¦ôó»m@±Uk@Wwa¯xUV°xXbÇÅUVK@¹KUaȯ@ōÝXallÛkalÇUǫÇÅÇakbÝƆ¯nl¯@¼VUx@x¯W¼Æ¯mĖĬ¯ČVkķÅmx°ô²V¤bUnÞW°bĢw°V°XxV°z@bÞ`@¦KĊI@xnÈÈKV@VXKxXmXUxab@kXllĊnVlUxXkxlÆkm@UVl@ÈwôxV¦bU`@zÆV@²KllÞz@b\"],encodeOffsets:[[132672,46936]]}},{type:\"Feature\",id:\"2312\",properties:{name:\"绥化市\",cp:[126.7163,46.8018],childNum:10},geometry:{type:\"Polygon\",coordinates:[\"@@ऊþÆÞ@bnJUbĀnblĊÞlĸwǔÈŎKÈnôWǬêKV¥ĸôUx@VbU¼m`nnĊĊxlUmkaVÿLw@°»UmbKmÝUwUmVknKUUl¯KUUÈnK@ĠkX±lX°L@¯¥@wV_mĵ¯WwL¯UkōÇVUlwVó±¯aVka°wVk°mÞ¯ŦřÆl²ŎkU@mUkb¯ķ±ó@kxȯó¯VUÒkÝ±LÛwÝ@ó»ÅUWwmğw¯Ñ@UkV±@ka@¥¹Źÿ@aÅVwóVVUkU¯JÜóÈUl¯yk£laUaVÑÇb@ţ@kmómKV¯IU¥@@kVI`@ô¼blUlbÈb@xÇKkĢɳaÅɆō@VK@z@@¥ÆKnÜ@@aÛUwwnUķ@_V°@klVnULVVÞbVl@°@nxn°LÅÆlVÈmU²@VmĠLxn¯xkWzJwnLmbXbW°Æ²@x@JVxLĀ²Æ°I¯ºÈ@ÒnÈ\"],encodeOffsets:[[128352,48421]]}},{type:\"Feature\",id:\"2307\",properties:{name:\"伊春市\",cp:[129.1992,47.9608],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@K¯kWW²ğl@mLÇVVLk°VVmLUlVnxVnÞLnaV¯¼@xKUĀlbn`nÆxô@VbU¦ĸŰĸbôxÆ@V¥»IVl°LUll@²mVx@ÞÜÞVnlXÅÒlbÈaVVUblbJ@I°lÞInÆmxnbUbVLÅVm¤@ţVÇ¤XÈÇĖ@È¼aXVÜaXbWnzŎařKôbUlw@¯naÆKnUU¯Üa@mkkVUĊmżÝǖK°L²lÆI@¯¥ĉƛVaÞk@ÝVaĠlnUVwóma@wĉ@aVxamX@a@UaÅLaVW_nWm£nWm_ÅV¯m@mó¤Ý¦¯ÅalmX£VWUÅwmÇ@@IVWUw@aI@k@wŎ»WÅVaKIka@¥lUkUlwÅwVyÈwWU@a¯U°mÇ@UçaVa¯mV»ÅwÝUlUkV@kmUkX£w°@@ÇaÝIamÛam¯lğmmI@JUl±ÅōkWa¯VÝa@Þkbġ@xÛnÇm@akkōVōl±kÅťŚÝ°¯nUl¯xlbU°b²ôUxkVÈUŎVl°KXxĶ°nU`@x°¦@\"],encodeOffsets:[[131637,48556]]}},{type:\"Feature\",id:\"2308\",properties:{name:\"佳木斯市\",cp:[133.0005,47.5763],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@nbÞJb@È¯@xW¤Vln@lUVlkÞVÆxU¼°nUbbVèÈ@nIn@ĢmlUw°żVUn@lnL@VôbwĊlJķĸĢlwôwƨxVVUŦxLźÈ°`nnĠwŎJÞĶwôJ@¤XnÜĸln°¼È°lUbx@l@ÞÞÈm°lôwL°¼ĸ°Þ²nĠ@ôwÞ`ŤIVÒĠU@VJĸbÆ²@°ĊKJĶaĢȰ@ô¥°n¤bČU@VxmUw@aÝţÇķ@ĕķīU¯²@ÆmVÑô¯X¥ċç@ĉ»U¥ÝţKWVÅkUVÝŎUmÇÝx¯aķxÛUóL¯a±óōb¯ÑÅVÿ_Åķa@UK@wm@Van@UmmLVa@VImmXUWÝUÅKUwÝUUkVk@l¯XÅ_J¯kJmÅLa@¥U@¯Vz¯@`@¼mxƥŏKÛk@±laÛ@@Xm@@xƽ@WŎnˣĕÅ@@aÅ@@nÝbÇ¯@_UkUWkbwÝU@çWlw@anI¯lyX°m°VaÛm@mVwÞK°XlaXmm_@UkwÝK@VIXmV»I@a¯ğWbġaU_¯JU¯ġĉkō`±nÝÆkbóĊ¯XĢXmVn²JVlbUèČmKwlóğxxV¦UaJbƑÿÝLl@bmbġx\"],encodeOffsets:[[132615,47740]]}},{type:\"Feature\",id:\"2303\",properties:{name:\"鸡西市\",cp:[132.7917,45.7361],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@LKVVnkbVÈb²U°VnklVlaÈL@anU°ÜmXV`nôLèxlLXL²aVVmÈX@ķlnUÈl`È¹@Ť°U@xKnnVmlnnUllVnnaŎwlVÞÒ@n¦LV°lwVkLaÞlnÒ@xmLÞ¤Wn¼WÈLVVUxlÈôWVaU_VKKXUÆbnnôKbÞw°bÆWXamVwKUw¯WUkUlJUwVUa@@kmyzmĉw@kVwkW¯ÅKU_VmxU@aW@@kK@wa@K@@kVUaky°_Vmkna¯K@Lwġk@@IÇóXwVakmV@mwXUWanlĉ@ÇUwKóܛǊÛm°@wÅ@±b¯W¹WVwŹĕ¯kVmōb¯w@awmVUUbVIkaVwķxk¼b@VXXó`ó¼Çó¯kÜ¼WnźĖnxl@X`WzÆ\"],encodeOffsets:[[133921,46716]]}},{type:\"Feature\",id:\"2305\",properties:{name:\"双鸭山市\",cp:[133.5938,46.7523],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@UUwómÑÞÑUÝÝUkmmÅyV¯ī¥Uÿĉ¯mÇkaWbÅX¯aÝxaóLmmÅaWVLULV`UbXókÇVwUUÇKX»XmÝ£nK@wmÑkÝbKUlx¯kUKm¥@ÝÑkUōxmbUmkVkmmnkUmmL@w¯Vţ@Çºk_ÇmVk@ĸVxVÈ°lLkllUbōwnVW¼nlUx¯XmWUnÝ@xÝUó¼¯J@LVbkJWnkbW¯ÝLUxn@nÜb¯U¯nWkz°mJ@bkxX@èÞVxlaXlVV`°@ÈÞa@mÆ@@bÆ@ˤĖmXōƾ@@wn@@WÜ@kb@²ÜlŐLƦnw@»_°@y°UV@@¦bÆKnI°lIÆ`°W@kllUVÞVVxLÆÞVXWVnnUJ@UbnKVnm@Ubn@@xL@VbÆĸ`UĀÆÒ°Ŏa²ô°bôKÜVĸw°bÞwÈVnÞōVUÆlXU\"],encodeOffsets:[[137577,48578]]}},{type:\"Feature\",id:\"2306\",properties:{name:\"大庆市\",cp:[124.7717,46.4282],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@mÇ@ÑÇ°¹¯J±ÅÿKUwI@w@±ÅX¯WanamKxIylX°wmwğKUn±@nVÇUÅkÆ¯Kmmw@@¯UkÝaUUVKmUlk@¯U`ĸ@VmxVxÜ@bÛ@mÅL@¦@@yLUŎ@ÆɅɴblġÈL@wÇaakkVa»@ó¯_ÝJwÇaÅXnyU¯¥Å@wbÝaLmm@@VUlbğVm¯Xm_`¯_UxmLa¯b@maó¦Çk¤V@bóJknVxVXx±aLUbVxkLVlLWl@nX@VÅbWlÈnxbWÅbm@xbml°bXbWXVmnn`Lmnbmb@k@mwU@@¯Jlbk°lbkmLXxmbVbkllÅÞxXxVWVVa²VÜ²nxVVnÅlVlL¼b@xV@XVbIÆ°¦lźbĬ°¼Ulb@kĢ@lw@ƒÜlnȂÆóȘIĉ\"],encodeOffsets:[[128352,48421]]}},{type:\"Feature\",id:\"2304\",properties:{name:\"鹤岗市\",cp:[130.4407,47.7081],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@Þ¥ô£nn@°ÆUn`mXn¤mX`UXbÆKVb@@bnWbwUbĊ@x@nbWVm_mm@ó»UmÅWXkĠ»²¯¯nķwŎ@ĊŎK°bĸUnÑKČ¦ĠÈbÆknJÆUĢV°IVƾwaVkÇ¯¯»mķkÛWm@£óIĵxÝōIğxmm¯_ÇŹKwťUVUƧwóxxġkĸķIkĉxóa@UmK@kVmUŻ¯Vxkġn@mmJ¯n°V@bXVÇxUzÆxkxlVkV@¦lbJLUbÆXō¼@xl@J@bVxXU@JÈ@nxVÆUXW¤knÆb°\"],encodeOffsets:[[132998,49478]]}},{type:\"Feature\",id:\"2309\",properties:{name:\"七台河市\",cp:[131.2756,45.9558],childNum:2},geometry:{type:\"Polygon\",coordinates:[\"@@²mŎ_lĊĢV°°IV`ĢbaĠX°@bJU¼WnUJ@ÞLlxV@n`lIUa@K°Iô»ÞVwÞ@VmnX°WVwmkX»UmŎxVaklkkKÇ¯UUwÇWUnU±bKWKkwçóKmU_nW¯ÛmV@bÇKkbkUml¯U±VÇaUamlUULKk@U@mwÛLwkLóÆm_±nk¯@@n±KnŚlbkVVmzlWXº@Ķ°\"],encodeOffsets:[[133369,47228]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/he_bei_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"1308\",properties:{name:\"承德市\",cp:[117.5757,41.4075],childNum:11},geometry:{type:\"Polygon\",coordinates:[\"@@lLnlmxnIVVlUnb@VVxXJWL@LÞVnnVJ_@wkmKbxwXkWXXKlb²K@nVVVbL@WlU²lKVnUJVz@VVb@lÅ¼mVUVnbôaVX@°Ub@lWbX@b@bVb°x@VxÈLVlaÆ@Þb²k°@lVU@Xn@VWLXb@¤VXKVVVLnm°_ƨ¤@aUIVaalkX°kV@alwUVyU@kó°na°UVUUmUÆw@mkLVUWVIWLnn@xlVnKmyU@U°UXaV@U¥U@UÆ@aVUkWU¯aU@WLUV@bkbmKULmKkUVUkmVIUwlWV²Uml°U@WLUwVm@UUK@_KUUÜaXw@VKUU@mVIUUlmnIVVVbÈVlKnbVK@nI@nVnwVLVKKVnb@aUIVW@In°@lVnI@lWĢ@°UVL@b@VyUUa@w@WUnU@WÇ¯K@UkkJWaÛbmk@mVaÞU@amkW@mXUKkÿ£@akl@Um°UXwlaal@nmlXnW°znW@awV@akbĉ¥VmU@IVUJkUmWUKbmkUaKkUVU@KV@@klwWaU@kmXVènbmlUUKX¯JkbI@JmIUWU@Lml@XkJ@UkK@aVKwWaIWwmU@mU@J@UaċUaUUVkI±k@UU@UbVVm@UVKLlkIWaULUWXUJU@WbUb@lkXUxm@@JVn@J@bnb@Vkx@bLUÆnJaVXnKVVmzX°V@_lJXxWXK¯bÅamU@lUIbñJ@LÇKkIÇ`kxWL@@@bUVUb¯xWKkÅVlULW@n¦Ul@IlmUUUVm@kWnkKma¯XUKWmnwVwÝLmVUbUVWb@LnxmxVmbXx¦@nb@`V@kbLUmVUlkbVXkºmnm@@xk¦bĢÜl\"],encodeOffsets:[[118868,42784]]}},{type:\"Feature\",id:\"1307\",properties:{name:\"张家口市\",cp:[115.1477,40.8527],childNum:15},geometry:{type:\"Polygon\",coordinates:[\"@@kġÛal¥@wn@nml¹UWlaVknUVKla@U@_ma@¥WwnaUwnmw@KXaVUVaUnmWUk°lnUVUXWVwIWVóKUI@WXxUU@mma@kUKWLkw@yk@aVkUUċaUU@Wk@Unm@UVmLm±IUkJkW@aI@m@UVUla@VXVXmVwnkWKKU_k@m¥mX_JmnU@km@U@KmUVU@U@Umk@@LmW@Û£Wka@wk@aI@mmk@mUa@UmUIwW@aWUbU@kbÇ@kw@makVUkU@am@aU@mxkUbKUXU±KXVWLUK@wkU@V@WXUa@WbUxJI@¦VèVVX@±ê¯KUI`¯UULVx@V@UKIVkLmVkKm@nUJÝbkIUJVXVVxVbUVJUn°bVmlU°XnK@Ul@lVÈVUXx@W@VXVKÞbn@VnbVm`UxkW@UVkLKm¼@lUnUJVnVXV@Vm@@LVklIkl@VWlULWKUL@mJ@blbUVUlmzUJUxm@UUbċÜk@Ub@VLVV¦ôbVmUKUkU@m@VlVn¼WbUJ¯@@°nIllÈl@nXWlLkJ@bkxlxkxlXUlklJXL@bWn`@nÆXxlL@xl@XbLKlVlIXblVUbUJW@lX@VL@VVXJwn@WnL°KbVbl@VI@K@U@nmVmV@XUWI@aXm@VUUkWmn@lmUUk@mUmK@UnwVĉ@mU_V@XJôVVULVUn@llUnJl_n@ml@XlLlw²LVJUL@VmbVblVXmVnl@Ť¦nn@Ü@bl@@XV`Unb@VlLVb²JXn¥ÆÑ@¥Þ@\"],encodeOffsets:[[118868,42784]]}},{type:\"Feature\",id:\"1306\",properties:{name:\"保定市\",cp:[115.0488,39.0948],childNum:23},geometry:{type:\"Polygon\",coordinates:[\"@@VbXW@@UlV@xVLXKWU²LVVWLalVnwV@@bn@bVVllUnb@lxÈ@laV@aXV@bXxJnV@VVb@nnl@nJ@bll@aU_VWUwVUkUmUkb±mVwU@VIUW@UWk@VU@ynLm@IV@bnKLVaVmnIlaXwV@@WVL°@@xnX@V`V@VbUVVLVKnwnL@ll@@_V@VVnaÆ@KVXÆ@n@wKmUWm@km@kÜKXU@ÑW±nIUwVKla@I°wU±kkmm¯m_JnawW@IVaUama@wUmU@mVw@aXk@mWa@£km@a_kVmUnWW@¯bkUmk@VÇm@@kUUKUU@UVUamVUaWIkb@xU@@amUkKVkam@@kVUkUWmKmUkLUb@xmJU@UImVÛVmnUwJU@VX@UWm@Ub°¦UmxklmX@`ULU@@UW@@xkn¯@makVUmxUb°lUbUbnUJUUVaLkbUUJUU@mUUUJka@xUIWJUnJ@Vz@kb@`@bln@lb@X@@@XlbnbVb@VJlInlbVw@UKl@lbnan@VbJôLnUzlV@lÈLVbVK@LVxVWXX`WxXzbV`UXV¤nx@bVlVnVlUL\"],encodeOffsets:[[117304,40512]]}},{type:\"Feature\",id:\"1302\",properties:{name:\"唐山市\",cp:[118.4766,39.6826],childNum:11},geometry:{type:\"Polygon\",coordinates:[\"@@@VVl@²lJUVVbČVVb@@InV@VnXxJXbxUL@bLl@VlI@WnkKV@VXnJ@IJla°IWLVVnkmaUçWVkôaÜ¯@nV°wnJlaV@VUnUUaW¯wXWWwna@£UaWKU¯¯@aVUkKUamUUn»anIVwUWlk@LlWVakU@K_lbÞU°@y°n@KÈkWWţ¥ĉōkġWUw¯£¯Çwţw@kK@k¥ÝwÅbÇ¤ÛťVlW°@ĸx@VVVULVLkl@V@X`Ub@Xm@UWbk@ÆVbnLWV@lnXUbl@X¯lmUVkKWLkK@_UK@U@UmmUxmVXLWVULkU@`W@ULUK@XlJXzV@@xml@VU@UX@Kk@WbUK@Xn`XmJnmkxUVbUVlVVxUbV@nKlLkVKÞbVKXI°KVmVUIUKULVxVJVLkV@V@UbU@WUU@UbUK@b@nV@VkLmb@b\"],encodeOffsets:[[120398,41159]]}},{type:\"Feature\",id:\"1309\",properties:{name:\"沧州市\",cp:[116.8286,38.2104],childNum:15},geometry:{type:\"Polygon\",coordinates:[\"@@@ln@UÈl@Vnl°aX@mXnVlU`@bln@¤Xb@nWl@bUx@nnVV@xnbVbUb@JXxbmXa@kUVwlWkKôVm@wkkK@kl»ÈmVKXkla°@XVV@VI@ml@@Vn@VX@V@J@VxUzVV²blVk¦@Ġ@@»@VK@VÈLlK@XnJ@alIUlaVVb@n@aU@WUIV@mUn@mKXml@lL@LnWb@XV@@aVVbV@VVIVWÈbIÈ»ƒǟlWaVUÅUUm@kVUWVkaUwmaóUJUU¯ÑU¥mk¯UaKÅnÇyóXmWÛX¯aċbÛaJWÝU¯»aóóUm@IVVl@bLUJWLX@@xXUxl¤V@VnVUVXVbV@@@VVn°V@ţU¯VUmUWV@mUXabUKUwUaÇKnVk¦Wb@VnLmV@bkV@nxW`Å_UVV@bUklVX@VmlUx@VVL@xVWVL@VW@UUm@\"],encodeOffsets:[[118485,39280]]}},{type:\"Feature\",id:\"1301\",properties:{name:\"石家庄市\",cp:[114.4995,38.1006],childNum:19},geometry:{type:\"Polygon\",coordinates:[\"@@la@y@UImVXIVJw@lbIVVnV@VVIVVlaKbVUVVImVaaVk¯VanwVlUnb°@lm@wX@@VV@VK@_nWlknwV¯¥Van@VX@W@UVIVxnmÜUnUVJV@nI@wValKnV@kmU£na@mVk°KLVa@UU@UmknWWkXU@aWW@@km@UaU@@klK@UkaWaUnamm@Ua¯wWU@UkL@Un@xVlUXVJUbLmU@aUWUkmKkLUUm@mWXammkkWUm@@U¯JUUmkU¯@mKĉxÝwÝ¥LUómwkUUUWVkKmkKmLXlxVLVxXJ@nVJnz@VWL@`nX@x@kVUUmJmIXxJVnUV@UVV@LU`UXVVlXL@l@b@VmX@bxn°UbkKWLXlW@@bKmKULmakLUlmb@Xb@xmXU`Vb@`lLx@nWVXL@°WlXnlbKVKXVb@X@l_lJ@V@XnI\"],encodeOffsets:[[116562,39691]]}},{type:\"Feature\",id:\"1305\",properties:{name:\"邢台市\",cp:[114.8071,37.2821],childNum:18},geometry:{type:\"Polygon\",coordinates:[\"@@nKlLnlLXUVVlVnxôVKÞ¦ÞxĊwnL°@lVnVV°I@Vn@VlXnlnbWnXn@VVlKnLVlVX@bnVKVaUIVWkU@wVm@¯@U¥VmU_°lKkw@LXVaU@wUUUKlUóW@UVUUl°KwlKU_naKVnlKkkWWa@IJVa@IlJnU@KVUUmVlaXUl@lm@kXWÝÑnk±k@wğ@@U@mKĉLmVJ@zmlnWLUÝJU_@@mJkXUVlbklÝ@Ýab¯@¯±JÅwġaUU@kU@mVI±bUKLWUXJkaLóKULWbUVkKmnk@@bmLUl@b@mnmJkUULabnmn@lVV@¦n@l@bznx@`Vz@bxnV@xllbnKVx\"],encodeOffsets:[[116764,38346]]}},{type:\"Feature\",id:\"1304\",properties:{name:\"邯郸市\",cp:[114.4775,36.535],childNum:18},geometry:{type:\"Polygon\",coordinates:[\"@@bVKlVnInm@@akVnK@al@nmlLVUXaVKôLKlbIVWXKVL²aJnU@lV@VVĢbÆx²I°°@aÞbÞ@lkkaVUlWnI@@V`ÞIVXKmnk@yInUĊKÇkUUamUUk@aU@Uk@WUwVkVJVkkw°a@mK@UX@VVLVW@wwVa@¯Xm@@lUIWaU@UWkXWmU@UwmUkKmn@lkV²VaULUVmJUUUwLma@UmkIUmLmVmx@bLUamKÅL@VmbkU¯KÝamzkJUb±VkbL@lU@WIkJzkKmKnUalWkkKW@@nkbk@WW¯XUVUJ@XlJ@X@XlWLkU`VUnaWaUV@UVIaUxUUmVK@I@W@ÇU@@U@b@nmKXmx@UxkVWUX@`VLlL@`zXÝb@b@VUVkIUJVz°KVlnLlKnLxlLVVUVlXUJ@nnI@mVUlbn@@m@bVnV\"],encodeOffsets:[[116528,37885]]}},{type:\"Feature\",id:\"1303\",properties:{name:\"秦皇岛市\",cp:[119.2126,40.0232],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@lnV@Xbkx@lU@@LUVlVLVbnlaLXVVnlIVUJV@UnĊ¦lab@nJ°UmV@wn@VUJVI°bnWlXnWVLVK²bakklI@aUaVUwVUUalaVwnUVak¥X@WkLVÓmmUK@_lW@n_UK@alÅ@ğÅƑŃÝm@ÑţÇlL@¯mz¯@ÝVak`@LlVUbkXK@klVXUxJmbm¼VnVVblLUV@b°V°XLVb@¤mbXxWX°xXVbmVUVU@kbmI¯xmU@Û°óbUl\"],encodeOffsets:[[121411,41254]]}},{type:\"Feature\",id:\"1311\",properties:{name:\"衡水市\",cp:[115.8838,37.7161],childNum:11},geometry:{type:\"Polygon\",coordinates:[\"@@KVlV@X°xb@VnnmbVXblb@VkL@lV@Vbn@@l@XX@bWVXlmXnlVV@@VUbK¯LUl@nmbV¤n@lLXnlVUV@ln@lbUlLnV@bV@@wlaXJVbnUVbVU@VVLVVn@VVX@@UKXUU@wUK@UwVnk@UUWlkV@aUVUÆ`X_w@mlU@anUmK@UXal¥UmÈLVbVxVLabVW@nXUVnV°UŤV@U¯Um@U@@UUaWVUmUUU@k£VwW@wW@XKIUa@wU@@al@UK@_mKXKbUU@aVKm@Xm±@kbÇakLğVaUw@a@mkUJk@ykw@£WX@lknk@WVkbUVnUVL@mVkI@JUbI@JXbXllkLUmLmbV`kLx¯LkVUV@VôXkVVLVV@xVUbW@KxlL¯kV`UnV¦°@\"],encodeOffsets:[[118024,38549]]}},{type:\"Feature\",id:\"1310\",properties:{name:\"廊坊市\",cp:[116.521,39.0509],childNum:9},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@laU@UnL@VWbklWxnIVVV@XJlbUlXVbn@@KmV@@X°WVInJmn²@lmVbnL@amKV_kwlmX@@LVamaXaaVU@UnJVanLlUkaW@UaVakK@IlKUU@an@ln@alKUkIVa@a@klaUKUV@UkUV¯KVV@kUmU@@a¯ImJUU@VV@UL@U@@WXUWa@Ukwm@X@@w@al@@aVIUmVUUUVWUknK@I@l¥kU±aUUVyUw@@I@UUWm@@Uk@@nUJU@WU¯@kbWlULnÇk¼@llLl@xUnóLlkXUxV@lWbI`°nnnllV²¯x@JkbLUVxmJX²@ÒWVÛL@lln@XnnVL\"],[\"@@@kX@Valaa@KWI@UXW@WanaUIW@UaUKķk_W@UVUKU@b@UamxVXnJUbWVXLVbn@W°kb@U@Wó¼mIU¼k`V@bVbl@lX@lUôVlUIV`lXVn@lUlVn@l@UVaIUWl£UmVWU@@UUKlUUUnVL@KUnLVWUa@U\"]],encodeOffsets:[[[119037,40467]],[[119970,40776]]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/he_nan_geo\",[],function(){\nreturn{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"4113\",properties:{name:\"南阳市\",cp:[112.4011,33.0359],childNum:12},geometry:{type:\"Polygon\",coordinates:[\"@@lKl@nVV@bn@VVnmnLLXx@VLlKVUIXWÜ@Člbl@XUĊUlwnWLÞwm@ÞUVmnVl@nXJXLm@VnnJlaI@VkxVb@VlnJ@knKVn@°aVanal@XK°b@¯VJXIVK@al@nVk@nKab@XL@blVVKVLXK@VaVI°mVaX@V_@a@yUkVwVIVaJ°@anIlaV@nKnXÆm@wUUV±UUWUKnaWwXUWmÅ¯Vam@kakImUK»lan@VXXaW@@UlUUa@a@UlwUV@Xal@@anIVaUK@VXmwVmUmVLXl@nalLnal@nKlkV@@UnJUXnl@nVl¦V@@VnJ@nUVVVVIn@VaJÆn@@K@mka@kmWVaUI@a@k@@aUL@mmaVIUKUV@@IU@mUmmL@K@UUUU@mW@@nU@ğ»mVmbk@klW@UXnV@LJmlUnUJUUUW@UnkKxmLa@@@lUUbmUVWk@@nkUmam@UakJU_Vm@ÅlÇLUVmVUwULKU@k@UVUlU@@U@UaUUWaÅzJaWLklb@bmL@kKabWUV_@mV@b¯JmXUbUK¤ÇLUU@b@JkLWmkUWIkJ@VmX@JUbVXU`¯VV¯blK@LXKlUV@Um@@Uk@kxWkbL@KkbmL@UXmaU@@l@x@blX@xUJ@bULUlULÇ@@VnU`W@@nÛ¼U@@VmKUkm@VVX@@xÇ@bUbVb@VX@@xLUb@l¼XLlbUlVVUUb@n\"],encodeOffsets:[[113671,34364]]}},{type:\"Feature\",id:\"4115\",properties:{name:\"信阳市\",cp:[114.8291,32.0197],childNum:9},geometry:{type:\"Polygon\",coordinates:[\"@@VllInJlknJVkVU@mXlUÞ`VnVVU@U@y@nXlKVnJVkXKWaXIb@yVkVUkVwn@K@nW@kKlUXVVUlbnUV`n@V_V@llX@@Vb@bV@@nlVUb¯WLnbmb@nLnKbUbVWnLlaX@VVUX@Vln@`kL@ll@VXVJÈIVl@XÞJ°UnaLlylU@UXKlnn@lanLWWnbVI@KXKVL@LVWVL@UVKUIVWX@@XÆJ@In`@lJVI@aWÛnK@UlK@UU@VKnlmnXalUllLUbVVknJ@nV@Vm@al@@xnVlJVUU@w@ak@XW@_mWnUlŁUmVKV@VXwW»XWaUwnkWUkVUU@@@WlaUkkaIWVkm¯xmIUmLUVaUIó»m@mmwXk@amk¯¯l@wmkLmmU@UbkUWJ@XUbJ@b@l@znÆmK@Xk@Ub@lm@I@akmVKUUVUkU@U±JUbk@IWmkxa@UUVUWVkIUaW@UlLWn@VkJI@VkK@L@bmKkJmUUaUKWXk¼VxnJ@V@@VULV¼@@UkaUlWL@U@W@IkKmL@KULUWULWKUXUJmIbK²UWnWKUUkLUmUUam@UU@mUL@xkV@VV@bmV@Vk@mwkUVUx@mbXÇnVbUL¯WnUVLVb@xnlWnU@UVUVVUbVVlVkn@llVUXUWUXVbUJ@bmLUJnb@nVK@bl@@@bVJUbnX@lb\"],encodeOffsets:[[116551,33385]]}},{type:\"Feature\",id:\"4103\",properties:{name:\"洛阳市\",cp:[112.0605,34.3158],childNum:11},geometry:{type:\"Polygon\",coordinates:[\"@@VVUllLXl@LWn@J@bKUVmnL@`VblLnbV@b@JmL@LnV@VV@¯VJVnXL@nm@aÞ@ak@mImVbXLynLk°@°aVJnUV@UVVXk@WJ@VXLlUnJVnn°U@»°Uwl@bWmUXÆ@VLXU@m@Ua@Imkba@naWW@_@WXUV@@U²@K@I±U@¥kKWLóLla@£Um@kWKXU@mlLXUVKUU±J¯_@`UL¯Wmk@WakklUnVUVaU@KUU@mmK@_a@KX@VaUIm±kaVKVUkw@kaW@kbkL±UUaK@UUKVak£@UmmL@lIkmU@Ualw@UJkbmIUmn@WKImWk@mUUnÝV@nÝxKmXkxĉVWVk@kaċÛ@WXJUV@zmVWnbUbVbLlUnlUÒnWVVWnk@@Vm@kxm@Unl@Ll@@V@XnkJVV@nlVXxU@ln@a@VLnWĊ¦nx@lbVKXLl@ÞVLXJl@XXl`lIXVl@XlXUVKwV@lanxzUbVJ@VVX@b\"],encodeOffsets:[[114683,35551]]}},{type:\"Feature\",id:\"4117\",properties:{name:\"驻马店市\",cp:[114.1589,32.9041],childNum:10},geometry:{type:\"Polygon\",coordinates:[\"@@n@b°UÆXnVlnLÜ@VLm@n@na@Jm@k@lVVxXX@V`lLVXVV@VVÞLVV°²@labnxV@@bLmlm_VWnIWUna@lLbnV°VL@KVLVUVaVLXK@mÆXna@wVma@Xw@KlL@a@Va@wUkaWnIVla@Kn@Vn@VUl@nKVnJ@LnK@aVkVUUW@VakUVanI²XW@UUU°KnUVLl@XaVK@aU@KUI@W@_lm@KkLUKV_U@»@UVJ@XV@@mVL@K@U@Kk@VwUUm@kmWL@VkVkzKmb¯VÝI@WUkÇJUIUWk@@klK@_km@UVWUUW@kbmKUXaVamLmK@namaXK°VakU@mU@@aa@UW@kkU@U`m@U_mVkaUVWUkVL@lmX@Lm@UxVlUUl@zaWJXbWLUlmIUkLmW@@z@VUVUUmÝ_kVW@nUVUlmIklmIkJUkl@n@Lm@ÅIUbm@UJUUVU@mmI@UU@k¥mUk@WmVmI@VU@klmLk@mbkKmb@WkKUVnUnnxW@UVLUbmJ@bk@WbU@Vkx@V@bVbkV@V@XWbUWm@kb¼VLnlJlb\"],encodeOffsets:[[115920,33863]]}},{type:\"Feature\",id:\"4116\",properties:{name:\"周口市\",cp:[114.873,33.6951],childNum:10},geometry:{type:\"Polygon\",coordinates:[\"@@lnb@xlJ@UnLlKXUlJl_KnV@xVL@bkbVVUè@Wb@UbmkVmbXVJnUl@a°@@bLVblXxInmnLVwanJÆw²IlmnXVl°VVbÈaVb@lkn@VWnLlUVmÞUUklkVkUaVaVaUwK@kkaVWmw_l@nUVVb@baV@VV@zXJl@@kl@lk°WVnÆbnbUVJI@VKVm@kK@_kK@a@aU@@wW@@k@aUW@IUWVUnLlUlVXKVwmk@W@VWa¥@k@lnUIÇKUaU@UUVmIUVUk¥Vma@¯k@Wanwm@@n@@m@UIVkUVamUXWaVU_@mUVUImW@aUIĉK@VmIb@lU@@nJkU@KIUmmLk@UVm@Um@@LkbUmJXlbV@xUb@@bkK@LWx@bUn@xmbÅW@nWLUKUbUVKU@LUK¯mU@VV@xULUVL@bU`WUz¯aUamKUa@@xkX@x\"],encodeOffsets:[[116832,34527]]}},{type:\"Feature\",id:\"4114\",properties:{name:\"商丘市\",cp:[115.741,34.2828],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@XVl@lLÈ@VkV@V»UanWX@VaÆÇô@ÈaVX@xVJXUÞUaVLĸbXKlV@m°Vn_nyXX»mUk¥lK@a_@yInaVKVa°_@WXI@@KVnIlbnaV@l@a@_w@lwUKmXa@UV@»Vw@kUKVUUm@w±VUXUKUwmJUU@km@@±mXkmUI@mmKUwkbWakLWaUIkJmX@l@@VUX@JWbX@VbULWblUVULknlV@bVJkmb¯KknWmk@@nmVkx@VmU¯KUnUL@JUIVmaÅaUm¯Xlkk@@lk@WI@yUUU@b@aUaUmVk@`nxUXlb@lLVxUbUbVbUllkVlÝVUnkVmKUXm@kl@nUx@xnxn@`VX@V²x@V@b@Wl@zU`VUVVbL@VbW@bkXllkLWV@V@VVÈwlV@@XK²LlbWnnÆL@VnJWn\"],encodeOffsets:[[118024,35680]]}},{type:\"Feature\",id:\"4112\",properties:{name:\"三门峡市\",cp:[110.8301,34.3158],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@WKUmUI°U@@UmU@KnK@IaU@makKUa@_KnmVUL@a@IXm@KWkkKVkUU@aUW@UUIVaymwkbU@xLVUWWkk@WUkJk_WWk@WIUKÝk@WKULka@mwĉ¥mXUK@@bm@kVWwkU@mUUlIWm@@Uk@@KkVmn@lwn@@Ul@XmUXUmVÑkmkVKUaVamaUXn@ykLUK@WwKmKnUm@UmaU@mUk@kL@lxċxUnkVmnXxWb@`kzWJ@VLmVUnlmUL@lW@Ub@VXUb`VLUbUJ@nmnUlUUm@@bUJlnUU@lxkb@@XJUn@kb¯VVVmlXXlJlzn@VlkVW@bkKbmkUbVblXVxKÈnwÞlĊKlVnKlwX@lL@xlUnVn@l@lmX@ÆÈb°¼ÈwVJlx_°xalUÈxlUnbVxnL@lllbmn@nb@@VL@V@@VLJnIVVlKnV_\"],encodeOffsets:[[114661,35911]]}},{type:\"Feature\",id:\"4107\",properties:{name:\"新乡市\",cp:[114.2029,35.3595],childNum:9},geometry:{type:\"Polygon\",coordinates:[\"@@XVlLK°bUblbUbl@nX@WXVVKVk@@mb@UbnW`kLLV@VVLnKlVXIlV@@a@l£nWlkVa@°bnUlLVlnabnUVUXKlU@@lk@aI°y@ôkUU@wmônkWakmlUkVmkUlmUUm@nkUKWanamULXW@UVnUln`lblL°KXV@ĠJ@L°JUVwanK@UUImmkK@¯±Um@IVmUmmÅnWaUK¯aUkw@W±kVxUVwnÅJUIWaÝJóIbm`ÝbÅImJUI¯¥¯@mU¯UJmnUVóUkl±V@zXlbWVXL@bmmº@@XmJUXU°llk@nWJk@U@¦U`m¯Wx\"],encodeOffsets:[[116100,36349]]}},{type:\"Feature\",id:\"4104\",properties:{name:\"平顶山市\",cp:[112.9724,33.739],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@l¤UbVL@VLVb²VlKlaX@lb@lxUVULbln²VJUbW@@Lb@`nL@nVV@LVUbUVmkVllXbl@Xn°VK@_°`²IVVV@VUVJnInaWK@U@KLÆ@nmlXXWVUUw@klKVa@knyVkVanIJXUl@XbVUl@@aa@mXkbnK@UlK@UUUVaXaWmkUm¥nWmXaWakl@VmÞbKVL@aVI@mUwVm@KÅméULKVaUk@kUK@UWXI@VlKXU@VVnInVV@VLlK@UUkKU_@WWUwU@kln@@Imb@@mnUKÛ@mKUkWVXxmbVLXVVU²VV@xÅnmWmLU@kbmJ@b¯IUbJUUxVl@z@bU`W@Ub¯nUJUb@WLUKULkU@aWK@abmL@lmUk@@bULWJUI°@¯aWLk@mbUb¯b\"],encodeOffsets:[[114942,34527]]}},{type:\"Feature\",id:\"4101\",properties:{name:\"郑州市\",cp:[113.4668,34.6234],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@@nWVUKÅ@WnVnIV@kÆwV@nn@lxÞlnôJzXJl@nalUČVll@²UlkôVVUnmI°VnV°@°¦VJnIÆJÞan_VmU@ama@kU¥kaUklw@UIV¥kVUI@mmUÅmUlwVU@amUJWbUakVVé¯Im`k@wVWmLkU¯XkWmLmx@UUbm@@xJ@LbW@UUVWUkVK@kaIUamKUkkmmLUkJUVWXkWmnÅ@KL@@VXLmbmJUIUVU@ULWVkK@nWVXL@lVn@¤bkôKXKlL@¦²V@JL±@@VU@WV@X@`XXmb@blan@Jb@V\"],encodeOffsets:[[115617,35584]]}},{type:\"Feature\",id:\"4105\",properties:{name:\"安阳市\",cp:[114.5325,36.0022],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@°kVaV¥kVmUkWkWVkVKUwkkmKUU@awWWXWakKWkXmlaIVmX¥U@a@WnK@kVI¯@KğI@WU¯LkKak_kmmVU@VWXKnVmbXbVLmln@VVknlVUnVlklnXbmlmlXblnÈlWbn@@nK@VLbVV°VVzln@VxIbU@WLUa¯VUkWõ@¯kkmxk¼lXUlVbVLnlULmU@lLkVUlX@xW@¯mU@UmIUWL@aXakU¯anWk°@kkKmmUIWaambUkkKmV¯a@UblkmXk¤@@b@UbULWVnb@lUVVnmnVVUJ@bWXX@WJkL@blVU°UV@XlWnXUbW@UVkVVWbnLUJWLUK@Lnn@blVUnUblxVUVJXUa@UbLnUVV@mVIVVn@UbV@XbmbUV_lVXUWanJVI@WkI@WVIVU°WXXl@la@mX@lLXlkVbmXylIXJV@@kKla²UVaIVyÞb°LlVna@UÆKnLVbK@anwU\"],encodeOffsets:[[117676,36917]]}},{type:\"Feature\",id:\"4102\",properties:{name:\"开封市\",cp:[114.5764,34.6124],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@lUVbXaInV@bUVxknVVÆnn@VJlUU¦VJ@kxVllb¦lV@nb@bVUnaôJÞIXbVJÆImxUVwU²l@XxVl°bVLXb`XklUnmVblL@lmx°LVK@UXIVaWlL@Uk°KkVaVUXmmI@UÅKmmXka±KL@W@kUÇxUU@@UXUlKkklW@aXa@UKUaVUUV_@yXk@@a@U±w@UUW@_mmw@wVwmUaÇbUa¯UUkmWkn±JÅxmIbUxmKmnJWwkUaK@a¯@bk@mVUIWLmwm@Ua@WJUb@LUl@UUmLUbWJ@VL@VmXWWzUJUê\"],encodeOffsets:[[116641,35280]]}},{type:\"Feature\",id:\"4108\",properties:{name:\"焦作市\",cp:[112.8406,35.1508],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@V@VL@x@bXWV@XklUWX@J@nI@KlLKUVaV@JlL@KUk@KÞLl²_@nWlLUVV@nLWVUJVn@anV@awÞUVLVxb@lW@lbXnVn@@¼L°mKVn@bnl@nVK@blbLWU@VWLXV@nlKn@lVVbXw°nV_@¥Vl@XI@mlkkV¯VWnI@W@n¹n@aWKXUaWk@yk@kċUkVmbk@WIyóImÝkkwm@mU@xÅlU@mJXak@x¯V@¼¯VmUmmIkVWK@UXIl@UWVUU@mVUI¯b¯@lmKzWKUanJ@nlbÝ@@b\"],encodeOffsets:[[114728,35888]]}},{type:\"Feature\",id:\"4110\",properties:{name:\"许昌市\",cp:[113.6975,34.0466],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@lIVnKlnVlnLVbJlb@ULVlUXVVX@a@KI@wn@aVV@nwnKlXW°lVnKUXx@ln_°JVIXyXnW@UK@UXIVanKVV@Vk@KVaXI@Vbn@nxKnaUlnVa@Xa@VçUUla@aUK@wmULk`kIWVkLmK@V@XUln@JXV@nmbUóImUa±@@ÑóVUUk@UlKVU@akWVUUlUUaUK@UUKWbUkÅJ@XWa@XbmJ@nUJ@bUKLÝaUnk@lXbWbXnmn¦lVXnWbUbVV@VkL@VmLaWl@nb@bk@UVWak@WVImJUbUlmz@lUbkL@lVx\"],encodeOffsets:[[115797,35089]]}},{type:\"Feature\",id:\"4109\",properties:{name:\"濮阳市\",cp:[115.1917,35.799],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@lLXbWXXx@bVVnLllVxULUlXXlVlUnlU¦Ub¯lnK@VbVb@XbVLKVxVVnIlaba¥lU@wnalLnVVlVLXnlWVXn@@lVI@WnU@mÅW¥aW_k@WwXy@km@wUm¦lUxVLV@UwJ°x@VX@Vb@`VX@VX@llIVbnJlIbVlJ@mÑ¯Lóa@KUakX@UK@wU@lWUUÝ¯ImW¯aLUKU@k»k@mwa@UnKWI@UU@akVWKk@a±bóUWKXUmkKUmLbUx@lmLX@@bVW¦UnJkbWnXl\"],encodeOffsets:[[117642,36501]]}},{type:\"Feature\",id:\"4111\",properties:{name:\"漯河市\",cp:[113.8733,33.6951],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@@LUnVxnIWa@Xb@WÆIVlXaVL@VVLVbkVVUVlX@bUVkLVl@VVôU@Ò²@VbnôJVan@mWU@ImVk@WkI@wmak@wlW@w@VbnLVb°bVyXV_@aUKVVK@wUU@aK@kmbXVmJUX`knnK@aU@mwakb±@¯UUÝKUUU@WU@VkLUKU@mUmJUU@WVkL@UWJX@VVL@lVlUbLVKnêÆ\"],encodeOffsets:[[116348,34431]]}},{type:\"Feature\",id:\"4106\",properties:{name:\"鹤壁市\",cp:[114.3787,35.744],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@ón@xVVól@¯zJ@bkl@@kVWLUVmVXbVJnnlLl¯@Xlm°bVlWb@bKVXnJ@VV°nX@@wWVklUK@knVVKmkUKUaVkWkl»nwl°lö@lXV°UVbXKV@aJw@UmkUy¯UUUaK@UL@mm@XaÇkkmWank\"],encodeOffsets:[[117158,36338]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/hu_bei_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"4228\",properties:{name:\"恩施土家族苗族自治州\",cp:[109.5007,30.2563],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@VKbX@lbUVnL°@VlVnUl@VUX@aVmaXlaUUU@wmaVUn@Vnmmk@mU@knaaU¥VamX_@WUmW@_kVaVKnLl@VVal@k¥@kUW@kUKVUlUVÑW@kÇaU»ValmkUVUVak@aV¯_@WUkmVUlU@aalI@akkVWUaWXUWwWVbÆ@lalIVK@Um@UUW@al²a¯UağÇm@bkk@w@@WaULmxIUb¯@U`UXJmL¯aKXWUL@aknmK@aWUXaWm@I@UÅmVU@aUV@bVI@WkUbXkm@VakwUKULWKXmJ@XUK@mL@KUwVaUI@KU@mmnmXka@»V@@UUaw¯yVk@UUVmmkÛÈU@mWUnmxmlUbV¦UlbWVUL@UUIUmÇKVVbUVVxknLUxV`VX@kJVVUXWaUVVlUnmKUbkI@WULmK@L@LVlLnmUIWV@akn`VXUJIVlUVVbUX@¤mbnLmm@UXk@mm@Uka¥@kV@@KkU@aUKWbkLWVkIVk@UbVlmX@bU@@mmL@bn`@Ln@llVLVk@XVVU@`VXU¼k`VULka@VllVIn¤VU@@blÜbkx@bkLkKn@bn@@b@JUnV`UnVbVKlVXUlbn@°Vx@@bnVbUllVn@VVK@UnW@UVUlnkVÈÞxVbVVIxVaÆ@@aka@UVaU@@ak@Wl@nbVIÆ@Jk@L@VlXnlla@VJnw@UmwXU@aVK°ÒnllnLlbxnKVaV@l¦²nVl@llLx@XVVĶ@nax@U@alXUVaLÈþV°XxWXkK@mLnlUb@bxnLVlVVkb@UJ@xWXX\"],encodeOffsets:[[112816,32052]]}},{type:\"Feature\",id:\"4203\",properties:{name:\"十堰市\",cp:[110.5115,32.3877],childNum:9},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@@a@w@kV@nbVK@nUla@laÅl@nlVakwWX@WkLaVmwV@anK@UlIXmWkk@@mmLkWlwk@U_mKXwWK@U¯K@UU@VUakmkIyUUVUmanU@mlwk@_mWXaUWU@Ç@U@aUaVwUKUIVkK@UWIXmaV@k@Vm@UnwlUamk@V@ULUamxUJkU@I`WkkK¯XWak@@W@IUVLWJkXkaÇVUK@kUmbmUUUKbkKWUkI@kKÝ@@aUm»nI@mU@UnWV_@aUmWbkLUl¯b@akkk@WkkJm_k@UV±@J@bnU@@WÝIUJVbXL@nlJkx@Wn@VkJmbLmU`VbUL@xVn@XV@mVVnnJVbUx@VnVUbVVx@nbUK@b@bJm²VUlbXzVJVJVbn@@Xmb@V@bVJÈ@Vnkn@°aVVV@XKnalLVmUnnVKVlnLWlXXKlk°XWkLUVVV@nU@ml¯nmbk@W`Å@mbLWm¯UxnêVèk@mbVnUK@kKmXk@@JUIlÛLllnbVnlJ@LULnlÆaVLnV@nkVJ@lkô@²bÆm°wLWV@VXKVXI@W°ÆVKb°UJVIVV¦XKVL@lInaVÝnUl@@bX@nmVL@lVLlVLVUnbVW@xXnbU°¤V@a@kWKUUn@VlnL@UV@Ü»@mX@V_akaÞ@VK¯@kkW\"],[\"@@mUkUUm@nllVKXXVK\"]],encodeOffsets:[[[113918,33739]],[[113817,32811]]]}},{type:\"Feature\",id:\"4205\",properties:{name:\"宜昌市\",cp:[111.1707,30.7617],childNum:9},geometry:{type:\"Polygon\",coordinates:[\"@@°`U@blUbUVlVknUbV¼Èb@lXUÒkVUVVL@lVX@ll¦k@UbU@kmKULUbl@`nXV@XW`nUbV¦bmb@lV@nnlmnUm@UVnb@xVVVkbWnbVnVa@an@UaVUJXnWlXX@l¦@lKÆXbXV@VV@°¯°xXxXV@nV°UVWU_VWXkmaVnWVkn@lln@lb@UVLXWlnX@aXUmaVK@UXUU@WVIWXXVU@¥VK@UÞa²LlV@kV@UanKma@UVUnK@UVLXyVLknJ@UV@@UXKWUXaV@Vb@mVLnKWm@aUUm@@UkK@UlaLXKWaXI@alKlmUk@wVKXL@m@WWn@UVa@K@wna@aW_XWWkXbVW@k@U¯WWwka@UUaVIVkU@m±@U@@wVKka_@VV@XUVwU¥yUkm@V±ÈUKk»ÇLmmLk@ó£kmWwm@UIkWKXwWU@kLwkbmabkK@VLkmWIUKkUUÇIǫJXÅJULVÇLUV@UK@kI@WVI@UaWmXVVUL`±kÅLmKkkÅ@UaXXxWVXVbUXll@bkJb@bkVUVlnV@X\"],encodeOffsets:[[112906,30961]]}},{type:\"Feature\",id:\"4206\",properties:{name:\"襄樊市\",cp:[111.9397,31.9263],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@@Xl@Xb°WlLXl_@JlVVInwVbVK@@UnlVbkmx@VUnl@U@nbWXJ@VlLUVJVLUxVb@b@VÈ@XVVWbnX@`lkx@nmVnbUVVVzlJnlVbUV@@V°L@VXLWxnLV`l@kxlXnK@nl@XlWn`Xnl@@UVa@VÈK£VLVanW°U@UVU@`VInmV@nV@Xa@aVW@UalkXKblIyÆXnlJXbl@@VV@nklU@`nVKLVKVb@VU@UÈKUVKIlUX@V`lIVbn@nblVVmV@@XXJUVV@knKVn@`@XVnKwlLVmUUU@U@aXL@WlU@UUW@UmU@KkLWaXkWmXUWm@U@nk@UmK@U@UaUVUUKV_@al@namWUI@KUK@aV@WUIb¥ULUJkImK@U@KV@U@a@UkU@K@wVaUwlU@mUULmKUkV@@anIWmUK@I¯mKkl@LUb±lUakLmk@WwUKÝVUIm`¯n@Uk@makJU_@Jma¯ImwUVkKbaUÅ@wWaU@VU@mXIVmmUkJkwm@mIlUKWzUK@VmLUV@VnbmLVbU@@lkU±KbÝV@UL@¦VWUWXUJ@XVWV@VULnbWVbW@kmWXUK@Vkam@kkm@UlmXUnbWlUXV`UX¯VmUU@Ul@Lll@nnJ@LnWmbm@b`\",\"@@kUUm@nllVKXXVKmU\"],encodeOffsets:[[113423,32597],[113794,32800]]}},{type:\"Feature\",id:\"4211\",properties:{name:\"黄冈市\",cp:[115.2686,30.6628],childNum:10},geometry:{type:\"Polygon\",coordinates:[\"@@VVUnWVXnVJ@U@V@VXV@@IVJUn@V@L@KlIVlVanLVbnVlIn@@a@Kl@@IJlI@aXU@KlKkVblJXUVlU@VbVkVKXn@VlxVa²I@VlVUxln@bJXklaVWnLmÅ@y@k@aI@W@aXIlVVaV@nnlKnLVW@IUa@a@KUVVlI@wXKVV@IUla@lUXwWnnalLlxXLll°@XwVKVaXIlnb@nln@Va@U@k°UmÆUVaXIJV¯ÇUmmkU@WaKmakVm@U@aVKkkmKkVmIkÇ°£@aUUVaVVnKlkXmk@lUVaX@@Um@UmlUXVUVU@wK²¥Ua@I@UVl@UV±UIUÇ°»VkUmVI@a@Umĉ¯V±bŹĖğaÇL¯lmkX@óĀ@mÝêb±WkLn@xXx@@b@V@LW@UblţX`kxWnXô¯¦ÆV@L@JVLxkK@V@bkz°llXz@JUlVla@XUVbVKXnW`XXV@laVV@VX@V¯xx@xULVbUJ@n@LU@VmmakbUK@bIWWUUVkUmkLm@VJkb@nUJ@`V@kXaUaVmmLkUmJ@Uk@U±lkzmJUb@bVUxVXU¤L@JX@VlL@JkLUVU@mnUl¦@V\"],encodeOffsets:[[117181,32063]]}},{type:\"Feature\",id:\"4210\",properties:{name:\"荆州市\",cp:[113.291,30.0092],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@ÈJVlVVLXJlnK@UlLanblaxlK@XVWxXLlJ@VnXxlnô¤l@nKnÈKl¼VL²ÇUn@VlzV¦UxWVU@@U`lbUL@xV@²@@nlVUUJVb@VlbXx°XVWX_VKUwVKVa@UVKUUVk@KnblaUU@wnWl@UX@lÆ@@aIVmUkxVJUbÜ@Uk@WWnk@VVm@I@m@Un@mXUlVlUnJ@knJVU°@@aÆLX@llL@¦nJV@XblLVa²U@UlW@VX@`@LV@@bXJlIXml_lJU°bKÆLnVVl@öVmXaVIĢllUlVnLVlX@@bannxVLbn@°ÆXmmkĉ¯w±Uċ@KÝÅƧŃÝçUw¯m¯k@WkV@¯UIUJW¼kbUwk@W`@¦Uônb@VÆlÈ@VU@£UWWnUÆUnmJkUÇ£VWUI@aUU@WkI@Ua@JW@k£kaWVUKmnkKbkkVWbVmUUmwU@kk@UakUUa@V@nlx@lUb±lUbnnWLUyk@UamUK@mlk@Wb@VXL@x@xWI@a¯¯V@bVn@LkKmL@`XmKmVU@@bkL@V±bk@UaaLKUVIWXamVVbUK@b@Lm@UWkxULWVUnm@UlUX\"],encodeOffsets:[[113918,30764]]}},{type:\"Feature\",id:\"4208\",properties:{name:\"荆门市\",cp:[112.6758,30.9979],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@n@lxlInVUnWJ@nUVV@Xb@xVÆbalLVUnx°JnbI@V`lInbl@@V°mn_VJÞUVLXx@nllKVb²kVa@KlknL°@JVLXnmJ@bU@VlnLVKV@nX@lUKVaXal@VKn@¥°L@UnwbnaV@KV@VUX@lVXI@KW@@IXWV@laVLKlaXUVVnkVWV@lwXblIXWVkVmaU£VaUmVIkU@y@WakKUamU@UUK@kmK@w@@mK@LV¯U@WwkmULamVVUU@IbUKUakmm@UakLmxU@UÒWlULţÿmwkIUm@akÈblW@UVUUk@JW@XkWWUkUKUIlw@aUWknWUUmnIWaUwVaÛaVUIwVlUnJ@bÅ@@kVWk@mX@xVVkbma@LUlVVUL@VUbULVxULW`UX@V@lUXWaXlWXX`@bmb@x@LUb@VmXX@@nWKUL@xVlknkL@bWJXbWLKkb@VlL@Vn@VV@bnXmLUK@nUaU@WbXVWL@VU@@V\"],encodeOffsets:[[114548,31984]]}},{type:\"Feature\",id:\"4212\",properties:{name:\"咸宁市\",cp:[114.2578,29.6631],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@ÞÆLČ@V²°xĊnlWnÅ¯m@aK@°nJwnVIUaÆJÅ@wwVXW@aV_l@²V°lĊwlaXLwlUkalVVaX@lVXI@aUXJ@U°UU¥VIVKVklanLVa@VÈIVV@nk@aVa@mV_@aK@klKUa@UnKWk@@lU@@UW@@nUWUwmaVIXlV@mLXblJ@kV@kk@KU@WkUWVÅwkLmW@UmL@lULKULak@maUUÝwUJIbKUU@aWK@kUWVkUwVw@mÝ@I@wkW@aww@LU¥kJ@nVJIkVVnkVUkyUIUl@xWUkaW@@°kzWxkLUWmzk@@bVVVb@@XlV@Vl@bVbUn`Wn@WbVVI@`LVbXLV`mnU@@lL@LUak@Lk@WbUJn¦@lVb@xVb@n\"],encodeOffsets:[[116303,30567]]}},{type:\"Feature\",id:\"4213\",properties:{name:\"随州市\",cp:[113.4338,31.8768],childNum:2},geometry:{type:\"Polygon\",coordinates:[\"@@@n`lwkUmUVWX@lk@VanUĠ¼V@@mX@@nVVVXLmJVLnK@bV@@J@VUn@VaVUUUVWVLV@@Kk_@almaVkUU@WVVUVLXmmk@wUaUKUV@°@kmaUaÈmWmUVklaX@lVnxl@@UnaUk@VUVwVKn@VVn@VbVJUknUmmVmk_VwKUUmVak¥@UVKVIkW@UmIVWkIVkmmLkwmVU@LUU@VVXL@JmLUbmK@UUKmkKUUmVUaUnÇlk¯mJUnmLUaUJUaWL@UkJU@aklkU@¯@KWLUmUUWVkbLUKkbU@WX@JX@@LWJkUW@UVU@@LUmbamx@V¯K@¦mULk@WbUbLkVW@kVVxUb@x@LlV@V@b@VU@L@VLnlJVIVK¦aVJ@XU@bLV@LVJnXmbk@@bU`VLUVVb@V@VnL@Vml@@VXnWVXnWlXblK@LnV@VVX@VkV@XWK@bVV@VV\"],encodeOffsets:[[115830,33154]]}},{type:\"Feature\",id:\"4209\",properties:{name:\"孝感市\",cp:[113.9502,31.1188],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@VnXK@L@°lVlkb@VlI@VXKVbVIVbnKVmnI°lÈkVmVbnUVVlLnVL@VnLVanK@IWKUUV@V@KVnUlxnKlnUlJUXnJ@VlXUJUL@Vl¦UbnVVLUxl`UnnnmVVlnVKbmVX@a°Ý°LaXJV@VUnKVXVK@LnKlLUbVVX@VwVJVn@@UU¥V@@UUK@maUVUkkJ@L@K@UmVUI@JU@W@U@UV@UIWmXUVmUUÇ@UVmIlmnmakK@akaW@UwVUkKVnUlKVwkVU_WKUkVW@UXaWkUa@w@VU@XaW±@IkbKb¯L@WXkW@UakL@UV@UmVUmL@UXWVL@aUVUUUVU@yUUIUa@wUKWVU@kWk¯UkwVKLUxK@nVxUlUUWVUmw@wUUyXWlX¦WbUV@U@blbUVVbXXl@lVL@bk@lxkVVnVx¦`UnkL@V@L@@@xnL@lVL@VnVVblLXb@@zlVUJVnUbV¤bUnUlWXkJWakxU@UXml\"],encodeOffsets:[[116033,32091]]}},{type:\"Feature\",id:\"4201\",properties:{name:\"武汉市\",cp:[114.3896,30.6628],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@nbnmknJVUÈ@@U¥VknmV@VUlK@IkK@UW@IKV£UWVwU@aVanIly²kVl@@VnIlVnKUnVbblWU@@_VI@mlaUIn@lKVnUlVVXXJ@aVLlanbUnV@@K@mVIUaVK@ww°w@UW@UUUkbU@WWX_WmULaVU@WkbkUV@IWyk¯kly@a@UlLwUK@I@KÅUW@Å±Um@wl¥ka@@_Vw@ķa@akw@kKW£XVUVwVwUaU@VUUxWKkbĉx¯k±Uk@U`@bWXUx@xÆÅIVbUJmxIm¯@UmxnUVVbnJV@L@@kV@bVn@UVULlx°VXllV@XUVL@xVbJVV@zUVVVUVV@bUKWX@VnKUVVnU@@VlKVb@lXW@X°KaLla@JX²Wb@UV@@xVbXlWb@VUXVlXLV`UlUxkLmVUlLUVVxX@lb@blL\"],encodeOffsets:[[117e3,32097]]}},{type:\"Feature\",id:\"4202\",properties:{name:\"黄石市\",cp:[115.0159,29.9213],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@VUVV@VbUxaWUblUVmnKlX@bXJVIlVUxVVVIUzlx¯@VbnL@xx@UVaXKb@XkWU_Vm²klWXVKl@nXV@@wmlK²XaÞén@ôÿ@lWn°kUKmmUÑUmm@wkImWU@UakL@bVLUVċ@bUK@alIXKWK@nXnKmkUVw@¯b@LlUL±Wn@KULUaW@kL@lL@bU`@nUb@bmlU@UÇJ@UUbmKkblUULUJV¦¯V@VWIV@bWJkUW@UbkUlbkV\"],encodeOffsets:[[117282,30685]]}},{type:\"Feature\",id:\"429021\",properties:{name:\"神农架林区\",cp:[110.4565,31.5802],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@n`lIXll@ll@b°aVklKXaVn@bU`mX@VV@nmJn¼V@bÞ@lL@lJXVlLaVLVnVnalV@VLÈUlblWXIKVU@J_@annaXm@KmI@mkk@KVkWWw¯w¯°@UUU@WaÅWkL@¥@kWWXkWmIUVVbm@@bUbmUUbW@UVk@mVkU@U¯mKVUkaW@aULÆVbb@VÅ@Un@VLWl¯L\"],encodeOffsets:[[112624,32266]]}},{type:\"Feature\",id:\"429006\",properties:{name:\"天门市\",cp:[113.0273,30.6409],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@@K@UlKVm_¥UwUmlUkwl@@aUK@kkWWUaVUka@aV@VUXaW¥Xk@WWIklm@ÅxmIVÝUkxka@bWJaUL@W@l¯UULUbkVUa¯bm¤UnÇUkmUUxb@VkXÇal@bVnlJnxŤĀVKXkVÑV@nwlKVbn@nlVbVLaJ@VVUnUbVKlnXxV@°U@KnL\"],encodeOffsets:[[116056,31636]]}},{type:\"Feature\",id:\"429004\",properties:{name:\"仙桃市\",cp:[113.3789,30.3003],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@VK°VkX@@VKbXI@alblwÞVUnJÆwn@lkXJ@XWVzV@xnxVXUVVVkUw@mLVwKVU@Um@alU@@@KUmIUaVUmnwmwmb@aW@UkmKkUkVġkUJWbnUõ@UkmUÅKL¯aVkIk`WnkJ@xVLUVVbUbk@WlXbmVxnxUblbUV@@VUV@nVL\"],encodeOffsets:[[115662,31259]]}},{type:\"Feature\",id:\"429005\",properties:{name:\"潜江市\",cp:[112.7637,30.3607],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@UbVxbXmJVnXVlmVX@bkxVJVLVlXXWlX@@IVlVUaVwVlnÈVVmn£°aVbUlaVUK@mVU@U@VUkaVamwUwnWaXkl@VaUaVUUK@wWI@aU@@K@_UW@kX@V±VUbkKWaU@mI@¥kKkW@ÅK@b¯@UVmI@lmIkVkUWVnm@@V@n@JUnU@mlXXl@@V\"],encodeOffsets:[[115234,31118]]}},{type:\"Feature\",id:\"4207\",properties:{name:\"鄂州市\",cp:[114.7302,30.4102],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@°¥WóXmlw_ŤWkVaX@@K@U@a@WwU@mWk@ULWkX±lUnV`XWl@aWLUb@Vw@wmKUa@°kwyVUJUUVwkUUJWI@akWmLUnkVaXVbUxUVWX¤lL@lx@bb@ĸUx@`@lbk¦@xn²VÆX@\"],encodeOffsets:[[117541,31349]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/hu_nan_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"4312\",properties:{name:\"怀化市\",cp:[109.9512,27.4438],childNum:12},geometry:{type:\"Polygon\",coordinates:[\"@@@n@b@XnJ@k°x@aVUnlUXnV@@VnJWUJVnIVV°UbVVVL@²LUVa°V@aV@nmUXblLXWVXVmVLVK@an_`@X@l°VlXXW`nX@Jmn@b@nV@Lm`bUbn@VUVl@nIVbUlV@LkJUnVV@xVblVUbU@zUKU@mx@xUnn@@WV@lbUb@nVWXXV@VIV@VUnJ@VUz@JWbXllI@VXVVL@Vn@Wlb@lXVlLaV@VJ@XX`kVwVl@bkbUlVXIlnLVamVwV@@nV@XaVJVbX@lwV@n@nV@VWnIVVUÆ@Xxa@IUUKmk@mVIXmWUVJnUVU@anaVwkU@UXa@W@m_@a¯@@K@UVbnK@blIlbXa@WW_n@VU@¯bmyUkUJÇÅ@WU@kWKÅwnm°KVkmankVWnXVWV@UwXkV@mUlLnaVaX@VUn@VnVK@xlnXWU@a@@klakVwmUaV@wmIÛ`m@mVUXmlIXVI@K@aU@UaV_UK@wkUmmUKWXmVkUL@mU_nK@aVU@Ukak»@U@ymU¯UUVKkam@nka@mwkLWb¯mka_VaVKUIUw@kKmU@WK@UnmaULkU@wUalWV¹U@@WUI@WU@_@W@U@mU@WbbUK@Um@@UmbUwWWkk@WUa@anUUwlWUwUU@wlJVUnnV@@mnI@mK@U@wa@wUm@_mVUUaVUk_kċUkVWL@mlU@kn¥W@UwUWV@VÝU@lXLWVUbVLXlVIlknmU@VUJk@@@kVmwmVkxU@@XmVUb@xnKVLl@VxUxkIU`@bWVXX@JWL@bkb¤@bmUUU¯Kkmb@VVUVVn@@Vb@`lnxmblUnbk@xUmV@bmWbUV@VJIl@nVUbK@nn@VbnJVIlJVkXJ@X@lmx@bnnWVXJWXU@UlU@mk@@llb°xIUbnJ@VWbXVmI@JVX@bk@bWL@JUXUK@U@U`n@@Xm@XVW@@nX@@`ImxU@@JUI@KLmK@UÅUUV@VW@¯kUU@UamVUUmJ@nxmLKkmJkwkKm_mKXU@aU@b@Wk@ma@zUJVUmbUlU@xnXlWlXXblK¤V@@nUVVLkVl@Xb@VVKnXKVx@znW@X@@lVK@X@JXbWbnn@JUamLVVXIVxnK@aWUX@x@VnI@WlI@anVIVxkl@lbXXxVVVJVInbV@@ln¦ml@XXVWbkJWb\",\"@@XLVKVXVKUa@UUUmV@l\"],encodeOffsets:[[112050,28384],[112174,27394]]}},{type:\"Feature\",id:\"4311\",properties:{name:\"永州市\",cp:[111.709,25.752],childNum:10},geometry:{type:\"Polygon\",coordinates:[\"@@lxUXVlXUVnlVĢJVbUXVJV@XUW¯VIUK@klW@Un@nl@V`XUVL@l@Vx@XXW`UnUbxUlVnUVlb@VnJUVVVInJlUVnwVklKnwLVJVV@nIV@nbVa@KVVVUUaKV_nVVJ@_VWnV@n¥lI@anl¥X_VKlwVlULUVVV@U@VXL@IUmn@VU@wmKXUWU@m²l@VIXWWkWUkWlkIVamUXamUnmWUU@@UnlK@XJl@kVUk@mWKXkl@@aVU@UVWUUVaIn`VUVLnw@U@K@U@w@UVmUU°K@UnV@bV@Xk@KVm@amkaU£VWUUmUUwm`UbULkaKXU@kVmU@aV_UWVIn@yXXK@klmVV_kWVUn@WUU@UmaU@wnwWanUmmXkam@UakLmK@bxUUUU@Km¥Va¯@kUaVUlmUU@mUUÇmUkUybbUaXUWWbÅLmL@VaL@WWXUKmmk@a@UUKXW¥kU@VUkxmVkUWbUJnVJ@nVJXzWxk@lVbUX@VVL@`mbUnUnVV¼k@Ulm@mwLb@lmLUK@UamWkK@£Ua@UkJkUmbVlkX@bWbUVnnUVl@bbVK@VX@lbV@nU¤x²Knblb@xVô@l@b@l@XWxnVl@VV@XLVlLUUXV`bXXmJU@@bm@UUkLW@UlUKWUUbwUmL@nklVVmVXXm@@bUKlÆnXkllVUVVL@nUbV@V@nnV@xUn¯U@JW@UX@xĉ@`m@@LV@b\"],encodeOffsets:[[113671,26989]]}},{type:\"Feature\",id:\"4305\",properties:{name:\"邵阳市\",cp:[110.9619,26.8121],childNum:10},geometry:{type:\"Polygon\",coordinates:[\"@@XIlJIVVK@n@VVVKnLVwVmnLVK@U@wJ@wVIÆ°X@ÜÈUÈxll@kn@VwVaXJWXn@@WVL@UUKVKV_U@@aVKx@UaV@lk@XylbUaV_Vnal@WU@aI@aV@@aVUl@XmUXWaXml@@kk@ma@V_UnUVUUWJUa@kkaWLUmk@@LUVWUkJWkK@¼UnWJIkV@b@JUIm@UlVm@Uw@a@kWXWKUknW@WUU@kmxUkVmIUJUUVmI@UkaUVUmVkwVaVmX_WW@Uw@@kUKWVU_k@mm@@VkX@lVLUJX°WVU@UIVWUaIUġmkVUkWUVWkwWXk`mI@¥kUVUUn±@mXkWknVUVmmU@@XVUk`@Xk@¥¯»mbĉó@mkU@kUKmX@UnmL@lULkKUWUU@bUaUn@Vb@l¦Ub@l@UKmnKUnlUVVbUVn@`Vn@xb@x@VL@nmJ@nU@mmUVkI@xVVVxkXVxmV@bbXVl@XlXVxna@Vn@@VVLaXaV@n@@V@X`V@@XVJ@XV@UºkXVb@xlVVKnbm@VXLV@nlL@VxJVULUb`lb°nXalKnx@lbmn@lbULVV°nV@z@Vl¼lb@VUV@bmLV`@nKlVnUXWVLnnlV@xVLU`VbV@\"],encodeOffsets:[[113535,28322]]}},{type:\"Feature\",id:\"4310\",properties:{name:\"郴州市\",cp:[113.2361,25.8673],childNum:10},geometry:{type:\"Polygon\",coordinates:[\"@@²zVaVlnVl@nVkJl_XJlIVmnL@mV@VXn@lV@XzV@lyV¯²U@UlJ@XVKnVVIXl@UVLV`@n@JI@mlIKVLnUlVUVVLXaKVLl@nb@WXV°KUnVVL@xVJL@b@LUVVVUVXbmbVbn@@lUbm@x@XVVV@@@bkImx@Vm@Xbb@l°XU¤aLmnL@bl@@VUX@VxnVanLnW¥XKVwnUWXmVIUWÆLVxLw@wVmlU@¥XWUkwlÇn_UwWV@VU°wnUy@aVkVlnL@lVnw@VlJ@bXx@bVKnb@U@WVUl@@Vnbl@XLlK@aVLVKnxÞn@aLlmUaVUm@ÅknUmaUKmVk@mkk@UlWUkVm@w@kUU@WU¯¥@wÇ@aVIlUV@kUWU@UUm»@k@mKVkUKUwaUaUa@kkUWJkImaU@UK@maUzk`@zy@XmJkL@UUJmUkV@z@kkVmK@¦UbWL@a@UbmKmwUKXkVUUkmVkw@UUKmL@WUIWaJW_k@@WmI@mk@WkWULUUVKUUVm@Ub@nUÇ@U@wV@Ua@aL@akl@kUJwó@@L@V@`@J@xnnmV@bkJmUó@nJWUUmU@UV@LkWlnnmVXbmxxV@nbVV@XVm@UVlXU`Ukn@lWLWzm@UJVXU`@bVUn@lWVLlbVKVan_VxnVVVUXV¤bnl@bUn@LWlU@@amU@V¯LVVUn@V@x@V@L@VmxUKUVm_JUbVV\"],encodeOffsets:[[114930,26747]]}},{type:\"Feature\",id:\"4307\",properties:{name:\"常德市\",cp:[111.4014,29.2676],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@lUmkUwUyV@VW@¯VaVmUU@KVUVUVLnaWnkUÓV_@mVU@Ýw@ka@kVmUmK@IkaUamKkXWaUW@WUk@@KVU@aU@L@J@XÇVUKVak_mWkLWakVUbmLUUmlUVKUU@kUWW@UImJ@xkLkKm@@X@óÝ@UUk@UKVULKXkWWbkaIUWU@mUk@WLaUJġ@@XÈÆVIlVnz°aV@Um@X`@XWbkakJ@amLaU@V@L°@@bn`@@XWb@VVlUxmb@bUVmVUIXVWnJU@nnlVLV@JbWzk`m@UVK²VxkLVl@Vn@V°xVKVkVVlUblx@bUÆ@@nVnUllkx@VW@@VkLWxUL@bÝ@kKkVõV@bkXVVUV@VkUkVLkVa@@¯xUxmX@JVb°WXkK@Vm@kVbbn¤xUXkJblxnXÆK²l_@Wnan@UL@bJnIlV@lU@@¯ô@lWȂIVKVmU@aXaV@lwVXn@@K@UVKUUnUbn@lWXlJnULKV@l@²a@UlK@aV@naVXWV_nKlL@KUm@a°U°@VXL@a@wWmXal@k@VLnV@@bl@VnX@mwVa²aVU@mk@\"],encodeOffsets:[[114976,30201]]}},{type:\"Feature\",id:\"4331\",properties:{name:\"湘西土家族苗族自治州\",cp:[109.7864,28.6743],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@@KL@wnK±nnm@WUkÜÈn@n»@mVamkmUl@VnmmU@wUan¯VKLnVWlInyWUI@WWk@KXUn@mnUmU@WmkV@kXaaVaUmIk@kaX@Um@UKWU@UkJWkXa@IVy@UmIUVU@UJU@WXWmU@VakaU@@Xm@Vm@wnwV@VLyV@VakUUa@wUUVmlI@KUVkUamJk@VU@UmVaan_@KmU@@anm@ImWX_WWUk¯@k@W_m`@bULUKUnUWWXkKWaVmnU@@b¯UUbV±K@UKUUVa¯UUmJUVIXmI@UU@WmVmkUV@b¯w@lmI@W@a@m¯LXbmJVLklWL@V@XXmbVVU@@VU²Ul@VlX@b`XxzUmkUVÒl@bXLWxXVl@VbkLma@nmVmULVbmVUb@lnzmbUÒVl@°nLVlJkn@bmJk_VmmkblxÈx@LUbxVb@Vn@JmLVU@nV@¦VbnJ@lVVbkxbm@UxVLV@n`UnVVVkl°zxVb@VU@@ÆlXnWm¦nbVK@XVVUVVl@XKUV@nVL@WnIWXLVKVLlxUbVKXVWbn@@UnKVLVbJU@aVU°b\"],encodeOffsets:[[112354,30325]]}},{type:\"Feature\",id:\"4304\",properties:{name:\"衡阳市\",cp:[112.4121,26.7902],childNum:9},geometry:{type:\"Polygon\",coordinates:[\"@@lV@XV@mXVlXLWX@l@bVxn@UVkn@VJ@I@alUJXIVm@»LXllIXVVU@Kl@VnXKlb@lVbXIVVUmVVU`@nbl@@lXLVVVKVbnXWJ@VXbWxXbUlVK¦nLVVUVVbbK@ULnK@Un@VxlUV`UnnL@VVL@JV@VUnxnKVbV@@VIVUnJUVUl@nWXllIUaKVbÞLV¼²`V@VIUwlaVmXa@IWanK@U@mkVVUVaX@lnaVLÈ@¥@kkJUWJUaXkaUmwVXJ@_lWUU@¥n_KkamUK@amKnKbV£¯W@kaWan@@UnwlJ@a@@UUU@Wwn@Va@km@UanaWaUVUUVU@K@aKUI@wKUUVm¯LWUX@mak@UKLWbUKVUkUmVUKLkJ@nJ@I@mU_UK@VWkUJmUUL@WkI@V±VU°kzU@Wy@kUm@UWU@@nmKUnkJWIk`IUlmk@mUUkUb±yUX@VUV@bk@WlXL@nVlUlk@WI@kLm@VV@XVmnnVWbnVUblJXkVlXXlWXUJk@±@nXVWVnL@xUVm@Vn@JWK@UV@UUVUVKUkkxULW`k¦m@bkJm¦U@mUX@`UImUU`LVbUVUU@LUbmaU@mJU@UUIKmxkLUl\"],encodeOffsets:[[114222,27484]]}},{type:\"Feature\",id:\"4306\",properties:{name:\"岳阳市\",cp:[113.2361,29.1357],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@@wUklmUUmU@@UVm@wUaV_mmUKmwkIkJmUUnm@@UUbUKUmÛamm¯xVLkbÇÆUVUzkVUlUUKWLX¦W@VUUUaKUbmLKm@akU@amVaUUVIVWkk@wk@@xmLlmÅwmbVlXlÝIWVkK@kkVL@VWKU@Ublnam@b@bnW`@XUJk@UUWKk@UKnn@xmLUVm@kbVbVnV@Vb@KnVLWXÆVĢ¦VblnUJWz@ÆVóUVbkVaÅx@¦lVUbVVknWKk@wKVUÅl@zkb@`m_mJ@xXmbVb@llV@n@llbXLUXalUlalVnwnLVKlVbX@@IV@blJ@bVL@VVVUXÈ¤VnkVÑXmlbnVKkÑÅ@UmaVç@±XUlIxlV@VaX¯lUVVUVJnV@°°n°Vxĸł°¦b²¦lJ@U@aUK@kUm@_m±VIXal@Kl@bV@KK@km@UmUUaK@_UJaXU@Xm_VmUk@WUk@kU@a@m@UaUUU@al@nyXXWWwkly@¯n@@bnV@k@mVIVlUUmlUJUwIbXVaUal@Kb@VKVkXVl@VkUU@ylUVVaVL\"],encodeOffsets:[[116888,29526]]}},{type:\"Feature\",id:\"4309\",properties:{name:\"益阳市\",cp:[111.731,28.3832],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@ÆxXL@lV@ĢVIbXKl@nVV@XVJlbXalXWLVKUVLl@VV@ôÞ@@Wn@lLlK@wnIVJX@VX@lVVULVnkVVnKValUXblKnXl`UbVLÈU@W@IKV@@bUV@L@lXV@VXXblWnLVblb@JnLVUn@llb@x@ÞUV@nU`VÔmlXmbUKUVUV@LVVUnUb@°UX@UVzVxnlVkVnlVnaW@wnIn`@_la@ykÆVULxl@XLlmUUVakU@¥ÆwblUUaôVU@ÅXyVImkUaġ¥ÅUWXKmU@La@UmUUUalan@VUnK@wmmL@VlXLVVl@VI@WX_m@a¯mKUkwW¥UK@_UWWLUVkUWL@WUIkVU@JwkLUUmJVI@WkXm@VmkKUIU@mmm_@VUV@kJċwUU@KUWkkW@IWW@km@klwkWVkkUV¯m@kWLU`mIkmkXm@@`@L@xUKWkU@VL@JUU@mbUKVa¯WVnL@`lXUVkU@xW@UbUWVU@UJ@lnU@mnÈmVa@bULwUb@@VkxmUUUVK@IUmk@akm@wmIkK@bVWXkm@wULUmm@UVW@UbmbkKVnU@WlxVU@UXmWUXmlnbUl¯Lmn\"],encodeOffsets:[[113378,28981]]}},{type:\"Feature\",id:\"4301\",properties:{name:\"长沙市\",cp:[113.0823,28.2568],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@lVUllXkx@lln@XX@JlXXlV@LVVČxlI@VU@Un`nnV@VJlLUnn@lW@XUJnIVVlKx@IVlUVJ@XXKlVVUXKVX@`VLX¦lxVnL°an@bkmVaV@XL@UKlU@llLXUÞJWkUknaÆxnknK@w@l@xllUXUJVVUbn@blV@bnLnKVaLVbVVUX@W¥XKVLVVklUVyUVÈÅlaUK°wnnÜbnVVLaVV@n@VmnVlIlJna@Valkn@na@amwm@UXwK@aUUVUUaVawWK@kU@UaW@kKUU@kW¯XWan@kmmÅ@@I@U@KmLkaVUKkLWVUk@UVmU@am@kkk¥UVUKmaUb@UbI@aKkkWm@W¯K¯b@VmaULVxUXlVk@UxVJVbUb@xUL@ULWWLĕmxVVL@VbKUwaÅ²WwX@@WUWLU@VbkV@aU@@VUnmJ@VUn@VLUK@UmUIk@UÇmU@@UW@J@LbUmVI@aUmW@@bkXUx@lmLUbm@UbkJ@V@XmlUbkKm@ma@kUaVU@aUK@mImJUIkVUVUakbWwka@UWKkLUamKUXm`Å_UULmaU@@lUV@X\"],encodeOffsets:[[114582,28694]]}},{type:\"Feature\",id:\"4302\",properties:{name:\"株洲市\",cp:[113.5327,27.0319],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@XUnwĖKXXVK@VK@wVaUaUIVwl@kUVWUwVKnb@U°a°LX@XnllL@bJVa@VanbVLUV@al@@UV¯ÅÇ@Ummkw@¯yVwnUVVVUkmWVnKVUa@WXkVKn@lUVUVVVXIlV°VnI@VlKnV@mwVm@LXKWkU¥wWw@k@mX@KX¯V@VUVa@VnKWkV@VUkm@aWa@wkUWwkmV£VÿXUVL@mVIXaò@nW@aU@@am@aUUUmXmWUk@nUW@_maVmwUkamaUL@awW@akI@UxUm@kmKUklU@bzVm¯xUVU@XVxm`kÈlxXVW@¦kVUn@xxKUwÅKVXUJWnXmVUxWL¦XmmKbmUUwW@UV@k@VLnlbLm`@¦VVkX@`WIUxVnlbWVbXIVlI@l¦Ç@UKmbkW@UbUVUl@n@VmLXb@JWbUnkbVxUJUxWXXlWL@V@V@XXJWxzUVVVVKnXW`@bkIUlnLVJUbUIWVXlWV@XklVbnn@xl\"],encodeOffsets:[[115774,28587]]}},{type:\"Feature\",id:\"4308\",properties:{name:\"张家界市\",cp:[110.5115,29.328],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@@InWVw°w@@blUKlUlVU@VUUUlW@aöUlUlLÞ@@aVKXwlK@UX@@UlwkVkUm@m@ÅV@akwVaUkUUlUL¯w@UUm@UkKlw±UULVn@l_XyWwÅ@VUUmJUXU@@mmU@kxW@UaUIWbU@@mU@UxnUbmKkWJkUVal@aUkUxlW_@WUIU@bkKWUJVnUbbWblU@nl@XnVmV@nmWV@LXl@XJXVmzkJUXmKULm°Vb@xnVmnUk@VnnlUb@nm¼m@ÛÇVl@Xmnm²mL@xK@LUl@nULÆx@V@VXVWbXXl@nLlm@bVKXWL°bnU@VaVU@mVwJnwVK°zn@VVba@Ċ¼\"],encodeOffsets:[[113288,30471]]}},{type:\"Feature\",id:\"4313\",properties:{name:\"娄底市\",cp:[111.6431,27.7185],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@lLnJ@xln@bnlV@JLVUVnVlw@U@VaxVK@abnUmÇnV@km@I@VUVVXVaX@@wlVVUkW@_mKXU°UbVLnaV@V@IUKV@XlVL@w@K@_n@lWlnnJV_XK@l°nU@WVU@kV@nbVKVl@nLlLXU@lmkw@nW@UKVa¯IVn@@aVUUKl@nXVKVn²aXblKnLlmVI@KUU@akLUaVaUXm@a@wVUVKnLnWlXln@@U@anUVm@UInm@IUK@UmKVmU_kVUwm@@VmLK@VLaUaVUUUmK¥ULkVWaXwWa@UXImWUaULUUWKk@WnXbWVWnk@UV@bU@@bJ@bV@XkmbUU`VbkaWz@klU@b@VwUL@bV@U`ULVL@VUK@Xm@XWWIUbUxm@@lkkÇwVÛÇW@¯ÅUJ@xIx@@VULmKUnUxmKULUUm@@ULUJkIWJ@b@LJUWkJWnUV@nnÜ_nJxU@VbnUxlkb@l@\"],encodeOffsets:[[113682,28699]]}},{type:\"Feature\",id:\"4303\",properties:{name:\"湘潭市\",cp:[112.5439,27.7075],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@Æ`n_VWnLVblKXL@VlbXxlaVbUVlUVJnInJ@VL@bUVVb@lnbn@lLVank@W@UlIVan@VanK@kVwlW@aX@Vn@bUJVna@KIX@@VV@nVÈl@VJn@VVLK@UVm@UnIVm@UV@@blUUaV@XKV@XW@XxÆ±bVxLUa@UKWk@wmmUalk@WXUWkXUVJVaUImKVklJ@aX_mWULUUVUyXwWI@W@U@UXKWkXWVwU@±_U»ÝKUaLVbkJkWmXk@UVVmIUVJ@UU@UamLmwUVU@mnJ@VUnmV@b@Vm@kkWmXmKULUV@x@bWnVUbVblK@bVV@LUJknmKkLWa±bUmULmWk@VLUV@bm@U°JUbVLX@@mlxkn@WVKkmK@k\"],encodeOffsets:[[114683,28576]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/jiang_su_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"3209\",properties:{name:\"盐城市\",cp:[120.2234,33.5577],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@n@°ĀÞ°@¦ULWKkx@bkLWb@lUlVXXJVbnUKmxXV@bm@@XLÞÜ¦XlVnmzVJ@n@²ÞôkÆÞaȰĉwnǉÜóéVÛnĊīČǉĉ@ō@KÞUlU@kklÇÈÑÑlġXɛ@UġaU@U_W@n@kaUL@VW@kKmkUV@bkbWW@bkzma@JWI@KUKUL@U¦`@XUJU@KmXw¯KXkmy@aUIWJXXmV@K¯UU@@bVL@¤VLXbV@@JVXVK@JVn@bkKmakVVXUVVVlI@`U@nzVVb@¤n@@UlKXLVVI@V@nV@V@ÈUx@óVōkÅWó@mU@bk@Ýwk@WbXxm@@J@zV@kVbVnLWVUXWUXUWLU@Wl°z@VkxU@UVWIxWJkbĬnW@@bUl\"],\nencodeOffsets:[[122344,34504]]}},{type:\"Feature\",id:\"3203\",properties:{name:\"徐州市\",cp:[117.5208,34.3268],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@XKVX@WnIVx@K°Lnll@@I°KnVaU°x²mlx@VanU@ak@akmV@@w@Ua@aUwVwUw@w@UK@£kaĉlóIÇVk±@@kUKmVkIkxW@Ua¯UUm@UVI@WVIJV@@Um@UanaU@mI@J@XV@XaVlkXVaUUWLUyVIXmWak@XkJókJUL@KWkk@ULU@WalUIkJmImkVbV@lV°kXUKWKULUmb@VUlVnb@VV@IVKUUmU@ak@@bmV@xklUU@UKmV@nJVbkXKUamLUJ¯UUVmIbVVLl`@LLU`m@kXUVU@VlxUK@xkIWbUKx@VkVVnb¯@@U@xkmbkLÇKb@@XnJ@LmVkl@@XlUVkxakVVb@bVnUbU@@xVUVb@nIĊ`XVVôJ_K@xlU²KlkU@VaVVÈm@kVUVmnamUUaVXIVJ@ç@¥nkVLn@@XVK@VUX@JVUV@UnVJVLUJVLUVlnIbKnU@m°VanI@anVKVLanlKblKÞk@¦@¤@VKnLVKLKVzlWLX@VmV@VbnU°@UalkWXLVUKWkUUW@£Wa\"],encodeOffsets:[[121005,35213]]}},{type:\"Feature\",id:\"3206\",properties:{name:\"南通市\",cp:[121.1023,32.1625],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@VJ@bnzWl°LxnW@LVVI@W_V¥@VKVL@LXJI@nbly@aXXla@aVUnllLX@@UVKlb@@mXV`V@bĢlkČÇÆȘ¯wnĕVĉVÿUƒUĠŦğlXÑVǵ@±ōLʵĖ¯lÇbÝÞ¯xk@Çkķén¯@ğġƴǫ@kVVlUbL@xULÇóLUl¤@nkVV°VLkxVb@laUXUKWĖklVX@¤UUkb\"],encodeOffsets:[[123087,33385]]}},{type:\"Feature\",id:\"3208\",properties:{name:\"淮安市\",cp:[118.927,33.4039],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@nźUôÒɴèl¦nĖVkbmX@xVlVL@xUb@bUJVnUxlKVLÈxmzXV@lW@XVb@bÈVxnbVIXa°LaÆVVaXUlK@aXIÆVlXKVUlIXalK@alwXLVK@¥Ý¯¯ÿ@mVk@aX@mīlaXIwXJVUV@lw@U¯ybUaUġUÅaUKVknaġm@kUm@wÆIV±nLÆwÇnUUk@ƅÝU¯JÝI¯¦Ul@b@@VVL@l@LLÅmL@b@UaVaUWmLUKV¹KLWKX¥WI@mXk@UmaUVUU@VmL@WbkIUWUmVóIkbmm@UbVLUxmJkU@bkJWbnXU`WzKUÞÈlVbLmx@kè@Æ\"],encodeOffsets:[[121062,33975]]}},{type:\"Feature\",id:\"3205\",properties:{name:\"苏州市\",cp:[120.6519,31.3989],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@ôèĊVnX°¤²lxƒÈÜ@²x@J@b@X`nIUÆUUV@bl@VVnL@L@xJ@X@blJXnW@@`XbWkV@UbVxXUxkV@LóxVbUVW²VJĸklUǬ@ĢƳĠ°@mƒī°»ÈÇ¥ULUU±a@bU@¯U@KnImUVWUkmXUVU@lIVaUUVWKUbUkWKU¥n£WakJUkULK¯LKkVIn@VaUVUUUkVk@U@amUkJ@UUlwX¥W@@UkVmk@JUakL@kk¯ÝmJUn@nmVXlmbVVkn@UJ@±WUxV¯a¯KōbÅ¼ÇxUxUUlWL\"],encodeOffsets:[[122794,31917]]}},{type:\"Feature\",id:\"3213\",properties:{name:\"宿迁市\",cp:[118.5535,33.7775],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@XbWnUJVzXKVVUbWklUWbU@@W@IJ@nVmbVbn@@V@UIUJ@XUJ@VVn°VVbX@lwlJnUVL@l²@lÈUôJĊklb@¤VL@@xVxUxVx@bVb@@xU@lnmnXmXLVmV@X@lxVnVJôLLXax@b@@KVL@bn@@m@@alLUUVaU¥nIV±I@mXI@aWWXU@LlUXWW_XWmaUwÇ@aaWUX@@kWUynÇwUKkLVwUmVI@aVa@wUKUk@wWnlaUmĕk¥ɳçóÑŹVmmzkVmm@a@Iók@@LWU@`WbXLWlkImJVn@`nXVbXmL@Vn@l@nUVl°Xx°U@LVĠ@z°@¦UV@Xn@VJmV\"],encodeOffsets:[[121005,34560]]}},{type:\"Feature\",id:\"3207\",properties:{name:\"连云港市\",cp:[119.1248,34.552],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@@lzXxmÆV@@¦@l`XnlKXXmKnLlab@xmbm@kL@V@Vl@@VUXJXmb@@°Æ@èÈzlW°XĢJlÈ`lInbWV_@m@UUķnôw°ÆmnaVVÛVmĸ»Ģw±Ý@@mUInyUmWkÛ¥ÝK@Wn@@aWUnwVLmUaWIUWVk@kkJUVWLUkÅWJ@bkLWVUbÅUb¯KWbUJWXX`WXkV@KWVXX@bWJ@nJU²mJV¦UbVVkK@b@@nm@@aUK@L@@awWbKóKUIUmkwW@U@UnWKnmWn@bl@bmVUb@kw±n¯wVUb\"],encodeOffsets:[[121253,35264]]}},{type:\"Feature\",id:\"3210\",properties:{name:\"扬州市\",cp:[119.4653,32.8162],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@VUXblVVVb@xV@kzV@lwVLUbVV@VU@VbUblb@nkĶ°IÞV@ƆVlmVÈÅxmKU²ÅJ@xVn@lĢnmbUlVLÆbĢVVbVaXk@VXKVVWXVWXUmKUaWaU@¥@£XWUUV@@ynam_VWkUVUna@ÆV@mnkWmXkWUW@k@@akkllWUI@UnKl¥I@VVma@a@I@U@a@anK@UmK@ÅVUnJlkI@aVwka@mVIUW@UWL@WÅbmIULkaUWUxkLUKWlXL@VImÅVUmĉLUól¯I±l@ÒUbVbUVVXUJUnVV@lnbl@\"],encodeOffsets:[[121928,33244]]}},{type:\"Feature\",id:\"3201\",properties:{name:\"南京市\",cp:[118.8062,31.9208],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@k@ma@kUUVmVIUWVUUaVa@Ñ²k°Jôk@Wmk¯KmX¯aUakKWU@XULXaV@@mUaVUUl@VmkaUXm@WUUna°IlmVmIUW@Uk@@aV@VVX@VI°»nmU@VKVan@m»UaU@U_@WlIUaaVaUala@¯n@kaUkUUWKU@mwkUUmmL@K@LmUUVKVÅImUJVkVVLèVLVU@WLV@nVÜULVUL@bW@XbWbkJUUVUxVXmVk@WUUkVmIV@nbnVWbJUkUULa@Jma@XkK@VVL@L@JLUVU@V¼nXlbm@kbUKmn@lVb@VXXVUV@b@LVbÆxXbl@@lV@UVV@XVK²VlI`UbVbUlVVn@WXn@@VUV@@KmbVLXÒLkKV@nX@VVUV@bnVllbmnbIWVXU@`lLlknVnmlLlbUmVInK°nUU@l@VU@Vn@@alI`VIXaVaVa\"],encodeOffsets:[[121928,33244]]}},{type:\"Feature\",id:\"3212\",properties:{name:\"泰州市\",cp:[120.0586,32.5525],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@lUU@@y@In@WwXal@Þxl@@anVô@ÆXlŎôU@Vw@ÇUU@@m@UJUUWKkL@Vm@@£aUUmyV@@_kJUUVUUWlUnblL@aUmI@ULUW@IU@WaUK@£UK@aV@°V@LnUWWXIlaVV@£UWlkXĕVLVWb@kUalwUKU¯lU@mk£VôKÈVK@wKVaUkķlUI±ğ¥ÝUŹ¯ôm¦ĸ@XXK@VVXUJ@nlbUx@blJkmIUV@ÆnL@VmL@b@b@V@J@bnbU@UJk¦mL@VVJkXkll@b@@lXXVWlXnml@nÅU@mbUVlVUXn`mb@zU@VVWX@¤¦V@Xb\"],encodeOffsets:[[122592,34015]]}},{type:\"Feature\",id:\"3202\",properties:{name:\"无锡市\",cp:[120.3442,31.5527],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@nLÒlxUVkLam@kVWUULUxVVVbUV@bVLUnnźÞVĠ¦XVUUaôw@KlUVwWUwVa@lUXWa@_X@WmkI@a@WI@w@KmKUUk@@aVUVVÅmJ_@W@a@I±wÛ@ƑÇkw±¯£mWĉUóçK¯VkUWK@XkV¯UWabmUaUUblln@b@xbXWX`@VxUblL@bn@Vb@`m@XbWnn@l¤n@xnVlUVLÆWkV@VbÞJ_nl@nKVU@aUU@mVk°WVLUV¯bVXbXlVn@VmL@xV@bl@nW@X@VVJ@²VJVU\"],encodeOffsets:[[123064,32513]]}},{type:\"Feature\",id:\"3204\",properties:{name:\"常州市\",cp:[119.4543,31.5582],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@LnxUbVVL@xnnWnn@VVXn@yImx°La¥n@VkKVwW@nXVJ@b@UVn@UnUV@Lb@`VLklVÞnÆ@VaXLlÈJmmVUK@aVUUaUUVwVKXVlUn@blKVUkwÑmKUVUI@±UI@U@WmX@k@aU@wnK@UUmWkaWU°aVUUK¯XUl@nVV@bUVmLk@m`ÝIUaU@lÅXUKkVmU@wmk£m@XmWan@@_Uam@@akKVaUw@W_XWa@w@akmm@mL@UJmnUK@@XnJWLkKUb@VxkWLaWVUImVULUK@L@lkLVVVllbm@@°kbVbUbbVbkJ@XV`V@Vbn¼\"],encodeOffsets:[[122097,32389]]}},{type:\"Feature\",id:\"3211\",properties:{name:\"镇江市\",cp:[119.4763,31.9702],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@VĊKnVÆUnJ@UWKXkVLlKVwXVlbVKnJÆaķn¥°óÇIkWKUbÅ@mUÝlkUK@_a@KVUVm@mVU@@aUIW@mXUxLUlm@¦bK¯nwJzm@UW@UmmXmm@wKUUVamwKm@UbUL@Vmn¯¼JUW@UUU@@bl@@VVXJnnUk¯JmbVVXn@VWlbUnk@VVUVb@nU@WbKWV@XVlLVb°bnW°Lnl@X\"],encodeOffsets:[[122097,32997]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/jiang_xi_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"3607\",properties:{name:\"赣州市\",cp:[115.2795,25.8124],childNum:18},geometry:{type:\"Polygon\",coordinates:[\"@@`l@Èbln@KVLl@V@bÈlnKXkVlVL@lJnb¦VKVVnXW@w°@VUmlnUV`UbVUV@xnKVI°KXKVkVL@al@XaLVlULWVVVL@bx@VXVmb@x@VVV@nn¤lb°b°KXXWbX`lbXxz@x`VIVUnKLxWXLVKVbVLVU@wnW°b@nalXmXVJn@U²mKkVlU@@xlnaVmlKn@JVLlnVl@XXÆèVlUX@xVLXVb°W@wnUWmXk@KLVwUmUkUKUw@wVaVK@k@WnkUKWkwlmXL@KVUlLVKXmWUL@aL@malaVk@aaanX@VVUblbJnXaVwn£K@UWmUk@UaWIV@bJW@KmmU@aUUUkmKkVKlUUnKVUlVaV£Å¥WUUK@UkUUw@m@mIkUUWLK¯Uw°¯@wUKUbKm@kkKUL@UUKV¥U@manw@k@U@Wm@@U@WwkmwWaUU@UUmV¯kw@@kmkKkUW@UK@ÅV@XWWkXa@Ul@Va@KVaUUU@aXwla@UkVWaXk@K@lmkUmV@Vmbk@»XI¥VUkVUVU@anKVUKUalU@wX@@a@K@ÝwL@UnÇlUIkJmn@bVVb@VmnkLV¯U@±lIWm@kaUI@aÇU@K@KUIkbWbJUIUyX¯UbU@méUUmUkWKxWIkJm@V¥U_UJUwmVkUU@@knwm@UmkWJkL@n@VW@@U@knm@kUml@xÅx@@XUJlb@VXJVxn@lbV@lULnV@VlnV@bWV@bXL@lVLVbV@blLn@VlK@xln@bX@laLVbnKUVVbKlXVVkxV@nnVUblV@@z°WWkbIkWL@LUJ@bUI@b`@UmI@mkK¯XWmUV¯@UUVUUam@@VULWUJIm`IUJKUkW@UxnWbnnmlXbmIUVmV@Vnb@VLUKWLnÒVVV@VUL@kJUV@bÈ@V°@XVV@l@xUz\"],encodeOffsets:[[116753,26596]]}},{type:\"Feature\",id:\"3608\",properties:{name:\"吉安市\",cp:[114.884,26.9659],childNum:12},geometry:{type:\"Polygon\",coordinates:[\"@@lxnb@V@bV@ln@nlIn@blVXKnk¼@VUKWL@bL@`UXU`@V¦XLĠ@lJ¦@nV@l°nn@mVXna@nbKn@lIV@VanJ@_lKVVnL@LK@Vn@VbUVanKlLnbnJVbnWVnVVanI@Vb@LbVKVanXVbVJVU@aXLllbôlÆ¼XxVLVK@Xn@xnVVVmb@LnVVKVXV@@mnaVXUVnVK@_UaUmwnKV_anKVL»K@¯ÝU@U@kWlUnlknKVnaUkma@UIUwl»Åw@VwV@nn@ÈXlKVmna@kVw@anm@n_WWk@mUkUK@ImkLUnbkm@wV@klUnLV±m@UInWkWmb@¯amX@xUVUKUaULWKXwKmLUVUJ_@wyWwkaW_XaWW¯L¯akam£@mUU@U@wnaWU@Uw@aUKUXUVKUkKWbk@@bUKUlWL¯LUJmLwU@UVaVU_VkmnUV¯@@xXmWUUUL¥makI@UKUkWlLkmÇ@aUk@UKL@kmÇak@_VlkL@`lbnlLVanLnbmVÆln@kJlbknmKUbÝmmwULUK@bkLWKULUUma@Kk@UV@L@llbVzxUxnl@bVLm@IVJXVlLV`@bn²@J@V@Xmbñ@WbUJ@bm@@LUĬU¦lV@xXb@blnUV\"],encodeOffsets:[[116652,27608]]}},{type:\"Feature\",id:\"3611\",properties:{name:\"上饶市\",cp:[117.8613,28.7292],childNum:12},geometry:{type:\"Polygon\",coordinates:[\"@@@VI°`nm¤²@bVJUVVXUl@Vmb@xV@XbmVV@lkLmbn`VbnU@VaUnbVllUXVa@w°VW@_VWLnVlbLVbnlKnVK@IUW@_@am@ÑUólK@U@WU@VwU@UI@aUUaX@kwmJV@yX@kan@mkwVmmI@aUU@aUUW@kVkV@@anK»XVWnIVUl`@_W@wlUV@UWKnUbn°InJlUV@VnIbWn@VklL@l@Vn²m@U`kI@bWJnV@°VXnJmXVmx@VVL@bkLmWULUmU@bWXb@llnX@xkxVVnVV@¤nLnVxnJVXX@bn`VIb@blmlLnaV@blWXnlUnbl@KVanUVmm_XK@kWWnaU@UnaWUXaXamUkKmXUWLX¯WakKmnUWwXa@KW_aXWW_@WnIVl@XULnWVknK@ImyUUÆbXKÛ@W@IÆUnVÝlkVK@mUIVwkUVaUm@aVIVyXIaÈwmmk@UnanVUmÅaó»lwW@kkUVmUK@WKLUmWULkamKLk@Wa@wk@UU@U@mbUIWVKUXWmkUmVmU@LkakKw@w@U¯UUn¯l@bmn@xkJWxkL@VkI@mkmJUI@V@b@VVxnbWlkÈkVLbkKmVL@V@²nxWkLUL@xlKVxbXmVnWJ@Þ°@nxUKUw±`UImVmnU@kalm@akwU@UUJmxU@@U@kU@Um@@KnVm@kKmkU@@WUnkLWxkVUwmKmLkUbmKUbV@xUnkJ@n±UxVXUWJ@LUblUnm@W@nknUJUVm@kXllknVbÆKVVb¼V@Ul\"],encodeOffsets:[[119194,29751]]}},{type:\"Feature\",id:\"3604\",properties:{name:\"九江市\",cp:[115.4224,29.3774],childNum:12},geometry:{type:\"Polygon\",coordinates:[\"@@WUkVUkmaVUb@mVUam_nalK@kUnUWaU@@wna@UVkUWVUUI@a±n£m¯_JU@ĉ¦Ul@UVKmmLlm@ğ¹m`Uk¯@@UVK¯@UUK@amkmKkVVUa@UkUKUaL@VVXUJ@n@WUbnVb¯V@LÅlÝIJÅkÝm@UaWUU@UmUXmmwVUUKWUX±mUam@kWzUaVmÇw@aÅLmKXUWKkL@W¯IwVwlkUJ@Um@ÛÈWKUxWkaUU@KkLVl@UKUX±KUb@nVVUbUVmaUlUL@aUL@@nUlWzX`@V@lx²@Vlb@bVÞ@°nl@UxVL@lUbVV@n²xVUVmnUÞbaJ@IV°xnbl@nbÆ@VwnK@VnXlK°xnUlVXV@Vl@L@lk@W_XK@KkWxUL@JnVx@aX@VVUaIXlmL@bVVX@VbnKa²XVWk°a@UnV¤nbmLmW@XbmJUbVLaÞKL@K@U@aVKlbV@nXlJxV@VnVÈÞKôbźĕČmV@Ċ²xÆIV@Þ¦ĸ¼ÞVlVÞnxln°JkLXWVUVUVwnJVI@yn@lXlaXmWI@w»ma@UmK@akKkXmW@_kaWakKWk@@K@IWkUa\"],encodeOffsets:[[119487,30319]]}},{type:\"Feature\",id:\"3610\",properties:{name:\"抚州市\",cp:[116.4441,27.4933],childNum:11},geometry:{type:\"Polygon\",coordinates:[\"@@°V°UnÜ@n@lnLlV@bV°LlnLllVzVVXlVV@@L@xX@WlXm@UVL@V@n°kVmVUnKlaXxVbnlU@lVVnaVI@aX@VJ@V@bb@Vb@X@lUL@@VlIVm@wUVanLalVnKnLVxlUXwlKVm@k@Una@mWIXKWUÛVk@a@UVWn@@kl@@WXlW@_Um@UVK@aLnalInWV@@xnI@¥Km@kKmnk@mlI¤laXbVblknV@UKXVlUXa@@Unw@±mU@ak_±a@UJUIVKW_Xa@aWUK@mmUVa@IXa@UWmannlmX¯WKXwVUVw@XUlK@klJXa@kkmm@Uww@¯W¯kw@WmbULaUUU@mVUUWmkUbKmkkK@akU¯¥Ulm@akU@m@KVIVV@KUkUVUkaUWbmIkaVaUU@mWbb@bUlkbb@nK@bKXVWnULkKUV@LWKknlxXVLml@X@lULUb@xVxVLVlVnUxK@LWlXnmV@x¯XaWUUK@wVWUkÅçm`@mn@bUx@lmbUnkLÇWm@mU@Ux@Æxk¼VxVJ@nbVlmbUmLklmkVlX@VV@°Þ\"],encodeOffsets:[[118508,28396]]}},{type:\"Feature\",id:\"3609\",properties:{name:\"宜春市\",cp:[115.0159,28.3228],childNum:10},geometry:{type:\"Polygon\",coordinates:[\"@@@VlbnK@b@JLlUnx±ĀXxÆWX@l@V@@blJ@nX@xUbVVUbVV@bVmnmJ@bmbm@klUbLmb@lVb@xUX@bVVVbV¤@LVVbXlVwLXÜÇn@@VIlVkUxx°J@XlKXLVWnLÆK@bÈxUnVbylXn@VbnW²XVLVVUnxWnnV@VVVXVbn@ÞÆlIÞJÆk@K°UUamVa@UUU»@wV@VkkUKUVW£U@UmW@@aXkVUnVlKVVUUkVmU@kWaUanUVVamIX¥W@@aUaUVW@_mW@UnIVVn@VbVm@bVL@anKVUkWKUXVIkx@nabVKb@nVJ_V@VwVUVVXUlUUaV@X@VblabnKlkVaXa¯@m@UKVUn@WXkW@@w@KU@UWkUUUykkmKk¯KU@akUmK@k@mmÛ¯V¯U@L¼UKmLbU`mLxVnVb@`LmUVUUWmb@nU@UWULmU@KnaUUmUwmJ¯IUJWIkVkaWVUIUlWaUIUVkKmbUIÒlVUnn@VlLUJ@bUX¯@aWVUKUXKUbm@UwKWa@a@VkUWn@Uak@mbXWJXbm@mLaWVk@wL@WmanU@knwWmkaWLKWUXaU@¥lUVVVbnw¥nKV»@aUk@a@UJ@kmLma@mbUWnm@ULÇº@LXnmxUm@UbkbW@@akLmWk@UXmJmUkV@VUXVlULmKUxkL@lmXnJ@Xl°Vnb@bU@WbKUX@VmKUX\"],encodeOffsets:[[116652,28666]]}},{type:\"Feature\",id:\"3601\",properties:{name:\"南昌市\",cp:[116.0046,28.6633],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@X@m@VIUW@UKVbLlV@VVbUlUnLnl@bVL@V°UL@V°@Vln_Ġºn@knKnLVU@VkĊ¥Vk@U»UaUÅLUalmkklWn@VUVIlm@mXn@VmkVa@KXIVUWVw²@m@U@VK@k@WUa@a@aU@IUW@@bUJmbUU@kkVmUaWwkbmLUVUnlWbUbklmLakbUaW@U@VbkVWVUUUVUx@U`UI@maULamb@lwJWUVXLlUVmL@bUK@aUnUam@UUmJ@VnX@`UXVVb@bX@W¦nJUbUmVVbXb@lVUnVlVUUkLmUUVWl@bX@VnV@X¤VUVLllUU@@x¼VV@V\"],encodeOffsets:[[118249,29700]]}},{type:\"Feature\",id:\"3602\",properties:{name:\"景德镇市\",cp:[117.334,29.3225],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@VVX@VbmzxUlU@mbmL@V²xVbUVVblbX@VkVykValKVI@bn@n`lVWnX@lL@WKnVIVa@¯nK@alIXJVIVWUwn@nUnK@alI@a@anKm_aW@UWmIUwmmK@£UUmUUlwwW@km@kWaXaV@VnVKnXlK@aUK@UnwWUnmIUW@¯mUXI@alJV_n@m±@U@kkKUlm@XamJ@UVUkmI¯JmamVXL@VUkV@xX@`k_UVmJUXW¼mL@bU@UllX@VV@bVV@bnJUnlx@nmb@lW@zUnIlx@WbVV@bVJV@UxV@@X@VkLVôÒn@@b@`VX@J\"],encodeOffsets:[[119903,30409]]}},{type:\"Feature\",id:\"3603\",properties:{name:\"萍乡市\",cp:[113.9282,27.4823],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@VWnL@UVWLXaV@@ama¯Uk@WmInW@klKVwnLVKUkVW@UlUnVnIVWl@nXlK@bX@laVan@VnwWm@KÈ¹VK¯m@kmU@¥kIğ@WKU¥@V_VW@_K@aXKVL@Ul»mWLkU@amkJm@kmU@@a@UmakwU@Xl@VXk`UIW¼kWWX@@lxV¦XlW@Ubn@mUkL@UmJ¯UkUWVUaUlm@UXWlnUJ@LmLUnXll@bUVUUmVUn@¦xlnn@VÆÈU°kbVVxllnL@VnVVUl@VanL\"],encodeOffsets:[[116652,28666]]}},{type:\"Feature\",id:\"3606\",properties:{name:\"鹰潭市\",cp:[117.0813,28.2349],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@@XV@nlL@lUnm@Ln@@VlV@@VV@nwVI@VVlx@bknlbV@nmnUVJ_²VxVLw@m¯@ÝXImnUWaUwkL@wVKlKXmw@±@UKnUlLaKlUlÇXkmaUw@U@a@UUkwUJ@zWJw@WbkVWUL@VmUklUaWakb£kJ@nmlnlL@nL@¦mJ@wU@mXkJmbK@bUL@VVn@`kXW@Xk@@lm@UX@V@blÜUXVWLXJ@nmb@V@l\"],encodeOffsets:[[119599,29025]]}},{type:\"Feature\",id:\"3605\",properties:{name:\"新余市\",cp:[114.95,27.8174],childNum:2},geometry:{type:\"Polygon\",coordinates:[\"@@m@@WULUKWwÅ»ókakkWK@bUVUIUamWUbULa@KUa@mJUbmUXUmUamImakKmLUbVUam@@UL@KKmUUkL@`mIUb@U@V@bVl@b¼UmL¦mxUaUUVk@¦VWbXVLXKlbXnmx@lmVnb@XKxl@XUbnKn@WaXIWnal@Vb@XmlV@U@bXbLVxn@VaLVWVLXUb°@VW@aVIkK@UmVmkUÑVJnalLVUVJXbVkVJXUlblUXJVI°JnI\"],encodeOffsets:[[118182,28542]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/ji_lin_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"2224\",properties:{name:\"延边朝鲜族自治州\",cp:[129.397,43.2587],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@Wxĵm@ó¤VX@@xÜ¼ƨ²xWxVV@XVbWXllaÞU°Ċ@ô¼LôÝWanV¥Ñnĉ°¥ÅX¥°¯@w°w@»°k£°mÈŹmÈbÆŎ¦K°z@kxl¦UbU¤klVKŤÞȰ@@bV@nVVUlÞ¦lUllVlU°ÑU¯V°wbXxl@V²@nô¼ó°kmVk²ĕw@wVÞÞ@@Ġö»¯@bnb°mÞ¯°V°ÈJmX¥mamUÅUlaU¯@wKkl±n@@wkÝVUUl±¯I¯bal@kLmakb@ġŹé°Þb°ékLmwXaÅb@bVlbVbÒVbUbUUanwakbVUVak¯ULmxV°UxnôŻX@JXklbkbĉabWU@kWUU¯@@klm@@Å@awWXlKkI@WbUaVIUanU@ĕ¯KmUnWUwm@£ċèkUmbUmm@@nkJUalwk@@nmWUan_óaWmnw±KIwl@UmI@an@@mlUÅmV_KUk@U`@_KUmU@U¯mmb¯@kbImV¯LkbKÛ@ÇnɱJóaÝĢkb@xÒÇll@²VÆUVVUÇ°XóxlV¯lV@bV@nx@¤@șŎnxV¼knJnKX°¦UlnVbUbÆVnÞWVX¦llb@l°VJôÒnLVbbX\"],encodeOffsets:[[131086,44798]]}},{type:\"Feature\",id:\"2202\",properties:{name:\"吉林市\",cp:[126.8372,43.6047],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@ôlzaÈV°K@mLWlnVxUVÈ@ÝĬUÈnôLa²VmĀkV@ĠĊnU@bV@b@nl°UVnÞaôJ@bV¦mlkbmVXx¯@VxmnbbÈKV@bÈLwĠyônmnbÜ@nnVx@n²KJ@kal@nxÞULź±Vwkw¯LWWUkŎīVww°yVĕ°wÈVlkÛ»@wW@Uô£@nĶXwWaUamKóÑUI¯@kakkW¥XUmÝÅUVaUamVk¥W¯LmIlmU»mwȚō@£kJUÇk@am¯y¯UVwa@wġx¦K¯X°Ċ¯¦U°ċWULÅa±b¯@UkÅWmVkIUlóċ¹`óIlXWXxmbULÝbƧ@x¯bÈl@x¯zaÝ¤@nmVWb²bmn¯J¯Ò@n\"],encodeOffsets:[[128701,44303]]}},{type:\"Feature\",id:\"2208\",properties:{name:\"白城市\",cp:[123.0029,45.2637],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@óǩŁ@WlwUaƑwÛÅÇéĉamKōÇ@IôġVȁÑŹçÝUƧċĉwóóÝ@Ƒ»ğL¯ll²@ƆÅV@¦mÅb@nmlU²VxlUn@VbnWbÇbkÒn@èlnlUÒ°Lx@¼ĉb@ÒUċxÅènLVxÒbÅJ±a@_ÅJÅnVbKlnUÜĊ@UxXVÆnmVJÞ¯VĠwXw°xWLxKV¦ôUwVÝǬóÞÞ¼ÞkVôȘxÞUlVn¦ÞĊa°wb°@bÆwlŤL²`z°@V@@nJVnl@@¥nUmmn@mwnmmUnk@mlwUaLnwn¯°anWakIÇmXwÆamUXUlJXaUUklKUknmÞV@K@VWÞ@VkUwV\"],encodeOffsets:[[127350,46553]]}},{type:\"Feature\",id:\"2207\",properties:{name:\"松原市\",cp:[124.0906,44.7198],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@źèȂÒUóĢ@JŎÈLnĊbÈêÜÆƒxVbkx@XǪłôkÞ`Wb@n°abKnVw°`_X`W¦ĊIkmVakwKx°UÞbU@ll@°¦VWaÞbxÞI@mVI@VkÅUWK¥nLa@@È@°Æ@nU@KÞalkUwVékUWwkUVkkJk¯@»ókV¯ÆÇI@bĉô¯@ķw¯nmmÅL¯wVUÞy@UówÇLkmm@@UóxkkĉmL¯wVwkWWXmLõm@kÅ±V_ô»ÛÆ¯@VaVaĠVlmğwķUóÝƽ£ÇJkbǫaƽLW@nxÝ¤kzy¯XɅm@VôÇX¯Ė¯ºÝnUnLVlUÔmV\"],encodeOffsets:[[126068,45580]]}},{type:\"Feature\",id:\"2201\",properties:{name:\"长春市\",cp:[125.8154,44.2584],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@U°xÆKnn°mĸx°@Ċó@aÈJ°ÅUôl@¼l°IllUlVXxlVUêVxkllnÈUVll@Vx²IÞ¤VUlVnIôlÞlwô_bVaĶLXÅÞÇ@K¯@wÛaçn¥¯WXyW¯XwUmmÛ@manómğzxÇK@aUÇLamanUw°@WwnUalnk¥U@aóIÝbUm¯Vmk@@aU@amVğĉ@lUnÿ±UbóKmVÇÞī@ÇVUUwmXkKn@L¯ÇUbyókōè@bn@lÝX@x¯ô@ÆUV_maXm@aóJWxnX@VVnĖVnUJ@nōÆÇ¼V¼kxLklÝw@xx@zV`ÅbmxU±xUnnmknğUbUUb@Å°Üó¼U`Æ²@lönKnXWlXUx°xnKĊllôw@Vn@lnÈKôx@VÝzV\"],encodeOffsets:[[128262,45940]]}},{type:\"Feature\",id:\"2206\",properties:{name:\"白山市\",cp:[127.2217,42.0941],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@Ul¦kÒÆ°IlÒU¤ôz¼lJUnÆXVl°@²aÆbVKČXV¯°¥¯ĉ°WL¥Ģw@xbUx°V°znb@ÈlVlI@w@mU@akU°kUôwWÈ¯VUVUÅ±U@kÈkÑw@laÞġUÞ£@ƅKnÑĢ¯@WaUaVUVkkw@a¯@¯ÝVXnW@@WkXmK@xkKUb@bW@Uw¯mmb@WKUbmUbUaWbJĉIVW@Il±LkmUbUm@nkKWa¯n@`UbmaĉL@bÆ@W`L@n¯Xb@kb@xL@VkL±mlUIU¥mL@lÅx@_la@UaV@kmmK£LmKUnÅKVbmXVlèĉUUbmlĢÅ¤Il¯bÇ¦l@ô¼Ģ@x°l¤nal@xb\"],encodeOffsets:[[129567,43262]]}},{type:\"Feature\",id:\"2205\",properties:{name:\"通化市\",cp:[125.9583,41.8579],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@ÆlXnĠxĢ°lÈ°K°kXm@¦VbkŤJnÝ¤kVÞVVkÈb°y@wkÇ°awƨ@aÞKVnaWwXWkôJ_ČºôVk»óyV£kÑJÅ¯lÑk¥Va@wkbmk£¯@wġó»@kÈ¥°akJÆ£ġnkVaĊVkçWUnUaÆLVmnLKU±@m@a¯UbmV¯m@_KUaÅWó¹@UanmWak@@wmI@y@mkJVa@UaIkJ@n@Um±kkxmIkbÇm@°bXnV@°ÈmlÞ¼¯XVº¯LmkWWXLmVVlkn@@lnWÆVxbmnm¯lÝaVÈè@¼VbÆ°ÞUVJkxIxIV¤ÒXxmn\"],encodeOffsets:[[128273,43330]]}},{type:\"Feature\",id:\"2203\",properties:{name:\"四平市\",cp:[124.541,43.4894],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@Ɇn°WzlyÞ£mwX@ƾKǬblaÈIƾ¤ôÞĸVĠxnmmV²wVnwÆaU_@yw@wÞxlkKlwU»È»ŎÅ@mVIUmmĕUU@mWXwIô@bWnnbU`V@Å°ó@wÞW@km@aŎç@m°Ñ°Inm±aXaUn@mƑU¦@Ç¯aU£aUġ¦ÅÒJōUŻókUÇ@¥¯ak¯mUVak@@aċçÅaUm¦Ý`XbÆ@n`IxĊÞōÞml@Ub@Wl_¯JkÇUÝÆÅb@nllUb¯±a@WĉJġĀ¯Unóm¤xôaVnxôI@xV@bmÆ@lnLmÞ¯ÞxVb¯þ\"],encodeOffsets:[[126293,45124]]}},{type:\"Feature\",id:\"2204\",properties:{name:\"辽源市\",cp:[125.343,42.7643],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@żôŎVIÆÑĢ¥VbV¤°bÈ@V¥ƒÞ£lÇUUUÝlÞ£mţIlUa@¥nlW¯L¯kÇġ¯ğwWmÅk¯UVUbWlXlmnbUx¯xVVknlUbVÇKUb@VnbmlnzUº±bmJUbWÈnèmÒ@X`WL\"],encodeOffsets:[[127879,44168]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/liao_ning_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"2102\",properties:{name:\"大连市\",cp:[122.2229,39.4409],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@IÞmVk@wXWÜbnwlLnU@nLlbXW@awnbl@XLa@Ċ¥@LULnJ@xVnmV@VXXV@VJkn@VÜKXXôJlbxl@IVbnJVLUbnlnVwJVU@XUaUUlwn@°nVKnV°_VJwl@nwlVIXWlIVVnK@IWmkIVaVU@WÈUlmU@UWUalkXġŻ@kI»mmakUmĉUŁV»²ġVĕ@aUU؍IɃ`ȃ@kw@Umwĉ@WķÑIĉÇbÝLkymbIwÇmÛbmbU¯ÜõÈkÆVbŎxnXVÆnǪ¦b¤UxÝnĉÒmĊVÈ¤ÈbÆ¼ĀÆÆÞźbVVbX°²¤\"],encodeOffsets:[[124786,41102]]}},{type:\"Feature\",id:\"2113\",properties:{name:\"朝阳市\",cp:[120.0696,41.4899],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@na@UVI@mÑWkaV¥UI@wl@aÈbm@wVak@@K@k@a@UUmUUalmU@KÇUÅ±¯@±kUKVkUaaU@¥m@@¯k@WLUmkn@mmIkm@amU@wVmkU@Klk@UmaXIWWULaULVbmk@UUmUk±_Uym@mbkImaX¯WWxWKzU@WkJWwkV@Um@UbVVVVXb@VWX@W@Vkb@VnUK±aUUlwXÇWKknU@mmUkLUVVUUVUawbkKmwnIkJ@nmb`kmVkLWwUm@UUUK@UmaUa@UUaWK@mU¯Wkk¯VmUUxVXUVmL¯ymXkWUbmXUKVknWx¯JVnkLl@VVxnxlĀVL²WlXl@bÝVUn@bnlÜaXblIVl@@È¦@VmbXV@@xVVnUn@`°@VnXU@K@VV@VmbnVn@ln@bx°Ub@bLV`ÅnW@@lUnnWVU@Vbkl@Xl`XxVUblkX@°¦VUVVbUlkV@UbVbkLUxmJkX@bbxVKÆlXXbnnala@Uk@UVVklKVUXKVU°KVan@VUnLKVLWVaU_@mmUXa@mwXwVkVWXkk@k@klm@wXKl@U@KVUUUVaUV@alLxUx@b°°VnnVxlIXJmxLUVlV@bnX@VbaVx@XJ@bn@VVXÈl@llX@lUVô°°@ÞVbn@Vk@VW\"],encodeOffsets:[[123919,43262]]}},{type:\"Feature\",id:\"2106\",properties:{name:\"丹东市\",cp:[124.541,40.4242],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@lzXJU@²x@@V@bUVmKUn°n@lnVKnV@n@VlV°WbXn@VzJ@¦@bkbbUl@bkbJ¯zWULWbklVnb¦VJ@K°Ukl@@WbVn°@Vm²UnX`UÜLXmVXlKVbUVVnUbnX@VUL@lUbWx@²kl`n@Vlb@nUVWVLVU@aV@²bl@ÈmxWXVÈUJVl@laWnXKÈkÈ@Va°bÆm@XV°IVV°UnalVUn@UwVU@@VVJI@bl@XK@wWmXUUVbkJVXnJVI@mknwlKXL@`l@VI@UUaVKÞnaVm@aÇ£XWU@aÇUU@mbkKm£@WWL@@Kk@klUbWKUkUU¯UõÛmUUaVUU@WU_W@kVkJ_WKkV@bUL¯¯±mk¯ġğÑ@UmwKUaka@am¥ÝIUWmk@wmţLKʝbȗKWĢklVbX@VVknÇV@XUVUblJXn@J\"],encodeOffsets:[[126372,40967]]}},{type:\"Feature\",id:\"2112\",properties:{name:\"铁岭市\",cp:[124.2773,42.7423],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@XJm@¯mXUlnVbUJU@bV@UJWL@VXLmJVbkXlJXxVL@b@V@n@b@`Vbk@lxknV@VVV@bUL@bV@@bVK@VXLWLXJ@LV@nbWJ@IUVx@LVJUXVxVx@VV@@LXJWL@VU@@L@VnL@bVVmVX@@VVInJmbnLWVnVULVVU@VVmX@@JVzl@nVVKVXÞ@mk_lmUUWV_nJlUÞÑÞVVUVVLUVJ@IVna@@KV@XwWknwnKlalUwaĉÝwJl_@aUaKUUU@WU@WXUÆ@@UVK@n@UnVVblK@bllb@bbW@Xbl@UlnLl°°b¦nKlVnIV@UWU@WXkw@am@nm@aVw@I@KUaVIm±XÑlknJVnVJaX_VaUaVKmwnkmmn@lU@U@mnaXlKUmUIVmklaUK@UlUVUW@UkVma@UUU@JmUU@@bmbKWV¯XUKm@ka@UVKVk@aUKmLkKUUÝUmbXbÇJ@k@WU_@m@klm@UXKVaUI@KWUXaÇWkaWUkWUL±U@lUU@UJI@V¯JmIm@@aU@Uwa@UV@VkIV¯aUkWkb@bVL@@VVVUXW@Ua@@bÝbUVÝ@LmUkVUbVllLUV@LXWbUXm@U`@kxlnnJlbnIllLXlVlUXmVKnV@L\"],encodeOffsets:[[126720,43572]]}},{type:\"Feature\",id:\"2101\",properties:{name:\"沈阳市\",cp:[123.1238,42.1216],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@ȚĊÜ°bLlÞxUbUn±@ÈnVÆL@xnLlUVbxkImJkn@V±LUxkV@bbKVKnzVl@L°@VaxÞUlbôxVV@@V±bn@llXLöXĶnal@nkVJVI@aU@@aVK@aUUUU@lmkwl@Ua@_@a@m@U@aUKWwkIlWUanIWK@UXKVIU@@aVVIUamVknW°n@WI@KUmULWnkVkUWKkkmJkamIkmlw@V_n@VWXaW@KVUkKUkValUnVK@ÞVUÞa@a@VbX@VWUU@U@UK@ala@IkKmUUa@U@VkkWVwU_@KÜUXbl@V¥XUVmXakÅlUUkIm`UIUJW@UIKmkm@UUJImmU@VUXU`mIUbUK@LJUUl@X@UbJkU@nm@Uam@@aUmLKwmWXUK@kUaÇa@JUIUa@aKVUUXmUy_@lmbkLUKWLX`n@bVL@JXLWX@Vnb@Vm@UbnVmL@V@x@LUbVV@V@LUVl@mb¯U@xU@UVVV@X@VVblJ@bnVKUnx@llnL±¤b@k`VXÆK@kV@¼kl@bWIUl@VmLnbm@@JXXmb\"],encodeOffsets:[[125359,43139]]}},{type:\"Feature\",id:\"2104\",properties:{name:\"抚顺市\",cp:[124.585,41.8579],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@XVl°bUlJ@UVU@bVxV@@bn@nJ°I@UJIVV@V@k²VVKlXXVblÈXWbXV@LVJUbWL@Vkn@l@nV`@X@lÈIWanaÞVVVlLnKVL@bUlUL@Vlbn@VL°WXULna@aV@nV@IVV@VbUnl@VXnKVa@UUnyWkXaaVk@aabnm@_WKXmWanU@alaUl@XJVLVxX@wnKnVlw@V_@a¯¥@UkKWUaUUanK@IaU@WUaVw@klUVyUUVUUÇ@Iôba@mnUma@kXa@UWak@Wal@a@WULmU@U`mIUU`mUk@@UUK±nkJbUam@kwm@@a@UU@Ua@@K@VK@kmKU_UKUUaĉWmkkL@`LnmlkLkbmK@k@Ulmb@b@xUVIUlmVXXxm@JUUk@WUk@akx±@¯x¯UmbKUUVmUU¯UmVVnWkÆlWbUnWVU¦k@WaÛV@LV`UxXllU@@VVbnVlL@J\"],encodeOffsets:[[126754,42992]]}},{type:\"Feature\",id:\"2114\",properties:{name:\"葫芦岛市\",cp:[120.1575,40.578],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@ll°XnV@XLVb@VVbnb@VLVV@VVnXxlKnUl_na@mlImJnxlLaxVbUVVUVUKVlnnV@lmXLÈWkxVV²bVLm@Ula@UX@XW@UWaUUUUVan@V@lUXxlIXV@yXLwXXW°nblJnan@Vz`l²nVVVl@nUaVKbVKnXVaUaVUynXK@kVK@X@m@mLXaLWU¯w@a@UVw¥°ó¯¯y¯UÇ¯»w¯Im¯ÇUUl¯»ţKċÑţķm¯w@mU_ómk¼VnU`±IkbVlnnU¼±Lk`@XWl¦UbmVUxkXVlkbllUVb@bkVmx@XVV@Jb±aULkKWXkWmX¯aUJmIkVm@xU@n\"],encodeOffsets:[[122097,41575]]}},{type:\"Feature\",id:\"2109\",properties:{name:\"阜新市\",cp:[122.0032,42.2699],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@Xnb°lVlnXVJLlVnl@zÆxnK@bblKVLn@@VaVLVK@L@Vl@XVVInVVKVwlUXwlKLVVb@aV@XlUXbVW@nlWnXKV@@V@XUVVLUVV@@bVVV@@ln@VbVUXVIxVanJ@UIVWL@UV@@¤V@nInwWklnIVxlnzUVÇJ¦VVÜLĸUnW@aV_WĊXXaKnkl@nmLa@alUVw²K@UlmnIlJwaVUkmK@wÅKmU@Ç²VmVaÝwkKaÛ¯șĉķ¥ğ¥@kUWkƏīÝ@@akUK@KWIUm¯nU¯JmwUVmIkJÇLm@UImJUU@aW@U@@nUbJabXVWn@UVmX@V@b@l@L@lUb@xnÇabk@@xVJU¦lbXÒ@nUJ@Vmb\"],encodeOffsets:[[123919,43262]]}},{type:\"Feature\",id:\"2107\",properties:{name:\"锦州市\",cp:[121.6626,41.4294],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@nJ@nlmVnXKl@@°n@@¦VbVbUlVL²l°@Æ²ÈV@LVknVbVVnnWVU@XmWUabIVa@mV@X@@bVVnIVJ@nÈKlInJVUnx°IV°mVnXJ@LLlV@b@ÞƐĬXllV@Ġ¦ĸ¦naWW@In@manK@UVkXJ@alk@»lU@ÅLUWl_@a²£Kkm@kwVmULm@akIUa@U@WUUVUaÝ@ğwkmĉ£UW@@bÇL@ma@_mKlXUwKLţÓ@UWw@K@UI@mU@UV¥@°UnJ°@@_KUwW@UnaWUmmI@mķwUaÇLóVĵwÝUUW¯¦Ux@Vb@xV°XKWbK@n@nW@UL@lWLmzUVVbUbmWXXWJbn@Vkl@LlVUn@xnV@bln\"],encodeOffsets:[[123694,42391]]}},{type:\"Feature\",id:\"2103\",properties:{name:\"鞍山市\",cp:[123.0798,40.6055],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@lxĠÞ@bV@@w°Vna@UkV@K@UUUVa@K@w@UnKmUVan@@Uma@UXWWK@IUK@amW_XKVLlKna@kmKVak@VU@VmU@anIÆan@aUVnb@blLV`ÞLlUbnaKn@naVU@¥°IVK@anUUKVaUVak@mJkXUVwkVUUa°U@W@WlkXWlIXUlJlaxIVVXLll@nLV@lLXlKĊz¥maUlkXaVKX°yIla@aVkala@a@¥IUy@WmXa¯kU@U@mmUULkmm@¯VmnLVU@a@U@±w@VWIkymLUUkJWXJkUmxk@xUI¯`mUULm¯m@kxVVbWV@UVIUx@bkVVVxUbVV@V@zJVXUlnk@@lkLlLUU±Jkm@UIUVLUVU@K@UnnV@l@LlaUJ@zn`@nWlIUVUUUV±Ln@nmL@VUVkLVlUxVLVlÅXma@@akLmWUX@JUnVJVkXJ@X@`WXVUVUIlbW@bVUVL@`Un@¦U`@bUV@z@Jm@@XV`LUL¯J@IVKmKÅI@JnWVnLnVxV¤z@bmV@VUV@bUL\"],encodeOffsets:[[125123,42447]]}},{type:\"Feature\",id:\"2105\",properties:{name:\"本溪市\",cp:[124.1455,41.1987],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@lb@VnlnVVUb@VJ@nnJ@bmXUx@xVbkbkWLUxnl@Ul@xWx@nUV@¼UllknkK@bmbnlLVJX@VIVJn_lJVVXUmnU°VVVUnVVLna°V°w²@lwbl@XVl@VVIn@wWWnUVkJVUw@@anaVk@@lnLlalKnkmK@_lKnlĊXVbVVLV`nL@lUL@@L@VbV@@V@bn@lxn@VbalI²mVL@Vl@nV_VVnJV_@nVKV@X@bkXbl@XblylUUk@Xa@UVIlK@UUWVULlm@UUUnKWU@K@UXmXVa@U°KVUUWUk@aUVKkaWkKUknaWa@U@m@mk@aUJk@@_WKkLmxl@nUJmIUWlIUaVWVXn@xWLk@@aJUI@U@UVVxm@UVkmb¯VUU¯JWU@Ån¯aUbÇ@ÇlLmWXkbk@UIÇVUXWwÇnk@±aU@@bUVUKUXmV@kaUm@k_±l@XwVa@kVK@UWmVaUmVUUakLUWWnÛKVW_m±VnU¯@Uma@Xk@l¯V\"],encodeOffsets:[[126552,41839]]}},{type:\"Feature\",id:\"2108\",properties:{name:\"营口市\",cp:[122.4316,40.4297],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@ĊĖÆn¤°Ċ¯ŎWô@xXbwnKl@nX@VUVKmL@VU@UxÝ@VlbxU@VUb@bk`IUlVUnV@@UV@@JnXlK@b@nbÆWUkUKVwUklKVU@UnK@mm²KVUVVVUJXk@mm_@yVIbk@K@kmUm@VLV@VUKVUVJn@l²IVVKklK@kl@kmVUWI@y@UUUVawUUUl@akmmVaUKmIUaJk@wkaóIWWÛL@UlmUIU@WW@UnUUm@wmIVK@Kĉ¦@bWKk@max@bWXkamK@mVkKmxÛaWX@xUlÝnJ\"],encodeOffsets:[[124786,41102]]}},{type:\"Feature\",id:\"2110\",properties:{name:\"辽阳市\",cp:[123.4094,41.1383],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@`VzWnVUVL@bVbVJ@IÈbVb@lVLXWnxLnKVb@n@Vbn@mV@lIVa@@WkVVI@KVLVanJV_VWUV@nnJVIVn@na@alLlmkVk@»VU@mXwwk@@VmkVwXKllaUa@wVwnW@amI@mUI@VaUUkmm@UkaL@UIĉyLWkkKU@mKk@kWKUUJwkbkIWVkJWXkl@X@X¯VVbUVlUxVWlnI@lUbVUbVLmV@bUL¯J@¦UVmbm@LmbakVÝKU_kK@amaVUbm@ÅbmJ@bVUn@UVl@UbnL\"],encodeOffsets:[[125562,42194]]}},{type:\"Feature\",id:\"2111\",properties:{name:\"盘锦市\",cp:[121.9482,41.0449],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@Vbĸx@nnJVnXmb@VXVxL@`¯@mI¯V@U¦@VV@nJ@V@LXx@VŤÔKLVxWknL@`b@nÈK@a@VXĊ¤nVK@aVU@UnU@ayU£UwmmKXUm@IÆJnLUL@J°IVKKU_@Wn@@I@yVU@aV_@¥Vm@_UKUV@aXkaVJVUUXW@_@WWIUlUIVm@IVW@IU@@VU@mUVVkJ_l@aVa@UVwka@UÞVwV@@UnKLVU@UmWk@mLxWa@wóUVUIÇÆĉ¦¯¦¯xʟJ\"],encodeOffsets:[[124392,41822]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/nei_meng_gu_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"1507\",properties:{name:\"呼伦贝尔市\",cp:[120.8057,50.2185],childNum:13},geometry:{type:\"Polygon\",coordinates:[\"@@m@Łkklô@£kJ°ýɅķÑó¤ğLĉÅlÇğŁW¯¯ƥóÿlwkţÈéÝƛó°ÞÅxV¤ĉĖWƒ¯lȭţυ̃ɱÿķƅˋğɱřÝţϙȍƧĊţ@¯kWKUKm¹Å@ķJU@ƧÑƧō¥˹Ɔ@L@ÞVLn@VōČWJX¦@JŻbU@ţÞmVU@ȁýóbkWWLÅ¯UWġkmó±UŹôV¼ƽ¼ł̥ĖƽǬʉxĉŻȗKΕ̛ʵƨʟÞ˹»Ƨţ»Ǖō˷Ȍ±ȚʊĠUɾɜɨmÜ֞߼˸ƅȂ¯ǖKˢğÈÒǔnƾŎŐ@Ċbôô̐¼ƒ@ĊôĊÞĀxĖƧL±U°U°ĬƒČ°ÜêɴȂVł°@nxŎèbÈÞȌ΀Ǹl²IlxĊl²ÒmôĖÈlĵºmÈêVþxɛČʉÇĵVmÒÈɆôƐŰǀĊ°ÆǬĮƾbyĊ@ĠƒXǀċm»ôw°Ûk¥Çm¯çkkÇǫţǕéX_ĶWǖīŎaÆĵĸĊ@ȚȘĊLĢĉVÆĉʊÇĕóaU¥ĉ°mkÅ°ġUĠřk°mÑČÿÛƒWĸ£ʠÆxÈÞŎÞ»ʈ²ĊÇČalÒ°Ť±ĸzĊKÈ²m¤Ŏ@Ò°¼nyȂUźīǖƳÈē°@ÝĶ@Èkl¥ÇçkxkJXÇUÅ@£k»óƿīÛ@lÅJl¥óý@¯ƽġÆÅanċ°é¯¹\"],encodeOffsets:[[128194,51014]]}},{type:\"Feature\",id:\"1529\",properties:{name:\"阿拉善盟\",cp:[102.019,40.1001],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@ƏnǟƨʫŹɆÿ°¯ÆV²ˢżÿ@ÝÆŁȰ¯ȀƳĉó@ğky¹@īwl£Ź¯Ŧé@ÇÇxŋĉƩUUŃōLÇĵóÝnóç@ó@ġƱ¥çWUçÆō@éçťKçȭVһƽ̻aW¥ȁ£ʵǊǓƲɳÞǔlżÞmĠóĬȂɲȮ@ÈĢŮźÔnĶŻǠŎȭгŃċóȭţΗÆƑÞƧÅΫóȘǫɱȁġlÛkÇ°ȁÈnõl¯ôÞɛÝkĢóWĊzÇɼʝ@ÇÈķlUČÅÜķnέƒǓKȮŎŎb°ĢǀŌ@ȼôĬmĠğŰōĖƧbЇƧōx@ķó£Ål±ĀƧīXÝġÆêĉK°Ýʇƅ@ΌʉżÅÒϱʈ@˺ƾ֛।࡬ţશóЈèʞU¤Ґ_޸Ƒʠɽ̦ÝɜL׈ɛϜóȂJϚÈ@ǟͪaÞ»Ȯź\"],encodeOffsets:[[107764,42750]]}},{type:\"Feature\",id:\"1525\",properties:{name:\"锡林郭勒盟\",cp:[115.6421,44.176],childNum:12},geometry:{type:\"Polygon\",coordinates:[\"@@ʶĬĊIȘƨƨ@ĬÛĢșŤĉĬĀóUÈŚÜènŦƐȤȄłϰUƨťƾÑ܆ğɲƜǔÈèʈƲĊƞƒɆ¯̼V˺Ò˺ȂŤVĢêUÜxĀˌ˘ƨÆ°ѢmÞżU¼ÆlŎ@ĊçŎnÈÒͪŎźĸU°lżwUb°°°V£ÞlĠĉĊLÞɆnźÞn¦ĊaȂīġŃ¯Iĉůl»kÇý¥Ŏ¯én£ġÑÝȭxÇ@Åçķ»óƱŎ¥çWÿmlóa£ÇbyVÅČÇV»ÝU¯KĉýǕċţnġ¯»ÇōUm»ğÑwƏbċÇÅċwˋÈÛÿʉÑ°Łkw@óÇ»ĉw¥VÑŹUmW»ğğǉVÿŤÅźī@ř¯ğnõƐ@ÞÅnŁVǉóJwĊÑkĕÝw¯nk¥ŏaó¦ĉV¦Å`ğÑÑÝ@mwn¯m±@óƒÛKˍƏǓ±UÝa¯lōșkèĬÞn@ŤġŰk°ċx@ĉ`Ƨĕ°@ţÒĉwmĉ@na¥ķnÞĉVóÆókĉķ@ÝkƧƧÛa°Ç@ÝÈUóbÝ¼@ÛÒV°@V¼ˋLÞɅŤŹǠVÞȗŤÇĖÅōbȁƜ\"],encodeOffsets:[[113817,44421]]}},{type:\"Feature\",id:\"1506\",properties:{name:\"鄂尔多斯市\",cp:[108.9734,39.2487],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@ĶL²ĬVłƑkkl@ȎŘWńÈĬȗ¯ºlz@ĠĊôŦôÒĠ°kÞÜn@¤UĸèĸbŌÈXĸLlÒĢxɲÆ¤ÈÛƾJÈÝ°UÅĶ»²VW¯ĸJôbkV@ôlbnĊyÈzVôab@ĸÞUl°yǬ²Ǭm°k±lbn°@È»JXVŎÑÆJ@kLÆl²Ġ²ʊůĊġřóƛÞÅ@mmLUÿóĉƧ@»L@`ČĸmȗÑţů±ĉğl¯ĀwÇçƧŤÛI@±ÜĉǓçō°UwôǫůķƳÅ±bÅ£ÓÇwnÑó@ȁƽ@ÇƧĢón»ŏĕóĊ¯bÅVȯÅImōKULǓ±ÝxċŋV±Āȗ°Źl±Û@WÒȁŚŹНŚÅèŌô¼°ȰɞȂVĊ\"],encodeOffsets:[[109542,39983]]}},{type:\"Feature\",id:\"1504\",properties:{name:\"赤峰市\",cp:[118.6743,43.2642],childNum:10},geometry:{type:\"Polygon\",coordinates:[\"@@ɲŁĢǉĊwƾōÞĭ°_ŎŃźȹƒUČÿl»¯ôķVÿǬƽɅġÅÑǫ»̐ʟȣU¯wVWÝÈġW»Þ¹mÝƒɛŎÿŎōͩůV¹ōéċóŹÅVVĢǩʈ@Ėċ@ķÛV°¯xÇÅţ¥»°Ûôĉʟ¥WýČ¥wç»±mnÅķ¥ˋVbUÒġ»ÅxğLƧbWĖÅx¦U°ÝVóŰlô²@¥ÜÞÛôV@²±`¦¯Ý@ÅVÒō¼ô¤V²ŹĬÇĊƑţxç¯Lk»ʟlƽýmłÝÆƏ@mö°Ġ@ŚŹĬţÆUĀĠǊĠX¼nźVUÒ¦ĊxÈ¼@ôlx¯łʊÒÜĀˌÇČxÆČÈƐaxÒĠn¼ŎVÈ¼Ģ°ŤmǖČĊþLV°ÞU¼ċÈUÆzÈa¤ôbknXĀè\"],encodeOffsets:[[122232,46328]]}},{type:\"Feature\",id:\"1508\",properties:{name:\"巴彦淖尔市\",cp:[107.5562,41.3196],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@²@Ζǀݴʶհĸƒ¦Ķ̒Uˌ¼ӾÇƾ¼̨UÞĉƧéÝ»ĕĉƐȍōǪakóó¯a@ôţaV¯Þ¯°@²él¥ĵğťwōxó¯k±Vó@aóbUÇyĉzmkaóU@laóķIX°±Uĵ¼Æ¯VÇÞƽIÇÜÅ£ɱġwkÑķKWŋÇķaķçV@£mÛlÝğ¯Ñťóǿƴȯ°Åł@ÞŻĀˡ±ÅU¯°ɅĀźƧʬmǠƐ\"],encodeOffsets:[[107764,42750]]}},{type:\"Feature\",id:\"1505\",properties:{name:\"通辽市\",cp:[121.4758,43.9673],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@ôƲĸ¼Æè@ÈȮwƾ»ʠĢ¥VÆ@²¥@»ŎÑ¯ĊJŤ£k»ÆÇX¯̼ōī°aX£ôƾȁź¥aôŤĢL°ĸ@Ȯ¼ÈÒʈŚôVXůÆaĠƛÈKķĉôÿ@ğÈĉ»ÇVnĉVwXĠÝ°ČÿĸwV¯¯ǵ±ĉǫÅÅm»²Ż±ƽIm¥ţÈķ@¯ƧJV»ÞUÝç¯UġºU£ţóaÅÅlƧī¯K¯ÞÝğL̑ȍƽ@ōŎōĀƑɜnÞÝºX¼ÇĢÞUX°xVʠȤ̏Ǭ¼ÆÒɆĢǫƾUĀóĸ°k¼ċĀƑVŹȺōń¯`ÝĮƽŎĉxġǊɱłō¦\"],encodeOffsets:[[122097,46379]]}},{type:\"Feature\",id:\"1509\",properties:{name:\"乌兰察布市\",cp:[112.5769,41.77],childNum:11},geometry:{type:\"Polygon\",coordinates:[\"@@ʠǠÞĸɲȺƒÒȂƛŎaÆÈĕȘţUÝźǟɆţÝˌKU»@U¯ÜÑ@Þ»ôaVÞÇÈ@¯ÜbƨƨÞlĸ@ĊôlôÅĊUÝĸm¦bmĊ@nĊxŤÑ@¯ƨĖĊ_@Čwl¯ȭLÝ»ƽ¯ķůǓ@ÇǓbċÅÅÆwÿĠÇU£óa¥¯aŎğĠţkw°»¯ůlÝĵkÇ»Ý°ɱƧǫaóôɱ»Çk¯ŃóʇŐŻĉǊŻĢ¯ÒÈUl°x°nÒĬónĊğ°ÇŚĉ¦ʵV°°ĬÛżÇJȁńʇʹó˂ƽŎÆţ¦\"],encodeOffsets:[[112984,43763]]}},{type:\"Feature\",id:\"1522\",properties:{name:\"兴安盟\",cp:[121.3879,46.1426],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@ÆXnlŎ°@LVLĠþxĊUȮĊnUĠV@żaW¯XIŎġ¥Ý@K@w@K@I˺ŻŎ¦ƨƨÒŎIÆ@X@VºnX°lŎ@ƾĉˤƒȘǷȘÑÝÝÞbVţĸÿŤxÈĖƐêÇKnĸ¥ô@ķÞUnÒl@UÅaīˋ¯ÑƧx@±kXřƐƏÛéVˋ»lō¯ĉÅÇÓǫÞĖġV@ğ»°ĵÇÞǓ¼¯mÛÅŃĉĠÇƾb²çéż¯VğÞml»ōÑVç»V¯¯ĕÆU¯y°k¯¯V»ôÇÑ°a@ŹkġKţóbŹ¦ƽȂóW¤¯bĬ̻ŎW°ÅÈl¼ţ¤ĉI°ōÒ@¼±¦Å@Uġ¦ʟƽ¼ÞĢÒm¤êō°¦Èþlk¼ĊŰ°JĢńȁĬ°żnÇbVÝ¼@¼óĸţ¤@°Ånl\"],encodeOffsets:[[122412,48482]]}},{type:\"Feature\",id:\"1502\",properties:{name:\"包头市\",cp:[110.3467,41.4899],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@źxżĀǔÆǬVȘĀŤ¥ÅƾōôˁʈͳȂŃÈIÜŻ¯ī¯ōm¯ɱĖ¯ķÒÝIÝ»ÅVlÅôÑġğVmÞnnWçkWÜXƝÆwU»Șĕ£ĉÑğ±±ÅkK@lÅIōÒUWIÇ¼¯@mka²l¯ǫnǫ±¯zkÝVķUôl²ô°ŎwŦxĶĠk¦±ê¯@Ý°U°bóŤ@°bôlôǩbŎƏȎĊĖÞ¼êƨÝĊ\"],encodeOffsets:[[112017,43465]]}},{type:\"Feature\",id:\"1501\",\nproperties:{name:\"呼和浩特市\",cp:[111.4124,40.4901],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@ʶUĊ¥ÈřĠ¯ĉômīÑ¯mwk¯ÇV°ÑżġĊǉǓɱţǓƝóX¯ɛÒóa@nÝÆôƜŚĉĢʉŰĊÒ¤ȗĖV¼ÅxWƞÛlXXèmÝmUnĠĢóÒkÆÆUÞ¼ÞJĸÑ°ɲĕ°Ŏn\"],encodeOffsets:[[114098,42312]]}},{type:\"Feature\",id:\"1503\",properties:{name:\"乌海市\",cp:[106.886,39.4739],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@Ș°ÇīXŃŗ@ȍlkƒlUŁ±īĵKō¼VÇôXĸ¯@ťê°źk¤x@Ĭ\"],encodeOffsets:[[109317,40799]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/ning_xia_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"6403\",properties:{name:\"吴忠市\",cp:[106.853,37.3755],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@nLV@VLaÞbn@@l@bUVlUVzVx¤kÞVèXn@nm°a@UÑ@VXnV@VaUVKUUU@@U@@KVa@U²@wXkWnk±lLnU@UmmVKnIVWnI@UK@UK@@UVKXkmWLWUXmlkVwUyVa@ww@aVIK@aVÈwKlLVV@LnVVVnUÜ²°WÈIUÆ@nÞ¼@¦@UÞUVW@UxUxVnbKb¯ÞU`VbǬV@XXÆVVl°InmnUô°¯anam£WVXKXmkôaVU@Vak@@wman@K@UÛUWKXUÇ@UIb@alW@akLUKV@@Ukw±InL@kmwkWmk@JUIůVmnnU@m@UKVKlkUwknVUKmbkI±KkmVkKb@U@aVkUmn`kIlaUK@UUKmbUIÝUa@mUa@am@UUULUK@bmKkbWI@WXwlkXWa@k@kKLVkkK@L@JUVmzUKlwUUnW£XVlKUwVU@aXI@aWaUw@W@_nam@¯UkWVkUWaU@nwmJkUVkWVUmUkJ@ImbUa@@WÅ_mJknmak@@mXaUV@xU@@VUnkV@Vn@`ULUbWLXVW@kbUJ@XW`@nÅĖWJ@m°@xxbnUaw²lÞ°xŤIVVULÛWbbkVVXÆ`UbVL@kx°LlV@VWbJn@bl¤ULV°@lmL@£U@@aUwmKULVxUVVx@@kU@mK¯LÇa¯@\"],encodeOffsets:[[108124,38605]]}},{type:\"Feature\",id:\"6405\",properties:{name:\"中卫市\",cp:[105.4028,36.9525],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@°@Èb°KnL@lV@@UwVUUwVKnLVx@bV@¤@nK@k¯UVKk£@amIXa@UkU¯Klw@UKVaÅ_UWlUaXaÜVKUUţJ¯wÝ±kxVbmaw@wn¯@XIÆĕm@X_@WVIlaX@WUXKVaVK@_Um@lUVm@U@Vw@VUÛwm@@W@ImKUkU@UaaX@wWaUKkw@UVaUamLUnk@»±`¯@kW@UaykbI@VWJkLWUkJwU@n¤mL¯wm@Um²XVWbnV@bmxVkxUblLUV@kVWKU¼kU@mn@JnV@bUnmJUn@k@XlxLVVnKlLVV@@LkKULVbk`WL@lkXW@kV@UÞUlÇXlkaUbmV¯@@L@V@bkb@xlWbbW@±@UJ@IU@mVkVxV@@lIlln@Vm@VUbl@JLmKÛXmVkUKULU`@LĉwKUXlVUl@VbJX¦̼bÞxŎxɜĖĠŎaô@\"],encodeOffsets:[[108124,38605]]}},{type:\"Feature\",id:\"6404\",properties:{name:\"固原市\",cp:[106.1389,35.9363],childNum:6},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@Vnn@°xnK£mV@xlIXVlKXI@UJlazVbX@l°@²_@¼mlVnKVbUb@VlxVLXb@xWbVbV@VlnL@J@Xn@ÜxbW@nl@nblmnIÆ`@X@Vbna@aVUUWVk@kbWakbU@VwW@_l@nmn@@alVlk@UkmVak@@aUXaL@¯@KVa@axWI@KnkVaVJn_lJ@X@m@nVanUVb@mXLlJVWnLlaVVaVX@KXVVkVKlknKVa@aVU@KXb@klJUknUm@K@_UW@alIUamaU¯kJma@IUK@U@@UW@@aXLVVJVaXIKlaUkUV@ambUUJkIWJ@wUIV@JU@UwV@@Um@nU`@UkUmVUxWUUV@aÅb@aWXkKUUUUaWK@wnm@IVU@aXwm@UmVaUalk@anKUwlUwlkK@wmaUkmmIk@VmkUUbW@UVUnW@kV@xkVmbVnU@UbUV@ak@kkW@kLW¤@nV@VU@W_UVUU`VLUV@IUVõVULU@UUUJ@wmkUJ@WI@l@bkKkbVVbVbUL@UUJ@Vm@@L@xbVVVLVlVwX@Vb@bmUkbk@@JWIUVÅw@Km@UkWKXxWLÅ@UVUnWK@xkVW@KULwWVXVWzXVVKVXkVV@VUbV@UVV@@LXxVL@VbLnKVLVxXVmb@l\"],[\"@@@J@aU@LWK¯UUxVVn@ĠLUW@UbUUUa@KUX\"]],encodeOffsets:[[[108023,37052]],[[108541,36299]]]}},{type:\"Feature\",id:\"6401\",properties:{name:\"银川市\",cp:[106.3586,38.1775],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@UwVK@UVWÞUbwV@knV@@KU_VK@Kn@W_XWlL@Vn@Ċw@Ula@Wanamī@a»ŋó@aÆÅɲÿUaV_°ÝaLaUmVwVwX@VUVÝ@@¥Ý»@mVÅÇJ¯XÛ±VUmUmU@KUUkKLÇxU@bLUJ@bx@xUbVzUxklWnXVKnXWlUL@V@VL@VL@mJUXmJULnn@VmVkK²mlXWlx±@@VUb@L@@VV@VVULVUbU@WmU@Ò@V¯bmn@V@lVnUnVWXVl@¦VVUn@x@XL@¦lXxVb\"],encodeOffsets:[[108563,39803]]}},{type:\"Feature\",id:\"6402\",properties:{name:\"石嘴山市\",cp:[106.4795,39.0015],childNum:2},geometry:{type:\"Polygon\",coordinates:[\"@@U¯ķó±ÇÛ¯ķmbXb@kb@Vĉxm@@UkKWXX`m@@LULV`@L@mU@lUxaÝVUX@VULxVkLWV@JnVLXVlUV@zlVL@V@bn@lU²WVLlLVbUVxUx@xǀLxôÒkK²VaU@wXa@WÈĉUa@bÈkm@¯\"],encodeOffsets:[[109542,39938]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/qing_hai_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"6328\",properties:{name:\"海西蒙古族藏族自治州\",cp:[94.9768,37.1118],childNum:7},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@V£°@laXô±źwô@UlżaÜnKw@Uaa²LmÈLÆÈxlaUawÞmÜbÞUnJ°akôÑkwÝVğwÇ@ÝkkV¯¥@ò»nŤ¥XImw@mVwa@ÅwmLkaWw¥l»kçó»@WÑĉğ@ĉŃUwóřVómĵ»Ý@VǕ¯kÝĊÅk°ÓUklkU±IÇÞk±@ƽJ@UġIk@W¦VÑșÓÅnťKULn¯X@¯mUÛ@WÅmóKknōbxÝ@U@kw@ÿÇLţÝUkmwklċVÅU¦LkUWlÅÑ@a@ÅÑ±UóġŹ¼ÈĉmŻ@@wkwKl¯Uġ@lÇUÓ¯_Waĉ²Åló¼VbknKÇÅ@ƧĢō°Ý@ğWÅxUUm@ÝXÛWULUè¯@mbUaLbUWġxIUJWza¯by@ōÈóLU`ÇXUlUĉV¯nmÛbǕLklUĉVóaġƏbġKţnkbÝmmnÝWȭÈÝXţWókUÇl¯U¯ġUɅĀ@°¯¯VÆnmJ@ĊķnóJUbÝXUlVkL@lVxnnmb@¤Vz`ÞÞŤ@VnÆJV°bUôJkzlkl@²ó@ÆÇ°kĖÇbÛU@lmbXVkzVɅĀXˢlńĬŹ@éÅ@ĉńÆ°ğbUlɜ_°@xŦkbVbƒKĢŤVŎ°@żÈźlĊôKôb@nôxŦÆ@ôŎL@þÆb@nnWˌbÈxInaŎxlU@Ñ²±ğVUĢƨbɲ@Þ¥ôUUķWVô¯ĊWʶnôaŤˁ@£nmnIôǪK°xUXô@Ŧa°mkXÆÞVŎkĊ°ÞLÈôyVaIlwX°UVwĢÑÜKôw@nV@m°nmnÜɞ£VbmXn°ÜÒ@xx@Vb²UlbkxVnJUnVVĊ°KČm°nxÇnn¤±¦@UXVV@lVbmVVÈVxÒ°IbźaČbVw@VLƾÑ@Ŧô¯ĊkôÑ\"],[\"@@@@nòVaw²bVxxÜaČVô_ĊJIVmLa°@Ŏ¥XlK@klKVbUb@nUĢnaÈ@lmǬ»Ġ¯nmnƨVyÑǖĠ»ɲIn@@ÅĢƳ@¯°ôVKÈbVIÇ¥¯@Ýó@ÑnīWKkk@¥¯ÅaX±VÅw@±Ġ¯@»nWmw@@¯VUUWçKĉa±VkkV¯wx@UJx@bknÇbmÅ@Uw±U¯¦UKm¯I¯ť¼ğĊ@ÇŹÈ¯@Ý»ÇnˡJbÛèÇnÅK¯ġĠŹW¼Ålm@¤n²Ýb@b¯l¯@Å¤W¼nV@x°@Vx@lbUblbX¼WÇ²lU@¼V¦@bÇlVxUbVxÞbVbm¦VV\"]],encodeOffsets:[[[100452,39719]],[[91980,35742]]]}},{type:\"Feature\",id:\"6327\",properties:{name:\"玉树藏族自治州\",cp:[93.5925,33.9368],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@ɆÿĢV°°VÈklVôŤXÞWȮÇÞXnmÞnlaŤmĢLƐaĢôbĊUVlkǖKÜan°mĊUVVkÈWV_ôKŎÇ@z°abXyVIJĢwVXaKVbna°@VçVKXÜÞWn@VVÆwXĠÞ@Ŏ¯ƨġÆ@ÈLlmUaô»ÆkĊ±Xb°`ÔVkÈĢ@Vk°Llx@xż@ĊnÇź»ôĢ²VÆÒ@@bÆÒXklVKV¥ÆČUklnxlç¥ċç@±m¥wÅJ@VmÈIléÈa°U¥@kÞVK²ÑW°w²ÑK²ñyÆÝVmw»kkWĉJWUVÅwLmÅ@@mwkn¥VÑ»°°@@»¯LlaJônVUÅ¯U@W¯UmÑ¯¯k@WykU@¯wV¥kVwţk»wWÇĉĶçKÞÇaĉbIlU@kwWXU°w±@UKn£WĉKWxkĕVamwXw@Wmnk@aVkbĉLlImmwUÇWxnÝJn@¥ÆkwaXÜĉ¯ÅV¯¤mkx¯kķÜ²VWôŹVU@V£¥@°wn@m@¯@UbUôķmn@ÆÛ@ÇýVaUÇĊV@Çlğ¯xÝŤlVÈÈVx¤VxkK@@x@kVĖġ¥kIWbXŎx@nxÅUW`_@±UaLUxK¯WbkVlbbmLÛÆWIUwWkwÝV@kIéUbUUkV¯Km¯k@UmÝ¯m¯mLÞĉÛUmġ£UxkKm°Lwk@kVmKVUk@¯a¯ĢmóKUUxImlÅnÇbXèVVU°@@xXnm@¼ğ°@²ÆxU²WÆb°@¦llXLmĬ@ÒÞô°@È¦UJÇaLóU¯@°ġƴ@Æ@mɱJğ¼ǕÒUzƧmnmğ°ǫ¼knÇ@bġmmV@VaUaLkl@kLWō¦¯@bKUnJĉIó`ċUÛbwUw±axbñUm@@babÇÅXmƒÝÅôVbÞblUÞVÞU°VUx@UV@l`¼nL@ĊLW¤kXķWġXUVVVķUbVb@°kVVxÈa@Č¦ĊbaźJU@ÈVl@XkôaWĢÞ@laĸUÆb²mÞLĠÞÑôbÒĊaJVbm¦\"],encodeOffsets:[[93285,37030]]}},{type:\"Feature\",id:\"6326\",properties:{name:\"果洛藏族自治州\",cp:[99.3823,34.0466],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@ÞVŤÈK@ĀlxV@Þ@wŎalmôLnXÆÜ@nV°@°WmVKŦLÆmȚÔÒUX¥l@ĢJV@ƾI@wW°Ån¥kÅÝVwôÈç@lÑĊĕaJnaÆLVw°kny°UnkÆVČĊll¦Vƾ@@nUźÈÇIn°XwÞKô¦VWV£@£°ókċ±Iam¯Va»ČĉV¥°@mk¥l@Ċm@aUmwX@wÆxmĢ_`VnÆbKVw@@nUVğVmVVöIll@@çÛm£UÇw°@VU¯»m¯JōĖÅLa@»ĉĢ±`U_k`ÇçókXlK@akÝÞ£WċkÝkxJÝ¯ÅwxķxmIÅx@k±J@ýŋ¤UkmV°ÅÝxkwmġnÝVU¦ŤlmóXk¤UKç@mVkK@klī£m¯VUbW¯¼ċb¯ĵam¼mVXm@k¤ÇXÇbU¯J¯¯È@bVXVÒ¤V¼kxÝV@lVWxÛ¦W¯mKnlkU@nƑUĉÝ@ÇºÛċUĉ¥UÞÅz±òL±Ò¯xX±ÒLÝU@lV¦¯ÇbkêÇJnU@ÆIxn¦@²Čè¦è\"],encodeOffsets:[[99709,36130]]}},{type:\"Feature\",id:\"6325\",properties:{name:\"海南藏族自治州\",cp:[100.3711,35.9418],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@Vxń@ĊĠĊXÒ°UƾĕÞm°£nb@@LUUWÛº@nlÆǬĠ£ÞV°UXbVȂǵé@kWanm°@xzK°¯ĠVVkwLnm°kÞxÆa¥@wnĉÆ@_l_VwmĸèŤÅČU@Wn@ÑmKUnğK@°¯UÿV£nmLlUUÛé±óókkmnakV@Ç°óÝXWəÞťIţxmmVÛUVȂÓnWyȁĉkV°WnkĊa¥_K°ÿWna@mU¯wlÝIU¤UXó¥ÝLx¯WmJÇÈŹmV@ƽ@Uk¥ĉkċÅUml¯Vmz¯lUxÅKmbIbĉĖkÒ@ÇèóUxÆÞlm¦Æ¯X@x@²ÝlÈJV²klVl¯ÔlĉÆÞ°lUǖÞ@Ķ¼nUôôŚ\"],encodeOffsets:[[101712,37632]]}},{type:\"Feature\",id:\"6322\",properties:{name:\"海北藏族自治州\",cp:[100.3711,37.9138],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@ōmġxƽUm±LǿþġÔ@kxmWb¯I¯mIUx@bbŹVÇkĵblĉI¯¥Um@Æ¯È@aóUlČ»@w»wXaó°ţçÝkUaV¥ÅbÝw¯lmnKlxUğU¯°Lyw¯@mnXbl@êȁǶUWa¯VÝUğ¤ǫkÅ@mÜ¹XVV@K@ma¯¤ÝnƽĖ¯V@¼ôlèk¼¦xXlbnKÆx@bUx@nnxWJţ¦m¼ñ@°¦lUÞlÈ@ĠxÞUlxÒól¯bmIÝVÛaÝnxVbkbÇwÅÇKn±Kbb@VxLmÛŻbkVó@Źxó²Wkb@¯U¤źĊ@lUX°lÆôUlLXaV°wxUb°xÜôÈKVkÈmlwkÈKwKVUŤĉŎ»»Il¥na°LV»²¯Üy@wĢ°ĸwlwĢw°±_lVk@°bÆ¯z@l_@Ģ±lÅVlUaÞLVnKlnÈ°IllČawÞÑ°xUU@wVkmĠLô»KÞýôaÞ¥ôĀÞmÆmUŎV¥Èl°²°a²¥V@@wamm@Ñn@Æ£żVĠ£@W¯Þl@»@Uk@\"],encodeOffsets:[[105087,37992]]}},{type:\"Feature\",id:\"6323\",properties:{name:\"黄南藏族自治州\",cp:[101.5686,35.1178],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@ôl²ôÜêVVkKmnU¤VĀ¯°@LmĠVnLÈL@alb@al@n°V_XmWUÈamaVIn@naV£óVWU£°axÈ¥@aĊwÈ¹@óağbm@kw@maÆw@In¯mm@UkkWÑÅ@@kċÅçVkÝJÅkVykŹl¥@¯ĢUÜX¥òýmmXÝÅlmU@£WlyXW»Åbl@aI»k@klm@UxUUV¼¯XlaUnķI@x@¯KĉUU`ólČ¯ô@¤ÞJk°xVn@mbX¯ĀL`¦ĉbml¯XUlȂĊXzmȁÔUÜVUnnŤwŦJɚÝXÞW¯ô@ÈlUbmln\"],encodeOffsets:[[103984,36344]]}},{type:\"Feature\",id:\"6321\",properties:{name:\"海东地区\",cp:[102.3706,36.2988],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@@Òb¤ÆI°ôU¼°UnnWx@b¯L@lUUWbXxWlƨnxVUllXVUnL@lȀý²KVnƾĢwV»@mÞ£nÆÞÑmLKUaVżĕWVk²ÆÝ@Xw°@ô@a°wóUUmIkaVmÞwmkny¹VÿƧnÅm£X»naV±Ýw@ab@am¯ĉVó¦kÝWKUU@WanUb@ôÇºĉxb@Ç¦w¯bV¤UXôU¤bmm@UJnbÇbXVWn`¯Umk@@bka@bÇK\"],encodeOffsets:[[104108,37030]]}},{type:\"Feature\",id:\"6301\",properties:{name:\"西宁市\",cp:[101.4038,36.8207],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@@kmKVUWkVkUmwƧXkWwXaVV@k°K@aXwmmV¯V»¯óÅJ£amX@ċVţÆķçnUx`k`@ÅmĊx@¦U¦blVÞŤèô¯Wbx¼@xċ¼kVôbÇ@Å°@nV°¦ĊJkĶalÈźUa@aVwnJ°°JanXlw@ĢÓ\"],encodeOffsets:[[104356,38042]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/shang_hai_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"310230\",properties:{name:\"崇明县\",cp:[121.5637,31.5383],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@uŏu»GPIV±ÐɃŜ{\\\\qJmC[W\\\\t¾ÕjÕpnÃ±Â|ěÔe`² nZzZ~V|B^IpUbU{bs\\\\a\\\\OvQKªsMň£RAhQĤlA`GĂA@ĥWĝO\"],encodeOffsets:[[124908,32105]]}},{type:\"Feature\",id:\"310119\",properties:{name:\"南汇区\",cp:[121.8755,30.954],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@`yĉNǕDwǏ»ÖLxCdJ`HB@LBTD@CPFXANC@@PGBKNECCBB@EBFHEDDDSNKAUNBDMNqf[HcDCCcF@EFGLEBa@ACoCCDDD@LGHD@DJFBBJED@BGAEGGFKIGDBDLBAD@FHBEF@RFDMLE@SGANFFJBANPH@@E@FJjRIACDMDOEKLFD@DbDAJI@AP@BGHFBCBGDCC@DCA@CECGH@FKCEHFJGBFDIHACEDNJDCVFBDCRKRLDLITB@CjNJI^DBCfNVDHDFKHAFGDIICDWBIF@@CFAjFJNJBBHD@CJ@AEFJ@@DH@BFBCPDBMFEQGDIFCNDHIP@HDABFACBJFHEBSZC@DP@@JDBƤ~\"],encodeOffsets:[[124854,31907]]}},{type:\"Feature\",id:\"310120\",properties:{name:\"奉贤区\",cp:[121.5747,30.8475],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@~T~JjZdDbLXDLCB_J@@FHFZJJIAGH@HGR@BENBLID@@LFCDF\\\\FpDBDb@FAHKFE@dEDDdC\\\\GreNMACVMLBTMCCFCEGFAA@DAFDLMHA@OD@BMEWDOC@AS@KGAI_DcKwÕísƝåĆctKbMBQ@EGEBEJ@@MBKL@BJB@FIBGKE@ABG@@FMFCPL@AjCD@ZOFCJIDICIlKJHNGJALH@@FPDCTJDGDBNCn\"],encodeOffsets:[[124274,31722]]}},{type:\"Feature\",id:\"310115\",properties:{name:\"浦东新区\",cp:[121.6928,31.2561],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@EN@JJLNHjLJNR^GRYVBNZJRBV@PDvbLNDN@LGNER@nCNQNuT_TIVFV\\\\Z\\\\XnDrI|[Ʉś²ÏJUHOƣ}CA@IO@@CYDATGFIEDAEBBAGCO@GJMCEDCJRHEFANOCADAEG@@CI@FE@BDIC@AGIAIMiEEB@DE@AJCXJDCJEHGBELGCUCeMAD]CIJiM@DSAKJKCLQDQACUECDMIFCBDJGECHAEIWCK@GLMCCGEACNKCEJG@MMBMC@@CIJUINT@JAJSTEPZZCP\"],encodeOffsets:[[124383,31915]]}},{type:\"Feature\",id:\"310116\",properties:{name:\"金山区\",cp:[121.2657,30.8112],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@L@BIHFN@@EE@@EFBDGDAADVDD@@EF@CA@IIsRE@GDAF@BF@CV@|FBCHBLCNHAFCADBMDCFZXHILBVEEQA@MWFARJJ@DCX@@TEFBLHAAERE@AJABRPBNK\\\\BrJ\\\\VHGND@CNADKDADQjGAGNC@GJ@FCFFHC@JF@@dLBDSFADHVG\\\\DTEPDDHJALIJkJDJCDIPE@YDCBiK@DONE@EH@BAF@HLJA@EIA@ALKNA@@FIFAFHR@NALadsæąyQY@A±DŉXUVI^BF@FFF@HBJEDFFGFEBSRkVEXGHFBMFIVW@GAEEFOIAIPKABGWEKFSCQLQBSEIBC\\\\FdBLRR@JGACFDDEF@AWB@LJJYNABBA@CUEGPaO_AIE@MYMFIGAEFECHSAAKAO\\\\[JEDB@E@MMA@@AGBKMGDFFCDDFEDFJF@NPBAFLHFH@EDDHBADDC@DDCDHHCDDFDABDAD@FEFOBCJ[D@HEDDNJBDDHABJIBBvGLBJAH\"],encodeOffsets:[[123901,31695]]}},{type:\"Feature\",id:\"310118\",properties:{name:\"青浦区\",cp:[121.1751,31.1909],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@RUNKdOFDJCbRFMLAHPLDN@JGL@@APBWYCKN@TU@SHGCEJIDIJKVIZVNM`iNY@CIE@CA@KBOEGEUFCCSADEIEFCDDDIDDHC@CKIeDCG@IG@DHWFEEGCH@@GO@@O]CNpeEQDBFME[JC]DGF@CKOA@QSB@GB@@GW@@ED@AQIJIAAFE@@DO@CFI@KNG@CDACAFEGKGBEGBDCCAIFCCLIECFI@MBCLDHGNAHSF@DMB@EEKBA@@C]DEICFG@ADBHGFKCDAKKHKD@@FHGAANGEEFCHKCECBCKG@ADKCNE\\\\[A[I@@mGBDQQEO@BCE@AI[AML@JGACLOAFKEMM@EQKC@CUCBCCBCHEA@FF@@FM@GEAJK@GNF@EXPH@FD@M^@HIADJCFDBER@DK@@DE@CAKFOCCBDHIBCNSB@GFC@GQEEOWFICGDUAEJIDBTAHJHEB@DIF@NE@H|HBDBEH@DKBAHEF@HEEUB@FGFGCCCE@AHOB@NH@PRLVNNFBX@RCPbAvMtBfH@DJF@ELBFA@EH@HNED@FFB@HLC@CJ@@DJ@PIRf@HE@CFF@GPHD@DKE@FFBEFFD@DEFCA@DD@IjCRFBAHFDKD@HF@@PM@H@BlbDJDBFEF@DLXB@HCD@@IFCBIFEJD@FDC@FBALLF@PAACJERACAJCBD@EL@JD\"],encodeOffsets:[[124061,32028]]}},{type:\"Feature\",id:\"310117\",properties:{name:\"松江区\",cp:[121.1984,31.0268],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@@DLDFRN@FNELPBDKHB@INK\\\\BBJF@ADP@RFCRHA@nJ@B\\\\[\\\\MFLDBCH@DLDADFGLEDFFMHBBGH@EC@GLLLCBLDHEAGBCH@DEFJ^C@DB@LAFFA@CNE@GTMBGHKCAD@NEJFDKJDDJEDBCDHAAFLHFHBEBDDCH@LMJ@DEP@@CF@BEJBJIBRC@@FX@@HA@@HTA@RPBDLE@CHD^\\\\INFAERCfFMo^D@PP@@HG@HDFFXECGH@@JDHfCLJ@DGDCCCJCCEDJFCFTBDDVEHFPFLAB@NBFCFKFC@CHIACNOHWHCAAFIDD@CDAGEI@ACFMF@R@R_@GQED@EGFEQEDE_IAHKAEXCQUOQCUDEN@ZI\\\\DDmAMHCICDSOC@EG@BKHIGMIBCGOCSF[CUHCGEBCTKA@cE@@IGDEEEDI@@HMDBHiHCRCBCLMB@DMCGH[UqI[AMLOAAQIB@BQFBFGBAKFE@SW@CDI@QIEBNXB@FRUFKAGJYWDENCCADBBEMGKDGAAD{EU@@DAEE@CB@HQFJt@JDBE@@FC@\"],encodeOffsets:[[123933,31687]]}},{type:\"Feature\",id:\"310114\",properties:{name:\"嘉定区\",cp:[121.2437,31.3625],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@F@LI@IDKJADKIEJICADGACFECCJ@HKCAFOHAJI@aCBEE@ICAEB[GFGCKL@FGEIFADMLCAEJM@ELQECEIG@BE^QKKLQCA@EHBIGQ[GEHOMGGDHKH@JOECFCjCBEFDNCACMBCILGTABDLEEOEIG@GFIMM@CGKFBFCDE@@GEAGEEACIcGaHMFITIHDN[AKF@FS@OA@BK@IHM@KCGOKBENaQIDECcPMLQVFHFB@BFBKLGD@FAJOVGIACQ@A`LPCB@JEF@RU@ANS@@RCL\\\\HIFpRBFRBBDKLLDADJDGBFDABHBEDNF@DGBBBADKDAHC@\\\\JJFBDEH[DEFDH\\\\LX@XLBLbT@DNJLDCEL@VJABJNDHB@HBHYFBAA@GNFB@@AFB@AFABFLFBHFCL@HJBAFBLC@DN@HN\"],encodeOffsets:[[124213,32254]]}},{type:\"Feature\",id:\"310113\",properties:{name:\"宝山区\",cp:[121.4346,31.4051],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@mÖoÖi½[s[YEUJU`SCIEBCCWJY_LIICDWU@@FaBCJIB[ICH[@@CDKEE@MK@@IMCAEBCH@AMFI@SMGEFGB@FK@BHCAIFJNQD@FEBDFMBKGACG@ECWH@@CDDTOEEBGEK@GC@EE@GPHFR\\\\JHGA@FDBKRLL]RAFH@FJFDKR@FINBFKDCNEBFJEHK@DLEH\\\\HFADB@JFFDA@bIJGBEPDBGLI@DDEFBDCHDBIJJFCLIBCL@JKJE@ADHDBHJ@HIBBDFHBBAEIJ@BJFAVL¢\"],encodeOffsets:[[124300,32302]]}},{type:\"Feature\",id:\"310112\",properties:{name:\"闵行区\",cp:[121.4992,31.0838],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@T@@ELE\\\\BCMJGJSNEbGdHDJFBJAFIEIFCEWG@@gMENSFCVJFAxR~B@IH@AIiI@GE@FGEAFQPDRiV[\\\\DFSGMHAXHDOMCJCDETBBNVJJI@DD@ANNNH@FILDDMFBDHNDHKL@XDFGLD@EHGFD@DDB@CDDHCDAEAHG@ABOJ@BIaC@CECLKPFNCDCJBiQEIF@@@OGBMIAEEBMTHF@NKEC@QFEGA@EBCKAACHCLJHEFHHB@AFCAIEACIC@HG@KCCDC[ECEED@KC@KJMAAFQ@GHG@BHIJYIGE@EI@A`KDWCaKcCiY}I}S[CYJM@CFDVPRRVWDFLBBG`JCFRFEFFHC@RF@HQ`Q@E@ENBDJ@HFCB@DCCEJBBGDGXMPBDGJ@DEDELEDMA@DJF@DMZ_jMNYUUJILCJIJDFGH@TSVM@DLXZ\"],encodeOffsets:[[124165,32010]]}},{type:\"Feature\",id:\"310110\",properties:{name:\"杨浦区\",cp:[121.528,31.2966],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@V@CXJDKJZ`XIDDFADJvSRMDM@mFQHM@KCMKMuaOCU@BDAJSX@HKJGD@PNJCJWAGT@R\"],encodeOffsets:[[124402,32064]]}},{type:\"Feature\",id:\"310107\",properties:{name:\"普陀区\",cp:[121.3879,31.2602],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@F@@FHDL@HFFAPFCSDC@@XGFDH@BDLHNACEFA@ERCIMJEDBAGL@@EHAFENHHJ\\\\ONQBQCIBC[MKACKI@GGGH@I_G@CW@[DMHCDIBMTDHN@JNHEH@FJFPKFACSBKHDJNABDMDECAFiDEDFDIPG@GLHCNH\"],encodeOffsets:[[124248,32045]]}},{type:\"Feature\",id:\"310104\",properties:{name:\"徐汇区\",cp:[121.4333,31.1607],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@RADL\\\\NCPHFfLJaJ@FWLGMGIK@IFMDOYYFOTSBI@IMSAMSACFIDNDCPWGGBHNET[CU\\\\QjOCERFBEHF@@HjJBJG@@J\"],encodeOffsets:[[124327,31941]]}},{type:\"Feature\",id:\"310105\",properties:{name:\"长宁区\",cp:[121.3852,31.2115],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@HFFB@HF@DCAELENSJADCNG\\\\CX@@D`H@JHGHHJ@BINBFUGEDO[MCKQB}AwQEBUIEDMTNF@hH@FXEDFJEJIB\"],encodeOffsets:[[124250,31987]]}},{type:\"Feature\",id:\"310108\",properties:{name:\"闸北区\",cp:[121.4511,31.2794],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@CSG@BQGODUPWTOBQAAFMECKBGEMFKEOHADDJARMR[PGI@TEJBNG@ADBFND@JL@@NFFCL@D\\\\@DG\\\\JJADI\"],encodeOffsets:[[124385,32068]]}},{type:\"Feature\",id:\"310109\",properties:{name:\"虹口区\",cp:[121.4882,31.2788],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@bA@E@QHSXBDIMI@OHCLI@GTWBIACQAYIOFGCENBBARSPOXCVHPARH@DT\"],encodeOffsets:[[124385,32068]]}},{type:\"Feature\",id:\"310101\",properties:{name:\"黄浦区\",cp:[121.4868,31.219],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@NEHFLAFDHDPEAMZUHQQ]IMKJG@EPERABHBGRUCCNGV\"],encodeOffsets:[[124379,31992]]}},{type:\"Feature\",id:\"310103\",properties:{name:\"卢湾区\",cp:[121.4758,31.2074],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@VDHQGABAFQFOH@LIiKKHEXI@IbAFZB\"],encodeOffsets:[[124385,31974]]}},{type:\"Feature\",id:\"310106\",properties:{name:\"静安区\",cp:[121.4484,31.2286],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@DLLB\\\\NPGLFHUDMYABEeKEVMAAJ\"],encodeOffsets:[[124343,31979]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/shan_dong_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"3706\",properties:{name:\"烟台市\",cp:[120.7397,37.5128],childNum:9},geometry:{type:\"Polygon\",coordinates:[\"@@ŤLLllVń²è°xżĢĠÆlÒŤbV¤ĊXnlĢVĊÒÈ°ĊŰÞèL±@џn»VUźċ²»ÆkôVɆkĊŃ²kŤVVwUUVmUa@KkU@mUmmk@UwUkmW@UVIXa@mw@aKULax@Uk@UbWU@yULmK¯@kXVUwm@@JUUknWKUVLUbU@wWykIa@w@mUI@aUVynIWak@@Wbl@@knmK@wnIl°Kna@V¥ğ@ġUķ»¥@UōJX¯¤k@wmI¯k@mwak@@lX@bUJ@VbknWxkLkxlLVlkLmb@bU@bU@VbU`Vb@nL@mbU@VnUVmnU@mm@kIUWVIUKVkkUJUnmL@VmLUaVWaXamU@U@KUUmVUJUVÇwğnm@mXĉV@l¯xnô\"],encodeOffsets:[[122446,38042]]}},{type:\"Feature\",id:\"3713\",properties:{name:\"临沂市\",cp:[118.3118,35.2936],childNum:10},geometry:{type:\"Polygon\",coordinates:[\"@@bXll@zlV@lXXmkbVVlU@Vn@@Vmb@XKVXWJ@XXl@ÈbVLUl`@XXV@VVUxVbUxVb¦@WnXVJ@bnVUzl@°ÆxUKlU@mUUnUlUVWVUnVV@XX°V@Vll@VkaXVl@Ux@bmbXLlKlb@b@bUJn@@b@n°x°K@an@@UlLVKVbXb@bVVnK°LVa@UVa@XwKVxnLU°@naV@UWUkWULmVwÝKUUla@aó_@mK@aUU@WUkwVm@aVI°W@@IUw@a±¯@¥kUVUm@awkw@K@kVKk@maXalI@alLWXblaVLVUV@LnK@l@waXaLlnUlLmV@n°J@_VmnIVym£UKmI@WnIVm@anUVmÇ_kġIÅWUXÇm@U@Ý¯Å@@naWIVW@IkK@klKn@naWImk@abkKkLWnWkLWmk_@UaVUKmLUw@mn£WwUmUaóV@UkUm@UKULUwmJUX@WW@XÒzVblJXWXk@UVWKX¤UL@xU@@VUaU@@XmVkLmWkXUyÝLmKXnV@n@lx@bWLnVVn`knULmxUlWLXVb@VK@z¯x¯¼WxKUn@bk@lVVVz\"],encodeOffsets:[[120241,36119]]}},{type:\"Feature\",id:\"3707\",properties:{name:\"潍坊市\",cp:[119.0918,36.524],childNum:9},geometry:{type:\"Polygon\",coordinates:[\"@@l@@UK@@L@bX@@VlL@JLUVnX@`ÜXn`V²mJ@bU@@nb@l°xnnĸVÆ°@Ċ£Þ@lWnÑnkʶJmó°w@kk»V@»¥k@V@kw@wVmaÅmaô£ŎXI@mlnKla@mV_UK@kUkw@alWIU»m@WUIl±UUÅUbkJ@a@wUKUaVIÆmXIWaka@m@Ul£XKVw@UIJUkmJVkU@aWKImV@UxmL@bX`WXU@U`ÇkUak@@°UblXkmLUKmL@VULóVk@@Vlbn@Ub@ċaUJUbIUlVLUVVbVKXVlVXU@mb¯@VmKUwLWx@Ub@VUb¯KmLUU@aWaUaULkK@Vm@@b¯L¯w@ma@m@UUU@U¦lJUXVmkb@nmXVWkbIVxUV@VUbWLXVLW`Ux@nk@Vn@x@VkJ@V`mXk@VxV@lVI@VULVUIV`°bVXXxV@VWVnL@xVUb\"],encodeOffsets:[[121332,37840]]}},{type:\"Feature\",id:\"3702\",properties:{name:\"青岛市\",cp:[120.4651,36.3373],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@@nUJXL@blVUnIVlIVJ@UxWLk¤@V@nlbXbWJÅnUJVbVL@x@blIaÆVVVk²VJ@XnV¼JkX@blxlV@VLU`@nkbLkm@nWJōó¤bnÆbUn@xlxU@l@¦@¼Ul¼ĊUnW@nĠmÈxUVIVnUVV@LV@nVWbXbUVbnK@UnKVmVIllUVLUJVXlJ@nnV@nmVUUm@Vna@K@mUaV_UaV@aV@@aanlKUkKklwlKXwlma@UVI@akW@l@bnxl@°nJxl@°£WŎIUÑn»lamô¹Ŏ¥VaUUkmkġWɱIUUŹ`@kk@ĉƨřV¥_Ç@Ĭ¤ÝL¯m¯£ƽóķwUW±ī¯kōaĉĕkğmó°bW@UKkLUaVmz@V@UxVn\"],encodeOffsets:[[122389,36580]]}},{type:\"Feature\",id:\"3717\",properties:{name:\"菏泽市\",cp:[115.6201,35.2057],childNum:9},geometry:{type:\"Polygon\",coordinates:[\"@@@¥IVUÈmÞ»@UlU@Un@VW@UVmkk@aVUUKVÝ@UVknK@UV@VVnIV@wnmwmKXaWaXI@UV@Vy²blkVKkamU@kb@Um@VmUkmKmkXKWwkU@Ul@UnK@UVUUmKXwUVLwKU@@Wl@@wUkV¥@@I@W@_V@VWUw@UUa@aaWa@@_mKUwl¯amzmV@WKnU@kWLķaUKbÝVmV@UWÇbÛ@X°UbW@XmVlk²UJUbmLÇxÅWUzl¯Ll@VkKXUbWJ@bU@¯@kbLmKka@l_WXºVbUz@Jn²V@¤lXnV°Ln`WbXLôVlKVUxXnlXLlU@bVV@XJWLUVnVV@@nl°nnVKÈbVXÆJU°VnXVkV@@xVL@Wlb\"],encodeOffsets:[[118654,36726]]}},{type:\"Feature\",id:\"3708\",properties:{name:\"济宁市\",cp:[116.8286,35.3375],childNum:11},geometry:{type:\"Polygon\",coordinates:[\"@@nam_nKlVLXaIl`_@KVVXI@m@w@@k@Knô@n`VbV@@LL@KVVn@VX@VLJl@VUUU@Uam@UkwKWaXamkJmIUVUÈblaUnV@kVKl@@lXL°kVJ@VÈnVJUX@VLXl@xVLnU@VKV@aIUaV@bĊUxKkVJXUlVUVaI@WUI@KlUnwmWk@WXIWUL@Wna@Um@@UVkUUlanWW@kkU@ykWkaWVUlÝbUU@kJUIU@@JmaókLKÇUUkKWLk@WbkUUabmKn¯°¥V@XwV@VanaVaU_@Wlk@WÈ@VUÈVVÛmaklKÈ¯lLVUX@lK@aX@@kV@VmV@VwnJV_UWUwXam@kW@wVUkKVIUUVmU@UV@IVK@aUL@aV@LmUKmx@ômLkUWJ@nXmlUxUL@VknVUU@VL`Ub±LkV@kUKÇbÛ@UWó_mJ@Wk@@X@VLxUKVWxLVnUV@VmL@Vk@VlVXxWLnlLnVlUnn@@VlaV@nlbULkl±aUzU@@VWJXbWbnLnxm@xUmJUUU@@VmLUl@VUÞVLUV@bllUn@VUXm@@VkV@VÝ¼ÇnUVJ@¦nnlnVlL@Þb°KVV\"],encodeOffsets:[[118834,36844]]}},{type:\"Feature\",id:\"3714\",properties:{name:\"德州市\",cp:[116.6858,37.2107],childNum:11},geometry:{type:\"Polygon\",coordinates:[\"@@¤@VmbVXnVVbVJX@ll@zlVInl@@bVxUbĠl@ÈblaIxXVWb@L@nULWVXXWWLnL@`@LUVVL@lVnJU@UUkanVôôb°¼VÞXIÜbČabôWXÞWÈzÆmnLVJ°ÈnlV²lbnW@@UUVmnwmkkKWkla@mVIUKUaaUwmnJU@@amIk@@bVlkX@mmUklUUa@_UaUUV@wwWkXmW@I@WUaÝU@UXaWUU@UUVW@UUUWUn¥nUVa@m@k@alU@wkLWa@UUm@@wnmUwla@anKn_@alK@Ý_@@WUUUmlkaIyU@UwU_Wa¯yU_mWUwkImm@InWWUk@@UVWVkW¯U@VL@b¯b@l±¦@VV@lUbV@kxVnUl¼XV@b@lV@nIWxnb@UULxÅxm¯aUwU@mUÅVÝKULm@bmKUXó@\"],encodeOffsets:[[118542,37801]]}},{type:\"Feature\",id:\"3716\",properties:{name:\"滨州市\",cp:[117.8174,37.4963],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@Vb@`bVkVlnV@nlWUk@al@nJ@bV@InmVxbVbVLUJ@nkblXlLnlmxnUV@V@mXnlbĸ@nnVxb@lnXV@UJ@nVxxnxVbÆVn¯ƒĕ@@wÈçUÇlķVIb@Çmk@¥k@UkUK@aWakUóJW_UW@wkkWK@U@K@XUUkmUUalKXala@U@kkWlkÈl@kVmVIVmU_awnwVW@wwU@wU£wkJWIyUI±bkVUJ@nmVUklXmx@lnbWkVUkLWxkKUUmUkbJ±LÇxUKmkUmkkWamUaVkJÆ_²KĠ@UW@wU¥nUWwK@aÝUkÅVaVK@akLW¯I@bnbVx¯JWñWbUL@nV@VmbkUUV@IÇak@@bWak@WJUJWL@bXV@@VJlb@zUlUUImnbVmz@°UV@VbV@@V@L@xLmKUnmJVXJ@VkLW@UVUL@b\"],encodeOffsets:[[120083,38442]]}},{type:\"Feature\",id:\"3715\",properties:{name:\"聊城市\",cp:[115.9167,36.4032],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@ô@VWnLan@VKÞLÆUnVV@xVbn°ÆwwKVV@maXwmJU@@k@aWUk»VUmlw@UVa@kUU@²¥@k°a@aK@UU@mmm@ówÑ±¥¯@@wKmwI¥kU¯UmakJmIUaVkKUkm@VUUaU@UaKUK¯@wUVUIUKVwk¥wbV@xn@lWnXxlL@`XlJX¦l°XxW¦@¦Uln@@@Um@@VXVmx@¯bllUnUJ@VULVn@bxVVL@bVlnVVblVÈnVlIVJLôlJ@xl²\"],encodeOffsets:[[118542,37801]]}},{type:\"Feature\",id:\"3705\",properties:{name:\"东营市\",cp:[118.7073,37.5513],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@ͬUǪlô@°Uw°ōĠ¯»Ģç»XÇ@wwƑaÇkwVƑ¯@ÅķUmm¯w@ka@mV@@anIU±m_ÛW@_mWVUK@IkK@UW@@a@K@L@Vk@±U@UV@lm@mUU@kLmxV¤@xVx@xUXmxxbV`UnUJnU@lÇkkllX@l@VkbWbkLVbnVVlWV@@L@VXLll@xVXX`ôIlVXb@bVLVll@@¦nlÈ@aUJkĸVÈÇè@x\"],encodeOffsets:[[121005,39066]]}},{type:\"Feature\",id:\"3701\",properties:{name:\"济南市\",cp:[117.1582,36.8701],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@²¦Òôxn@nn@V°VlXUUX@Vl@XVmX@JnnlJVxnXV`°zXbV`VxV@zJlbkVnVV@X@`@ÞkL@bm`mL@bkbxnVm@xn@VV@XbKl@xkV@b@l@nUbmVm¦XVVV@VUXVVV@XVWb@VÞVVb@X@JnXlWXx@xUVV@aVKVUX@lK@UIUWnIVmnLK@w@K@UU@a@UVU@¯nyUmanVJVVk@ykaIU@@WU@aXKIVXIl@Xb@al@Èb@JVUlVna@UmU@VKXaòX°IUwma@aU@UU@wVW@Ñw@aI±`kbUkwUmJ@UkmÇUUkmKknUV@mJUkaWka@KmKkULmyXa¯_@WmImmbLmUkVUbUVJbUkkWJkUlIUmkLlK@knaVmkI@mWaLUKUU@@VmLUVLWK@UUUWUkkVmx@Vl¦\"],encodeOffsets:[[119014,37041]]}},{type:\"Feature\",id:\"3709\",properties:{name:\"泰安市\",cp:[117.0264,36.0516],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@n¼WnxL@x°@¥Uk@nwlUVlXVV@VXLKVUnK@UV@VVLKXb@nlJUnmb@lkLKlVnJklVXIllVaIVUValUnVKannnJ@X°`WbnzKlVnL@LbXlbVlnI@VUU@UmV@U@U¥@VmV@@_Ua@m°@@kmUUm@UVmn@nX@@aanJVUVLmlIVJn@nkVLVa@KVmVLXVVL@@U°bn@VaV@@K@aVkbWaXUVymU@aUImWX@¥UaVwUaVwUUU@WW@k_VUKÇa@nmxkV@LVJ@XJUbVkUWVUIlLwĉVaU@VbJ@bUUL@mVUK@wWkK@UVWUIÇm@UUI¯lWK@kk@UL@lmUVkbÇaUVVnJlInWbXbLxVln@VbV@VUV@kIUK@UWm@UU@LK@KU@Uam_ó@m@L@l@@x@nWJUU@L`k_JWbUKkmLn`mb\"],encodeOffsets:[[118834,36844]]}},{type:\"Feature\",id:\"3710\",properties:{name:\"威海市\",cp:[121.9482,37.1393],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@VbUnVVUxĊ¼¼ô@ÞÑ¯WǬLŎUÆW¹UÇō¯ÑÝkţţóġóLł̥Uwm¥kÝmkkKóbÝ@U¦@mb¯LkmJ@xLmn@lk@a@X@lXbmJUzV@bVJ@n@xblJXzxV@VaKVUXLlmVV@In@VxUlW°@nLVK@zXVVal@@VwbVKL@bnx@WbUJ@VnXVlVxl@nnnV@lV@L\"],encodeOffsets:[[124842,38312]]}},{type:\"Feature\",id:\"3711\",properties:{name:\"日照市\",cp:[119.2786,35.5023],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@UaVUUKVkJVaVIČb@Vam@ka@Ul@UôVK@UnKVLnKlkWVa@¯l@VbÈlV_V@XWW_@anKVwUmVw@@UnyUVblKVLX@aô¯ó¥mÛĊÿÈ¥Þ¹lUī¯Kĉ¼ʟbÇVUUXmakJUnmV@bUnmJ@XnJVLn¤UzmJUn@`¯ImU@nKVkkmKWbb@xk@mL@KUUVUKkbWaXkK@bkJWbnbl@UL@lL@lxx@bnUVlV@¦²°@bVx@J@¯XUJ@bUnlxVX@VV@bL@nô`@bkbVVÞLxnU\"],encodeOffsets:[[121883,36895]]}},{type:\"Feature\",id:\"3703\",properties:{name:\"淄博市\",cp:[118.0371,36.6064],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@nlKV@nVn@@kVU@²VVaU@wmKXU@UUWwUW¯aU_JUVVK@UJU@kUw@UlnWU_@lI@U@wUml@@mVwX_KWUXKVa@UVUUwJlaXWUn@mlanUVWkIV¥V@VVVI@a@akakLWKna@aVwk@WUbUlk@k@U¯UWWU@mUUVUXkVmVVV@nkVLVÅw¯k@WVXbaUl@bV@@b@xkVVXVxkJ@nk@@VLUlVbVXUVVUzVLVbUbVVWVkLmkJ@n±@UxUVVkV@bx@ÒUX@xVVV@°JXlK@bULUblÆÞV@bLXxmV¦V@xXVğ@±LÅ`IUlVbnbXllVnnlVLÈwK²IlanVVVlLwXlKVlUXma@knwWlkVnU@mVIUl²aVJzXJlI\"],encodeOffsets:[[121129,37891]]}},{type:\"Feature\",id:\"3704\",properties:{name:\"枣庄市\",cp:[117.323,34.8926],childNum:2},geometry:{type:\"Polygon\",coordinates:[\"@@yUUUkl@@aVmLXw°»°w@yL@UUaWXKVknwVKlm_UmmUXK@aw@k@mUWmUL@@@£@KbÝV@akwaULmbUKLUU@lm@°mL@nUJVxVXU`mIUxU@UnU@@lW@@bkLW@UVkKÇ°kLlbnUÜÇUUVÇ@@Xkl@XV`UbmbUbU@WxU@¯¦m°nLaVblVXal@XKlLVVÈLKôlnbI@V@VJI@lVVÞaVkXU\"],encodeOffsets:[[120241,36119]]}},{type:\"Feature\",id:\"3712\",properties:{name:\"莱芜市\",cp:[117.6526,36.2714],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@lmnLVlÈVln@VnIVlxVla²_JlUUUVVw²@@mlInlKXUUUVaUaKUVyUUWVUUaVkUK@l@@mlIUwUWlU@w@aU@@LU@Ubm@¯a@V@UKWUUKUn@LUbUKmlm@UIkJnUKUVmIb@b@mWm@Un@VVnnVl@¯@@nVb@`U@Un@¦@V@VUVnV@\"],encodeOffsets:[[120173,37334]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/shan_xi_1_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"6108\",properties:{name:\"榆林市\",cp:[109.8743,38.205],childNum:12},geometry:{type:\"Polygon\",coordinates:[\"@@ýVnIW»W@»kUÇLÝU¯¥ÇIUWWÑUWwX¯m@»n@ÜÈķô@a±kČ±wÑmwçċmU»ÆkkVyImĉÿ@Ý¹WnwÇVÅazmmĉ¦ókVmxxU¼VkVm_UlVlk°IVkmJa¦kLmmV@XmKnlUôVXbb@UaÇLğÜÅw£mKnmċwÅ@UkbmaVn@m¯aUJm_k@kWXyl@@kÅamwLUÞmWÅzUKUk±@b@nnKbX¤mzVVxÇn¯@ÒknWVUbkķÈÑWkk@VaU@mUkbÝÅ@Ý¥ÇbkĬXV`kLÇVmalUUanV±nwmkJ@In°KVw¯UnÅ@¥U±bUU±mWbÛKWnUm`UƒVK@bmnmÈÅ¼@VL@xxmŤ°n@VmK²VllKkô@êÜV@VXLlm¦UV°Ș¯²ÿ@¥@ÆĊ²ImĶnnb°bKVĸLlÞ@UȮÜ°IVÞÝÞlx@ķĀWUxèÆ@°XnlĊĖ°mnV²V°ÒÆ¦aÞ@zll@bÞĀl¼nKĊ¼óÈb²±IǪÒ¯ĖV@lxnVlkJlaXwŌĉ@VnlÆĕUÆLèŌŤôxÈlU@xlaUċĕXmIWmnkVVVW_@aÈWUUmk@¯çVm»±W¯n¥VmkXw±ÇVw\"],encodeOffsets:[[113592,39645]]}},{type:\"Feature\",id:\"6106\",properties:{name:\"延安市\",cp:[109.1052,36.4252],childNum:13},geometry:{type:\"Polygon\",coordinates:[\"@@@kkÇmImUwVkUU²WmVkm@m`mIĢĕUVa@mXÿVVkyUýĕ@l_UmnWKVkţ¥awğ@@aôWakUma¯¯a±£kxmmxUwÝ@xmUb¯KwóÝ@kmm¹Ub@lklVbmnnVUV@xUknƧJUX@LÇWkwLķƧÅwWJkLkþĉxWzJUnÇk@Ɛk¼ÜÔÈKè@°lÈÆk¦ln@l¼@l¯L°UUVÇ°¹`m¼mXkbUaV@U¯x@¦ÇUUmlmUVmnnmlkw@@¦ÅÇLmx¯Ikl@¦mÆ°VUx¯Lm@JInlmxU²mVbkVbUnÈlKU_WlīÈaÞ¦Æ@ÞlanV@VUbl@XlÇÒĸlVaUXlm@Ñ°ÈmUwUnyW£amL@ma²@lVVLÆynXÝVKnxÆb@lk@WzX@lln`IV°b@nmUnbaVlÆ@ČxmnnL¤ÆxĠÛÈKVb@aWaUókVmnL@WUnnKl¥bnIlU¯JlUkVkn`lUUV»wnwlUôĊ¥nnyÆb\"],encodeOffsets:[[113074,37862]]}},{type:\"Feature\",id:\"6107\",properties:{name:\"汉中市\",cp:[106.886,33.0139],childNum:11},geometry:{type:\"Polygon\",coordinates:[\"@@lKnb@nlWb°bkxĸwVb@łnlĊ¥L@XlÈVblÈKbakVwôml²`n@nVKlk²xŎ°¦VUJĊw@çnWçÞVkUóÛ@¥kwUmX¯WÑk@UymIUwlUn¥mUk²a°¯V»@ÝVÈÝċÅÅVl»@l@a°±@_kammÅba@m@Å¼KknõĠ@m¯LÅwLVxmb@¼kV@mw¯wVakKW»X±¼¯Vkxb¼W@nx@x±bóakb@ÝmU@ķÓÛLkVUmk¯¤ÝLUlÝ@Ýzx@x°bmX¯aUJW¯k@bÇWwÛwWx@XWlb@VÈUlwLnl°VlUô¦U°¤VUxVXUxlbkVVlI°ÅVlU°m@kÇU¯xUlLUlVL@b°ĠInĠ°ÈnK@xÞa²naUyXUKVkWô¼Èaz°JXUVÇV_JVz@nb\"],encodeOffsets:[[109137,34392]]}},{type:\"Feature\",id:\"6109\",properties:{name:\"安康市\",cp:[109.1162,32.7722],childNum:10},geometry:{type:\"Polygon\",coordinates:[\"@@bĊaƨèwôô¼b°aXVÞVUÞ@aXm¥kImx¯¯V@anU@UÇéğL@¯¥V£m@ÝÈbKX°wČÿb@xÈblxÈ¯ĊmÆUVnÈ@ƨÜLĢ¥Źn°VnnKaô_ÈwUaXmnW¯klLXÇō¦ÝaÅVmbğUn¥±wÅéVan¥U»°am¥£Ý@wVw¥nUÑUmmVwmķIÅaóVWxkblb@ból@ğÒĉ¤ċX¯XxkÇ@óÆÅx@xķ_kmÝÇ£kblb@`¯²@bk@k¼ÆUČÆÞÇÞU@U¼¯°±bVlnm¦kVVxnJVz@lÒXW°nVlx@¦ôÜVUlÝXèm@è\"],encodeOffsets:[[110644,34521]]}},{type:\"Feature\",id:\"6110\",properties:{name:\"商洛市\",cp:[109.8083,33.761],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@²nlôb°aVwnKÞI`°wXôw°VĊ°@ÅÞÆVzÞK@x@aLÅ@b@nLl@lnmnLVwabVVnbU¼V°blbÈ@ĶŦb@nÇ@amIyUI@ĠVmôUVwkwlanJ¯lwó¥@an°J_@nóƒó@£l¥UwmaÑ@Um±V_J£JUW¥¯@_k¯¼mUVUè¯b@wmL»ğVmağI¯¤ċIUWXKĵ¦ķaJUbIlUóVmk@WÅÅÇ@mUÅVnĉÇ°kwÇa@waċĀ¯xWLÇa@ÞnU¤°¦@ĠKÈê@VmV@bU°°nwlJn¦WbÝ@V\"],encodeOffsets:[[111454,34628]]}},{type:\"Feature\",id:\"6103\",properties:{name:\"宝鸡市\",cp:[107.1826,34.3433],childNum:10},geometry:{type:\"Polygon\",coordinates:[\"@@@£@°Ib@¯°ynŹaUlU£Umĵĉ@@ylUÞ@@£kWU¯WaU£¯ÇV¥@kb¯wn¥ÇkUÇnU@¯±kULm@m±_kónUxlbaÇLkUaÇkW@Kĉ¦km@ŁUaķxlw¯aXak@mmakL@mÛ@¼m@lXV`nKU°°@²¤UÈ@VxmôxKlVV²aVwXlaVlx@UVnÇnk°VVLlkIJÇk¯V@knÆn@lznmlVkzVVVx@Uxz@x±¼VxxUlkb@¼ČkVXlĠkôV²wLUKlwJ@aIV¥Þn¯Ün@nkl²kÆ@°aVbnI@Ťn\"],encodeOffsets:[[110408,35815]]}},{type:\"Feature\",id:\"6105\",properties:{name:\"渭南市\",cp:[109.7864,35.0299],childNum:11},geometry:{type:\"Polygon\",coordinates:[\"@@@ÈôLxU°Þ@mÈnl¤nUôLwX`@ÞÝLUmLôôbVbnºlnÞ@ôx°LanVwÞ@Vxnwnlw²¤b°°bVnlXbó@bĠ@xb¦ŤVXġ£W¥ƽɽó@ýóƝÝ»£XmƅĊkU@ókťaĵÇ@aka¯UV»maUUabUxmKnkm@kmK@xó@¯n¯KÇ¦@ôÅèlxkx°nƾ¯KU¯WķL@VÝIUbyWbX¼Ç°\"],encodeOffsets:[[111589,35657]]}},{type:\"Feature\",id:\"6104\",properties:{name:\"咸阳市\",cp:[108.4131,34.8706],childNum:14},geometry:{type:\"Polygon\",coordinates:[\"@@IXyĊwlýKlXIVaķ»a£¯aVU@awÈōaL²»VUln°WÈ¯W»XazVaÞJ@U»@¯Ýbğwly@£kÑţ±WÑ@kaIUn@¯ómţUbU¯lÇIÝb@¤Ý@kV@zĊ@ĶnVV¤kVbmź¯z@°a¯J@¤@bUxb@`xUÔ±ºVXWUnUJLĢ¯ÈKlblmÈXŎ°U°LlkÞK@Èxl_°ĶUÒkbl\"],encodeOffsets:[[111229,36394]]}},{type:\"Feature\",id:\"6101\",properties:{name:\"西安市\",cp:[109.1162,34.2004],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@°²@mVVÈÈl¦m°xla@U¦°ÈV¤XbV°lXÞaÈJ°kVaŤVôn°@mVJlb@XÒŤ²lÒ@¤kzĠxÞa@°¼ĸK°XV°Lƽ¯mlwkwÆç@óÈ¥°L°mô@w@aÆK@b@wÝLyÅUÝÆ@ĉ¯¯UóxW¯x_ÝJmLUx¯bóak±mÝUUW¯ba»óóxƧçĉbaĉxIUV¯¥ō±wl\"],encodeOffsets:[[110206,34532]]}},{type:\"Feature\",id:\"6102\",properties:{name:\"铜川市\",cp:[109.0393,35.1947],childNum:2},geometry:{type:\"Polygon\",coordinates:[\"@@ÆxĸƨKlxÈXK@VWƨIlmV@wVUmUnmUalk@kVaUaóaónKVÞK@ÝW_xóKmVk£ÇmnÝ@¯VwóK@Ç¯XkmVU±¼KbÇŎx@bUV°b¤b¼ĸUb\"],encodeOffsets:[[111477,36192]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/shan_xi_2_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"1409\",properties:{name:\"忻州市\",cp:[112.4561,38.8971],childNum:14},geometry:{type:\"Polygon\",coordinates:[\"@@Vx@lnbn¦WlnnUm°²VVVVVnUnºlz@l@J@kXWVXl@La@KULlbnKlLnKLnKÆXn°bVV@bUVl°Un@LnaVJUbW@UX²l@ČwlVVIWnkÆa°anVKn°UW¯@aVUVk@Un@aV@ValwUanmWUk@WVUUanaVwnLVl°@nk@mVU@UVK@wLVKVU@K@UUKVUV@@bnLaVaôlIXmlKX_°KVV@bVV@zV`kblIVUlL@bnV@VĊllVlIXW@kaU²blKVnIlJalbXXlWVn°JnnL@l@XlJlaX@XW²@l_VmnKUblU@mnkVK¯@U@ma@kX¥VmakkLa@a@WIUUVXWWnk@a°a@kkm@kUUmJm@WUUUIk`m@VkaWWkXKmXk¯@WKLkak@±bw@aa@aka@ma¯@LKÇÅkKWbkmġ±ÅULUKVVkm¯LUVVbUwUW¯bmULxWJ@klmkUm@@KnwVkVK@akw@@a¯bKknVUIb¯mmbk@UbmKUL@xUU@klmLUlVXIVVVUVUU`mLXVWbXnW`Å²°xmxU@mĉwU@mbU@UmbkVW¦kJ@X@`¯Im@UlUVVnb@bWJXnmbJUUUUa@UamIkax@@x@b\"],\nencodeOffsets:[[113614,39657]]}},{type:\"Feature\",id:\"1411\",properties:{name:\"吕梁市\",cp:[111.3574,37.7325],childNum:13},geometry:{type:\"Polygon\",coordinates:[\"@@@a@w@wlbnJVb@VbVVVInaWmXI@aaUmVUVkn@°J@_W@lIX¥lUnaVV@naV@xĊnV@wn¯wÆ±X_WmXaWUnKV_VVUUUUWJkUVnKlk¯@@kmKUaÅ±KkU@WmI@WUIlUUmVwXw@UlUVwV@LnbW@anU@UaVkô@l»n@naJnUÈLVaÆUUVmVKV²L@mU_lK@UVWkUa@a@U¯aUaÑóÑUbKk@@ak¯mVaUwVÑkWUmK@UUKmXUWÝwUaLUU@aWJUUU@UaÝU@WL@VKVaVI@WnU@alIVK@kImIkJ@m@@@_K@x@kaW@U@Vmn@UK@mIJUXV¤XXWlkKkkK@XmJVakImJU@ó¯LWKUV@nUVLkxmKkLma@kXKmmLabLmK@V@mXVÆUxX@`nLaV@@VmLUVnLlLb@°²nx@bVUxlb@V¯bUV@zVXVĊXVx@lVn@VnnmU@LlJXVz¯VWVXbV@bmnVUVkÇþÅ@XVxmbUlVUlnW@Xl@VLXÒ@bÞJ°¦Lò@nUb@°X@XbmVUVnb@xx\"],encodeOffsets:[[113614,39657]]}},{type:\"Feature\",id:\"1410\",properties:{name:\"临汾市\",cp:[111.4783,36.1615],childNum:17},geometry:{type:\"Polygon\",coordinates:[\"@@nW@@UnLKabKnnWL@lnblKnLlwKVU@mVUXL°KôV@nIlJUbnI@WlLllLXkWWU£VWInJ@VL@nm@UVX@lb@@wL@`@n@V@lw@nVmVXWmwnUla@_lKwVlUn°xVKVXXWlUVVI@K@Kn°KwlVlU@kna@V_WnmUVm@kXml_@mLlKXw°m@_ôJVUV@Xl@UaV@Va°Ilk»VwUkVmwUmmVn@V¯@KUwmK@U¯wUVÝ@mJUnWK@@UnKVa_lykUmKÛnm@x@UUlwVkXW@a@U@@K@kIVnammVakUl@wX@@k¯@VVbml@°UbULmlVbnbÅK±VKVXUJWa@ULWaUU@@U@aWK@UkxUKLUUUJ±UkL@V±kk@kam@UV@l@LWl@n@VVUxLlUUx@VUVU@aIUlL@°mLUbkUUaWUUaUU@aWKLWJ@bUL@VUVVbU@m@a@kmKmnĉlUKXWUblbxmIkU@xWb@lkVxLXmzVV@bklVVUzm@bk@Vx@xlU@lUbVnl@Wxnl@n@UbVmLmb@`X@lUX@@xlnkLWaUJnnWVVn@l@bULVV@lV@XnJVX\"],encodeOffsets:[[113063,37784]]}},{type:\"Feature\",id:\"1407\",properties:{name:\"晋中市\",cp:[112.7747,37.37],childNum:11},geometry:{type:\"Polygon\",coordinates:[\"@@@lInJlJ@ULkJ@bmV@XUJUbL@UXKV@ÞVbV@VVXI@bVVKVbÞxVXnWVL@VnLVlXÒUVxUb°nl@bl@LVaôÒÒVb°b@VnLnnV@lmn@lbUV@JUVVXkl@lUzmJ@xXklbUnJVUbnUlbV@nlLX@lakV`Ub°@XVJnUL²KlxnI@KV@lbUbVVKnVl@zlm@U@nI@WUaVl@@mVU@XkW@nkVKV_Vwy@knwVa@XalU@Vnml@X@VLKVaÞbnnlJImVKnVVVInVlU@m@mXK@UmyUI@mWUUakamw@wUwmLkakwVmKw@wUam£y@am_W@UU@knmmamU@WUa@knw@UUUUV@nJm@mVUkKVUUUkKmwKULKUImV@lUnnm@mbUK@°bUnmbUmkkWUb@am@UXkK@a±@V@ĉÅVUXVxUVkLWl¯@@bULUlm@@nm`XlWakIkmVUbUL@Vm@kI@@Km@VaXI@W@aU@kUVU_KbJkkÇb@nkKmLwÅW@kVUUVU@WUIJmIXmma@_kyVaUUlkUm@kUx¯Lm@L@LUJUkVWXUWUL¯wVmUkxkL@`bkmVnxXUWUnm@kxU@\"],encodeOffsets:[[114087,37682]]}},{type:\"Feature\",id:\"1408\",properties:{name:\"运城市\",cp:[111.1487,35.2002],childNum:13},geometry:{type:\"Polygon\",coordinates:[\"@@VlnJwkaVaXWVLĊknmnLl@@bnV@UaVU@UVK@aXIKXL@bVVVbXVVblVaVnK@¯KVkJ@bVVU@UVwkVKVwUUm@@Xk@K@kVUn@lbl@²l@UlK²VVIVVKVLlw@VXL@b@VV@VXbVK@XbVIUWLU²ÆLmaUankVKVa¯@nkUaU°@n@@kWaUVaXUW@IXKVw@UWU@W@@UUU@mn@`m@UUULkUmJIU@@UK@U@anak_@wmKUwmakVkmKVk¯bw`kwUIÇx¯»ÇaÅmn@@mmUkV@wkKW@kxmLUkĉLÝkxÝw¯lóVUmV@ĀVVX¦W¤kz@`Vx°²ĸ@Ul@xêĸǊ°¤VVlXLWnXxmV@nUl@\"],encodeOffsets:[[113232,36597]]}},{type:\"Feature\",id:\"1402\",properties:{name:\"大同市\",cp:[113.7854,39.8035],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@²£yl@ČĖ@bĸĢbĸXaKŤnn@ŎôllÈxnVnÞÇV@bnXllL°KbVb@J@b@UxlKXLlKlXk@UlkJlkUVKXUÇVIVm@_nÇLalwVnU@UUwma@aaÝaLmUk@@W@U@@XwVWÝUUUk@@VmLKV»nwUwaUL@`mzJUIVUaUwKUaVIlJôanÑlLVUn@a@VV@@UUwVK°Vn_lJÆLéW@UUUÅ@»lm@aÞIVwXWUUkkm@U@aU@mwU£VWU_kWmXwW_°yUkkK@UÇK@kkUVymóKU@KWIbUak@mJ@bkbmLkUmkVUW¦@lnb@@V°ULml@nkVaVmLUnk`±@XWW@kbÇ¦X¯WxI@xmbmxXlWV@bÅUz@Jb@bÞbU@Wbk@xk@WX¯VÛWÝbÝUkVUU@alI@a@akLWam@U¯UUmÇL@K@aU@¯VUkKmX@`@kJ@nVUb@lbVÆXVWULU`VbkLUV@XWl@bXJ@VbV@Vl\"],encodeOffsets:[[115335,41209]]}},{type:\"Feature\",id:\"1404\",properties:{name:\"长治市\",cp:[112.8625,36.4746],childNum:12},geometry:{type:\"Polygon\",coordinates:[\"@@UkLky@IJVa@mÞaWy@_W@_WXVlUVw@nw°K@mUVamVkU@mmmnLVUmKXaU@IlKVUnK@UmWkX@WV_V@akU@aKWIXyIUVmUnUa@WaXUVKVmkUWVkULU@@VbKbIUm@mbVLxWUUkn±V¯wbÅJUbmLkbmKÅKbVnUbVKUbKUbmLKmbaKkUm@UnnVnxUVlUxl¼k¯JUbU@Vbk@WU@UVóI@`¯nWxkLK@nk`Wn@lUnVnmXU`@mb@lkV@VnklVVUblz@`nbWnnJIVJ@XUVVUV@lÆXxnKlL@maÈllIaLV`UlVV@@b@XJWUb@n@L@lJn@@UVKVaUlnlJXbkWn_@mn@VkVK@a°@XklKVUUwVWUĊÆ@U²@@blLVWn@@bVaXllVnnaVma@¯VLnan@mVm@knUVJ\"],encodeOffsets:[[116269,37637]]}},{type:\"Feature\",id:\"1406\",properties:{name:\"朔州市\",cp:[113.0713,39.6991],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@XXWVXVWnnlnn@èÆ¼@xlVnblVÈUVl@blnLÜĊmUkU@Ua@WI@aXk@WVUlKUaV_VKXWUUÅka@VaU@mlI@@_nWLVl°UV@@b@LÈKVn°V@VnXblK@b@bkJ@bVVlUÞVÞaXÜ°UXWl@wl@XaV@Ýa@aa@IVyÆ@aXUWknwna@wJXw°WÈ¥kI@W@kmKm¯IUmkXWWkabkImJUkL±aVb@lWXkJUkĉk@UmU@aKkVUkJlaU_y@UU@aUU¯LW`kLWnkJóbUbmK@aU@UVVL@VL@UVULK@xUL@VUV@nml¯@UkmKUxmbVbUV@XlXVmnVbkxUbU@bm@@VUlUVb°@VX¯m\"],encodeOffsets:[[114615,40562]]}},{type:\"Feature\",id:\"1405\",properties:{name:\"晋城市\",cp:[112.7856,35.6342],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@lVLbanLnKVaLVaLUVaUmaÆLnLlanKVaÆIa°x²UlmVVXwUKna@VnJaLa@UV@@alUkKVKnkmmVwUkw@@kxWUXW@@mk@aUa@a¯aLkKmwkUm@kL@K@aWIXmVXWkUVakL@UVKw@aUK@UUKmLU@¯nKUwVUIWJUWmka@UXJk@UkmW@kLWKVx@bmI@VUaVU@a¯@UUmVKmX@±`kÝKVxUL±akL@VbLkKmV@XWVUbVXb@lm@@lW@@xklVUbnnmbUlJ@@L@@Vb@WXUlkxVV@wn@ÜmnLlVkz`UbmL@V@XLmVnIÞ@VU°x@VnLxV@LU°\"],encodeOffsets:[[115223,36895]]}},{type:\"Feature\",id:\"1401\",properties:{name:\"太原市\",cp:[112.3352,37.9413],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@@VV@wVKnLVal@na°naVJUlmL°a@b@lx@bULUlmx@Ln@lVknl@XIwKVn°aVXVxUaVU°KnUlUVLKÆV²ĢlnXalLÈÆLKUaVkUanmWUa@WwkUWU¯y¯Ñ@anIl@@aVUmIymULUUVakaU@@LmJkw±LKmVUI@W¯VaU_lkbW@kK@mUkaVmVaUIVmalkW@wnIVy@klkWUUVI@UVkam@knU@mmmK@bblVUX@VkLV`@n±KUULUnVVÅUbÇKmVImbm@k¼ó@Ulb@VmV@bXmaK@UUxkVV@xWUxVnkVVJ@XnJ@XlV²LÆVbnL@l@°\"],encodeOffsets:[[114503,39134]]}},{type:\"Feature\",id:\"1403\",properties:{name:\"阳泉市\",cp:[113.4778,38.0951],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@°@nb@lb@bbb@x²al@lbKXU@mkUWkkmUUVwV@XUW@naVklKXblKnLnLVanImaXKlLaV@U@KUKWalXK@£WKXUV@VUUUVW_V@W@@K@UIWmXUmULnJkImmÝaUbLK@UWk@mnU@kVWb@Ubmx@lzUx`UULml@XWl@UV@nk@UVb@XJm@@Vknyk@zJnUV@bk@mJ@b°Ò°zXVlVXx@bXVmnVbUlVb\"],encodeOffsets:[[115864,39336]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/si_chuan_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"5133\",properties:{name:\"甘孜藏族自治州\",cp:[99.9207,31.0803],childNum:18},geometry:{type:\"Polygon\",coordinates:[\"@@aXam¯wm@±°wUwV@UaVw²KU@UU¥a@£ÞôxKnkmX¥IUÝUwlk°V@ÈKUwlkUyV¹mx²XllÑW»lw°UŎnJl¯°V@wôIVÇnnUllLVÇLô¼XW£@±@¥k_ÇJkUékwXa@Llw²Vxbm¼ÈxlLÈVWÞn¯mÇÑUÝlÛkwlĉmULmwUJç@wkm@ÑlUXÑôġVaUÑ¯@wķÓkbVmnU@@y¯IķKV@¹aé@kmÞU°¥@a¯@anKlblU¥@óğç@Çw@wklaçÝ±k¯±@ğÝUÛmÝ¯w@kb±¯akXWÜkXUÆÇU¤X_ƐwV@¤XUbUIUlÇUkġ@aXČmlUlèUV@mVk¦Vx@¦±¯¯¯anlW¯nÅw@w°KVak£m@klKknÇU»óKīlaUaV£@¯@ÆUVÛÝÇXÇlÓlŹ»WUğJ¯£mxLĵôºXVlUll²bllxónn°ÝU¼mJU¯nV@êĉ°Uĸw@m@¯kmXamÑ¯aUwÝKU¥mÅn¥Wmn¹n±ƑƆÇôXê±ǊnUôlĖkȂVÒ¯¼VnȮ¯ĀnƆĢ@k°V°¯ĢVlkVxm¼X²Ŏ@VxknWÜ°U¯nÆÝ@`ôÝ²ÒÇznmX@xè°K°ÅUČĬóĖÝó¼ÅêÒbmk@V@Òl@nĉÜêx@ĖmlÅJ¯¦óxȭ°Ým¯LĵèĀ@Æl°żX@xmkV@z@°blnÞ°J@bn@Æ¼UVUóóL°X°ÝLxUn°Ĭn@lnL@Æ@nKÆxnUnVInĬmÆnxŎ¼ĊIĢóÞ@ĊƨbUmV¥lkwnLmÅÆ¥XwU@wwUÞ@alUUÅUVkkm°aU°Ó°w°Ub°a²K¯ĕ@ÈbÞĊa»XVm°InĬk¼VbaJô£VĊankůnÜU@anKnĮbÈmÆ»nIé£Ġ\"],encodeOffsets:[[103073,33295]]}},{type:\"Feature\",id:\"5132\",properties:{name:\"阿坝藏族羌族自治州\",cp:[102.4805,32.4536],childNum:13},geometry:{type:\"Polygon\",coordinates:[\"@@l@@þ²I@lVL°wnJ°UĸŎèIlwV°¤nĮ¤ÝlèL@@xlè²ôĊ_ĊġVÈôJżīlbXÆÈVkxÇVn°¦Üb@è@nn@@°UÈ¥WÇ_Uala¯¯UÇk»mVwk»k²°VxlL@¤_@x`ÈĖöb@l²alXa@bnK°¦VK@nnWmx@nUnl@@llĉk°l°UXkmW@Un`kÇLWÛÈVxVVlVk@lIXb@ylXÈWĮWŤzy@mI²J@n°@VJ°aÅ@ŎkVÇkaUwKVwV@nkm@±ôkôĊJ¼InÑm±nIÞXÈĊxĊUÈbÜyÈ£Vkw@kVUVm@a»ÜbÈmUXwÝxUn¥@°ġÅaJVkaW¯Û@W¥UŏĶ@¯kUŃ@aI@mmanwÞW@mw°»Uřk¹±WxVx¯¦U°zţWw@°ÇVÑk¯@y°a£@mnl¼aÝÝakwU±aĉImlĵn@m@kkV¯Ñmĸ°xl@XVÞmlÛÝĉUÅ¥mwÅ¥VaUwXġċaVůÛŹlwU¯Uó±xÛV±¯¯n¯mċLmnĊm@_kJWaXmwUĉK»@mwXÝUÇkKÇw»naUw±kxK@WbxlVêlÈIl`@¦@²X¤Wó»KUÈKkkmVmUÈóJ@x¯Uk°Imō¯VxkX¼Òkk±WwnUºVzklVxLÇ@¯UklVxÞVJW¦nmlLówÝ@¤b¦V@VV±LUxVbU@Vx¯x@²n°xnWbb\"],encodeOffsets:[[103073,33295]]}},{type:\"Feature\",id:\"5134\",properties:{name:\"凉山彝族自治州\",cp:[101.9641,27.6746],childNum:17},geometry:{type:\"Polygon\",coordinates:[\"@@ĶóKnw°¤ĠIXV¼kźÔkÈWÞÈÜUVÅ°@@U¤VbkbĬôL¼ÈVlmLlkn@l¤Ub¯L@xÆx°mXmk°b°°²@¥Uwl¥nU@VUkçVnkWċbĢ@lÈVVkJVaVW@£UƏxW`£ÈVVÅlWXÛlW°b²la@°xnÞVÜĠÞ²@l°Þ²èkbl@xÈx@Ġènal£nUÇ²@ÞKnn¤@¼°U¼nVXUbnĠUVbUlV°LX@lVèÜUnK@_yXVyUwmIU»VkÇ¥ÿkkV¯m±n@n¯ÜanVVÆz@bwÜbm@wa@kmk»@a@VUUów@nb°mXmnVbÞVôanwJak£lwLÅnÝ@wl¥IÇÓ@UL¼kVÇÅó¯kVmmw@n_Vn»°LÅ»@éÇçŹīVÇÝ@ÝğUaVÝ¯ķlŭġl@óÞÛċ@¯nkUÓm±IVġUwóKUn±¯Kw»KÝVnl@óxUwţ£ĉUmÅÇÝKÝUlmK£UV@ÞÈW¦Ò@Ĭnny@nÒmV¼@°Vbl@VlnUUwl°a@@llnk°lbnKWĀnUVxU²Åm¦ÛÇÅaUVb@¦m`móXUmmxÅ@±Þnè²U¯»mVm@wU@wÝÝmLa@VÇUkl°¯VlkV¦UmxaULUèVx@kIUxmWV¼¯VmÈ¯UnlÈ@m»ÅVWxÅbÅğW@km@kVV¦mlnn@ōl¦ÅÆxk\"],encodeOffsets:[[102466,28756]]}},{type:\"Feature\",id:\"5107\",properties:{name:\"绵阳市\",cp:[104.7327,31.8713],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@ńlV°@ŐĵVX»ÆUĊÑJw@È»m»£°Kk@ÇnÑÆ@w°JUwnw@wbVb@VlźLUwa»aUklyUUVakwWXwWUxkLmn¥mwkUXlJw@aIk°X¥W²l¥aUIlmkklÈL@m°nlWUaW@V@UaV¥@ak@Çk¹K@aK@kKkÇX@VU@kx±VèkIWwUVUkkKÇ@a@wkml¯@kUWn£WaaVwnaVÝw¯@UaWxnJÅUxUma@L@mbUU±VVnkxUÆVm@kkKW°X@¤ÇUkÆÇnU¦¯kmLVwÅK@UóbÇÆV¦L@±êX¦mVÞkÜÝnWU@k¯wķn°ÒUlln@@ĶmnkĊJ²bVlxÞbÞbk»mn@¤¯bz@l°UÒ¯È@xŤXyV¯°¥Uww²XlºVŚ¯¼nx@XÝmxnb@nJ@b\"],encodeOffsets:[[106448,33694]]}},{type:\"Feature\",id:\"5117\",properties:{name:\"达州市\",cp:[107.6111,31.333],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@Uxn°bnlUnÒÆnn@n¤LnxlUV@Ælx°XXxl`XVWLè±nÈb°b@²x°KÜ¼°ĉV¦lJnU@¦ÞJÞğmLÞ»xUlbVÆannalVÆX@lnŎVmUmaÅXa@aWm@£@wĉJVkkkkmnk@mna@alKJ@ÞwmÅÅ@ambkU@KUġKU@mak¯±a@aĉÑÅaVwXlw±V¥l@@ak@@£mĉÝónWV@nÝÇÇxUmbaVkkk@m@m°ÝýXmakÅī@@mb@@xmnb@mxkWL@¯b@WUXmWWKkbm@kxXmm@LUlxlêóKnUallLlLó°m¯JVUK@xK²Āô¦l°\"],encodeOffsets:[[109519,31917]]}},{type:\"Feature\",id:\"5108\",properties:{name:\"广元市\",cp:[105.6885,32.2284],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@ÆLĊx°»Ŧ¦WLÈ@xÞKÜ°ÞnVxÅĀlÒnJ°a@wV¯l@XWknKnwVÈ°XXalX°VI°bWna¥@w°n@yÆ@nkÞ@°¯lJn°IÈlUlXÅ@ķlUV¥VUUÝÞUU@UwJUkĉm@ýlkWUwVwWJk@VUKlUkaVUmLkm@@UIk`@UmlUkV¯ÇXKÝ_mm¯@U`kwml¼±KV¯¯Vk±Vk±kzmaKUnÇ±bk¦±X¦¯WlJ@bxkIWVlxnm¦nlKVwXWxXlxUbVVkzVlb¼bVxŹKUk@Uaa@xmxVx¯Ix@ÅmÒ@Èl¯L¤n¼\"],encodeOffsets:[[107146,33452]]}},{type:\"Feature\",id:\"5118\",properties:{name:\"雅安市\",cp:[102.6672,29.8938],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@ln@xèVInxVKnĊklxkÜVÞÒnÈm°nx@¼ĊLVnxWXblI`@nmĉnKČôÅlUÑmUK²¹@ÇÅVÓÅ¯VýÞWUVmXÆbnwKUÿ@UmmIUb¯¥Uw¯ÇmçmanUm»UUlk¤a¯bVU_WĕmÇÅ±ĢUlUlÛVçkU@W¯KUVkUağVmaVWUmV»¯@»m£mÝL±@ÈmVk¤mb@ô¦kVkamL@b°@b¯¦ÝVn@lêb@ºUĸL°J@zV@nmUlaĸÔ@x°VÒUbóĢÒWkV@Ò\"],encodeOffsets:[[104727,30797]]}},{type:\"Feature\",id:\"5115\",properties:{name:\"宜宾市\",cp:[104.6558,28.548],childNum:10},geometry:{type:\"Polygon\",coordinates:[\"@@VlÈnlXnWLX`m²nV@b°xĢçlnVmnn@@°UzlV°nÞÒkxlw`UnVbmL@albÞKÈÛmÜ¼°@XÇ@wmW@ÅKĊLlVLVŎçÞL²±ğkw@Uy@¹lKXlKVa@wČ@w@aÇU¯n@@wġakaōK@Å»VakUWmķwkbğ¥mLak@ġÞ°¯xVVÞ@VxVVWxXlxU@k²WVÅULmèULVĊklĠVJVx±nÅ¯¦mwğ@mlğkkl±@kUk@¯±ÇKkxl¤bImx\"],encodeOffsets:[[106099,29279]]}},{type:\"Feature\",id:\"5111\",properties:{name:\"乐山市\",cp:[103.5791,29.1742],childNum:9},geometry:{type:\"Polygon\",coordinates:[\"@@kVkÆkV²UlºÈIlxLXèÜlUXUmkbVèx°@@¼°Knnn@mÆIUbnJ@bVI°b°±@nK@mVakkKl¯nbmĸèl@VnÈlUUwwmwnm°¥LlLnU@VaImbkmKnk@mbLVJVUUVnkVmb@a¯JUaÆkk¥IW¥KlwÑmÝU¯kVy¯@@mmnUkmġè¯w@aU±mnW_XKWmkÇmUkóbUÝUanmW¯nma@xVôUV@b@l¼n@lb@xnÛaxa@yUÅmUÛbm°@mn²U°llĀÈ¦lUV¼nJVxUzWz@`mL\"],encodeOffsets:[[105480,29993]]}},{type:\"Feature\",id:\"5113\",properties:{name:\"南充市\",cp:[106.2048,31.1517],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@È²VmLnblyl²²UUl°U°²L»knlx_V°@nnÞ`WL°ÈUVlnkV@l_JV@n@lnKV£ÇUV¯m@laXUUbVx@VkôJU°Jn@wUk°wnUV_nJmknmm¯Vwk¯ó¥±ÿL@wLVUkUbX¯mykI@a±Kk¦ULmaXVm¯Kz±klUIVbÇJkL¯lUÿUlUkJUmUUkVVklKk@@aU@J²x¦kĬ@¼±ºXnWbxU@xx@lL@bLlº@Èl@bU¦Vb@U@XbVkX¯m@nÇKkllknJV\"],encodeOffsets:[[107989,32282]]}},{type:\"Feature\",id:\"5119\",properties:{name:\"巴中市\",cp:[107.0618,31.9977],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@VUlbkVVLUl@XIUxVxXkl@þĊnVlIVx@VVÝVÞUVU¦kV@ĸWÆô²@VÞn@Vaôb²W@K@XUmÑUW°¯°Ina@y_lWn¼lLUbô¼Kla@nkUyôÆx°@n£Ý@¥mVkIU¥Ċ¯Û»¯L±w@¯aÇa²mçKXUWk_Ww¯WwÅk@UkVmwK£@mmmÅmÑkVmamnnlmIU`Vm¯xVlx@m¯IVóIUl@UwVaVWkb@nU°VÈU¤\"],encodeOffsets:[[108957,32569]]}},{type:\"Feature\",id:\"5105\",properties:{name:\"泸州市\",cp:[105.4578,28.493],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@VVXwVKnwnVnl@b¯xmKUbVn°°X°@blLènV@Vnl@ULnmmUnaVV_ĶV@wnJl@@kkKVólaUwnJmwUlm@aUaôKVnJWbÞ@VwVLX¥VV_Þ`wWÞŹmmnIn¥W@kWV¯@°kILk¼Ç@k¤±XknmÝ¯UlÅÛKWV¯klUwkLÓ@U@w@ġXVWX@UbVbV_kÇVlU°lnwŎ¦ÞaÆ¯nmm¯Um¥nkVmkl_ó¥¯UÇl¯@Lk`¯ķLUy¯@mw¼ķ°ġ_ÅU°mlnÇVUÞ@_JUnVUXblĢb@x@mV°Èb@xċ@@xUbkLWkL@ºzV@lxĠ±²\"],encodeOffsets:[[107674,29639]]}},{type:\"Feature\",id:\"5101\",properties:{name:\"成都市\",cp:[103.9526,30.7617],childNum:11},geometry:{type:\"Polygon\",coordinates:[\"@@°n°m²°ÜUw²ôV°VkxÜźUŰČbĢlaÈL»@kwVÇ@nÛÆ»ÈUÝ°Kl_V°U`Vbn@VbÈLaVU@ƨ»VnIlUUa±lIk±@VnKmÅ@WaK¦lVōkKÝ@maXÇmw¯IU@kVwUmVIçÿU±Å@¯È@xK@wLUbÇKÅ@mÝ£@yóUóóUxkI@WlIUabaVĀLmxÅaWUnVÝXUþÆ°UÔÈÆ@±ºLnVVÒkóÆ\"],encodeOffsets:[[105492,31534]]}},{type:\"Feature\",id:\"5120\",properties:{name:\"资阳市\",cp:[104.9744,30.1575],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@èUJVnxU@lV°JnxWÈnbÞ@lLŎUk¥LXbÆ@nmLU@zlbXmlnVynLçJVbUnómUnamUan¥lKV_²aValWôn@nbVK°¯VblW@kklUnlV£°W@wUXk°KVwmVkwVyVI@wkmVÅ_Umm@Uÿmbk£xUaVw±V¼V¤kLWxU@UkbyXóm°V@@zÝÒkKn±U@@_VVkÇaVwnLWalm@@kkVVl¦kIV`±n@wKk²aVUUV¤nkxmUkVWVnLUbVb`kUUmLUmX@`ÅbÇXbWLXn\"],encodeOffsets:[[106695,31062]]}},{type:\"Feature\",id:\"5104\",properties:{name:\"攀枝花市\",cp:[101.6895,26.7133],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@bKÞnÞ@xV@xnUn°¼V±mç²ÝÆ@wnnVWnôn_@¥UaVbÆÈÜn¥Æ±VUwVmXÿmLkal¯km@k@¯bkVxmVUkk@Ua@¯»UnmÑ@mzm@īÑX¥Ç@ÝxU¦ÅÇUkx@lbUWVXmV@xĵĖ±@@¯xUÆLnÆmx@nXL±lUUVwKWak@WxkbÞĉbUn@@@xó¦Ŏ\"],encodeOffsets:[[103602,27816]]}},{type:\"Feature\",id:\"5114\",properties:{name:\"眉山市\",cp:[103.8098,30.0146],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@Vx°¦VanJVn@baVbkJ@XlJVwôôôV@zÞ¤@nÆÈLVaK@xL@w°ÇÆ@²VĀmWXKWaÈÆa@_nWVnKVlV_UaVamKXUWwnmmwÑm£@ynUkWĉUkWVkkV±çkJmkKK¯¦mnnxxVxVÇkUmk@çķnmak°LllUb@nmL@¯²¯aUJ@amIVaÅJnm@mm¯L@»¯@wUçanlVWVÛkWçKkwÇJk¹±VUÅlġV²ÈÆnXĖV`U°ab£lkVVn¼mVnbèÈn°\"],encodeOffsets:[[105683,30685]]}},{type:\"Feature\",id:\"5116\",properties:{name:\"广安市\",cp:[106.6333,30.4376],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@VlIVkVĀVk°lKÈIUaVJlk²yLn°UWnbVKl¥²L@blJnzW°alV°Inô¯KkKkkbVmôLkéwVk@KnnWlwn@laXLnXVW@X°a@XKlnw@man@w@na@@wĕġġwUkUWb@mk@¦¥mUÛb±yÅn@bml@kV@lknVbmVnlmbÇk¯bWyk@V_UamJ@I@WaVXamIVWkUkbVaUUx@VnkVU¼bkKUxmK@WxnV@n\"],encodeOffsets:[[108518,31208]]}},{type:\"Feature\",id:\"5106\",properties:{name:\"德阳市\",cp:[104.48,31.1133],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@nUW¥²é@K¥UÈÅôa@VÆLUxnKl°V¥ÈmlÅÈV@£WX¯lLln@UVÅlwUm²UVVna@@KnbVVwÆImXwWkIVwÝĕVUaIèmKUzkmWnka@y@l²kJ²VbVkmJUƧ¼@UVbÇKUam@Ua_¯VUk`¯LVÞÇÅ¼mÜ@UÈx@l¼ÇKkbWVxUbÆ¦nxÆ¦ĊV\"],encodeOffsets:[[106594,32457]]}},{type:\"Feature\",id:\"5110\",properties:{name:\"内江市\",cp:[104.8535,29.6136],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@²èlUUllXĊVXlmV@zn¤ÒnxmnXxlUnVlwmU£VVUbl±L@x²mU_lJ¥UklU@ln@kXbmKUxÈblUU@`V@²mlLÞÑ@yU@¯ônWzaVlV@XwlKU£»aVaUwm@mwUVUwklVÇ²LlKVm_@ykUm@mUçkKmxkIUÝ@LUJ@n±kºLXb¼@mmIXa@mamnkWKUx_U`UklwUwmUbV²akbmkn@`UmÒVxUbI`UaÝÈ\"],encodeOffsets:[[106774,30342]]}},{type:\"Feature\",id:\"5109\",properties:{name:\"遂宁市\",cp:[105.5347,30.6683],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@ÞĖUxlJXVb°@xUÞmbUxbXbm¤VX@lk°ln@xbÈ@lLVlVUXxlJç²UlwV@@UÈWlLw@wVwXaWm²¹@»lī¥w±I@V@bl@kLUllUVVn@mmUwXċbVb@VUkbmamW@ka@k@laUa@¯b@mmwó@@lkXUa¯°LUamm@ókXUb±bU`kLm¦bnVmbnVmô\"],encodeOffsets:[[107595,31270]]}},{type:\"Feature\",id:\"5103\",properties:{name:\"自贡市\",cp:[104.6667,29.2786],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@lIÞÇbV_JVaUwnÑV@_lmnlab±UVanVxkxVlV_`wVLlXnmnb@WbnJ@n»WaKl¹²@mVI@KÞVlJnw@aW¯¯¯UmVanL°w@akmmUxmULWxUUÝKōèUKUkĉKL@ÆnX@xWÈ¯@Û»nÇÜÝLka@bKnUaVm_xkLX¦Jl¦ÅlVb°I@bnaUmlUVUVIUKa@nmlnLlnaJUbV@\"],encodeOffsets:[[106752,30347]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/tai_wan_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"7100\",properties:{name:\"台湾\",cp:[121.0295,23.6082],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@\\\\s@pS}aekgKSuSsMß`¡CqZ·be@Q^o@gieMp]}}Ľc_Kk{ùA¡r[uom@ÑĥJiq©mŉq¯Bq]ÙYgSåk_gwU­isTEĕiqiUEkue_OSsZaWKo¡­qycY£w}ĩĕS§Z©SN¥SyLÑ¡±Ks^IYPdY[UoFp}´\\\\¬\\\\j]eÜò¤¡ā a\\\\bnUãº¹Ìs¼j®[cíȈEĝĆ`ļf¶®K|VØDdKGpVnUFjpHF`B[pMºxÖjbpÎxp¬|ÎŸÜÒC²®ÜApZG~dÞàV¨|¸`|²tx~\\\\~|dFf^zGĄŚhdL\\\\hĸ¼OªP®lV`p\\\\]Xpllæ¤CpQ|oF}fMRiNSon_²qämMNM\\\\\"],encodeOffsets:[[124853,25650]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/tian_jin_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"120225\",properties:{name:\"蓟县\",cp:[117.4672,40.004],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@EUDAEI@WNMNCBFAHFFNACDJDPBD@@GD@DIFFHEFGDBDEQOFG@EI_KG@OcJQM]RMEKBGPG@[LaCIICBWKCEEG@WBQHCDFD@HSLEJI@IHWECFGAAEKCGDBFCBSBIDCKKHEADMJMFABKOKEQAA@IEEG@GIQAEK@OZEESMOLlu@SLUTYFQCMG@@SQUAYKAACA@IB@BDB@B@DC@@BGAEFAA@BEGKJCC@AGAIHA@@JC@QEIP@@A@EGIDC@O@C@@@@CJCWKABFLBBEBSQGBAAMIEM@AKBcJEN@BEBCFMAEFEF@J@BG@BFABECKFG@AFQ@@F@BEB@@A@@AAAKAE@GFGDECEFEECBKIKDELDFEDYH@EIACDCHKBEB@BAAC@ADBHABKJIAIJICEDGDCD@@A@A@DHCHJHDFEFGBKRKBGIK@GIMHSBCH_BOJECCJCFKKMD@DNJEDEGC@OJCJHRUL@HRJ@H[DCNKDZHCTFDHCFFKR`TANVDFZRDLFARB@HPAPG`ILAR@TERNDFNHDLCLDDCXDYbHF@FEB@LDDVE@JPNfXPINCVDJJD@NJPAJHLXHDNANHhB@DPNLRMTBFRBHHr@`NBFEBOCCBIAQJDHCHLHFA@HSDCRLFTB@HEFLNF@PELBDJALFLTC@EPFLLP@tUHQJDfIHGTB^JTCPDLKAIBATFPADIEGECEMJ@JIAIHGECFEAGDI\\\\SPOXAFCL@BQTQBBTMZECYGAHA@GJAE@HCAEME@IECFKJADDBABLTHHG@ILEAMNDJCDHEBF@@JNFJELDFKTOT@JETBFFHBHEHKI@@IJEJ@XKEOUMS@AF@CEB\"],encodeOffsets:[[120575,41009]]}},{type:\"Feature\",id:\"120114\",properties:{name:\"武清区\",cp:[117.0621,39.4121],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@FWôµ@IFCLIB@EHNBp]AGEAKAEDMGZKFGBGME@ILGP@HEFB@BXMEAHUGC@IHCLOD@X[NWHWPKAEF[@EKIOL@EKGBNMJ@EIEHKBIC@BAKMIACCFQZCF]DB@ERAKADIHGEIBCGIIECFaGLZO@EFCNGAGDGAKL@BMG@IE@ADSDEH[JGC@CGA@BMDeK@EIACFE@@GG@FIAMM@CCGC@EM@ADE@CFMAAGHBDKIEAJG@DOGCDEKAGIS@KFCHKAEHIE]BeKNO[IFIOELC@A]GMBKVYCDDgGAICARc@MW@AQE@DGI@@AQ@@BKBAIQQYEFW@CEADIGGBCEIiMEMF_LGEKMBBDWEBGRC@E_CHYGCH_IAED@FFBQh@FGJaJ}AHRAREF@bE\\\\C@CT`FHC@\\\\BBF@BID@HGDDJ@@FAHKBARECKDAZBJIVNHCTA@EREAMLHDAFFBVFFC@RNRETHD@FOJMACH@CAB@P@DF@@FGDWE@FFSIEMKQDYCCHKb^JADOCIDGNDBdBCFJB@EC\\\\A@BJEA@JAAAD@HHD@LFBCFF@BERDHNhZQHMBGHOACCEBWEGD@PSJKCGEUD@CINLFGHE@AJK@HDABBHTB@F`DBFLBBHEDARCFG@ABJBAPVFE^FBGLGCFG_BMLEXGAAFE@@JNRVJHFALFBEHQJCTbNDHCF@PlFLJSXCHFHfVBTNJ\\\\BPJXC^FAVNFCHFB@FFH@JF@\\\\ABCFD\\\\BDMCAAJKQBGAILOEGHILECQLWFENJHADC@QxNHFJNLDFA@CBA@DUÂmR@FBL@BD\"],encodeOffsets:[[119959,40574]]}},{type:\"Feature\",id:\"120115\",properties:{name:\"宝坻区\",cp:[117.4274,39.5913],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@TZbB@JHD@DODCLM@AP@LL@BNH@ETFN@`E@DNG@CHLBCJA@AICFKDDBKA@\\\\N@AFNAGRBFjFFFL@DHLBLFQPcXAZMJ]GAVHAIZJFNE@JpDRRDCLFDGXA@EFF@CFFPDfEBDB@DCHCFCJDJIJBLI@I@CB@@ADBB@FALADGDC@@H@BB@FZGFCCE@@FMLALJDAFFFEFDFCB@@AHCF@L@@BBB@BB@FC@E@@R@BEL@HEFD@G@AH@AIB@@@FEFEBALDDEFAFO^IF@JCBBFPNJJ@D@PRDCEKBAXL@BIFD@T@JE@BHHJORFDI@@B@JGH@@B@BDDLIFFHCD@D@DEE@BAAAB@DAF@B@H@NGLJLMRDNMfGIEPMI@GDAKK@KIDIJ@GE@CFDN@FE@GFEPGV@TCDFKHBBF@RW@DD@@ID@TJFKIKLI@EP@IGBCLAEKLEN@KSHIGYACSD@SEAMBBMGEBMQBCMIGKFB[D@HDLPHDBC@IFITDLG@IIIFGVBNJDLN@VIRI@YIAIHIC@CLKZCBEE@JECEIHEAKGDGECBGEEM@@DA@CCCBBEGA[GEDBBoNAAH]MKiIAWKQoIIPMFQAEEDMH@FMSUYIeF@EK@BIOEKJEBICFKaKPFAFSE@LWCCFMHDDEKESBOGBKIEIODLG@CCDEQCEDWEMDIEIB@EHGEEDAEAa@@HqDEJGF[AECCFa@WCEIKAAEQB@FCAE^YDERDDJBLNABD@AJGLJF@FNIAMLH@FPKLJ@FE\\\\BFOLGXMXW\\\\C@KPGD@JHDGVFBWN@AEAGFO@KH@JNFAHEHYLNHFCLBFBBHo^MAFGA@KJED@Jó¶EX\"],encodeOffsets:[[119959,40574]]}},{type:\"Feature\",id:\"120223\",properties:{name:\"静海县\",cp:[116.9824,38.8312],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@NGFMDATCNDR@CCbINEHNJA@C\\\\EEGVE@IhE[wepc¢·²^QEKIEKIgiQDkehY£uSDBMkUDOJDHC@GF@CAFBFEN@CQ@BeP@@G@HD@@MHQKi@[IGCOCESE@GMA_OcCGDu`a@VZzKDkJBLNXGDqKEWE@cFEFA@ISIi@@KMABJGBcMuFEzGVH\\\\ATSEUBeALCEMG@CEBUHUCGXaBPtUBBFIBFTDFF@DDKBFNGBJPHXDDMDCLJ^mBIHIL@LR\\\\@LCR[@@z@NFD@LLBNb@RHDBNTPT\\\\F@BJF@BXCFBHHBDLFB@HODADE@@JHVXCPDHCFTLBBFNCDCCCU@@GAABEHHZHBCAEdEjFDD@GfD@DXFCHF@ERFDLBH@\"],encodeOffsets:[[119688,40010]]}},{type:\"Feature\",id:\"120221\",properties:{name:\"宁河县\",cp:[117.6801,39.3853],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@BFLBFJXDb@DEFD\\\\BHEFIrC@Gb@FBCBFFGH@FJAJFNCXFFCRDCFDDH@CKJPJFALPHTALFCFGCENDDKXF@ETEBObLELJDFALIPFAJL@@FfEZJTVENG@CNFFRBNEJOpJLRBXjJNLG^BBpMAAFC\\\\HHBAFDADDB@@CN@FFAHFDCHLHFBJGFCFUNKJJTD\\\\XUXF\\\\^F@DDDQXXBRLRCBDFEVCDLVDpUl@LEDJHAPRFGL@CETGPBTCDDVI@CFF@GFDCCVGLKEK[Y@MECISG@BKNSCGCKWEAaEBEKNGFSECO@GGM@GYI@DÅCMLHPTF@DJHAVVNKEGDETJ^[TJNNd@NOAMFYJ@@GFANDPEJB^aOadSTQSI@MHBDIEOKCG@EEFCKCqXO@@DMFENCDDHCCGJ]AKFoDaGGHYFDHKJiCMFGC@EQ@AEHGAC@IEAATKOHGIC@IXIFEoGE[JCFCDHNmRADFZMF[EEBMO{GU@AOW@@]ZeHBDEHBKEfQkuIWBs@EC@d[@[^EDMTKCEEcI@cDAB@FCBCACmOCG{PYHeBgPwPFDDALFFFCHQGSD@BHFAR[TaFYXMASUiGFL@DQNCJI@@D@PLDN`ETEFIGMCGBCE~CAIFDPEHGEQPHJADFJGHCJLB\"],encodeOffsets:[[120145,40295]]}},{type:\"Feature\",id:\"120109\",properties:{name:\"大港区\",cp:[117.3875,38.757],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@JFFL°_`ONJKDDFIFZN xlb~yFVNRrdJGzDPVFBCTNND\\\\UR@E`F@@Ip@IWGUoawOEE@ÏDgK{İEEMFëCb@KwOCDHHKBDJCDEEEAGHOABFABMCgDLSQ@CFEBMgYIDQINE@AUSwSAdYEHQMEyK[KI@GRMLE@@OqOoBOnpJ@BmEAFHL^FDB[C@BBDVFAHFJENB@sNEjQAMYsUgCSBGDJH@\\\\LjGR@NC@@G@HO@AfR@DM@EFEADBE@@HGDICCPlVANTC¤vgZlfRChjLJ\"],encodeOffsets:[[120065,39771]]}},{type:\"Feature\",id:\"120107\",properties:{name:\"塘沽区\",cp:[117.6801,38.9987],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@|ODHnPBDADEDA@CB@ddJFFLDNSFC\\\\]\\\\@@cFD@nACOMW@M@ITURBRZNHNWRQoOj½fcqAqeiDÿÍyÓįFL|Ch@ÐFFxPpbHVJXo@@JCTR^BPABQA]^MB@bE@@FQBFVJRH@FXtPNZSBAja@@NDTLJrQTHFXZFB`\"],encodeOffsets:[[120391,40118]]}},{type:\"Feature\",id:\"120111\",properties:{name:\"西青区\",cp:[117.1829,39.0022],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@@LHAHRHATh`LHNHDG`HDGZ`D@FQDAHXFACNAFLVRTBFOfHDCVBFQH@HSXHEPFB@LDBF[bDbLFKJBFLADBDjLvCPEI]FGEIGCBEUSjcFiBIVWfaHCjN^HtwBBFGPBJGjFBEGECGDONMFAP]TDHQOWCMGAMHKIJEIGQ]aDlUG]VGEGDC{PEbBZmE@@GH@BCA@FMQCFMYMJECELCMI_P¯`]R±¡¸odfx\\\\gF@JUFFH[F@DIBGMMFaJDDQ@MCSDCBENMH\"],encodeOffsets:[[119688,40010]]}},{type:\"Feature\",id:\"120113\",properties:{name:\"北辰区\",cp:[117.1761,39.2548],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@ROHFFGCOJEDB}DFHANDJHFEFSM_KC@O@CJ@DIRM@CEKKALFKACHoLSJSIBETDJaEIIE]E]K[MYUYQILC@GF[MGNKEK@A@BCWECAIFEFYAGFOMI[OFuDiKACBCEKIAELaKaCE\\\\CA@KEAFOWGGTG@ERUACDeGEPSAUQKHE`FNjNFJADHHCJFB@DEXZFRRBJLA@AR@@BJ@CHF@BRX@@NQdDBBJhHCCZDLUNA^H@BKDPFEJ\\\\JMPfL^AJFFGLBDGLET@HJLBCFHDCPH@BIJFCLGABHNBDEF@BCN@@FHDDDN@BNEJH@@HF@DEJB@FfLNC@AHB@DHD\\\\IFGTCBCF@@JNH@ALKHBHCHBDMFEP@KYbHDEJF\"],encodeOffsets:[[120139,40273]]}},{type:\"Feature\",id:\"120110\",properties:{name:\"东丽区\",cp:[117.4013,39.1223],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@ZV\\\\N^L^FJFFJIbSCAFTJTIpKDGLBEKLBjHTVNBZWbE\\\\SBQGE@ATCRHDGEEKECBECxOhOfAZGA_YEEWSGqRKISC@Mb@BiTAMYsOEWG@IQEURA@EF@@acUOXQRYCUDCHDTEF[SUEgAYDcVGJM`iAWDWLQRMHUHgDsDBLHJFCFDFGHBFFVEAGHCJN@RJFPIhBD\\\\FENCPWA@LFBAFHBEJUEARCDIAEDQBRNa^\"],encodeOffsets:[[120048,40134]]}},{type:\"Feature\",id:\"120108\",properties:{name:\"汉沽区\",cp:[117.8888,39.2191],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@LMEI\\\\MTABKN@FCDMH@COAcH[AoēAM¡Wa[MeqpQRMXMGQYQASV@J@NNXDPmBAtJXlveRLFGACFGAYf@^X@BPV@|HNPFA\\\\FNEEYBCnQGMDCDE\\\\IHFpEFWJ@JJDGHLPBSFB@JBDGHBFR@@FHDNEjDLICGZEHGbHpCLE^BHIDDCGDCFMNE@CP@rWLDEDFFH@\"],encodeOffsets:[[120859,40235]]}},{type:\"Feature\",id:\"120112\",properties:{name:\"津南区\",cp:[117.3958,38.9603],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@TLv@CNHFFBHGZFETNPhCVGNGRQXKXCjBN_HIdUZChBVF\\\\TFECSDGVCZDRQPWdVNA^]RBBAAOQ]DSE@F_Q@[VMCSMADUECOHycIqMQEU}zkawENRDENB@ADG@@HF@YnaAOF|CDFHUHH^kVbCR^JHIFLJNGHBDNPXGRSCO^EBMNCPDHHFAFiEIHOAEH\"],encodeOffsets:[[120045,39982]]}},{type:\"Feature\",id:\"120103\",properties:{name:\"河西区\",cp:[117.2365,39.0804],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@d@hZNFdcLYXKRCtCMOFSYEGHEAGEDMu@SKAAsx]GMTGt\"],encodeOffsets:[[119992,40041]]}},{type:\"Feature\",id:\"120102\",properties:{name:\"河东区\",cp:[117.2571,39.1209],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@ZBVFFIGABEEA@KXBDOFM[EACJgOIE@QIMGDBHUFEEGAEHECEDGIAKQDWLKZcdQPEP@FOFBJTJ@HNORJf@DBCN\"],encodeOffsets:[[120063,40098]]}},{type:\"Feature\",id:\"120104\",properties:{name:\"南开区\",cp:[117.1527,39.1065],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@NMVDCG\\\\E^B@HlB@YEDS@CHsNSiMGDebUXAJEjidVTAFHDFJ\"],encodeOffsets:[[119940,40093]]}},{type:\"Feature\",id:\"120105\",properties:{name:\"河北区\",cp:[117.2145,39.1615],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@DBXFADB@L@LFHM\\\\NHED@JKZRb]QMRAFCJBDCBQYADMCAe@QIMP@GSIAIPE@E[EGH@ZEF]^HJAXK@KF\"],encodeOffsets:[[119980,40125]]}},{type:\"Feature\",id:\"120106\",properties:{name:\"红桥区\",cp:[117.1596,39.1663],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@J\\\\PNHEZBFEJELEL@BWGI^]FEkA@G]A[FDHUCMNEHJ^\"],encodeOffsets:[[119942,40112]]}},{type:\"Feature\",id:\"120101\",properties:{name:\"和平区\",cp:[117.2008,39.1189],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@DT@FCHG\\\\FFOROMEgYc@\"],encodeOffsets:[[119992,40041]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/world_geo\",[],function(){return{type:\"FeatureCollection\",offset:{x:170,y:90},features:[{type:\"Feature\",id:\"AFG\",properties:{name:\"Afghanistan\"},geometry:{type:\"Polygon\",coordinates:[\"@@ࡪ͇وŐǬϠڐŶӂʮǚڦ۾ǌƀ̚ІɣʪҴMوǯʲĹ،˒˰ǋ˖ϪԈiżŬĘͺβ̈Ҕȏĝʱʪ¡ý۷ͪ˟̊ǰώĊԼϖׂ×ࢀAƬʋӧĥяƹ७ĭࣗǭӫλȤΣĪллΛ͑ɳ̡ߛͦ։՗ɅΥԕ²ԋ͡ɿ̳þٝŋğɻسDҵӇ܍થΓבôǝȁԇņ࠿űටіހހåզُƚßՔ˟ڢάҢιŮɲؒ΂ਸ\"],encodeOffsets:[[62680,36506]]}},{type:\"Feature\",id:\"AGO\",properties:{name:\"Angola\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@ȸصʌԋȘ˕͐ѯ֊æˤŠҬşŲɀɂӨԶ®ƤіHñ̡৴RfՉǞ͕ūԑÖԫ˪̷­ৃȼüκsԴŴϦ¹ĘʹĩСƨϿů̿î́ყZᦵ֤ۋպԽ໳΁᎝Š׋Ж₭ŵÏԃϞկ~ԉƝЙǅÿՈŜ݊̂ޒªΰ˚ݶȨΆӘռːϐĘج«ӊʣ̜ɡԚȵԎ®Ǩʶͬʭ߼ǣ֚сՐĄǎΌŔʒg̎ĸៜ[\"],[\"@@ɉėɣلͼδʪƘ̀˽̩ǯƍɍλ\"]],encodeOffsets:[[[16719,-6018]],[[12736,-5820]]]}},{type:\"Feature\",id:\"ALB\",properties:{name:\"Albania\"},geometry:{type:\"Polygon\",coordinates:[\"@@Ń˷ŢέΒȳiə˗ŧ»˙ϷСƛÐgȂү˰ñАîֶŖʼƗƂÉˌθаÂƿɨôǴɥȪďȨ̂\"],encodeOffsets:[[21085,42860]]}},{type:\"Feature\",id:\"ARE\",properties:{name:\"United Arab Emirates\"},geometry:{type:\"Polygon\",coordinates:[\"@@Ƭ¤ɱڂƂ۞uԖ{ֺ֪ظՠՎԮǆ˹ŖڑѕGçճƪŝϝǑE΅ʓΏuͷǝǱᡋъ͏࡚Ț\"],encodeOffsets:[[52818,24828]]}},{type:\"Feature\",id:\"ARG\",properties:{name:\"Argentina\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@ߗ§ѓ̔ԑx࣑@Aሞ͒ϵрؿનԋ୲ȿϙп\"],[\"@@Ӵ؇͠ڰॠƊǷ໶ോۊŷਆاࡾ͡Ŧχࠡ౧ࡒɭ़ŷڔƈނ٢Ǝݐжǈфӝiڣۻҩ֟΁ॅࠃ૭ଧȽڥɣࡹT࠷ǽȇÝիËѫ੨ܙŗ׃Հν§Ч߯ઁఛ҉။ǩउĎǰԅǣػƺщԋ̏ࡱř̪͕߱ɗŜ࠳֨ʧҠˆʢѧޛʻڭԹūࡋȣ҇ߏEڃљʋؿؙࠞߦǝ˿ݭ঳Ӄձটލͧ΅Ͽ˔ࢍ֔ӡΟ¨ީƀ᎓ŒΑӪhؾ֓Ą̃̏óࢺ٤φˈՒĭьѾܔ̬૘ěӲξǄę̈́ϵǚˢΜϛ͈ȝॺ͸Ǣƙ਀ȠࡲɤݢԊ̨ʭࠐEޚَոo۰ӒࠎDޜɓƶϭฐԬࡺÿࠀ̜ބռ߂צԺʥ͢Ǭ˔ඔࣶд̀ࢎĹɂ۬ݺશȱ\"]],encodeOffsets:[[[-67072,-56524]],[[-66524,-22605]]]}},{type:\"Feature\",id:\"ARM\",properties:{name:\"Armenia\"},geometry:{type:\"Polygon\",coordinates:[\"@@୞ƀǨə͌ƣǛɁ҄˽ʁˋΦɫϘƏl׋̣}΃ӢHżχCʝɤǩuͧʖرȼĄФƛ̒\"],encodeOffsets:[[44629,42079]]}},{type:\"Feature\",id:\"ATF\",properties:{name:\"French Southern and Antarctic Lands\"},geometry:{type:\"Polygon\",coordinates:[\"@@ը˃ߐĿǅɽϣಇÃq҂ŮΎÊǢ\"],encodeOffsets:[[70590,-49792]]}},{type:\"Feature\",id:\"AUS\",properties:{name:\"Australia\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@ߺ́ҜŘپǊԎÉÐঽ˽́ēگ̉ɰ׍בǧ®ԫԭܘŗֈӝܸtϬռõ\"],[\"@@̢ڇբ̈́˦ΡЖ͟đϋǴܛŸнɄĹɬܕąѥ˖֭࣬ѭצЋ֞λŋȯӔՃࣧ͜ͲȂ;ηȴźƢࢹ׬ԩϸ͋ڀڹʀڭtӏËԳА܋µݓơϵɩݡjӕǕ׻χއثЭ̫ٱ˫гʝܧ͕нɅػŉׁªˇӕ̇वޡ·ϫ͙ԕέ۟ψԥƪżѬҝǃ݁؉ܩɪӉƄӑÔ߿ʐիԮƻْțьЭ;߱ĸˢРȯزЧ׉ݝƷѮҬŶӞ͘ЬãجہܑԿ˽͏ڛٽΊ~ҀԿ،ѹ̀ǂȘઃԚןz߯Цຓāછ̝ख़˫ߡÈࢻљܯȗǉѱ̳Ϳ܉qՅõݑƶ׿ğֽԁ҃ʕуʁЗˋؕ֛Bࢽ՜ҋǄlӖкŘƚȒ̠ĺאģӼѻࡖƏӒӎͭնsʚϋͰĽڄӓڔřΪτε˳ެиʑʞ͗aјеڎă˄țʦĠӠǢȸŘрęӮΎ؀Úٕ΢׀ۀˬЦΪٜ̰ϤàɴĻڎ̺ԚĤŶȀɞüҬoࢨʖҚώɊ҆ӲѐͲvҘט܎ΠܩΦǚ̗Ј˂ТψǻĸٖҠаȮͨцƜ`ɼτĭdɂτŦОŔبϫҲӽՂMՖÿǱҦДڪϜɘſȾκӒԘ̒јıۺǂeі؛ˢ҂Ū֎ȻҀ·ۼɋʈĐԶʵӬʊ͂ñȠǊϬеɡ͉҇ͻ˿Įͱʙп̗ЭÔʁڜҫ٨ˏѠ́؈ӻʂBѰɍŶʷߤ˵ֈ˼ǐҊǠόľҤʰڞŝОÔʔīӔŌنǈǠŽˬȮѾǆҦtʈ̸̾ʂЩÎՃȾķΛ̨ёÚӇ̥\"]],encodeOffsets:[[[148888,-41771]],[[147008,-14093]]]}},{type:\"Feature\",id:\"AUT\",properties:{name:\"Austria\"},geometry:{type:\"Polygon\",coordinates:[\"@@Û΃ӁCǎǻ˧էǇƗܽsщȏۛÞயɐȉ̊ࠧƣĭǅԗŢѕxϝƶźȴƬʪ²ьɹŤɜݎ׸ƮЖ}ˀǣþƜšո̠ń̒ϰز˓ӀΆ̐ÚٶʱЂªϰǁãŃČ̅\"],encodeOffsets:[[17388,49279]]}},{type:\"Feature\",id:\"AZE\",properties:{name:\"Azerbaijan\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@ʞɣψDGŻ΄ӡֽŒщϰƃ͆Ǫv\"],[\"@@ϊËƞɈԈͺѴѵђ׭ϺʸɧۗãƣٵƟ̭̍ȝvзȽ¥ԻѲ̂дʝʚ̿×যإk׌ϗƐΥɬʂˌ҃˾ǜɂ͋ƤǧɚȶƎضʍҐ¹ŘĲбҔɔŚʀ׀ԙ\"]],encodeOffsets:[[[46083,40694]],[[48511,42210]]]}},{type:\"Feature\",id:\"BDI\",properties:{name:\"Burundi\"},geometry:{type:\"Polygon\",coordinates:[\"@@Á০ɃϢԜßʲӎҀÅ¸ͧǸȏT˗ȹǭ͛ѫ̧̥΍\"],encodeOffsets:[[30045,-4607]]}},{type:\"Feature\",id:\"BEL\",properties:{name:\"Belgium\"},geometry:{type:\"Polygon\",coordinates:[\"@@؜áުǪՐοҦȝħ֧ɕĝһܿϦћßדІϷͶϷ`ũ̒ڪǔ\"],encodeOffsets:[[3395,52579]]}},{type:\"Feature\",id:\"BEN\",properties:{name:\"Benin\"},geometry:{type:\"Polygon\",coordinates:[\"@@ۛįȹ׆ኞǛǦЮ̇̌ʱʞņѶ̀ĨǠξЪĀȀʤˮʘ̠F٘ә˩ȎӽǓͷĘɧСԳʵʳǁՉt՗µണ\"],encodeOffsets:[[2757,6410]]}},{type:\"Feature\",id:\"BFA\",properties:{name:\"Burkina Faso\"},geometry:{type:\"Polygon\",coordinates:[\"@@ֹɐϽ̍Ƀϗǰƥ˦ϙǾÅӦɮΤo˴ښۢŬּɲȴОœΚǢŘɎٴϖǆˀ޼ΒҦŢɀǇՠJáСŔϣӀչНॺȏmֻǿʣЩÿǟν˿ħ݁lϳâ˓ƉωÖร¡qӉŘم\"],encodeOffsets:[[-2895,9874]]}},{type:\"Feature\",id:\"BGD\",properties:{name:\"Bangladesh\"},geometry:{type:\"Polygon\",coordinates:[\"@@i׽̉ŶÆگʉѬµєǅКΕӨޟü΋˃ҳΧǠũƵʃĠ͗øŽۖ̅لƜԒԫɤȆ̪Հ̼؅Ѽ֮̔ږεВ£ô׏ߞřު^Ӟƛϯ܅ϕµʷӍҢѥƎ՞ɶFѶ೯\"],encodeOffsets:[[94897,22571]]}},{type:\"Feature\",id:\"BGR\",properties:{name:\"Bulgaria\"},geometry:{type:\"Polygon\",coordinates:[\"@@ʎΉ͚Ö٦ſ௾«иɌবȜ̩ؒӴĕѥΏ̫׹˔ӏܣŒࡥ˃Uлޅÿס̊ڧɱة|Ñ֊сːƒŢĝĴƘˌ͌ˀСδ÷̬ȸȐ\"],encodeOffsets:[[23201,45297]]}},{type:\"Feature\",id:\"BHS\",properties:{name:\"The Bahamas\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@ȵ£ɇӜ̿ʐǾՔʨۣ̎Jӥ\"],[\"@@ࣷƅÏ̴Ђäֈ{~ɕ\"],[\"@@ƟׯƷņ`ѮϓͪCĪڐϗ\"]],encodeOffsets:[[[-79395,24330]],[[-79687,27218]],[[-78848,27229]]]}},{type:\"Feature\",id:\"BIH\",properties:{name:\"Bosnia and Herzegovina\"},geometry:{type:\"Polygon\",coordinates:[\"@@̦FȿσМ͓ūЃȡƽû˙țūҥݓ͈ͅΘ͋Ȅϭ̾ǻʺЩϾǬΒ̞ȕǼǨϾnܠƓ׈\\\\Ϟȅ\"],encodeOffsets:[[19462,45937]]}},{type:\"Feature\",id:\"BLR\",properties:{name:\"Belarus\"},geometry:{type:\"Polygon\",coordinates:[\"@@߼Mࣰ̈́ȚӄېːÿϔԜƚ͖ࣘࢮɁŢȻѲĴࠒȧĊЁǷɧՄս΂Ƴ»Ʊ֦Ʃʎɡ͝ǿڳǉÿȠ˧ȸ՝ܝ¹ʵȁÃхͭĆݷ¡əȞ̿ƥ́ŨڍjफȬࡕàٱmҡɩГeϐʷϴԌǢLͰɷ͌ϊ\"],encodeOffsets:[[24048,55207]]}},{type:\"Feature\",id:\"BLZ\",properties:{name:\"Belize\"},geometry:{type:\"Polygon\",coordinates:[\"@@OŮĸƴı̞ԔǄZHūǄGaɭƋεôŻĕ̝ÀăīщǓɟƱǓ̅ʣ@àॆPژ\"],encodeOffsets:[[-91282,18236]]}},{type:\"Feature\",id:\"BMU\",properties:{name:\"Bermuda\"},geometry:{type:\"Polygon\",coordinates:[\"@@OEMA]NOGNG\\\\Q^McMOI_OK@CQSGa@WNLVWHFLJXVFGJ`ZRTDLeeWKIHGIK@@[MQNi`]VDTBHCJAPBJLVFjT^LV\\\\RJZRn^RH`TfJjZHHOTTFJP_NOX[EYQQKMEJOLANJH@HQHAARF@ZEPS[U_IcRQXE@EEKKOCGGCQCOGISKYGUC\"],encodeOffsets:[[-66334,33083]]}},{type:\"Feature\",id:\"BOL\",properties:{name:\"Bolivia\"},geometry:{type:\"Polygon\",coordinates:[\"@@य़͟گӳ؈વȲ۫ݹ؅ŗ͡୆ҋऺˆ߾ѳ΢ŏ؆ЫֲՌ࣢αۺȖ˰ƭ̶͠рh܎¤נǸ˶ܩഠزíѠnȈʪ݀;Ѷ͂સƚęؽļ͓ãࣰ֛ݫऴƑ̻ͦ֨ǕΐʑՈTӦʟӟǐʕZγʓa͒এྖūӟĜͧҞɽȤԹƫڋɯρĄӏʿǥaʶ޳јޭ^ัʓЕ݋sҋͥ৕ƉǸ\"],encodeOffsets:[[-64354,-22563]]}},{type:\"Feature\",id:\"BRA\",properties:{name:\"Brazil\"},geometry:{type:\"Polygon\",coordinates:[\"@@૮ନॆࠄ֠΂ۼҪjڤуӞеǇǒӜŖӼBҦ̡ƴ̿Ƌ̻į͔ýޔƿʤ֥ɪ΃ǏࢱǈÈଜʝҴˀǦăӐɰςƬڌȣԺҝɾěͨŬӠྕ͑ঐʔbYδǏʖӠӥʠՇSΏʒ֧ǖ̼ͥळƒ࣯ݬä֜Ļ͔Ěؾષƙѵ́ܿͽȇʩџmرîӃƟϡĪÈ౨ۏӷݏv҄ͅ֏¶ǲΰұԞΓݴɜƶA΢ԖʎċҔɊ̈Ôϼ०ֲێǊŔŴݴϚᘰpθſӔύ̬LؐӀƒǚē͐ӯĔYՀ࿖k˦̂ɸˉǐӷǂļҨѻٸÆǌʲشȞΊƐĮΤ׸ʆ¯Ǯ܅ðśՊ֞ϓɒǀþجŅڜȿʐȤ؀žल̮͎̾ŏʂѪȜȗŉσ̀ŵȖϷɷ̏ƅ܏ɌыÔϳԬϿЮ¥ĢǒˆϠƦ˚ɢҬíȲҚçøǢƗǘĎʐͺõЈĒӔǱξǥʺɪȊŘɿДÒ͒͊ʴؤӼޒ˺¢ȺҫҼ฽҈Ƒxׅمەʾʩ๤Ɓࡃٔր੐̟ඊԡШӱƏҫ঎ʶ࿐ѹఴఔ۝੸व٪ʏܖ̦˅˸੭Ɣԗͯ൹ёշஅୡՙोثܯȿgɻءÒ༽ɹಓęօˇͧƫ૱࡛઱ƛࢁڹηȟԋ࣯Fೕ͓סύवʗ঩ڝ܅࠯ũطƔҫƽࡓȏЧחҥट๕݉ڗ֯Ͻϥߛ։ӑɷӈψЊӟֲڇҬࡹՠ̹{ࡅٰձę\"],\nencodeOffsets:[[-59008,-30941]]}},{type:\"Feature\",id:\"BRN\",properties:{name:\"Brunei\"},geometry:{type:\"Polygon\",coordinates:[\"@@ͬ̾܎ҢЯ·՛Бǭ˹ϥѦ\"],encodeOffsets:[[116945,4635]]}},{type:\"Feature\",id:\"BTN\",properties:{name:\"Bhutan\"},geometry:{type:\"Polygon\",coordinates:[\"@@΂ˍÏԩۇ{ۿÈՇſޅ͊kǚ֌زҒɈ׸șѺqπɥ\"],encodeOffsets:[[93898,28439]]}},{type:\"Feature\",id:\"BWA\",properties:{name:\"Botswana\"},geometry:{type:\"Polygon\",coordinates:[\"@@ǜƭ˄ӡॎइήĝD̑ʚՑٰŹ՚ϝ஑أݭع˩֓ʧ́ҙãƧГďʽ՝țہ¤БɾΟĸХșȵГЉʧпϑ׻đȇ̐üԠӽߚɧŲAរࠤ|Ჾشಖ͎̎΍՜ͤʮDӂȎưÙ͔ڣ\"],encodeOffsets:[[26265,-18980]]}},{type:\"Feature\",id:\"CAF\",properties:{name:\"Central African Republic\"},geometry:{type:\"Polygon\",coordinates:[\"@@ۜÚƺɎƔgȾȏ੔͐Τ͠Ѭ̌ĉ̐ʂüߺ½߆ϴ؊ࣺю;ՐƜĪΫӜԿF΃ƋΓÄʻ̆ʍٖοҢͻT˗֠ѫΖεɆԋغͩƊˉˣęաpكĘ̹ïųȱ˕}ͧǲधнϥĎŗÝʥԕطǐؙĊ՗̴ۓ˸҉˓͛яùדգ²֩ƘԅѻѯޱėʐϦϧ˔̳Ѡï̠ЇѮæʢċΞÞٴȬƴц࡜\"],encodeOffsets:[[15647,7601]]}},{type:\"Feature\",id:\"CAN\",properties:{name:\"Canada\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@؎œުxЯ΅̵Å੥Φȿˬ͆ʸ̎С\"],[\"@@Хcઝ˂ޯІ̄î૆Ɂ࡮Η|Ʒ\"],[\"@@хŝൡϢʥ̘ݩ̌Ưʈࡻư͕ҜðȚࢨǿԨŵ߄ė˺̃дЋ࠼΍Όҩ\"],[\"@@։ܿո˴֠ǵ̏̉ݚɱϰȴ࠼ʵʹ؛טƞņѿʼԷΝ݉ϝփǂǾیɻńইܯԅצЂ߫Ȳࣙ¹࿅~ŹʠԼ̐λɬ۸Ԓࢄ೾Զӎܲ̂϶ǋɫ҅Չ\"],[\"@@@@@@@@߰äʥ॓ܶگͯDԑϪ̵ϮчʾƻτºˎЂŋ\"],[\"@@͡ѳχîəʢ Î͖ʦΆkɈǣ\"],[\"@@ঝҧץnǿɪزϲ଼SiǍ\"],[\"@@ƼυјżӨɗं˽४ʽöЍؤÞ׶˥ݙ˃ಳȬҽϚ࠭ҁ஡ѣ˿Ӯଗăܴдņڌ˺ޔ؈å\"],[\"@@ष¥ȿЪΦҼޖŜپɷXέħřձʛ\"],[\"@@Է̍ଉʬۃğଫϘ݊ʼטζࢼʃԎƯʦǅԠ͍\"],[\"@@G࡭૰ڄ৐եʡح߾֥࢚؈ؖܨ°ईஞÝఔūૼй¼зس҃פ҇ŃУ࿩חୡŻࢃʨʣуߵ۽ʓοই֩ளÇڏΡÇձ঍Ŀਉڻ࣭ु͙ڏ±উంƕϜ޻ϼّ୲ǔ༞εࡀ͋׺Ѕ੆ɳࢸΟ൶µࣴąƍܫʼࡋ،ळనߗ٨˚ҔࡺѭೢףѶഎЀ॒לҮהç֭֘܌৷لলࢤνݾ˫ಾגȘ෸ɫࡸć۠ɚ޴˵ਚӣʮ͙ຄÛ}۷˪ਜ਼ގſ،ӵ௖Ұߦऔ֌ϸٺݣબੳघ৙͵Յ૤Ӂݰӓംɏբˍͬ܃ټŏͶͅÖऻ؍́׽̏൯̗੏ۑ෇ƋᅛǮుPࢇÍ۱׽ੳω௉૗ॵޡ܌Ɛഘૄᄈ۪సČݔЫߍ֟ˊࣟ˜هતп൸ŨࡆीÎ؍ժ̥ਣսᇷԁ࠯ͽय؁ٓÖ܆ฤ۞഍णĹջӆBନύʐ֛ƛ˧ɚٙىʱٹ̕ϡΥŽˏ¥čȹ໽A౥MϛƷࢵ؃Ŀßˍ͝ޗBࠛGϛƅƊǑøʯeďષлࡽſউ҅Ɂ@˷ƂĥŦnĔȂ̎ЂҦʘӺǙܴǵނ࢕ЂľƬūĺɳ@ǛƆ¥ȤǍēɥ¾ĊȡĊćɚٵːڹ˪ࠑ͘߁̨ݧʃ˝Sਕɔڻŉࠁʺ࡫Ɔו¾ʻƜƫҤ˳IE͓჏BᮝA᭯@ᡃ@ᠿ@៙@ᢡ@ࠛ@᠁@ᛷ@őF྽ࠜ׵δຽΐҳݖŤԨ੻ΨƧڴ৭؎iѠҲКwՌෙ՘࡭ॠՁ׾ޑϚ֣ΈѿѢࡇ˕ࠇҹݛւדπࠋɸࠟ|JⷎNᷲ༬ȭ೘Й࢘û݆ΖৰˀఢĹ఼τ൘Ⱦ־ΑظȠȊЄ׈ęෆݫ૦֬ŖّਔƐ͆ʖৰ·౼Λዸ̭ୄƛࠖÄଊэ஁зຶǷᗘĲܒƦࣆԋࣴьࡩΦժ˼৾ڦĎڴȩࡊҗरä๢ϛಬƄ௬oĭԺݞƦದ˵KߑՖڠڰuϞࡊ࣑԰কͺäघশ؎ૌƇࡘχଞॅݗЭ༠ǝ\"],[\"@@нϿሎʬୠщॊіސ˟یࠛфΒ׭ࡰ݊Ŭ࠲Ƈश͹ՆࠉʼץථеະЉĝσൡã՚͓˱ູ̯Ƃฃɪঋ»ཅ˷ᒃű๻āҕІଫɮݙģਛږ֔ĚಘƜஈરƦྷȞᅗã஗jѷ̴ዎͲಗ[ืɚ۶ـגͮᖬԠ࡬ǋ\"],[\"@@݉ևಹך˸Ş૸ٔȁ\"],[\"@@öɵࢿ|ࣟjࣿőʑ¼ऍѾ̠ИÈነěชң\"],[\"@@ڎԽޤڴᒆΈ෺ࢅůջဒʒߒͮሀыୄЏŊν༚Ȑ࢘՗᎐ܸͩ͹ߐ޻໯ϹጘչೲȁீޙೖÇʽכ้ঋਗά೓߲ઙĿŁӕࢪӥଜϯΌɟմࠩ́׿੕ɪᑏڨஎܣ࢔ԕƎ̉ᗱͲᅩӤ৳Ц̌ʂయќ௥Т`ʑᝡƅ܃˾ֆؤ཈dႸņ˫̜̊оચࠊɳϊ͕˾౿Рၳ˺՞ɆࢷԺ݋´ڏ˸҇ʛ຿ŅᵝȈᄫʚഹŴۥ̐࢞Ϧ஝Hˉ࡚٦ݨࡺ΄ᓪɢأի\"],[\"@@৊ǯຄńɖʑ޷Е౜αƱݳ൝͗߳ê׉͎ᐡٮjˎ႖ĽएռসР\"],[\"@@࣓عय़Խ݆`кѮΨ࠰ɮცྈȱళݟ৉Ǎ\"],[\"@@ᕍЙѷςኹѺήΤ׌ؘܰւࠑԦᭊƀ஬ǧᒰ±ࠄʑࣖΝ੍ɃᏝןਫי@ν\"],[\"@@ҙ͙௝Øৱɖ҂Ϛீɨܼ̬̍ˇ\"],[\"@@ٞϵљϣس൱đࣗƈjӬ൝ÝÁٮࣜౌ˺ஂµÜŎ\"],[\"@@̙͢ݠƘࢢƪЩԝЋ᭗Žᑯη౩mŅ˜პϊ④ĳ୯Ʈପࠐ߈ɾᛄ˳๶ӻฺÛறߨޔ̪ࢄĭ˲Џ\"],[\"@@ढ˓ကFܨˡȑ́८ȍՔȧଊ௬ë೸ǼႊðീÏ࣒ͅȊ΍ԽɟభǷ੽ĸᜱŻႫcഫļᖁ˔̃ҦĹжࡇξ჋ĺঅʼ͂ΈႾÁ\"],[\"@@ŗ٣٩̇޹£༝Ϋ഍ŹଗǼ@@ුؼႮծಆ[ସŬ\"],[\"@@ϣy༽Âɡɼၜ]מƻĵĩ\"],[\"@@༩ʋఝ˔ڼˎ௮Đஈſ˩ʥ\"],[\"@@৽ǏඉBbŤࡴʦҌદǝ\"],[\"@@కǥۃȚέ͂áΎજӪÅ৐̇ɫ̣\"],[\"@@͜Ε൏Ĥ൩˘ሏߺʠ৫ȮÕ͐࿶ŕᗢ̫ٞЍ\"],[\"@@০˕ଽʟ༇ك๥Óდņࣗ΄^̦ڔɢ໡Oए˨ՑϠ׌ώ׊ʲࡴÎοȖዜ¨੶҅මǵ൞ǃڒև\"],[\"@@ᖢßᅮŅ໤ɫɡᏅη᎙ǟݻȉᆬJጡԙേʃ෯ۇႿƓՙǡᡷěୈĿׇƭ۞бߙ˽ಛʃЋ͡୫ʣŞȏ෬lȳᖟԋᔧɴឿŻధĸཟªĿЖ༊Ȑб؆ԢÐᖤγ଩բഹǈڼ͘๰Ȩʄ̊஋͠ΥѠᘞڒĝ಼̪ቃĬ᰽Á๣˸۩ͼগʘȁ˺దǈঘ࿲ƌం̺ਬ©ࣤɽٔҒૐƈບĢᢲҀĝ᝚ƚᆔÁᆒÁ\"]],encodeOffsets:[[[-65192,47668]],[[-63289,50284]],[[-126474,49675]],[[-57481,51904]],[[-135895,55337]],[[-81168,63651]],[[-83863,64216]],[[-87205,67234]],[[-77686,68761]],[[-97943,70767]],[[-92720,71166]],[[-116907,74877]],[[-107008,75183]],[[-78172,74858]],[[-88639,74914]],[[-102764,75617]],[[-95433,74519]],[[-123351,73097]],[[-95859,76780]],[[-100864,78562]],[[-110808,78031]],[[-96956,78949]],[[-118987,79509]],[[-96092,79381]],[[-112831,79562]],[[-112295,80489]],[[-98130,79931]],[[-102461,80205]],[[-89108,81572]],[[-70144,85101]]]}},{type:\"Feature\",id:\"CHE\",properties:{name:\"Switzerland\"},geometry:{type:\"Polygon\",coordinates:[\"@@ƫŹȳϞƵіwá΅χƙةŀǻ͹ЏơƄһ˵Л¡αǶ˽ςБſ^ϠؚҾɈϤûɲƞ܎MǦǼ࣒ʱ\"],encodeOffsets:[[9825,48666]]}},{type:\"Feature\",id:\"CHL\",properties:{name:\"Chile\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@Bም࣒@Ԓw˧ͻܛʻЭӻä؏ʨ࢟ŨੑҸ࡫Ҏୃशۘǭ୼֗૜̟ѢϬ˘ֺޠΎװı\"],[\"@@͢୅؆ŘĺɁ˿ࢍࣵгඓǫ˓ʦ͡ץԹջ߁̛ރĀ߿ԫࡹϮฏɔƵCޛӑࠍpۯٍշFޙʮࠏԉ̧ɣݡȟࡱƚ৿ͷǡȞॹϜ͇ˡΛ϶ǙĚ̓νǃĜӱ̫૗ѽܓĮыˇՑ٣υôࢹ̧̐֔ÄgؽΒө᎔őުſݝPЙȷݷ̣Ɖ޹Σoॅ˚१ג@@ਲ਼ӔˁՒʄӰх֒Ņ෤Φ߰ࢴٰౣʔߞݒ˸ඊत̏Ѯგ֝ɠʿ਻ՉŠ˂ல˺༒ϮָʍࠎéूΠԨപ׈എΤబȗ఼ʤۚĵਞӮਆưྺ˒ნˀሤÕ൘ǩ஄ќɌɦњЬֱŐ؅ѴΡ˅߽Ҍह\"]],encodeOffsets:[[[-70281,-53899]],[[-69857,-22010]]]}},{type:\"Feature\",id:\"CHN\",properties:{name:\"China\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@ԑഓΫۏѷ܂ĩخӶࠜڦَϨʡƣԓ\",\"@@ܩЗۏʺyܢаϠࣾɾӚoȊ͍σσșӟ\"],[\"@@ฬˍ঺ׯͼ߃౨Cܰͨ൸ʜѳݱ͙̭˽ः֡ࠇ৵ƪܝ̑ɜܙť঳ѕwLяթӺͯһಙαƀѹܩЍ˂ֽ׭ऑҋۃա୭ʑأϽࣝɭ҂ϴǭ͞ږ֠ѹѲܷ̓ॉ׏ԫթ࠙¡ѓϻѸ֩یƏϕڔʕस׶ݚ͝լuƌѱஓɻϻҏࠇућיࣜҥͦࠝԞޓ֮٥_دՅɯȪ҃ӶʻŻۃɇڗҷ÷ؗࣧڹિޭোିޡୟۻृĩԣύ̃˘Ӈй୭сࢵŹ˻ࢱҭ·ə؎Ȧ͘ૻːЇƍࡍɔЏ΀ƄӜޏƶЙܑ̀҃ࠇīڡJ҉ȳѥūŶ॥҃x÷Ȣ}Ύ؝ʓεƸر͂ʔۤՏǎȧޜࢱƓĴাߔۮۚ{٠νȨ˭ӶӭÙࣟŲ˴ΜϿԺ׳Ν۵ȸॷ՗އسڳĿοɦѹr׷Țґɇ֋رëڌԟǭওĈोȖڿτٵǔ˯ЖҽŦࡓոکʴΑȩଢ଼טࠛՒɽऐ׾őіͭјĐۆࣙঠ൧ͼʝ٦ةϼƫʌųӎ͜ԛȔ˟ďɇިʈȔśȠߤЈ׈ǐࢸő͆՜ંĲͮ̚೜ҔŠȐãӐּɔݱฦဘͲјȈ؆ຒဠˡҲϞ¢ࡆۦĀٖ֔͢èɚו۸ѽப̿׆ڱ͕ঙ̢ηূƝଆŝ৪ԻԲġϤޟӲӿऒnჄȉ૤Ŝࠦůఔԛ৮BόʽঐҌബ̈ాঘ̒׾҈ך˰Ƌˤˍ͔ѴըӀùࡺǝ࠸Ѿ౲͚؞֊נʆ௠ŐڐĥĠ̘ݿזګː٥̳ࠣžӇŃɏΆר࠾Цو৚̓ஆՎQτݸࢾҲːWҪңȦۜмਰƲ૜vసʡ݈̱԰ࡏ̀α̊ԩ̶ࠕ\"]],encodeOffsets:[[[124701,24980],[112988,19127]],[[130722,50955]]]}},{type:\"Feature\",id:\"CIV\",properties:{name:\"Ivory Coast\"},geometry:{type:\"Polygon\",coordinates:[\"@@ϣUוǒ՟Wহƥ׍ʍ̯ࠫǋvÞۖĄŀ}ͨΣΚˉÈʕɲǾώčО ʔƄB¸ξÝǌĄŜ̸ĶȹڨȗΎæ˸ǘÞŊúɸųٮOƸʖƢgʎĦžΫȞłΌŰϚǽƦ˥Ϙǯ̎ɄϾֺɏɠ஡Ο۷ɕेθܣͧ\"],encodeOffsets:[[-2924,5115]]}},{type:\"Feature\",id:\"CMR\",properties:{name:\"Cameroon\"},geometry:{type:\"Polygon\",coordinates:[\"@@Ľ°ӻŇԝŒЋÅ൅nŬڒ͟֊ϧƚǟϖɋŦXɶɎתЎ߸ʒRԄӮ͈bҾΉ־˲ĀΔȌͺžь҆ΊǞךǲȊŢѨɜ՚۾ٲ¬˨ĠƲͫͰˌʂ¶ͮ՟Ê֏֏ҜޅҷTʁÏϥČǻЅӸөμƛŠΏˆ׃ſɩх࡛ȫƳÝٳČΝåʡЈѭð̴̟џϨ˓ϥĘʏÓґڛȤڷɜ੗\"],encodeOffsets:[[13390,2322]]}},{type:\"Feature\",id:\"COD\",properties:{name:\"Democratic Republic of the Congo\"},geometry:{type:\"Polygon\",coordinates:[\"@@»ঙͶŕˑ̗͓ɟ͍ѫǯϷ±ګț͍OهʍɹԃŗÝýҟɄϡÂ৥ưޝċѧǘӣӤҹҒ੕ͥĒ૿ƙɣĵʇՙȊχƫষĻࡇɨƫט͝ɲƴìٟࣟR·Ҧ̳ΨٟŠȋѰԣ˅ڧŞ˫ϢՕüϽqµʾ́rϥºԳųιtȻû®ৄ˩̸ÕԬŬԒǝ͖eՊ৳Qò̢ѕG­ƣԵɁӧűȿҫŠˣş։å͏Ѱȗ˖ʋԌȷض៛\\\\̍ķʑh΋œşʼɊĘμƎɎ̪ǰɚđ˼͐ҜSÄʃ̼ƩӶՄӨШɆː۔θࠆϬўքМĪˌt̰Ǝ̆«ӊŀݖǐԾʦ҈¸Ԕúה͜ѐҊ˔۔˷՘ؚ̳ĉظǏʦԖŘÞϦčनоͨǱ˖~ŴȲ̺ðلėբoˤĚԘۙϘķɤƖϲÅҶǲȦΫ݊֏\"],encodeOffsets:[[31574,3594]]}},{type:\"Feature\",id:\"COG\",properties:{name:\"Republic of the Congo\"},geometry:{type:\"Polygon\",coordinates:[\"@@̿˾ʩƗͻγۏࢸٖҪ̓֌˾ɂ֦ĺäό҆ЗݐʴЈł֒ĝڀЉӺζ঄ȽǘسçɻѢÔξ੘ڸɛڜȣÔҒѰ޲ԆѼ֪Ɨդ±·ԓʥ҇ǏԽĿݕ¬Ӊƍ̅s̯ĩˋփЛϫѝηࠅۓɅˏӧЧӵՃ̻ƪÃʄқT˻͏əĒ\"],encodeOffsets:[[13308,-4895]]}},{type:\"Feature\",id:\"COL\",properties:{name:\"Colombia\"},geometry:{type:\"Polygon\",coordinates:[\"@@ΫȤЭ˨ʅƅ܉Ŝȱΰƽ_࠿Ӓŕʺ̼ÚтȢ̦иÊΞՆ͐Ѵ̳ȦǄӦȏސǸɚƃ܄ͻ҄ņТ˔ÑǂʠțӶĺŬѢـהΌĚT˦ƺ܂ӖϸՊfäǪڂéڌъ͞ȊОК̖»ɚɛǍ˱գƕɇп͗ʋʓ̷Ĺ׵ɷӭѢÇņϭȄȁâ͹ĳ̵ǫȸéȨ̉ઊĄӦŃעܡͼĚ؂­ӐĪ̔ƟƱҍȇ˯ß׻ǜ֑ʆʟȉэл̨ȃɠ̋ʰ࠹ǁĻǏӸɷˊ˥́࿕lZԿӰē͏ǙĔҿƑK؏ώ̫ƀӓoηϙᘯп҂ʣpժࡤٟϾԍị̈ƤҧɝصŀӵࢤϳɐˍІ֑Њɡā\"],encodeOffsets:[[-77182,-155]]}},{type:\"Feature\",id:\"CRI\",properties:{name:\"Costa Rica\"},geometry:{type:\"Polygon\",coordinates:[\"@@җȆǟǮĬƤȄɷȪͥǔ́ņÅʖəƮÄʑǗȩȓɸˑĊŗǞLʮŎˆʁŠȖǌŴňֆɝȖŊˊéƔǥʜÇȪǲɈҙ͖ͷЂΩ͗õLͷǪűűıƱëǟ©Ǖ\"],encodeOffsets:[[-84956,8423]]}},{type:\"Feature\",id:\"CUB\",properties:{name:\"Cuba\"},geometry:{type:\"Polygon\",coordinates:[\"@@ܨÑڊW߄˹̭ͮ޺Ĩ̔ȡ܈ԳԺϛˢ\\\\ԆǟÕʁئٌ΅ıȟ֑Ń֡¥׃âளą֜Ҷ΁ɔէÈ̃ʐȥӎӃ޵ɦʥǬભž̋ǐ̀ɀࠗ¨׿ѧΏ[ťȳеğΫĂѺʸǼ̤ϞȈіǎَĄȰĢ\"],encodeOffsets:[[-84242,23746]]}},{type:\"Feature\",id:\"-99\",properties:{name:\"Northern Cyprus\"},geometry:{type:\"Polygon\",coordinates:[\"@@ÐJŨȮ؄Yކʢ֧ΧÔƿęǇÙűj¥iĎÑ¾ǋVɫïƿ¬\"],encodeOffsets:[[33518,35984]]}},{type:\"Feature\",id:\"CYP\",properties:{name:\"Cyprus\"},geometry:{type:\"Polygon\",coordinates:[\"@@ãࡱͿЩŊȟͶЎǀ«ɬðǌUÒ½jč¦ŲiǈÚĚ\"],encodeOffsets:[[34789,35900]]}},{type:\"Feature\",id:\"CZE\",properties:{name:\"Czech Republic\"},geometry:{type:\"Polygon\",coordinates:[\"@@ϯǂЁ©ٵʲ̏Ùҿ΅ر˔ӃΰѕȬėΠƧʠؒǾ̸Ⱦ׾ǎɂǆɜīϒĖЊ˓ؼñ¿ɳҘǧŲɒּĥĄʿز»ϮЯʡCŽƯȕÅȑǇ¡wý˹ēϋbšȁ\"],encodeOffsets:[[17368,49764]]}},{type:\"Feature\",id:\"DEU\",properties:{name:\"Germany\"},geometry:{type:\"Polygon\",coordinates:[\"@@d͗ࡔțS̗ࡢǂҾɰॊͧІˋȞёɹɣ̨̙Ⱥ҅ß́Έ՛ϑĕɛĬɁǅ׽Ǎ̷ȽؑǽƨʟĘΟіȫӄί̑ϯ̟ŃŢշýƛʿǤЕ~׷ƭݍţɛыɺʩ±࣑ʲǥǻ܍Nń״ьֺ௅ƸЇɘ´ςǗȐĨ֨ƗࢢԎ@Ɉ͂Ⱦޔƿ˴ǐǲ۰°Ƽȃ֮вȓ̀ӈٌōՠŸ\"],encodeOffsets:[[10161,56303]]}},{type:\"Feature\",id:\"DJI\",properties:{name:\"Djibouti\"},geometry:{type:\"Polygon\",coordinates:[\"@@ȤʹΑӏȩήɯ̱҇ȅƬȭÏҷb_ʮßɶ˴Ѐ̐ϊήñʪȴ\"],encodeOffsets:[[44116,13005]]}},{type:\"Feature\",id:\"DNK\",properties:{name:\"Denmark\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@ԋڹ࢟ӄŝΒ௼˨ˎу\"],[\"@@ȵ̓ʡĞ؁؁ɮХ՟ŷًŎͽҲ}࡬Ɣɪʌʦ݌À̐ɴڮʂѝʟ˙ĶɽҘŵ\"]],encodeOffsets:[[[12995,56945]],[[11175,57814]]]}},{type:\"Feature\",id:\"DOM\",properties:{name:\"Dominican Republic\"},geometry:{type:\"Polygon\",coordinates:[\"@@ŀƞپIӾɏɜtƴ̕ҠhʡϐЮ̷̯ͿЍǼϫˡ¢ƱƵ͑½ŷȲˣťͳֻɏƆ§ʎjɬɍʦȲƚÞ͒óҜ\"],encodeOffsets:[[-73433,20188]]}},{type:\"Feature\",id:\"DZA\",properties:{name:\"Algeria\"},geometry:{type:\"Polygon\",coordinates:[\"@@ᮩཽᝩ࿷இϑटćU՘ϵƌԹʊȧЀᬻᆴᬻᆴṕᎠfǌ@ÊQ঺ബب࠼Ÿێɦ͎тচͪجӢòϞ̶સƚƸ͜ɛǲ̃ࢲ¹Ԟ́ՠ߰ҠࣦƢՌΎ߶ʰ෎Ƭർæшůߊͨ࣌P΀ȝֺ¾ǟћƄߟȡۙԭҵôمۊԃRȯԮ͹Ϊຝ˖ݏ°ϵƧۇÔϥŃҟòՇͫΗӺؓέ̘ҵϼƸڒϷςՃ\"],encodeOffsets:[[12288,24035]]}},{type:\"Feature\",id:\"ECU\",properties:{name:\"Ecuador\"},geometry:{type:\"Polygon\",coordinates:[\"@@҂غǻξ͍ϵԉςǞʀƙބ̎ŴƺԼ͆զÍ΄ҢǸ׀Ͱࡀӑƾ`Ȳί܊śʆƆЮ˧άȣŞٓʽճࣷ࢟য়ͧԥܵǃ֣Ӆ΋ΙъͻĞ΍áw̮ʈȨıΔ\"],encodeOffsets:[[-82229,-3486]]}},{type:\"Feature\",id:\"EGY\",properties:{name:\"Egypt\"},geometry:{type:\"Polygon\",coordinates:[\"@@ɽͷǹىɫѩȝƥ˩˔ϛϒ׵ஸđùΐࢯԪࡋٌವ̴ҙ˒ӃݮछǗƣճ঒ݭƨǣΏ@Ὁ@⁩@@ᶶ@Ჴʥڲɐ԰Żά̤Ж૦b߲ɝ࠲ʛϴſ٨ˊΌʊݎêװŃɮеȜ˜ڨȣټ³аɄւ෽\"],encodeOffsets:[[35761,30210]]}},{type:\"Feature\",id:\"ERI\",properties:{name:\"Eritrea\"},geometry:{type:\"Polygon\",coordinates:[\"@@˻˖ΉӰϋ˒ɏܷ̄ͶֻXȭǬӯȡԛϢʽط঑ǬęʹβఀĊ֒ˆʴؤƐьӒӦঃɴޗҢУବߏҲӍҖӝˀ˿аʧʩȳέò\"],encodeOffsets:[[43368,12844]]}},{type:\"Feature\",id:\"ESP\",properties:{name:\"Spain\"},geometry:{type:\"Polygon\",coordinates:[\"@@¦״΃θஒ؆ਊƱ૾NࣂƝۦªമͰ͛໺ϡ̨ǺीϝআŊ®ӥߓ֓ઁǯõ˱ԩү͕ہ͞ӑӟϑǹճىǗש٥੧_ߟhՃ͍̓ͅЩê̵˴ʃӚ޷žé˦̶̀Śɬ̃ʢɶրͳԌδèЈƎŬZپϲɪɻфөƝŁӹCɁЬ΃ū̥ɇ\"],encodeOffsets:[[-9251,42886]]}},{type:\"Feature\",id:\"EST\",properties:{name:\"Estonia\"},geometry:{type:\"Polygon\",coordinates:[\"@@ĮӸ̱ŁՓ̘ñӘਫ਼ɼ੔Ũ࣮Ƒࢂ|Ŵƣׯӝʞ޵ΫˉۙDܡ̸ρļ܏Ʃ\"],encodeOffsets:[[24897,59181]]}},{type:\"Feature\",id:\"ETH\",properties:{name:\"Ethiopia\"},geometry:{type:\"Polygon\",coordinates:[\"@@ԜϡӰȢȮǫּWܸ͵ɐ̃όˑΊӯ˼˕̏ω˳Ͽàɵ`ʭҸaȮÐȆƫǽ̴̕ҧ̴Й̛͎ᩨঽۺNᛛᡃફݟףաeɯ˅ַB͹˴ލΙʝΓ֕àȃĬȟwˇT੟܌ב@˹ˢ@ҾѧƘӻࣴϥȚƧʹэЦԧÒ˸ӐҀrŲʰ[ݲʞࢠЊɾĎ΄ήٜԔи΀ࠠƆܠ঒ǫʾظ\"],encodeOffsets:[[38816,15319]]}},{type:\"Feature\",id:\"FIN\",properties:{name:\"Finland\"},geometry:{type:\"Polygon\",coordinates:[\"@@ūיಀ֓ޡى঎ख़֡ܛݴس΅յఘֻ́ѓޭӟᅡੵໃá๑̯ൃǯӡҞ߿ˠȈࠢСݶАӪނՆ኎࣮֖Ǭē΢ୟЈ˳͜uಒ಻ֲ૩ЪԊɞतѻલ¦ࣘȭߠϊЬ؞ಬ˶઄ͯΡכ\"],encodeOffsets:[[29279,70723]]}},{type:\"Feature\",id:\"FJI\",properties:{name:\"Fiji\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@̂ʍƓѭԳŗҩļąτ͖̀ϤĻȼƐ\"],[\"@@՛ǯŅ̼оǤˊ°Ӱˀ@ЧՕȷ\"],[\"@@é­@ШǨĽЗ\"]],encodeOffsets:[[[182655,-17756]],[[183669,-17204]],[[-184235,-16897]]]}},{type:\"Feature\",id:\"FLK\",properties:{name:\"Falkland Islands\"},geometry:{type:\"Polygon\",coordinates:[\"@@৘Ԍ܎ȿԌʹڦϙʥ̋ଋʥϙ̌܋ϙпϚ\"],encodeOffsets:[[-62668,-53094]]}},{type:\"Feature\",id:\"FRA\",properties:{name:\"France\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@ˣ٭ϡǠș֢ǜ̺ը͎Ɯܛ\"],[\"@@הЅќà݀ϥȊñʎjЈɗெƷыֹŃ׳ɱƝϣüɇؙҽ]ϟВƀ˾ρʁʚ̿̅ʯɐٱҖŃĩηݿӅစɬ௧˗ĩԑঅŉिϞ̧ǹ໹Ϣͯ͜ѢԎǆူࢁࢤإю౹͒čؖઠǾථɏˇॎߌέዠپʨێܾǞŪ̑ϸ_ϸ͵\"]],encodeOffsets:[[[9790,43165]],[[3675,51589]]]}},{type:\"Feature\",id:\"GAB\",properties:{name:\"Gabon\"},geometry:{type:\"Polygon\",coordinates:[\"@@ࡹࡔ։ۚԙࢄ˨ǾˎȲؔǜخ˴¶௢SOৠЌÆԞőӼňľ¯ÓνɼѡشèȾǗεঃЊӹĞٿŁ֑ʳЇݏ҅Иãϋ֥Ĺ˽Ɂ̈́֋ٕҩ\"],encodeOffsets:[[11361,-4074]]}},{type:\"Feature\",id:\"GBR\",properties:{name:\"United Kingdom\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@҉ֽًǦԱ[ǦҊǥ҈۴ࣔԳ\"],[\"@@࣋ࣧࡦŘऄIɕۅݯݩࢄÃäĕݠ঱ֺƇԬढ़ʈͧৰǅķ՝ѓʗͲѣݱѯ૳Rෝɱϻǒ։ϿޥĪם͍ҁǘ௼ࢨݪǺOBಽƔʃͰ࢜ʺҡҐǆռఢ÷D@ŮӤ֛Ԯ_\\\\৵ƨȧɬ̨ϒˡɴҍЇ·߶щє̨ࢆٶھڤá০ì\"]],encodeOffsets:[[[-5797,55864]],[[-3077,60043]]]}},{type:\"Feature\",id:\"GEO\",properties:{name:\"Georgia\"},geometry:{type:\"Polygon\",coordinates:[\"@@Ųάȿִӟ̲ҭĬ̯ʴĺĲ܄ƝఆƋଦЕƦƻԚƂ޶ǭʴ·Նșɓřвғŗıҏºصʎȵƍଢ଼ſ߳Юࣅ¡\"],encodeOffsets:[[42552,42533]]}},{type:\"Feature\",id:\"GHA\",properties:{name:\"Ghana\"},geometry:{type:\"Polygon\",coordinates:[\"@@೉ӯҳ˽ݳʑݡʆͨηܤɖैΠ۸ɟ஢ŗنrӊฤ¢ϊÕ˔ƊϴáÕʿΖџC؍Ąڍɂ̫ȅݳäйɢՓȈ̍\"],encodeOffsets:[[1086,6072]]}},{type:\"Feature\",id:\"GIN\",properties:{name:\"Guinea\"},geometry:{type:\"Polygon\",coordinates:[\"@@ʃtǡͷʁJǏǴÈͶΗԨɕħǵmɳ³V̮ƇɘʔǻΜɹ̜ڥDțǁɵoƝǷīɹ҅σρӼ͛͢ɋŊȿǖħϊūȂʓƐώЦʮeɖƘȄDƄŎï˨ĢĖd˶МU؀ȱȄlÚĤҜáŨ´¶̭ƆBɖŒƔɸɇάãɲǺ˖ŒȬŠǚuȈȁĴɳΆΙǣɏ˙ǴĊŀį«ʡʲʍǗÝå˷Ș΍Ⱥڧ̷ĵăśÞǋ·νƃA\"],encodeOffsets:[[-8641,7871]]}},{type:\"Feature\",id:\"GMB\",properties:{name:\"Gambia\"},geometry:{type:\"Polygon\",coordinates:[\"@@ņόࣶzȎȦˊ`ͨȷʼIˢƚǞʏεȋιdέǰ̷ȗƭQȫŝއl\"],encodeOffsets:[[-17245,13468]]}},{type:\"Feature\",id:\"GNB\",properties:{name:\"Guinea Bissau\"},geometry:{type:\"Polygon\",coordinates:[\"@@҅ΘΝÈȕʀLŸʯǴÁǶѼƌ˦ɦĨ༈c˵ġĕð˧ƃōȃCɕƗʭfύХ\"],encodeOffsets:[[-15493,11306]]}},{type:\"Feature\",id:\"GNQ\",properties:{name:\"Equatorial Guinea\"},geometry:{type:\"Polygon\",coordinates:[\"@@ƿŴ़̀െmPয়௡T˳µ\"],encodeOffsets:[[9721,1035]]}},{type:\"Feature\",id:\"GRC\",properties:{name:\"Greece\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@Ҡ˱ٺ¶شÑqƣҜĶĿʛ௃íTƒਁǎƺΦ\"],[\"@@ʹՁȥĥԟ|ѫĀৱɓ׌ҿяƋҳAѻўƿȁȊԅрЁ̓ǿҴϯжʑ^ӅޥɠʜѕՓĕ͈ݏ֏Yۍμ̿ڦƧ֒͝ϮљӐÉʆϸТ¼˚˘Ũjɚռö͌ȀҖgƒƦǆت{ڨɲע̉ކĀVмЦɝ\"]],encodeOffsets:[[[24269,36562]],[[27243,42560]]]}},{type:\"Feature\",id:\"GRL\",properties:{name:\"Greenland\"},geometry:{type:\"Polygon\",coordinates:[\"@@ᬜԆ᱒ੴ̴ᲈĄ䀦Ŀ㉊ڗ༅͕ộ⭏ćшƫᲐĠᡚ́࿈ʴۦ̝इӧᒞ̺✘͚ᠼǋҾΫ⃝ױӃȕ᧑ơወ¡ছؕگկध৚շಽ൧ˇ༂ѽȢ܋࣍ýઞܡህÑঈ΁˟̑இŽ୥E੆֩\\\\Ϗပΐћɣଌȿ઼ԣ͈ڱກǉ٫͖ਣӘ˼֭উѵᕖ୆¯ᖯܵᗿڏឧ́ओIࢅ͓ୟࢱᅵכׅ૧ȷ஽ȝܛԱ[כыտോڧͺٿϗ۝љࠍஅ½఍ۈဿLࠁҢ֕ࠐฝਲэոŗݮ୓ޢ̢ئ֗̒ࠪচొ̺ͨΘǬڀॡ̕қůݯţਏ˜Éְ͢҂ެ\\\\႔ɟ෿Քݩ˾࠷ş۫ȼम޴ԝ̺ڗ׈ৡࢼ੯͚XΚᖷӮᄻÖᖟᏅ×ইˌวՈᕂ˄ၚ¬≹ɖ቉΄Ś͜ẊИᶎИ̪͘ᗗ̠ܺͰ᯲ז௢ĚΓϘጲɜᣚƂᣖRࣺʽᕺҨፘ̽୺áპ˙ፅҐŘή\"],encodeOffsets:[[-47886,84612]]}},{type:\"Feature\",id:\"GTM\",properties:{name:\"Guatemala\"},geometry:{type:\"Polygon\",coordinates:[\"@@ћƦԻfϩǖҍΌrʖĮȠšƾКۆ઄Ft˸Ƌ¾ġǺ̵Ț̹ˬϜDBӂ޸BަUOڗßॅʤ@˚ƱòŰʘŃϥ͍ЉɻÏǉâǑǧɇȟ½¬ıƿġ˽Ƀ}ŭ\"],encodeOffsets:[[-92257,14065]]}},{type:\"Feature\",id:\"GUF\",properties:{name:\"French Guiana\"},geometry:{type:\"Polygon\",coordinates:[\"@@͉͑ГÑŗʀȉʹɩνǦɈΪòϤƢή͛ӸáֺѪܠ˸ğؤȥࢸۿƔ·ӻޑʳأ\"],encodeOffsets:[[-53817,2565]]}},{type:\"Feature\",id:\"GUY\",properties:{name:\"Guyana\"},geometry:{type:\"Polygon\",coordinates:[\"@@ր̯Դյzџ̈́o҈Чͪ̇Ƈݱԛɕ°ȣƹџϊ؏ːAŎӃԢܳȱҫî˙ɡϟƥ˅ġǑЭ¦ԫЀÓϴɋьƆܐɸ̐ȕϸ˿ŶŊτțȘѩْ֩ɬɲiϲԬƊȾƾ˽̸ô̬ږӲ\"],encodeOffsets:[[-61192,8568]]}},{type:\"Feature\",id:\"HND\",properties:{name:\"Honduras\"},geometry:{type:\"Polygon\",coordinates:[\"@@ơˀʭòÐʹŗĞǣÒσĳŔʩƈǷǚʛìǨɈáǒÐǊЊɼϦ͎ĔȂƨʊ\\\\þåž¦ϸùϲv˒ĢİĦˎ©ȪÉɘnǖòϨśƄkʲƿʐį̏Źɜɳ˽jśŕ̇ŋɃAȅŃǙƛźĕ{ŇȩăRaǥ̉ɳƹıđĽʛǞǹɣǫPȟqlЭūQĿȓʽ\"],encodeOffsets:[[-89412,13297]]}},{type:\"Feature\",id:\"HRV\",properties:{name:\"Croatia\"},geometry:{type:\"Polygon\",coordinates:[\"@@Ȳ͗ˊʇ͓̓ϝȆׇ[ܟƔϽmǻǧ̝ȖǫΑЪϽǼʹϮ̽͌ȃ͆Ηݔ͇ġƛ߃̶ӣ̢ޑʠ۹ؤǞØϥΞe˲եƄʱγʝˮn̆bגƸƚ˸ƍͤgGɼ̈ĒĈͺڞɠˊĻؼέۜǉ̼Ų\"],encodeOffsets:[[19282,47011]]}},{type:\"Feature\",id:\"HTI\",properties:{name:\"Haiti\"},geometry:{type:\"Polygon\",coordinates:[\"@@ԢܰƁôқÝ͑ȱƙɎʥiɫ֏ƜЅÍԡÔϽƿ҉ʾö˔ޜśيã̢ȈϧθP͎ՋžȌɶ\"],encodeOffsets:[[-74946,20394]]}},{type:\"Feature\",id:\"HUN\",properties:{name:\"Hungary\"},geometry:{type:\"Polygon\",coordinates:[\"@@˨ըǍǼӂDÜ΄ђɋ̲ğ۸ļäǚͮ~ЦžĜÃЂŀȠȢˠ¼࣒ʭǴĒҲɭÎɣԡǭЉ֫ԕ֭کǁԽ١ə̻űۛǊػήˉļǍ˴ƗV\"],encodeOffsets:[[16592,47977]]}},{type:\"Feature\",id:\"IDN\",properties:{name:\"Indonesia\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@Λe૝ך޴ǒѴʭ̎ʭ»ɩ\"],[\"@@ܙȁĳĶø˸ΰԢࠨͬĐǓfʫշع\"],[\"@@̢ɣԲèȼΥॿǛ׉őҍP̀ӚҤPɤ̖\"],[\"@@ūұ౅ʅૣľE̬ښǪՂʥ֔Üݬ̮\"],[\"@@ྔċȂΌ༘З̪կీƵਐӿय़͋ऍ͸ݻwࢍØ޻ưঅ͎؝ČΓŁ໕ΌƣΰޑØּߤ৶·ڴ͡ΒÛŘ̗\"],[\"@@ѝֱćنƬ̠Ǭ˴ȒʗCЏ\"],[\"@@̿˥ׅƸǏΰࡘ¢Ⱦˣ\"],[\"@@̨ٝۿΌۯìӃÅׇȦҦਠऎʕ\"],[\"@@ɼയ࢈ԉ۰ࢼ८ԔݜBܘ̉خ̛ࣘǇbᩑbᩑݟې࡟ǜȷʇ੡}ΦۂՈɺɕࣲЕ۸࿃܆ۗêృަʛУ͑óȏ̮GκٛЮ̢ࣞ״gëɠ௵DͩԄݥƺΡдଈȰњ˜ഘ·Ƃ̹\"],[\"@@ڭ࠭كǉ߱ǐඓ¥ܽŧţٍݪݛҒϠ༪˸çϯλŪιӯ͙݉ߒ੿Ƶ˿ݲॻQտ҅ʙ̐͡Мی࠙͗ȻɶŊ͖؅ӲØࠌ֕ʭîওறՓũίʚʌޜŽ߸ΛPʻֺΎվŤښф౎ǮΎ܎ذپʛ੖śॴࠨ؎Ʀȉ\"],[\"@@©ܽџĈŷԝΌѷɽĵ͹Ւʟ੺ǚڤ˨̨ÔҝӸóĀ΃\"],[\"@@सާহį˫ֵݿַ߱u࠷͕౻ŭ̚ॕϙͫԤ׳´лːৃ̟̩Оս¯ۗĬŹૺнɺЕܘŝ݀ĮުԂ֐Ɩָ֗ӅըǠ՜ÑӪъЖôߒɽۆǶњୠ͔̈̆क़ॲ@ܰƙӍݷآߓơϭ\"],[\"@@छkۻ۰અۊέԚٍۄзؾٕ୴۪݅ʙܠ̳ڀݵՊѭܘمҺࢗऒóђզಢǋݔࠓٮ֫ҪΓߔࣙࡢ_ۺֹӠ۳٘ϥͳۉӖ̞̅sƜו̊ҵؠõФՏɁ਱ಟ\"]],encodeOffsets:[[[123613,-10485]],[[127423,-10383]],[[120730,-8289]],[[125854,-8288]],[[111231,-6940]],[[137959,-6363]],[[130304,-3542]],[[133603,-3168]],[[137363,-1179]],[[128247,1454]],[[131777,1160]],[[120705,1872]],[[108358,-5992]]]}},{type:\"Feature\",id:\"IND\",properties:{name:\"India\"},geometry:{type:\"Polygon\",coordinates:[\"@@ࣚটďۅͮїѕ׽ŒɾएࠜՑ୞חՑϟ͛޻ࠀͅߊЭરһସŉӜёٮāৠȝ۪bĪͪŋՖÞβԠǮìڋlǙކ͉Ոƀ܀Çۈ|ÐԪ΁ˎڴŀވشॸ՘۶ȷ״ΞЀԹ˳Λ࣠űÜ͇̍Ʒèԫ׷Ʋછׅ~ӓҩ۵§ХϏۗځȒࢇȏ˹ĚΣгȥѵ೰ɵEƍ՝ҡѦʸӎϖ¶ϰ܆ӝƜީ]ߝŚóאБ¤ڕζ֭̓؆ѻԿ̻ȅ̩Ԭɣƛԑ̆كžەţֱ̫Zਛǩ´ك҃ӻ௃֡ळ঩كՋ࠷ջCϭлȹݳ̝Ͻ«ʥٙǪધ®ۡΣߙI෗ѣ¡ϣٙʰˣދʃ˱֯͵ʍߑ޸ϳ୴͑ࡒ̍Јѿ߰ȻੂơՀޅ଼Α࿀ʣ੾HৰǍ޾௣ԉףĶ઱৲И̤ʝͤড܊֖֔ᇜCǗܞҽюĩ٨ջϘऒࢢঊÙ࢞ࢢՄ࡞ࠄࡈ_״ܒӠڳд֪݂̇̕Ьβ౤ȱपŰߺ۸\"],encodeOffsets:[[79706,36346]]}},{type:\"Feature\",id:\"IRL\",properties:{name:\"Ireland\"},geometry:{type:\"Polygon\",coordinates:[\"@@ƒ׷ًݣ๯ӹ஑Ŷڼ࢚ѭࡢତڄٌϼǦ҇ǥ҉Բ\\\\ٌǥ\"],encodeOffsets:[[-6346,55161]]}},{type:\"Feature\",id:\"IRN\",properties:{name:\"Iran\"},geometry:{type:\"Polygon\",coordinates:[\"@@݈ǌװӔ֚{τƾװýघэڤğ।ݓظòۻ΁਷ɱؑκŭΫҡˠڡàՓِƙæեݿݿжѵ͸ԓߦυx݉ДƋêϯ௉ѡ̓উཌྷʪࣷȖेŊΧਐЕƪ٣ƭࡑНਇ˦ࡑ٦߳ʈ֗ߘا૪ҍƋՕ˦̻͝ҭѴS҂ˍ@Ɛ،ѝٔ਍Ң׉ߜȜپц̂ÙӬտʨխ৊ҟڨǐʼʿ६ּʈƄͅъϯ־ő̤~রئ̀Øʞʙ́гԼѱȾ¦ˈإߖǩ׎у஠ƟಾɞĄȞ\"],encodeOffsets:[[55216,38092]]}},{type:\"Feature\",id:\"IRQ\",properties:{name:\"Iraq\"},geometry:{type:\"Polygon\",coordinates:[\"@@րʧÚӫх́țٽ׊ߛ਎ҡўٓƏ؋ˎ@TҁҮѳӿ¤֟ê؝߭༟äᛍၖఫךৡɪ͹৾ᇶ࢔͆৬āؘҢȺјԾΰž঎Ň̐ɉЖƚծ৉\"],encodeOffsets:[[46511,36842]]}},{type:\"Feature\",id:\"ISL\",properties:{name:\"Iceland\"},geometry:{type:\"Polygon\",coordinates:[\"@@șիॊֵથٙᝓֹܣƵૉŮᚑˈࠠψᆧЪ๪ǎʘᄋȜ֨նౠŰಸ֭౨Ҝ੒ʃൌ҄ආÑ\"],encodeOffsets:[[-14856,68051]]}},{type:\"Feature\",id:\"ISR\",properties:{name:\"Israel\"},geometry:{type:\"Polygon\",coordinates:[\"@@ƥ˅̣Ŝǫ֓ɂĥɋřɛЄŖp͛нഉց෾ʔˢË¶ɞϼǠيŤɆzVˬCþƦɤ\\\\`·ŕŵhM\"],encodeOffsets:[[36578,33495]]}},{type:\"Feature\",id:\"ITA\",properties:{name:\"Italy\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@̟ڋŲʹǭѝٝ̈́ёĞ୩ѐŞќজûࡪĠْò\"],[\"@@Ԍ׭ş૕ϣÂ΁˫͇ɞ২ȓӒҨ¥рʼ\"],[\"@@ரɏĝЯȬΧڝŪہ̗²зĻʇˠё߀чцۛदڱچLȲȃɽǗݪ̥ؠʩܜѫĔƿƽ̛үϼܳƐΝի؈̷ıѫΗ¹҅ܛΕÝHʲǢҊǼǶ͝ӤʱшΑŀʛδգƴεͶثÆٿϜޑմ֯ӜʿࠪйĮہˤϯŕӝϵΓÕĪθҕńɏٲ̆ʰʙ̀ʂβǵМ¢Ҽ˶ƢƃАǼͺتĿψƚâΆԘšĮǆࠨƤȊ̉\"]],encodeOffsets:[[[15893,39149]],[[9432,42200]],[[12674,47890]]]}},{type:\"Feature\",id:\"JAM\",properties:{name:\"Jamaica\"},geometry:{type:\"Polygon\",coordinates:[\"@@֢÷ҀȫƔɯןeʭƗҹƊӑ̪ĶȔΜÎȒ\"],encodeOffsets:[[-79431,18935]]}},{type:\"Feature\",id:\"JOR\",properties:{name:\"Jordan\"},geometry:{type:\"Polygon\",coordinates:[\"@@Ʀˆपͫ࿪ࣆͺ৽ǅų၅у࠸࠿ˣƛƑ˭ٙřȩ̡εʵधƆŨоഊo͜Ůʚ@Ԥ\"],encodeOffsets:[[36399,33172]]}},{type:\"Feature\",id:\"JPN\",properties:{name:\"Japan\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@ņ˽ҿԕΉːљțɝӭշʈRЊҬԆӌīΊΜؠǹ\"],[\"@@́ڡƤсѩף੹Ѓ๏½ணॡ͔֡غษȃষЃঝe࡞أ֗෗իΝН͜ȶݶՏʒͿ־ߐʶѲՈࡌѢ؞ָာʤ࣎ǣࢠ๺֔Б௾ࡀӌ͜ՈਈƟा΢ՎࣀƸҞୗ}ڻޥࡍbࢁ\"],[\"@@נǵרΤȈहఝɯ݁࠱೓ָқँण]ř࠴д٨࣌²ʖ୐ʜټন࢓٤˯\"]],encodeOffsets:[[[137870,34969]],[[144360,38034]],[[147365,45235]]]}},{type:\"Feature\",id:\"KAZ\",properties:{name:\"Kazakhstan\"},geometry:{type:\"Polygon\",coordinates:[\"@@ӕƹ્דο׹̹KɱЊ੫ǡێХNÚࡆ৓ؘ෷ßডũߣݶۋ͆ಥ׼ƽðᓗӹᶽљ£יچ֧ɼॕǩχ˧±ȲȶΖǅ̊অ˺ϛݮҩɆ˜ࠊāؘ܎ƎܼűƲࠎƭԲ࠿£܍ȴঃσ޵ǭяƌĐўՙ֘دw܉֬ӞِʕǢڢऊࡺӣŀؘჄࣴಾtᇢ׉঺ͻࢼΠ೰j੺ѥʔʠ୼ɂЊഷ׀߮Цƿɮ߮ɔ؅ֺϬ˼Ḯ̈ШȺᑆ̴ݰΒຢǹ˄ࢉ࢚Ȳઆ˹éҝ߮´ᑌߎ̭ˁ੶٭ሠᒑ҄ѰୄӛீɎҪƯКӟטǋΨΥ઎ŒѾԣٕ֓ۥÿ¡ࡅұϝဟˢ؅ຑїȇဗͱݲลֻɓäӏԭŬу̠ఝĖඃx̧ġ஥ΞӉǧŽӹ൩̂փşȉρ\"],encodeOffsets:[[72666,43281]]}},{type:\"Feature\",id:\"KEN\",properties:{name:\"Kenya\"},geometry:{type:\"Polygon\",coordinates:[\"@@ӾۙיͱȹΕ̿Õšףˑ͹Ǐ֑ͷ˥஻ࡀËӤᵁႌƙĢSࢺʊ;а֌̨ؔσ॰įтЉ׎ԬԈ֬ֆѨƗ@ҽ˺ˡג@੠܋ˈSȠxȄī֖ßʞΔގΚͺ˳ָAܽ॑Xᵣ\"],encodeOffsets:[[41977,-878]]}},{type:\"Feature\",id:\"KGZ\",properties:{name:\"Kyrgyzstan\"},geometry:{type:\"Polygon\",coordinates:[\"@@ȊςքŠ൪́žӺӊǨ஦Ν̨Ģ඄wఞĕф̟Ԯūşȏ೛ғ̙ͭઁıͅ՛ࢷŒׇǏߣЇŜȟʇȓཟŵਡ˘࣫ÝĂӜࣴƕ̮ʸٖĉ੾؂঻ѸױȽإ͂۶ծʟĊ\"],encodeOffsets:[[72666,43281]]}},{type:\"Feature\",id:\"KHM\",properties:{name:\"Cambodia\"},geometry:{type:\"Polygon\",coordinates:[\"@@΁Ѭыࢄȣ২ՠۨઘǆ߀ťۚ͡Ϟׄݖ̱Ȝ֕Ļ৕ඳ٧τԙࢥÓܫͷ۱Ū\"],encodeOffsets:[[105982,10888]]}},{type:\"Feature\",id:\"KOR\",properties:{name:\"South Korea\"},geometry:{type:\"Polygon\",coordinates:[\"@@ܨযȺխPॷ̓ҥݽǉڥΏݳïĥҚƼـχ࢔ذƚֻܘÂúϒ͞Ϝצ¢ΨÈŨȮ\"],encodeOffsets:[[131431,39539]]}},{type:\"Feature\",id:\"CS-KM\",properties:{name:\"Kosovo\"},geometry:{type:\"Polygon\",coordinates:[\"@@ǣŃPĘ́ȩĐǳɦƾȌȪÒŜ˨ư²Ţşƾ¿ŌƅƒǎƻŢLĥȳĳĳ×ȉӹŻ\"],encodeOffsets:[[21261,43062]]}},{type:\"Feature\",id:\"KWT\",properties:{name:\"Kuwait\"},geometry:{type:\"Polygon\",coordinates:[\"@@Ǭχõȓ˔هשuȽАݟĆ؞߮֠é\"],encodeOffsets:[[49126,30696]]}},{type:\"Feature\",id:\"LAO\",properties:{name:\"Laos\"},geometry:{type:\"Polygon\",coordinates:[\"@@˚Ϝ܆ڹܸ¿ٕࠦھٍÎǛ̉ӯyʣƨࢯԅoݬȸࢮ֧³ԎηʸǴ̲ܐնøȡ҄wŵ०ѦŬӮڏϖޅਚO͚ܹ՝ɗʉ̟৔ԉۦ঳Ռ݋َ׏ɄץƵ࠿ݕ̲ϝ׃ۙ͢\"],encodeOffsets:[[107745,14616]]}},{type:\"Feature\",id:\"LBN\",properties:{name:\"Lebanon\"},geometry:{type:\"Polygon\",coordinates:[\"@@ɣ[ýƥ˫D̘ۄмעfϘ§Ɛͣқ̓ȷҟ\"],encodeOffsets:[[36681,34077]]}},{type:\"Feature\",id:\"LBR\",properties:{name:\"Liberia\"},geometry:{type:\"Polygon\",coordinates:[\"@@ɗQࡽАޅٖ܏Ң֣ըȪː¬ʔϜҘϺϺǶnɖĨΘԧÇ͵ǐǳʂIǢ͸ʄsʓĎНǽύʖɱˊÇΤΙ~ͧăĿÝە\"],encodeOffsets:[[-7897,4470]]}},{type:\"Feature\",id:\"LBY\",properties:{name:\"Libya\"},geometry:{type:\"Polygon\",coordinates:[\"@@ק̷ҿҤ೧βρՄڑϸϻƷ̗ҶήӹؔͬΘñՈńҠÓϦƨۈ¯϶˕ݐШȜðΠėΒ־͔ʶːЦʌ´٦দ́ΜðۮƓ૞ϓЀݛݮǍஆΙࣆйЦɔЖϮț٠˂Ф؄ЀׂŘ଒ǣ˺ϑ̺Iˌƛ࠴ıȲˣ̣ЕżΫɏԯʦڱ@Ჳ@ᶵ@့ॱGYΙ‧ྐ‧ྒࡓҟ\"],encodeOffsets:[[15208,23412]]}},{type:\"Feature\",id:\"LKA\",properties:{name:\"Sri Lanka\"},geometry:{type:\"Polygon\",coordinates:[\"@@ų࢓ΙʇܵȓЍڜƫீϠ഼׆ұϺסО࢓\"],encodeOffsets:[[83751,7704]]}},{type:\"Feature\",id:\"LSO\",properties:{name:\"Lesotho\"},geometry:{type:\"Polygon\",coordinates:[\"@@̆ʩʳУƛ˛ҳſƹˍ̛ċؿ٨҄ՐҖ͢ϼǠξʵ\"],encodeOffsets:[[29674,-29650]]}},{type:\"Feature\",id:\"LTU\",properties:{name:\"Lithuania\"},geometry:{type:\"Polygon\",coordinates:[\"@@ãɊĚɲχƄࢡƨǱ۸२ʴඬÁࠜĊŞǩ҂Ã߲СĀϓۏˏșӃ࣯̓߻NȫʶљĜ\"],encodeOffsets:[[23277,55632]]}},{type:\"Feature\",id:\"LUX\",properties:{name:\"Luxembourg\"},geometry:{type:\"Polygon\",coordinates:[\"@@ǘȏ³ρʍiȉòĞҼɖ\"],encodeOffsets:[[6189,51332]]}},{type:\"Feature\",id:\"LVA\",properties:{name:\"Latvia\"},geometry:{type:\"Polygon\",coordinates:[\"@@نЮՆߊ˼ڜعڪhǊ٤ܐƪςĻܢ̷ۚCКȕîС˒ӷ͕ࣗԛƙ߱ТҁÄŝǪࠛĉණÂ१ʳ\"],encodeOffsets:[[21562,57376]]}},{type:\"Feature\",id:\"MAR\",properties:{name:\"Morocco\"},geometry:{type:\"Polygon\",coordinates:[\"@@ԒΥߜÎࢊȃκU͂՟ºԝ̄ࢱɜǱƷ͛ષƙϝ̵ӡñثঙ͍ͩсۍɥ࠻ŷഫاRহŷ@@@p҉Ա˓ȑϡ@̥Ŋ۹ě˛ٻʿÕЁ੕ୟ࣡ˣୋ΅ϗĵ̡ቅãaD ϶͒ɮ˞ѪÃ˶̀פҴՖ˲ƊɞӬp҂̤Բ̪֔Ւ࡬f\\\\ц͔ްĢڎָтɠۮۮȿਸ਼͊ܢŔѶդ֨ࡈϦخΐ֘࢈˄ԪؤI\"],encodeOffsets:[[-5318,36614]]}},{type:\"Feature\",id:\"MDA\",properties:{name:\"Moldova\"},geometry:{type:\"Polygon\",coordinates:[\"@@ȨŮ֒ĊؤʽΊϞɥÑ˵̪ƏŨΗ̊ɇÏűƾčɝ×ӷ|ĉŜǫãÒƭɱˍƥ˽ɁĝƯϦĘΪςӝԂˉΠʹʠʯĈ\"],encodeOffsets:[[27259,49379]]}},{type:\"Feature\",id:\"MDG\",properties:{name:\"Madagascar\"},geometry:{type:\"Polygon\",coordinates:[\"@@ɠΥȺ։Ɗঢ়ɒϽĉЗƩʙ˷ӰǁʝǈثõΥɵȗ¿܅ͧওб୅ԯཧ͑ୟϛইہȣܻΡӛɊڙ̜ɳѺÇݘ̑ڠù؂Ʈ؄ϰƢD˪Дِø՚șЈǃՌãޠ̊ҺŔՒмҶǤ̶Ʋτ\\\\ӐӎۖԮʦцŗάΦĵҪ׎fԐ˦ϔ̊ί\"],encodeOffsets:[[50733,-12769]]}},{type:\"Feature\",id:\"MEX\",properties:{name:\"Mexico\"},geometry:{type:\"Polygon\",coordinates:[\"@@͙݅ƥ؁Õ૷ąЧƤқʺЧǚٳ֎سȞӏ͢бࢾɝΐΙ݄ɾٚĎؼưՊƠՖ΂ȨӬè۸Ƣʖ֬ɚࢶȚݔԚîȬǱЙҋԁȥԝƸƥűγɁٽɅɎǭcǃY̝ԓƳĲķPŭޥV޷AAӁϛC̺˫̶șĢǹƌ½s˷ઃEЙۅŢƽĭȟqʕ्ࣞџ˘ۇɖҷÓګ́чĉץɜؿǄ޹ϬؿŠ्ϸ۱ВɃɤҹº࡯ˈΓϦࣗӊсՌȧЦ˪ĈđʈȖɔJ̄˱Ϙùͮ˭ъ݋࠴ࡋڀУԼܝ΄ƷȴŸԲѓȞӹФȽהҍæӣѸϿФˀҍو̓٠^͔؇ͬ˫ӑɴƇͿƔЕĆف̀΋خׁƒȡŸÓŎ˽Ƭ\\\\ǜթʮɇǴ̕Նё˨ޯʠρɸϿ²ѷКͶϡ̨ϑqƭΝ̱ƫJɛԞջӎ؃РїɈؚŵҖЏʺֿϒŏŇɃɖԭȰӷӦÖÚΊ³̸̼Ϝ٩׶ӱɶ̱Հ̷վϳڦͿݲॖÞ੪ĞÿǑ౔СኀףဪPژ@DΌผ@̪̕јˇԀσ˨ѭȾҥѢʩۤʥՊڒۊhפͱфֹ̄ӯӸӏȂחɾЃپʹ׮ȁ͞|\"],encodeOffsets:[[-99471,26491]]}},{type:\"Feature\",id:\"MKD\",properties:{name:\"Macedonia\"},geometry:{type:\"Polygon\",coordinates:[\"@@ńOǤӺżȊ˺¶ϴbтˏÒ։ǅƑƥҕh͋ǿջõΑȴšήń˸\"],encodeOffsets:[[21085,42860]]}},{type:\"Feature\",id:\"MLI\",properties:{name:\"Mali\"},geometry:{type:\"Polygon\",coordinates:[\"@@˰ƶƘӶˊpזɻӄǖ͖ÇŴȈ⁚^ȈךƣļЛ⋈Л⋆౾dᬼᆳᬼᆳȨϿԺʉ϶ƋV՗ठĈFካҟ֗íԭݛƃ଩ï̳̗ա՟Iȿǈҥš޻ΑǅʿٳϕŗɍΙǡНŔɱȳūֻڙۡp˳ɭΣÆӥ΋ůȝŁŽάʍĥơhƷʕ٭PɷŴŉùʱʎ¬ʢĿİǳĉ˚Ǥɐ΅ΚĳɴȇȂǙvȫş˕őɱǹΫäɷɈƓɕőƅAµ̮ʾí̽͘ʀǓӔԺ\"],encodeOffsets:[[-12462,14968]]}},{type:\"Feature\",id:\"MMR\",properties:{name:\"Myanmar\"},geometry:{type:\"Polygon\",coordinates:[\"@@ӫηץϥࣥΟƳО݅ՔؗΈօ̭ܵ̃ƹȪу֖ڙĪҷ_ϵ͠ދң޵Сࡷăذʴ٠˯ӼæࣸͽѤ˛৔Ʊਗ਼εۢօуॕ׳ҽöԳȠ̂ਪǫ޾څॺļ̢ӭņ׭ۆÅڰ̊ŵj׾дȦęΤȐ˺࢈ڂȑϐۘ¨ЦҪ۶}Ӕજ׆׸ƱçԬ̎ƸÛ͈ӮÚˮӵξȧ|ٟۙߓۭĳঽࢲƔȨޛՐǍʓۣز́ζƷ؞ʔ~΍܏յǳ̱ӓȗ\"],encodeOffsets:[[101933,20672]]}},{type:\"Feature\",id:\"MNE\",properties:{name:\"Montenegro\"},geometry:{type:\"Polygon\",coordinates:[\"@@ÁǀηЯÊˋǫÞɽ˞εǖĢƜŬҦ˚ȜƾüɠƟŬśˠě͌ǧçïƽȋɧó\"],encodeOffsets:[[20277,43521]]}},{type:\"Feature\",id:\"MNG\",properties:{name:\"Mongolia\"},geometry:{type:\"Polygon\",coordinates:[\"@@ࢮƢ྄ܤ౬Єܴʳ࢚]֘Ͻ࠼ௐɁࠈגͿӶࢊࢊश΍ނįনɍǈؿஜΛߐƺਫ਼ŌࡆōࠖЗԚѕެT੒Ƌޜȼૈƒ௸פԌĝѰ˭ৌêХهק࠽ɐ΅ӈńࠤŽ٦̴ڬˏހוğ̗ڏĦ௟ŏןʅ؝։౱͙࠷ѽࡹǞҿúѳէˎ͓ƌˣי˯׽҇গ̑ఽഫ̇এҋϋʾ৭AఓԜࠥŰૣśჃȊऑmӱԀϣޠԱĢ৩ԼଅŞুƞ̡θ͖চׅڲன̀۷Ѿəז\"],encodeOffsets:[[89858,50481]]}},{type:\"Feature\",id:\"MOZ\",properties:{name:\"Mozambique\"},geometry:{type:\"Polygon\",coordinates:[\"@@لæ৞ʁɖńגt̚ʦԌaऀ͜ڞӤƊϕ࠷ľ݅ಿƨЫʣ׷͙׍՗Եޏ͉ृСॉ͓ࣕƵוׯ΋ȗí׳ЌُǔӱZʣƪ¦{ࠗƋϷȤƝűΓΗ̗ۗ˳য়ҕρ̳ðΟɊÉíѵّRïϊůϖí̠ƬपɓװГஂࢬ॔ɜ؆ŶúĨӶƉʞغǐ׌E੠ѥ˒ЏÔǹȼϳǰ۫gÅ̼āװᢈۘӚЕɴüͨɅ¸͵ǯϷØסոԱʲ׌ζǰíઊΙ؈̣˖̅]ɽદɾٔ\"],encodeOffsets:[[35390,-11796]]}},{type:\"Feature\",id:\"MRT\",properties:{name:\"Mauritania\"},geometry:{type:\"Polygon\",coordinates:[\"@@և־ԗؤ֍ɞГʚҵUЧǽйð˽ˏïҐɺаŀߊģࠨĵкČмɑЎѵδǾˬᾔMǃ௎ȴќ߀øᒸ᪂©F౞Ṗ᎟౽cМ⋅М⋇ƤĻȇי⁙]ųȇ͕ÈӃǕוɼˉoƗӵ˯Ƶ\"],encodeOffsets:[[-12462,14968]]}},{type:\"Feature\",id:\"MWI\",properties:{name:\"Malawi\"},geometry:{type:\"Polygon\",coordinates:[\"@@ɽٓɾથ̆^̤˕Κ؇îઉεǯʱ׋շԲ×עǰϸ·ͶͧɆɳûәЖѵɔʮޮ˄̈Ǉۢǚڼƞɪɉ܌Ѕϐ࠘ƽǜɵ˶Ϲɾଡ\"],encodeOffsets:[[35390,-11796]]}},{type:\"Feature\",id:\"MYS\",properties:{name:\"Malaysia\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@àћֈĶ˞ΈȘýӸԓΜ֛¶֣ęϡĆ˿Öӻ̒ɵͤݑe˳׫Éߑخ঵ښįђӟ֚ś̡۠ҜĠؔȃΤƤƮۈρ\"],[\"@@أ˹ܯƚॱ@̅ॗ͓̇љୟۅǵߑɾЕóөщ՛Òէǟַӆƕ֘؜˽ٮǀǜ܆άǂ৖Ǻ׾ڔЬՐϦѥǮ˺В¸՜а٪אшڀͼHќыιֆɻ۬ʧÑ֝͡¥ƮЧ\"]],encodeOffsets:[[[103502,6354]],[[121466,4586]]]}},{type:\"Feature\",id:\"NAM\",properties:{name:\"Namibia\"},geometry:{type:\"Polygon\",coordinates:[\"@@رٌؖ͡ȃࠊȷ،˯ಒm৒ŅҞ͛Όѡۜѳ৘ǽՆۃࠐ»٢КǆԊƞհ}ԄϝŶÐ₮׌Е᎞ş໴΂یȒհµͨȍPéӁȍʭC՛͍ͣΎಕ̍س{ᲽࠣBយA᷋ݣѕҋÕՇǄϗÔƗάͩɰГг\"],encodeOffsets:[[16738,-29262]]}},{type:\"Feature\",id:\"NCL\",properties:{name:\"New Caledonia\"},geometry:{type:\"Polygon\",coordinates:[\"@@ېԵѨϭ͉ȫҥɪ׹ϚէѼ։פś˶β[Һ˹φ˷ˎɻ\"],encodeOffsets:[[169759,-21585]]}},{type:\"Feature\",id:\"NER\",properties:{name:\"Niger\"},geometry:{type:\"Polygon\",coordinates:[\"@@nּॹȐОҿպœϤâТբ̴̘ପðݜƄîԮҠ֘Eኬஈϒᝪ࿸᮪ཾ೨αӀңר̸ȸಯ̾ɓ`ˋΔ˽ǻί͕ၻ«ધੳߋγૉΔ̵CեբmčЃʁµˋƻm֩ंȟځҷٱʔҍ¸ʏşӯ~ӷΧѓq৯ѢЉȵѓb̿͆ࡅ̼ࣗıɕǻşӗʋ͹ÍݣٗӚ̟E˭ʗ\"],encodeOffsets:[[2207,12227]]}},{type:\"Feature\",id:\"NGA\",properties:{name:\"Nigeria\"},geometry:{type:\"Polygon\",coordinates:[\"@@ࢍ̡͉¬͓ȉڥl҇Ղˡ؊שֆكYݍB¶തs՘ǂՊʶʴТԴėɨǔ͸ȍӾ˪ÎݤʌͺŠӘɖǼࣘĲࡆ̻̀ͅєaЊȶৰѡєrӸΨӰ}ʐŠҎ·ٲʓڂҸȠ֪ँƼnͬͯğƱ«˧۽ٱɛՙšѧǱȉǝי҅ΉŽыȋ͹ÿΓֽ˱ҽΊ͇aԃӭʑQЍ߷ɍש\"],encodeOffsets:[[8705,4887]]}},{type:\"Feature\",id:\"NIC\",properties:{name:\"Nicaragua\"},geometry:{type:\"Polygon\",coordinates:[\"@@̃ˆϽͺȁ˲Ο˄сϜĤžƒŵÚÒʾŀȔŬRkЮȠrǬOǺɤʜǝĒľƺĲ̊ɴbǦĄQňȪĖ|ƜŹǚȆńɄB̈ŌŜŖ˾iïă§ȉĐ̫ȗ˹ěͷυ®ɏtϙŹĉýΫÌɛǣɋ ɩźƏȩǱʛÈƓǦˉêȕŉօɞųŇ\"],encodeOffsets:[[-87769,11355]]}},{type:\"Feature\",id:\"NLD\",properties:{name:\"Netherlands\"},geometry:{type:\"Polygon\",coordinates:[\"@@ۦyǀ˳Ƚޓɇ́ԍ@ƘࢡҥȞՏπީǩ؛âѠɲ݀ఆଲΘ\"],encodeOffsets:[[6220,54795]]}},{type:\"Feature\",id:\"NOR\",properties:{name:\"Norway\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@᥆ؙઍɣऄՅෛ͵ڵû΢לઃͰಫ˵Ы؝ߟωࣗȮ઱¥णѼԉɝԷūփནƊɝҵ߭Hևױ࠿झಫ஁̨˹̇ͫ࠯bձ޿¾૟՞э˥ধֻۧυӛ֝Ԫဋঁ૫ȟ୏є̛ࣚˇ኶ޞզᕠ۶ဌࢂ໤୦፺ྴඦلᘼ੊ᇎπ൪­౮ۢ໖ພǘ\"],[\"@@ም΅๝Ȝ׆ɐԕˎეǚͮ̿ொȍ\"],[\"@@᪖صᑟͥұأ݅ǁЍۡৣᅵԢނ̘ఽʐ࿕܂ٷڄᘎ̜Ң̋஦\\\\͊˼௾੖̋\"],[\"@@࿮̏ఝҍ᝱ı៙ƖƫɴஹdँϬᣴɼ௞ȫࡘʤᑺȽ\"]],encodeOffsets:[[[28842,72894]],[[25318,79723]],[[18690,81615]],[[26059,82338]]]}},{type:\"Feature\",id:\"NPL\",properties:{name:\"Nepal\"},geometry:{type:\"Polygon\",coordinates:[\"@@ÝαŌՕĩͩ۩aয়Ȟ٭ĂӛђଷŊયҼ߉Ю߿͆͜޼ՒϠΒȪڪʳࡔշҾť˰ЕٶǓۀσौȕঔć\"],encodeOffsets:[[90236,28546]]}},{type:\"Feature\",id:\"NZL\",properties:{name:\"New Zealand\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@Ȓ΋װ;ʐΡBΝ̹ϳչإїͷ̴З٭Yܗ̓ɣջӋࡗڇϓнʇޝlխˢࣱÐƗ̰Ҍذ੐ࠦժǀ׾͌ܜѰԎѦώظ͈ɆŰҶלϴȆΧ\"],[\"@@،ࢫlָϜɯŲًڰ˛֨ãӒ͎юĭȯݗʯӫٛjɡʭþαūƻͅҏзֹ٭ͯƟɘΕŨӞ۔˟ҨࣛͲz̦؈̌ƚ٨լͻ֜vƪБΎڋݔΗת̸àҚұٺɑʂݡ\"]],encodeOffsets:[[[177173,-41901]],[[178803,-37024]]]}},{type:\"Feature\",id:\"OMN\",properties:{name:\"Oman\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@ֹ̻ϟªǩȧƉэļ֗ÿĻϯFԽ̻ćХȓǯԹP͡ɃJͻПɷҩĂ֗˳ϱ³˝טٿ൴ᠾ࠾֖၂ϩתv͸ʔΐFΆϞǒƩŞèմіHϖֵҸ̧؞ŋӼƳϜӕɨ˧̞ŃCȉ̩ԃƅɽΟˏ\"],[\"@@ŉƳǅ˺ʔ˺ľñā΍\"]],encodeOffsets:[[[60274,21621]],[[57745,26518]]]}},{type:\"Feature\",id:\"PAK\",properties:{name:\"Pakistan\"},geometry:{type:\"Polygon\",coordinates:[\"@@تϻʞ٥൨ͻ߹۷ऩůౣȲЫα̖݁̈֩ڴгܑӟ`׳ࠃࡇՃ࡝࢝ࢡউÚऑࢡռϗĪ٧ҾэǘܝᇛD֓֕؛Ɇʣ؀٭٘໻ǁിeஃŝ̈́ঊொѢéϰГƌw݊ߥφͷԔеѶඨѕࡀŲԈŅǞȂגóદΔ܎ҶӈشCĠɼٞŌ̴ý͢ʀ±ԌΦԖ՘Ɇͥ֊ߜɴ̢͒мΜĩмȣΤӬμࣘǮ८ĮѐƺӨĦ\"],encodeOffsets:[[76962,38025]]}},{type:\"Feature\",id:\"PAN\",properties:{name:\"Panama\"},geometry:{type:\"Polygon\",coordinates:[\"@@˫ʎǵҒȺɢɅÎƿˤлɸοÁǝ̇ͻɁǽĉǩВҗɯŅŧŭϷ©ơԈŋƛˡ¸ǝ͸·ÈɓİέCǻĩŶªǖìǠƲŲĲǩŲK͸͘ö̠̝iǱͲĀæɴȵЮÔΨɄԜǞ˺ʤҬ·ĉҶώơ˜ʧ̈́ɵĹūȜӵǁʟ˓ÒŅС\"],encodeOffsets:[[-79750,7398]]}},{type:\"Feature\",id:\"PER\",properties:{name:\"Peru\"},geometry:{type:\"Polygon\",coordinates:[\"@@ɥљћɋࡅӘñΈရࡊທࣾ٫԰ΏۜƐʎ܅ાࠣ༄ߍီ΅Ϥ˃ؤٷպױͼ˖ϒПߢʼךڢՎĲΓʇȧx̭ΎâͼĝΚщӆΌǄ֤ԦܶৠͨࣸࢠʾմŝٔɢĂ֒ЉˎЅϴɏӶࢣضĿҨɞ̤ƣԎð٠Ͻթࡣʤoрҁݳ œųۍǉ॥ֱÓϻɉ̇ČғԕʍBΡɛƵΔݳҲԝǱί֐µ͆҃ݐuېӸÇ౧ϢĩӄƠܪടǷ˵£ןg܍͟пƮ̵ȕ˯β۹Ջ࣡\"],encodeOffsets:[[-71260,-18001]]}},{type:\"Feature\",id:\"PHL\",properties:{name:\"Philippines\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@Đ֏ºҽ˹ޑ̫ࡨϽэˎإʉϿ঩Ӧɿ؊ʰЎՑЈˁΑЃثҵƑʖ͢۾ՌʀҜ̈́̔ϝٔɰƎϒרv·ٰڼЋêхÐ̱\"],[\"@@̟ˡˁՍ˃ʝԫ׈ǦɤɂɾĢԸҨ¸Ɖ֣جߺāߡ\"],[\"@@ૣߕЬט؈԰Ԏ׊Ѱ࠲Ʈۅևҧѳֿ\"],[\"@@Ԏʹ՘BgΗϳΣՕʧϸÒєŽА\"],[\"@@ʀभ٫ɞj˭ȶԯЍȋעʧªƁԘӶãY͈ԣٜ߮mɴ̻\"],[\"@@ɟܩέоѓ٘ܚ̡̈\"],[\"@@ԮʉʶɖüɇƍΑ˼׻ɛۥӷ˥ƁڳȊڝѾġϊĲਾүăҙ˜ȫēϯٻЮ̵Ѵɍ̯՗ԊރůлȆ¨ΎˀɊʣȘŇ̡бӚűμߨͺˡĔೄ˜ހԘA\"]],encodeOffsets:[[[129410,8617]],[[126959,10526]],[[121349,9540]],[[124809,12178]],[[128515,12455]],[[124445,13384]],[[124234,18949]]]}},{type:\"Feature\",id:\"PNG\",properties:{name:\"Papua New Guinea\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@ɽčε͔ρՔǷ٘ŜĆĜʡʬȏРՑЈ˵ŝɽ\"],[\"@@ѯçƃɽҟȱћȟѽBۏʔӑɺêʺݬũҠàŶЖŦrĆѽӐÜʂ˼Ҹ̚ġӸԌfǜƏgү˯ԡ\"],[\"@@ݤտղࢻӖω٬ƛʥǁࣀΝġʏ֋ÏȷɔܟĦࡕŴٷ՚ӉҦѧ݀ભπ܇ʇԡˣńإڇ˿һƖࢅaᩒaᩒภ׃༊ӓׄїҴхŸӵඔԱȲѽޛěȄ֕\"],[\"@@ʿɡǁӸȝ͘ϝ˞ӍΪ؇ʚɺȮҒɻ˸ȁΜȫʹΛ͊ˏĶѧ\"]],encodeOffsets:[[[159622,-6983]],[[155631,-5609]],[[150725,-7565]],[[156816,-4607]]]}},{type:\"Feature\",id:\"POL\",properties:{name:\"Poland\"},geometry:{type:\"Polygon\",coordinates:[\"@@·՜à̂ȹ̧҆̚ɺɤȝђָʘ಼ϴ੒˴࠼ƙÚȱ߸Yਚħ໶^њěȬʵωɸ͋KͯԋǡʸϳfϏцܻěɽзįރۥɒϗǿ¶ߙ͔؁šЇĒӹǵч̖Ήŕ³¼ϭаر¼ăˀֻĦűɑҗǨÀɴػòЉ˔\"],encodeOffsets:[[15378,52334]]}},{type:\"Feature\",id:\"PRI\",properties:{name:\"Puerto Rico\"},geometry:{type:\"Polygon\",coordinates:[\"@@јõưǕɋɃمLӫ·άŢŬیK\"],encodeOffsets:[[-67873,18960]]}},{type:\"Feature\",id:\"PRK\",properties:{name:\"North Korea\"},geometry:{type:\"Polygon\",coordinates:[\"@@Şƥ͉ºη˵ʣ˷׽ѣȅƫƧ̓ʝ֓ƏηɥηįġͰƋӈσŧȭΧÇץ¡͝ϛϑÁùСǆĵƿʙéǀɑüɥƆɰφȤİõƶɆҒÅƎөĠЇɤۄբऒҌ־׮ЎˁܪſѺಚβͰҼժӹ\"],encodeOffsets:[[133776,43413]]}},{type:\"Feature\",id:\"PRT\",properties:{name:\"Portugal\"},geometry:{type:\"Polygon\",coordinates:[\"@@̦Ɉ΄ŬɂЫӺDƞłӪɼуϱɩYٽƍūЇγçʹԋɵտ̄ʡřɫ̵̿ê˥ͷɓѷŠџġŸڂÿԬϓþȩ͈äռͰ̨ÒͼǪԎkΤǙ̠˲\"],encodeOffsets:[[-9251,42886]]}},{type:\"Feature\",id:\"PRY\",properties:{name:\"Paraguay\"},geometry:{type:\"Polygon\",coordinates:[\"@@ͦ৖tҌЖ݌าʔޮ]޴їbʵʞҳÇଛࢲǇ΄ǐ֦ɩǀʣþޓİ͓̼̀ƌ̢ƳAҥŕӻǑӛƍݏށ١ړƇऻŸࡑɮࠢ౨ťψࡽ͢ਅبۉŸ໵ൌ\"],encodeOffsets:[[-64189,-22783]]}},{type:\"Feature\",id:\"QAT\",properties:{name:\"Qatar\"},geometry:{type:\"Polygon\",coordinates:[\"@@ÇؔɨѲɰĜʬˁdӯǽӳɵÑʫǖ\"],encodeOffsets:[[52030,25349]]}},{type:\"Feature\",id:\"ROU\",properties:{name:\"Romania\"},geometry:{type:\"Polygon\",coordinates:[\"@@δǶԴġՠGϸȳ˺źبĄɄȠΠ@ʰćʺʟˊΟӞԁρėΩưϥϒƹЂƊϠƟpɏПǹʯĀɻ৥ӳĖ̪ؑফțзɋ௽¬٥ƀ͙ÕʍΊƵƦȚƘȷŀ˃ȋөʔßΌԟȢĥˌҕͤڪǂԖ֮Њ֬ԢǮ\"],encodeOffsets:[[23256,49032]]}},{type:\"Feature\",id:\"RUS\",properties:{name:\"Russia\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@ࡌ๫కˤԫ்ࠌࡳyוُԒսٱƻ۸Ĥࠊħ࣢Țٌ૴ӯࠜôରަϮͭϴϐŠɔ։̆ߵuࠟΎࡑ\"],[\"@@໵]ਙĨȒτ୊˚ࢢƧψƃęɱäɉ\"],[\"@@֦Ƚțؐᗸű࿨޻࠭λ൛ēsࠑͳǩ޽~ٗ̊ૣʖȉθ࡟Ǝॗŉҗ̎Ǽ̸৓ȥϚЃӉΣ@„Ꮪٛᔺ࠳ïԷ\"],[\"@@ः©ƭˌੲΖ@ַ\"],[\"@@ળ»@ָň܈E௒ʉïŗࡽȩ\"],[\"@@ౡMႣĤƧ¬ߘͪੀþஞ͏ĸə\"],[\"@@ॿͩഉø༛ͨȪ˖༨ųᑔɗ\"],[\"@@ډرᶽzඃȣမղҎ׀૎ǂᕞᴬѽ\"],[\"@@ӹóᩣŊɟώູɦūҒ࡮ǶҞသܒޙĺ፨݆ɩϢሤѺ᪪բ᫠ǀ෴̸࿐Ŋאͩ֟ʻᲗз᢭Џᤙߝఫࠍ೉߱Ǡۥྎۏ\"],[\"@@ɨгސȲឤYቈЧڬ̿ȽѧङʝᕅүفʟਬşఖɃݴǄєաτɔഊƂ᧪ƑȴϽ↲ů´ٜᄼƥഄLബѷϮ՝ӹΙੌڋ೔Ϳ߸ࢦഖϙ෢ɦྼʵؤʀൖş؅ޮૐζ䢀ձܐӿᔲٛ₎ǄာƑ۪΍Ĺؙਜʇ૴Ǥ๰vཚǑཪĢะݛਪˎڷ՞ϐώᧆɻფºᝂБ୲ν@”MKઇσઝÖݶҁԄەϲɧĮΏɑɝ༧Ǿ᚝مݛĭ౽ן௛ԧ̱ϣய׊ᔗڇϣ̸ߵΫ૱Ř˓ց৙߽ͻड़ȋő௣ޭΫ۱Δα฽ѕ̅ॡభȳʥ࡟ே޳ׂ̳έ௬ҵለИ୘܀ԆªϾರȊຊ੒คࡺຢڢڮஆ৷ëԍۗᒉइۍਖᓧ˷ᑃටۚԧሙɕಝēÔ؊ಯŶ਩ЭᢵƠ᪏ʟᨩ࿛ủጝ೚ŁаՃࠄȅ՞оईÃௌऍ܍ځ࠽ë্ϛഉ్௓˯ׇଙ঑ଇॻթӹ૩ӱՉYՇФૻؙſ˩ŝƦKѐіxŦ঴ɛܚܞ̒৶Ʃ֢ࠈ˾ऄ͚̮Ѵݲ൷ʛܯͧ౧Dͻ߄হװหˎ̵ࠖ̉Ԫ̿βԯࡐ̲݇షʢ૛uਯƱۛлҤȥXҩұˑݷࢻRσஅՍ৙̈́োéѯˮԋĞ௷ףેƑޛȻੑƌޫSԙіࠕИࡅŎ੝ŋߏƹ஛ΜǇـধɎށİवΎࢉࢉ΀ӵࠇב௏ɂ࠻֗Ͼ࢙^ܳʴ౫Ѓྃܣࢭơ͡çѽԤઍőΧΦחǌЙӠҩưிɍୃӜ҃ѯሟᒒੵٮ̮˂ᑋߍ߭³êҞઅ˺࢙ȱ˃ࢊມǺݯΑᑅ̳Чȹḭ̇ϫ˻؆ֹ߭ɓǀɭ߭ХസֿɁЉ୻ʓʟ੹Ѧ೯iࢻΟহͼᇡ׊ಽsჃࣳĿؗࡹӤڡउʖǡӝُ܊֫ذx՚֗ďѝѐƋϥӽ߿Ƒ࠳ࢁކߕĉ֣ࣼফԇ͹ƝɇωÌֿԚɿՅȚʳΈ޵ǮԙƁƥƼଥЖఅƌ܃ƞĹıੱ܂य़̈́ܩӴؒƈۤ۰ҹͪఌ΄uȀݯƉώѠɼ߼ÖƄ˪ȅҪ΀ѰWʚఉ˚ӭUԯЀ١ƃ੩̐lǒ̗θڟ¤éʼɀǞ՝ӈࢋąʭ¦Ƀȑ̽ȷ՞ȟ˨ǊĀڴ͞Ȁʍɢ֥ƪ¼Ʋ΁ƴՃվǸɨĉЂࠑȨѱĳšȼࢭɂˑӸíТЙȖάˊʝ޶װӞųƤक़ҬࢡЎᅢ੶ޮӠ͂єగּΆնݳش֢ܜ঍ग़ޢي౿֔ŬךڶüොͶࢀ̈൦ԕᘨȧṺो٤ЋÆ֓टѳ൏ɡ⏷ٔ؟Ńൌ؛ÂϵÆ࡫ઌʯڂɓňРԑΰ՘͈᎖Թ۾Ȳ֣؜ዦࠖޢµ޸̋Ӫ׀۫ԄЪԊءԶᚠˑӔҹ੡ĻNҳڌ˽ಜǼȶ՚ჶАᰪܞي£ࠣԙਬĕ׼˼༾xఢΐफ़ԏॖ֌ࢡӢѪˤ២ʫ୒ʿᴾॣ֚ѰࡡѺ{ǴৣĈˢЌ҅ټ}ː༄ݾրކزǒᕮɛǬұߕڽԺˋ˒חȏଵऒԧέ֕࿫஝०ŭ̢ͮऎɎɞжܮЎөӌϼֈࣿêȫҲڢࡈણۆຒ֦șװмnѴүͧ߷࣐Ƶϥ؄ඤͦლ¬༈ӏݛ۪ċࣆศǞ፾ᆘŌہѮংւॲx࿎иᕠŐ˪ɲᕂþیȋሴҀ໲aɶδߤΨጤΈ෸˗ଥȷበŹ\"],[\"@@ⵙ͕ໞીےĦقÃᒈӋʟͿ\"],[\"@@૽ōݱÛśƏঙƑ࣫ȦӐʾል~࿞ƶ౨XǢɧӘȬߊƐఞǿ͗ŷ\"],[\"@@ᆳĿᚉʎඅ͎٣׾଩ǔᔆָᆎȎ࿌чኬ߻ȹݯ\"]],encodeOffsets:[[[147096,51966]],[[23277,55632]],[[-179214,68183]],[[184320,72533]],[[-182982,72595]],[[147051,74970]],[[154350,76887]],[[148569,77377]],[[58917,72418]],[[109538,78822]],[[107598,80187]],[[52364,82481]],[[102339,80775]]]}},{type:\"Feature\",id:\"RWA\",properties:{name:\"Rwanda\"},geometry:{type:\"Polygon\",coordinates:[\"@@ͬӃµӵʏŁѿÆʱӍԛàþҠŘÞԄʎɺȰďԈʸ\"],encodeOffsets:[[31150,-1161]]}},{type:\"Feature\",id:\"ESH\",properties:{name:\"Western Sahara\"},geometry:{type:\"Polygon\",coordinates:[\"@@oҊŸ@@ÉeǋEౝ᪁ªᒷ޿÷ȳћǄ்ᾓNǽ˫΢bCቆäĶ̢ΆϘˤୌୠ࣢Ђ੖ˀÖ˜ټۺĜ̦ŉϢ@˔ȒԲ\"],encodeOffsets:[[-9005,27772]]}},{type:\"Feature\",id:\"SAU\",properties:{name:\"Saudi Arabia\"},geometry:{type:\"Polygon\",coordinates:[\"@@ŉΪʩʨÝͲѡ̞҃۴ʁۆׇ׀ϑƐ֋ߠīאӾӕञϿ͠ґǨˡӖ°ȎɹѦʕȊ͝زԟڴѓ־лIžҦ̌ļͲनƅζʶȪ̢ٚŚƒˮˤƜ࠷ࡀ၆фǆŴৢɩబיᛎၕ༠ãݠąȾЏתv͠ܥаȓƠִ̏Λ¼΍ċ˩ł˯ʎɽŐ˟ŲȵʬǕɶÒǆ͍ș࡙͐ᡌщǞǲϪש֕၁ᠽ࠽ᝑ͑޷ϙ׻ࢥϹƕɁˬ͏§߻ĎƷČॹmɫùΉɔɝЭĒΟρˋ\"],encodeOffsets:[[43807,16741]]}},{type:\"Feature\",id:\"SDN\",properties:{name:\"Sudan\"},geometry:{type:\"Polygon\",coordinates:[\"@@śhdмĵ̀џͨĵ؄ĶبϳÌÍȇԍ©Ȭʕðԍңңл؅џđ۹Ӫͅǥđʓџǃǥ࠵@řǦ؃̡ƝɳîѝӬƟɲ؃ŗɱϵɏݣ˿ǁʳğå ̅ʎÃʼƌΔE΄ӛՀĩάZȰ̱ʜUӦǭ͖̍µĎ̰ɒΖħΐˢʴǫȞɞ԰ϨئܦÏ¥ ZΚॲH@း⁪@Ὂ@ῼ@˔ࠗȁƳŪࡻ্̰͌ȷҠ̳ыӑأƏ˅ʳĉ֑α௿ĚͳƅܟͿࠟԓзέٛč΃Љɽʝ࢟Dĳ\"],encodeOffsets:[[34779,9692]]}},{type:\"Feature\",id:\"SDS\",properties:{name:\"South Sudan\"},geometry:{type:\"Polygon\",coordinates:[\"@@Xٽűʯѿq˷ӏԨÑюХƨͳϦșӼࣳ֫օԫԇԫϭסFگȟՕȊ΋ɭ݉֐ȥάҵǱϱÆɣƕϗĸԗۚƉˊعͪɅԌΕζ֟ѬS˘ҡͼ֯͠ʴĠ̀ǂɐݤɲ϶؄ŘƠɱўӫɴí̢ƞ؄Śǥ࠶@ǦѠǄĒʔ͆ǦۺөѠĒм؆ҤҤïԎȫʖԎªÎȈϴËĵاĶ؃ѠͧĶ˿cлŜg\"],encodeOffsets:[[34779,9692]]}},{type:\"Feature\",id:\"SEN\",properties:{name:\"Senegal\"},geometry:{type:\"Polygon\",coordinates:[\"@@΍ٺн̚φǄРמȦќ˾ːкïШǾҶVДʙ֎ɝԘأֈֽԹǔӓ̾ɿî͗ʽŧ³қâÙģȃk׿ȲЛV༇ɥħ˥ѻƋƏ٢ވkȬŞƮR̸ȘήǯκcζȌǝʐˡƙʻJͧȸˉ_ȍȥࣵy\"],encodeOffsets:[[-17114,13922]]}},{type:\"Feature\",id:\"SLB\",properties:{name:\"Solomon Islands\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@ɾ˿חN͉ԬԈȯǜ\"],[\"@@͝mԧĎǫżÀͮֈƁ˜ǭƎə\"],[\"@@ųƹحܰǫԈ˺@̠ڥʹЗ\"],[\"@@ǛڅΦҟ̠̿˪ŰĐϮȫېϭȢˉ\"],[\"@@Ǘ³οȒ·Ί¨ƖԈΡͰ˛\"]],encodeOffsets:[[[166010,-10734]],[[164713,-10109]],[[165561,-9830]],[[163713,-8537]],[[161320,-7524]]]}},{type:\"Feature\",id:\"SLE\",properties:{name:\"Sierra Leone\"},geometry:{type:\"Polygon\",coordinates:[\"@@ɧØ؁ͺѩ҈Ƨ̬Ĺت҆τĬɺƞǸɶpȜǂڦCɺ̛ǼΛʓƈɗṶɴ´ϹϹϛҗ«ʓȩˏ\"],encodeOffsets:[[-11713,6949]]}},{type:\"Feature\",id:\"SLV\",properties:{name:\"El Salvador\"},geometry:{type:\"Polygon\",coordinates:[\"@@ġȡӡ^̡Ą΍ǘұÀʃǶ~Ů˾ɄǀĢ«ĲȠ¾ʜëǸǙʪƇœτĴǤÑŘĝÏͳ\"],encodeOffsets:[[-89900,13706]]}},{type:\"Feature\",id:\"-99\",properties:{name:\"Somaliland\"},geometry:{type:\"Polygon\",coordinates:[\"@@ϛԩד۫۹Mᩧা͍̜̳К̳ҨǾ̖̲҈˚ƹǒΏϜΗкGߊɌࣴĴ݌ʼиÆ̚ƶӎKaE΋Aࡑ@ѫ\"],\nencodeOffsets:[[50113,9679]]}},{type:\"Feature\",id:\"SOM\",properties:{name:\"Somalia\"},geometry:{type:\"Polygon\",coordinates:[\"@@ѼĎЊ˾͈FpɵýӧHѳǯ̣ʁࣥЙयԱ੷ܝ௷ܓवধ଩ࡁڹష࠯޳ٕँৱȗѷȍȣӽۚWᵤܾ॒ɰˆբfݠפબᛜᡄה۬ϜԪ@ѬBࡒFΌLbːhϰŰ\"],encodeOffsets:[[50923,11857]]}},{type:\"Feature\",id:\"SRB\",properties:{name:\"Republic of Serbia\"},geometry:{type:\"Polygon\",coordinates:[\"@@Ԡȡà΋Ӫʓ˄ȌȸĿșƗƶƥȷȏø̫Тγ͋ʿƗˋĞĳƑšϳa˹µØĴĴĦȴšKǍƼƑ ŋƆƽÀšŠƯ±ś˧ȩÑèð͋Ǩ˟ĜūŜɟƠȢŬЄЛ͔ɀτ̥Ë͔́ˉʈȱ͘٢ɚԾҖͣĦˋ\"],encodeOffsets:[[21376,46507]]}},{type:\"Feature\",id:\"SUR\",properties:{name:\"Suriname\"},geometry:{type:\"Polygon\",coordinates:[\"@@৔ǙĞưڶÔࣚɥѩܟâֹͤӽƥίóϩɉΛӓǲЇđ͹öčʏƘǗ÷ǡҙèԡܴōӄˏBωؐƺѠ¯ȤԜɖƈݲ\"],encodeOffsets:[[-58518,6117]]}},{type:\"Feature\",id:\"SVK\",properties:{name:\"Slovakia\"},geometry:{type:\"Polygon\",coordinates:[\"@@´»ΊŖш̕ӺǶЈđ؂Ţߚ͓ɷɓǏ͹ǳđ࣑ʮ˟»ȟȡЁĿěÄХŽͭ}ãǙ۷Ļ̱ĠёɌċ̆äńŢȂόa˺Ĕxþǈ¢ÆȒȖžưʢD\"],encodeOffsets:[[19306,50685]]}},{type:\"Feature\",id:\"SVN\",properties:{name:\"Slovenia\"},geometry:{type:\"Polygon\",coordinates:[\"@@ۜÝъȐܾtǈƘƘUǎ˳ڝɟć͹̇đHɻͣh˷ƎƷƙבȈúȫΨĞа\"],encodeOffsets:[[14138,47626]]}},{type:\"Feature\",id:\"SWE\",properties:{name:\"Sweden\"},geometry:{type:\"Polygon\",coordinates:[\"@@ࠁוƀԥ೹ڭྱܡؓஃײףߦүޗॅ࢑ȝ͍තӋ޿৳ĆӅڗঃˉߐ۳॔ٓஐφӜּۨ˦ন՝ю½ૠղ߀࠰ä̧ͬ˺ಬஂࡀञֈײ߮GɞҶཔƉŬքԸ૪Щ಼ֱv಑˴͛ฃʃ\"],encodeOffsets:[[22716,67302]]}},{type:\"Feature\",id:\"SWZ\",properties:{name:\"Swaziland\"},geometry:{type:\"Polygon\",coordinates:[\"@@ǡύӭěԅҖS̄ɰ̀ĂʔʐÒшƵŰϕðω\"],encodeOffsets:[[32842,-27375]]}},{type:\"Feature\",id:\"SYR\",properties:{name:\"Syria\"},geometry:{type:\"Polygon\",coordinates:[\"@@࿩ࣅऩͬgNŖŶ_ΈȸҠҜ̈́Əͤϗ¨ÿٞȶΌɤȀɤȀ°Ҹ˞Ǐऎɺ҂ƿۖFॴ̀Ґaक़žїԽҡȹĂؗͅ৫ᇵ࢓\"],encodeOffsets:[[39724,34180]]}},{type:\"Feature\",id:\"TCD\",properties:{name:\"Chad\"},geometry:{type:\"Polygon\",coordinates:[\"@@ĎЄաnDզΓ̶δ૊ੴߌ¬ન͖ၼǼΰΓ˾_ˌ̽ɔȷರࡔҠ…ྑ…ྏ¦ ܥÐϧإɝԯǬȝˡʳĨΏɑΕč̯̎¶Ǯ͕Vӥ̲ʛYȯՏƛэͽ؉ࣹ߅ϳ߹¾ʁûĊ̏ѫ̋Σ͟੓͏ȽȐƓhƹɍۛÙƀɪ˅ׄşΐλƜӷӪǼІϦċʂÐҸSқކ֐É֐ͭՠ\"],encodeOffsets:[[14844,13169]]}},{type:\"Feature\",id:\"TGO\",properties:{name:\"Togo\"},geometry:{type:\"Polygon\",coordinates:[\"@@ڱǳȇ̎ɡՔãкȆݴɁ̬ăڎD؎ΕѠÖˀ݂kŅѵʲʝ̈̋ЭǜǥኝȺׅ\"],encodeOffsets:[[1911,6290]]}},{type:\"Feature\",id:\"THA\",properties:{name:\"Thailand\"},geometry:{type:\"Polygon\",coordinates:[\"@@ݭϬܗeŬڈ݉Káऋґ௯˙ݏÌ؋ն΀ދưܭҶӓԚĭѤѧ˝·ևĵßќۇςƣƭͧ͒ƝжҁӄПЌƏӳǃҲĠԾʚ߬ТࡸҤ޶͟ތ`϶ĩҸ֕ښȩф̄ƺ̮ܶ·ֆՓؘН݆ΠƴϦࣦצӬθӔȘθʷ´ԍ֨ȷࢭpݫࢰԆʤƧӰzǜَ̊ÍٖڽÀࠥںܷ܅˙ϛ޿Ŧગǅ՟ۧȤ১\"],encodeOffsets:[[105047,12480]]}},{type:\"Feature\",id:\"TJK\",properties:{name:\"Tajikistan\"},geometry:{type:\"Polygon\",coordinates:[\"@@̭ʷࣳƖāӛ࣬Þਢ˗འŶɈާˠĐԜȓ͛ŴӍࡿBׁØԻϕύĉ̉ǯͩˠþ۸ʩ¢ĞʲғȐα̇ė͹Żūԇj˕ϩ˯ǌ؋ˑʱĺӀࡘǹض؟ȨɔφۮЌҬˌբ૲ȜǩϵŤɹΎv\"],encodeOffsets:[[72719,41211]]}},{type:\"Feature\",id:\"TKM\",properties:{name:\"Turkmenistan\"},geometry:{type:\"Polygon\",coordinates:[\"@@ñۼطॣݔڣĠगюׯþσƽ֙|ׯӓ݇ǋƻרŪ࢞ٽ˶Ɏֺ֏¸Ȇ۾ߊȵ݈ˎؓԎʉӔڱɋď؛ʿհψ˨ॖǪ֨ɻךڅњ¤ॆ\\\\Əцܖ̂۾ӦଆѹĜڡ͐ǣࣦˮƳаࡽ०ׇոЃ࢞Щ૤ΫwԥʩЅɤſ̙۽ǋǙڥӁʭڏŵǫϟهŏࡩ͈\"],encodeOffsets:[[62680,36506]]}},{type:\"Feature\",id:\"TLS\",properties:{name:\"East Timor\"},geometry:{type:\"Polygon\",coordinates:[\"@@ĲȤܢȌזˀŀ͆Ľ̯ɫ࢕ο۳ʋeʬďǔ\"],encodeOffsets:[[127968,-9106]]}},{type:\"Feature\",id:\"TTO\",properties:{name:\"Trinidad and Tobago\"},geometry:{type:\"Polygon\",coordinates:[\"@@ӚŊǮصۭġƯúʒɲiͪ\"],encodeOffsets:[[-63160,11019]]}},{type:\"Feature\",id:\"TUN\",properties:{name:\"Tunisia\"},geometry:{type:\"Polygon\",coordinates:[\"@@ΩພԭͺQȰۉԄóنԮҶȢۚƃߠǠќࣶͺךĵ}ы܊̲ÒǉпЫMϱ̆ȽōܫփхǄқѤaɄЍ͊ſ³٥Хʋʵˏֽ͓ĘΑïΟЧț\"],encodeOffsets:[[9710,31035]]}},{type:\"Feature\",id:\"TUR\",properties:{name:\"Turkey\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@஺͗ঐżܤõলѬࣆ¢ߴЭƜ̑ăУزȻͨʕֻʇˀ५ǏʻҠڧЕƙ̏Ɋ঍ňίŽॗŽҏbॳ̿ەEҁǀऍɹ˝ǐ¯ҷɣǿɣǿ̱Ϡ͈͂ԟí۱ȖֿәౣĥڹҊࣟȗΑׇĳ߻҄ࣻeӽ࠶ؗҰЦٸՓВठߨಒΜྀٔŏ৞հ঒ʄർlุף\"],[\"@@۫ҏ˃Ϻ\\\\ǦȦĦʺՂХɞࡦ˄ܤőĴ͓ܼ˓Ƶȵি±Ωʷ\"]],encodeOffsets:[[[37800,42328]],[[27845,41668]]]}},{type:\"Feature\",id:\"TZA\",properties:{name:\"United Republic of Tanzania\"},geometry:{type:\"Polygon\",coordinates:[\"@@ƚġᵂႋÌӣ஼࠿ϱਙ¸Ӊՠ̩~ɓɳԓ¶ʭÇГ̌Ճΐ̰ࠡǿڝӣࣿ͛ԋb̙ʥבsɕŃঢ়ʂكåɽଢ˵ϺǛɶࠗƾӉʨՕƘͯƘΗɈґ੖ӣҺǗӤČѨƯޞΎ ̨̦͜ѬȺǮS˘ǷȐ·ͨʐł¶Ӷͫӄ̎Ķऄ[ႎà\"],encodeOffsets:[[34718,-972]]}},{type:\"Feature\",id:\"UGA\",properties:{name:\"Uganda\"},geometry:{type:\"Polygon\",coordinates:[\"@@ः\\\\̍ĵԇʷȯĐPوȜ͎²ڬǰϸ͎Ѭ͔ɠ˒̘͵Ŗ¼চΌɮՖȉڰȠעEԬϮЊ׍İсτ९̧ؓЯ֋ʉͽTࢹႍß\"],encodeOffsets:[[32631,-1052]]}},{type:\"Feature\",id:\"UKR\",properties:{name:\"Ukraine\"},geometry:{type:\"Polygon\",coordinates:[\"@@̾ɄȒʮ¥ࢌĆ՞Ӈȿǝêʻڠ£̘ηkǑ੪̏٢Ƅ԰ϿӮVఊ˙XʙͿѯȆҩƃ˩߻Õџɻύڡã֑˕޽«ܣ̻¸ԹЪȭࡨ¼Ǐ̛ँơଛӟұǠȄЂࣽʘƨǈߪ˪ʑȔಯɆË̼ީĻ̷ҧٱةϟƠЁƉϑƺɂĞƦ˾ɲˎÑƮǬäĊśӸ{ɞØƽĎÐŲ̉ɈŧΘ̩ƐÒ˶ϝɦΉأʾ֑ĉȧŭΟ@Ƀȟاă˹ŹϷȴ՟HԳĢγǵÍɤұɮǐͺɸɔȀµɑϘބۦиİĜɾхܼДҢɪٲnࡖßबȫڎi͂ŧ̀Ʀɚȝݸ¢ͮąÄцʶȂܞº\"],encodeOffsets:[[32549,53353]]}},{type:\"Feature\",id:\"URY\",properties:{name:\"Uruguay\"},geometry:{type:\"Polygon\",coordinates:[\"@@ղĚࡆٯ̺|ࡺ՟ڈҫӠֱχЉɸӇεՇॉұاǚғěޥΰ֫ԟҬÞլǾȈS࠸ɤࡺȾڦ\"],encodeOffsets:[[-59008,-30941]]}},{type:\"Feature\",id:\"USA\",properties:{name:\"United States of America\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@ũƕȽŤ|ɾƓ̨¦ĤƤƎÍǔ¸þÜe͐ƙƬñƌőɊ̍q¯͟ǵˏſ\"],[\"@@˭ÑƟǮīèQÀĈî̘āɘŹëĵ\"],[\"@@ĝ҉|Úĸа\"],[\"@@­µÓŻŃȒɤŚêÃʐ˥\"],[\"@@ıĉ˱ƴªÖŸĈȘijȝ\"],[\"@@Ƭңʼƛז½࡬ƅࠂʹڼŊਖɓ˞Tݨʄ߂̧ࠒ͗ں˩ٶˏĈəȢĉ½ĉɦǎĔ¦ȣǜƅɴ@ŬĹĽƫ࢖ЁǶށǚܳʗӹЁҥȁ̍mēĦť˸Ɓɂ@ঊ҆ࡾƀસмfĐ÷ʰƉǒϜƆࠜHޘAˎ͞ŀàࢶ؄ϜƸ౦N໾BĎȺː¦Φž̖Ϣʲٺٚي˨ə֜ƜώʏAଧռӅƢ˝࣋Пࡷ̃ࢱʝѻӿƛȋSѽˤѽΒsė̬ʦȇãʇ֥ƋЗhةƥλ¥ӥ¥۫ʏఀǂʠǃ୳ʥ՗C|ĺʭɷʚǹ׽ؑ٧×Ɏȁª˟ɀǪҍȼƭ^ͅˏ͛ҿڡûʺֲѕ͎įۦǉεǴՑևƀׂ˓ߛʊÍĖ̃ŠࡁՕدࢇʝցӱнÁэ̱ţ˭इձӁЍЅӽŻׯƪ׍ˬܗώשLεЊঅ֥͛ȿԡʣŃЯĺƁς͋ȖѻܢϹٞű͢Ǥ֐ɽҦٻ۲͟źࡑϡƭ¦СϼՃȺोŁݗĤٙÍΏſƲɟaͽǴǓǇō̵Ů́ǃ؍طѺܻĿ؏ȚԹÏۻȝއح࠳γҝБȕϗUׅ¨ЕǄ˹͝{׭ȂٽʺɽЄȁטӷӐ̃ӰуֺףͲۉgՉڑۣʦѡʪȽҦ˧Ѯӿτїˈ̩̖ป@C΋ڗ@ဩOቿפ౓ТĀǒ੩ĝॕÝƙіխӚϻĴğʌһ¦̝ɪޭĊɉƌĹҢࠁࡊ۩ୠȚχˤٯ۴řۆ҃ҞȀۢܜˍ٢͠ߊĸނĺނƱૼˇܘʓ϶ĸǐ௒˷҂ߋȺɜƇې˷ێᛸ@᠂@ࠜ@ᢢ@៚@ᡀ@ᡄ@᭰@ᮞBაAF͔˴J\"],[\"@@࠽͋ѕɐŽЀބ̘҆Ÿ֐ÉΤʻܫЍ\"],[\"@@ԧŽսƾԛɮࠦƞښùĂ͑\"],[\"@@԰ǅԾĒڸɛ࠲őéĝُǱٕǾ͋Ʋݍµȧôº̈́\"],[\"@@؊ϛώǌහ»¹ȕ౾ƛࡨČᄚ˅ྤā٨ŉ૦Ǝౢʧࣲŝ@@MᷱIⷍࠠ{ࠌɵהρݜցࠈҺࡈ˖Ҁѡ֤·ޒϙՂ׽࡮य़ේ՗xՋұЙҥ͂ݍˌʃܺએںҍߎ߯Ä೷rটʌ჉ࢎߩǄ฽̜୑í࿻ϬৃΨटǯǦ׏ҫÁঁǫ݉˱झǳťӶϚࠚࣀʶɱɂੱҵֵ֑௅ױؚСߏ׿ࣗΗࡁʱȻωಽѡ˅ϿছΫֽÞ޷ɻ࡝˹ۧ˫෹ʉſƘऀϾࠔʸࣆҠਬĨвΈ୘ԊȈǚب̒ƢْђӸॹʫ˓Ơҕ̧շюɧ̝̽м࠿ͳԩBïԄƲ̮ե̚થǇ܁ЀַȬIӈ٩Ϊ͘ӘۆҸ̚њںÖ־ƇڴМ؎ï٘ʼƻϨҹưج͖ԩWࢻǽʯȃڏȄஏĥ௷ȬΛ͸੟Ӧ୾ΘመШ۔@ŕнᄢڽԶਕ͌ױр߫ΨଽˈҺѲ๰ਗ਼ϦȨФ࡬ЎࠊĪཪώޜÉಐ҄ౚǭ\"]],encodeOffsets:[[[-159275,19542]],[[-159825,21140]],[[-160520,21686]],[[-161436,21834]],[[-163169,22510]],[[-97093,50575]],[[-156678,58487]],[[-169553,61348]],[[-175853,65314]],[[-158789,72856]]]}},{type:\"Feature\",id:\"UZB\",properties:{name:\"Uzbekistan\"},geometry:{type:\"Polygon\",coordinates:[\"@@xԦૣά࢝ЪշЄ॥׈Яࡾ˭ƴࣥ͏ǤěڢଅѺ۽ӥܕ́Ɛхॅ[ᶾᓘӺƾïದ׻یͅߤݵঢŪ෸à৔ؗÙࡅЦMǢۍ੬ɲЉ̺Lπ׺૎הӖƺʠĉ۵խئ́ײȾ়ѷ੽؁ٕĊ΍uţɺǪ϶૱țˋաЋҫۭ ɓυؠȧǺصҿࡗهǰҳN\"],encodeOffsets:[[68116,38260]]}},{type:\"Feature\",id:\"VEN\",properties:{name:\"Venezuela\"},geometry:{type:\"Polygon\",coordinates:[\"@@yȣӱĭ˜ϡYѭυӥ͆ڙδÆȌ؈ʻ̒§َਸ਼΀řІ̎ˆ̞ןל_մҵ˧ݮQ࣌ĔӖϕٞĻҼʾXɄਨ¼৖\\\\܉ʛ˼Їڦ×ِЯƆڧѬn͢ȣڕӱó̫˾̷ȽƽԫƉjϱɫɱّ֪Őʁ̭͍ऱ̽׿Žʏȣڛɀثņƿýϔɑ֝ŜՉ܆ï°ǭ׷ʅĭΣΉƏسȝǋʱٷÅҧѼʯ࠺ɟ̧̌ȄюмȊʅʠǛ֒à׼Ȉ˰ƲҎ̓Ơӏĩ؁®ͻęסܢӥńઉăȧ̊ȷêǬĴ̶áͺȃȂŅϮѡÈɸӮĺ׶ʔ̸͘ʌɈрդƖ\"],encodeOffsets:[[-73043,12059]]}},{type:\"Feature\",id:\"VNM\",properties:{name:\"Vietnam\"},geometry:{type:\"Polygon\",coordinates:[\"@@૭ܗ۫ߍȁ׍٠ࢭ޺ળނԱԞګϪ།ŕ๓۫փ१եۇ۫਷ޱ̧ՠʀ֬دӌܬ͸ࢦÔσԚප٨ļ৖ț֖ƶࡀɃצٍאՋ݌ۥ঴৓Ԋʊ̠՞ɘ͙ܺਙPϕކӭڐҊȴڢIࠈĬܒ҄К̿ސƵƃӛАͿࡎɓ\"],encodeOffsets:[[110644,22070]]}},{type:\"Feature\",id:\"VUT\",properties:{name:\"Vanuatu\"},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@ˣō˭ςɤՆӗ\"],[\"@@ƌڱɥŀǩ­ťɴi٢Дʵ\"]],encodeOffsets:[[[171874,-16861]],[[171119,-15292]]]}},{type:\"Feature\",id:\"PSE\",properties:{name:\"West Bank\"},geometry:{type:\"Polygon\",coordinates:[\"@@@ԣŭʙЃŕɜɌŚɁĦǬ̤֔ś\"],encodeOffsets:[[36399,33172]]}},{type:\"Feature\",id:\"YEM\",properties:{name:\"Yemen\"},geometry:{type:\"Polygon\",coordinates:[\"@@؉ɥǋύo˹࠷Οഇϻݩףυ±ʥºӭΑ՗ǉ۷©ɃµǿɛəÕŻɇеlˍœ׉¨ɓӬzҠƍʜǑتʋΊǚ¤đϨĸǊξςˌđΠɞЮΊɓɬúॺnƸċ߼č͐¨ɂ˫ϺƖ׼ࢦ޸Ϛᝒ͒ڀ൳˞ח\"],encodeOffsets:[[54384,17051]]}},{type:\"Feature\",id:\"ZAF\",properties:{name:\"South Africa\"},geometry:{type:\"Polygon\",coordinates:[\"@@ǏŧΣяɻћӇ׻ोࢁףԋًϣ࢛͙ѓ«ŇɷԛŰеǅ࣫ǊԙĹΏ¬ࡿͩܓƃԱͅϡoΣ̚˳fαϒśŏɦLӰ˙֞˔ƴs٤ս޼х܈AF׽તДдͪɯƘΫϘÓՈǃҌÖݤіB᷌ɨűӾߙûԟȈ̏׼ĒрϒЊʨȶДЦȚΠķВɽۂ£՞ȜĐʾƨДҚäʨ͂˪֔ݮغஒؤ΂UОƛ˲Ķ҂ċД஁ɔׯƫऩî̟чƶʏÑāʓɯ̿T̃ԆҕӮĜǢώْQȿؑıۥɑϛֵщ\",\"@@νʶϻǟҕ҃͡Տـ٧̜ČƺˎҴƀƜ˜ʴФ̅ʪ\"],encodeOffsets:[[32278,-29959],[29674,-29650]]}},{type:\"Feature\",id:\"ZMB\",properties:{name:\"Zambia\"},geometry:{type:\"Polygon\",coordinates:[\"@@ІϏɊ܋ƝɩǙڻǈۡ˃̇ʭޭѶɓᢇۗĂׯٍřӍͯĹ̛̅ßܵۓҭխ˳o˗ĬऱĠƯÚOêͧȎկ¶ۋȑչԾ֣یᦶშYí̂Ű̀ƧЀĪТėʺ̂q¶ʽϾrՖûˬϡڨŝԤˆȌѯ٠ş̴ΧΈҥ٠Që࣠ɱƳח͞ɧƬļࡈƬসȉψʈ՚ɤĶ଀ƚͦđΘɇͰƗՖƗӊʧ\"],encodeOffsets:[[33546,-9452]]}},{type:\"Feature\",id:\"ZWE\",properties:{name:\"Zimbabwe\"},geometry:{type:\"Polygon\",coordinates:[\"@@ҁČ˱ĵНƜ΁VՙϞٯźʙՒC̒έĞ्ई˃ӢǛƮ͓ڤलğ˘ī˴pҮծܶ۔̜àĺ̆ӎͰَŚÆ̻۬hϴǯǺȻАÓѦˑF੟Ǐ׋عƊʝħӵŵùɛ؅ࢫ॓\"],encodeOffsets:[[31941,-22785]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/xiang_gang_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"8100\",properties:{name:\"香港\",cp:[114.2784,22.3057],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@@}ScTʟ@cWuJÁ]l¦RLj¼BĄà H@TOHCTDDDHDNAT@PEHDDNJLX@BABALHFF@DKHADBBLDHHFBLEJB@GDBBFBADDB@@KFAFBBJJA@BB@@FFDDADFF@FADDDBJC@AFBD@@DDD@DAA@D@DB@DHHBFJBBFEHDFAN@DGDC@DLCBDDCFDlAFBFCBEF@BC@GDAB@FD@DZJX´HĐMja@Ý`p_PCZ@lLnRGSDMFK|a\\\\Y}­§Mën\"],encodeOffsets:[[117078,22678]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/xin_jiang_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"6528\",properties:{name:\"巴音郭楞蒙古自治州\",cp:[88.1653,39.6002],childNum:9},geometry:{type:\"Polygon\",coordinates:[\"@@@ÈÒĊanwŎVȮ¦ͪŃĢÜōȂçČéƐżLɆóĊĊaʊŁ±¯²Um»ˌmÈ»VʠţWÑÅ¯ǓéôƑƒğÆīŎī@Ƿwô˺LÞ¯ƨVǪÑƒĢȘV°wĢôk°¯ƒ»΀@Ȃ»ĸǔ@΀͔ôôLɆó̐ÝɜLɲōͪƨóŤK@ī@IU܃ÛmȻţǩÝ˹ÛǉťǓǫō@Ɲ²¯VçōKͿŁΗÇţ»ƽɅƑLÓŏÅÅɱV@ÝĊU¯ÑĊĭÞLÞŎJ±̃XȣˌōlUÈ¯ŎKÆƅ°XÑÜ±nŗġV¯óaUƧUōŁÑ±çɲ¥lĉkğ°k¥nğţL¯ÝÝUƽĬ΁lķ°@ōXÿÝ¯V»ŹLʉÞɱŤĉó°ÝJ¦ÝKÝ£ţÜÈĉ@xǩUċƑ@ky͓¹`U²ĉVġ»ğa¯¥ť@ĉó@ŻÛÛJw¯nó¯ġWƽʩķÝɛwĉĕÝ¼ȭÞķō@ó£Å΀Ƒ¯ôȯÞ¯ȰÆōèĉXÇ¼ó@ÝnºĸÞVƜĸȚUʶõˀĵĖɱŎÝĖVࢰӒѢ°˘nϚVˌÈmɼĵŦW¤öʊõʔ@°ÈXVènŎȁb¯ǫĉ±Èğ`ġwōÔğ»mVVÝ¥ó@ĸķô@bXĶmV²²`Þ_ɴbͪÈ°ÞWĸÈŌmÞkɲÈUÆ»n¼ǬVķĸźô¯°n¦ɄÇÈ\"],encodeOffsets:[[86986,44534]]}},{type:\"Feature\",id:\"6532\",properties:{name:\"和田地区\",cp:[81.167,36.9855],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@ƨ¥èź٨ΘƑᩄbUࢯÞĕɲōĶĕöʿVʵķșUƛÝķm¹Þô@È»ĊWŎçÅ°ȯȰÝ°óƒÆͿĉ»̽çnmɱĵƧºóUƽ@±wóL¯°̻L±Æ¯Vƴķb¯VÇ¥ğ²Ǖbk¥ÇKlÅɱġ@ÑóK@ÇaÝXğţxĉČǫķê¯K@ÑaŹƑK¼¯VóaónġwóÞéUġbóĉğÇl¹aUóğKWVÅ¯nÇŋƑķnʇ»óxĉwçÇ°Åw°ċXób±kÈÇJm²ţx@ÒÝŦÇºnó¼n°ÇbUÒ±¼XĸĠłƽXmwĉºzÈÜmnxmx²ĖmÒbnƧêUºĊêÆVóĖóUĉ¼ÅĬƑ°ɆƆŻŚlłÞL¼nĠ¼@ÞÞź@ŎÞ°VɄɴжϼِ͈Ŏ\"],encodeOffsets:[[81293,39764]]}},{type:\"Feature\",id:\"6522\",properties:{name:\"哈密地区\",cp:[93.7793,42.9236],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@WnŐÆĶLĢ¦ţºźlxÅĸƽŚɄĮè@ô²ÞUĔƐńV°¯ĸX¦Ɛm̐bƒ»Ɇa΀ĢƐLˤȘÑnІǉĸÿn¯ĶaŎ¯ĢĕȘ¯°΂la¯¥ǕǔwˤӱlťО̻nŻmɃĕċţUw°WUóƨÅţķ°ýV±óÅǓéʉ¯ƽŁéōǖȁÝƏůǕw˹ǫȗǓƧǕVýé@ĬţLƧôͩɱŎɛK̏ÞɅôóK@²@°ōŘ¼lŦ¯ŰóƜÛlV¼ķ¼°kȰŰĠǬŚÝŎmĖ`@ÇÜn\"],encodeOffsets:[[93387,44539]]}},{type:\"Feature\",id:\"6529\",properties:{name:\"阿克苏地区\",cp:[82.9797,41.0229],childNum:10},geometry:{type:\"Polygon\",coordinates:[\"@@VÆxˌŎÞŎ°nȂÒ°²VĊ¯VğƾˍǬƨÞÞKÈÞĊVźôɆÞĢèŌôWČ²ŤVÞĸʶbl¯ôn_VÆĸlmÞnVź_ĸ¼ȮmǖéĸW°°ĸJkʠ¼Æw°¤ÈlxɆzČºĶI²ÆǔU°ô@Þ¦UnUĠ¼ŎÓĢxĠ_²ÇĊǬ°ȂamōçUÇW@¯öʓõʉX£ĶťnɻÇUˋmϙ¯˗ӑѡᩃaΗƒɜ°xWƴUxɃÒˣ¤ɅwğʉōóÝŹ±°ȗ@¯Æƒ²¼\",\"@@ōгwȁ¥Ƨ°ŹÑķV¼ÞêĊ»lĵm¦ÅW@ĀôÈźaɜxÈbÞÆĶIОŘnIÇŃÛÝĊÑĠƏ\"],encodeOffsets:[[80022,41294],[83914,41474]]}},{type:\"Feature\",id:\"6543\",properties:{name:\"阿勒泰地区\",cp:[88.2971,47.0929],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@ɲˣĊIÈ¥ÅU±Ċýkō°ĉƽó»ĶƽXóʵʵȯƑÅȁɅ¯ĉ@ÇሗK֛@@ˤV֜ʵрƒǬVĸƑŎ@ƆϯÑóķ@ʇ»ķ¦έmlÈĸĊX¼WźÛÞÝѸĢČþĀĊôάVö¼ĊUƨ°°èŎČUÜÆóôVôô²êȘlˌç°`n²ǬĊaÛ°±kğmm»@°ÝɆÛÅÇVaÝVm͔ğôÝÈb@n¯ÜUĢÑĊ@źīżWŤÈǖWôŁÆI²ÓƨL@ĊXmmÑÆ»ȰÑkĶō@ý°m¯\"],encodeOffsets:[[92656,48460]]}},{type:\"Feature\",id:\"6531\",properties:{name:\"喀什地区\",cp:[77.168,37.8534],childNum:13},geometry:{type:\"Polygon\",coordinates:[\"@@Č@°ĠôÓô@Ŏĉ@Ƴĸ@Ť£ĢlVôWVóřXĉŤêÞ@ƐÒĢÑlèÈV@ĠIk°ÆŘ@ÈÈĀ@ǶťÒğ@@ÒĉlŻ_@ƧĖÅĬōÆ@bźÞnƒlVÝĬWÆ¼ʇÝÅ@ÇÅÈwWóĉ±ğzĬČƨÆÝIĉÝ¯bÇÑĉ¯ʈV°xUŰĊ¤ƪ_ôÓɚI@lȚXȮŎlɴȘ՘¦ɲÆʈ_ɴźôÞʊŎĠɆxˤ£ɄÑVwXƳ¯wɛŹ٧çƧ¦ōُ͇еϻɃɳUÝ¯@ōÝŹ@Ý»mğ»ÝKkŁżřɅƅƒ¯ÆīĊ»ôVôĕÅUĉéV¹ƨémanÑ±ĕnwmwnÇÛyĉ¹ŹlŏkĵèķmōÞġKñÔċKÅèĉzômxȗÿƿI@þÅČÝKÝ°@¼ÈVº@ÅĢÆUċłnÝÆǕČĵJm£ÝJ¦@ĊxV°ƏLċ¼ǩ@m@ÅĢómÇÆğ¹ÇÆĖÞKxwô¦ÆÑÆL²ÆƾU±ŚÅŻĖ@ĬŤÈñ@ǔÇxÈÇƒ\",\"@@VÇţ°ğUĠ¯mk¯ó¥ķIġÿƏbĉa±ÒĸĀlKU_m»nwm@ÈŤ¦ĉbÞ°±Þżł̦°ĢŁVé\"],encodeOffsets:[[76624,39196],[81507,40877]]}},{type:\"Feature\",id:\"6542\",properties:{name:\"塔城地区\",cp:[86.6272,45.8514],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@ήnĸ¥ʈ¼ĸ@ôϰÒ@ƅƒōUķƑǫʶпU֛܃LګK@΋ĸ@Æ£ÞġÅĠċLVÝ»@Å»Ýnm¯»nŻĊ@nķŃ@¯ómóÛÝǟ¯aÝóȭ¥ōUmxĉbÇÑ@bUº¯X¯ÆƧbVÒĉnǕw¯°ƑVÇ@kx±UɱnÅK¯ƒĠǠU°ɜL@°xnĬĀŋŎÇLğϱÞέƜkôÅĀǕłĸĊŤUŰĢ°¦ȂϰÜɨ°x@°żǠÆƈČVĠ»ČL°ÇbĊÑ̐óÞlĶwÞɆVÞwǬxǪţÈ¼ÜLŐĶˢ@\",\"@@óKĵĀV͈ĉłƾǊÆŤzXl°ÆL²¼źôÈĢǔ¦lô°ɜÞʊĠğÅm»ʵƳƑʝȗīV¥¯ĉ°Ñ@ŃÅI»ĉmğnaċƨbVğwġ¯@UōaĉÝJğÑÆŎkŎÞĀlź¦\"],encodeOffsets:[[87593,48184],[86884,45760]]}},{type:\"Feature\",id:\"6523\",properties:{name:\"昌吉回族自治州\",cp:[89.6814,44.4507],childNum:7},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@መL@È°ĊȂɆƒÆĊ£ťôWÓɆbĢÅŎÆ¦ČÑW¥°ķU¯ƏŃVē±Ý@óçĭɃƾřÆķkwŹŤ¹ġ¥ĵKŏÅXmˍщwǓ¤Ƒ@wóōVķ£ɱġôÛa±ÒȁóèţIVƽ¼k¤ó¹ġJmx»ÝU²@ÅÆĸǫŎĊmŎǬ՘\"],[\"@@Þô°bÞǠôÜôn@°ĸńǶkł¼UÞKğČÆÝĢÅ¤ķ@@ΌڬL܄K@ˣȂ˭lĉÅW¥ĵVÆý@ŃÞēUŃȗƅ@ŹƩǕĉ»k»ÇVğóřXŻKƏċêȁèÛŎġͩń\"]],encodeOffsets:[[[90113,46080]],[[87638,44579]]]}},{type:\"Feature\",id:\"6530\",properties:{name:\"克孜勒苏柯尔克孜自治州\",cp:[74.6301,39.5233],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@ˎǫĠƽ°UUĉ¯±ȁÑm¯ÝōˋōwUÅ±»ÅƑ°Ș@²¯ɳʇ`ɱÅ¥՗ɳȗōkȭșW@kəJóÔƩ`ĉ£Vů¯wU°ʇĊÈÒ°aĊÞÞJÅċƧīĠyĊ²XôÇxÈÆÆ@ÞʈÅ»XÞīUƑkmŹÝ@aŎÅÆīƨĕ@ż`Ċk@ÑĠ@ŦÑ@ǵÇÿ@ÇÅŗl¯ğJ@ÇUkçġÒƏÑÝ@ţéWĊôŚUóXUġkţ¤ķ@@ƴōĊó@óÔğ¯ċ@@Ò¤kôˣŰ͓k»KX¯ċwƧôğɐÒôIVÆ¯UķǬķn¼ôb°ÒȰVVÈÞ°ĸó¤V¼°V°²êlĢÒUƨ¦ôȰƴĊVV¼ǖIċĊÞɜénČW˸ǸařÈw±īçĸ¤ĊôwĸUĢ¦éǖĬĀô¼lÞkÒ°x°ƆÞxÆV²ǔ»b°wÞȘ¥°nŎV@°ʠèŰȂb\"],encodeOffsets:[[80269,42396]]}},{type:\"Feature\",id:\"6521\",properties:{name:\"吐鲁番地区\",cp:[89.6375,42.4127],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@ôKĉǪa²¼lÜô@ʠê°ĬôȂ²ÑÜbĢóɲĸ¤ŎUô@xƒǔ£ъxˎmÈÛ@_nĕÞōřǫğůlȯ¯ĸ»U»Ükôƛ°ůkť»Ŏŗ@¯@±͓óͿǓ@ķȁ¼Ϳ@Ƒ¼¯°ólġ¯xȗUġƑǩÒƧUÝ°˹Kóx@ǸōĬÅĬƑĠóƒǔêÆ°XÒʟŤUÇ¼ˋnn¼±V²°ȂUŌÝbʟǔɅô@żǬaҎÈ\"],encodeOffsets:[[90248,44371]]}},{type:\"Feature\",id:\"6540\",properties:{name:\"伊犁哈萨克自治州\",cp:[82.5513,43.5498],childNum:10},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@ĉÆŘȁ̐mÞ¯ĀX°±¼@ƾ¯ƴ°ŎÝþŋ¦WÜÞbȂĉźUÇmwVUȂóô@ȰÝ΀nÆJnƾʠŌLČóǪ¯¥ǔaǖŌaôÝĢLxÆLɲm²VlwÈ@Uƒ°¯ǖxĊmUÑƨa°Å°WV¹aÇɃÈm¥°¯ŹóĸķǫUm»Å¼ÇVɱlÝŋnķÇÝX¯ͩÇɳaÝ`±_U±ĵnWa@ĸóķ¯ǓV±ÅĵJċ¹ɅykwÇ¯£Åxʟ»lķI¯X¯ķêǕȭnķ»Ź`±kÞ@Ýô@Þ°xŤŎIƨÆUxō¯²ǔĬǬlUŚ\"],[\"@@ÞĀlź¦¯ĸŤKÞċƨbVğwġ¯@ţƽJ\"]],encodeOffsets:[[[82722,44337]],[[86817,45456]]]}},{type:\"Feature\",id:\"6527\",properties:{name:\"博尔塔拉蒙古自治州\",cp:[81.8481,44.6979],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@ήƛϲÝĠÈKŌōÿmīw@¯ɛKV¯ğǟ°ƑwġKóÞŋbǕǓb¦ǩ°ċôŋKʟƽmÅImͿȯÞó@ȁôUVnxÈŹVȁĊÝabŻ£¯°lóxȂŤĸkĊÞyĊêĊmĢxVƨÈĠXΘÆĠÔźɆţ°LXƾŤŤb\"],encodeOffsets:[[84555,46311]]}},{type:\"Feature\",id:\"6501\",properties:{name:\"乌鲁木齐市\",cp:[87.9236,43.5883],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@WôŚUĠÈl¼Ċ¼ƪǖ@źȘƆ@ýlÜXVŘÞ¦V¼kĖóÒèkĊȁˮ֜@ǫ՗nōĉǬōķÆÅ@±ÞV¼nwĢIôºl£ƾ»UŤJôçó¯īʟéó@kÛ±»ǩbĊóLҍÇǫb@ŻɆóʠǓaŋÞȁVʉłĉbĉɅô\"],encodeOffsets:[[88887,44146]]}},{type:\"Feature\",id:\"6502\",properties:{name:\"克拉玛依市\",cp:[85.2869,45.5054],childNum:2},geometry:{type:\"MultiPolygon\",coordinates:[[\"@@ɜÞʊĊýVaÅm»ʵƳƑʝȗīV¥¯ĉ°Ñ@ŃÅI»ĉmğnaÝţL°ķóKĵĀV͈ĉłƾǊÆŤzXl°ÆL²¼źôÈĢǔ¦lô°\"],[\"@@ƾIŤ@UUwōaĉÝJğÑÆŎkŎ\"]],encodeOffsets:[[[87424,47245]],[[86817,45456]]]}},{type:\"Feature\",id:\"659002\",properties:{name:\"阿拉尔市\",cp:[81.2769,40.6549],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@nIÇŃÛÝĊÑĠƏōгwȁ¥Ƨ°ŹÑķV¼ÞêĊ»lĵm¦ÅW@ĀôÈźaɜxÈbÞÆĶIОŘ\"],encodeOffsets:[[83824,41929]]}},{type:\"Feature\",id:\"659003\",properties:{name:\"图木舒克市\",cp:[79.1345,39.8749],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@VéVÇţ°ğUĠ¯mk¯ó¥ķIġÿƏbĉa±ÒĸĀlKU_m»nwm@ÈŤ¦ĉbÞ°±Þżł̦°ĢŁ\"],encodeOffsets:[[81496,40962]]}},{type:\"Feature\",id:\"659004\",properties:{name:\"五家渠市\",cp:[87.5391,44.3024],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@çôÑlĕU»¥ÝUŗWkÛ@þVńÝĔ@ńÅþĶUX¦Æ\"],encodeOffsets:[[89674,45636]]}},{type:\"Feature\",id:\"659001\",properties:{name:\"石河子市\",cp:[86.0229,44.2914],childNum:1},geometry:{type:\"Polygon\",coordinates:[\"@@lŁǵmĉ@mż¼n°ÞmÆ¼@\"],encodeOffsets:[[88178,45529]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/xi_zang_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"5424\",properties:{name:\"那曲地区\",cp:[88.1982,33.3215],childNum:10},geometry:{type:\"Polygon\",coordinates:[\"@@ƨʔĸbÜºÞwnxźbÞ°ô@ĶĸIÈ¼ĊJŎÈôUÝƒ¤ǔLÞŎ@ĢȘblôLÇźçÈ¤ôL¥ÞIÞ¯ĶxʊťƨƿÑĉXVķŦ¯ȂKÇǕÑ¯IU£¯Óƿ£VĕÅÞÿÆwƑ£ǖxÞĕ±ÇÝaUÑÈU¯UōÈÝwWŁĵ±ÝóĢÿ°IÞ±mÅĢ¯mÿ¥°UnÑŤĢĕĶwǬŻͪwŎ¼źÇĢĠĕˎŁ°óƨ¼Èam@¥°wǔǖ°ƨÇŤġƨŎŃôbÈÛŎĊ°@Ġw²ÑÞJÆÆb²°êĊUÞlÈ²VÈKĊÒĸĉ»ÅôťUÅÇk¯@ÇÑklÇÅlĢVÑó@°@ÛĸV¯ÇĊn¯Uĕƽ¯m¯bÈ@Ò°Ĭbĵ¼kxķýÇJk£ÝaUÑÅóĶǟkÓʉnĉÝ¼Ƒó»Þmn£mČ¯@ȮÿV¯ĸk@Ýów»ğġ±ǓLōV¼Əèķĉè±b@ÒţUÑóakl£Ó@¯L@ÇlUóȁ¯aġÈÅĕÝLķ¯Ė¯@WĬxÒÈnW°ţôU²ǓÓġ²V°¯ôǔÝLċk»Ý»Ý¯ÞVwÛÝÇōͩÈĉċ»ĉm¯£W¥ţKkóġƏW@¯±kōÈb@ÒÇaÆ¯akóÛÇ¦Ýa¯Ýĉ@Ç»ÛmǓxķƛ¯lVĀÅÞġbÇJUÅVĖƑWzō»ōWn@è¯ÞóVkwƩnkźÇÞÒÞ¯ýğÇUxÆÈnè±bĉÝ»ÈŃwwÞ@m»ÈV@ýÇ°ķxaÝ¯Xċ¥ÈóW@ôkxlnxVÈóĊkŤġ¼@°¯ŰƑL̻Ű±ŎÝVÞVÇÞÅÇakƞ@èğŎĸżƾ°ÒLÞôĠKȰĖźVÈÒĠ¤VôUÈþťL@ôǬÞlÜÈnÇÒUŚ@ĊƨW°°X@ČÇþƴĉÒķ¦@ĢôWĀôłUÞĢǬź°¼@ôV°bUÆnzm¤ƽĸÈ\"],encodeOffsets:[[88133,36721]]}},{type:\"Feature\",id:\"5425\",properties:{name:\"阿里地区\",cp:[82.3645,32.7667],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@Çƾķn£myVÅaU¯ó@¯»ŹġǫVÝóŁXÿġó@ĸ¥ĊÑƳÈý@ċW¯X¯ĉƧ@VřÈÑÇmkÛǫÝ@óŦKÇýVUó£ğÇÑŹUȯĕğLÝóK¯ÑƽķŻĠō@çlƝÈbÆÈÝUÝÞU²ō̼ůƒK°ů@¯UK±ĊƧbōÇmçÈġóÅóbźó¥kīÆ¯ólçKôĵUÅVŃķ¥nÅŏm¯¹Å»@ÑÇóxÝkʇȤU¤ķb@ƒ¯ĊÇx¯ĸĉKm°Āk¦lKnĬȀƾÛ¦WÆÅmǊĉ°ōUţ¤UŎ°ŎKÞłÆǓ¦Þř¯bmUÝl¯Umğl¯£șwÅǫaÝnĉĶk@¯Kō»ĉnaÞ»ťnkmlĸ¥UÅŻkÑťĉVôó°LôīĠUÿĉǕÅz±K¤²ō¤¯Ė¯UÝ¥VĵóÈťÝwķÈÑk¤óWýĵĕVĠVóǓķ°k±VU±ţ¦UǟÝÅJVÑ¥XUċUÅlÛƆǕÆȗƆ¯wŏÞÅ@ĉlÝóÒnUôÅlxólÝôÛ±LÛôÝL@ġ¯X¯ÇUÅ¼óaó¤¼XÒġŎóLk¦ôÅ¼ĸĠ¼KġƆô¦ÆƑÔĉĶ¯ImÒ°¦n°¯ÞlÝČnƒÒKĠÞĕklýƾťôIĖŤÒnƜm¼¯lnżóÞ@Ůó¦ôƽĖċŚn°Ý°ôÈUƜblÞó@ǖô°UÈƆ°XþôôlѢ²Ėm¦°@¤XĊblÜzkºƒĖmXŎWVóÞn°lĠxȚa°»żLźb@Æ°XĠÝȚxĊĕŤaȚ°È@@èŤ¦Ü¼WÞkÈ@V°lŤkŎ±²¦ƐUǉ°aÈÑŎbĢŎbÆ¥ÞIȘlôVÈUbkɲĶnmnXb̼òƾĖŎ@ĢȂÑôÓĠĖʊĊÔ\"],encodeOffsets:[[88133,36721]]}},{type:\"Feature\",id:\"5423\",properties:{name:\"日喀则地区\",cp:[86.2427,29.5093],childNum:18},geometry:{type:\"Polygon\",coordinates:[\"@@ĶĖXþôl£ÒĸÇÞxÇŦôUĶÞ¦°V°ĕŎ£±£²LÆyĊǖĀğVóĬ¯KóôUĊŦlÒżVÆķ¦klnŦmÝ¼bĊmŎ¼L@°lĊĵÞmǬbÆȚx°¤Ġkn°VÞkVn°aŚÝǔ¥ÅÝŁōL¯ōVŤ£ŎVĊ¯nǉÆXÅÜ¥ǿƽmīLkl¥ÿn¯ĊL°ķÈw°ĉ@ƑĸaV£ʈȣÞlôwÈ@Ò¼Æ°ºŐnmÆĸ¦UńÆVóĶLèôkÅ°lĬ¦ŹôôaÆôÇĢnèŎÈƨaĉ²VLĢ»lţôĉUÇwkmlw@óôXÇČ¦°WÞbwĸÈ¯@þÇUn¼Ý@xxÇńÞ¼Ċ²amçÅÇVwĠÈþ°ÝÑÈÝlŹƪmlxôU°Ý@çmXŎŎ¼yƒXĕÆUVÈIĢaÆÝUÿ°kĸƜǔwnÜÈ¼Ċ@Þ°ÞbÈ¥Üôl°bÅÈb@ÑaÇ¯UU¯Vġ»¯aV¯Ç°ÅmnÑŤçǬVǬ±ĉ¯¥Vĕ¯Ýk£ōw@±ġÛ°ÇVÑ@Ûa@ČLƳÇa¯¤ÝIĵ¼U¥ƿōķÅţŻókÝóĕ¥¯U»Æ£X¯ġŃÛkÝ°V°ó¼¯èWôÞĖȎkĀƧĀówm¥¯JÅ¹ÝJÝōVVÅaÝƑ@ğŭÇ¯_ĵVnxÅónĵxÇĖĉVÝÈğVÒó¯±Żĉ£ķÆÅLǈĉýţÛ¯VnV¤ÝÈ@°ÅÞÝ¤ŰğŁm¦ÝxóK¥ɱÈUĠôêVôÛ¼ÇWÝçĵaō¦óĖƧlÇĢƑnŎÇV¼¼ºÛ@m¦ƽĉmm¯ÝKÛç¯bŏłĬb¼ÅLmxť°ÅUÝXkÝmĉ¦W¯KÒknÝaVÝè¯KɅńÝKnÞ¯¼\"],encodeOffsets:[[84117,30927]]}},{type:\"Feature\",id:\"5426\",properties:{name:\"林芝地区\",cp:[95.4602,29.1138],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@VÈłVôÈk@°K@Ôk¤lôbVÒŤ@Ñ²açĸĊƐçU»ŎǔKĢ²Ġ¼ôx@ÞlƨĬUl¯ÈLVÞJ°ÜnʊwÜbXêVÞ¯°anaU°wÆ¼ɴÑWÑ°mÈýÈam¥Þ£Ť@¥ôblÞĢź¥ôxÈÅmÝĕÅV»ĉōŤōnó»ÈīķIUĠÑ°ġĸLÞ¯VÒÆ@Āb¼WôÈ@V¼ôóŤKÈÑU»wVǫżnWÒÈx¼lŦ£ĊōŤx²¯@ÆU¯çÆ@¤°£é°k°lůÈó@¯ŤÇÈĉkkÿó¥ÝXķÑÜ@ÒóŚÝ¯°ĉówÇ±¦ÅJUÒĉĀķw¯°mĖ¯±akxÝÅn»lÑK@¯lU¯UVÑ¯óĊ¯mōğVǓƅÞWÝÈÛ@ƿô¯ÜġzÅþ¯ólmôʇġĊÅUͿřŏȁˋŁóÇˡōƧÇbw°Ķôk¦ÒnUþġÒÔkǔķèó@²@ŘōńĵyzġaÝ¤ÅI¤Ƀť¦ğÑ¯¤ķbó¯ó±U²°¤ČÜVnÈÆŚŎ°ôĢþÆzèVĀÇĀÇXŹÑ¯¤ówċķk¦łUÒġzÇ@ÆÝx@²Þ@Æ¤Uô¦U°xU\"],encodeOffsets:[[94737,30809]]}},{type:\"Feature\",id:\"5421\",properties:{name:\"昌都地区\",cp:[97.0203,30.7068],childNum:11},geometry:{type:\"Polygon\",coordinates:[\"@@VĖm°ĉÈU°ķÜ¯@@ôUÒġkÆkÈlÒ@Èl°ÈVÆóŦÆ¼aÅĢɄwnōw@¥Ŏ¦°ŹÞmV°wnÿwwÝw@¯mÞŗ°wĠĸkÞğlĔ²¦°@ĕĸwVóal@nĢÇĊn°@¦źUXçǔůĸVÆKÈÝĠ²ÅĔô@lÈ_mzǖlaU¼ôwV°¯¦ĬÈal@ČÇ¼nIxô»ɜ@ƨ¥ɆŁŃǪȁkƛƨȍʊȡóĭ@ÈÇVůÞĸƅmēƨťÅÈʉVǵ°ġVŭÅɧ°ÿnɛ£mķ²ŃóÑUĉ°mÇ»¯@mxUĀ¯èţ°ȁÝçġU¯ÆÇţÈ@°ÇôŰ¯k¯lê¯¤£Å@èV°Å@±°ţwĉŎť¤k»ÇwXÑŻmUǬxV¼ÇÒţLóôU»Ç@Xó»a@ÿÅUÑÝ°ķK¯ĢğÒVĸJÇĬ¼môţŎĊŎU¼ÆĖnÞÇÆówŹ¦ġkÝóa¦ţ@Ý¤n¦ÇbÇþ¯nXÒɳÒÅ»¯xVmbb¯Ý°UWéÛaxʉÛm¯ÝIUÇKk°VƧīķU°ȭĀ@ċ°nm¤Ýnô¼ƒÞ»ĊʊmlÔĵǠÆôVÒÞbl¤ÈIĸþlw»Ķa¯ī@ÑÇ°anƾ°\"],encodeOffsets:[[97302,31917]]}},{type:\"Feature\",id:\"5422\",properties:{name:\"山南地区\",cp:[92.2083,28.3392],childNum:12},geometry:{type:\"Polygon\",coordinates:[\"@@°ÞUĖ°¦²ĊôÇÜLǖĀɜȘŰÞLĸźêÞ@UÜUŤ°ɞ¯Ü°WŦĀmŎ¦ĢyVÑŁl¥Čĸôx°£źÒWÈÿÈUÿçÅyýóġō¯řÅmÇÛUċ¯£V±²°ôôĸa°£ĠÒŦ¥Ʉ£ÆJÞ£ĢbyĶzŎŃ@ŗ±ô@ĸçlǓÓĢÑVýmÑl¥ĵó¯̻̥ƛǫÝһÇƧĉyţ¼ҍēVĶĉŎ°ĸmÞVÝĸÒÛaċóŹĖèÈÈl¼k¤ÝX@`Þŏ¼Æō¼ÇçĉKUÝÝ£ğ¤@¦ġl¯Òġĉ¯ómóxÝÞğVƴċK@b@ÜUÒ¯ÈĢÜ@²xŎl¤\"],encodeOffsets:[[92363,29672]]}},{type:\"Feature\",id:\"5401\",properties:{name:\"拉萨市\",cp:[91.1865,30.1465],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@Ŏ²l@°XĢƐlôŤLX¦°¤ĊnČ¼ÇĊŎͪÞÈÜxU°ÝÞÞ¼¼lČÞKǓ°óU¯Ģ±ǔÔV±ŤóX¯ÇmÑwXī°@°ĕĸÞKÆĖĢÇ°bȂÇŁUV¯wVó¥VÅ£Ý@@±ÞwÅÈ@¥nōťÿ¯XÛɝ°ţ¯ÛVVÝ@ŹéķÝKȗůɛǕÿÛKóÈǫǫUţèmÒn¯Æ°ÈU°b¼UĢV°°V\"],encodeOffsets:[[92059,30696]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/yun_nan_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"5308\",properties:{name:\"普洱市\",cp:[100.7446,23.4229],childNum:10},geometry:{type:\"Polygon\",coordinates:[\"@@Uô²a@²²Ķ¥V°Ķ²bl¤kVxl@°Ś²@y@ô¦¯@xxVxUVbVÜm¼ŎĢmºXXWÆ@ĀmmXU°ÅÒm¼Þx°w@°XêĠ°»nV°Ul@k@V±ôī@£ČŃÆ£KÞý@¥k@ya@nWVUVwm£Jknm@wmknXX¥mUUlUnb¯°nkVInlIUw°nmk@@mlanXlanmk@wVWUw_@éĠanmUaÜ£mX¥¯@@óUmÝ¯¯ÞÝlKnxô£»»ĠJ°aVUÝÿV¥ÛbI@wmón¯yÛL@WkÅmÈ`IWa¯K@¯mUnmaXmbmak¯ĢÒÝm¯mV¯KÇb¯KÛWWX@aVknċLUWVkXóW@ka@ób¯Uwmb¥UUlaU¥U£maķKXkmÝ@kwmÑ¯k±ċbUUVakaġ¦kL@`a¯xmÅLUW@ċnÅUV°LkL@b°°@¤²nôôkl°kèÒÈzV¤ÈWôônV@¦@¼Ux\"],encodeOffsets:[[101903,23637]]}},{type:\"Feature\",id:\"5325\",properties:{name:\"红河哈尼族彝族自治州\",cp:[103.0408,23.6041],childNum:13},geometry:{type:\"Polygon\",coordinates:[\"@@°°nÞôV@°@¦WnÛ¤Vbmnğb@ê`VxUX@xÆÞUnnWÞĸĢÈ@Çè@zÛÜWÅêl²KnV¯ĖĊx@bk@@°JÆ£Èblnnm°nlUkVUUwVmKnnVÞxVLX¥laX@@xl@VzÈVmk@b°ÈĸmV¦`WXbUbbX¼°x@aVVkn@lþnXUlVxŤÅyIUkaIŎĊ@lXx@bz@ô¥_V@ln@ôy@al_l`nmÈ»@kmXwWKU¯»aÅ@wmUÝKUaUUwW@w²»@kÆV£mm£VKkÑV@@»nw¥@kÆnllIVlnLVakalknJWmnaUaVÑVVÞn¥m@¯Uÿl@VçaXaV¯UyVLVk@nJlXLlkxlbla²Òl@nVJVkxKlkUaVķÝÑU@Åm¯@±Uó°ğńķĠmUÑ@Ç¯¯Å¼@nml@°¯¯`@w£@¯Çk@»nmċ¯U»I¯LÇĶÛn@bó°Uwm¯UmÇ¯aI@ykIVU¯bIğ¼¼ó¤mwkLÝÞ\"],encodeOffsets:[[104243,23429]]}},{type:\"Feature\",id:\"5326\",properties:{name:\"文山壮族苗族自治州\",cp:[104.8865,23.5712],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@wô@²¯maUmôUÆx@XbÞInlVUVwJVaUK°¥xmÞXnlKlnna°@ĊČÆwUmnkl@°£nyn@VV@Vak@@kÞÝbmx°Vnw°klÞInĖÞVlKl@Xa°KlVU@JnxU@ÈĢbUKlm@ak_wanWUk°l»k@Wk@lwU_@UalóU¥ÇnkJW@mVXx±bK@nV±a@Åa£ÝK²WknamKknÇk¯aVV¯ĀUÒ¥I@mm¯¯xÅW@@`k@ó»UU¯lm£ÅWlĵw@mmwÅmWU@y±UxmwU¯U¥Ý¥¯£m@kÇVUV°VbklLwUlUImk@±ÑkbkalwkWKkmI@UlUKVzU°WbbUè@kVĀ°@nm¦ÝUUUÒVbmbXnmIkllbUbmKUkkJmkÅ@l¦mx@¼U@lÒULn¤nU¤Å@l±¼@xXxVVVbÞLVn@xÆb°¼V\"],encodeOffsets:[[106504,25037]]}},{type:\"Feature\",id:\"5303\",properties:{name:\"曲靖市\",cp:[103.9417,25.7025],childNum:9},geometry:{type:\"Polygon\",coordinates:[\"@@È¦lKÞĕUV¯Um¯ÇVUnVVUĉnĊÇƾLn°°ÈJÆw@lbÞa¦VXJ°¯W¯aÞJVkUa@lKnÅmWUk¯a¯»@m±@ÑkkbWWX_WÓU»_lkÑm@U»m@l@IWċn¯l@VanVUVUVwVxKÈVmUē@n@VÝÆLwVVwnVlmkUVÑÇ°ka@kÿÝaÞUl£ċĕX±±ĉa@UnVnalónk@wlUVmkÝJaW@ÅwóVVnnb±°@óxXLWxn@lÇ¼nmk_k`@bózm@kU@`¦ó@nW@ÜÅXWw@yb¦@ÒlnUb@xlÜk@²Ç@U¯bmy@kV@bb¦U`lLVx@bLl¼Þ¤@°VVÞU@WÞUbJ@nn@lnnmxUUUbK@ÇwklkUVWakn@lbU@@ULVxkKUn°¯Ò@¼km¦m@klȰ@lUl¦@Vl°wnnþĊUÆbUxbVĖU°annaVal@@b\"],encodeOffsets:[[106099,27653]]}},{type:\"Feature\",id:\"5323\",properties:{name:\"楚雄彝族自治州\",cp:[101.6016,25.3619],childNum:10},geometry:{type:\"Polygon\",coordinates:[\"@@mÒXU`Wn@Xl±¦Uxnbl°knmKUxxVôUx°¼ôÒÈ°JlnÞKĠW°¦Vx²JVw_°¥@UV@@wnymknK¯I@²b°£V¥wUV¤nLkÆJÈwôô°l»Č¯ġVUU@@°ÝXl@U»°Å@U¯@w±¯VmUUlm@mÑnIVyUwmak£Vwm±@Çw@n@UxkwlÇnLmkÅ@±kka@kóJV¯Ç»U£lw¯Xalbl¥¯UX@aUaÈL@ÇVIVkaU¯mmakLWkUJ¯Umxn@kUx¯xmWÅīÝkkbŤbkxWmXwWk¯wKkLÅ¤ċń@¤óĬU²@@lk¯VmU¯¼@xV@k°l°kbU°nmVnU@°UVèÞÆbUÒÞnU¦V¼lô@Vl\"],encodeOffsets:[[103433,26196]]}},{type:\"Feature\",id:\"5329\",properties:{name:\"大理白族自治州\",cp:[99.9536,25.6805],childNum:12},geometry:{type:\"Polygon\",coordinates:[\"@@lbKVIUa@²m@bxôÒÜxXLmbnl@K°¼kUôxôlV¦nJUÆnm@xÆwbXÆôôLUVwôK@wlmaVw@WknmIUmlnJla@_@kÝmKUaÑm¯Xw°aUaVl»²JVbÆJkôĶĀ²VVkmbVwUówVwnLlmk¯maVw²¥Wk@XmV_WnÑUk@kó»UV¥ÝmVÑÅaÝUçV@¯VUmn¯mVlak¯l¯U@@wğWé¯@¯xÝw¯¯Jċa¯U¥mLU¤bÞȤbÇLWUwmIUVW¼kb`UVb¯L±ĊÛkÿÝKkwKţêUĉþÈV¯ÞVbU°KVk²ÝmImV@kmUkVxm¯KXÈķJU¦V°ULWxL@môb@bkx±LnVUVLnkÜWnwlLÅƒmW@kkJU_VWĊÞ\"],encodeOffsets:[[101408,26770]]}},{type:\"Feature\",id:\"5309\",properties:{name:\"临沧市\",cp:[99.613,24.0546],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@xĢl`²X°Vx@x°Þ°KXağUÑWbnIl`X²°bxl°V@xVxk¦mbl@xXVÆzX¤Æk°kx@lźêlaX»VUnJVxXÈKaÝȣaV£nKV¦°Čb°I°n»ÆÑV¯nWn@ÿXÅWWn¹ġōn»ÛUaUVUww@w°ó¥@z±@ř¯@kUwlk£±aĵ¯Uĵ¦±±@bó±VÝ@ó¤w¯I@mÅóm±X¯IólK@°UllbzkKlln@@ÔºUmVk²ôÒxŎUVóLbmÈnmbnlax@z@Æ¦k\"],encodeOffsets:[[101251,24734]]}},{type:\"Feature\",id:\"5334\",properties:{name:\"迪庆藏族自治州\",cp:[99.4592,27.9327],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@WXw@akk@yk°īX¥Uóķ¯w@n»UaVaUÛ¯mV¼kÞċô@n¯xÛÒmV¯Ô@x@kwmÅa@UaÝ¯VÅyVa@ÿn»ÝVmankmmÞÅô@n£±ğzÇmU¦VmnÜmbn@°nV@xmzÅ@mºV¦k°ln¤¼õôn@xkÆIUxU@Ť¦VmVkmkXW¤XzVx@Æx¼Þ¯b@lVĸÞVm¼Xm¦VÞ@Æ¹Vón¥ÆKnKX¯x@èĊÈ±łXaÆxnlV@UÛlȻkğV¥m²ǉmÅÞĕƒƛm°ÆmX¤mznÆV¦ÞVVb°bnÞWbn°l@VÈ@VĵĊ±@óInxÆw¥@£ÞW¯ĸ£UUKk±akkkbmWmÈķaÆÇUÈÆW@wmknmU¯\"],encodeOffsets:[[102702,28401]]}},{type:\"Feature\",id:\"5306\",properties:{name:\"昭通市\",cp:[104.0955,27.6031],childNum:11},geometry:{type:\"Polygon\",coordinates:[\"@@mnK@wmUÅ¥móXǓŏmX@VmL@xţnk@mlUŻÒğŋ@L@mmLkm@bXÅW¼ka¯lÇŹ¯aÇ»ÝÝ_@m@@a@UklwUm@ak@bUmbmbV¯ĕUaVwÅaĉVmým¯xUk@k¥VUX¤VÈm`@ńÇÜ@ĀknĔkƞÆĠÞUVôƆÞI@UxÆ¦nl@ĊĊnxUÒ°¦Vb¯WUnWIml@xnUbô¤¼ÈxlI»KV@ÈÔJkUĖ±ÆVb@nVÜVUVLwĠlknĠ@nx°¥Æ²mUw@mmÅUl¯UÑÑUmLllIl±@VkwW@w°@U»kUóI°»ĢÑL`nUĠ²lmbôV@nJUxÆ¦X¦l@ŎUV@lVKVÅV£UaÞUnW@¯VU@ó\"],encodeOffsets:[[107787,28244]]}},{type:\"Feature\",id:\"5301\",properties:{name:\"昆明市\",cp:[102.9199,25.4663],childNum:11},geometry:{type:\"Polygon\",coordinates:[\"@@n@VkVUn²°@x°V@¯ÆV¼k@WÞ¯@@VVUĢċ°k¼VĊx¤Ōx°mVkÑÈL°x°X°VmĊLVxUĖ°bX¦VW@kȯlkn@¥ln@»°Ñ¯VmlLUwVK@V@ka@lmXbUlVlkÈx@LVaVVwnmm@km@mIVaÝ@XVUÝ¯U@Ý£k»K@aUwkKV_¥a@alU@nz°aVÈ@@±lÛk@wVakm@Ñ¥az@XxÆW@ÛX@m@y@aWw@kōĉJlbVJzţÆUwVkmWkým@UlU@b¯wVºUVUêĠXUaUbVĊUWXUmkKWnUUUVVVÝ@kk±¯Lk±WkXlVkl@wXbmLVUIVmk@Ubma@kkaVKUkmlXLWnJ¯ÒĊ°@zkºlLUŤn@@nô@lÆnmKkÈlxVw@@mÈx@n²Uxl¤nbVxUzmJÒn\"],encodeOffsets:[[104828,25999]]}},{type:\"Feature\",id:\"5307\",properties:{name:\"丽江市\",cp:[100.448,26.955],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@l@@w°ÓUnÜÑ°w@mČóÝlU»n°VÜUbVbm¼@°xôĸVW¦¯Ĭl@zll@bWxXaX@ÆĠÆaXwl@XaÆ¦n¼Jn@mnKW¯È»V¯°akVanXVwl@VyUĕVUbÈīlaUk°k¯l²VUkƛô@I@mVwĊaVakaÆbUVLaXIWKUwaWÑÅKUaVk°@Uw¯¥XğÝLkm¯IÇóÑ¯»anUl±UĵÿlóÅIaU±Ik¼UVb¯bWxn°ÒVbnLlÞ@@`kbmIkVnJmnXl@Uxbkn@xóLUxVKóóÅWaÅxw@nÅmVôXLlVU¤b¦m¼@ĀbUzUÆ°ÞVb@Æbnx\"],encodeOffsets:[[101937,28227]]}},{type:\"Feature\",id:\"5328\",properties:{name:\"西双版纳傣族自治州\",cp:[100.8984,21.8628],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@l²°nÒlxÞ@nWlLĸnbV¤V¦kbVV¦nax°Vôa@b@lôXlWUVXČKlmU@bWXXÜ°LÈa°LnU°ÞnÑġ°lnba¯¯KWó@kmK@UĉV@k°VV¹a@y_ċl_nÓlL@anI@óWl£VUlkĕlKVwU@kVam¯ÅL@bÝk@VnUbÇbÝwÅ@ċ¥¯lk¼ÅÒ°b@¦nlUn@ÇVmÆbWôU@ÝÅōm¯aUmkWWw@±n¯UèaL¯mLkwl@°mnÈÒ¯ów@VxĀU¤°Į°Xl\"],encodeOffsets:[[102376,22579]]}},{type:\"Feature\",id:\"5305\",properties:{name:\"保山市\",cp:[99.0637,24.9884],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@X°Il@¦È¼m¼ÞaÞÅlÈxV¼lVôÈÆlLÞ£ÈºlkUUw¯UĕVwĊ@n¦mlnVĸIWÇ°LnUwlVn@lnUnJÞl±U¯LVUa°ÝUÇĊýVŤéLlxÞLĀÜl²ĉ°KUaV_Źé@klw¯lÅW£ÅyUW@wknal¥Uw@wUk¯w¯aW±k_mJaXVÒĠWb¯L¯Ý@wwU¯±Wk_ġwwōKmb@¤bk°lĖôUJVnÅlťU¯°VbnbWxXmÞWUĀLyWzÛKmbUxVKknÝkVĀċ¤Ux@¯m@¦\"],encodeOffsets:[[100440,25943]]}},{type:\"Feature\",id:\"5304\",properties:{name:\"玉溪市\",cp:[101.9312,23.8898],childNum:9},geometry:{type:\"Polygon\",coordinates:[\"@@lL°xXlWxXnlwaţlaÞlÆĬnX°wVwl@mnw°VVIXllKbnnV°lbUUJ@ÈÇKVb@bW°Vk¦kaWb°kxV¤È¼U°ôI@llbl²@@ó@mm@VţkKl¹@yĉ¯°ÑIXmWKnklVULlb@lnbVal@UnVJUnKWax@lkkUlW²XlK°l²@lÞUUUVVVXmlLVnXWVUĉVaVbWğVéUVU¹W»aVaaWX_U¥nÇķ¯@alUnÇUyk@@wW@kbW¦UKÝwUmmLUnVxUVVlk¯mmnmkÇaÅ¤¯I@l@@aĉw°ĕmUL±kÆéXÜÛ@yÈç@ÇġÝķXmmÝVÅlmnkbmWkb@nl@nm¯VxkJmUJml¯°makVVnV¦WWmnl@xmnlI¤nxUVUmX@b@zl@¦Ýþ\"],encodeOffsets:[[103703,24874]]}},{type:\"Feature\",id:\"5333\",properties:{name:\"怒江傈僳族自治州\",cp:[99.1516,26.5594],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@WyX£lWlnnUU¥@ţVVwJlÅ@wmöó»£kml¯U¥n¹Æ@ny@wmU@¯mnamÛnUV¥ÈnĠy²m¤@ÆónÝnmlnbÞU¥aV£kUKWómIU¥ókwVól»¯Lk@mnaWKÛwóÑw@a±n@VbUJLkaÝXĉUV`lI@lnXÆƑkKmxÛXmlUKVmU²Klw@aaó@nKXwVKU¯V¥mUnkm¥ĉ@UxVĖ°VxVklmÞkKWĀkVWnl°Lnm@°UxlV@nk¦JVÈ°VÒ@nX°@ÆlUômlnô²nxmłnVV¯x@Èm°XblVUl°@xkXU¤WXXWXÆmkÅJmÞw±bxUīkKmÅVUĖÝèVkx@lXlnk¤LkĖk¦xUL°¯Ė@LnK@b°xVI¥Ua°Ñ@»nm@¹KŎÞÈWln²n\"],encodeOffsets:[[101071,28891]]}},{type:\"Feature\",id:\"5331\",properties:{name:\"德宏傣族景颇族自治州\",cp:[98.1299,24.5874],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@¥n@°@VwČ£ÿUlÞlmULVwnaÜLXyzKVÿXÝnWXwmaUa°¯VŦÆkUmVIókĕl¯a@£nama@¯m¯ó@óyţbġkÅm±ÛammVkLwU`Wk@VkUmÅlUUKmbkkUVUw¦ó°¼bn°ô¦lºz@x¯@U°nU¤ţU°VƆ@ÈmlnzÞl°¦ÆaxUxLkxWƒn@²ŰW@°ÈXl°Llx\"],encodeOffsets:[[100440,25943]]}}],UTF8Encoding:!0}}),i(\"echarts/util/mapData/geoJson/zhe_jiang_geo\",[],function(){return{type:\"FeatureCollection\",features:[{type:\"Feature\",id:\"3311\",properties:{name:\"丽水市\",cp:[119.5642,28.1854],childNum:9},geometry:{type:\"Polygon\",coordinates:[\"@@@VbVl@XnUXKV@¦nxlUXVnKVmnLUV@bn¤lLXK²`nnlJXIVJIVnn°KnnVll@VLXWV@UkVaVKzV@VVaUK@U»VUl@@WnUU@wVLn@Vwl@XW°LVbn@VU@Xl`@XnKVbkl@XVJlUnlVxlL@lnXl@VUnV°°@aUVLXblWVXn@VVUV@L¤VLVUVbnalLUUVX_laVaWVzXKV@@a@KUmImmXama@kU@yVIUKaVa@kXK@aWU@VIUmW@kkVmU@VwUa@K@k@U`@kUKVk@UV@VaUm²Vy@klUUWUkVmUa@_KVaXaXmU@mUlWkaUX@mmkL@wJnVVÅbWKXa@@I@aJUUÇ@VULW@akLmb@K@aXXw@mVmUVkUy@£@aU@@VkUWm@kUKXUWU_mW@wkkmJUUkLWWUXW@IkJ@k@mW_kÓ_UlLm@I@aUa¯m@ka¯LUJ@mVVxUba@LUKkXbm@Uak@@a@Um`IUbUJ@nUVW@@LnVV@lUbVlUX@`@blXklWUmXlm¦U@@V¯bml@@nUb@llnn@VbX@lV@UVULmU@JVnbVbkbVWxU@@nUVk@\"],encodeOffsets:[[121546,28992]]}},{type:\"Feature\",id:\"3301\",properties:{name:\"杭州市\",cp:[119.5313,29.8773],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@X@l°KXXlWb@²`bIX`l@@bWl@n@VnLUV@V@°¦@l@XVlU@@xVbUb@Vkb@@XVJVzJ@LÞ@VmLUxUJ@LUVxbxXUl@VaÈwbaÞa@Vl@XUVx@V@VLlbnVal@lbVnnLnKnL@VlbVJXalIb@KUU@mVInJUVl@xUVLnU@UÞaV@lkV@UanKL@UlKVUnbÆmn@@nUlVnVJl@@UXUL@WVIVJVxVLXV@IÜKnbn@V¥V@@I@y°b@UUwnk°ÆƨVlUçXm£aÇIkV@WV@@aWIUWUIkb@WW@UnK@UU@kaWVkVIVVnU@UWVUV@VmVkKkWIkVWaULU`UImJUImmU@wmwUVIUWVkUamaU@mVkb@KVU@aVU@anKULVJU@kÛUJUVkkVakU@aVwkW@UWkXmWaULUaUK@XJUUmVU@UVUkJ@ImwmKU@k@lUW@@akKmkamIkWl_UwVm@UkaVUUa@UamakbWlkL@aUalU@mkL@U@UlmK@XkKm@Ýakb@xnXb`nUUU@U@wU@@mKkkV¯U@lULUbVbUb@Va@LºÝb@bLmKx@VUL@bk@mxULWl\"],encodeOffsets:[[121185,30184]]}},{type:\"Feature\",id:\"3303\",properties:{name:\"温州市\",cp:[120.498,27.8119],childNum:9},geometry:{type:\"Polygon\",coordinates:[\"@@ll@xnXV`VXWVL@lXnlV@UV@@b@¤VzUlnVU@nWxW@b@LnalK@bXVKUÈ@VVI@b@J@WbXLÆaUUmI@xlKnn@VWlbkXV@nVWnWbUbL@`VbUnVlVXkV@lUz±VnUbU@@VUlVL@l_@V@l@LVbV@XLV`VÈlxn@lU@aaVVk@XJ@nl@@LU`°LVbL°a@aUVy@anI@aanV@²wÜJX@VVV°kna@WVkaWwU@m@kaUĕÝÝŤnÈaaóI»@±XWkUķ@kV±kwUkWwUÝ»ÛkɳlImaUaWóXÿǬkUnWVmmkKţnŏÞğlUlUx@XWbV@JkX°mb@VULVxUVk@@LWWk@WIkUkJmUkVmI@y@UakLmU@mUUUkaVk@mK@UlUU@UmKmbUUUJ@n@KVLUL@VkJWXX`mnULWlkL@JVLVb@°kxkU@LVV@VLV`UL@VUX\"],encodeOffsets:[[122502,28334]]}},{type:\"Feature\",id:\"3302\",properties:{name:\"宁波市\",cp:[121.5967,29.6466],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@Ċ¦ĸĀ°nXÞVKkƨƑźÿ°»n@wô¥ÜbU°ÆXÞWóçĉÝ±IUÈ¥@U°wÆ»²mm_@aXVKÞVlk@akk̅@£X»VwÆXWa¯aȗbKƽŰĊxLók@@¯nKUL@xkLÑkWULUUmJUXVU@mUX¯@V`mbXbV@@nn¤WXx@kJ@nVVUVl²UbÝVUVk@Wx@V@VXzmlaL@VlLU`XUVVVUnl@VbnJlnUVVnlUKkbmnnVxlJnxmbU@UL@KUVX@xmb@lk@mnVVUè\"],encodeOffsets:[[123784,30977]]}},{type:\"Feature\",id:\"3309\",properties:{name:\"舟山市\",cp:[122.2559,30.2234],childNum:3},geometry:{type:\"Polygon\",coordinates:[\"@@l΢ƒʠþÆVĢLĊǬXĊÜXôVÑÆwlƏÈóVĭVǓ@ĉwɛkmK@ĉXīWaĉUĵÝm¯ĉwĉ±±nÅ¼¯x@VÇ¦V²JĊÞôèÝXÅW¯VÛaó¦@xm¯¼ŹĀ\"],\nencodeOffsets:[[124437,30983]]}},{type:\"Feature\",id:\"3310\",properties:{name:\"台州市\",cp:[121.1353,28.6688],childNum:7},geometry:{type:\"Polygon\",coordinates:[\"@@lVIVWVz@bXJl@Xal@°nLll@nVxnVK@UJVb¦°k`UIWJXnÆ@bUJXl@lbWn@UzVV@bVVmVnnJVXnabKUKnUVVUnVLlKVLXaJm£@mU@WanaU_°@VWnV@UVWnIVVVKlXÒlK@wVKL°m@l@ôKwĉƾůUl£@»UVkm@ƅUaÛIŏmUk@mw@a£Wk@ţIm±@ankôUlaUUw¯ōabÇbţmÞÞVĖbl@@nVXxbUl@Xmb¯lUUUW@ÛI±xU@mb@bmJ@bUzV@b¯bKUa¯KV_@Kk@@mWI@lUUb@bkVm@kwUÇU_WKU@Ux@VUnllX@VnJ@UXV@bWL@lUbbVLUJ@zV@lnbWbnnnJV@L\"],encodeOffsets:[[123312,29526]]}},{type:\"Feature\",id:\"3307\",properties:{name:\"金华市\",cp:[120.0037,29.1028],childNum:8},geometry:{type:\"Polygon\",coordinates:[\"@@nbVb@VbUVlb@VUnVxk`lXnJlbnlL@bX@V@klV@nLnx@JlIVU@VUVnVVI@WVLVbVKXbWnXl@VlXUxb@lVUbllVUIÜVnalKX@@bV@@aUUlUwUw@naWWUVaUUaVbLlxXJVk°UlkU¥@ka@LVlXLVlVWznVn@lxJl_@WX_@mVaa@alU@kVVnaKVLlKb@UUaVabnUWmXU@k@yVI@aÅWmXIVJl_¯¥UaVI@LmUUw@mkkmK¯k@Wbk@WI@aUyUXJkU@bU@WLUyXUbkbW`UVVkKmbUaVUUK£@KVUUUm@UWkXWaUKV@b¯¯mUV@UkmW@kkKwUmkkVUI@WlkUamL@Wk_W@UVm@Ua¯KWXk@Uxm@UK@xVmV@Xk@UVV¼@VLUbUU@yULUbVlU@@XlVUVVbU@lXXVW@XUVl@@VUVÈn@VVU@lVa@UmL@`X@`WL@VUX@lUL@xlx\"],encodeOffsets:[[122119,29948]]}},{type:\"Feature\",id:\"3308\",properties:{name:\"衢州市\",cp:[118.6853,28.8666],childNum:5},geometry:{type:\"Polygon\",coordinates:[\"@@XkVKnwl@@aVK@UwnLK@aÞa¹@Kb@UVaUaVaVK@k°VUllnL@V@xV@V@VVm_Wam@wlaÞbn@lL@WnLk@V@VlK@nkVVb@blKXklakw@wVK@kVW@UXK@_W@_nKV@Ub@kVUUm@ÇVU@Uk@VU@WUXWW@kVUaVUkU@WWXUKk@Ukmm¯LmmUJUIWJkImm_±WLkKm£@aVUmKUnLmWUkVmw@¥ULVWm@WUka@UmmLmm@@bUX@@WUIm@UVUK@UVUUUVVJmb@bXnmV¼nnn¦mJUVLV@VW@UzUlVnUbl`UnVl@XU@kl@bmÈUxVk@@J@¼W@ÅaVVnzmV@WJk@kWJ@lXbWbXxmVnlLXb@°lKVXnWbWVXmbV@XlbI@Kn@@x@VLlm\"],encodeOffsets:[[121185,30184]]}},{type:\"Feature\",id:\"3306\",properties:{name:\"绍兴市\",cp:[120.564,29.7565],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@x@VnnVJnIVJV_VKXblUXJllLUUnU@UVVX@mVUUUJlXUlbV@@VLVmX@@XlaVJVXXJ@b@XU@lUJÈb¤ŌJçVUUnml@@kna@wWVU@LVKV@namwkIUwmnmlaVLkUmVUkmmIUak@VmUUVUWV_kK@UKbnkWyU@@UXwl@VUÞUVak±VUUU@mlI@wXWIWbUKkLUKVmUUmVVLLambUWmIUmnUU@aUUVym@Xkak@W@z@lWVXnmVaUbVb@VakLUKLmbUU@lkV@bbUb@nW`@Xk`Ikwm@mUXyUUkWKUk@Kb@lV¦klV¯UlWIkwKUabVVUbVXXmb@VxxkVVV@bU@@aW@kLmb@lVUIVKmL@bUV@bUV@LalnUV@nbVbUlVXJVUnx\"],encodeOffsets:[[122997,30561]]}},{type:\"Feature\",id:\"3304\",properties:{name:\"嘉兴市\",cp:[120.9155,30.6354],childNum:6},geometry:{type:\"Polygon\",coordinates:[\"@@@blIX@@VÜVUnn@lklKnI°Þl`²LVKVbnbVaVLUVn@W¦@VkVVb@VI`@blLnLaX@VVb@U@XlVa@@kVaUKV»U_lWXU@albk@VllnLVKn@@UVIUw@y°IVVXU@VV@lwm@wVkƾaJLkΡƧƒlLÝUmW¯ķÿĉ¥IŋWnèkVƧU¯ÅmlVx@V¯az@@JU@U¦m@@nVmn@VLV\"],encodeOffsets:[[123233,31382]]}},{type:\"Feature\",id:\"3305\",properties:{name:\"湖州市\",cp:[119.8608,30.7782],childNum:4},geometry:{type:\"Polygon\",coordinates:[\"@@kLlkm@VmÛU@UW@kJ@aUK@UnmmU@maÛL@JWUUKUwUIUJ@XKWV@Vk@UIUmVk@mm@ÅnmaUVkL@VKmLVbU@klU@ÝbV@mVUKV@wUkVmIUJ@nVV@LakJWbUIka@UmKmLKmmUUVk@@nmLX`WXUV@@nUlkmlU@UbxVVIlVnn@@nUÒ@°n@@xmb@VbnV@@b@`@L@L@x@blVklVbnnV@aXb°VlU@Wb°ULXWVUVVwÈwÜ»ĸaĠnUVw²X@V@lVU@wlaUUVm@knUV\"],encodeOffsets:[[123379,31500]]}}],UTF8Encoding:!0}}),i(\"echarts/chart/gauge\",[\"require\",\"./base\",\"../util/shape/GaugePointer\",\"zrender/shape/Text\",\"zrender/shape/Line\",\"zrender/shape/Rectangle\",\"zrender/shape/Circle\",\"zrender/shape/Sector\",\"../config\",\"../util/ecData\",\"../util/accMath\",\"zrender/tool/util\",\"../chart\"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e(\"./base\"),n=e(\"../util/shape/GaugePointer\"),a=e(\"zrender/shape/Text\"),o=e(\"zrender/shape/Line\"),r=e(\"zrender/shape/Rectangle\"),s=e(\"zrender/shape/Circle\"),l=e(\"zrender/shape/Sector\"),h=e(\"../config\");h.gauge={zlevel:0,z:2,center:[\"50%\",\"50%\"],clickable:!0,legendHoverLink:!0,radius:\"75%\",startAngle:225,endAngle:-45,min:0,max:100,splitNumber:10,axisLine:{show:!0,lineStyle:{color:[[.2,\"#228b22\"],[.8,\"#48b\"],[1,\"#ff4500\"]],width:30}},axisTick:{show:!0,splitNumber:5,length:8,lineStyle:{color:\"#eee\",width:1,type:\"solid\"}},axisLabel:{show:!0,textStyle:{color:\"auto\"}},splitLine:{show:!0,length:30,lineStyle:{color:\"#eee\",width:2,type:\"solid\"}},pointer:{show:!0,length:\"80%\",width:8,color:\"auto\"},title:{show:!0,offsetCenter:[0,\"-40%\"],textStyle:{color:\"#333\",fontSize:15}},detail:{show:!0,backgroundColor:\"rgba(0,0,0,0)\",borderWidth:0,borderColor:\"#ccc\",width:100,height:40,offsetCenter:[0,\"40%\"],textStyle:{color:\"auto\",fontSize:30}}};var m=e(\"../util/ecData\"),V=e(\"../util/accMath\"),U=e(\"zrender/tool/util\");return t.prototype={type:h.CHART_TYPE_GAUGE,_buildShape:function(){var e=this.series;this._paramsMap={},this.selectedMap={};for(var t=0,i=e.length;i>t;t++)e[t].type===h.CHART_TYPE_GAUGE&&(this.selectedMap[e[t].name]=!0,e[t]=this.reformOption(e[t]),this.legendHoverLink=e[t].legendHoverLink||this.legendHoverLink,this._buildSingleGauge(t),this.buildMark(t));this.addShapeList()},_buildSingleGauge:function(e){var t=this.series[e];this._paramsMap[e]={center:this.parseCenter(this.zr,t.center),radius:this.parseRadius(this.zr,t.radius),startAngle:t.startAngle.toFixed(2)-0,endAngle:t.endAngle.toFixed(2)-0},this._paramsMap[e].totalAngle=this._paramsMap[e].startAngle-this._paramsMap[e].endAngle,this._colorMap(e),this._buildAxisLine(e),this._buildSplitLine(e),this._buildAxisTick(e),this._buildAxisLabel(e),this._buildPointer(e),this._buildTitle(e),this._buildDetail(e)},_buildAxisLine:function(e){var t=this.series[e];if(t.axisLine.show)for(var i,n,a=t.min,o=t.max-a,r=this._paramsMap[e],s=r.center,l=r.startAngle,h=r.totalAngle,V=r.colorArray,U=t.axisLine.lineStyle,d=this.parsePercent(U.width,r.radius[1]),p=r.radius[1],c=p-d,u=l,y=0,g=V.length;g>y;y++)n=l-h*(V[y][0]-a)/o,i=this._getSector(s,c,p,n,u,V[y][1],U,t.zlevel,t.z),u=n,i._animationAdd=\"r\",m.set(i,\"seriesIndex\",e),m.set(i,\"dataIndex\",y),this.shapeList.push(i)},_buildSplitLine:function(e){var t=this.series[e];if(t.splitLine.show)for(var i,n,a,r=this._paramsMap[e],s=t.splitNumber,l=t.min,h=t.max-l,m=t.splitLine,V=this.parsePercent(m.length,r.radius[1]),U=m.lineStyle,d=U.color,p=r.center,c=r.startAngle*Math.PI/180,u=r.totalAngle*Math.PI/180,y=r.radius[1],g=y-V,b=0;s>=b;b++)i=c-u/s*b,n=Math.sin(i),a=Math.cos(i),this.shapeList.push(new o({zlevel:t.zlevel,z:t.z+1,hoverable:!1,style:{xStart:p[0]+a*y,yStart:p[1]-n*y,xEnd:p[0]+a*g,yEnd:p[1]-n*g,strokeColor:\"auto\"===d?this._getColor(e,l+h/s*b):d,lineType:U.type,lineWidth:U.width,shadowColor:U.shadowColor,shadowBlur:U.shadowBlur,shadowOffsetX:U.shadowOffsetX,shadowOffsetY:U.shadowOffsetY}}))},_buildAxisTick:function(e){var t=this.series[e];if(t.axisTick.show)for(var i,n,a,r=this._paramsMap[e],s=t.splitNumber,l=t.min,h=t.max-l,m=t.axisTick,V=m.splitNumber,U=this.parsePercent(m.length,r.radius[1]),d=m.lineStyle,p=d.color,c=r.center,u=r.startAngle*Math.PI/180,y=r.totalAngle*Math.PI/180,g=r.radius[1],b=g-U,f=0,k=s*V;k>=f;f++)f%V!==0&&(i=u-y/k*f,n=Math.sin(i),a=Math.cos(i),this.shapeList.push(new o({zlevel:t.zlevel,z:t.z+1,hoverable:!1,style:{xStart:c[0]+a*g,yStart:c[1]-n*g,xEnd:c[0]+a*b,yEnd:c[1]-n*b,strokeColor:\"auto\"===p?this._getColor(e,l+h/k*f):p,lineType:d.type,lineWidth:d.width,shadowColor:d.shadowColor,shadowBlur:d.shadowBlur,shadowOffsetX:d.shadowOffsetX,shadowOffsetY:d.shadowOffsetY}})))},_buildAxisLabel:function(e){var t=this.series[e];if(t.axisLabel.show)for(var i,n,o,r,s=t.splitNumber,l=t.min,h=t.max-l,m=t.axisLabel.textStyle,U=this.getFont(m),d=m.color,p=this._paramsMap[e],c=p.center,u=p.startAngle,y=p.totalAngle,g=p.radius[1]-this.parsePercent(t.splitLine.length,p.radius[1])-5,b=0;s>=b;b++)r=V.accAdd(l,V.accMul(V.accDiv(h,s),b)),i=u-y/s*b,n=Math.sin(i*Math.PI/180),o=Math.cos(i*Math.PI/180),i=(i+360)%360,this.shapeList.push(new a({zlevel:t.zlevel,z:t.z+1,hoverable:!1,style:{x:c[0]+o*g,y:c[1]-n*g,color:\"auto\"===d?this._getColor(e,r):d,text:this._getLabelText(t.axisLabel.formatter,r),textAlign:i>=110&&250>=i?\"left\":70>=i||i>=290?\"right\":\"center\",textBaseline:i>=10&&170>=i?\"top\":i>=190&&350>=i?\"bottom\":\"middle\",textFont:U,shadowColor:m.shadowColor,shadowBlur:m.shadowBlur,shadowOffsetX:m.shadowOffsetX,shadowOffsetY:m.shadowOffsetY}}))},_buildPointer:function(e){var t=this.series[e];if(t.pointer.show){var i=t.max-t.min,a=t.pointer,o=this._paramsMap[e],r=this.parsePercent(a.length,o.radius[1]),l=this.parsePercent(a.width,o.radius[1]),h=o.center,V=this._getValue(e);V=V<t.max?V:t.max;var U=(o.startAngle-o.totalAngle/i*(V-t.min))*Math.PI/180,d=\"auto\"===a.color?this._getColor(e,V):a.color,p=new n({zlevel:t.zlevel,z:t.z+1,clickable:this.query(t,\"clickable\"),style:{x:h[0],y:h[1],r:r,startAngle:o.startAngle*Math.PI/180,angle:U,color:d,width:l,shadowColor:a.shadowColor,shadowBlur:a.shadowBlur,shadowOffsetX:a.shadowOffsetX,shadowOffsetY:a.shadowOffsetY},highlightStyle:{brushType:\"fill\",width:l>2?2:l/2,color:\"#fff\"}});m.pack(p,this.series[e],e,this.series[e].data[0],0,this.series[e].data[0].name,V),this.shapeList.push(p),this.shapeList.push(new s({zlevel:t.zlevel,z:t.z+2,hoverable:!1,style:{x:h[0],y:h[1],r:a.width/2.5,color:\"#fff\"}}))}},_buildTitle:function(e){var t=this.series[e];if(t.title.show){var i=t.data[0],n=null!=i.name?i.name:\"\";if(\"\"!==n){var o=t.title,r=o.offsetCenter,s=o.textStyle,l=s.color,h=this._paramsMap[e],m=h.center[0]+this.parsePercent(r[0],h.radius[1]),V=h.center[1]+this.parsePercent(r[1],h.radius[1]);this.shapeList.push(new a({zlevel:t.zlevel,z:t.z+(Math.abs(m-h.center[0])+Math.abs(V-h.center[1])<2*s.fontSize?2:1),hoverable:!1,style:{x:m,y:V,color:\"auto\"===l?this._getColor(e):l,text:n,textAlign:\"center\",textFont:this.getFont(s),shadowColor:s.shadowColor,shadowBlur:s.shadowBlur,shadowOffsetX:s.shadowOffsetX,shadowOffsetY:s.shadowOffsetY}}))}}},_buildDetail:function(e){var t=this.series[e];if(t.detail.show){var i=t.detail,n=i.offsetCenter,a=i.backgroundColor,o=i.textStyle,s=o.color,l=this._paramsMap[e],h=this._getValue(e),m=l.center[0]-i.width/2+this.parsePercent(n[0],l.radius[1]),V=l.center[1]+this.parsePercent(n[1],l.radius[1]);this.shapeList.push(new r({zlevel:t.zlevel,z:t.z+(Math.abs(m+i.width/2-l.center[0])+Math.abs(V+i.height/2-l.center[1])<o.fontSize?2:1),hoverable:!1,style:{x:m,y:V,width:i.width,height:i.height,brushType:\"both\",color:\"auto\"===a?this._getColor(e,h):a,lineWidth:i.borderWidth,strokeColor:i.borderColor,shadowColor:i.shadowColor,shadowBlur:i.shadowBlur,shadowOffsetX:i.shadowOffsetX,shadowOffsetY:i.shadowOffsetY,text:this._getLabelText(i.formatter,h),textFont:this.getFont(o),textPosition:\"inside\",textColor:\"auto\"===s?this._getColor(e,h):s}}))}},_getValue:function(e){return this.getDataFromOption(this.series[e].data[0])},_colorMap:function(e){var t=this.series[e],i=t.min,n=t.max-i,a=t.axisLine.lineStyle.color;a instanceof Array||(a=[[1,a]]);for(var o=[],r=0,s=a.length;s>r;r++)o.push([a[r][0]*n+i,a[r][1]]);this._paramsMap[e].colorArray=o},_getColor:function(e,t){null==t&&(t=this._getValue(e));for(var i=this._paramsMap[e].colorArray,n=0,a=i.length;a>n;n++)if(i[n][0]>=t)return i[n][1];return i[i.length-1][1]},_getSector:function(e,t,i,n,a,o,r,s,h){return new l({zlevel:s,z:h,hoverable:!1,style:{x:e[0],y:e[1],r0:t,r:i,startAngle:n,endAngle:a,brushType:\"fill\",color:o,shadowColor:r.shadowColor,shadowBlur:r.shadowBlur,shadowOffsetX:r.shadowOffsetX,shadowOffsetY:r.shadowOffsetY}})},_getLabelText:function(e,t){if(e){if(\"function\"==typeof e)return e.call(this.myChart,t);if(\"string\"==typeof e)return e.replace(\"{value}\",t)}return t},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()}},U.inherits(t,i),e(\"../chart\").define(\"gauge\",t),t}),i(\"echarts/util/shape/GaugePointer\",[\"require\",\"zrender/shape/Base\",\"zrender/tool/util\",\"./normalIsCover\"],function(e){function t(e){i.call(this,e)}var i=e(\"zrender/shape/Base\"),n=e(\"zrender/tool/util\");return t.prototype={type:\"gauge-pointer\",buildPath:function(e,t){var i=t.r,n=t.width,a=t.angle,o=t.x-Math.cos(a)*n*(n>=i/3?1:2),r=t.y+Math.sin(a)*n*(n>=i/3?1:2);a=t.angle-Math.PI/2,e.moveTo(o,r),e.lineTo(t.x+Math.cos(a)*n,t.y-Math.sin(a)*n),e.lineTo(t.x+Math.cos(t.angle)*i,t.y-Math.sin(t.angle)*i),e.lineTo(t.x-Math.cos(a)*n,t.y+Math.sin(a)*n),e.lineTo(o,r)},getRect:function(e){if(e.__rect)return e.__rect;var t=2*e.width,i=e.x,n=e.y,a=i+Math.cos(e.angle)*e.r,o=n-Math.sin(e.angle)*e.r;return e.__rect={x:Math.min(i,a)-t,y:Math.min(n,o)-t,width:Math.abs(i-a)+t,height:Math.abs(n-o)+t},e.__rect},isCover:e(\"./normalIsCover\")},n.inherits(t,i),t}),i(\"echarts/chart/funnel\",[\"require\",\"./base\",\"zrender/shape/Text\",\"zrender/shape/Line\",\"zrender/shape/Polygon\",\"../config\",\"../util/ecData\",\"../util/number\",\"zrender/tool/util\",\"zrender/tool/color\",\"zrender/tool/area\",\"../chart\"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e(\"./base\"),n=e(\"zrender/shape/Text\"),a=e(\"zrender/shape/Line\"),o=e(\"zrender/shape/Polygon\"),r=e(\"../config\");r.funnel={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,x:80,y:60,x2:80,y2:60,min:0,max:100,minSize:\"0%\",maxSize:\"100%\",sort:\"descending\",gap:0,funnelAlign:\"center\",itemStyle:{normal:{borderColor:\"#fff\",borderWidth:1,label:{show:!0,position:\"outer\"},labelLine:{show:!0,length:10,lineStyle:{width:1,type:\"solid\"}}},emphasis:{borderColor:\"rgba(0,0,0,0)\",borderWidth:1,label:{show:!0},labelLine:{show:!0}}}};var s=e(\"../util/ecData\"),l=e(\"../util/number\"),h=e(\"zrender/tool/util\"),m=e(\"zrender/tool/color\"),V=e(\"zrender/tool/area\");return t.prototype={type:r.CHART_TYPE_FUNNEL,_buildShape:function(){var e=this.series,t=this.component.legend;this._paramsMap={},this._selected={},this.selectedMap={};for(var i,n=0,a=e.length;a>n;n++)if(e[n].type===r.CHART_TYPE_FUNNEL){if(e[n]=this.reformOption(e[n]),this.legendHoverLink=e[n].legendHoverLink||this.legendHoverLink,i=e[n].name||\"\",this.selectedMap[i]=t?t.isSelected(i):!0,!this.selectedMap[i])continue;this._buildSingleFunnel(n),this.buildMark(n)}this.addShapeList()},_buildSingleFunnel:function(e){var t=this.component.legend,i=this.series[e],n=this._mapData(e),a=this._getLocation(e);this._paramsMap[e]={location:a,data:n};for(var o,r=0,s=[],h=0,m=n.length;m>h;h++)o=n[h].name,this.selectedMap[o]=t?t.isSelected(o):!0,this.selectedMap[o]&&!isNaN(n[h].value)&&(s.push(n[h]),r++);if(0!==r){for(var V,U,d,p,c=this._buildFunnelCase(e),u=i.funnelAlign,y=i.gap,g=r>1?(a.height-(r-1)*y)/r:a.height,b=a.y,f=\"descending\"===i.sort?this._getItemWidth(e,s[0].value):l.parsePercent(i.minSize,a.width),k=\"descending\"===i.sort?1:0,x=a.centerX,_=[],h=0,m=s.length;m>h;h++)if(o=s[h].name,this.selectedMap[o]&&!isNaN(s[h].value)){switch(V=m-2>=h?this._getItemWidth(e,s[h+k].value):\"descending\"===i.sort?l.parsePercent(i.minSize,a.width):l.parsePercent(i.maxSize,a.width),u){case\"left\":U=a.x;break;case\"right\":U=a.x+a.width-f;break;default:U=x-f/2}d=this._buildItem(e,s[h]._index,t?t.getColor(o):this.zr.getColor(s[h]._index),U,b,f,V,g,u),b+=g+y,p=d.style.pointList,_.unshift([p[0][0]-10,p[0][1]]),_.push([p[1][0]+10,p[1][1]]),0===h&&(0===f?(p=_.pop(),\"center\"==u&&(_[0][0]+=10),\"right\"==u&&(_[0][0]=p[0]),_[0][1]-=\"center\"==u?10:15,1==m&&(p=d.style.pointList)):(_[_.length-1][1]-=5,_[0][1]-=5)),f=V}c&&(_.unshift([p[3][0]-10,p[3][1]]),_.push([p[2][0]+10,p[2][1]]),0===f?(p=_.pop(),\"center\"==u&&(_[0][0]+=10),\"right\"==u&&(_[0][0]=p[0]),_[0][1]+=\"center\"==u?10:15):(_[_.length-1][1]+=5,_[0][1]+=5),c.style.pointList=_)}},_buildFunnelCase:function(e){var t=this.series[e];if(this.deepQuery([t,this.option],\"calculable\")){var i=this._paramsMap[e].location,n=10,a={hoverable:!1,style:{pointListd:[[i.x-n,i.y-n],[i.x+i.width+n,i.y-n],[i.x+i.width+n,i.y+i.height+n],[i.x-n,i.y+i.height+n]],brushType:\"stroke\",lineWidth:1,strokeColor:t.calculableHolderColor||this.ecTheme.calculableHolderColor||r.calculableHolderColor}};return s.pack(a,t,e,void 0,-1),this.setCalculable(a),a=new o(a),this.shapeList.push(a),a}},_getLocation:function(e){var t=this.series[e],i=this.zr.getWidth(),n=this.zr.getHeight(),a=this.parsePercent(t.x,i),o=this.parsePercent(t.y,n),r=null==t.width?i-a-this.parsePercent(t.x2,i):this.parsePercent(t.width,i);return{x:a,y:o,width:r,height:null==t.height?n-o-this.parsePercent(t.y2,n):this.parsePercent(t.height,n),centerX:a+r/2}},_mapData:function(e){function t(e,t){return\"-\"===e.value?1:\"-\"===t.value?-1:t.value-e.value}function i(e,i){return-t(e,i)}for(var n=this.series[e],a=h.clone(n.data),o=0,r=a.length;r>o;o++)a[o]._index=o;return\"none\"!=n.sort&&a.sort(\"descending\"===n.sort?t:i),a},_buildItem:function(e,t,i,n,a,o,r,l,h){var m=this.series,V=m[e],U=V.data[t],d=this.getPolygon(e,t,i,n,a,o,r,l,h);s.pack(d,m[e],e,m[e].data[t],t,m[e].data[t].name),this.shapeList.push(d);var p=this.getLabel(e,t,i,n,a,o,r,l,h);s.pack(p,m[e],e,m[e].data[t],t,m[e].data[t].name),this.shapeList.push(p),this._needLabel(V,U,!1)||(p.invisible=!0);var c=this.getLabelLine(e,t,i,n,a,o,r,l,h);this.shapeList.push(c),this._needLabelLine(V,U,!1)||(c.invisible=!0);var u=[],y=[];return this._needLabelLine(V,U,!0)&&(u.push(c.id),y.push(c.id)),this._needLabel(V,U,!0)&&(u.push(p.id),y.push(d.id)),d.hoverConnect=u,p.hoverConnect=y,d},_getItemWidth:function(e,t){var i=this.series[e],n=this._paramsMap[e].location,a=i.min,o=i.max,r=l.parsePercent(i.minSize,n.width),s=l.parsePercent(i.maxSize,n.width);return(t-a)*(s-r)/(o-a)+r},getPolygon:function(e,t,i,n,a,r,s,l,h){var V,U=this.series[e],d=U.data[t],p=[d,U],c=this.deepMerge(p,\"itemStyle.normal\")||{},u=this.deepMerge(p,\"itemStyle.emphasis\")||{},y=this.getItemStyleColor(c.color,e,t,d)||i,g=this.getItemStyleColor(u.color,e,t,d)||(\"string\"==typeof y?m.lift(y,-.2):y);switch(h){case\"left\":V=n;break;case\"right\":V=n+(r-s);break;default:V=n+(r-s)/2}var b={zlevel:U.zlevel,z:U.z,clickable:this.deepQuery(p,\"clickable\"),style:{pointList:[[n,a],[n+r,a],[V+s,a+l],[V,a+l]],brushType:\"both\",color:y,lineWidth:c.borderWidth,strokeColor:c.borderColor},highlightStyle:{color:g,lineWidth:u.borderWidth,strokeColor:u.borderColor}};return this.deepQuery([d,U,this.option],\"calculable\")&&(this.setCalculable(b),b.draggable=!0),new o(b)},getLabel:function(e,t,i,a,o,r,s,l,U){var d,p=this.series[e],c=p.data[t],u=this._paramsMap[e].location,y=h.merge(h.clone(c.itemStyle)||{},p.itemStyle),g=\"normal\",b=y[g].label,f=b.textStyle||{},k=y[g].labelLine.length,x=this.getLabelText(e,t,g),_=this.getFont(f),L=i;b.position=b.position||y.normal.label.position,\"inner\"===b.position||\"inside\"===b.position||\"center\"===b.position?(d=U,L=Math.max(r,s)/2>V.getTextWidth(x,_)?\"#fff\":m.reverse(i)):d=\"left\"===b.position?\"right\":\"left\";var W={zlevel:p.zlevel,z:p.z+1,style:{x:this._getLabelPoint(b.position,a,u,r,s,k,U),y:o+l/2,color:f.color||L,text:x,textAlign:f.align||d,textBaseline:f.baseline||\"middle\",textFont:_}};return g=\"emphasis\",b=y[g].label||b,f=b.textStyle||f,k=y[g].labelLine.length||k,b.position=b.position||y.normal.label.position,x=this.getLabelText(e,t,g),_=this.getFont(f),L=i,\"inner\"===b.position||\"inside\"===b.position||\"center\"===b.position?(d=U,L=Math.max(r,s)/2>V.getTextWidth(x,_)?\"#fff\":m.reverse(i)):d=\"left\"===b.position?\"right\":\"left\",W.highlightStyle={x:this._getLabelPoint(b.position,a,u,r,s,k,U),color:f.color||L,text:x,textAlign:f.align||d,textFont:_,brushType:\"fill\"},new n(W)},getLabelText:function(e,t,i){var n=this.series,a=n[e],o=a.data[t],r=this.deepQuery([o,a],\"itemStyle.\"+i+\".label.formatter\");return r?\"function\"==typeof r?r.call(this.myChart,{seriesIndex:e,seriesName:a.name||\"\",series:a,dataIndex:t,data:o,name:o.name,value:o.value}):\"string\"==typeof r?r=r.replace(\"{a}\",\"{a0}\").replace(\"{b}\",\"{b0}\").replace(\"{c}\",\"{c0}\").replace(\"{a0}\",a.name).replace(\"{b0}\",o.name).replace(\"{c0}\",o.value):void 0:o.name},getLabelLine:function(e,t,i,n,o,r,s,l,m){var V=this.series[e],U=V.data[t],d=this._paramsMap[e].location,p=h.merge(h.clone(U.itemStyle)||{},V.itemStyle),c=\"normal\",u=p[c].labelLine,y=p[c].labelLine.length,g=u.lineStyle||{},b=p[c].label;b.position=b.position||p.normal.label.position;var f={zlevel:V.zlevel,z:V.z+1,hoverable:!1,style:{xStart:this._getLabelLineStartPoint(n,d,r,s,m),yStart:o+l/2,xEnd:this._getLabelPoint(b.position,n,d,r,s,y,m),yEnd:o+l/2,strokeColor:g.color||i,lineType:g.type,lineWidth:g.width}};return c=\"emphasis\",u=p[c].labelLine||u,y=p[c].labelLine.length||y,g=u.lineStyle||g,b=p[c].label||b,b.position=b.position,f.highlightStyle={xEnd:this._getLabelPoint(b.position,n,d,r,s,y,m),strokeColor:g.color||i,lineType:g.type,lineWidth:g.width},new a(f)},_getLabelPoint:function(e,t,i,n,a,o,r){switch(e=\"inner\"===e||\"inside\"===e?\"center\":e){case\"center\":return\"center\"==r?t+n/2:\"left\"==r?t+10:t+n-10;case\"left\":return\"auto\"===o?i.x-10:\"center\"==r?i.centerX-Math.max(n,a)/2-o:\"right\"==r?t-(a>n?a-n:0)-o:i.x-o;default:return\"auto\"===o?i.x+i.width+10:\"center\"==r?i.centerX+Math.max(n,a)/2+o:\"right\"==r?i.x+i.width+o:t+Math.max(n,a)+o}},_getLabelLineStartPoint:function(e,t,i,n,a){return\"center\"==a?t.centerX:n>i?e+Math.min(i,n)/2:e+Math.max(i,n)/2},_needLabel:function(e,t,i){return this.deepQuery([t,e],\"itemStyle.\"+(i?\"emphasis\":\"normal\")+\".label.show\")},_needLabelLine:function(e,t,i){return this.deepQuery([t,e],\"itemStyle.\"+(i?\"emphasis\":\"normal\")+\".labelLine.show\")},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()}},h.inherits(t,i),e(\"../chart\").define(\"funnel\",t),t}),i(\"echarts/chart/eventRiver\",[\"require\",\"./base\",\"../layout/eventRiver\",\"zrender/shape/Polygon\",\"../component/axis\",\"../component/grid\",\"../component/dataZoom\",\"../config\",\"../util/ecData\",\"../util/date\",\"zrender/tool/util\",\"zrender/tool/color\",\"../chart\"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o);var r=this;r._ondragend=function(){r.isDragend=!0},this.refresh(a)}var i=e(\"./base\"),n=e(\"../layout/eventRiver\"),a=e(\"zrender/shape/Polygon\");e(\"../component/axis\"),e(\"../component/grid\"),e(\"../component/dataZoom\");var o=e(\"../config\");o.eventRiver={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,itemStyle:{normal:{borderColor:\"rgba(0,0,0,0)\",borderWidth:1,label:{show:!0,position:\"inside\",formatter:\"{b}\"}},emphasis:{borderColor:\"rgba(0,0,0,0)\",borderWidth:1,label:{show:!0}}}};var r=e(\"../util/ecData\"),s=e(\"../util/date\"),l=e(\"zrender/tool/util\"),h=e(\"zrender/tool/color\");return t.prototype={type:o.CHART_TYPE_EVENTRIVER,_buildShape:function(){var e=this.series;this.selectedMap={},this._dataPreprocessing();for(var t=this.component.legend,i=[],a=0;a<e.length;a++)if(e[a].type===this.type){e[a]=this.reformOption(e[a]),this.legendHoverLink=e[a].legendHoverLink||this.legendHoverLink;var o=e[a].name||\"\";if(this.selectedMap[o]=t?t.isSelected(o):!0,!this.selectedMap[o])continue;this.buildMark(a),i.push(this.series[a])}n(i,this._intervalX,this.component.grid.getArea()),this._drawEventRiver(),this.addShapeList()},_dataPreprocessing:function(){for(var e,t,i=this.series,n=0,a=i.length;a>n;n++)if(i[n].type===this.type){e=this.component.xAxis.getAxis(i[n].xAxisIndex||0);for(var o=0,r=i[n].data.length;r>o;o++){t=i[n].data[o].evolution;for(var l=0,h=t.length;h>l;l++)t[l].timeScale=e.getCoord(s.getNewDate(t[l].time)-0),t[l].valueScale=Math.pow(t[l].value,.8)}}this._intervalX=Math.round(this.component.grid.getWidth()/40)},_drawEventRiver:function(){for(var e=this.series,t=0;t<e.length;t++){var i=e[t].name||\"\";if(e[t].type===this.type&&this.selectedMap[i])for(var n=0;n<e[t].data.length;n++)this._drawEventBubble(e[t].data[n],t,n)}},_drawEventBubble:function(e,t,i){var n=this.series,o=n[t],s=o.name||\"\",l=o.data[i],m=[l,o],V=this.component.legend,U=V?V.getColor(s):this.zr.getColor(t),d=this.deepMerge(m,\"itemStyle.normal\")||{},p=this.deepMerge(m,\"itemStyle.emphasis\")||{},c=this.getItemStyleColor(d.color,t,i,l)||U,u=this.getItemStyleColor(p.color,t,i,l)||(\"string\"==typeof c?h.lift(c,-.2):c),y=this._calculateControlPoints(e),g={zlevel:o.zlevel,z:o.z,clickable:this.deepQuery(m,\"clickable\"),style:{pointList:y,smooth:\"spline\",brushType:\"both\",lineJoin:\"round\",color:c,lineWidth:d.borderWidth,strokeColor:d.borderColor},highlightStyle:{color:u,lineWidth:p.borderWidth,strokeColor:p.borderColor},draggable:\"vertical\",ondragend:this._ondragend};g=new a(g),this.addLabel(g,o,l,e.name),r.pack(g,n[t],t,n[t].data[i],i,n[t].data[i].name),this.shapeList.push(g)},_calculateControlPoints:function(e){var t=this._intervalX,i=e.y,n=e.evolution,a=n.length;if(!(1>a)){for(var o=[],r=[],s=0;a>s;s++)o.push(n[s].timeScale),r.push(n[s].valueScale);var l=[];l.push([o[0],i]);var s=0;for(s=0;a-1>s;s++)l.push([(o[s]+o[s+1])/2,r[s]/-2+i]);for(l.push([(o[s]+(o[s]+t))/2,r[s]/-2+i]),l.push([o[s]+t,i]),l.push([(o[s]+(o[s]+t))/2,r[s]/2+i]),s=a-1;s>0;s--)l.push([(o[s]+o[s-1])/2,r[s-1]/2+i]);return l}},ondragend:function(e,t){this.isDragend&&e.target&&(t.dragOut=!0,t.dragIn=!0,t.needRefresh=!1,this.isDragend=!1)},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()}},l.inherits(t,i),e(\"../chart\").define(\"eventRiver\",t),t}),i(\"echarts/layout/eventRiver\",[\"require\"],function(){function e(e,i,o){function r(e,t){var i=e.importance,n=t.importance;return i>n?-1:n>i?1:0}for(var s=4,l=0;l<e.length;l++){for(var h=0;h<e[l].data.length;h++){null==e[l].data[h].weight&&(e[l].data[h].weight=1);for(var m=0,V=0;V<e[l].data[h].evolution.length;V++)m+=e[l].data[h].evolution[V].valueScale;e[l].data[h].importance=m*e[l].data[h].weight}e[l].data.sort(r)}for(var l=0;l<e.length;l++){null==e[l].weight&&(e[l].weight=1);for(var m=0,h=0;h<e[l].data.length;h++)m+=e[l].data[h].weight;e[l].importance=m*e[l].weight}e.sort(r);for(var U=Number.MAX_VALUE,d=0,l=0;l<e.length;l++)for(var h=0;h<e[l].data.length;h++)for(var V=0;V<e[l].data[h].evolution.length;V++){var p=e[l].data[h].evolution[V].timeScale;U=Math.min(U,p),d=Math.max(d,p)}U=~~U,d=~~d;for(var c=function(){var e=d-U+1+~~i;if(0>=e)return[0];for(var t=[];e--;)t.push(0);return t}(),u=c.slice(0),y=[],g=0,b=0,l=0;l<e.length;l++)for(var h=0;h<e[l].data.length;h++){var f=e[l].data[h];f.time=[],f.value=[];for(var k,x=0,V=0;V<e[l].data[h].evolution.length;V++)k=e[l].data[h].evolution[V],f.time.push(k.timeScale),f.value.push(k.valueScale),x=Math.max(x,k.valueScale);n(f,i,U),f.y=a(u,f,function(e,t){return e.ypx[t]}),f._offset=a(c,f,function(){return s}),g=Math.max(g,f.y+x),b=Math.max(b,f._offset),y.push(f)}t(y,o,g,b)}function t(e,t,i,n){for(var a=t.height,o=n/a>.5?.5:1,r=t.y,s=(t.height-n)/i,l=0,h=e.length;h>l;l++){var m=e[l];m.y=r+s*m.y+m._offset*o,delete m.time,delete m.value,delete m.xpx,delete m.ypx,delete m._offset;for(var V=m.evolution,U=0,d=V.length;d>U;U++)V[U].valueScale*=s}}function i(e,t,i,n){if(e===i)throw new Error(\"x0 is equal with x1!!!\");if(t===n)return function(){return t};var a=(t-n)/(e-i),o=(n*e-t*i)/(e-i);return function(e){return a*e+o}}function n(e,t,n){var a=~~t,o=e.time.length;e.xpx=[],e.ypx=[];for(var r,s=0,l=0,h=0,m=0,V=0;o>s;s++){l=~~e.time[s],m=e.value[s]/2,s===o-1?(h=l+a,V=0):(h=~~e.time[s+1],V=e.value[s+1]/2),r=i(l,m,h,V);for(var U=l;h>U;U++)e.xpx.push(U-n),e.ypx.push(r(U))}e.xpx.push(h-n),e.ypx.push(V)}function a(e,t,i){for(var n,a=0,o=t.xpx.length,r=0;o>r;r++)n=i(t,r),a=Math.max(a,n+e[t.xpx[r]]);for(r=0;o>r;r++)n=i(t,r),e[t.xpx[r]]=a+n;return a}return e}),i(\"echarts/chart/venn\",[\"require\",\"./base\",\"zrender/shape/Text\",\"zrender/shape/Circle\",\"zrender/shape/Path\",\"../config\",\"../util/ecData\",\"zrender/tool/util\",\"../chart\"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e(\"./base\"),n=e(\"zrender/shape/Text\"),a=e(\"zrender/shape/Circle\"),o=e(\"zrender/shape/Path\"),r=e(\"../config\");r.venn={zlevel:0,z:1,calculable:!1};var s=e(\"../util/ecData\"),l=e(\"zrender/tool/util\");return t.prototype={type:r.CHART_TYPE_VENN,_buildShape:function(){this.selectedMap={},this._symbol=this.option.symbolList,this._queryTarget,this._dropBoxList=[],this._vennDataCounter=0;for(var e=this.series,t=this.component.legend,i=0;i<e.length;i++)if(e[i].type===r.CHART_TYPE_VENN){e[i]=this.reformOption(e[i]);var n=e[i].name||\"\";if(this.selectedMap[n]=t?t.isSelected(n):!0,!this.selectedMap[n])continue;this._buildVenn(i)}this.addShapeList()},_buildVenn:function(e){var t,i,n=this.series[e],a=n.data;a[0].value>a[1].value?(t=this.zr.getHeight()/3,i=t*Math.sqrt(a[1].value)/Math.sqrt(a[0].value)):(i=this.zr.getHeight()/3,t=i*Math.sqrt(a[0].value)/Math.sqrt(a[1].value));var o=this.zr.getWidth()/2-t,r=(t+i)/2*Math.sqrt(a[2].value)/Math.sqrt((a[0].value+a[1].value)/2),s=t+i;0!==a[2].value&&(s=this._getCoincideLength(a[0].value,a[1].value,a[2].value,t,i,r,Math.abs(t-i),t+i));var l=o+s,h=this.zr.getHeight()/2;if(this._buildItem(e,0,a[0],o,h,t),this._buildItem(e,1,a[1],l,h,i),0!==a[2].value&&a[2].value!==a[0].value&&a[2].value!==a[1].value){var m=(t*t-i*i)/(2*s)+s/2,V=s/2-(t*t-i*i)/(2*s),U=Math.sqrt(t*t-m*m),d=0,p=0;a[0].value>a[1].value&&o+m>l&&(p=1),a[0].value<a[1].value&&o+V>l&&(d=1),this._buildCoincideItem(e,2,a[2],o+m,h-U,h+U,t,i,d,p)}},_getCoincideLength:function(e,t,i,n,a,o,r,s){var l=(n*n-a*a)/(2*o)+o/2,h=o/2-(n*n-a*a)/(2*o),m=Math.acos(l/n),V=Math.acos(h/a),U=n*n*Math.PI,d=m*n*n-l*n*Math.sin(m)+V*a*a-h*a*Math.sin(V),p=d/U,c=i/e,u=Math.abs(p/c);return u>.999&&1.001>u?o:.999>=u?(s=o,o=(o+r)/2,this._getCoincideLength(e,t,i,n,a,o,r,s)):(r=o,o=(o+s)/2,this._getCoincideLength(e,t,i,n,a,o,r,s))},_buildItem:function(e,t,i,n,a,o){var r=this.series,l=r[e],h=this.getCircle(e,t,i,n,a,o);if(s.pack(h,l,e,i,t,i.name),this.shapeList.push(h),l.itemStyle.normal.label.show){var m=this.getLabel(e,t,i,n,a,o);s.pack(m,l,e,l.data[t],t,l.data[t].name),this.shapeList.push(m)}},_buildCoincideItem:function(e,t,i,n,a,r,l,h,m,V){var U=this.series,d=U[e],p=[i,d],c=this.deepMerge(p,\"itemStyle.normal\")||{},u=this.deepMerge(p,\"itemStyle.emphasis\")||{},y=c.color||this.zr.getColor(t),g=u.color||this.zr.getColor(t),b=\"M\"+n+\",\"+a+\"A\"+l+\",\"+l+\",0,\"+m+\",1,\"+n+\",\"+r+\"A\"+h+\",\"+h+\",0,\"+V+\",1,\"+n+\",\"+a,f={color:y,path:b},k={zlevel:d.zlevel,z:d.z,style:f,highlightStyle:{color:g,lineWidth:u.borderWidth,strokeColor:u.borderColor}};k=new o(k),k.buildPathArray&&(k.style.pathArray=k.buildPathArray(f.path)),s.pack(k,U[e],0,i,t,i.name),this.shapeList.push(k)},getCircle:function(e,t,i,n,o,r){var s=this.series[e],l=[i,s],h=this.deepMerge(l,\"itemStyle.normal\")||{},m=this.deepMerge(l,\"itemStyle.emphasis\")||{},V=h.color||this.zr.getColor(t),U=m.color||this.zr.getColor(t),d={zlevel:s.zlevel,z:s.z,clickable:!0,style:{x:n,y:o,r:r,brushType:\"fill\",opacity:1,color:V},highlightStyle:{color:U,lineWidth:m.borderWidth,strokeColor:m.borderColor}};return this.deepQuery([i,s,this.option],\"calculable\")&&(this.setCalculable(d),d.draggable=!0),new a(d)},getLabel:function(e,t,i,a,o,r){var s=this.series[e],l=s.itemStyle,h=[i,s],m=this.deepMerge(h,\"itemStyle.normal\")||{},V=\"normal\",U=l[V].label,d=U.textStyle||{},p=this.getLabelText(t,i,V),c=this.getFont(d),u=m.color||this.zr.getColor(t),y=d.fontSize||12,g={zlevel:s.zlevel,z:s.z,style:{x:a,y:o-r-y,color:d.color||u,text:p,textFont:c,textAlign:\"center\"}};return new n(g)},getLabelText:function(e,t,i){var n=this.series,a=n[0],o=this.deepQuery([t,a],\"itemStyle.\"+i+\".label.formatter\");return o?\"function\"==typeof o?o(a.name,t.name,t.value):\"string\"==typeof o?(o=o.replace(\"{a}\",\"{a0}\").replace(\"{b}\",\"{b0}\").replace(\"{c}\",\"{c0}\"),o=o.replace(\"{a0}\",a.name).replace(\"{b0}\",t.name).replace(\"{c0}\",t.value)):void 0:t.name},refresh:function(e){e&&(this.option=e,this.series=e.series),this._buildShape()}},l.inherits(t,i),e(\"../chart\").define(\"venn\",t),t}),i(\"echarts/chart/treemap\",[\"require\",\"./base\",\"zrender/tool/area\",\"zrender/shape/Rectangle\",\"zrender/shape/Text\",\"zrender/shape/Line\",\"../layout/TreeMap\",\"../data/Tree\",\"../config\",\"../util/ecData\",\"zrender/config\",\"zrender/tool/event\",\"zrender/tool/util\",\"zrender/tool/color\",\"../chart\"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a);var r=this;r._onclick=function(e){return r.__onclick(e)},r.zr.on(V.EVENT.CLICK,r._onclick)}var i=e(\"./base\"),n=e(\"zrender/tool/area\"),a=e(\"zrender/shape/Rectangle\"),o=e(\"zrender/shape/Text\"),r=e(\"zrender/shape/Line\"),s=e(\"../layout/TreeMap\"),l=e(\"../data/Tree\"),h=e(\"../config\");h.treemap={zlevel:0,z:1,calculable:!1,clickable:!0,center:[\"50%\",\"50%\"],size:[\"80%\",\"80%\"],root:\"\",itemStyle:{normal:{label:{\nshow:!0,x:5,y:12,textStyle:{align:\"left\",color:\"#000\",fontFamily:\"Arial\",fontSize:13,fontStyle:\"normal\",fontWeight:\"normal\"}},breadcrumb:{show:!0,textStyle:{}},borderWidth:1,borderColor:\"#ccc\",childBorderWidth:1,childBorderColor:\"#ccc\"},emphasis:{}}};var m=e(\"../util/ecData\"),V=e(\"zrender/config\"),U=(e(\"zrender/tool/event\"),e(\"zrender/tool/util\")),d=e(\"zrender/tool/color\");return t.prototype={type:h.CHART_TYPE_TREEMAP,refresh:function(e){this.clear(),e&&(this.option=e,this.series=this.option.series),this._treesMap={};for(var t=this.series,i=this.component.legend,n=0;n<t.length;n++)if(t[n].type===h.CHART_TYPE_TREEMAP){t[n]=this.reformOption(t[n]);var a=t[n].name||\"\";if(this.selectedMap[a]=i?i.isSelected(a):!0,!this.selectedMap[a])continue;this._buildSeries(t[n],n)}},_buildSeries:function(e,t){var i=l.fromOptionData(e.name,e.data);this._treesMap[t]=i;var n=e.root&&i.getNodeById(e.root)||i.root;this._buildTreemap(n,t)},_buildTreemap:function(e,t){for(var i=this.shapeList,n=0;n<i.length;){var a=i[n];m.get(a,\"seriesIndex\")===t?(this.zr.delShape(i[n]),i.splice(n,1)):n++}for(var o=i.length,r=this.series[t],l=r.itemStyle,h=this.parsePercent(r.size[0],this.zr.getWidth())||400,V=this.parsePercent(r.size[1],this.zr.getHeight())||500,U=this.parseCenter(this.zr,r.center),d=U[0]-.5*h,p=U[1]-.5*V,c=h*V,u=0,y=[],g=e.children,n=0;n<g.length;n++)u+=g[n].data.value;for(var b=0;b<g.length;b++)y.push(g[b].data.value*c/u);for(var f=new s({x:d,y:p,width:h,height:V}),k=f.run(y),x=0;x<k.length;x++){var _=g[x].data,L=k[x],W=[_.itemStyle,l],X=this.deepMerge(W);X.normal.color||(X.normal.color=this.zr.getColor(x)),X.emphasis.color||(X.emphasis.color=X.normal.color),this._buildItem(_,X,L,t,x),_.children&&this._buildChildrenTreemap(_.children,X,L,t)}this.query(r,\"itemStyle.normal.breadcrumb.show\")&&this._buildBreadcrumb(e,t,d,p+V);for(var n=o;n<i.length;n++)this.zr.addShape(i[n])},_buildItem:function(e,t,i,n,a){var o=this.series,r=this.getRectangle(e,t,i);m.pack(r,o[n],n,e,a,e.name),this.shapeList.push(r)},getRectangle:function(e,t,i){var n=t.emphasis,o=t.normal,r=this.getLabel(t,i,e.name,e.value),s=this.option.hoverable,l={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:s,clickable:!0,style:U.merge({x:i.x,y:i.y,width:i.width,height:i.height,brushType:\"both\",color:o.color,lineWidth:o.borderWidth,strokeColor:o.borderColor},r.style,!0),highlightStyle:U.merge({color:n.color,lineWidth:n.borderWidth,strokeColor:n.borderColor},r.highlightStyle,!0)};return new a(l)},getLabel:function(e,t,i,a){var o=e.normal.label.textStyle,r=[e.emphasis.label.textStyle,o],s=this.deepMerge(r),l=e.normal.label.formatter,h=this.getLabelText(i,a,l),m=this.getFont(o),V=n.getTextWidth(h,m),U=n.getTextHeight(h,m),d=this.deepQuery([e.emphasis,e.normal],\"label.formatter\"),p=this.getLabelText(i,a,d),c=this.getFont(s),u=n.getTextWidth(h,c),y=n.getTextHeight(h,c);e.normal.label.show?(e.normal.label.x+V>t.width||e.normal.label.y+U>t.height)&&(h=\"\"):h=\"\",e.emphasis.label.show?(s.x+u>t.width||s.y+y>t.height)&&(p=\"\"):p=\"\";var g={style:{textX:t.x+e.normal.label.x,textY:t.y+e.normal.label.y,text:h,textPosition:\"specific\",textColor:o.color,textFont:m},highlightStyle:{textX:t.x+e.emphasis.label.x,textY:t.y+e.emphasis.label.y,text:p,textColor:s.color,textPosition:\"specific\"}};return g},getLabelText:function(e,t,i){return i?\"function\"==typeof i?i.call(this.myChart,e,t):\"string\"==typeof i?(i=i.replace(\"{b}\",\"{b0}\").replace(\"{c}\",\"{c0}\"),i=i.replace(\"{b0}\",e).replace(\"{c0}\",t)):void 0:e},_buildChildrenTreemap:function(e,t,i,n){for(var a=i.width*i.height,o=0,r=[],l=0;l<e.length;l++)o+=e[l].value;for(var h=0;h<e.length;h++)r.push(e[h].value*a/o);for(var V=new s({x:i.x,y:i.y,width:i.width,height:i.height}),U=V.run(r),d=t.normal.childBorderWidth,p=t.normal.childBorderColor,c=0;c<U.length;c++){var u=U[c],y=[];i.y.toFixed(2)!==u.y.toFixed(2)&&y.push(this._getLine(u.x,u.y,u.x+u.width,u.y,d,p)),i.x.toFixed(2)!==u.x.toFixed(2)&&y.push(this._getLine(u.x,u.y,u.x,u.y+u.height,d,p)),(i.y+i.height).toFixed(2)!==(u.y+u.height).toFixed(2)&&y.push(this._getLine(u.x,u.y+u.height,u.x+u.width,u.y+u.height,d,p)),(i.x+i.width).toFixed(2)!==(u.x+u.width).toFixed(2)&&y.push(this._getLine(u.x+u.width,u.y,u.x+u.width,u.y+u.height,d,p));for(var g=0;g<y.length;g++)m.set(y[g],\"seriesIndex\",n),this.shapeList.push(y[g])}},_getLine:function(e,t,i,n,a,o){var s={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:e,yStart:t,xEnd:i,yEnd:n,lineWidth:a,strokeColor:o}};return new r(s)},_buildBreadcrumb:function(e,t,i,n){for(var a=[],r=e;r;)a.unshift(r.data.name),r=r.parent;for(var s=this.series[t],l=this.query(s,\"itemStyle.normal.breadcrumb.textStyle\")||{},h=this.query(s,\"itemStyle.emphasis.breadcrumb.textStyle\")||{},V={y:n+10,textBaseline:\"top\",textAlign:\"left\",color:l.color,textFont:this.getFont(l)},p={brushType:\"fill\",color:h.color||d.lift(l.color,-.3),textFont:this.getFont(h)},c=0;c<a.length;c++){var u=new o({zlevel:this.getZlevelBase(),z:this.getZBase(),style:U.merge({x:i,text:a[c]+(a.length-1-c?\" > \":\"\")},V),clickable:!0,highlightStyle:p});m.set(u,\"seriesIndex\",t),m.set(u,\"name\",a[c]),i+=u.getRect(u.style).width,this.shapeList.push(u)}},__onclick:function(e){var t=e.target;if(t){var i=m.get(t,\"seriesIndex\"),n=m.get(t,\"name\"),a=this._treesMap[i],o=a.getNodeById(n);o&&o.children.length&&this._buildTreemap(o,i)}}},U.inherits(t,i),e(\"../chart\").define(\"treemap\",t),t}),i(\"echarts/layout/TreeMap\",[\"require\"],function(){function e(e){({x:e.x,y:e.y,width:e.width,height:e.height});this.x=e.x,this.y=e.y,this.width=e.width,this.height=e.height}return e.prototype.run=function(e){var t=[];return this._squarify(e,{x:this.x,y:this.y,width:this.width,height:this.height},t),t},e.prototype._squarify=function(e,t,i){var n=\"VERTICAL\",a=t.width,o=t.height;t.width<t.height&&(n=\"HORIZONTAL\",a=t.height,o=t.width);for(var r=this._getShapeListInAbstractRow(e,a,o),s=0;s<r.length;s++){r[s].x=0,r[s].y=0;for(var l=0;s>l;l++)r[s].y+=r[l].height}var h={};if(\"VERTICAL\"==n){for(var m=0;m<r.length;m++)i.push({x:r[m].x+t.x,y:r[m].y+t.y,width:r[m].width,height:r[m].height});h={x:r[0].width+t.x,y:t.y,width:t.width-r[0].width,height:t.height}}else{for(var V=0;V<r.length;V++)i.push({x:r[V].y+t.x,y:r[V].x+t.y,width:r[V].height,height:r[V].width});h={x:t.x,y:t.y+r[0].width,width:t.width,height:t.height-r[0].width}}var U=e.slice(r.length);0!==U.length&&this._squarify(U,h,i)},e.prototype._getShapeListInAbstractRow=function(e,t,i){if(1===e.length)return[{width:t,height:i}];for(var n=1;n<e.length;n++){var a=this._placeFixedNumberRectangles(e.slice(0,n),t,i),o=this._placeFixedNumberRectangles(e.slice(0,n+1),t,i);if(this._isFirstBetter(a,o))return a}},e.prototype._placeFixedNumberRectangles=function(e,t,i){for(var n=e.length,a=[],o=0,r=0;r<e.length;r++)o+=e[r];for(var s=o/i,l=0;n>l;l++){var h=i*e[l]/o;a.push({width:s,height:h})}return a},e.prototype._isFirstBetter=function(e,t){var i=e[0].height/e[0].width;i=i>1?1/i:i;var n=t[0].height/t[0].width;return n=n>1?1/n:n,Math.abs(i-1)<=Math.abs(n-1)?!0:!1},e}),i(\"echarts/data/Tree\",[\"require\",\"zrender/tool/util\"],function(e){function t(e,t){this.id=e,this.depth=0,this.height=0,this.children=[],this.parent=null,this.data=t||null}function i(e){this.root=new t(e)}var n=e(\"zrender/tool/util\");return t.prototype.add=function(e){var t=this.children;e.parent!==this&&(t.push(e),e.parent=this)},t.prototype.remove=function(e){var t=this.children,i=n.indexOf(t,e);i>=0&&(t.splice(i,1),e.parent=null)},t.prototype.traverse=function(e,t){e.call(t,this);for(var i=0;i<this.children.length;i++)this.children[i].traverse(e,t)},t.prototype.updateDepthAndHeight=function(e){var t=0;this.depth=e;for(var i=0;i<this.children.length;i++){var n=this.children[i];n.updateDepthAndHeight(e+1),n.height>t&&(t=n.height)}this.height=t+1},t.prototype.getNodeById=function(e){if(this.id===e)return this;for(var t=0;t<this.children.length;t++){var i=this.children[t].getNodeById(e);if(i)return i}},i.prototype.traverse=function(e,t){this.root.traverse(e,t)},i.prototype.getSubTree=function(e){var t=this.getNodeById(e);if(t){var n=new i(t.id);return n.root=t,n}},i.prototype.getNodeById=function(e){return this.root.getNodeById(e)},i.fromOptionData=function(e,n){function a(e,i){var n=new t(e.name,e);i.add(n);var o=e.children;if(o)for(var r=0;r<o.length;r++)a(o[r],n)}var o=new i(e),r=o.root;r.data={name:e,children:n};for(var s=0;s<n.length;s++)a(n[s],r);return o.root.updateDepthAndHeight(0),o},i.fromGraph=function(e){function n(t){for(var i=e.getNodeById(t.id),a=0;a<i.outEdges.length;a++){var r=i.outEdges[a],s=o[r.node2.id];t.children.push(s),n(s)}}for(var a={},o={},r=0;r<e.nodes.length;r++){var s,l=e.nodes[r];0===l.inDegree()?(a[l.id]=new i(l.id),s=a[l.id].root):s=new t(l.id),s.data=l.data,o[l.id]=s}var h=[];for(var m in a)n(a[m].root),a[m].root.updateDepthAndHeight(0),h.push(a[m]);return h},i}),i(\"echarts/chart/tree\",[\"require\",\"./base\",\"../util/shape/Icon\",\"zrender/shape/Image\",\"zrender/shape/Line\",\"zrender/shape/BezierCurve\",\"../layout/Tree\",\"../data/Tree\",\"../config\",\"../util/ecData\",\"zrender/config\",\"zrender/tool/event\",\"zrender/tool/util\",\"../chart\"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e(\"./base\"),n=.618,a=e(\"../util/shape/Icon\"),o=e(\"zrender/shape/Image\"),r=e(\"zrender/shape/Line\"),s=e(\"zrender/shape/BezierCurve\"),l=e(\"../layout/Tree\"),h=e(\"../data/Tree\"),m=e(\"../config\");m.tree={zlevel:1,z:2,calculable:!1,clickable:!0,rootLocation:{},orient:\"vertical\",symbol:\"circle\",symbolSize:20,nodePadding:30,layerPadding:100,itemStyle:{normal:{label:{show:!0},lineStyle:{width:1,color:\"#777\",type:\"curve\"}},emphasis:{}}};var V=e(\"../util/ecData\"),U=(e(\"zrender/config\"),e(\"zrender/tool/event\"),e(\"zrender/tool/util\"));return t.prototype={type:m.CHART_TYPE_TREE,_buildShape:function(e,t){var i=e.data[0];this.tree=h.fromOptionData(i.name,i.children),this.tree.root.data=i,this._setTreeShape(e),this.tree.traverse(function(i){this._buildItem(i,e,t),i.children.length>0&&this._buildLink(i,e)},this);var n=e.roam===!0||\"move\"===e.roam,a=e.roam===!0||\"scale\"===e.roam;this.zr.modLayer(this.getZlevelBase(),{panable:n,zoomable:a}),(this.query(\"markPoint.effect.show\")||this.query(\"markLine.effect.show\"))&&this.zr.modLayer(m.EFFECT_ZLEVEL,{panable:n,zoomable:a}),this.addShapeList()},_buildItem:function(e,t,i){var n=[e.data,t],r=this.deepQuery(n,\"symbol\"),s=this.deepMerge(n,\"itemStyle.normal\")||{},l=this.deepMerge(n,\"itemStyle.emphasis\")||{},h=s.color||this.zr.getColor(),m=l.color||this.zr.getColor(),U=-e.layout.angle||0;e.id===this.tree.root.id&&(U=0);var d=\"right\";Math.abs(U)>=Math.PI/2&&Math.abs(U)<3*Math.PI/2&&(U+=Math.PI,d=\"left\");var p=[U,e.layout.position[0],e.layout.position[1]],c=new a({zlevel:this.getZlevelBase(),z:this.getZBase()+1,rotation:p,clickable:this.deepQuery(n,\"clickable\"),style:{x:e.layout.position[0]-.5*e.layout.width,y:e.layout.position[1]-.5*e.layout.height,width:e.layout.width,height:e.layout.height,iconType:r,color:h,brushType:\"both\",lineWidth:s.borderWidth,strokeColor:s.borderColor},highlightStyle:{color:m,lineWidth:l.borderWidth,strokeColor:l.borderColor}});c.style.iconType.match(\"image\")&&(c.style.image=c.style.iconType.replace(new RegExp(\"^image:\\\\/\\\\/\"),\"\"),c=new o({rotation:p,style:c.style,highlightStyle:c.highlightStyle,clickable:c.clickable,zlevel:this.getZlevelBase(),z:this.getZBase()})),this.deepQuery(n,\"itemStyle.normal.label.show\")&&(c.style.text=null==e.data.label?e.id:e.data.label,c.style.textPosition=this.deepQuery(n,\"itemStyle.normal.label.position\"),\"radial\"===t.orient&&\"inside\"!==c.style.textPosition&&(c.style.textPosition=d),c.style.textColor=this.deepQuery(n,\"itemStyle.normal.label.textStyle.color\"),c.style.textFont=this.getFont(this.deepQuery(n,\"itemStyle.normal.label.textStyle\")||{})),this.deepQuery(n,\"itemStyle.emphasis.label.show\")&&(c.highlightStyle.textPosition=this.deepQuery(n,\"itemStyle.emphasis.label.position\"),c.highlightStyle.textColor=this.deepQuery(n,\"itemStyle.emphasis.label.textStyle.color\"),c.highlightStyle.textFont=this.getFont(this.deepQuery(n,\"itemStyle.emphasis.label.textStyle\")||{})),V.pack(c,t,i,e.data,0,e.id),this.shapeList.push(c)},_buildLink:function(e,t){var i=t.itemStyle.normal.lineStyle;if(\"broken\"===i.type)return void this._buildBrokenLine(e,i,t);for(var n=0;n<e.children.length;n++){var a=e.layout.position[0],o=e.layout.position[1],r=e.children[n].layout.position[0],s=e.children[n].layout.position[1];switch(i.type){case\"curve\":this._buildBezierCurve(e,e.children[n],i,t);break;case\"broken\":break;default:var l=this._getLine(a,o,r,s,i);this.shapeList.push(l)}}},_buildBrokenLine:function(e,t,i){var a=U.clone(t);a.type=\"solid\";var o=[],r=e.layout.position[0],s=e.layout.position[1],l=i.orient,h=e.children[0].layout.position[1],m=r,V=s+(h-s)*(1-n),d=e.children[0].layout.position[0],p=V,c=e.children[e.children.length-1].layout.position[0],u=V;if(\"horizontal\"===l){var y=e.children[0].layout.position[0];m=r+(y-r)*(1-n),V=s,d=m,p=e.children[0].layout.position[1],c=m,u=e.children[e.children.length-1].layout.position[1]}o.push(this._getLine(r,s,m,V,a)),o.push(this._getLine(d,p,c,u,a));for(var g=0;g<e.children.length;g++)y=e.children[g].layout.position[0],h=e.children[g].layout.position[1],\"horizontal\"===l?p=h:d=y,o.push(this._getLine(d,p,y,h,a));this.shapeList=this.shapeList.concat(o)},_getLine:function(e,t,i,n,a){return e===i&&(e=i=this.subPixelOptimize(e,a.width)),t===n&&(t=n=this.subPixelOptimize(t,a.width)),new r({zlevel:this.getZlevelBase(),hoverable:!1,style:U.merge({xStart:e,yStart:t,xEnd:i,yEnd:n,lineType:a.type,strokeColor:a.color,lineWidth:a.width},a,!0)})},_buildBezierCurve:function(e,t,i,a){var o=n,r=a.orient,l=e.layout.position[0],h=e.layout.position[1],m=t.layout.position[0],V=t.layout.position[1],d=l,p=(V-h)*o+h,c=m,u=(V-h)*(1-o)+h;if(\"horizontal\"===r)d=(m-l)*o+l,p=h,c=(m-l)*(1-o)+l,u=V;else if(\"radial\"===r)if(e.id===this.tree.root.id)d=(m-l)*o+l,p=(V-h)*o+h,c=(m-l)*(1-o)+l,u=(V-h)*(1-o)+h;else{var y=e.layout.originPosition[0],g=e.layout.originPosition[1],b=t.layout.originPosition[0],f=t.layout.originPosition[1],k=this.tree.root.layout.position[0],x=this.tree.root.layout.position[1];d=y,p=(f-g)*o+g,c=b,u=(f-g)*(1-o)+g;var _=(d-this.minX)/this.width*Math.PI*2;d=p*Math.cos(_)+k,p=p*Math.sin(_)+x,_=(c-this.minX)/this.width*Math.PI*2,c=u*Math.cos(_)+k,u=u*Math.sin(_)+x}var L=new s({zlevel:this.getZlevelBase(),hoverable:!1,style:U.merge({xStart:l,yStart:h,cpX1:d,cpY1:p,cpX2:c,cpY2:u,xEnd:m,yEnd:V,strokeColor:i.color,lineWidth:i.width},i,!0)});this.shapeList.push(L)},_setTreeShape:function(e){var t=new l({nodePadding:e.nodePadding,layerPadding:e.layerPadding});this.tree.traverse(function(t){var i=[t.data,e],n=this.deepQuery(i,\"symbolSize\");\"number\"==typeof n&&(n=[n,n]),t.layout={width:n[0],height:n[1]}},this),t.run(this.tree);var i=e.orient,n=e.rootLocation.x,a=e.rootLocation.y,o=this.zr.getWidth(),r=this.zr.getHeight();n=\"center\"===n?.5*o:this.parsePercent(n,o),a=\"center\"===a?.5*r:this.parsePercent(a,r),a=this.parsePercent(a,r),\"horizontal\"===i&&(n=isNaN(n)?10:n,a=isNaN(a)?.5*r:a),\"radial\"===i?(n=isNaN(n)?.5*o:n,a=isNaN(a)?.5*r:a):(n=isNaN(n)?.5*o:n,a=isNaN(a)?10:a);var s=this.tree.root.layout.position[0];if(\"radial\"===i){var h=1/0,m=0,V=0;this.tree.traverse(function(e){m=Math.max(m,e.layout.position[0]),h=Math.min(h,e.layout.position[0]),V=Math.max(V,e.layout.width)}),this.width=m-h+2*V,this.minX=h}this.tree.traverse(function(t){var o,r;if(\"vertical\"===i&&\"inverse\"===e.direction)o=t.layout.position[0]-s+n,r=a-t.layout.position[1];else if(\"vertical\"===i)o=t.layout.position[0]-s+n,r=t.layout.position[1]+a;else if(\"horizontal\"===i&&\"inverse\"===e.direction)r=t.layout.position[0]-s+a,o=n-t.layout.position[1];else if(\"horizontal\"===i)r=t.layout.position[0]-s+a,o=t.layout.position[1]+n;else{o=t.layout.position[0],r=t.layout.position[1],t.layout.originPosition=[o,r];var l=r,m=(o-h)/this.width*Math.PI*2;o=l*Math.cos(m)+n,r=l*Math.sin(m)+a,t.layout.angle=m}t.layout.position[0]=o,t.layout.position[1]=r},this)},refresh:function(e){this.clear(),e&&(this.option=e,this.series=this.option.series);for(var t=this.series,i=this.component.legend,n=0;n<t.length;n++)if(t[n].type===m.CHART_TYPE_TREE){t[n]=this.reformOption(t[n]);var a=t[n].name||\"\";if(this.selectedMap[a]=i?i.isSelected(a):!0,!this.selectedMap[a])continue;this._buildSeries(t[n],n)}},_buildSeries:function(e,t){this._buildShape(e,t)}},U.inherits(t,i),e(\"../chart\").define(\"tree\",t),t}),i(\"echarts/layout/Tree\",[\"require\",\"zrender/tool/vector\"],function(e){function t(e){e=e||{},this.nodePadding=e.nodePadding||30,this.layerPadding=e.layerPadding||100,this._layerOffsets=[],this._layers=[]}var i=e(\"zrender/tool/vector\");return t.prototype.run=function(e){this._layerOffsets.length=0;for(var t=0;t<e.root.height+1;t++)this._layerOffsets[t]=0,this._layers[t]=[];this._updateNodeXPosition(e.root);var i=e.root;this._updateNodeYPosition(i,0,i.layout.height)},t.prototype._updateNodeXPosition=function(e){var t=1/0,n=-(1/0);e.layout.position=e.layout.position||i.create();for(var a=0;a<e.children.length;a++){var o=e.children[a];this._updateNodeXPosition(o);var r=o.layout.position[0];t>r&&(t=r),r>n&&(n=r)}e.layout.position[0]=e.children.length>0?(t+n)/2:0;var s=this._layerOffsets[e.depth]||0;if(s>e.layout.position[0]){var l=s-e.layout.position[0];this._shiftSubtree(e,l);for(var a=e.depth+1;a<e.height+e.depth;a++)this._layerOffsets[a]+=l}this._layerOffsets[e.depth]=e.layout.position[0]+e.layout.width+this.nodePadding,this._layers[e.depth].push(e)},t.prototype._shiftSubtree=function(e,t){e.layout.position[0]+=t;for(var i=0;i<e.children.length;i++)this._shiftSubtree(e.children[i],t)},t.prototype._updateNodeYPosition=function(e,t,i){e.layout.position[1]=t;for(var n=0,a=0;a<e.children.length;a++)n=Math.max(e.children[a].layout.height,n);var o=this.layerPadding;\"function\"==typeof o&&(o=o(e.depth));for(var a=0;a<e.children.length;a++)this._updateNodeYPosition(e.children[a],t+o+i,n)},t}),i(\"echarts/chart/wordCloud\",[\"require\",\"./base\",\"zrender/shape/Text\",\"../layout/WordCloud\",\"../component/grid\",\"../component/dataRange\",\"../config\",\"../util/ecData\",\"zrender/tool/util\",\"zrender/tool/color\",\"../chart\"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e(\"./base\"),n=e(\"zrender/shape/Text\"),a=e(\"../layout/WordCloud\");e(\"../component/grid\"),e(\"../component/dataRange\");var o=e(\"../config\"),r=e(\"../util/ecData\"),s=e(\"zrender/tool/util\"),l=e(\"zrender/tool/color\");return o.wordCloud={zlevel:0,z:2,clickable:!0,center:[\"50%\",\"50%\"],size:[\"40%\",\"40%\"],textRotation:[0,90],textPadding:0,autoSize:{enable:!0,minSize:12},itemStyle:{normal:{textStyle:{fontSize:function(e){return e.value}}}}},t.prototype={type:o.CHART_TYPE_WORDCLOUD,refresh:function(e){e&&(this.option=e,this.series=e.series),this._init()},_init:function(){var e=this.series;this.backupShapeList();for(var t=this.component.legend,i=0;i<e.length;i++)if(e[i].type===o.CHART_TYPE_WORDCLOUD){e[i]=this.reformOption(e[i]);var n=e[i].name||\"\";if(this.selectedMap[n]=t?t.isSelected(n):!0,!this.selectedMap[n])continue;this.buildMark(i),this._initSerie(e[i])}},_initSerie:function(e){var t=e.itemStyle.normal.textStyle,i=[this.parsePercent(e.size[0],this.zr.getWidth())||200,this.parsePercent(e.size[1],this.zr.getHeight())||200],n=this.parseCenter(this.zr,e.center),o={size:i,wordletype:{autoSizeCal:e.autoSize},center:n,rotate:e.textRotation,padding:e.textPadding,font:t.fontFamily,fontSize:t.fontSize,fontWeight:t.fontWeight,fontStyle:t.fontStyle,text:function(e){return e.name},data:e.data},r=new a(o),s=this;r.end(function(e){s._buildShapes(e)}),r.start()},_buildShapes:function(e){for(var t=e.length,i=0;t>i;i++)this._buildTextShape(e[i],0,i);this.addShapeList()},_buildTextShape:function(e,t,i){var a=this.series,o=a[t],s=o.name||\"\",h=o.data[i],m=[h,o],V=this.component.legend,U=V?V.getColor(s):this.zr.getColor(t),d=this.deepMerge(m,\"itemStyle.normal\")||{},p=this.deepMerge(m,\"itemStyle.emphasis\")||{},c=this.getItemStyleColor(d.color,t,i,h)||U,u=this.getItemStyleColor(p.color,t,i,h)||(\"string\"==typeof c?l.lift(c,-.2):c),y=new n({zlevel:o.zlevel,z:o.z,hoverable:!0,clickable:this.deepQuery(m,\"clickable\"),style:{x:0,y:0,text:e.text,color:c,textFont:[e.style,e.weight,e.size+\"px\",e.font].join(\" \"),textBaseline:\"alphabetic\",textAlign:\"center\"},highlightStyle:{brushType:p.borderWidth?\"both\":\"fill\",color:u,lineWidth:p.borderWidth||0,strokeColor:p.borderColor},position:[e.x,e.y],rotation:[-e.rotate/180*Math.PI,0,0]});r.pack(y,o,t,h,i,h.name),this.shapeList.push(y)}},s.inherits(t,i),e(\"../chart\").define(\"wordCloud\",t),t}),i(\"echarts/layout/WordCloud\",[\"require\",\"../layout/WordCloudRectZero\",\"zrender/tool/util\"],function(e){function t(e){this._init(e)}var i=e(\"../layout/WordCloudRectZero\"),n=e(\"zrender/tool/util\");return t.prototype={start:function(){function e(){p.totalArea=r,U.autoSizeCal.enable&&p._autoCalTextSize(m,r,a,o,U.autoSizeCal.minSize),V.timer&&clearInterval(V.timer),V.timer=setInterval(t,0),t()}function t(){for(var e,t=+new Date,i=m.length;+new Date-t<V.timeInterval&&++s<i&&V.timer;)e=m[s],e.x=d[0]>>1,e.y=d[1]>>1,p._cloudSprite(e,m,s),e.hasText&&p._place(n,e,h)&&(l.push(e),e.x-=d[0]>>1,e.y-=d[1]>>1);s>=i&&(p.stop(),p._fixTagPosition(l),V.endcallback(l))}var n=null,a=0,o=0,r=0,s=-1,l=[],h=null,m=this.wordsdata,V=this.defaultOption,U=V.wordletype,d=V.size,p=this,c=new i({type:U.type,width:d[0],height:d[1]});return c.calculate(function(t){n=t.initarr,a=t.maxWit,o=t.maxHit,r=t.area,h=t.imgboard,e()},this),this},_fixTagPosition:function(e){for(var t=this.defaultOption.center,i=0,n=e.length;n>i;i++)e[i].x+=t[0],e[i].y+=t[1]},stop:function(){return this.defaultOption.timer&&(clearInterval(this.defaultOption.timer),this.defaultOption.timer=null),this},end:function(e){return e&&(this.defaultOption.endcallback=e),this},_init:function(e){this.defaultOption={},this._initProperty(e),this._initMethod(e),this._initCanvas(),this._initData(e.data)},_initData:function(e){var t=this,i=t.defaultOption;this.wordsdata=e.map(function(e,n){return e.text=i.text.call(t,e,n),e.font=i.font.call(t,e,n),e.style=i.fontStyle.call(t,e,n),e.weight=i.fontWeight.call(t,e,n),e.rotate=i.rotate.call(t,e,n),e.size=~~i.fontSize.call(t,e,n),e.padding=i.padding.call(t,e,n),e}).sort(function(e,t){return t.value-e.value})},_initMethod:function(e){function t(e){return e.name}function i(){return\"sans-serif\"}function n(){return\"normal\"}function a(e){return e.value}function o(){return 0}function r(e){return function(){return e[Math.round(Math.random()*(e.length-1))]}}function s(){return 0}function l(e){var t=e[0]/e[1];return function(e){return[t*(e*=.1)*Math.cos(e),e*Math.sin(e)]}}function h(e){var t=4,i=t*e[0]/e[1],n=0,a=0;return function(e){var o=0>e?-1:1;switch(Math.sqrt(1+4*o*e)-o&3){case 0:n+=i;break;case 1:a+=t;break;case 2:n-=i;break;default:a-=t}return[n,a]}}function m(e){return\"function\"==typeof e?e:function(){return e}}var V=this.defaultOption;V.text=e.text?m(e.text):t,V.font=e.font?m(e.font):i,V.fontSize=e.fontSize?m(e.fontSize):a,V.fontStyle=e.fontStyle?m(e.fontStyle):n,V.fontWeight=e.fontWeight?m(e.fontWeight):n,V.rotate=e.rotate?r(e.rotate):o,V.padding=e.padding?m(e.padding):s,V.center=e.center,V.spiral=l,V.endcallback=function(){},V.rectangularSpiral=h,V.archimedeanSpiral=l},_initProperty:function(e){var t=this.defaultOption;t.size=e.size||[256,256],t.wordletype=e.wordletype,t.words=e.words||[],t.timeInterval=1/0,t.timer=null,t.spirals={archimedean:t.archimedeanSpiral,rectangular:t.rectangularSpiral},n.merge(t,{size:[256,256],wordletype:{type:\"RECT\",areaPresent:.058,autoSizeCal:{enable:!0,minSize:12}}})},_initCanvas:function(){var e,t=Math.PI/180,i=64,n=2048,a=1;\"undefined\"!=typeof document?(e=document.createElement(\"canvas\"),e.width=1,e.height=1,a=Math.sqrt(e.getContext(\"2d\").getImageData(0,0,1,1).data.length>>2),e.width=(i<<5)/a,e.height=n/a):e=new Canvas(i<<5,n);var o=e.getContext(\"2d\");o.fillStyle=o.strokeStyle=\"red\",o.textAlign=\"center\",this.defaultOption.c=o,this.defaultOption.cw=i,this.defaultOption.ch=n,this.defaultOption.ratio=a,this.defaultOption.cloudRadians=t},_cloudSprite:function(e,t,i){if(!e.sprite){var n=this.defaultOption.cw,a=this.defaultOption.ch,o=this.defaultOption.c,r=this.defaultOption.ratio,s=this.defaultOption.cloudRadians;o.clearRect(0,0,(n<<5)/r,a/r);var l=0,h=0,m=0,V=t.length;for(--i;++i<V;){e=t[i],o.save(),o.font=e.style+\" \"+e.weight+\" \"+~~((e.size+1)/r)+\"px \"+e.font;var U=o.measureText(e.text+\"m\").width*r,d=e.size<<1;if(e.rotate){var p=Math.sin(e.rotate*s),c=Math.cos(e.rotate*s),u=U*c,y=U*p,g=d*c,b=d*p;U=Math.max(Math.abs(u+b),Math.abs(u-b))+31>>5<<5,d=~~Math.max(Math.abs(y+g),Math.abs(y-g))}else U=U+31>>5<<5;if(d>m&&(m=d),l+U>=n<<5&&(l=0,h+=m,m=0),h+d>=a)break;o.translate((l+(U>>1))/r,(h+(d>>1))/r),e.rotate&&o.rotate(e.rotate*s),o.fillText(e.text,0,0),e.padding&&(o.lineWidth=2*e.padding,o.strokeText(e.text,0,0)),o.restore(),e.width=U,e.height=d,e.xoff=l,e.yoff=h,e.x1=U>>1,e.y1=d>>1,e.x0=-e.x1,e.y0=-e.y1,e.hasText=!0,l+=U}for(var f=o.getImageData(0,0,(n<<5)/r,a/r).data,k=[];--i>=0;)if(e=t[i],e.hasText){for(var U=e.width,x=U>>5,d=e.y1-e.y0,_=0;d*x>_;_++)k[_]=0;if(l=e.xoff,null==l)return;h=e.yoff;for(var L=0,W=-1,X=0;d>X;X++){for(var _=0;U>_;_++){var v=x*X+(_>>5),w=f[(h+X)*(n<<5)+(l+_)<<2]?1<<31-_%32:0;k[v]|=w,L|=w}L?W=X:(e.y0++,d--,X--,h++)}e.y1=e.y0+W,e.sprite=k.slice(0,(e.y1-e.y0)*x)}}},_place:function(e,t,i){function n(e,t,i){i>>=5;for(var n,a=e.sprite,o=e.width>>5,r=e.x-(o<<4),s=127&r,l=32-s,h=e.y1-e.y0,m=(e.y+e.y0)*i+(r>>5),V=0;h>V;V++){n=0;for(var U=0;o>=U;U++)if((n<<l|(o>U?(n=a[V*o+U])>>>s:0))&t[m+U])return!0;m+=i}return!1}function a(e,t){return t.row[e.y]&&t.cloumn[e.x]&&e.x>=t.row[e.y].start&&e.x<=t.row[e.y].end&&e.y>=t.cloumn[e.x].start&&e.y<=t.cloumn[e.x].end}for(var o,r,s,l=this.defaultOption.size,h=([{x:0,y:0},{x:l[0],y:l[1]}],t.x),m=t.y,V=Math.sqrt(l[0]*l[0]+l[1]*l[1]),U=this.defaultOption.spiral(l),d=Math.random()<.5?1:-1,p=-d;(o=U(p+=d))&&(r=~~o[0],s=~~o[1],!(Math.min(r,s)>V));)if(t.x=h+r,t.y=m+s,!(t.x+t.x0<0||t.y+t.y0<0||t.x+t.x1>l[0]||t.y+t.y1>l[1])&&!n(t,e,l[0])&&a(t,i)){for(var c,u=t.sprite,y=t.width>>5,g=l[0]>>5,b=t.x-(y<<4),f=127&b,k=32-f,x=t.y1-t.y0,_=(t.y+t.y0)*g+(b>>5),L=0;x>L;L++){c=0;for(var W=0;y>=W;W++)e[_+W]|=c<<k|(y>W?(c=u[L*y+W])>>>f:0);_+=g}return delete t.sprite,!0}return!1},_autoCalTextSize:function(e,t,i,n,a){function o(e){c.clearRect(0,0,(d<<5)/u,p/u),c.save(),c.font=e.style+\" \"+e.weight+\" \"+~~((e.size+1)/u)+\"px \"+e.font;var t=c.measureText(e.text+\"m\").width*u,r=e.size<<1;t=t+31>>5<<5,c.restore(),e.aw=t,e.ah=r;var s,l,h;if(e.rotate){var m=Math.sin(e.rotate*y),V=Math.cos(e.rotate*y),g=t*V,b=t*m,f=r*V,k=r*m;l=Math.max(Math.abs(g+k),Math.abs(g-k))+31>>5<<5,h=~~Math.max(Math.abs(b+f),Math.abs(b-f))}return e.size<=U||e.rotate&&t*r<=e.area&&i>=l&&n>=h||t*r<=e.area&&i>=t&&n>=r?void(e.area=t*r):(s=e.rotate&&l>i&&h>n?Math.min(i/l,n/h):t>i||r>n?Math.min(i/t,n/r):Math.sqrt(e.area/(e.aw*e.ah)),e.size=~~(s*e.size),e.size<a?void(e.size=a):o(e))}function r(e,t){for(var i=e.length,n=0;i--;)n+=t(e[i]);return n}for(var s,l,h=r(e,function(e){return e.size}),m=e.length,V=.25,U=a,d=this.defaultOption.cw,p=this.defaultOption.ch,c=this.defaultOption.c,u=this.defaultOption.ratio,y=this.defaultOption.cloudRadians;m--;)s=e[m],l=s.size/h,s.areapre=V?V>l?l:V:l,s.area=t*s.areapre,s.totalarea=t,o(s)}},t}),i(\"echarts/layout/WordCloudRectZero\",[\"require\"],function(){function e(e){this.defaultOption={type:\"RECT\"},this._init(e)}return e.prototype={RECT:\"_calculateRect\",_init:function(e){this._initOption(e),this._initCanvas()},_initOption:function(e){for(k in e)this.defaultOption[k]=e[k]},_initCanvas:function(){var e=document.createElement(\"canvas\");e.width=1,e.height=1;var t=Math.sqrt(e.getContext(\"2d\").getImageData(0,0,1,1).data.length>>2);if(e.width=this.defaultOption.width,e.height=this.defaultOption.height,e.getContext)var i=e.getContext(\"2d\");this.canvas=e,this.ctx=i,this.ratio=t},calculate:function(e,t){var i=this.defaultOption.type,n=this[i];this[n].call(this,e,t)},_calculateReturn:function(e,t,i){t.call(i,e)},_calculateRect:function(e,t){var i={},n=this.defaultOption.width>>5<<5,a=this.defaultOption.height;i.initarr=this._rectZeroArray(n*a),i.area=n*a,i.maxHit=a,i.maxWit=n,i.imgboard=this._rectBoard(n,a),this._calculateReturn(i,e,t)},_rectBoard:function(e,t){for(var i=[],n=0;t>n;n++)i.push({y:n,start:0,end:e});for(var a=[],n=0;e>n;n++)a.push({x:n,start:0,end:t});return{row:i,cloumn:a}},_rectZeroArray:function(e){for(var t=[],i=e,n=-1;++n<i;)t[n]=0;return t}},e}),i(\"echarts/chart/heatmap\",[\"require\",\"./base\",\"../layer/heatmap\",\"../config\",\"../util/ecData\",\"zrender/tool/util\",\"zrender/tool/color\",\"zrender/shape/Image\",\"../chart\"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e(\"./base\"),n=e(\"../layer/heatmap\"),a=e(\"../config\"),o=(e(\"../util/ecData\"),e(\"zrender/tool/util\")),r=(e(\"zrender/tool/color\"),e(\"zrender/shape/Image\"));return a.heatmap={zlevel:0,z:2,clickable:!0},t.prototype={type:a.CHART_TYPE_HEATMAP,refresh:function(e){this.clear(),e&&(this.option=e,this.series=e.series),this._init()},_init:function(){var e=this.series;this.backupShapeList();for(var t=e.length,i=0;t>i;++i)if(e[i].type===a.CHART_TYPE_HEATMAP){e[i]=this.reformOption(e[i]);var o=new n(e[i]),s=o.getCanvas(e[i].data,this.zr.getWidth(),this.zr.getHeight()),l=new r({position:[0,0],scale:[1,1],hoverable:this.option.hoverable,style:{x:0,y:0,image:s,width:s.width,height:s.height}});this.shapeList.push(l)}this.addShapeList()}},o.inherits(t,i),e(\"../chart\").define(\"heatmap\",t),t});var n=t(\"zrender\");n.tool={color:t(\"zrender/tool/color\"),math:t(\"zrender/tool/math\"),util:t(\"zrender/tool/util\"),vector:t(\"zrender/tool/vector\"),area:t(\"zrender/tool/area\"),event:t(\"zrender/tool/event\")},n.animation={Animation:t(\"zrender/animation/Animation\"),Cip:t(\"zrender/animation/Clip\"),easing:t(\"zrender/animation/easing\")};var a=t(\"echarts\");a.config=t(\"echarts/config\"),a.util={mapData:{params:t(\"echarts/util/mapData/params\")}},t(\"echarts/chart/line\"),t(\"echarts/chart/bar\"),t(\"echarts/chart/scatter\"),t(\"echarts/chart/k\"),t(\"echarts/chart/pie\"),t(\"echarts/chart/radar\"),t(\"echarts/chart/chord\"),t(\"echarts/chart/force\"),t(\"echarts/chart/map\"),t(\"echarts/chart/gauge\"),t(\"echarts/chart/funnel\"),t(\"echarts/chart/eventRiver\"),t(\"echarts/chart/venn\"),t(\"echarts/chart/treemap\"),t(\"echarts/chart/tree\"),t(\"echarts/chart/wordCloud\"),t(\"echarts/chart/heatmap\"),e.echarts=a,e.zrender=n}(window);\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/fancybox/jquery.fancybox.css",
    "content": "/*! fancyBox v2.1.5 fancyapps.com | fancyapps.com/fancybox/#license */\n.fancybox-wrap,\n.fancybox-skin,\n.fancybox-outer,\n.fancybox-inner,\n.fancybox-image,\n.fancybox-wrap iframe,\n.fancybox-wrap object,\n.fancybox-nav,\n.fancybox-nav span,\n.fancybox-tmp\n{\n\tpadding: 0;\n\tmargin: 0;\n\tborder: 0;\n\toutline: none;\n\tvertical-align: top;\n}\n\n.fancybox-wrap {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tz-index: 8020;\n}\n\n.fancybox-skin {\n\tposition: relative;\n\tbackground: #f9f9f9;\n\tcolor: #444;\n\ttext-shadow: none;\n\t-webkit-border-radius: 4px;\n\t   -moz-border-radius: 4px;\n\t        border-radius: 4px;\n}\n\n.fancybox-opened {\n\tz-index: 8030;\n}\n\n.fancybox-opened .fancybox-skin {\n\t-webkit-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);\n\t   -moz-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);\n\t        box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);\n}\n\n.fancybox-outer, .fancybox-inner {\n\tposition: relative;\n}\n\n.fancybox-inner {\n\toverflow: hidden;\n}\n\n.fancybox-type-iframe .fancybox-inner {\n\t-webkit-overflow-scrolling: touch;\n}\n\n.fancybox-error {\n\tcolor: #444;\n\tfont: 14px/20px \"Helvetica Neue\",Helvetica,Arial,sans-serif;\n\tmargin: 0;\n\tpadding: 15px;\n\twhite-space: nowrap;\n}\n\n.fancybox-image, .fancybox-iframe {\n\tdisplay: block;\n\twidth: 100%;\n\theight: 100%;\n}\n\n.fancybox-image {\n\tmax-width: 100%;\n\tmax-height: 100%;\n}\n\n#fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span {\n\tbackground-image: url('fancybox_sprite.png');\n}\n\n#fancybox-loading {\n\tposition: fixed;\n\ttop: 50%;\n\tleft: 50%;\n\tmargin-top: -22px;\n\tmargin-left: -22px;\n\tbackground-position: 0 -108px;\n\topacity: 0.8;\n\tcursor: pointer;\n\tz-index: 8060;\n}\n\n#fancybox-loading div {\n\twidth: 44px;\n\theight: 44px;\n\tbackground: url('fancybox_loading.gif') center center no-repeat;\n}\n\n.fancybox-close {\n\tposition: absolute;\n\ttop: -18px;\n\tright: -18px;\n\twidth: 36px;\n\theight: 36px;\n\tcursor: pointer;\n\tz-index: 8040;\n}\n\n.fancybox-nav {\n\tposition: absolute;\n\ttop: 0;\n\twidth: 40%;\n\theight: 100%;\n\tcursor: pointer;\n\ttext-decoration: none;\n\tbackground: transparent url('blank.gif'); /* helps IE */\n\t-webkit-tap-highlight-color: rgba(0,0,0,0);\n\tz-index: 8040;\n}\n\n.fancybox-prev {\n\tleft: 0;\n}\n\n.fancybox-next {\n\tright: 0;\n}\n\n.fancybox-nav span {\n\tposition: absolute;\n\ttop: 50%;\n\twidth: 36px;\n\theight: 34px;\n\tmargin-top: -18px;\n\tcursor: pointer;\n\tz-index: 8040;\n\tvisibility: hidden;\n}\n\n.fancybox-prev span {\n\tleft: 10px;\n\tbackground-position: 0 -36px;\n}\n\n.fancybox-next span {\n\tright: 10px;\n\tbackground-position: 0 -72px;\n}\n\n.fancybox-nav:hover span {\n\tvisibility: visible;\n}\n\n.fancybox-tmp {\n\tposition: absolute;\n\ttop: -99999px;\n\tleft: -99999px;\n\tvisibility: hidden;\n\tmax-width: 99999px;\n\tmax-height: 99999px;\n\toverflow: visible !important;\n}\n\n/* Overlay helper */\n\n.fancybox-lock {\n    overflow: hidden !important;\n    width: auto;\n}\n\n.fancybox-lock body {\n    overflow: hidden !important;\n}\n\n.fancybox-lock-test {\n    overflow-y: hidden !important;\n}\n\n.fancybox-overlay {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\toverflow: hidden;\n\tdisplay: none;\n\tz-index: 8010;\n\tbackground: url('fancybox_overlay.png');\n}\n\n.fancybox-overlay-fixed {\n\tposition: fixed;\n\tbottom: 0;\n\tright: 0;\n}\n\n.fancybox-lock .fancybox-overlay {\n\toverflow: auto;\n\toverflow-y: scroll;\n}\n\n/* Title helper */\n\n.fancybox-title {\n\tvisibility: hidden;\n\tfont: normal 13px/20px \"Helvetica Neue\",Helvetica,Arial,sans-serif;\n\tposition: relative;\n\ttext-shadow: none;\n\tz-index: 8050;\n}\n\n.fancybox-opened .fancybox-title {\n\tvisibility: visible;\n}\n\n.fancybox-title-float-wrap {\n\tposition: absolute;\n\tbottom: 0;\n\tright: 50%;\n\tmargin-bottom: -35px;\n\tz-index: 8050;\n\ttext-align: center;\n}\n\n.fancybox-title-float-wrap .child {\n\tdisplay: inline-block;\n\tmargin-right: -100%;\n\tpadding: 2px 20px;\n\tbackground: transparent; /* Fallback for web browsers that doesn't support RGBa */\n\tbackground: rgba(0, 0, 0, 0.8);\n\t-webkit-border-radius: 15px;\n\t   -moz-border-radius: 15px;\n\t        border-radius: 15px;\n\ttext-shadow: 0 1px 2px #222;\n\tcolor: #FFF;\n\tfont-weight: bold;\n\tline-height: 24px;\n\twhite-space: nowrap;\n}\n\n.fancybox-title-outside-wrap {\n\tposition: relative;\n\tmargin-top: 10px;\n\tcolor: #fff;\n}\n\n.fancybox-title-inside-wrap {\n\tpadding-top: 10px;\n}\n\n.fancybox-title-over-wrap {\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 0;\n\tcolor: #fff;\n\tpadding: 10px;\n\tbackground: #000;\n\tbackground: rgba(0, 0, 0, .8);\n}\n\n/*Retina graphics!*/\n@media only screen and (-webkit-min-device-pixel-ratio: 1.5),\n\t   only screen and (min--moz-device-pixel-ratio: 1.5),\n\t   only screen and (min-device-pixel-ratio: 1.5){\n\n\t#fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span {\n\t\tbackground-image: url('fancybox_sprite%402x.png');\n\t\tbackground-size: 44px 152px; /*The size of the normal image, half the size of the hi-res image*/\n\t}\n\n\t#fancybox-loading div {\n\t\tbackground-image: url('fancybox_loading%402x.gif');\n\t\tbackground-size: 24px 24px; /*The size of the normal image, half the size of the hi-res image*/\n\t}\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/fancybox/jquery.fancybox.js",
    "content": "/*!\n * fancyBox - jQuery Plugin\n * version: 2.1.5 (Fri, 14 Jun 2013)\n * @requires jQuery v1.6 or later\n *\n * Examples at http://fancyapps.com/fancybox/\n * License: www.fancyapps.com/fancybox/#license\n *\n * Copyright 2012 Janis Skarnelis - janis@fancyapps.com\n *\n */\n\n(function (window, document, $, undefined) {\n\t\"use strict\";\n\n\tvar H = $(\"html\"),\n\t\tW = $(window),\n\t\tD = $(document),\n\t\tF = $.fancybox = function () {\n\t\t\tF.open.apply( this, arguments );\n\t\t},\n\t\tIE =  navigator.userAgent.match(/msie/i),\n\t\tdidUpdate\t= null,\n\t\tisTouch\t\t= document.createTouch !== undefined,\n\n\t\tisQuery\t= function(obj) {\n\t\t\treturn obj && obj.hasOwnProperty && obj instanceof $;\n\t\t},\n\t\tisString = function(str) {\n\t\t\treturn str && $.type(str) === \"string\";\n\t\t},\n\t\tisPercentage = function(str) {\n\t\t\treturn isString(str) && str.indexOf('%') > 0;\n\t\t},\n\t\tisScrollable = function(el) {\n\t\t\treturn (el && !(el.style.overflow && el.style.overflow === 'hidden') && ((el.clientWidth && el.scrollWidth > el.clientWidth) || (el.clientHeight && el.scrollHeight > el.clientHeight)));\n\t\t},\n\t\tgetScalar = function(orig, dim) {\n\t\t\tvar value = parseInt(orig, 10) || 0;\n\n\t\t\tif (dim && isPercentage(orig)) {\n\t\t\t\tvalue = F.getViewport()[ dim ] / 100 * value;\n\t\t\t}\n\n\t\t\treturn Math.ceil(value);\n\t\t},\n\t\tgetValue = function(value, dim) {\n\t\t\treturn getScalar(value, dim) + 'px';\n\t\t};\n\n\t$.extend(F, {\n\t\t// The current version of fancyBox\n\t\tversion: '2.1.5',\n\n\t\tdefaults: {\n\t\t\tpadding : 15,\n\t\t\tmargin  : 20,\n\n\t\t\twidth     : 800,\n\t\t\theight    : 600,\n\t\t\tminWidth  : 100,\n\t\t\tminHeight : 100,\n\t\t\tmaxWidth  : 9999,\n\t\t\tmaxHeight : 9999,\n\t\t\tpixelRatio: 1, // Set to 2 for retina display support\n\n\t\t\tautoSize   : true,\n\t\t\tautoHeight : false,\n\t\t\tautoWidth  : false,\n\n\t\t\tautoResize  : true,\n\t\t\tautoCenter  : !isTouch,\n\t\t\tfitToView   : true,\n\t\t\taspectRatio : false,\n\t\t\ttopRatio    : 0.5,\n\t\t\tleftRatio   : 0.5,\n\n\t\t\tscrolling : 'auto', // 'auto', 'yes' or 'no'\n\t\t\twrapCSS   : '',\n\n\t\t\tarrows     : true,\n\t\t\tcloseBtn   : true,\n\t\t\tcloseClick : false,\n\t\t\tnextClick  : false,\n\t\t\tmouseWheel : true,\n\t\t\tautoPlay   : false,\n\t\t\tplaySpeed  : 3000,\n\t\t\tpreload    : 3,\n\t\t\tmodal      : false,\n\t\t\tloop       : true,\n\n\t\t\tajax  : {\n\t\t\t\tdataType : 'html',\n\t\t\t\theaders  : { 'X-fancyBox': true }\n\t\t\t},\n\t\t\tiframe : {\n\t\t\t\tscrolling : 'auto',\n\t\t\t\tpreload   : true\n\t\t\t},\n\t\t\tswf : {\n\t\t\t\twmode: 'transparent',\n\t\t\t\tallowfullscreen   : 'true',\n\t\t\t\tallowscriptaccess : 'always'\n\t\t\t},\n\n\t\t\tkeys  : {\n\t\t\t\tnext : {\n\t\t\t\t\t13 : 'left', // enter\n\t\t\t\t\t34 : 'up',   // page down\n\t\t\t\t\t39 : 'left', // right arrow\n\t\t\t\t\t40 : 'up'    // down arrow\n\t\t\t\t},\n\t\t\t\tprev : {\n\t\t\t\t\t8  : 'right',  // backspace\n\t\t\t\t\t33 : 'down',   // page up\n\t\t\t\t\t37 : 'right',  // left arrow\n\t\t\t\t\t38 : 'down'    // up arrow\n\t\t\t\t},\n\t\t\t\tclose  : [27], // escape key\n\t\t\t\tplay   : [32], // space - start/stop slideshow\n\t\t\t\ttoggle : [70]  // letter \"f\" - toggle fullscreen\n\t\t\t},\n\n\t\t\tdirection : {\n\t\t\t\tnext : 'left',\n\t\t\t\tprev : 'right'\n\t\t\t},\n\n\t\t\tscrollOutside  : true,\n\n\t\t\t// Override some properties\n\t\t\tindex   : 0,\n\t\t\ttype    : null,\n\t\t\thref    : null,\n\t\t\tcontent : null,\n\t\t\ttitle   : null,\n\n\t\t\t// HTML templates\n\t\t\ttpl: {\n\t\t\t\twrap     : '<div class=\"fancybox-wrap\" tabIndex=\"-1\"><div class=\"fancybox-skin\"><div class=\"fancybox-outer\"><div class=\"fancybox-inner\"></div></div></div></div>',\n\t\t\t\timage    : '<img class=\"fancybox-image\" src=\"{href}\" alt=\"\" />',\n\t\t\t\tiframe   : '<iframe id=\"fancybox-frame{rnd}\" name=\"fancybox-frame{rnd}\" class=\"fancybox-iframe\" frameborder=\"0\" vspace=\"0\" hspace=\"0\" webkitAllowFullScreen mozallowfullscreen allowFullScreen' + (IE ? ' allowtransparency=\"true\"' : '') + '></iframe>',\n\t\t\t\terror    : '<p class=\"fancybox-error\">The requested content cannot be loaded.<br/>Please try again later.</p>',\n\t\t\t\tcloseBtn : '<a title=\"Close\" class=\"fancybox-item fancybox-close\" href=\"javascript:;\"></a>',\n\t\t\t\tnext     : '<a title=\"Next\" class=\"fancybox-nav fancybox-next\" href=\"javascript:;\"><span></span></a>',\n\t\t\t\tprev     : '<a title=\"Previous\" class=\"fancybox-nav fancybox-prev\" href=\"javascript:;\"><span></span></a>'\n\t\t\t},\n\n\t\t\t// Properties for each animation type\n\t\t\t// Opening fancyBox\n\t\t\topenEffect  : 'fade', // 'elastic', 'fade' or 'none'\n\t\t\topenSpeed   : 250,\n\t\t\topenEasing  : 'swing',\n\t\t\topenOpacity : true,\n\t\t\topenMethod  : 'zoomIn',\n\n\t\t\t// Closing fancyBox\n\t\t\tcloseEffect  : 'fade', // 'elastic', 'fade' or 'none'\n\t\t\tcloseSpeed   : 250,\n\t\t\tcloseEasing  : 'swing',\n\t\t\tcloseOpacity : true,\n\t\t\tcloseMethod  : 'zoomOut',\n\n\t\t\t// Changing next gallery item\n\t\t\tnextEffect : 'elastic', // 'elastic', 'fade' or 'none'\n\t\t\tnextSpeed  : 250,\n\t\t\tnextEasing : 'swing',\n\t\t\tnextMethod : 'changeIn',\n\n\t\t\t// Changing previous gallery item\n\t\t\tprevEffect : 'elastic', // 'elastic', 'fade' or 'none'\n\t\t\tprevSpeed  : 250,\n\t\t\tprevEasing : 'swing',\n\t\t\tprevMethod : 'changeOut',\n\n\t\t\t// Enable default helpers\n\t\t\thelpers : {\n\t\t\t\toverlay : true,\n\t\t\t\ttitle   : true\n\t\t\t},\n\n\t\t\t// Callbacks\n\t\t\tonCancel     : $.noop, // If canceling\n\t\t\tbeforeLoad   : $.noop, // Before loading\n\t\t\tafterLoad    : $.noop, // After loading\n\t\t\tbeforeShow   : $.noop, // Before changing in current item\n\t\t\tafterShow    : $.noop, // After opening\n\t\t\tbeforeChange : $.noop, // Before changing gallery item\n\t\t\tbeforeClose  : $.noop, // Before closing\n\t\t\tafterClose   : $.noop  // After closing\n\t\t},\n\n\t\t//Current state\n\t\tgroup    : {}, // Selected group\n\t\topts     : {}, // Group options\n\t\tprevious : null,  // Previous element\n\t\tcoming   : null,  // Element being loaded\n\t\tcurrent  : null,  // Currently loaded element\n\t\tisActive : false, // Is activated\n\t\tisOpen   : false, // Is currently open\n\t\tisOpened : false, // Have been fully opened at least once\n\n\t\twrap  : null,\n\t\tskin  : null,\n\t\touter : null,\n\t\tinner : null,\n\n\t\tplayer : {\n\t\t\ttimer    : null,\n\t\t\tisActive : false\n\t\t},\n\n\t\t// Loaders\n\t\tajaxLoad   : null,\n\t\timgPreload : null,\n\n\t\t// Some collections\n\t\ttransitions : {},\n\t\thelpers     : {},\n\n\t\t/*\n\t\t *\tStatic methods\n\t\t */\n\n\t\topen: function (group, opts) {\n\t\t\tif (!group) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!$.isPlainObject(opts)) {\n\t\t\t\topts = {};\n\t\t\t}\n\n\t\t\t// Close if already active\n\t\t\tif (false === F.close(true)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Normalize group\n\t\t\tif (!$.isArray(group)) {\n\t\t\t\tgroup = isQuery(group) ? $(group).get() : [group];\n\t\t\t}\n\n\t\t\t// Recheck if the type of each element is `object` and set content type (image, ajax, etc)\n\t\t\t$.each(group, function(i, element) {\n\t\t\t\tvar obj = {},\n\t\t\t\t\thref,\n\t\t\t\t\ttitle,\n\t\t\t\t\tcontent,\n\t\t\t\t\ttype,\n\t\t\t\t\trez,\n\t\t\t\t\threfParts,\n\t\t\t\t\tselector;\n\n\t\t\t\tif ($.type(element) === \"object\") {\n\t\t\t\t\t// Check if is DOM element\n\t\t\t\t\tif (element.nodeType) {\n\t\t\t\t\t\telement = $(element);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (isQuery(element)) {\n\t\t\t\t\t\tobj = {\n\t\t\t\t\t\t\thref    : element.data('fancybox-href') || element.attr('href'),\n\t\t\t\t\t\t\ttitle   : element.data('fancybox-title') || element.attr('title'),\n\t\t\t\t\t\t\tisDom   : true,\n\t\t\t\t\t\t\telement : element\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif ($.metadata) {\n\t\t\t\t\t\t\t$.extend(true, obj, element.metadata());\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tobj = element;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\thref  = opts.href  || obj.href || (isString(element) ? element : null);\n\t\t\t\ttitle = opts.title !== undefined ? opts.title : obj.title || '';\n\n\t\t\t\tcontent = opts.content || obj.content;\n\t\t\t\ttype    = content ? 'html' : (opts.type  || obj.type);\n\n\t\t\t\tif (!type && obj.isDom) {\n\t\t\t\t\ttype = element.data('fancybox-type');\n\n\t\t\t\t\tif (!type) {\n\t\t\t\t\t\trez  = element.prop('class').match(/fancybox\\.(\\w+)/);\n\t\t\t\t\t\ttype = rez ? rez[1] : null;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (isString(href)) {\n\t\t\t\t\t// Try to guess the content type\n\t\t\t\t\tif (!type) {\n\t\t\t\t\t\tif (F.isImage(href)) {\n\t\t\t\t\t\t\ttype = 'image';\n\n\t\t\t\t\t\t} else if (F.isSWF(href)) {\n\t\t\t\t\t\t\ttype = 'swf';\n\n\t\t\t\t\t\t} else if (href.charAt(0) === '#') {\n\t\t\t\t\t\t\ttype = 'inline';\n\n\t\t\t\t\t\t} else if (isString(element)) {\n\t\t\t\t\t\t\ttype    = 'html';\n\t\t\t\t\t\t\tcontent = element;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Split url into two pieces with source url and content selector, e.g,\n\t\t\t\t\t// \"/mypage.html #my_id\" will load \"/mypage.html\" and display element having id \"my_id\"\n\t\t\t\t\tif (type === 'ajax') {\n\t\t\t\t\t\threfParts = href.split(/\\s+/, 2);\n\t\t\t\t\t\thref      = hrefParts.shift();\n\t\t\t\t\t\tselector  = hrefParts.shift();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!content) {\n\t\t\t\t\tif (type === 'inline') {\n\t\t\t\t\t\tif (href) {\n\t\t\t\t\t\t\tcontent = $( isString(href) ? href.replace(/.*(?=#[^\\s]+$)/, '') : href ); //strip for ie7\n\n\t\t\t\t\t\t} else if (obj.isDom) {\n\t\t\t\t\t\t\tcontent = element;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if (type === 'html') {\n\t\t\t\t\t\tcontent = href;\n\n\t\t\t\t\t} else if (!type && !href && obj.isDom) {\n\t\t\t\t\t\ttype    = 'inline';\n\t\t\t\t\t\tcontent = element;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$.extend(obj, {\n\t\t\t\t\thref     : href,\n\t\t\t\t\ttype     : type,\n\t\t\t\t\tcontent  : content,\n\t\t\t\t\ttitle    : title,\n\t\t\t\t\tselector : selector\n\t\t\t\t});\n\n\t\t\t\tgroup[ i ] = obj;\n\t\t\t});\n\n\t\t\t// Extend the defaults\n\t\t\tF.opts = $.extend(true, {}, F.defaults, opts);\n\n\t\t\t// All options are merged recursive except keys\n\t\t\tif (opts.keys !== undefined) {\n\t\t\t\tF.opts.keys = opts.keys ? $.extend({}, F.defaults.keys, opts.keys) : false;\n\t\t\t}\n\n\t\t\tF.group = group;\n\n\t\t\treturn F._start(F.opts.index);\n\t\t},\n\n\t\t// Cancel image loading or abort ajax request\n\t\tcancel: function () {\n\t\t\tvar coming = F.coming;\n\n\t\t\tif (!coming || false === F.trigger('onCancel')) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tF.hideLoading();\n\n\t\t\tif (F.ajaxLoad) {\n\t\t\t\tF.ajaxLoad.abort();\n\t\t\t}\n\n\t\t\tF.ajaxLoad = null;\n\n\t\t\tif (F.imgPreload) {\n\t\t\t\tF.imgPreload.onload = F.imgPreload.onerror = null;\n\t\t\t}\n\n\t\t\tif (coming.wrap) {\n\t\t\t\tcoming.wrap.stop(true, true).trigger('onReset').remove();\n\t\t\t}\n\n\t\t\tF.coming = null;\n\n\t\t\t// If the first item has been canceled, then clear everything\n\t\t\tif (!F.current) {\n\t\t\t\tF._afterZoomOut( coming );\n\t\t\t}\n\t\t},\n\n\t\t// Start closing animation if is open; remove immediately if opening/closing\n\t\tclose: function (event) {\n\t\t\tF.cancel();\n\n\t\t\tif (false === F.trigger('beforeClose')) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tF.unbindEvents();\n\n\t\t\tif (!F.isActive) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!F.isOpen || event === true) {\n\t\t\t\t$('.fancybox-wrap').stop(true).trigger('onReset').remove();\n\n\t\t\t\tF._afterZoomOut();\n\n\t\t\t} else {\n\t\t\t\tF.isOpen = F.isOpened = false;\n\t\t\t\tF.isClosing = true;\n\n\t\t\t\t$('.fancybox-item, .fancybox-nav').remove();\n\n\t\t\t\tF.wrap.stop(true, true).removeClass('fancybox-opened');\n\n\t\t\t\tF.transitions[ F.current.closeMethod ]();\n\t\t\t}\n\t\t},\n\n\t\t// Manage slideshow:\n\t\t//   $.fancybox.play(); - toggle slideshow\n\t\t//   $.fancybox.play( true ); - start\n\t\t//   $.fancybox.play( false ); - stop\n\t\tplay: function ( action ) {\n\t\t\tvar clear = function () {\n\t\t\t\t\tclearTimeout(F.player.timer);\n\t\t\t\t},\n\t\t\t\tset = function () {\n\t\t\t\t\tclear();\n\n\t\t\t\t\tif (F.current && F.player.isActive) {\n\t\t\t\t\t\tF.player.timer = setTimeout(F.next, F.current.playSpeed);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tstop = function () {\n\t\t\t\t\tclear();\n\n\t\t\t\t\tD.unbind('.player');\n\n\t\t\t\t\tF.player.isActive = false;\n\n\t\t\t\t\tF.trigger('onPlayEnd');\n\t\t\t\t},\n\t\t\t\tstart = function () {\n\t\t\t\t\tif (F.current && (F.current.loop || F.current.index < F.group.length - 1)) {\n\t\t\t\t\t\tF.player.isActive = true;\n\n\t\t\t\t\t\tD.bind({\n\t\t\t\t\t\t\t'onCancel.player beforeClose.player' : stop,\n\t\t\t\t\t\t\t'onUpdate.player'   : set,\n\t\t\t\t\t\t\t'beforeLoad.player' : clear\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tset();\n\n\t\t\t\t\t\tF.trigger('onPlayStart');\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\tif (action === true || (!F.player.isActive && action !== false)) {\n\t\t\t\tstart();\n\t\t\t} else {\n\t\t\t\tstop();\n\t\t\t}\n\t\t},\n\n\t\t// Navigate to next gallery item\n\t\tnext: function ( direction ) {\n\t\t\tvar current = F.current;\n\n\t\t\tif (current) {\n\t\t\t\tif (!isString(direction)) {\n\t\t\t\t\tdirection = current.direction.next;\n\t\t\t\t}\n\n\t\t\t\tF.jumpto(current.index + 1, direction, 'next');\n\t\t\t}\n\t\t},\n\n\t\t// Navigate to previous gallery item\n\t\tprev: function ( direction ) {\n\t\t\tvar current = F.current;\n\n\t\t\tif (current) {\n\t\t\t\tif (!isString(direction)) {\n\t\t\t\t\tdirection = current.direction.prev;\n\t\t\t\t}\n\n\t\t\t\tF.jumpto(current.index - 1, direction, 'prev');\n\t\t\t}\n\t\t},\n\n\t\t// Navigate to gallery item by index\n\t\tjumpto: function ( index, direction, router ) {\n\t\t\tvar current = F.current;\n\n\t\t\tif (!current) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tindex = getScalar(index);\n\n\t\t\tF.direction = direction || current.direction[ (index >= current.index ? 'next' : 'prev') ];\n\t\t\tF.router    = router || 'jumpto';\n\n\t\t\tif (current.loop) {\n\t\t\t\tif (index < 0) {\n\t\t\t\t\tindex = current.group.length + (index % current.group.length);\n\t\t\t\t}\n\n\t\t\t\tindex = index % current.group.length;\n\t\t\t}\n\n\t\t\tif (current.group[ index ] !== undefined) {\n\t\t\t\tF.cancel();\n\n\t\t\t\tF._start(index);\n\t\t\t}\n\t\t},\n\n\t\t// Center inside viewport and toggle position type to fixed or absolute if needed\n\t\treposition: function (e, onlyAbsolute) {\n\t\t\tvar current = F.current,\n\t\t\t\twrap    = current ? current.wrap : null,\n\t\t\t\tpos;\n\n\t\t\tif (wrap) {\n\t\t\t\tpos = F._getPosition(onlyAbsolute);\n\n\t\t\t\tif (e && e.type === 'scroll') {\n\t\t\t\t\tdelete pos.position;\n\n\t\t\t\t\twrap.stop(true, true).animate(pos, 200);\n\n\t\t\t\t} else {\n\t\t\t\t\twrap.css(pos);\n\n\t\t\t\t\tcurrent.pos = $.extend({}, current.dim, pos);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tupdate: function (e) {\n\t\t\tvar type = (e && e.type),\n\t\t\t\tanyway = !type || type === 'orientationchange';\n\n\t\t\tif (anyway) {\n\t\t\t\tclearTimeout(didUpdate);\n\n\t\t\t\tdidUpdate = null;\n\t\t\t}\n\n\t\t\tif (!F.isOpen || didUpdate) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdidUpdate = setTimeout(function() {\n\t\t\t\tvar current = F.current;\n\n\t\t\t\tif (!current || F.isClosing) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tF.wrap.removeClass('fancybox-tmp');\n\n\t\t\t\tif (anyway || type === 'load' || (type === 'resize' && current.autoResize)) {\n\t\t\t\t\tF._setDimension();\n\t\t\t\t}\n\n\t\t\t\tif (!(type === 'scroll' && current.canShrink)) {\n\t\t\t\t\tF.reposition(e);\n\t\t\t\t}\n\n\t\t\t\tF.trigger('onUpdate');\n\n\t\t\t\tdidUpdate = null;\n\n\t\t\t}, (anyway && !isTouch ? 0 : 300));\n\t\t},\n\n\t\t// Shrink content to fit inside viewport or restore if resized\n\t\ttoggle: function ( action ) {\n\t\t\tif (F.isOpen) {\n\t\t\t\tF.current.fitToView = $.type(action) === \"boolean\" ? action : !F.current.fitToView;\n\n\t\t\t\t// Help browser to restore document dimensions\n\t\t\t\tif (isTouch) {\n\t\t\t\t\tF.wrap.removeAttr('style').addClass('fancybox-tmp');\n\n\t\t\t\t\tF.trigger('onUpdate');\n\t\t\t\t}\n\n\t\t\t\tF.update();\n\t\t\t}\n\t\t},\n\n\t\thideLoading: function () {\n\t\t\tD.unbind('.loading');\n\n\t\t\t$('#fancybox-loading').remove();\n\t\t},\n\n\t\tshowLoading: function () {\n\t\t\tvar el, viewport;\n\n\t\t\tF.hideLoading();\n\n\t\t\tel = $('<div id=\"fancybox-loading\"><div></div></div>').click(F.cancel).appendTo('body');\n\n\t\t\t// If user will press the escape-button, the request will be canceled\n\t\t\tD.bind('keydown.loading', function(e) {\n\t\t\t\tif ((e.which || e.keyCode) === 27) {\n\t\t\t\t\te.preventDefault();\n\n\t\t\t\t\tF.cancel();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (!F.defaults.fixed) {\n\t\t\t\tviewport = F.getViewport();\n\n\t\t\t\tel.css({\n\t\t\t\t\tposition : 'absolute',\n\t\t\t\t\ttop  : (viewport.h * 0.5) + viewport.y,\n\t\t\t\t\tleft : (viewport.w * 0.5) + viewport.x\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tgetViewport: function () {\n\t\t\tvar locked = (F.current && F.current.locked) || false,\n\t\t\t\trez    = {\n\t\t\t\t\tx: W.scrollLeft(),\n\t\t\t\t\ty: W.scrollTop()\n\t\t\t\t};\n\n\t\t\tif (locked) {\n\t\t\t\trez.w = locked[0].clientWidth;\n\t\t\t\trez.h = locked[0].clientHeight;\n\n\t\t\t} else {\n\t\t\t\t// See http://bugs.jquery.com/ticket/6724\n\t\t\t\trez.w = isTouch && window.innerWidth  ? window.innerWidth  : W.width();\n\t\t\t\trez.h = isTouch && window.innerHeight ? window.innerHeight : W.height();\n\t\t\t}\n\n\t\t\treturn rez;\n\t\t},\n\n\t\t// Unbind the keyboard / clicking actions\n\t\tunbindEvents: function () {\n\t\t\tif (F.wrap && isQuery(F.wrap)) {\n\t\t\t\tF.wrap.unbind('.fb');\n\t\t\t}\n\n\t\t\tD.unbind('.fb');\n\t\t\tW.unbind('.fb');\n\t\t},\n\n\t\tbindEvents: function () {\n\t\t\tvar current = F.current,\n\t\t\t\tkeys;\n\n\t\t\tif (!current) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Changing document height on iOS devices triggers a 'resize' event,\n\t\t\t// that can change document height... repeating infinitely\n\t\t\tW.bind('orientationchange.fb' + (isTouch ? '' : ' resize.fb') + (current.autoCenter && !current.locked ? ' scroll.fb' : ''), F.update);\n\n\t\t\tkeys = current.keys;\n\n\t\t\tif (keys) {\n\t\t\t\tD.bind('keydown.fb', function (e) {\n\t\t\t\t\tvar code   = e.which || e.keyCode,\n\t\t\t\t\t\ttarget = e.target || e.srcElement;\n\n\t\t\t\t\t// Skip esc key if loading, because showLoading will cancel preloading\n\t\t\t\t\tif (code === 27 && F.coming) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Ignore key combinations and key events within form elements\n\t\t\t\t\tif (!e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey && !(target && (target.type || $(target).is('[contenteditable]')))) {\n\t\t\t\t\t\t$.each(keys, function(i, val) {\n\t\t\t\t\t\t\tif (current.group.length > 1 && val[ code ] !== undefined) {\n\t\t\t\t\t\t\t\tF[ i ]( val[ code ] );\n\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ($.inArray(code, val) > -1) {\n\t\t\t\t\t\t\t\tF[ i ] ();\n\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\treturn false;\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\n\t\t\tif ($.fn.mousewheel && current.mouseWheel) {\n\t\t\t\tF.wrap.bind('mousewheel.fb', function (e, delta, deltaX, deltaY) {\n\t\t\t\t\tvar target = e.target || null,\n\t\t\t\t\t\tparent = $(target),\n\t\t\t\t\t\tcanScroll = false;\n\n\t\t\t\t\twhile (parent.length) {\n\t\t\t\t\t\tif (canScroll || parent.is('.fancybox-skin') || parent.is('.fancybox-wrap')) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcanScroll = isScrollable( parent[0] );\n\t\t\t\t\t\tparent    = $(parent).parent();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (delta !== 0 && !canScroll) {\n\t\t\t\t\t\tif (F.group.length > 1 && !current.canShrink) {\n\t\t\t\t\t\t\tif (deltaY > 0 || deltaX > 0) {\n\t\t\t\t\t\t\t\tF.prev( deltaY > 0 ? 'down' : 'left' );\n\n\t\t\t\t\t\t\t} else if (deltaY < 0 || deltaX < 0) {\n\t\t\t\t\t\t\t\tF.next( deltaY < 0 ? 'up' : 'right' );\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\te.preventDefault();\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\ttrigger: function (event, o) {\n\t\t\tvar ret, obj = o || F.coming || F.current;\n\n\t\t\tif (!obj) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ($.isFunction( obj[event] )) {\n\t\t\t\tret = obj[event].apply(obj, Array.prototype.slice.call(arguments, 1));\n\t\t\t}\n\n\t\t\tif (ret === false) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (obj.helpers) {\n\t\t\t\t$.each(obj.helpers, function (helper, opts) {\n\t\t\t\t\tif (opts && F.helpers[helper] && $.isFunction(F.helpers[helper][event])) {\n\t\t\t\t\t\tF.helpers[helper][event]($.extend(true, {}, F.helpers[helper].defaults, opts), obj);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tD.trigger(event);\n\t\t},\n\n\t\tisImage: function (str) {\n\t\t\treturn isString(str) && str.match(/(^data:image\\/.*,)|(\\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\\?|#).*)?$)/i);\n\t\t},\n\n\t\tisSWF: function (str) {\n\t\t\treturn isString(str) && str.match(/\\.(swf)((\\?|#).*)?$/i);\n\t\t},\n\n\t\t_start: function (index) {\n\t\t\tvar coming = {},\n\t\t\t\tobj,\n\t\t\t\thref,\n\t\t\t\ttype,\n\t\t\t\tmargin,\n\t\t\t\tpadding;\n\n\t\t\tindex = getScalar( index );\n\t\t\tobj   = F.group[ index ] || null;\n\n\t\t\tif (!obj) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tcoming = $.extend(true, {}, F.opts, obj);\n\n\t\t\t// Convert margin and padding properties to array - top, right, bottom, left\n\t\t\tmargin  = coming.margin;\n\t\t\tpadding = coming.padding;\n\n\t\t\tif ($.type(margin) === 'number') {\n\t\t\t\tcoming.margin = [margin, margin, margin, margin];\n\t\t\t}\n\n\t\t\tif ($.type(padding) === 'number') {\n\t\t\t\tcoming.padding = [padding, padding, padding, padding];\n\t\t\t}\n\n\t\t\t// 'modal' propery is just a shortcut\n\t\t\tif (coming.modal) {\n\t\t\t\t$.extend(true, coming, {\n\t\t\t\t\tcloseBtn   : false,\n\t\t\t\t\tcloseClick : false,\n\t\t\t\t\tnextClick  : false,\n\t\t\t\t\tarrows     : false,\n\t\t\t\t\tmouseWheel : false,\n\t\t\t\t\tkeys       : null,\n\t\t\t\t\thelpers: {\n\t\t\t\t\t\toverlay : {\n\t\t\t\t\t\t\tcloseClick : false\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\t// 'autoSize' property is a shortcut, too\n\t\t\tif (coming.autoSize) {\n\t\t\t\tcoming.autoWidth = coming.autoHeight = true;\n\t\t\t}\n\n\t\t\tif (coming.width === 'auto') {\n\t\t\t\tcoming.autoWidth = true;\n\t\t\t}\n\n\t\t\tif (coming.height === 'auto') {\n\t\t\t\tcoming.autoHeight = true;\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Add reference to the group, so it`s possible to access from callbacks, example:\n\t\t\t * afterLoad : function() {\n\t\t\t *     this.title = 'Image ' + (this.index + 1) + ' of ' + this.group.length + (this.title ? ' - ' + this.title : '');\n\t\t\t * }\n\t\t\t */\n\n\t\t\tcoming.group  = F.group;\n\t\t\tcoming.index  = index;\n\n\t\t\t// Give a chance for callback or helpers to update coming item (type, title, etc)\n\t\t\tF.coming = coming;\n\n\t\t\tif (false === F.trigger('beforeLoad')) {\n\t\t\t\tF.coming = null;\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttype = coming.type;\n\t\t\thref = coming.href;\n\n\t\t\tif (!type) {\n\t\t\t\tF.coming = null;\n\n\t\t\t\t//If we can not determine content type then drop silently or display next/prev item if looping through gallery\n\t\t\t\tif (F.current && F.router && F.router !== 'jumpto') {\n\t\t\t\t\tF.current.index = index;\n\n\t\t\t\t\treturn F[ F.router ]( F.direction );\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tF.isActive = true;\n\n\t\t\tif (type === 'image' || type === 'swf') {\n\t\t\t\tcoming.autoHeight = coming.autoWidth = false;\n\t\t\t\tcoming.scrolling  = 'visible';\n\t\t\t}\n\n\t\t\tif (type === 'image') {\n\t\t\t\tcoming.aspectRatio = true;\n\t\t\t}\n\n\t\t\tif (type === 'iframe' && isTouch) {\n\t\t\t\tcoming.scrolling = 'scroll';\n\t\t\t}\n\n\t\t\t// Build the neccessary markup\n\t\t\tcoming.wrap = $(coming.tpl.wrap).addClass('fancybox-' + (isTouch ? 'mobile' : 'desktop') + ' fancybox-type-' + type + ' fancybox-tmp ' + coming.wrapCSS).appendTo( coming.parent || 'body' );\n\n\t\t\t$.extend(coming, {\n\t\t\t\tskin  : $('.fancybox-skin',  coming.wrap),\n\t\t\t\touter : $('.fancybox-outer', coming.wrap),\n\t\t\t\tinner : $('.fancybox-inner', coming.wrap)\n\t\t\t});\n\n\t\t\t$.each([\"Top\", \"Right\", \"Bottom\", \"Left\"], function(i, v) {\n\t\t\t\tcoming.skin.css('padding' + v, getValue(coming.padding[ i ]));\n\t\t\t});\n\n\t\t\tF.trigger('onReady');\n\n\t\t\t// Check before try to load; 'inline' and 'html' types need content, others - href\n\t\t\tif (type === 'inline' || type === 'html') {\n\t\t\t\tif (!coming.content || !coming.content.length) {\n\t\t\t\t\treturn F._error( 'content' );\n\t\t\t\t}\n\n\t\t\t} else if (!href) {\n\t\t\t\treturn F._error( 'href' );\n\t\t\t}\n\n\t\t\tif (type === 'image') {\n\t\t\t\tF._loadImage();\n\n\t\t\t} else if (type === 'ajax') {\n\t\t\t\tF._loadAjax();\n\n\t\t\t} else if (type === 'iframe') {\n\t\t\t\tF._loadIframe();\n\n\t\t\t} else {\n\t\t\t\tF._afterLoad();\n\t\t\t}\n\t\t},\n\n\t\t_error: function ( type ) {\n\t\t\t$.extend(F.coming, {\n\t\t\t\ttype       : 'html',\n\t\t\t\tautoWidth  : true,\n\t\t\t\tautoHeight : true,\n\t\t\t\tminWidth   : 0,\n\t\t\t\tminHeight  : 0,\n\t\t\t\tscrolling  : 'no',\n\t\t\t\thasError   : type,\n\t\t\t\tcontent    : F.coming.tpl.error\n\t\t\t});\n\n\t\t\tF._afterLoad();\n\t\t},\n\n\t\t_loadImage: function () {\n\t\t\t// Reset preload image so it is later possible to check \"complete\" property\n\t\t\tvar img = F.imgPreload = new Image();\n\n\t\t\timg.onload = function () {\n\t\t\t\tthis.onload = this.onerror = null;\n\n\t\t\t\tF.coming.width  = this.width / F.opts.pixelRatio;\n\t\t\t\tF.coming.height = this.height / F.opts.pixelRatio;\n\n\t\t\t\tF._afterLoad();\n\t\t\t};\n\n\t\t\timg.onerror = function () {\n\t\t\t\tthis.onload = this.onerror = null;\n\n\t\t\t\tF._error( 'image' );\n\t\t\t};\n\n\t\t\timg.src = F.coming.href;\n\n\t\t\tif (img.complete !== true) {\n\t\t\t\tF.showLoading();\n\t\t\t}\n\t\t},\n\n\t\t_loadAjax: function () {\n\t\t\tvar coming = F.coming;\n\n\t\t\tF.showLoading();\n\n\t\t\tF.ajaxLoad = $.ajax($.extend({}, coming.ajax, {\n\t\t\t\turl: coming.href,\n\t\t\t\terror: function (jqXHR, textStatus) {\n\t\t\t\t\tif (F.coming && textStatus !== 'abort') {\n\t\t\t\t\t\tF._error( 'ajax', jqXHR );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tF.hideLoading();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tsuccess: function (data, textStatus) {\n\t\t\t\t\tif (textStatus === 'success') {\n\t\t\t\t\t\tcoming.content = data;\n\n\t\t\t\t\t\tF._afterLoad();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}));\n\t\t},\n\n\t\t_loadIframe: function() {\n\t\t\tvar coming = F.coming,\n\t\t\t\tiframe = $(coming.tpl.iframe.replace(/\\{rnd\\}/g, new Date().getTime()))\n\t\t\t\t\t.attr('scrolling', isTouch ? 'auto' : coming.iframe.scrolling)\n\t\t\t\t\t.attr('src', coming.href);\n\n\t\t\t// This helps IE\n\t\t\t$(coming.wrap).bind('onReset', function () {\n\t\t\t\ttry {\n\t\t\t\t\t$(this).find('iframe').hide().attr('src', '//about:blank').end().empty();\n\t\t\t\t} catch (e) {}\n\t\t\t});\n\n\t\t\tif (coming.iframe.preload) {\n\t\t\t\tF.showLoading();\n\n\t\t\t\tiframe.one('load', function() {\n\t\t\t\t\t$(this).data('ready', 1);\n\n\t\t\t\t\t// iOS will lose scrolling if we resize\n\t\t\t\t\tif (!isTouch) {\n\t\t\t\t\t\t$(this).bind('load.fb', F.update);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Without this trick:\n\t\t\t\t\t//   - iframe won't scroll on iOS devices\n\t\t\t\t\t//   - IE7 sometimes displays empty iframe\n\t\t\t\t\t$(this).parents('.fancybox-wrap').width('100%').removeClass('fancybox-tmp').show();\n\n\t\t\t\t\tF._afterLoad();\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tcoming.content = iframe.appendTo( coming.inner );\n\n\t\t\tif (!coming.iframe.preload) {\n\t\t\t\tF._afterLoad();\n\t\t\t}\n\t\t},\n\n\t\t_preloadImages: function() {\n\t\t\tvar group   = F.group,\n\t\t\t\tcurrent = F.current,\n\t\t\t\tlen     = group.length,\n\t\t\t\tcnt     = current.preload ? Math.min(current.preload, len - 1) : 0,\n\t\t\t\titem,\n\t\t\t\ti;\n\n\t\t\tfor (i = 1; i <= cnt; i += 1) {\n\t\t\t\titem = group[ (current.index + i ) % len ];\n\n\t\t\t\tif (item.type === 'image' && item.href) {\n\t\t\t\t\tnew Image().src = item.href;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_afterLoad: function () {\n\t\t\tvar coming   = F.coming,\n\t\t\t\tprevious = F.current,\n\t\t\t\tplaceholder = 'fancybox-placeholder',\n\t\t\t\tcurrent,\n\t\t\t\tcontent,\n\t\t\t\ttype,\n\t\t\t\tscrolling,\n\t\t\t\thref,\n\t\t\t\tembed;\n\n\t\t\tF.hideLoading();\n\n\t\t\tif (!coming || F.isActive === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (false === F.trigger('afterLoad', coming, previous)) {\n\t\t\t\tcoming.wrap.stop(true).trigger('onReset').remove();\n\n\t\t\t\tF.coming = null;\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (previous) {\n\t\t\t\tF.trigger('beforeChange', previous);\n\n\t\t\t\tprevious.wrap.stop(true).removeClass('fancybox-opened')\n\t\t\t\t\t.find('.fancybox-item, .fancybox-nav')\n\t\t\t\t\t.remove();\n\t\t\t}\n\n\t\t\tF.unbindEvents();\n\n\t\t\tcurrent   = coming;\n\t\t\tcontent   = coming.content;\n\t\t\ttype      = coming.type;\n\t\t\tscrolling = coming.scrolling;\n\n\t\t\t$.extend(F, {\n\t\t\t\twrap  : current.wrap,\n\t\t\t\tskin  : current.skin,\n\t\t\t\touter : current.outer,\n\t\t\t\tinner : current.inner,\n\t\t\t\tcurrent  : current,\n\t\t\t\tprevious : previous\n\t\t\t});\n\n\t\t\thref = current.href;\n\n\t\t\tswitch (type) {\n\t\t\t\tcase 'inline':\n\t\t\t\tcase 'ajax':\n\t\t\t\tcase 'html':\n\t\t\t\t\tif (current.selector) {\n\t\t\t\t\t\tcontent = $('<div>').html(content).find(current.selector);\n\n\t\t\t\t\t} else if (isQuery(content)) {\n\t\t\t\t\t\tif (!content.data(placeholder)) {\n\t\t\t\t\t\t\tcontent.data(placeholder, $('<div class=\"' + placeholder + '\"></div>').insertAfter( content ).hide() );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontent = content.show().detach();\n\n\t\t\t\t\t\tcurrent.wrap.bind('onReset', function () {\n\t\t\t\t\t\t\tif ($(this).find(content).length) {\n\t\t\t\t\t\t\t\tcontent.hide().replaceAll( content.data(placeholder) ).data(placeholder, false);\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\tbreak;\n\n\t\t\t\tcase 'image':\n\t\t\t\t\tcontent = current.tpl.image.replace('{href}', href);\n\t\t\t\tbreak;\n\n\t\t\t\tcase 'swf':\n\t\t\t\t\tcontent = '<object id=\"fancybox-swf\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\"100%\" height=\"100%\"><param name=\"movie\" value=\"' + href + '\"></param>';\n\t\t\t\t\tembed   = '';\n\n\t\t\t\t\t$.each(current.swf, function(name, val) {\n\t\t\t\t\t\tcontent += '<param name=\"' + name + '\" value=\"' + val + '\"></param>';\n\t\t\t\t\t\tembed   += ' ' + name + '=\"' + val + '\"';\n\t\t\t\t\t});\n\n\t\t\t\t\tcontent += '<embed src=\"' + href + '\" type=\"application/x-shockwave-flash\" width=\"100%\" height=\"100%\"' + embed + '></embed></object>';\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (!(isQuery(content) && content.parent().is(current.inner))) {\n\t\t\t\tcurrent.inner.append( content );\n\t\t\t}\n\n\t\t\t// Give a chance for helpers or callbacks to update elements\n\t\t\tF.trigger('beforeShow');\n\n\t\t\t// Set scrolling before calculating dimensions\n\t\t\tcurrent.inner.css('overflow', scrolling === 'yes' ? 'scroll' : (scrolling === 'no' ? 'hidden' : scrolling));\n\n\t\t\t// Set initial dimensions and start position\n\t\t\tF._setDimension();\n\n\t\t\tF.reposition();\n\n\t\t\tF.isOpen = false;\n\t\t\tF.coming = null;\n\n\t\t\tF.bindEvents();\n\n\t\t\tif (!F.isOpened) {\n\t\t\t\t$('.fancybox-wrap').not( current.wrap ).stop(true).trigger('onReset').remove();\n\n\t\t\t} else if (previous.prevMethod) {\n\t\t\t\tF.transitions[ previous.prevMethod ]();\n\t\t\t}\n\n\t\t\tF.transitions[ F.isOpened ? current.nextMethod : current.openMethod ]();\n\n\t\t\tF._preloadImages();\n\t\t},\n\n\t\t_setDimension: function () {\n\t\t\tvar viewport   = F.getViewport(),\n\t\t\t\tsteps      = 0,\n\t\t\t\tcanShrink  = false,\n\t\t\t\tcanExpand  = false,\n\t\t\t\twrap       = F.wrap,\n\t\t\t\tskin       = F.skin,\n\t\t\t\tinner      = F.inner,\n\t\t\t\tcurrent    = F.current,\n\t\t\t\twidth      = current.width,\n\t\t\t\theight     = current.height,\n\t\t\t\tminWidth   = current.minWidth,\n\t\t\t\tminHeight  = current.minHeight,\n\t\t\t\tmaxWidth   = current.maxWidth,\n\t\t\t\tmaxHeight  = current.maxHeight,\n\t\t\t\tscrolling  = current.scrolling,\n\t\t\t\tscrollOut  = current.scrollOutside ? current.scrollbarWidth : 0,\n\t\t\t\tmargin     = current.margin,\n\t\t\t\twMargin    = getScalar(margin[1] + margin[3]),\n\t\t\t\thMargin    = getScalar(margin[0] + margin[2]),\n\t\t\t\twPadding,\n\t\t\t\thPadding,\n\t\t\t\twSpace,\n\t\t\t\thSpace,\n\t\t\t\torigWidth,\n\t\t\t\torigHeight,\n\t\t\t\torigMaxWidth,\n\t\t\t\torigMaxHeight,\n\t\t\t\tratio,\n\t\t\t\twidth_,\n\t\t\t\theight_,\n\t\t\t\tmaxWidth_,\n\t\t\t\tmaxHeight_,\n\t\t\t\tiframe,\n\t\t\t\tbody;\n\n\t\t\t// Reset dimensions so we could re-check actual size\n\t\t\twrap.add(skin).add(inner).width('auto').height('auto').removeClass('fancybox-tmp');\n\n\t\t\twPadding = getScalar(skin.outerWidth(true)  - skin.width());\n\t\t\thPadding = getScalar(skin.outerHeight(true) - skin.height());\n\n\t\t\t// Any space between content and viewport (margin, padding, border, title)\n\t\t\twSpace = wMargin + wPadding;\n\t\t\thSpace = hMargin + hPadding;\n\n\t\t\torigWidth  = isPercentage(width)  ? (viewport.w - wSpace) * getScalar(width)  / 100 : width;\n\t\t\torigHeight = isPercentage(height) ? (viewport.h - hSpace) * getScalar(height) / 100 : height;\n\n\t\t\tif (current.type === 'iframe') {\n\t\t\t\tiframe = current.content;\n\n\t\t\t\tif (current.autoHeight && iframe.data('ready') === 1) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (iframe[0].contentWindow.document.location) {\n\t\t\t\t\t\t\tinner.width( origWidth ).height(9999);\n\n\t\t\t\t\t\t\tbody = iframe.contents().find('body');\n\n\t\t\t\t\t\t\tif (scrollOut) {\n\t\t\t\t\t\t\t\tbody.css('overflow-x', 'hidden');\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\torigHeight = body.outerHeight(true);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} catch (e) {}\n\t\t\t\t}\n\n\t\t\t} else if (current.autoWidth || current.autoHeight) {\n\t\t\t\tinner.addClass( 'fancybox-tmp' );\n\n\t\t\t\t// Set width or height in case we need to calculate only one dimension\n\t\t\t\tif (!current.autoWidth) {\n\t\t\t\t\tinner.width( origWidth );\n\t\t\t\t}\n\n\t\t\t\tif (!current.autoHeight) {\n\t\t\t\t\tinner.height( origHeight );\n\t\t\t\t}\n\n\t\t\t\tif (current.autoWidth) {\n\t\t\t\t\torigWidth = inner.width();\n\t\t\t\t}\n\n\t\t\t\tif (current.autoHeight) {\n\t\t\t\t\torigHeight = inner.height();\n\t\t\t\t}\n\n\t\t\t\tinner.removeClass( 'fancybox-tmp' );\n\t\t\t}\n\n\t\t\twidth  = getScalar( origWidth );\n\t\t\theight = getScalar( origHeight );\n\n\t\t\tratio  = origWidth / origHeight;\n\n\t\t\t// Calculations for the content\n\t\t\tminWidth  = getScalar(isPercentage(minWidth) ? getScalar(minWidth, 'w') - wSpace : minWidth);\n\t\t\tmaxWidth  = getScalar(isPercentage(maxWidth) ? getScalar(maxWidth, 'w') - wSpace : maxWidth);\n\n\t\t\tminHeight = getScalar(isPercentage(minHeight) ? getScalar(minHeight, 'h') - hSpace : minHeight);\n\t\t\tmaxHeight = getScalar(isPercentage(maxHeight) ? getScalar(maxHeight, 'h') - hSpace : maxHeight);\n\n\t\t\t// These will be used to determine if wrap can fit in the viewport\n\t\t\torigMaxWidth  = maxWidth;\n\t\t\torigMaxHeight = maxHeight;\n\n\t\t\tif (current.fitToView) {\n\t\t\t\tmaxWidth  = Math.min(viewport.w - wSpace, maxWidth);\n\t\t\t\tmaxHeight = Math.min(viewport.h - hSpace, maxHeight);\n\t\t\t}\n\n\t\t\tmaxWidth_  = viewport.w - wMargin;\n\t\t\tmaxHeight_ = viewport.h - hMargin;\n\n\t\t\tif (current.aspectRatio) {\n\t\t\t\tif (width > maxWidth) {\n\t\t\t\t\twidth  = maxWidth;\n\t\t\t\t\theight = getScalar(width / ratio);\n\t\t\t\t}\n\n\t\t\t\tif (height > maxHeight) {\n\t\t\t\t\theight = maxHeight;\n\t\t\t\t\twidth  = getScalar(height * ratio);\n\t\t\t\t}\n\n\t\t\t\tif (width < minWidth) {\n\t\t\t\t\twidth  = minWidth;\n\t\t\t\t\theight = getScalar(width / ratio);\n\t\t\t\t}\n\n\t\t\t\tif (height < minHeight) {\n\t\t\t\t\theight = minHeight;\n\t\t\t\t\twidth  = getScalar(height * ratio);\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\twidth = Math.max(minWidth, Math.min(width, maxWidth));\n\n\t\t\t\tif (current.autoHeight && current.type !== 'iframe') {\n\t\t\t\t\tinner.width( width );\n\n\t\t\t\t\theight = inner.height();\n\t\t\t\t}\n\n\t\t\t\theight = Math.max(minHeight, Math.min(height, maxHeight));\n\t\t\t}\n\n\t\t\t// Try to fit inside viewport (including the title)\n\t\t\tif (current.fitToView) {\n\t\t\t\tinner.width( width ).height( height );\n\n\t\t\t\twrap.width( width + wPadding );\n\n\t\t\t\t// Real wrap dimensions\n\t\t\t\twidth_  = wrap.width();\n\t\t\t\theight_ = wrap.height();\n\n\t\t\t\tif (current.aspectRatio) {\n\t\t\t\t\twhile ((width_ > maxWidth_ || height_ > maxHeight_) && width > minWidth && height > minHeight) {\n\t\t\t\t\t\tif (steps++ > 19) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\theight = Math.max(minHeight, Math.min(maxHeight, height - 10));\n\t\t\t\t\t\twidth  = getScalar(height * ratio);\n\n\t\t\t\t\t\tif (width < minWidth) {\n\t\t\t\t\t\t\twidth  = minWidth;\n\t\t\t\t\t\t\theight = getScalar(width / ratio);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (width > maxWidth) {\n\t\t\t\t\t\t\twidth  = maxWidth;\n\t\t\t\t\t\t\theight = getScalar(width / ratio);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tinner.width( width ).height( height );\n\n\t\t\t\t\t\twrap.width( width + wPadding );\n\n\t\t\t\t\t\twidth_  = wrap.width();\n\t\t\t\t\t\theight_ = wrap.height();\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\t\t\t\t\twidth  = Math.max(minWidth,  Math.min(width,  width  - (width_  - maxWidth_)));\n\t\t\t\t\theight = Math.max(minHeight, Math.min(height, height - (height_ - maxHeight_)));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (scrollOut && scrolling === 'auto' && height < origHeight && (width + wPadding + scrollOut) < maxWidth_) {\n\t\t\t\twidth += scrollOut;\n\t\t\t}\n\n\t\t\tinner.width( width ).height( height );\n\n\t\t\twrap.width( width + wPadding );\n\n\t\t\twidth_  = wrap.width();\n\t\t\theight_ = wrap.height();\n\n\t\t\tcanShrink = (width_ > maxWidth_ || height_ > maxHeight_) && width > minWidth && height > minHeight;\n\t\t\tcanExpand = current.aspectRatio ? (width < origMaxWidth && height < origMaxHeight && width < origWidth && height < origHeight) : ((width < origMaxWidth || height < origMaxHeight) && (width < origWidth || height < origHeight));\n\n\t\t\t$.extend(current, {\n\t\t\t\tdim : {\n\t\t\t\t\twidth\t: getValue( width_ ),\n\t\t\t\t\theight\t: getValue( height_ )\n\t\t\t\t},\n\t\t\t\torigWidth  : origWidth,\n\t\t\t\torigHeight : origHeight,\n\t\t\t\tcanShrink  : canShrink,\n\t\t\t\tcanExpand  : canExpand,\n\t\t\t\twPadding   : wPadding,\n\t\t\t\thPadding   : hPadding,\n\t\t\t\twrapSpace  : height_ - skin.outerHeight(true),\n\t\t\t\tskinSpace  : skin.height() - height\n\t\t\t});\n\n\t\t\tif (!iframe && current.autoHeight && height > minHeight && height < maxHeight && !canExpand) {\n\t\t\t\tinner.height('auto');\n\t\t\t}\n\t\t},\n\n\t\t_getPosition: function (onlyAbsolute) {\n\t\t\tvar current  = F.current,\n\t\t\t\tviewport = F.getViewport(),\n\t\t\t\tmargin   = current.margin,\n\t\t\t\twidth    = F.wrap.width()  + margin[1] + margin[3],\n\t\t\t\theight   = F.wrap.height() + margin[0] + margin[2],\n\t\t\t\trez      = {\n\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\ttop  : margin[0],\n\t\t\t\t\tleft : margin[3]\n\t\t\t\t};\n\n\t\t\tif (current.autoCenter && current.fixed && !onlyAbsolute && height <= viewport.h && width <= viewport.w) {\n\t\t\t\trez.position = 'fixed';\n\n\t\t\t} else if (!current.locked) {\n\t\t\t\trez.top  += viewport.y;\n\t\t\t\trez.left += viewport.x;\n\t\t\t}\n\n\t\t\trez.top  = getValue(Math.max(rez.top,  rez.top  + ((viewport.h - height) * current.topRatio)));\n\t\t\trez.left = getValue(Math.max(rez.left, rez.left + ((viewport.w - width)  * current.leftRatio)));\n\n\t\t\treturn rez;\n\t\t},\n\n\t\t_afterZoomIn: function () {\n\t\t\tvar current = F.current;\n\n\t\t\tif (!current) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tF.isOpen = F.isOpened = true;\n\n\t\t\tF.wrap.css('overflow', 'visible').addClass('fancybox-opened');\n\n\t\t\tF.update();\n\n\t\t\t// Assign a click event\n\t\t\tif ( current.closeClick || (current.nextClick && F.group.length > 1) ) {\n\t\t\t\tF.inner.css('cursor', 'pointer').bind('click.fb', function(e) {\n\t\t\t\t\tif (!$(e.target).is('a') && !$(e.target).parent().is('a')) {\n\t\t\t\t\t\te.preventDefault();\n\n\t\t\t\t\t\tF[ current.closeClick ? 'close' : 'next' ]();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Create a close button\n\t\t\tif (current.closeBtn) {\n\t\t\t\t$(current.tpl.closeBtn).appendTo(F.skin).bind('click.fb', function(e) {\n\t\t\t\t\te.preventDefault();\n\n\t\t\t\t\tF.close();\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Create navigation arrows\n\t\t\tif (current.arrows && F.group.length > 1) {\n\t\t\t\tif (current.loop || current.index > 0) {\n\t\t\t\t\t$(current.tpl.prev).appendTo(F.outer).bind('click.fb', F.prev);\n\t\t\t\t}\n\n\t\t\t\tif (current.loop || current.index < F.group.length - 1) {\n\t\t\t\t\t$(current.tpl.next).appendTo(F.outer).bind('click.fb', F.next);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tF.trigger('afterShow');\n\n\t\t\t// Stop the slideshow if this is the last item\n\t\t\tif (!current.loop && current.index === current.group.length - 1) {\n\t\t\t\tF.play( false );\n\n\t\t\t} else if (F.opts.autoPlay && !F.player.isActive) {\n\t\t\t\tF.opts.autoPlay = false;\n\n\t\t\t\tF.play();\n\t\t\t}\n\t\t},\n\n\t\t_afterZoomOut: function ( obj ) {\n\t\t\tobj = obj || F.current;\n\n\t\t\t$('.fancybox-wrap').trigger('onReset').remove();\n\n\t\t\t$.extend(F, {\n\t\t\t\tgroup  : {},\n\t\t\t\topts   : {},\n\t\t\t\trouter : false,\n\t\t\t\tcurrent   : null,\n\t\t\t\tisActive  : false,\n\t\t\t\tisOpened  : false,\n\t\t\t\tisOpen    : false,\n\t\t\t\tisClosing : false,\n\t\t\t\twrap   : null,\n\t\t\t\tskin   : null,\n\t\t\t\touter  : null,\n\t\t\t\tinner  : null\n\t\t\t});\n\n\t\t\tF.trigger('afterClose', obj);\n\t\t}\n\t});\n\n\t/*\n\t *\tDefault transitions\n\t */\n\n\tF.transitions = {\n\t\tgetOrigPosition: function () {\n\t\t\tvar current  = F.current,\n\t\t\t\telement  = current.element,\n\t\t\t\torig     = current.orig,\n\t\t\t\tpos      = {},\n\t\t\t\twidth    = 50,\n\t\t\t\theight   = 50,\n\t\t\t\thPadding = current.hPadding,\n\t\t\t\twPadding = current.wPadding,\n\t\t\t\tviewport = F.getViewport();\n\n\t\t\tif (!orig && current.isDom && element.is(':visible')) {\n\t\t\t\torig = element.find('img:first');\n\n\t\t\t\tif (!orig.length) {\n\t\t\t\t\torig = element;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isQuery(orig)) {\n\t\t\t\tpos = orig.offset();\n\n\t\t\t\tif (orig.is('img')) {\n\t\t\t\t\twidth  = orig.outerWidth();\n\t\t\t\t\theight = orig.outerHeight();\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\tpos.top  = viewport.y + (viewport.h - height) * current.topRatio;\n\t\t\t\tpos.left = viewport.x + (viewport.w - width)  * current.leftRatio;\n\t\t\t}\n\n\t\t\tif (F.wrap.css('position') === 'fixed' || current.locked) {\n\t\t\t\tpos.top  -= viewport.y;\n\t\t\t\tpos.left -= viewport.x;\n\t\t\t}\n\n\t\t\tpos = {\n\t\t\t\ttop     : getValue(pos.top  - hPadding * current.topRatio),\n\t\t\t\tleft    : getValue(pos.left - wPadding * current.leftRatio),\n\t\t\t\twidth   : getValue(width  + wPadding),\n\t\t\t\theight  : getValue(height + hPadding)\n\t\t\t};\n\n\t\t\treturn pos;\n\t\t},\n\n\t\tstep: function (now, fx) {\n\t\t\tvar ratio,\n\t\t\t\tpadding,\n\t\t\t\tvalue,\n\t\t\t\tprop       = fx.prop,\n\t\t\t\tcurrent    = F.current,\n\t\t\t\twrapSpace  = current.wrapSpace,\n\t\t\t\tskinSpace  = current.skinSpace;\n\n\t\t\tif (prop === 'width' || prop === 'height') {\n\t\t\t\tratio = fx.end === fx.start ? 1 : (now - fx.start) / (fx.end - fx.start);\n\n\t\t\t\tif (F.isClosing) {\n\t\t\t\t\tratio = 1 - ratio;\n\t\t\t\t}\n\n\t\t\t\tpadding = prop === 'width' ? current.wPadding : current.hPadding;\n\t\t\t\tvalue   = now - padding;\n\n\t\t\t\tF.skin[ prop ](  getScalar( prop === 'width' ?  value : value - (wrapSpace * ratio) ) );\n\t\t\t\tF.inner[ prop ]( getScalar( prop === 'width' ?  value : value - (wrapSpace * ratio) - (skinSpace * ratio) ) );\n\t\t\t}\n\t\t},\n\n\t\tzoomIn: function () {\n\t\t\tvar current  = F.current,\n\t\t\t\tstartPos = current.pos,\n\t\t\t\teffect   = current.openEffect,\n\t\t\t\telastic  = effect === 'elastic',\n\t\t\t\tendPos   = $.extend({opacity : 1}, startPos);\n\n\t\t\t// Remove \"position\" property that breaks older IE\n\t\t\tdelete endPos.position;\n\n\t\t\tif (elastic) {\n\t\t\t\tstartPos = this.getOrigPosition();\n\n\t\t\t\tif (current.openOpacity) {\n\t\t\t\t\tstartPos.opacity = 0.1;\n\t\t\t\t}\n\n\t\t\t} else if (effect === 'fade') {\n\t\t\t\tstartPos.opacity = 0.1;\n\t\t\t}\n\n\t\t\tF.wrap.css(startPos).animate(endPos, {\n\t\t\t\tduration : effect === 'none' ? 0 : current.openSpeed,\n\t\t\t\teasing   : current.openEasing,\n\t\t\t\tstep     : elastic ? this.step : null,\n\t\t\t\tcomplete : F._afterZoomIn\n\t\t\t});\n\t\t},\n\n\t\tzoomOut: function () {\n\t\t\tvar current  = F.current,\n\t\t\t\teffect   = current.closeEffect,\n\t\t\t\telastic  = effect === 'elastic',\n\t\t\t\tendPos   = {opacity : 0.1};\n\n\t\t\tif (elastic) {\n\t\t\t\tendPos = this.getOrigPosition();\n\n\t\t\t\tif (current.closeOpacity) {\n\t\t\t\t\tendPos.opacity = 0.1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tF.wrap.animate(endPos, {\n\t\t\t\tduration : effect === 'none' ? 0 : current.closeSpeed,\n\t\t\t\teasing   : current.closeEasing,\n\t\t\t\tstep     : elastic ? this.step : null,\n\t\t\t\tcomplete : F._afterZoomOut\n\t\t\t});\n\t\t},\n\n\t\tchangeIn: function () {\n\t\t\tvar current   = F.current,\n\t\t\t\teffect    = current.nextEffect,\n\t\t\t\tstartPos  = current.pos,\n\t\t\t\tendPos    = { opacity : 1 },\n\t\t\t\tdirection = F.direction,\n\t\t\t\tdistance  = 200,\n\t\t\t\tfield;\n\n\t\t\tstartPos.opacity = 0.1;\n\n\t\t\tif (effect === 'elastic') {\n\t\t\t\tfield = direction === 'down' || direction === 'up' ? 'top' : 'left';\n\n\t\t\t\tif (direction === 'down' || direction === 'right') {\n\t\t\t\t\tstartPos[ field ] = getValue(getScalar(startPos[ field ]) - distance);\n\t\t\t\t\tendPos[ field ]   = '+=' + distance + 'px';\n\n\t\t\t\t} else {\n\t\t\t\t\tstartPos[ field ] = getValue(getScalar(startPos[ field ]) + distance);\n\t\t\t\t\tendPos[ field ]   = '-=' + distance + 'px';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Workaround for http://bugs.jquery.com/ticket/12273\n\t\t\tif (effect === 'none') {\n\t\t\t\tF._afterZoomIn();\n\n\t\t\t} else {\n\t\t\t\tF.wrap.css(startPos).animate(endPos, {\n\t\t\t\t\tduration : current.nextSpeed,\n\t\t\t\t\teasing   : current.nextEasing,\n\t\t\t\t\tcomplete : F._afterZoomIn\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tchangeOut: function () {\n\t\t\tvar previous  = F.previous,\n\t\t\t\teffect    = previous.prevEffect,\n\t\t\t\tendPos    = { opacity : 0.1 },\n\t\t\t\tdirection = F.direction,\n\t\t\t\tdistance  = 200;\n\n\t\t\tif (effect === 'elastic') {\n\t\t\t\tendPos[ direction === 'down' || direction === 'up' ? 'top' : 'left' ] = ( direction === 'up' || direction === 'left' ? '-' : '+' ) + '=' + distance + 'px';\n\t\t\t}\n\n\t\t\tprevious.wrap.animate(endPos, {\n\t\t\t\tduration : effect === 'none' ? 0 : previous.prevSpeed,\n\t\t\t\teasing   : previous.prevEasing,\n\t\t\t\tcomplete : function () {\n\t\t\t\t\t$(this).trigger('onReset').remove();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t};\n\n\t/*\n\t *\tOverlay helper\n\t */\n\n\tF.helpers.overlay = {\n\t\tdefaults : {\n\t\t\tcloseClick : true,      // if true, fancyBox will be closed when user clicks on the overlay\n\t\t\tspeedOut   : 200,       // duration of fadeOut animation\n\t\t\tshowEarly  : true,      // indicates if should be opened immediately or wait until the content is ready\n\t\t\tcss        : {},        // custom CSS properties\n\t\t\tlocked     : !isTouch,  // if true, the content will be locked into overlay\n\t\t\tfixed      : true       // if false, the overlay CSS position property will not be set to \"fixed\"\n\t\t},\n\n\t\toverlay : null,      // current handle\n\t\tfixed   : false,     // indicates if the overlay has position \"fixed\"\n\t\tel      : $('html'), // element that contains \"the lock\"\n\n\t\t// Public methods\n\t\tcreate : function(opts) {\n\t\t\topts = $.extend({}, this.defaults, opts);\n\n\t\t\tif (this.overlay) {\n\t\t\t\tthis.close();\n\t\t\t}\n\n\t\t\tthis.overlay = $('<div class=\"fancybox-overlay\"></div>').appendTo( F.coming ? F.coming.parent : opts.parent );\n\t\t\tthis.fixed   = false;\n\n\t\t\tif (opts.fixed && F.defaults.fixed) {\n\t\t\t\tthis.overlay.addClass('fancybox-overlay-fixed');\n\n\t\t\t\tthis.fixed = true;\n\t\t\t}\n\t\t},\n\n\t\topen : function(opts) {\n\t\t\tvar that = this;\n\n\t\t\topts = $.extend({}, this.defaults, opts);\n\n\t\t\tif (this.overlay) {\n\t\t\t\tthis.overlay.unbind('.overlay').width('auto').height('auto');\n\n\t\t\t} else {\n\t\t\t\tthis.create(opts);\n\t\t\t}\n\n\t\t\tif (!this.fixed) {\n\t\t\t\tW.bind('resize.overlay', $.proxy( this.update, this) );\n\n\t\t\t\tthis.update();\n\t\t\t}\n\n\t\t\tif (opts.closeClick) {\n\t\t\t\tthis.overlay.bind('click.overlay', function(e) {\n\t\t\t\t\tif ($(e.target).hasClass('fancybox-overlay')) {\n\t\t\t\t\t\tif (F.isActive) {\n\t\t\t\t\t\t\tF.close();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthat.close();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.overlay.css( opts.css ).show();\n\t\t},\n\n\t\tclose : function() {\n\t\t\tvar scrollV, scrollH;\n\n\t\t\tW.unbind('resize.overlay');\n\n\t\t\tif (this.el.hasClass('fancybox-lock')) {\n\t\t\t\t$('.fancybox-margin').removeClass('fancybox-margin');\n\n\t\t\t\tscrollV = W.scrollTop();\n\t\t\t\tscrollH = W.scrollLeft();\n\n\t\t\t\tthis.el.removeClass('fancybox-lock');\n\n\t\t\t\tW.scrollTop( scrollV ).scrollLeft( scrollH );\n\t\t\t}\n\n\t\t\t$('.fancybox-overlay').remove().hide();\n\n\t\t\t$.extend(this, {\n\t\t\t\toverlay : null,\n\t\t\t\tfixed   : false\n\t\t\t});\n\t\t},\n\n\t\t// Private, callbacks\n\n\t\tupdate : function () {\n\t\t\tvar width = '100%', offsetWidth;\n\n\t\t\t// Reset width/height so it will not mess\n\t\t\tthis.overlay.width(width).height('100%');\n\n\t\t\t// jQuery does not return reliable result for IE\n\t\t\tif (IE) {\n\t\t\t\toffsetWidth = Math.max(document.documentElement.offsetWidth, document.body.offsetWidth);\n\n\t\t\t\tif (D.width() > offsetWidth) {\n\t\t\t\t\twidth = D.width();\n\t\t\t\t}\n\n\t\t\t} else if (D.width() > W.width()) {\n\t\t\t\twidth = D.width();\n\t\t\t}\n\n\t\t\tthis.overlay.width(width).height(D.height());\n\t\t},\n\n\t\t// This is where we can manipulate DOM, because later it would cause iframes to reload\n\t\tonReady : function (opts, obj) {\n\t\t\tvar overlay = this.overlay;\n\n\t\t\t$('.fancybox-overlay').stop(true, true);\n\n\t\t\tif (!overlay) {\n\t\t\t\tthis.create(opts);\n\t\t\t}\n\n\t\t\tif (opts.locked && this.fixed && obj.fixed) {\n\t\t\t\tif (!overlay) {\n\t\t\t\t\tthis.margin = D.height() > W.height() ? $('html').css('margin-right').replace(\"px\", \"\") : false;\n\t\t\t\t}\n\n\t\t\t\tobj.locked = this.overlay.append( obj.wrap );\n\t\t\t\tobj.fixed  = false;\n\t\t\t}\n\n\t\t\tif (opts.showEarly === true) {\n\t\t\t\tthis.beforeShow.apply(this, arguments);\n\t\t\t}\n\t\t},\n\n\t\tbeforeShow : function(opts, obj) {\n\t\t\tvar scrollV, scrollH;\n\n\t\t\tif (obj.locked) {\n\t\t\t\tif (this.margin !== false) {\n\t\t\t\t\t$('*').filter(function(){\n\t\t\t\t\t\treturn ($(this).css('position') === 'fixed' && !$(this).hasClass(\"fancybox-overlay\") && !$(this).hasClass(\"fancybox-wrap\") );\n\t\t\t\t\t}).addClass('fancybox-margin');\n\n\t\t\t\t\tthis.el.addClass('fancybox-margin');\n\t\t\t\t}\n\n\t\t\t\tscrollV = W.scrollTop();\n\t\t\t\tscrollH = W.scrollLeft();\n\n\t\t\t\tthis.el.addClass('fancybox-lock');\n\n\t\t\t\tW.scrollTop( scrollV ).scrollLeft( scrollH );\n\t\t\t}\n\n\t\t\tthis.open(opts);\n\t\t},\n\n\t\tonUpdate : function() {\n\t\t\tif (!this.fixed) {\n\t\t\t\tthis.update();\n\t\t\t}\n\t\t},\n\n\t\tafterClose: function (opts) {\n\t\t\t// Remove overlay if exists and fancyBox is not opening\n\t\t\t// (e.g., it is not being open using afterClose callback)\n\t\t\t//if (this.overlay && !F.isActive) {\n\t\t\tif (this.overlay && !F.coming) {\n\t\t\t\tthis.overlay.fadeOut(opts.speedOut, $.proxy( this.close, this ));\n\t\t\t}\n\t\t}\n\t};\n\n\t/*\n\t *\tTitle helper\n\t */\n\n\tF.helpers.title = {\n\t\tdefaults : {\n\t\t\ttype     : 'float', // 'float', 'inside', 'outside' or 'over',\n\t\t\tposition : 'bottom' // 'top' or 'bottom'\n\t\t},\n\n\t\tbeforeShow: function (opts) {\n\t\t\tvar current = F.current,\n\t\t\t\ttext    = current.title,\n\t\t\t\ttype    = opts.type,\n\t\t\t\ttitle,\n\t\t\t\ttarget;\n\n\t\t\tif ($.isFunction(text)) {\n\t\t\t\ttext = text.call(current.element, current);\n\t\t\t}\n\n\t\t\tif (!isString(text) || $.trim(text) === '') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttitle = $('<div class=\"fancybox-title fancybox-title-' + type + '-wrap\">' + text + '</div>');\n\n\t\t\tswitch (type) {\n\t\t\t\tcase 'inside':\n\t\t\t\t\ttarget = F.skin;\n\t\t\t\tbreak;\n\n\t\t\t\tcase 'outside':\n\t\t\t\t\ttarget = F.wrap;\n\t\t\t\tbreak;\n\n\t\t\t\tcase 'over':\n\t\t\t\t\ttarget = F.inner;\n\t\t\t\tbreak;\n\n\t\t\t\tdefault: // 'float'\n\t\t\t\t\ttarget = F.skin;\n\n\t\t\t\t\ttitle.appendTo('body');\n\n\t\t\t\t\tif (IE) {\n\t\t\t\t\t\ttitle.width( title.width() );\n\t\t\t\t\t}\n\n\t\t\t\t\ttitle.wrapInner('<span class=\"child\"></span>');\n\n\t\t\t\t\t//Increase bottom margin so this title will also fit into viewport\n\t\t\t\t\tF.current.margin[2] += Math.abs( getScalar(title.css('margin-bottom')) );\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\ttitle[ (opts.position === 'top' ? 'prependTo'  : 'appendTo') ](target);\n\t\t}\n\t};\n\n\t// jQuery plugin initialization\n\t$.fn.fancybox = function (options) {\n\t\tvar index,\n\t\t\tthat     = $(this),\n\t\t\tselector = this.selector || '',\n\t\t\trun      = function(e) {\n\t\t\t\tvar what = $(this).blur(), idx = index, relType, relVal;\n\n\t\t\t\tif (!(e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) && !what.is('.fancybox-wrap')) {\n\t\t\t\t\trelType = options.groupAttr || 'data-fancybox-group';\n\t\t\t\t\trelVal  = what.attr(relType);\n\n\t\t\t\t\tif (!relVal) {\n\t\t\t\t\t\trelType = 'rel';\n\t\t\t\t\t\trelVal  = what.get(0)[ relType ];\n\t\t\t\t\t}\n\n\t\t\t\t\tif (relVal && relVal !== '' && relVal !== 'nofollow') {\n\t\t\t\t\t\twhat = selector.length ? $(selector) : that;\n\t\t\t\t\t\twhat = what.filter('[' + relType + '=\"' + relVal + '\"]');\n\t\t\t\t\t\tidx  = what.index(this);\n\t\t\t\t\t}\n\n\t\t\t\t\toptions.index = idx;\n\n\t\t\t\t\t// Stop an event from bubbling if everything is fine\n\t\t\t\t\tif (F.open(what, options) !== false) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\toptions = options || {};\n\t\tindex   = options.index || 0;\n\n\t\tif (!selector || options.live === false) {\n\t\t\tthat.unbind('click.fb-start').bind('click.fb-start', run);\n\n\t\t} else {\n\t\t\tD.undelegate(selector, 'click.fb-start').delegate(selector + \":not('.fancybox-item, .fancybox-nav')\", 'click.fb-start', run);\n\t\t}\n\n\t\tthis.filter('[data-fancybox-start=1]').trigger('click');\n\n\t\treturn this;\n\t};\n\n\t// Tests that need a body at doc ready\n\tD.ready(function() {\n\t\tvar w1, w2;\n\n\t\tif ( $.scrollbarWidth === undefined ) {\n\t\t\t// http://benalman.com/projects/jquery-misc-plugins/#scrollbarwidth\n\t\t\t$.scrollbarWidth = function() {\n\t\t\t\tvar parent = $('<div style=\"width:50px;height:50px;overflow:auto\"><div/></div>').appendTo('body'),\n\t\t\t\t\tchild  = parent.children(),\n\t\t\t\t\twidth  = child.innerWidth() - child.height( 99 ).innerWidth();\n\n\t\t\t\tparent.remove();\n\n\t\t\t\treturn width;\n\t\t\t};\n\t\t}\n\n\t\tif ( $.support.fixedPosition === undefined ) {\n\t\t\t$.support.fixedPosition = (function() {\n\t\t\t\tvar elem  = $('<div style=\"position:fixed;top:20px;\"></div>').appendTo('body'),\n\t\t\t\t\tfixed = ( elem[0].offsetTop === 20 || elem[0].offsetTop === 15 );\n\n\t\t\t\telem.remove();\n\n\t\t\t\treturn fixed;\n\t\t\t}());\n\t\t}\n\n\t\t$.extend(F.defaults, {\n\t\t\tscrollbarWidth : $.scrollbarWidth(),\n\t\t\tfixed  : $.support.fixedPosition,\n\t\t\tparent : $('body')\n\t\t});\n\n\t\t//Get real width of page scroll-bar\n\t\tw1 = $(window).width();\n\n\t\tH.addClass('fancybox-lock-test');\n\n\t\tw2 = $(window).width();\n\n\t\tH.removeClass('fancybox-lock-test');\n\n\t\t$(\"<style type='text/css'>.fancybox-margin{margin-right:\" + (w2 - w1) + \"px;}</style>\").appendTo(\"head\");\n\t});\n\n}(window, document, jQuery));\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/flot/curvedLines.js",
    "content": "/* The MIT License\n\n Copyright (c) 2011 by Michael Zinsmaier and nergal.dev\n Copyright (c) 2012 by Thomas Ritou\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in\n all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n THE SOFTWARE.\n */\n\n/*\n\n ____________________________________________________\n\n what it is:\n ____________________________________________________\n\n curvedLines is a plugin for flot, that tries to display lines in a smoother way.\n The plugin is based on nergal.dev's work https://code.google.com/p/flot/issues/detail?id=226\n and further extended with a mode that forces the min/max points of the curves to be on the\n points. Both modes are achieved through adding of more data points\n => 1) with large data sets you may get trouble\n => 2) if you want to display the points too, you have to plot them as 2nd data series over the lines\n\n && 3) consecutive x data points are not allowed to have the same value\n\n This is version 0.5 of curvedLines so it will probably not work in every case. However\n the basic form of use descirbed next works (:\n\n Feel free to further improve the code\n\n ____________________________________________________\n\n how to use it:\n ____________________________________________________\n\n var d1 = [[5,5],[7,3],[9,12]];\n\n var options = { series: { curvedLines: {  active: true }}};\n\n $.plot($(\"#placeholder\"), [{data = d1, lines: { show: true}, curvedLines: {apply: true}}], options);\n\n _____________________________________________________\n\n options:\n _____________________________________________________\n\n active:           bool true => plugin can be used\n apply:            bool true => series will be drawn as curved line\n fit:              bool true => forces the max,mins of the curve to be on the datapoints\n curvePointFactor  int  defines how many \"virtual\" points are used per \"real\" data point to\n emulate the curvedLines (points total = real points * curvePointFactor)\n fitPointDist:     int  defines the x axis distance of the additional two points that are used\n to enforce the min max condition.\n\n + line options (since v0.5 curved lines use flots line implementation for drawing\n => line options like fill, show ... are supported out of the box)\n\n */\n\n/*\n *  v0.1   initial commit\n *  v0.15  negative values should work now (outcommented a negative -> 0 hook hope it does no harm)\n *  v0.2   added fill option (thanks to monemihir) and multi axis support (thanks to soewono effendi)\n *  v0.3   improved saddle handling and added basic handling of Dates\n *  v0.4   rewritten fill option (thomas ritou) mostly from original flot code (now fill between points rather than to graph bottom), corrected fill Opacity bug\n *  v0.5   rewritten instead of implementing a own draw function CurvedLines is now based on the processDatapoints flot hook (credits go to thomas ritou).\n * \t\t   This change breakes existing code however CurvedLines are now just many tiny straight lines to flot and therefore all flot lines options (like gradient fill,\n * \t       shadow) are now supported out of the box\n *  v0.6   flot 0.8 compatibility and some bug fixes\n */\n\n(function($) {\n\n    var options = {\n        series : {\n            curvedLines : {\n                active : false,\n                apply: false,\n                fit : false,\n                curvePointFactor : 20,\n                fitPointDist : undefined\n            }\n        }\n    };\n\n    function init(plot) {\n\n        plot.hooks.processOptions.push(processOptions);\n\n        //if the plugin is active register processDatapoints method\n        function processOptions(plot, options) {\n            if (options.series.curvedLines.active) {\n                plot.hooks.processDatapoints.unshift(processDatapoints);\n            }\n        }\n\n        //only if the plugin is active\n        function processDatapoints(plot, series, datapoints) {\n            var nrPoints = datapoints.points.length / datapoints.pointsize;\n            var EPSILON = 0.5; //pretty large epsilon but save\n\n            if (series.curvedLines.apply == true && series.originSeries === undefined && nrPoints > (1 + EPSILON)) {\n                if (series.lines.fill) {\n\n                    var pointsTop = calculateCurvePoints(datapoints, series.curvedLines, 1)\n                        ,pointsBottom = calculateCurvePoints(datapoints, series.curvedLines, 2); //flot makes sure for us that we've got a second y point if fill is true !\n\n                    //Merge top and bottom curve\n                    datapoints.pointsize = 3;\n                    datapoints.points = [];\n                    var j = 0;\n                    var k = 0;\n                    var i = 0;\n                    var ps = 2;\n                    while (i < pointsTop.length || j < pointsBottom.length) {\n                        if (pointsTop[i] == pointsBottom[j]) {\n                            datapoints.points[k] = pointsTop[i];\n                            datapoints.points[k + 1] = pointsTop[i + 1];\n                            datapoints.points[k + 2] = pointsBottom[j + 1];\n                            j += ps;\n                            i += ps;\n\n                        } else if (pointsTop[i] < pointsBottom[j]) {\n                            datapoints.points[k] = pointsTop[i];\n                            datapoints.points[k + 1] = pointsTop[i + 1];\n                            datapoints.points[k + 2] = k > 0 ? datapoints.points[k-1] : null;\n                            i += ps;\n                        } else {\n                            datapoints.points[k] = pointsBottom[j];\n                            datapoints.points[k + 1] = k > 1 ? datapoints.points[k-2] : null;\n                            datapoints.points[k + 2] = pointsBottom[j + 1];\n                            j += ps;\n                        }\n                        k += 3;\n                    }\n                } else if (series.lines.lineWidth > 0) {\n                    datapoints.points = calculateCurvePoints(datapoints, series.curvedLines, 1);\n                    datapoints.pointsize = 2;\n                }\n            }\n        }\n\n        //no real idea whats going on here code mainly from https://code.google.com/p/flot/issues/detail?id=226\n        //if fit option is selected additional datapoints get inserted before the curve calculations in nergal.dev s code.\n        function calculateCurvePoints(datapoints, curvedLinesOptions, yPos) {\n\n            var points = datapoints.points, ps = datapoints.pointsize;\n            var num = curvedLinesOptions.curvePointFactor * (points.length / ps);\n\n            var xdata = new Array;\n            var ydata = new Array;\n\n            var curX = -1;\n            var curY = -1;\n            var j = 0;\n\n            if (curvedLinesOptions.fit) {\n                //insert a point before and after the \"real\" data point to force the line\n                //to have a max,min at the data point.\n\n                var fpDist;\n                if(typeof curvedLinesOptions.fitPointDist == 'undefined') {\n                    //estimate it\n                    var minX = points[0];\n                    var maxX = points[points.length-ps];\n                    fpDist = (maxX - minX) / (500 * 100); //x range / (estimated pixel length of placeholder * factor)\n                } else {\n                    //use user defined value\n                    fpDist = curvedLinesOptions.fitPointDist;\n                }\n\n                for (var i = 0; i < points.length; i += ps) {\n\n                    var frontX;\n                    var backX;\n                    curX = i;\n                    curY = i + yPos;\n\n                    //add point X s\n                    frontX = points[curX] - fpDist;\n                    backX = points[curX] + fpDist;\n\n                    var factor = 2;\n                    while (frontX == points[curX] || backX == points[curX]) {\n                        //inside the ulp\n                        frontX = points[curX] - (fpDist * factor);\n                        backX = points[curX] + (fpDist * factor);\n                        factor++;\n                    }\n\n                    //add curve points\n                    xdata[j] = frontX;\n                    ydata[j] = points[curY];\n                    j++;\n\n                    xdata[j] = points[curX];\n                    ydata[j] = points[curY];\n                    j++;\n\n                    xdata[j] = backX;\n                    ydata[j] = points[curY];\n                    j++;\n                }\n            } else {\n                //just use the datapoints\n                for (var i = 0; i < points.length; i += ps) {\n                    curX = i;\n                    curY = i + yPos;\n\n                    xdata[j] = points[curX];\n                    ydata[j] = points[curY];\n                    j++;\n                }\n            }\n\n            var n = xdata.length;\n\n            var y2 = new Array();\n            var delta = new Array();\n            y2[0] = 0;\n            y2[n - 1] = 0;\n            delta[0] = 0;\n\n            for (var i = 1; i < n - 1; ++i) {\n                var d = (xdata[i + 1] - xdata[i - 1]);\n                if (d == 0) {\n                    //point before current point and after current point need some space in between\n                    return [];\n                }\n\n                var s = (xdata[i] - xdata[i - 1]) / d;\n                var p = s * y2[i - 1] + 2;\n                y2[i] = (s - 1) / p;\n                delta[i] = (ydata[i + 1] - ydata[i]) / (xdata[i + 1] - xdata[i]) - (ydata[i] - ydata[i - 1]) / (xdata[i] - xdata[i - 1]);\n                delta[i] = (6 * delta[i] / (xdata[i + 1] - xdata[i - 1]) - s * delta[i - 1]) / p;\n            }\n\n            for (var j = n - 2; j >= 0; --j) {\n                y2[j] = y2[j] * y2[j + 1] + delta[j];\n            }\n\n            //   xmax  - xmin  / #points\n            var step = (xdata[n - 1] - xdata[0]) / (num - 1);\n\n            var xnew = new Array;\n            var ynew = new Array;\n            var result = new Array;\n\n            xnew[0] = xdata[0];\n            ynew[0] = ydata[0];\n\n            result.push(xnew[0]);\n            result.push(ynew[0]);\n\n            for ( j = 1; j < num; ++j) {\n                //new x point (sampling point for the created curve)\n                xnew[j] = xnew[0] + j * step;\n\n                var max = n - 1;\n                var min = 0;\n\n                while (max - min > 1) {\n                    var k = Math.round((max + min) / 2);\n                    if (xdata[k] > xnew[j]) {\n                        max = k;\n                    } else {\n                        min = k;\n                    }\n                }\n\n                //found point one to the left and one to the right of generated new point\n                var h = (xdata[max] - xdata[min]);\n\n                if (h == 0) {\n                    //similar to above two points from original x data need some space between them\n                    return [];\n                }\n\n                var a = (xdata[max] - xnew[j]) / h;\n                var b = (xnew[j] - xdata[min]) / h;\n\n                ynew[j] = a * ydata[min] + b * ydata[max] + ((a * a * a - a) * y2[min] + (b * b * b - b) * y2[max]) * (h * h) / 6;\n\n                result.push(xnew[j]);\n                result.push(ynew[j]);\n            }\n\n            return result;\n        }\n\n    }//end init\n\n    $.plot.plugins.push({\n        init : init,\n        options : options,\n        name : 'curvedLines',\n        version : '0.5'\n    });\n\n})(jQuery);\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/flot/jquery.flot.js",
    "content": "/*! Javascript plotting library for jQuery, v. 0.7.\n *\n * Released under the MIT license by IOLA, December 2007.\n *\n */\n\n// first an inline dependency, jquery.colorhelpers.js, we inline it here\n// for convenience\n\n/* Plugin for jQuery for working with colors.\n *\n * Version 1.1.\n *\n * Inspiration from jQuery color animation plugin by John Resig.\n *\n * Released under the MIT license by Ole Laursen, October 2009.\n *\n * Examples:\n *\n *   $.color.parse(\"#fff\").scale('rgb', 0.25).add('a', -0.5).toString()\n *   var c = $.color.extract($(\"#mydiv\"), 'background-color');\n *   console.log(c.r, c.g, c.b, c.a);\n *   $.color.make(100, 50, 25, 0.4).toString() // returns \"rgba(100,50,25,0.4)\"\n *\n * Note that .scale() and .add() return the same modified object\n * instead of making a new one.\n *\n * V. 1.1: Fix error handling so e.g. parsing an empty string does\n * produce a color rather than just crashing.\n */\n(function(B){B.color={};B.color.make=function(F,E,C,D){var G={};G.r=F||0;G.g=E||0;G.b=C||0;G.a=D!=null?D:1;G.add=function(J,I){for(var H=0;H<J.length;++H){G[J.charAt(H)]+=I}return G.normalize()};G.scale=function(J,I){for(var H=0;H<J.length;++H){G[J.charAt(H)]*=I}return G.normalize()};G.toString=function(){if(G.a>=1){return\"rgb(\"+[G.r,G.g,G.b].join(\",\")+\")\"}else{return\"rgba(\"+[G.r,G.g,G.b,G.a].join(\",\")+\")\"}};G.normalize=function(){function H(J,K,I){return K<J?J:(K>I?I:K)}G.r=H(0,parseInt(G.r),255);G.g=H(0,parseInt(G.g),255);G.b=H(0,parseInt(G.b),255);G.a=H(0,G.a,1);return G};G.clone=function(){return B.color.make(G.r,G.b,G.g,G.a)};return G.normalize()};B.color.extract=function(D,C){var E;do{E=D.css(C).toLowerCase();if(E!=\"\"&&E!=\"transparent\"){break}D=D.parent()}while(!B.nodeName(D.get(0),\"body\"));if(E==\"rgba(0, 0, 0, 0)\"){E=\"transparent\"}return B.color.parse(E)};B.color.parse=function(F){var E,C=B.color.make;if(E=/rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/.exec(F)){return C(parseInt(E[1],10),parseInt(E[2],10),parseInt(E[3],10))}if(E=/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(F)){return C(parseInt(E[1],10),parseInt(E[2],10),parseInt(E[3],10),parseFloat(E[4]))}if(E=/rgb\\(\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*\\)/.exec(F)){return C(parseFloat(E[1])*2.55,parseFloat(E[2])*2.55,parseFloat(E[3])*2.55)}if(E=/rgba\\(\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\s*\\)/.exec(F)){return C(parseFloat(E[1])*2.55,parseFloat(E[2])*2.55,parseFloat(E[3])*2.55,parseFloat(E[4]))}if(E=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(F)){return C(parseInt(E[1],16),parseInt(E[2],16),parseInt(E[3],16))}if(E=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(F)){return C(parseInt(E[1]+E[1],16),parseInt(E[2]+E[2],16),parseInt(E[3]+E[3],16))}var D=B.trim(F).toLowerCase();if(D==\"transparent\"){return C(255,255,255,0)}else{E=A[D]||[0,0,0];return C(E[0],E[1],E[2])}};var A={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);\n\n// the actual Flot code\n(function($) {\n    function Plot(placeholder, data_, options_, plugins) {\n        // data is on the form:\n        //   [ series1, series2 ... ]\n        // where series is either just the data as [ [x1, y1], [x2, y2], ... ]\n        // or { data: [ [x1, y1], [x2, y2], ... ], label: \"some label\", ... }\n\n        var series = [],\n            options = {\n                // the color theme used for graphs\n                colors: [\"#edc240\", \"#afd8f8\", \"#cb4b4b\", \"#4da74d\", \"#9440ed\"],\n                legend: {\n                    show: true,\n                    noColumns: 1, // number of colums in legend table\n                    labelFormatter: null, // fn: string -> string\n                    labelBoxBorderColor: \"#ccc\", // border color for the little label boxes\n                    container: null, // container (as jQuery object) to put legend in, null means default on top of graph\n                    position: \"ne\", // position of default legend container within plot\n                    margin: 5, // distance from grid edge to default legend container within plot\n                    backgroundColor: null, // null means auto-detect\n                    backgroundOpacity: 0.85 // set to 0 to avoid background\n                },\n                xaxis: {\n                    show: null, // null = auto-detect, true = always, false = never\n                    position: \"bottom\", // or \"top\"\n                    mode: null, // null or \"time\"\n                    color: null, // base color, labels, ticks\n                    tickColor: null, // possibly different color of ticks, e.g. \"rgba(0,0,0,0.15)\"\n                    transform: null, // null or f: number -> number to transform axis\n                    inverseTransform: null, // if transform is set, this should be the inverse function\n                    min: null, // min. value to show, null means set automatically\n                    max: null, // max. value to show, null means set automatically\n                    autoscaleMargin: null, // margin in % to add if auto-setting min/max\n                    ticks: null, // either [1, 3] or [[1, \"a\"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks\n                    tickFormatter: null, // fn: number -> string\n                    labelWidth: null, // size of tick labels in pixels\n                    labelHeight: null,\n                    reserveSpace: null, // whether to reserve space even if axis isn't shown\n                    tickLength: null, // size in pixels of ticks, or \"full\" for whole line\n                    alignTicksWithAxis: null, // axis number or null for no sync\n\n                    // mode specific options\n                    tickDecimals: null, // no. of decimals, null means auto\n                    tickSize: null, // number or [number, \"unit\"]\n                    minTickSize: null, // number or [number, \"unit\"]\n                    monthNames: null, // list of names of months\n                    timeformat: null, // format string to use\n                    twelveHourClock: false // 12 or 24 time in time mode\n                },\n                yaxis: {\n                    autoscaleMargin: 0.02,\n                    position: \"left\" // or \"right\"\n                },\n                xaxes: [],\n                yaxes: [],\n                series: {\n                    points: {\n                        show: false,\n                        radius: 3,\n                        lineWidth: 2, // in pixels\n                        fill: true,\n                        fillColor: \"#ffffff\",\n                        symbol: \"circle\" // or callback\n                    },\n                    lines: {\n                        // we don't put in show: false so we can see\n                        // whether lines were actively disabled\n                        lineWidth: 2, // in pixels\n                        fill: false,\n                        fillColor: null,\n                        steps: false\n                    },\n                    bars: {\n                        show: false,\n                        lineWidth: 2, // in pixels\n                        barWidth: 1, // in units of the x axis\n                        fill: true,\n                        fillColor: null,\n                        align: \"left\", // or \"center\"\n                        horizontal: false\n                    },\n                    shadowSize: 3\n                },\n                grid: {\n                    show: true,\n                    aboveData: false,\n                    color: \"#545454\", // primary color used for outline and labels\n                    backgroundColor: null, // null for transparent, else color\n                    borderColor: null, // set if different from the grid color\n                    tickColor: null, // color for the ticks, e.g. \"rgba(0,0,0,0.15)\"\n                    labelMargin: 5, // in pixels\n                    axisMargin: 8, // in pixels\n                    borderWidth: 2, // in pixels\n                    minBorderMargin: null, // in pixels, null means taken from points radius\n                    markings: null, // array of ranges or fn: axes -> array of ranges\n                    markingsColor: \"#f4f4f4\",\n                    markingsLineWidth: 2,\n                    // interactive stuff\n                    clickable: false,\n                    hoverable: false,\n                    autoHighlight: true, // highlight in case mouse is near\n                    mouseActiveRadius: 10 // how far the mouse can be away to activate an item\n                },\n                hooks: {}\n            },\n        canvas = null,      // the canvas for the plot itself\n        overlay = null,     // canvas for interactive stuff on top of plot\n        eventHolder = null, // jQuery object that events should be bound to\n        ctx = null, octx = null,\n        xaxes = [], yaxes = [],\n        plotOffset = { left: 0, right: 0, top: 0, bottom: 0},\n        canvasWidth = 0, canvasHeight = 0,\n        plotWidth = 0, plotHeight = 0,\n        hooks = {\n            processOptions: [],\n            processRawData: [],\n            processDatapoints: [],\n            drawSeries: [],\n            draw: [],\n            bindEvents: [],\n            drawOverlay: [],\n            shutdown: []\n        },\n        plot = this;\n\n        // public functions\n        plot.setData = setData;\n        plot.setupGrid = setupGrid;\n        plot.draw = draw;\n        plot.getPlaceholder = function() { return placeholder; };\n        plot.getCanvas = function() { return canvas; };\n        plot.getPlotOffset = function() { return plotOffset; };\n        plot.width = function () { return plotWidth; };\n        plot.height = function () { return plotHeight; };\n        plot.offset = function () {\n            var o = eventHolder.offset();\n            o.left += plotOffset.left;\n            o.top += plotOffset.top;\n            return o;\n        };\n        plot.getData = function () { return series; };\n        plot.getAxes = function () {\n            var res = {}, i;\n            $.each(xaxes.concat(yaxes), function (_, axis) {\n                if (axis)\n                    res[axis.direction + (axis.n != 1 ? axis.n : \"\") + \"axis\"] = axis;\n            });\n            return res;\n        };\n        plot.getXAxes = function () { return xaxes; };\n        plot.getYAxes = function () { return yaxes; };\n        plot.c2p = canvasToAxisCoords;\n        plot.p2c = axisToCanvasCoords;\n        plot.getOptions = function () { return options; };\n        plot.highlight = highlight;\n        plot.unhighlight = unhighlight;\n        plot.triggerRedrawOverlay = triggerRedrawOverlay;\n        plot.pointOffset = function(point) {\n            return {\n                left: parseInt(xaxes[axisNumber(point, \"x\") - 1].p2c(+point.x) + plotOffset.left),\n                top: parseInt(yaxes[axisNumber(point, \"y\") - 1].p2c(+point.y) + plotOffset.top)\n            };\n        };\n        plot.shutdown = shutdown;\n        plot.resize = function () {\n            getCanvasDimensions();\n            resizeCanvas(canvas);\n            resizeCanvas(overlay);\n        };\n\n        // public attributes\n        plot.hooks = hooks;\n\n        // initialize\n        initPlugins(plot);\n        parseOptions(options_);\n        setupCanvases();\n        setData(data_);\n        setupGrid();\n        draw();\n        bindEvents();\n\n\n        function executeHooks(hook, args) {\n            args = [plot].concat(args);\n            for (var i = 0; i < hook.length; ++i)\n                hook[i].apply(this, args);\n        }\n\n        function initPlugins() {\n            for (var i = 0; i < plugins.length; ++i) {\n                var p = plugins[i];\n                p.init(plot);\n                if (p.options)\n                    $.extend(true, options, p.options);\n            }\n        }\n\n        function parseOptions(opts) {\n            var i;\n\n            $.extend(true, options, opts);\n\n            if (options.xaxis.color == null)\n                options.xaxis.color = options.grid.color;\n            if (options.yaxis.color == null)\n                options.yaxis.color = options.grid.color;\n\n            if (options.xaxis.tickColor == null) // backwards-compatibility\n                options.xaxis.tickColor = options.grid.tickColor;\n            if (options.yaxis.tickColor == null) // backwards-compatibility\n                options.yaxis.tickColor = options.grid.tickColor;\n\n            if (options.grid.borderColor == null)\n                options.grid.borderColor = options.grid.color;\n            if (options.grid.tickColor == null)\n                options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString();\n\n            // fill in defaults in axes, copy at least always the\n            // first as the rest of the code assumes it'll be there\n            for (i = 0; i < Math.max(1, options.xaxes.length); ++i)\n                options.xaxes[i] = $.extend(true, {}, options.xaxis, options.xaxes[i]);\n            for (i = 0; i < Math.max(1, options.yaxes.length); ++i)\n                options.yaxes[i] = $.extend(true, {}, options.yaxis, options.yaxes[i]);\n\n            // backwards compatibility, to be removed in future\n            if (options.xaxis.noTicks && options.xaxis.ticks == null)\n                options.xaxis.ticks = options.xaxis.noTicks;\n            if (options.yaxis.noTicks && options.yaxis.ticks == null)\n                options.yaxis.ticks = options.yaxis.noTicks;\n            if (options.x2axis) {\n                options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis);\n                options.xaxes[1].position = \"top\";\n            }\n            if (options.y2axis) {\n                options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis);\n                options.yaxes[1].position = \"right\";\n            }\n            if (options.grid.coloredAreas)\n                options.grid.markings = options.grid.coloredAreas;\n            if (options.grid.coloredAreasColor)\n                options.grid.markingsColor = options.grid.coloredAreasColor;\n            if (options.lines)\n                $.extend(true, options.series.lines, options.lines);\n            if (options.points)\n                $.extend(true, options.series.points, options.points);\n            if (options.bars)\n                $.extend(true, options.series.bars, options.bars);\n            if (options.shadowSize != null)\n                options.series.shadowSize = options.shadowSize;\n\n            // save options on axes for future reference\n            for (i = 0; i < options.xaxes.length; ++i)\n                getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i];\n            for (i = 0; i < options.yaxes.length; ++i)\n                getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i];\n\n            // add hooks from options\n            for (var n in hooks)\n                if (options.hooks[n] && options.hooks[n].length)\n                    hooks[n] = hooks[n].concat(options.hooks[n]);\n\n            executeHooks(hooks.processOptions, [options]);\n        }\n\n        function setData(d) {\n            series = parseData(d);\n            fillInSeriesOptions();\n            processData();\n        }\n\n        function parseData(d) {\n            var res = [];\n            for (var i = 0; i < d.length; ++i) {\n                var s = $.extend(true, {}, options.series);\n\n                if (d[i].data != null) {\n                    s.data = d[i].data; // move the data instead of deep-copy\n                    delete d[i].data;\n\n                    $.extend(true, s, d[i]);\n\n                    d[i].data = s.data;\n                }\n                else\n                    s.data = d[i];\n                res.push(s);\n            }\n\n            return res;\n        }\n\n        function axisNumber(obj, coord) {\n            var a = obj[coord + \"axis\"];\n            if (typeof a == \"object\") // if we got a real axis, extract number\n                a = a.n;\n            if (typeof a != \"number\")\n                a = 1; // default to first axis\n            return a;\n        }\n\n        function allAxes() {\n            // return flat array without annoying null entries\n            return $.grep(xaxes.concat(yaxes), function (a) { return a; });\n        }\n\n        function canvasToAxisCoords(pos) {\n            // return an object with x/y corresponding to all used axes\n            var res = {}, i, axis;\n            for (i = 0; i < xaxes.length; ++i) {\n                axis = xaxes[i];\n                if (axis && axis.used)\n                    res[\"x\" + axis.n] = axis.c2p(pos.left);\n            }\n\n            for (i = 0; i < yaxes.length; ++i) {\n                axis = yaxes[i];\n                if (axis && axis.used)\n                    res[\"y\" + axis.n] = axis.c2p(pos.top);\n            }\n\n            if (res.x1 !== undefined)\n                res.x = res.x1;\n            if (res.y1 !== undefined)\n                res.y = res.y1;\n\n            return res;\n        }\n\n        function axisToCanvasCoords(pos) {\n            // get canvas coords from the first pair of x/y found in pos\n            var res = {}, i, axis, key;\n\n            for (i = 0; i < xaxes.length; ++i) {\n                axis = xaxes[i];\n                if (axis && axis.used) {\n                    key = \"x\" + axis.n;\n                    if (pos[key] == null && axis.n == 1)\n                        key = \"x\";\n\n                    if (pos[key] != null) {\n                        res.left = axis.p2c(pos[key]);\n                        break;\n                    }\n                }\n            }\n\n            for (i = 0; i < yaxes.length; ++i) {\n                axis = yaxes[i];\n                if (axis && axis.used) {\n                    key = \"y\" + axis.n;\n                    if (pos[key] == null && axis.n == 1)\n                        key = \"y\";\n\n                    if (pos[key] != null) {\n                        res.top = axis.p2c(pos[key]);\n                        break;\n                    }\n                }\n            }\n\n            return res;\n        }\n\n        function getOrCreateAxis(axes, number) {\n            if (!axes[number - 1])\n                axes[number - 1] = {\n                    n: number, // save the number for future reference\n                    direction: axes == xaxes ? \"x\" : \"y\",\n                    options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis)\n                };\n\n            return axes[number - 1];\n        }\n\n        function fillInSeriesOptions() {\n            var i;\n\n            // collect what we already got of colors\n            var neededColors = series.length,\n                usedColors = [],\n                assignedColors = [];\n            for (i = 0; i < series.length; ++i) {\n                var sc = series[i].color;\n                if (sc != null) {\n                    --neededColors;\n                    if (typeof sc == \"number\")\n                        assignedColors.push(sc);\n                    else\n                        usedColors.push($.color.parse(series[i].color));\n                }\n            }\n\n            // we might need to generate more colors if higher indices\n            // are assigned\n            for (i = 0; i < assignedColors.length; ++i) {\n                neededColors = Math.max(neededColors, assignedColors[i] + 1);\n            }\n\n            // produce colors as needed\n            var colors = [], variation = 0;\n            i = 0;\n            while (colors.length < neededColors) {\n                var c;\n                if (options.colors.length == i) // check degenerate case\n                    c = $.color.make(100, 100, 100);\n                else\n                    c = $.color.parse(options.colors[i]);\n\n                // vary color if needed\n                var sign = variation % 2 == 1 ? -1 : 1;\n                c.scale('rgb', 1 + sign * Math.ceil(variation / 2) * 0.2)\n\n                // FIXME: if we're getting to close to something else,\n                // we should probably skip this one\n                colors.push(c);\n\n                ++i;\n                if (i >= options.colors.length) {\n                    i = 0;\n                    ++variation;\n                }\n            }\n\n            // fill in the options\n            var colori = 0, s;\n            for (i = 0; i < series.length; ++i) {\n                s = series[i];\n\n                // assign colors\n                if (s.color == null) {\n                    s.color = colors[colori].toString();\n                    ++colori;\n                }\n                else if (typeof s.color == \"number\")\n                    s.color = colors[s.color].toString();\n\n                // turn on lines automatically in case nothing is set\n                if (s.lines.show == null) {\n                    var v, show = true;\n                    for (v in s)\n                        if (s[v] && s[v].show) {\n                            show = false;\n                            break;\n                        }\n                    if (show)\n                        s.lines.show = true;\n                }\n\n                // setup axes\n                s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, \"x\"));\n                s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, \"y\"));\n            }\n        }\n\n        function processData() {\n            var topSentry = Number.POSITIVE_INFINITY,\n                bottomSentry = Number.NEGATIVE_INFINITY,\n                fakeInfinity = Number.MAX_VALUE,\n                i, j, k, m, length,\n                s, points, ps, x, y, axis, val, f, p;\n\n            function updateAxis(axis, min, max) {\n                if (min < axis.datamin && min != -fakeInfinity)\n                    axis.datamin = min;\n                if (max > axis.datamax && max != fakeInfinity)\n                    axis.datamax = max;\n            }\n\n            $.each(allAxes(), function (_, axis) {\n                // init axis\n                axis.datamin = topSentry;\n                axis.datamax = bottomSentry;\n                axis.used = false;\n            });\n\n            for (i = 0; i < series.length; ++i) {\n                s = series[i];\n                s.datapoints = { points: [] };\n\n                executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]);\n            }\n\n            // first pass: clean and copy data\n            for (i = 0; i < series.length; ++i) {\n                s = series[i];\n\n                var data = s.data, format = s.datapoints.format;\n\n                if (!format) {\n                    format = [];\n                    // find out how to copy\n                    format.push({ x: true, number: true, required: true });\n                    format.push({ y: true, number: true, required: true });\n\n                    if (s.bars.show || (s.lines.show && s.lines.fill)) {\n                        format.push({ y: true, number: true, required: false, defaultValue: 0 });\n                        if (s.bars.horizontal) {\n                            delete format[format.length - 1].y;\n                            format[format.length - 1].x = true;\n                        }\n                    }\n\n                    s.datapoints.format = format;\n                }\n\n                if (s.datapoints.pointsize != null)\n                    continue; // already filled in\n\n                s.datapoints.pointsize = format.length;\n\n                ps = s.datapoints.pointsize;\n                points = s.datapoints.points;\n\n                insertSteps = s.lines.show && s.lines.steps;\n                s.xaxis.used = s.yaxis.used = true;\n\n                for (j = k = 0; j < data.length; ++j, k += ps) {\n                    p = data[j];\n\n                    var nullify = p == null;\n                    if (!nullify) {\n                        for (m = 0; m < ps; ++m) {\n                            val = p[m];\n                            f = format[m];\n\n                            if (f) {\n                                if (f.number && val != null) {\n                                    val = +val; // convert to number\n                                    if (isNaN(val))\n                                        val = null;\n                                    else if (val == Infinity)\n                                        val = fakeInfinity;\n                                    else if (val == -Infinity)\n                                        val = -fakeInfinity;\n                                }\n\n                                if (val == null) {\n                                    if (f.required)\n                                        nullify = true;\n\n                                    if (f.defaultValue != null)\n                                        val = f.defaultValue;\n                                }\n                            }\n\n                            points[k + m] = val;\n                        }\n                    }\n\n                    if (nullify) {\n                        for (m = 0; m < ps; ++m) {\n                            val = points[k + m];\n                            if (val != null) {\n                                f = format[m];\n                                // extract min/max info\n                                if (f.x)\n                                    updateAxis(s.xaxis, val, val);\n                                if (f.y)\n                                    updateAxis(s.yaxis, val, val);\n                            }\n                            points[k + m] = null;\n                        }\n                    }\n                    else {\n                        // a little bit of line specific stuff that\n                        // perhaps shouldn't be here, but lacking\n                        // better means...\n                        if (insertSteps && k > 0\n                            && points[k - ps] != null\n                            && points[k - ps] != points[k]\n                            && points[k - ps + 1] != points[k + 1]) {\n                            // copy the point to make room for a middle point\n                            for (m = 0; m < ps; ++m)\n                                points[k + ps + m] = points[k + m];\n\n                            // middle point has same y\n                            points[k + 1] = points[k - ps + 1];\n\n                            // we've added a point, better reflect that\n                            k += ps;\n                        }\n                    }\n                }\n            }\n\n            // give the hooks a chance to run\n            for (i = 0; i < series.length; ++i) {\n                s = series[i];\n\n                executeHooks(hooks.processDatapoints, [ s, s.datapoints]);\n            }\n\n            // second pass: find datamax/datamin for auto-scaling\n            for (i = 0; i < series.length; ++i) {\n                s = series[i];\n                points = s.datapoints.points,\n                ps = s.datapoints.pointsize;\n\n                var xmin = topSentry, ymin = topSentry,\n                    xmax = bottomSentry, ymax = bottomSentry;\n\n                for (j = 0; j < points.length; j += ps) {\n                    if (points[j] == null)\n                        continue;\n\n                    for (m = 0; m < ps; ++m) {\n                        val = points[j + m];\n                        f = format[m];\n                        if (!f || val == fakeInfinity || val == -fakeInfinity)\n                            continue;\n\n                        if (f.x) {\n                            if (val < xmin)\n                                xmin = val;\n                            if (val > xmax)\n                                xmax = val;\n                        }\n                        if (f.y) {\n                            if (val < ymin)\n                                ymin = val;\n                            if (val > ymax)\n                                ymax = val;\n                        }\n                    }\n                }\n\n                if (s.bars.show) {\n                    // make sure we got room for the bar on the dancing floor\n                    var delta = s.bars.align == \"left\" ? 0 : -s.bars.barWidth/2;\n                    if (s.bars.horizontal) {\n                        ymin += delta;\n                        ymax += delta + s.bars.barWidth;\n                    }\n                    else {\n                        xmin += delta;\n                        xmax += delta + s.bars.barWidth;\n                    }\n                }\n\n                updateAxis(s.xaxis, xmin, xmax);\n                updateAxis(s.yaxis, ymin, ymax);\n            }\n\n            $.each(allAxes(), function (_, axis) {\n                if (axis.datamin == topSentry)\n                    axis.datamin = null;\n                if (axis.datamax == bottomSentry)\n                    axis.datamax = null;\n            });\n        }\n\n        function makeCanvas(skipPositioning, cls) {\n            var c = document.createElement('canvas');\n            c.className = cls;\n            c.width = canvasWidth;\n            c.height = canvasHeight;\n\n            if (!skipPositioning)\n                $(c).css({ position: 'absolute', left: 0, top: 0 });\n\n            $(c).appendTo(placeholder);\n\n            if (!c.getContext) // excanvas hack\n                c = window.G_vmlCanvasManager.initElement(c);\n\n            // used for resetting in case we get replotted\n            c.getContext(\"2d\").save();\n\n            return c;\n        }\n\n        function getCanvasDimensions() {\n            canvasWidth = placeholder.width();\n            canvasHeight = placeholder.height();\n\n            if (canvasWidth <= 0 || canvasHeight <= 0)\n                throw \"Invalid dimensions for plot, width = \" + canvasWidth + \", height = \" + canvasHeight;\n        }\n\n        function resizeCanvas(c) {\n            // resizing should reset the state (excanvas seems to be\n            // buggy though)\n            if (c.width != canvasWidth)\n                c.width = canvasWidth;\n\n            if (c.height != canvasHeight)\n                c.height = canvasHeight;\n\n            // so try to get back to the initial state (even if it's\n            // gone now, this should be safe according to the spec)\n            var cctx = c.getContext(\"2d\");\n            cctx.restore();\n\n            // and save again\n            cctx.save();\n        }\n\n        function setupCanvases() {\n            var reused,\n                existingCanvas = placeholder.children(\"canvas.base\"),\n                existingOverlay = placeholder.children(\"canvas.overlay\");\n\n            if (existingCanvas.length == 0 || existingOverlay == 0) {\n                // init everything\n\n                placeholder.html(\"\"); // make sure placeholder is clear\n\n                placeholder.css({ padding: 0 }); // padding messes up the positioning\n\n                if (placeholder.css(\"position\") == 'static')\n                    placeholder.css(\"position\", \"relative\"); // for positioning labels and overlay\n\n                getCanvasDimensions();\n\n                canvas = makeCanvas(true, \"base\");\n                overlay = makeCanvas(false, \"overlay\"); // overlay canvas for interactive features\n\n                reused = false;\n            }\n            else {\n                // reuse existing elements\n\n                canvas = existingCanvas.get(0);\n                overlay = existingOverlay.get(0);\n\n                reused = true;\n            }\n\n            ctx = canvas.getContext(\"2d\");\n            octx = overlay.getContext(\"2d\");\n\n            // we include the canvas in the event holder too, because IE 7\n            // sometimes has trouble with the stacking order\n            eventHolder = $([overlay, canvas]);\n\n            if (reused) {\n                // run shutdown in the old plot object\n                placeholder.data(\"plot\").shutdown();\n\n                // reset reused canvases\n                plot.resize();\n\n                // make sure overlay pixels are cleared (canvas is cleared when we redraw)\n                octx.clearRect(0, 0, canvasWidth, canvasHeight);\n\n                // then whack any remaining obvious garbage left\n                eventHolder.unbind();\n                placeholder.children().not([canvas, overlay]).remove();\n            }\n\n            // save in case we get replotted\n            placeholder.data(\"plot\", plot);\n        }\n\n        function bindEvents() {\n            // bind events\n            if (options.grid.hoverable) {\n                eventHolder.mousemove(onMouseMove);\n                eventHolder.mouseleave(onMouseLeave);\n            }\n\n            if (options.grid.clickable)\n                eventHolder.click(onClick);\n\n            executeHooks(hooks.bindEvents, [eventHolder]);\n        }\n\n        function shutdown() {\n            if (redrawTimeout)\n                clearTimeout(redrawTimeout);\n\n            eventHolder.unbind(\"mousemove\", onMouseMove);\n            eventHolder.unbind(\"mouseleave\", onMouseLeave);\n            eventHolder.unbind(\"click\", onClick);\n\n            executeHooks(hooks.shutdown, [eventHolder]);\n        }\n\n        function setTransformationHelpers(axis) {\n            // set helper functions on the axis, assumes plot area\n            // has been computed already\n\n            function identity(x) { return x; }\n\n            var s, m, t = axis.options.transform || identity,\n                it = axis.options.inverseTransform;\n\n            // precompute how much the axis is scaling a point\n            // in canvas space\n            if (axis.direction == \"x\") {\n                s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min));\n                m = Math.min(t(axis.max), t(axis.min));\n            }\n            else {\n                s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min));\n                s = -s;\n                m = Math.max(t(axis.max), t(axis.min));\n            }\n\n            // data point to canvas coordinate\n            if (t == identity) // slight optimization\n                axis.p2c = function (p) { return (p - m) * s; };\n            else\n                axis.p2c = function (p) { return (t(p) - m) * s; };\n            // canvas coordinate to data point\n            if (!it)\n                axis.c2p = function (c) { return m + c / s; };\n            else\n                axis.c2p = function (c) { return it(m + c / s); };\n        }\n\n        function measureTickLabels(axis) {\n            var opts = axis.options, i, ticks = axis.ticks || [], labels = [],\n                l, w = opts.labelWidth, h = opts.labelHeight, dummyDiv;\n\n            function makeDummyDiv(labels, width) {\n                return $('<div style=\"position:absolute;top:-10000px;' + width + 'font-size:smaller\">' +\n                         '<div class=\"' + axis.direction + 'Axis ' + axis.direction + axis.n + 'Axis\">'\n                         + labels.join(\"\") + '</div></div>')\n                    .appendTo(placeholder);\n            }\n\n            if (axis.direction == \"x\") {\n                // to avoid measuring the widths of the labels (it's slow), we\n                // construct fixed-size boxes and put the labels inside\n                // them, we don't need the exact figures and the\n                // fixed-size box content is easy to center\n                if (w == null)\n                    w = Math.floor(canvasWidth / (ticks.length > 0 ? ticks.length : 1));\n\n                // measure x label heights\n                if (h == null) {\n                    labels = [];\n                    for (i = 0; i < ticks.length; ++i) {\n                        l = ticks[i].label;\n                        if (l)\n                            labels.push('<div class=\"tickLabel\" style=\"float:left;width:' + w + 'px\">' + l + '</div>');\n                    }\n\n                    if (labels.length > 0) {\n                        // stick them all in the same div and measure\n                        // collective height\n                        labels.push('<div style=\"clear:left\"></div>');\n                        dummyDiv = makeDummyDiv(labels, \"width:10000px;\");\n                        h = dummyDiv.height();\n                        dummyDiv.remove();\n                    }\n                }\n            }\n            else if (w == null || h == null) {\n                // calculate y label dimensions\n                for (i = 0; i < ticks.length; ++i) {\n                    l = ticks[i].label;\n                    if (l)\n                        labels.push('<div class=\"tickLabel\">' + l + '</div>');\n                }\n\n                if (labels.length > 0) {\n                    dummyDiv = makeDummyDiv(labels, \"\");\n                    if (w == null)\n                        w = dummyDiv.children().width();\n                    if (h == null)\n                        h = dummyDiv.find(\"div.tickLabel\").height();\n                    dummyDiv.remove();\n                }\n            }\n\n            if (w == null)\n                w = 0;\n            if (h == null)\n                h = 0;\n\n            axis.labelWidth = w;\n            axis.labelHeight = h;\n        }\n\n        function allocateAxisBoxFirstPhase(axis) {\n            // find the bounding box of the axis by looking at label\n            // widths/heights and ticks, make room by diminishing the\n            // plotOffset\n\n            var lw = axis.labelWidth,\n                lh = axis.labelHeight,\n                pos = axis.options.position,\n                tickLength = axis.options.tickLength,\n                axismargin = options.grid.axisMargin,\n                padding = options.grid.labelMargin,\n                all = axis.direction == \"x\" ? xaxes : yaxes,\n                index;\n\n            // determine axis margin\n            var samePosition = $.grep(all, function (a) {\n                return a && a.options.position == pos && a.reserveSpace;\n            });\n            if ($.inArray(axis, samePosition) == samePosition.length - 1)\n                axismargin = 0; // outermost\n\n            // determine tick length - if we're innermost, we can use \"full\"\n            if (tickLength == null)\n                tickLength = \"full\";\n\n            var sameDirection = $.grep(all, function (a) {\n                return a && a.reserveSpace;\n            });\n\n            var innermost = $.inArray(axis, sameDirection) == 0;\n            if (!innermost && tickLength == \"full\")\n                tickLength = 5;\n\n            if (!isNaN(+tickLength))\n                padding += +tickLength;\n\n            // compute box\n            if (axis.direction == \"x\") {\n                lh += padding;\n\n                if (pos == \"bottom\") {\n                    plotOffset.bottom += lh + axismargin;\n                    axis.box = { top: canvasHeight - plotOffset.bottom, height: lh };\n                }\n                else {\n                    axis.box = { top: plotOffset.top + axismargin, height: lh };\n                    plotOffset.top += lh + axismargin;\n                }\n            }\n            else {\n                lw += padding;\n\n                if (pos == \"left\") {\n                    axis.box = { left: plotOffset.left + axismargin, width: lw };\n                    plotOffset.left += lw + axismargin;\n                }\n                else {\n                    plotOffset.right += lw + axismargin;\n                    axis.box = { left: canvasWidth - plotOffset.right, width: lw };\n                }\n            }\n\n             // save for future reference\n            axis.position = pos;\n            axis.tickLength = tickLength;\n            axis.box.padding = padding;\n            axis.innermost = innermost;\n        }\n\n        function allocateAxisBoxSecondPhase(axis) {\n            // set remaining bounding box coordinates\n            if (axis.direction == \"x\") {\n                axis.box.left = plotOffset.left;\n                axis.box.width = plotWidth;\n            }\n            else {\n                axis.box.top = plotOffset.top;\n                axis.box.height = plotHeight;\n            }\n        }\n\n        function setupGrid() {\n            var i, axes = allAxes();\n\n            // first calculate the plot and axis box dimensions\n\n            $.each(axes, function (_, axis) {\n                axis.show = axis.options.show;\n                if (axis.show == null)\n                    axis.show = axis.used; // by default an axis is visible if it's got data\n\n                axis.reserveSpace = axis.show || axis.options.reserveSpace;\n\n                setRange(axis);\n            });\n\n            allocatedAxes = $.grep(axes, function (axis) { return axis.reserveSpace; });\n\n            plotOffset.left = plotOffset.right = plotOffset.top = plotOffset.bottom = 0;\n            if (options.grid.show) {\n                $.each(allocatedAxes, function (_, axis) {\n                    // make the ticks\n                    setupTickGeneration(axis);\n                    setTicks(axis);\n                    snapRangeToTicks(axis, axis.ticks);\n\n                    // find labelWidth/Height for axis\n                    measureTickLabels(axis);\n                });\n\n                // with all dimensions in house, we can compute the\n                // axis boxes, start from the outside (reverse order)\n                for (i = allocatedAxes.length - 1; i >= 0; --i)\n                    allocateAxisBoxFirstPhase(allocatedAxes[i]);\n\n                // make sure we've got enough space for things that\n                // might stick out\n                var minMargin = options.grid.minBorderMargin;\n                if (minMargin == null) {\n                    minMargin = 0;\n                    for (i = 0; i < series.length; ++i)\n                        minMargin = Math.max(minMargin, series[i].points.radius + series[i].points.lineWidth/2);\n                }\n\n                for (var a in plotOffset) {\n                    plotOffset[a] += options.grid.borderWidth;\n                    plotOffset[a] = Math.max(minMargin, plotOffset[a]);\n                }\n            }\n\n            plotWidth = canvasWidth - plotOffset.left - plotOffset.right;\n            plotHeight = canvasHeight - plotOffset.bottom - plotOffset.top;\n\n            // now we got the proper plotWidth/Height, we can compute the scaling\n            $.each(axes, function (_, axis) {\n                setTransformationHelpers(axis);\n            });\n\n            if (options.grid.show) {\n                $.each(allocatedAxes, function (_, axis) {\n                    allocateAxisBoxSecondPhase(axis);\n                });\n\n                insertAxisLabels();\n            }\n\n            insertLegend();\n        }\n\n        function setRange(axis) {\n            var opts = axis.options,\n                min = +(opts.min != null ? opts.min : axis.datamin),\n                max = +(opts.max != null ? opts.max : axis.datamax),\n                delta = max - min;\n\n            if (delta == 0.0) {\n                // degenerate case\n                var widen = max == 0 ? 1 : 0.01;\n\n                if (opts.min == null)\n                    min -= widen;\n                // always widen max if we couldn't widen min to ensure we\n                // don't fall into min == max which doesn't work\n                if (opts.max == null || opts.min != null)\n                    max += widen;\n            }\n            else {\n                // consider autoscaling\n                var margin = opts.autoscaleMargin;\n                if (margin != null) {\n                    if (opts.min == null) {\n                        min -= delta * margin;\n                        // make sure we don't go below zero if all values\n                        // are positive\n                        if (min < 0 && axis.datamin != null && axis.datamin >= 0)\n                            min = 0;\n                    }\n                    if (opts.max == null) {\n                        max += delta * margin;\n                        if (max > 0 && axis.datamax != null && axis.datamax <= 0)\n                            max = 0;\n                    }\n                }\n            }\n            axis.min = min;\n            axis.max = max;\n        }\n\n        function setupTickGeneration(axis) {\n            var opts = axis.options;\n\n            // estimate number of ticks\n            var noTicks;\n            if (typeof opts.ticks == \"number\" && opts.ticks > 0)\n                noTicks = opts.ticks;\n            else\n                // heuristic based on the model a*sqrt(x) fitted to\n                // some data points that seemed reasonable\n                noTicks = 0.3 * Math.sqrt(axis.direction == \"x\" ? canvasWidth : canvasHeight);\n\n            var delta = (axis.max - axis.min) / noTicks,\n                size, generator, unit, formatter, i, magn, norm;\n\n            if (opts.mode == \"time\") {\n                // pretty handling of time\n\n                // map of app. size of time units in milliseconds\n                var timeUnitSize = {\n                    \"second\": 1000,\n                    \"minute\": 60 * 1000,\n                    \"hour\": 60 * 60 * 1000,\n                    \"day\": 24 * 60 * 60 * 1000,\n                    \"month\": 30 * 24 * 60 * 60 * 1000,\n                    \"year\": 365.2425 * 24 * 60 * 60 * 1000\n                };\n\n\n                // the allowed tick sizes, after 1 year we use\n                // an integer algorithm\n                var spec = [\n                    [1, \"second\"], [2, \"second\"], [5, \"second\"], [10, \"second\"],\n                    [30, \"second\"],\n                    [1, \"minute\"], [2, \"minute\"], [5, \"minute\"], [10, \"minute\"],\n                    [30, \"minute\"],\n                    [1, \"hour\"], [2, \"hour\"], [4, \"hour\"],\n                    [8, \"hour\"], [12, \"hour\"],\n                    [1, \"day\"], [2, \"day\"], [3, \"day\"],\n                    [0.25, \"month\"], [0.5, \"month\"], [1, \"month\"],\n                    [2, \"month\"], [3, \"month\"], [6, \"month\"],\n                    [1, \"year\"]\n                ];\n\n                var minSize = 0;\n                if (opts.minTickSize != null) {\n                    if (typeof opts.tickSize == \"number\")\n                        minSize = opts.tickSize;\n                    else\n                        minSize = opts.minTickSize[0] * timeUnitSize[opts.minTickSize[1]];\n                }\n\n                for (var i = 0; i < spec.length - 1; ++i)\n                    if (delta < (spec[i][0] * timeUnitSize[spec[i][1]]\n                                 + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2\n                       && spec[i][0] * timeUnitSize[spec[i][1]] >= minSize)\n                        break;\n                size = spec[i][0];\n                unit = spec[i][1];\n\n                // special-case the possibility of several years\n                if (unit == \"year\") {\n                    magn = Math.pow(10, Math.floor(Math.log(delta / timeUnitSize.year) / Math.LN10));\n                    norm = (delta / timeUnitSize.year) / magn;\n                    if (norm < 1.5)\n                        size = 1;\n                    else if (norm < 3)\n                        size = 2;\n                    else if (norm < 7.5)\n                        size = 5;\n                    else\n                        size = 10;\n\n                    size *= magn;\n                }\n\n                axis.tickSize = opts.tickSize || [size, unit];\n\n                generator = function(axis) {\n                    var ticks = [],\n                        tickSize = axis.tickSize[0], unit = axis.tickSize[1],\n                        d = new Date(axis.min);\n\n                    var step = tickSize * timeUnitSize[unit];\n\n                    if (unit == \"second\")\n                        d.setUTCSeconds(floorInBase(d.getUTCSeconds(), tickSize));\n                    if (unit == \"minute\")\n                        d.setUTCMinutes(floorInBase(d.getUTCMinutes(), tickSize));\n                    if (unit == \"hour\")\n                        d.setUTCHours(floorInBase(d.getUTCHours(), tickSize));\n                    if (unit == \"month\")\n                        d.setUTCMonth(floorInBase(d.getUTCMonth(), tickSize));\n                    if (unit == \"year\")\n                        d.setUTCFullYear(floorInBase(d.getUTCFullYear(), tickSize));\n\n                    // reset smaller components\n                    d.setUTCMilliseconds(0);\n                    if (step >= timeUnitSize.minute)\n                        d.setUTCSeconds(0);\n                    if (step >= timeUnitSize.hour)\n                        d.setUTCMinutes(0);\n                    if (step >= timeUnitSize.day)\n                        d.setUTCHours(0);\n                    if (step >= timeUnitSize.day * 4)\n                        d.setUTCDate(1);\n                    if (step >= timeUnitSize.year)\n                        d.setUTCMonth(0);\n\n\n                    var carry = 0, v = Number.NaN, prev;\n                    do {\n                        prev = v;\n                        v = d.getTime();\n                        ticks.push(v);\n                        if (unit == \"month\") {\n                            if (tickSize < 1) {\n                                // a bit complicated - we'll divide the month\n                                // up but we need to take care of fractions\n                                // so we don't end up in the middle of a day\n                                d.setUTCDate(1);\n                                var start = d.getTime();\n                                d.setUTCMonth(d.getUTCMonth() + 1);\n                                var end = d.getTime();\n                                d.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize);\n                                carry = d.getUTCHours();\n                                d.setUTCHours(0);\n                            }\n                            else\n                                d.setUTCMonth(d.getUTCMonth() + tickSize);\n                        }\n                        else if (unit == \"year\") {\n                            d.setUTCFullYear(d.getUTCFullYear() + tickSize);\n                        }\n                        else\n                            d.setTime(v + step);\n                    } while (v < axis.max && v != prev);\n\n                    return ticks;\n                };\n\n                formatter = function (v, axis) {\n                    var d = new Date(v);\n\n                    // first check global format\n                    if (opts.timeformat != null)\n                        return $.plot.formatDate(d, opts.timeformat, opts.monthNames);\n\n                    var t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]];\n                    var span = axis.max - axis.min;\n                    var suffix = (opts.twelveHourClock) ? \" %p\" : \"\";\n\n                    if (t < timeUnitSize.minute)\n                        fmt = \"%h:%M:%S\" + suffix;\n                    else if (t < timeUnitSize.day) {\n                        if (span < 2 * timeUnitSize.day)\n                            fmt = \"%h:%M\" + suffix;\n                        else\n                            fmt = \"%b %d %h:%M\" + suffix;\n                    }\n                    else if (t < timeUnitSize.month)\n                        fmt = \"%b %d\";\n                    else if (t < timeUnitSize.year) {\n                        if (span < timeUnitSize.year)\n                            fmt = \"%b\";\n                        else\n                            fmt = \"%b %y\";\n                    }\n                    else\n                        fmt = \"%y\";\n\n                    return $.plot.formatDate(d, fmt, opts.monthNames);\n                };\n            }\n            else {\n                // pretty rounding of base-10 numbers\n                var maxDec = opts.tickDecimals;\n                var dec = -Math.floor(Math.log(delta) / Math.LN10);\n                if (maxDec != null && dec > maxDec)\n                    dec = maxDec;\n\n                magn = Math.pow(10, -dec);\n                norm = delta / magn; // norm is between 1.0 and 10.0\n\n                if (norm < 1.5)\n                    size = 1;\n                else if (norm < 3) {\n                    size = 2;\n                    // special case for 2.5, requires an extra decimal\n                    if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) {\n                        size = 2.5;\n                        ++dec;\n                    }\n                }\n                else if (norm < 7.5)\n                    size = 5;\n                else\n                    size = 10;\n\n                size *= magn;\n\n                if (opts.minTickSize != null && size < opts.minTickSize)\n                    size = opts.minTickSize;\n\n                axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec);\n                axis.tickSize = opts.tickSize || size;\n\n                generator = function (axis) {\n                    var ticks = [];\n\n                    // spew out all possible ticks\n                    var start = floorInBase(axis.min, axis.tickSize),\n                        i = 0, v = Number.NaN, prev;\n                    do {\n                        prev = v;\n                        v = start + i * axis.tickSize;\n                        ticks.push(v);\n                        ++i;\n                    } while (v < axis.max && v != prev);\n                    return ticks;\n                };\n\n                formatter = function (v, axis) {\n                    return v.toFixed(axis.tickDecimals);\n                };\n            }\n\n            if (opts.alignTicksWithAxis != null) {\n                var otherAxis = (axis.direction == \"x\" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1];\n                if (otherAxis && otherAxis.used && otherAxis != axis) {\n                    // consider snapping min/max to outermost nice ticks\n                    var niceTicks = generator(axis);\n                    if (niceTicks.length > 0) {\n                        if (opts.min == null)\n                            axis.min = Math.min(axis.min, niceTicks[0]);\n                        if (opts.max == null && niceTicks.length > 1)\n                            axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]);\n                    }\n\n                    generator = function (axis) {\n                        // copy ticks, scaled to this axis\n                        var ticks = [], v, i;\n                        for (i = 0; i < otherAxis.ticks.length; ++i) {\n                            v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min);\n                            v = axis.min + v * (axis.max - axis.min);\n                            ticks.push(v);\n                        }\n                        return ticks;\n                    };\n\n                    // we might need an extra decimal since forced\n                    // ticks don't necessarily fit naturally\n                    if (axis.mode != \"time\" && opts.tickDecimals == null) {\n                        var extraDec = Math.max(0, -Math.floor(Math.log(delta) / Math.LN10) + 1),\n                            ts = generator(axis);\n\n                        // only proceed if the tick interval rounded\n                        // with an extra decimal doesn't give us a\n                        // zero at end\n                        if (!(ts.length > 1 && /\\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec))))\n                            axis.tickDecimals = extraDec;\n                    }\n                }\n            }\n\n            axis.tickGenerator = generator;\n            if ($.isFunction(opts.tickFormatter))\n                axis.tickFormatter = function (v, axis) { return \"\" + opts.tickFormatter(v, axis); };\n            else\n                axis.tickFormatter = formatter;\n        }\n\n        function setTicks(axis) {\n            var oticks = axis.options.ticks, ticks = [];\n            if (oticks == null || (typeof oticks == \"number\" && oticks > 0))\n                ticks = axis.tickGenerator(axis);\n            else if (oticks) {\n                if ($.isFunction(oticks))\n                    // generate the ticks\n                    ticks = oticks({ min: axis.min, max: axis.max });\n                else\n                    ticks = oticks;\n            }\n\n            // clean up/labelify the supplied ticks, copy them over\n            var i, v;\n            axis.ticks = [];\n            for (i = 0; i < ticks.length; ++i) {\n                var label = null;\n                var t = ticks[i];\n                if (typeof t == \"object\") {\n                    v = +t[0];\n                    if (t.length > 1)\n                        label = t[1];\n                }\n                else\n                    v = +t;\n                if (label == null)\n                    label = axis.tickFormatter(v, axis);\n                if (!isNaN(v))\n                    axis.ticks.push({ v: v, label: label });\n            }\n        }\n\n        function snapRangeToTicks(axis, ticks) {\n            if (axis.options.autoscaleMargin && ticks.length > 0) {\n                // snap to ticks\n                if (axis.options.min == null)\n                    axis.min = Math.min(axis.min, ticks[0].v);\n                if (axis.options.max == null && ticks.length > 1)\n                    axis.max = Math.max(axis.max, ticks[ticks.length - 1].v);\n            }\n        }\n\n        function draw() {\n            ctx.clearRect(0, 0, canvasWidth, canvasHeight);\n\n            var grid = options.grid;\n\n            // draw background, if any\n            if (grid.show && grid.backgroundColor)\n                drawBackground();\n\n            if (grid.show && !grid.aboveData)\n                drawGrid();\n\n            for (var i = 0; i < series.length; ++i) {\n                executeHooks(hooks.drawSeries, [ctx, series[i]]);\n                drawSeries(series[i]);\n            }\n\n            executeHooks(hooks.draw, [ctx]);\n\n            if (grid.show && grid.aboveData)\n                drawGrid();\n        }\n\n        function extractRange(ranges, coord) {\n            var axis, from, to, key, axes = allAxes();\n\n            for (i = 0; i < axes.length; ++i) {\n                axis = axes[i];\n                if (axis.direction == coord) {\n                    key = coord + axis.n + \"axis\";\n                    if (!ranges[key] && axis.n == 1)\n                        key = coord + \"axis\"; // support x1axis as xaxis\n                    if (ranges[key]) {\n                        from = ranges[key].from;\n                        to = ranges[key].to;\n                        break;\n                    }\n                }\n            }\n\n            // backwards-compat stuff - to be removed in future\n            if (!ranges[key]) {\n                axis = coord == \"x\" ? xaxes[0] : yaxes[0];\n                from = ranges[coord + \"1\"];\n                to = ranges[coord + \"2\"];\n            }\n\n            // auto-reverse as an added bonus\n            if (from != null && to != null && from > to) {\n                var tmp = from;\n                from = to;\n                to = tmp;\n            }\n\n            return { from: from, to: to, axis: axis };\n        }\n\n        function drawBackground() {\n            ctx.save();\n            ctx.translate(plotOffset.left, plotOffset.top);\n\n            ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, \"rgba(255, 255, 255, 0)\");\n            ctx.fillRect(0, 0, plotWidth, plotHeight);\n            ctx.restore();\n        }\n\n        function drawGrid() {\n            var i;\n\n            ctx.save();\n            ctx.translate(plotOffset.left, plotOffset.top);\n\n            // draw markings\n            var markings = options.grid.markings;\n            if (markings) {\n                if ($.isFunction(markings)) {\n                    var axes = plot.getAxes();\n                    // xmin etc. is backwards compatibility, to be\n                    // removed in the future\n                    axes.xmin = axes.xaxis.min;\n                    axes.xmax = axes.xaxis.max;\n                    axes.ymin = axes.yaxis.min;\n                    axes.ymax = axes.yaxis.max;\n\n                    markings = markings(axes);\n                }\n\n                for (i = 0; i < markings.length; ++i) {\n                    var m = markings[i],\n                        xrange = extractRange(m, \"x\"),\n                        yrange = extractRange(m, \"y\");\n\n                    // fill in missing\n                    if (xrange.from == null)\n                        xrange.from = xrange.axis.min;\n                    if (xrange.to == null)\n                        xrange.to = xrange.axis.max;\n                    if (yrange.from == null)\n                        yrange.from = yrange.axis.min;\n                    if (yrange.to == null)\n                        yrange.to = yrange.axis.max;\n\n                    // clip\n                    if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max ||\n                        yrange.to < yrange.axis.min || yrange.from > yrange.axis.max)\n                        continue;\n\n                    xrange.from = Math.max(xrange.from, xrange.axis.min);\n                    xrange.to = Math.min(xrange.to, xrange.axis.max);\n                    yrange.from = Math.max(yrange.from, yrange.axis.min);\n                    yrange.to = Math.min(yrange.to, yrange.axis.max);\n\n                    if (xrange.from == xrange.to && yrange.from == yrange.to)\n                        continue;\n\n                    // then draw\n                    xrange.from = xrange.axis.p2c(xrange.from);\n                    xrange.to = xrange.axis.p2c(xrange.to);\n                    yrange.from = yrange.axis.p2c(yrange.from);\n                    yrange.to = yrange.axis.p2c(yrange.to);\n\n                    if (xrange.from == xrange.to || yrange.from == yrange.to) {\n                        // draw line\n                        ctx.beginPath();\n                        ctx.strokeStyle = m.color || options.grid.markingsColor;\n                        ctx.lineWidth = m.lineWidth || options.grid.markingsLineWidth;\n                        ctx.moveTo(xrange.from, yrange.from);\n                        ctx.lineTo(xrange.to, yrange.to);\n                        ctx.stroke();\n                    }\n                    else {\n                        // fill area\n                        ctx.fillStyle = m.color || options.grid.markingsColor;\n                        ctx.fillRect(xrange.from, yrange.to,\n                                     xrange.to - xrange.from,\n                                     yrange.from - yrange.to);\n                    }\n                }\n            }\n\n            // draw the ticks\n            var axes = allAxes(), bw = options.grid.borderWidth;\n\n            for (var j = 0; j < axes.length; ++j) {\n                var axis = axes[j], box = axis.box,\n                    t = axis.tickLength, x, y, xoff, yoff;\n                if (!axis.show || axis.ticks.length == 0)\n                    continue\n\n                ctx.strokeStyle = axis.options.tickColor || $.color.parse(axis.options.color).scale('a', 0.22).toString();\n                ctx.lineWidth = 1;\n\n                // find the edges\n                if (axis.direction == \"x\") {\n                    x = 0;\n                    if (t == \"full\")\n                        y = (axis.position == \"top\" ? 0 : plotHeight);\n                    else\n                        y = box.top - plotOffset.top + (axis.position == \"top\" ? box.height : 0);\n                }\n                else {\n                    y = 0;\n                    if (t == \"full\")\n                        x = (axis.position == \"left\" ? 0 : plotWidth);\n                    else\n                        x = box.left - plotOffset.left + (axis.position == \"left\" ? box.width : 0);\n                }\n\n                // draw tick bar\n                if (!axis.innermost) {\n                    ctx.beginPath();\n                    xoff = yoff = 0;\n                    if (axis.direction == \"x\")\n                        xoff = plotWidth;\n                    else\n                        yoff = plotHeight;\n\n                    if (ctx.lineWidth == 1) {\n                        x = Math.floor(x) + 0.5;\n                        y = Math.floor(y) + 0.5;\n                    }\n\n                    ctx.moveTo(x, y);\n                    ctx.lineTo(x + xoff, y + yoff);\n                    ctx.stroke();\n                }\n\n                // draw ticks\n                ctx.beginPath();\n                for (i = 0; i < axis.ticks.length; ++i) {\n                    var v = axis.ticks[i].v;\n\n                    xoff = yoff = 0;\n\n                    if (v < axis.min || v > axis.max\n                        // skip those lying on the axes if we got a border\n                        || (t == \"full\" && bw > 0\n                            && (v == axis.min || v == axis.max)))\n                        continue;\n\n                    if (axis.direction == \"x\") {\n                        x = axis.p2c(v);\n                        yoff = t == \"full\" ? -plotHeight : t;\n\n                        if (axis.position == \"top\")\n                            yoff = -yoff;\n                    }\n                    else {\n                        y = axis.p2c(v);\n                        xoff = t == \"full\" ? -plotWidth : t;\n\n                        if (axis.position == \"left\")\n                            xoff = -xoff;\n                    }\n\n                    if (ctx.lineWidth == 1) {\n                        if (axis.direction == \"x\")\n                            x = Math.floor(x) + 0.5;\n                        else\n                            y = Math.floor(y) + 0.5;\n                    }\n\n                    ctx.moveTo(x, y);\n                    ctx.lineTo(x + xoff, y + yoff);\n                }\n\n                ctx.stroke();\n            }\n\n\n            // draw border\n            if (bw) {\n                ctx.lineWidth = bw;\n                ctx.strokeStyle = options.grid.borderColor;\n                ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw);\n            }\n\n            ctx.restore();\n        }\n\n        function insertAxisLabels() {\n            placeholder.find(\".tickLabels\").remove();\n\n            var html = ['<div class=\"tickLabels\" style=\"font-size:smaller\">'];\n\n            var axes = allAxes();\n            for (var j = 0; j < axes.length; ++j) {\n                var axis = axes[j], box = axis.box;\n                if (!axis.show)\n                    continue;\n                //debug: html.push('<div style=\"position:absolute;opacity:0.10;background-color:red;left:' + box.left + 'px;top:' + box.top + 'px;width:' + box.width +  'px;height:' + box.height + 'px\"></div>')\n                html.push('<div class=\"' + axis.direction + 'Axis ' + axis.direction + axis.n + 'Axis\" style=\"color:' + axis.options.color + '\">');\n                for (var i = 0; i < axis.ticks.length; ++i) {\n                    var tick = axis.ticks[i];\n                    if (!tick.label || tick.v < axis.min || tick.v > axis.max)\n                        continue;\n\n                    var pos = {}, align;\n\n                    if (axis.direction == \"x\") {\n                        align = \"center\";\n                        pos.left = Math.round(plotOffset.left + axis.p2c(tick.v) - axis.labelWidth/2);\n                        if (axis.position == \"bottom\")\n                            pos.top = box.top + box.padding;\n                        else\n                            pos.bottom = canvasHeight - (box.top + box.height - box.padding);\n                    }\n                    else {\n                        pos.top = Math.round(plotOffset.top + axis.p2c(tick.v) - axis.labelHeight/2);\n                        if (axis.position == \"left\") {\n                            pos.right = canvasWidth - (box.left + box.width - box.padding)\n                            align = \"right\";\n                        }\n                        else {\n                            pos.left = box.left + box.padding;\n                            align = \"left\";\n                        }\n                    }\n\n                    pos.width = axis.labelWidth;\n\n                    var style = [\"position:absolute\", \"text-align:\" + align ];\n                    for (var a in pos)\n                        style.push(a + \":\" + pos[a] + \"px\")\n\n                    html.push('<div class=\"tickLabel\" style=\"' + style.join(';') + '\">' + tick.label + '</div>');\n                }\n                html.push('</div>');\n            }\n\n            html.push('</div>');\n\n            placeholder.append(html.join(\"\"));\n        }\n\n        function drawSeries(series) {\n            if (series.lines.show)\n                drawSeriesLines(series);\n            if (series.bars.show)\n                drawSeriesBars(series);\n            if (series.points.show)\n                drawSeriesPoints(series);\n        }\n\n        function drawSeriesLines(series) {\n            function plotLine(datapoints, xoffset, yoffset, axisx, axisy) {\n                var points = datapoints.points,\n                    ps = datapoints.pointsize,\n                    prevx = null, prevy = null;\n\n                ctx.beginPath();\n                for (var i = ps; i < points.length; i += ps) {\n                    var x1 = points[i - ps], y1 = points[i - ps + 1],\n                        x2 = points[i], y2 = points[i + 1];\n\n                    if (x1 == null || x2 == null)\n                        continue;\n\n                    // clip with ymin\n                    if (y1 <= y2 && y1 < axisy.min) {\n                        if (y2 < axisy.min)\n                            continue;   // line segment is outside\n                        // compute new intersection point\n                        x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\n                        y1 = axisy.min;\n                    }\n                    else if (y2 <= y1 && y2 < axisy.min) {\n                        if (y1 < axisy.min)\n                            continue;\n                        x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\n                        y2 = axisy.min;\n                    }\n\n                    // clip with ymax\n                    if (y1 >= y2 && y1 > axisy.max) {\n                        if (y2 > axisy.max)\n                            continue;\n                        x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\n                        y1 = axisy.max;\n                    }\n                    else if (y2 >= y1 && y2 > axisy.max) {\n                        if (y1 > axisy.max)\n                            continue;\n                        x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\n                        y2 = axisy.max;\n                    }\n\n                    // clip with xmin\n                    if (x1 <= x2 && x1 < axisx.min) {\n                        if (x2 < axisx.min)\n                            continue;\n                        y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\n                        x1 = axisx.min;\n                    }\n                    else if (x2 <= x1 && x2 < axisx.min) {\n                        if (x1 < axisx.min)\n                            continue;\n                        y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\n                        x2 = axisx.min;\n                    }\n\n                    // clip with xmax\n                    if (x1 >= x2 && x1 > axisx.max) {\n                        if (x2 > axisx.max)\n                            continue;\n                        y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\n                        x1 = axisx.max;\n                    }\n                    else if (x2 >= x1 && x2 > axisx.max) {\n                        if (x1 > axisx.max)\n                            continue;\n                        y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\n                        x2 = axisx.max;\n                    }\n\n                    if (x1 != prevx || y1 != prevy)\n                        ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset);\n\n                    prevx = x2;\n                    prevy = y2;\n                    ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset);\n                }\n                ctx.stroke();\n            }\n\n            function plotLineArea(datapoints, axisx, axisy) {\n                var points = datapoints.points,\n                    ps = datapoints.pointsize,\n                    bottom = Math.min(Math.max(0, axisy.min), axisy.max),\n                    i = 0, top, areaOpen = false,\n                    ypos = 1, segmentStart = 0, segmentEnd = 0;\n\n                // we process each segment in two turns, first forward\n                // direction to sketch out top, then once we hit the\n                // end we go backwards to sketch the bottom\n                while (true) {\n                    if (ps > 0 && i > points.length + ps)\n                        break;\n\n                    i += ps; // ps is negative if going backwards\n\n                    var x1 = points[i - ps],\n                        y1 = points[i - ps + ypos],\n                        x2 = points[i], y2 = points[i + ypos];\n\n                    if (areaOpen) {\n                        if (ps > 0 && x1 != null && x2 == null) {\n                            // at turning point\n                            segmentEnd = i;\n                            ps = -ps;\n                            ypos = 2;\n                            continue;\n                        }\n\n                        if (ps < 0 && i == segmentStart + ps) {\n                            // done with the reverse sweep\n                            ctx.fill();\n                            areaOpen = false;\n                            ps = -ps;\n                            ypos = 1;\n                            i = segmentStart = segmentEnd + ps;\n                            continue;\n                        }\n                    }\n\n                    if (x1 == null || x2 == null)\n                        continue;\n\n                    // clip x values\n\n                    // clip with xmin\n                    if (x1 <= x2 && x1 < axisx.min) {\n                        if (x2 < axisx.min)\n                            continue;\n                        y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\n                        x1 = axisx.min;\n                    }\n                    else if (x2 <= x1 && x2 < axisx.min) {\n                        if (x1 < axisx.min)\n                            continue;\n                        y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\n                        x2 = axisx.min;\n                    }\n\n                    // clip with xmax\n                    if (x1 >= x2 && x1 > axisx.max) {\n                        if (x2 > axisx.max)\n                            continue;\n                        y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\n                        x1 = axisx.max;\n                    }\n                    else if (x2 >= x1 && x2 > axisx.max) {\n                        if (x1 > axisx.max)\n                            continue;\n                        y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\n                        x2 = axisx.max;\n                    }\n\n                    if (!areaOpen) {\n                        // open area\n                        ctx.beginPath();\n                        ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom));\n                        areaOpen = true;\n                    }\n\n                    // now first check the case where both is outside\n                    if (y1 >= axisy.max && y2 >= axisy.max) {\n                        ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max));\n                        ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max));\n                        continue;\n                    }\n                    else if (y1 <= axisy.min && y2 <= axisy.min) {\n                        ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min));\n                        ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min));\n                        continue;\n                    }\n\n                    // else it's a bit more complicated, there might\n                    // be a flat maxed out rectangle first, then a\n                    // triangular cutout or reverse; to find these\n                    // keep track of the current x values\n                    var x1old = x1, x2old = x2;\n\n                    // clip the y values, without shortcutting, we\n                    // go through all cases in turn\n\n                    // clip with ymin\n                    if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) {\n                        x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\n                        y1 = axisy.min;\n                    }\n                    else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) {\n                        x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\n                        y2 = axisy.min;\n                    }\n\n                    // clip with ymax\n                    if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) {\n                        x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\n                        y1 = axisy.max;\n                    }\n                    else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) {\n                        x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\n                        y2 = axisy.max;\n                    }\n\n                    // if the x value was changed we got a rectangle\n                    // to fill\n                    if (x1 != x1old) {\n                        ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1));\n                        // it goes to (x1, y1), but we fill that below\n                    }\n\n                    // fill triangular section, this sometimes result\n                    // in redundant points if (x1, y1) hasn't changed\n                    // from previous line to, but we just ignore that\n                    ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1));\n                    ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));\n\n                    // fill the other rectangle if it's there\n                    if (x2 != x2old) {\n                        ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));\n                        ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2));\n                    }\n                }\n            }\n\n            ctx.save();\n            ctx.translate(plotOffset.left, plotOffset.top);\n            ctx.lineJoin = \"round\";\n\n            var lw = series.lines.lineWidth,\n                sw = series.shadowSize;\n            // FIXME: consider another form of shadow when filling is turned on\n            if (lw > 0 && sw > 0) {\n                // draw shadow as a thick and thin line with transparency\n                ctx.lineWidth = sw;\n                ctx.strokeStyle = \"rgba(0,0,0,0.1)\";\n                // position shadow at angle from the mid of line\n                var angle = Math.PI/18;\n                plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis);\n                ctx.lineWidth = sw/2;\n                plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis);\n            }\n\n            ctx.lineWidth = lw;\n            ctx.strokeStyle = series.color;\n            var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight);\n            if (fillStyle) {\n                ctx.fillStyle = fillStyle;\n                plotLineArea(series.datapoints, series.xaxis, series.yaxis);\n            }\n\n            if (lw > 0)\n                plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis);\n            ctx.restore();\n        }\n\n        function drawSeriesPoints(series) {\n            function plotPoints(datapoints, radius, fillStyle, offset, shadow, axisx, axisy, symbol) {\n                var points = datapoints.points, ps = datapoints.pointsize;\n\n                for (var i = 0; i < points.length; i += ps) {\n                    var x = points[i], y = points[i + 1];\n                    if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)\n                        continue;\n\n                    ctx.beginPath();\n                    x = axisx.p2c(x);\n                    y = axisy.p2c(y) + offset;\n                    if (symbol == \"circle\")\n                        ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false);\n                    else\n                        symbol(ctx, x, y, radius, shadow);\n                    ctx.closePath();\n\n                    if (fillStyle) {\n                        ctx.fillStyle = fillStyle;\n                        ctx.fill();\n                    }\n                    ctx.stroke();\n                }\n            }\n\n            ctx.save();\n            ctx.translate(plotOffset.left, plotOffset.top);\n\n            var lw = series.points.lineWidth,\n                sw = series.shadowSize,\n                radius = series.points.radius,\n                symbol = series.points.symbol;\n            if (lw > 0 && sw > 0) {\n                // draw shadow in two steps\n                var w = sw / 2;\n                ctx.lineWidth = w;\n                ctx.strokeStyle = \"rgba(0,0,0,0.1)\";\n                plotPoints(series.datapoints, radius, null, w + w/2, true,\n                           series.xaxis, series.yaxis, symbol);\n\n                ctx.strokeStyle = \"rgba(0,0,0,0.2)\";\n                plotPoints(series.datapoints, radius, null, w/2, true,\n                           series.xaxis, series.yaxis, symbol);\n            }\n\n            ctx.lineWidth = lw;\n            ctx.strokeStyle = series.color;\n            plotPoints(series.datapoints, radius,\n                       getFillStyle(series.points, series.color), 0, false,\n                       series.xaxis, series.yaxis, symbol);\n            ctx.restore();\n        }\n\n        function drawBar(x, y, b, barLeft, barRight, offset, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) {\n            var left, right, bottom, top,\n                drawLeft, drawRight, drawTop, drawBottom,\n                tmp;\n\n            // in horizontal mode, we start the bar from the left\n            // instead of from the bottom so it appears to be\n            // horizontal rather than vertical\n            if (horizontal) {\n                drawBottom = drawRight = drawTop = true;\n                drawLeft = false;\n                left = b;\n                right = x;\n                top = y + barLeft;\n                bottom = y + barRight;\n\n                // account for negative bars\n                if (right < left) {\n                    tmp = right;\n                    right = left;\n                    left = tmp;\n                    drawLeft = true;\n                    drawRight = false;\n                }\n            }\n            else {\n                drawLeft = drawRight = drawTop = true;\n                drawBottom = false;\n                left = x + barLeft;\n                right = x + barRight;\n                bottom = b;\n                top = y;\n\n                // account for negative bars\n                if (top < bottom) {\n                    tmp = top;\n                    top = bottom;\n                    bottom = tmp;\n                    drawBottom = true;\n                    drawTop = false;\n                }\n            }\n\n            // clip\n            if (right < axisx.min || left > axisx.max ||\n                top < axisy.min || bottom > axisy.max)\n                return;\n\n            if (left < axisx.min) {\n                left = axisx.min;\n                drawLeft = false;\n            }\n\n            if (right > axisx.max) {\n                right = axisx.max;\n                drawRight = false;\n            }\n\n            if (bottom < axisy.min) {\n                bottom = axisy.min;\n                drawBottom = false;\n            }\n\n            if (top > axisy.max) {\n                top = axisy.max;\n                drawTop = false;\n            }\n\n            left = axisx.p2c(left);\n            bottom = axisy.p2c(bottom);\n            right = axisx.p2c(right);\n            top = axisy.p2c(top);\n\n            // fill the bar\n            if (fillStyleCallback) {\n                c.beginPath();\n                c.moveTo(left, bottom);\n                c.lineTo(left, top);\n                c.lineTo(right, top);\n                c.lineTo(right, bottom);\n                c.fillStyle = fillStyleCallback(bottom, top);\n                c.fill();\n            }\n\n            // draw outline\n            if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) {\n                c.beginPath();\n\n                // FIXME: inline moveTo is buggy with excanvas\n                c.moveTo(left, bottom + offset);\n                if (drawLeft)\n                    c.lineTo(left, top + offset);\n                else\n                    c.moveTo(left, top + offset);\n                if (drawTop)\n                    c.lineTo(right, top + offset);\n                else\n                    c.moveTo(right, top + offset);\n                if (drawRight)\n                    c.lineTo(right, bottom + offset);\n                else\n                    c.moveTo(right, bottom + offset);\n                if (drawBottom)\n                    c.lineTo(left, bottom + offset);\n                else\n                    c.moveTo(left, bottom + offset);\n                c.stroke();\n            }\n        }\n\n        function drawSeriesBars(series) {\n            function plotBars(datapoints, barLeft, barRight, offset, fillStyleCallback, axisx, axisy) {\n                var points = datapoints.points, ps = datapoints.pointsize;\n\n                for (var i = 0; i < points.length; i += ps) {\n                    if (points[i] == null)\n                        continue;\n                    drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, offset, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth);\n                }\n            }\n\n            ctx.save();\n            ctx.translate(plotOffset.left, plotOffset.top);\n\n            // FIXME: figure out a way to add shadows (for instance along the right edge)\n            ctx.lineWidth = series.bars.lineWidth;\n            ctx.strokeStyle = series.color;\n            var barLeft = series.bars.align == \"left\" ? 0 : -series.bars.barWidth/2;\n            var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null;\n            plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, 0, fillStyleCallback, series.xaxis, series.yaxis);\n            ctx.restore();\n        }\n\n        function getFillStyle(filloptions, seriesColor, bottom, top) {\n            var fill = filloptions.fill;\n            if (!fill)\n                return null;\n\n            if (filloptions.fillColor)\n                return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor);\n\n            var c = $.color.parse(seriesColor);\n            c.a = typeof fill == \"number\" ? fill : 0.4;\n            c.normalize();\n            return c.toString();\n        }\n\n        function insertLegend() {\n            placeholder.find(\".legend\").remove();\n\n            if (!options.legend.show)\n                return;\n\n            var fragments = [], rowStarted = false,\n                lf = options.legend.labelFormatter, s, label;\n            for (var i = 0; i < series.length; ++i) {\n                s = series[i];\n                label = s.label;\n                if (!label)\n                    continue;\n\n                if (i % options.legend.noColumns == 0) {\n                    if (rowStarted)\n                        fragments.push('</tr>');\n                    fragments.push('<tr>');\n                    rowStarted = true;\n                }\n\n                if (lf)\n                    label = lf(label, s);\n\n                fragments.push(\n                    '<td class=\"legendColorBox\"><div style=\"border:1px solid ' + options.legend.labelBoxBorderColor + ';padding:1px\"><div style=\"width:4px;height:0;border:5px solid ' + s.color + ';overflow:hidden\"></div></div></td>' +\n                    '<td class=\"legendLabel\">' + label + '</td>');\n            }\n            if (rowStarted)\n                fragments.push('</tr>');\n\n            if (fragments.length == 0)\n                return;\n\n            var table = '<table style=\"font-size:smaller;color:' + options.grid.color + '\">' + fragments.join(\"\") + '</table>';\n            if (options.legend.container != null)\n                $(options.legend.container).html(table);\n            else {\n                var pos = \"\",\n                    p = options.legend.position,\n                    m = options.legend.margin;\n                if (m[0] == null)\n                    m = [m, m];\n                if (p.charAt(0) == \"n\")\n                    pos += 'top:' + (m[1] + plotOffset.top) + 'px;';\n                else if (p.charAt(0) == \"s\")\n                    pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;';\n                if (p.charAt(1) == \"e\")\n                    pos += 'right:' + (m[0] + plotOffset.right) + 'px;';\n                else if (p.charAt(1) == \"w\")\n                    pos += 'left:' + (m[0] + plotOffset.left) + 'px;';\n                var legend = $('<div class=\"legend\">' + table.replace('style=\"', 'style=\"position:absolute;' + pos +';') + '</div>').appendTo(placeholder);\n                if (options.legend.backgroundOpacity != 0.0) {\n                    // put in the transparent background\n                    // separately to avoid blended labels and\n                    // label boxes\n                    var c = options.legend.backgroundColor;\n                    if (c == null) {\n                        c = options.grid.backgroundColor;\n                        if (c && typeof c == \"string\")\n                            c = $.color.parse(c);\n                        else\n                            c = $.color.extract(legend, 'background-color');\n                        c.a = 1;\n                        c = c.toString();\n                    }\n                    var div = legend.children();\n                    $('<div style=\"position:absolute;width:' + div.width() + 'px;height:' + div.height() + 'px;' + pos +'background-color:' + c + ';\"> </div>').prependTo(legend).css('opacity', options.legend.backgroundOpacity);\n                }\n            }\n        }\n\n\n        // interactive features\n\n        var highlights = [],\n            redrawTimeout = null;\n\n        // returns the data item the mouse is over, or null if none is found\n        function findNearbyItem(mouseX, mouseY, seriesFilter) {\n            var maxDistance = options.grid.mouseActiveRadius,\n                smallestDistance = maxDistance * maxDistance + 1,\n                item = null, foundPoint = false, i, j;\n\n            for (i = series.length - 1; i >= 0; --i) {\n                if (!seriesFilter(series[i]))\n                    continue;\n\n                var s = series[i],\n                    axisx = s.xaxis,\n                    axisy = s.yaxis,\n                    points = s.datapoints.points,\n                    ps = s.datapoints.pointsize,\n                    mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster\n                    my = axisy.c2p(mouseY),\n                    maxx = maxDistance / axisx.scale,\n                    maxy = maxDistance / axisy.scale;\n\n                // with inverse transforms, we can't use the maxx/maxy\n                // optimization, sadly\n                if (axisx.options.inverseTransform)\n                    maxx = Number.MAX_VALUE;\n                if (axisy.options.inverseTransform)\n                    maxy = Number.MAX_VALUE;\n\n                if (s.lines.show || s.points.show) {\n                    for (j = 0; j < points.length; j += ps) {\n                        var x = points[j], y = points[j + 1];\n                        if (x == null)\n                            continue;\n\n                        // For points and lines, the cursor must be within a\n                        // certain distance to the data point\n                        if (x - mx > maxx || x - mx < -maxx ||\n                            y - my > maxy || y - my < -maxy)\n                            continue;\n\n                        // We have to calculate distances in pixels, not in\n                        // data units, because the scales of the axes may be different\n                        var dx = Math.abs(axisx.p2c(x) - mouseX),\n                            dy = Math.abs(axisy.p2c(y) - mouseY),\n                            dist = dx * dx + dy * dy; // we save the sqrt\n\n                        // use <= to ensure last point takes precedence\n                        // (last generally means on top of)\n                        if (dist < smallestDistance) {\n                            smallestDistance = dist;\n                            item = [i, j / ps];\n                        }\n                    }\n                }\n\n                if (s.bars.show && !item) { // no other point can be nearby\n                    var barLeft = s.bars.align == \"left\" ? 0 : -s.bars.barWidth/2,\n                        barRight = barLeft + s.bars.barWidth;\n\n                    for (j = 0; j < points.length; j += ps) {\n                        var x = points[j], y = points[j + 1], b = points[j + 2];\n                        if (x == null)\n                            continue;\n\n                        // for a bar graph, the cursor must be inside the bar\n                        if (series[i].bars.horizontal ?\n                            (mx <= Math.max(b, x) && mx >= Math.min(b, x) &&\n                             my >= y + barLeft && my <= y + barRight) :\n                            (mx >= x + barLeft && mx <= x + barRight &&\n                             my >= Math.min(b, y) && my <= Math.max(b, y)))\n                                item = [i, j / ps];\n                    }\n                }\n            }\n\n            if (item) {\n                i = item[0];\n                j = item[1];\n                ps = series[i].datapoints.pointsize;\n\n                return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps),\n                         dataIndex: j,\n                         series: series[i],\n                         seriesIndex: i };\n            }\n\n            return null;\n        }\n\n        function onMouseMove(e) {\n            if (options.grid.hoverable)\n                triggerClickHoverEvent(\"plothover\", e,\n                                       function (s) { return s[\"hoverable\"] != false; });\n        }\n\n        function onMouseLeave(e) {\n            if (options.grid.hoverable)\n                triggerClickHoverEvent(\"plothover\", e,\n                                       function (s) { return false; });\n        }\n\n        function onClick(e) {\n            triggerClickHoverEvent(\"plotclick\", e,\n                                   function (s) { return s[\"clickable\"] != false; });\n        }\n\n        // trigger click or hover event (they send the same parameters\n        // so we share their code)\n        function triggerClickHoverEvent(eventname, event, seriesFilter) {\n            var offset = eventHolder.offset(),\n                canvasX = event.pageX - offset.left - plotOffset.left,\n                canvasY = event.pageY - offset.top - plotOffset.top,\n            pos = canvasToAxisCoords({ left: canvasX, top: canvasY });\n\n            pos.pageX = event.pageX;\n            pos.pageY = event.pageY;\n\n            var item = findNearbyItem(canvasX, canvasY, seriesFilter);\n\n            if (item) {\n                // fill in mouse pos for any listeners out there\n                item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left);\n                item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top);\n            }\n\n            if (options.grid.autoHighlight) {\n                // clear auto-highlights\n                for (var i = 0; i < highlights.length; ++i) {\n                    var h = highlights[i];\n                    if (h.auto == eventname &&\n                        !(item && h.series == item.series &&\n                          h.point[0] == item.datapoint[0] &&\n                          h.point[1] == item.datapoint[1]))\n                        unhighlight(h.series, h.point);\n                }\n\n                if (item)\n                    highlight(item.series, item.datapoint, eventname);\n            }\n\n            placeholder.trigger(eventname, [ pos, item ]);\n        }\n\n        function triggerRedrawOverlay() {\n            if (!redrawTimeout)\n                redrawTimeout = setTimeout(drawOverlay, 30);\n        }\n\n        function drawOverlay() {\n            redrawTimeout = null;\n\n            // draw highlights\n            octx.save();\n            octx.clearRect(0, 0, canvasWidth, canvasHeight);\n            octx.translate(plotOffset.left, plotOffset.top);\n\n            var i, hi;\n            for (i = 0; i < highlights.length; ++i) {\n                hi = highlights[i];\n\n                if (hi.series.bars.show)\n                    drawBarHighlight(hi.series, hi.point);\n                else\n                    drawPointHighlight(hi.series, hi.point);\n            }\n            octx.restore();\n\n            executeHooks(hooks.drawOverlay, [octx]);\n        }\n\n        function highlight(s, point, auto) {\n            if (typeof s == \"number\")\n                s = series[s];\n\n            if (typeof point == \"number\") {\n                var ps = s.datapoints.pointsize;\n                point = s.datapoints.points.slice(ps * point, ps * (point + 1));\n            }\n\n            var i = indexOfHighlight(s, point);\n            if (i == -1) {\n                highlights.push({ series: s, point: point, auto: auto });\n\n                triggerRedrawOverlay();\n            }\n            else if (!auto)\n                highlights[i].auto = false;\n        }\n\n        function unhighlight(s, point) {\n            if (s == null && point == null) {\n                highlights = [];\n                triggerRedrawOverlay();\n            }\n\n            if (typeof s == \"number\")\n                s = series[s];\n\n            if (typeof point == \"number\")\n                point = s.data[point];\n\n            var i = indexOfHighlight(s, point);\n            if (i != -1) {\n                highlights.splice(i, 1);\n\n                triggerRedrawOverlay();\n            }\n        }\n\n        function indexOfHighlight(s, p) {\n            for (var i = 0; i < highlights.length; ++i) {\n                var h = highlights[i];\n                if (h.series == s && h.point[0] == p[0]\n                    && h.point[1] == p[1])\n                    return i;\n            }\n            return -1;\n        }\n\n        function drawPointHighlight(series, point) {\n            var x = point[0], y = point[1],\n                axisx = series.xaxis, axisy = series.yaxis;\n\n            if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)\n                return;\n\n            var pointRadius = series.points.radius + series.points.lineWidth / 2;\n            octx.lineWidth = pointRadius;\n            octx.strokeStyle = $.color.parse(series.color).scale('a', 0.5).toString();\n            var radius = 1.5 * pointRadius,\n                x = axisx.p2c(x),\n                y = axisy.p2c(y);\n\n            octx.beginPath();\n            if (series.points.symbol == \"circle\")\n                octx.arc(x, y, radius, 0, 2 * Math.PI, false);\n            else\n                series.points.symbol(octx, x, y, radius, false);\n            octx.closePath();\n            octx.stroke();\n        }\n\n        function drawBarHighlight(series, point) {\n            octx.lineWidth = series.bars.lineWidth;\n            octx.strokeStyle = $.color.parse(series.color).scale('a', 0.5).toString();\n            var fillStyle = $.color.parse(series.color).scale('a', 0.5).toString();\n            var barLeft = series.bars.align == \"left\" ? 0 : -series.bars.barWidth/2;\n            drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth,\n                    0, function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth);\n        }\n\n        function getColorOrGradient(spec, bottom, top, defaultColor) {\n            if (typeof spec == \"string\")\n                return spec;\n            else {\n                // assume this is a gradient spec; IE currently only\n                // supports a simple vertical gradient properly, so that's\n                // what we support too\n                var gradient = ctx.createLinearGradient(0, top, 0, bottom);\n\n                for (var i = 0, l = spec.colors.length; i < l; ++i) {\n                    var c = spec.colors[i];\n                    if (typeof c != \"string\") {\n                        var co = $.color.parse(defaultColor);\n                        if (c.brightness != null)\n                            co = co.scale('rgb', c.brightness)\n                        if (c.opacity != null)\n                            co.a *= c.opacity;\n                        c = co.toString();\n                    }\n                    gradient.addColorStop(i / (l - 1), c);\n                }\n\n                return gradient;\n            }\n        }\n    }\n\n    $.plot = function(placeholder, data, options) {\n        //var t0 = new Date();\n        var plot = new Plot($(placeholder), data, options, $.plot.plugins);\n        //(window.console ? console.log : alert)(\"time used (msecs): \" + ((new Date()).getTime() - t0.getTime()));\n        return plot;\n    };\n\n    $.plot.version = \"0.7\";\n\n    $.plot.plugins = [];\n\n    // returns a string with the date d formatted according to fmt\n    $.plot.formatDate = function(d, fmt, monthNames) {\n        var leftPad = function(n) {\n            n = \"\" + n;\n            return n.length == 1 ? \"0\" + n : n;\n        };\n\n        var r = [];\n        var escape = false, padNext = false;\n        var hours = d.getUTCHours();\n        var isAM = hours < 12;\n        if (monthNames == null)\n            monthNames = [\"1月\", \"2月\", \"3月\", \"4月\", \"5月\", \"6月\", \"7月\", \"8月\", \"9月\", \"10月\", \"11月\", \"12月\"];\n\n        if (fmt.search(/%p|%P/) != -1) {\n            if (hours > 12) {\n                hours = hours - 12;\n            } else if (hours == 0) {\n                hours = 12;\n            }\n        }\n        for (var i = 0; i < fmt.length; ++i) {\n            var c = fmt.charAt(i);\n\n            if (escape) {\n                switch (c) {\n                case 'h': c = \"\" + hours; break;\n                case 'H': c = leftPad(hours); break;\n                case 'M': c = leftPad(d.getUTCMinutes()); break;\n                case 'S': c = leftPad(d.getUTCSeconds()); break;\n                case 'd': c = \"\" + d.getUTCDate(); break;\n                case 'm': c = \"\" + (d.getUTCMonth() + 1); break;\n                case 'y': c = \"\" + d.getUTCFullYear(); break;\n                case 'b': c = \"\" + monthNames[d.getUTCMonth()]; break;\n                case 'p': c = (isAM) ? (\"\" + \"am\") : (\"\" + \"pm\"); break;\n                case 'P': c = (isAM) ? (\"\" + \"AM\") : (\"\" + \"PM\"); break;\n                case '0': c = \"\"; padNext = true; break;\n                }\n                if (c && padNext) {\n                    c = leftPad(c);\n                    padNext = false;\n                }\n                r.push(c);\n                if (!padNext)\n                    escape = false;\n            }\n            else {\n                if (c == \"%\")\n                    escape = true;\n                else\n                    r.push(c);\n            }\n        }\n        return r.join(\"\");\n    };\n\n    // round to nearby lower multiple of base\n    function floorInBase(n, base) {\n        return base * Math.floor(n / base);\n    }\n\n})(jQuery);\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/flot/jquery.flot.pie.js",
    "content": "/*\nFlot plugin for rendering pie charts. The plugin assumes the data is\ncoming is as a single data value for each series, and each of those\nvalues is a positive value or zero (negative numbers don't make\nany sense and will cause strange effects). The data values do\nNOT need to be passed in as percentage values because it\ninternally calculates the total and percentages.\n\n* Created by Brian Medendorp, June 2009\n* Updated November 2009 with contributions from: btburnett3, Anthony Aragues and Xavi Ivars\n\n* Changes:\n\t2009-10-22: lineJoin set to round\n\t2009-10-23: IE full circle fix, donut\n\t2009-11-11: Added basic hover from btburnett3 - does not work in IE, and center is off in Chrome and Opera\n\t2009-11-17: Added IE hover capability submitted by Anthony Aragues\n\t2009-11-18: Added bug fix submitted by Xavi Ivars (issues with arrays when other JS libraries are included as well)\n\n\nAvailable options are:\nseries: {\n\tpie: {\n\t\tshow: true/false\n\t\tradius: 0-1 for percentage of fullsize, or a specified pixel length, or 'auto'\n\t\tinnerRadius: 0-1 for percentage of fullsize or a specified pixel length, for creating a donut effect\n\t\tstartAngle: 0-2 factor of PI used for starting angle (in radians) i.e 3/2 starts at the top, 0 and 2 have the same result\n\t\ttilt: 0-1 for percentage to tilt the pie, where 1 is no tilt, and 0 is completely flat (nothing will show)\n\t\toffset: {\n\t\t\ttop: integer value to move the pie up or down\n\t\t\tleft: integer value to move the pie left or right, or 'auto'\n\t\t},\n\t\tstroke: {\n\t\t\tcolor: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#FFF')\n\t\t\twidth: integer pixel width of the stroke\n\t\t},\n\t\tlabel: {\n\t\t\tshow: true/false, or 'auto'\n\t\t\tformatter:  a user-defined function that modifies the text/style of the label text\n\t\t\tradius: 0-1 for percentage of fullsize, or a specified pixel length\n\t\t\tbackground: {\n\t\t\t\tcolor: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#000')\n\t\t\t\topacity: 0-1\n\t\t\t},\n\t\t\tthreshold: 0-1 for the percentage value at which to hide labels (if they're too small)\n\t\t},\n\t\tcombine: {\n\t\t\tthreshold: 0-1 for the percentage value at which to combine slices (if they're too small)\n\t\t\tcolor: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#CCC'), if null, the plugin will automatically use the color of the first slice to be combined\n\t\t\tlabel: any text value of what the combined slice should be labeled\n\t\t}\n\t\thighlight: {\n\t\t\topacity: 0-1\n\t\t}\n\t}\n}\n\nMore detail and specific examples can be found in the included HTML file.\n\n*/\n\n(function ($)\n{\n\tfunction init(plot) // this is the \"body\" of the plugin\n\t{\n\t\tvar canvas = null;\n\t\tvar target = null;\n\t\tvar maxRadius = null;\n\t\tvar centerLeft = null;\n\t\tvar centerTop = null;\n\t\tvar total = 0;\n\t\tvar redraw = true;\n\t\tvar redrawAttempts = 10;\n\t\tvar shrink = 0.95;\n\t\tvar legendWidth = 0;\n\t\tvar processed = false;\n\t\tvar raw = false;\n\n\t\t// interactive variables\n\t\tvar highlights = [];\n\n\t\t// add hook to determine if pie plugin in enabled, and then perform necessary operations\n\t\tplot.hooks.processOptions.push(checkPieEnabled);\n\t\tplot.hooks.bindEvents.push(bindEvents);\n\n\t\t// check to see if the pie plugin is enabled\n\t\tfunction checkPieEnabled(plot, options)\n\t\t{\n\t\t\tif (options.series.pie.show)\n\t\t\t{\n\t\t\t\t//disable grid\n\t\t\t\toptions.grid.show = false;\n\n\t\t\t\t// set labels.show\n\t\t\t\tif (options.series.pie.label.show=='auto')\n\t\t\t\t\tif (options.legend.show)\n\t\t\t\t\t\toptions.series.pie.label.show = false;\n\t\t\t\t\telse\n\t\t\t\t\t\toptions.series.pie.label.show = true;\n\n\t\t\t\t// set radius\n\t\t\t\tif (options.series.pie.radius=='auto')\n\t\t\t\t\tif (options.series.pie.label.show)\n\t\t\t\t\t\toptions.series.pie.radius = 3/4;\n\t\t\t\t\telse\n\t\t\t\t\t\toptions.series.pie.radius = 1;\n\n\t\t\t\t// ensure sane tilt\n\t\t\t\tif (options.series.pie.tilt>1)\n\t\t\t\t\toptions.series.pie.tilt=1;\n\t\t\t\tif (options.series.pie.tilt<0)\n\t\t\t\t\toptions.series.pie.tilt=0;\n\n\t\t\t\t// add processData hook to do transformations on the data\n\t\t\t\tplot.hooks.processDatapoints.push(processDatapoints);\n\t\t\t\tplot.hooks.drawOverlay.push(drawOverlay);\n\n\t\t\t\t// add draw hook\n\t\t\t\tplot.hooks.draw.push(draw);\n\t\t\t}\n\t\t}\n\n\t\t// bind hoverable events\n\t\tfunction bindEvents(plot, eventHolder)\n\t\t{\n\t\t\tvar options = plot.getOptions();\n\n\t\t\tif (options.series.pie.show && options.grid.hoverable)\n\t\t\t\teventHolder.unbind('mousemove').mousemove(onMouseMove);\n\n\t\t\tif (options.series.pie.show && options.grid.clickable)\n\t\t\t\teventHolder.unbind('click').click(onClick);\n\t\t}\n\n\n\t\t// debugging function that prints out an object\n\t\tfunction alertObject(obj)\n\t\t{\n\t\t\tvar msg = '';\n\t\t\tfunction traverse(obj, depth)\n\t\t\t{\n\t\t\t\tif (!depth)\n\t\t\t\t\tdepth = 0;\n\t\t\t\tfor (var i = 0; i < obj.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tfor (var j=0; j<depth; j++)\n\t\t\t\t\t\tmsg += '\\t';\n\n\t\t\t\t\tif( typeof obj[i] == \"object\")\n\t\t\t\t\t{\t// its an object\n\t\t\t\t\t\tmsg += ''+i+':\\n';\n\t\t\t\t\t\ttraverse(obj[i], depth+1);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\t// its a value\n\t\t\t\t\t\tmsg += ''+i+': '+obj[i]+'\\n';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ttraverse(obj);\n\t\t\talert(msg);\n\t\t}\n\n\t\tfunction calcTotal(data)\n\t\t{\n\t\t\tfor (var i = 0; i < data.length; ++i)\n\t\t\t{\n\t\t\t\tvar item = parseFloat(data[i].data[0][1]);\n\t\t\t\tif (item)\n\t\t\t\t\ttotal += item;\n\t\t\t}\n\t\t}\n\n\t\tfunction processDatapoints(plot, series, data, datapoints)\n\t\t{\n\t\t\tif (!processed)\n\t\t\t{\n\t\t\t\tprocessed = true;\n\n\t\t\t\tcanvas = plot.getCanvas();\n\t\t\t\ttarget = $(canvas).parent();\n\t\t\t\toptions = plot.getOptions();\n\n\t\t\t\tplot.setData(combine(plot.getData()));\n\t\t\t}\n\t\t}\n\n\t\tfunction setupPie()\n\t\t{\n\t\t\tlegendWidth = target.children().filter('.legend').children().width();\n\n\t\t\t// calculate maximum radius and center point\n\t\t\tmaxRadius =  Math.min(canvas.width,(canvas.height/options.series.pie.tilt))/2;\n\t\t\tcenterTop = (canvas.height/2)+options.series.pie.offset.top;\n\t\t\tcenterLeft = (canvas.width/2);\n\n\t\t\tif (options.series.pie.offset.left=='auto')\n\t\t\t\tif (options.legend.position.match('w'))\n\t\t\t\t\tcenterLeft += legendWidth/2;\n\t\t\t\telse\n\t\t\t\t\tcenterLeft -= legendWidth/2;\n\t\t\telse\n\t\t\t\tcenterLeft += options.series.pie.offset.left;\n\n\t\t\tif (centerLeft<maxRadius)\n\t\t\t\tcenterLeft = maxRadius;\n\t\t\telse if (centerLeft>canvas.width-maxRadius)\n\t\t\t\tcenterLeft = canvas.width-maxRadius;\n\t\t}\n\n\t\tfunction fixData(data)\n\t\t{\n\t\t\tfor (var i = 0; i < data.length; ++i)\n\t\t\t{\n\t\t\t\tif (typeof(data[i].data)=='number')\n\t\t\t\t\tdata[i].data = [[1,data[i].data]];\n\t\t\t\telse if (typeof(data[i].data)=='undefined' || typeof(data[i].data[0])=='undefined')\n\t\t\t\t{\n\t\t\t\t\tif (typeof(data[i].data)!='undefined' && typeof(data[i].data.label)!='undefined')\n\t\t\t\t\t\tdata[i].label = data[i].data.label; // fix weirdness coming from flot\n\t\t\t\t\tdata[i].data = [[1,0]];\n\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn data;\n\t\t}\n\n\t\tfunction combine(data)\n\t\t{\n\t\t\tdata = fixData(data);\n\t\t\tcalcTotal(data);\n\t\t\tvar combined = 0;\n\t\t\tvar numCombined = 0;\n\t\t\tvar color = options.series.pie.combine.color;\n\n\t\t\tvar newdata = [];\n\t\t\tfor (var i = 0; i < data.length; ++i)\n\t\t\t{\n\t\t\t\t// make sure its a number\n\t\t\t\tdata[i].data[0][1] = parseFloat(data[i].data[0][1]);\n\t\t\t\tif (!data[i].data[0][1])\n\t\t\t\t\tdata[i].data[0][1] = 0;\n\n\t\t\t\tif (data[i].data[0][1]/total<=options.series.pie.combine.threshold)\n\t\t\t\t{\n\t\t\t\t\tcombined += data[i].data[0][1];\n\t\t\t\t\tnumCombined++;\n\t\t\t\t\tif (!color)\n\t\t\t\t\t\tcolor = data[i].color;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tnewdata.push({\n\t\t\t\t\t\tdata: [[1,data[i].data[0][1]]],\n\t\t\t\t\t\tcolor: data[i].color,\n\t\t\t\t\t\tlabel: data[i].label,\n\t\t\t\t\t\tangle: (data[i].data[0][1]*(Math.PI*2))/total,\n\t\t\t\t\t\tpercent: (data[i].data[0][1]/total*100)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (numCombined>0)\n\t\t\t\tnewdata.push({\n\t\t\t\t\tdata: [[1,combined]],\n\t\t\t\t\tcolor: color,\n\t\t\t\t\tlabel: options.series.pie.combine.label,\n\t\t\t\t\tangle: (combined*(Math.PI*2))/total,\n\t\t\t\t\tpercent: (combined/total*100)\n\t\t\t\t});\n\t\t\treturn newdata;\n\t\t}\n\n\t\tfunction draw(plot, newCtx)\n\t\t{\n\t\t\tif (!target) return; // if no series were passed\n\t\t\tctx = newCtx;\n\n\t\t\tsetupPie();\n\t\t\tvar slices = plot.getData();\n\n\t\t\tvar attempts = 0;\n\t\t\twhile (redraw && attempts<redrawAttempts)\n\t\t\t{\n\t\t\t\tredraw = false;\n\t\t\t\tif (attempts>0)\n\t\t\t\t\tmaxRadius *= shrink;\n\t\t\t\tattempts += 1;\n\t\t\t\tclear();\n\t\t\t\tif (options.series.pie.tilt<=0.8)\n\t\t\t\t\tdrawShadow();\n\t\t\t\tdrawPie();\n\t\t\t}\n\t\t\tif (attempts >= redrawAttempts) {\n\t\t\t\tclear();\n\t\t\t\ttarget.prepend('<div class=\"error\">Could not draw pie with labels contained inside canvas</div>');\n\t\t\t}\n\n\t\t\tif ( plot.setSeries && plot.insertLegend )\n\t\t\t{\n\t\t\t\tplot.setSeries(slices);\n\t\t\t\tplot.insertLegend();\n\t\t\t}\n\n\t\t\t// we're actually done at this point, just defining internal functions at this point\n\n\t\t\tfunction clear()\n\t\t\t{\n\t\t\t\tctx.clearRect(0,0,canvas.width,canvas.height);\n\t\t\t\ttarget.children().filter('.pieLabel, .pieLabelBackground').remove();\n\t\t\t}\n\n\t\t\tfunction drawShadow()\n\t\t\t{\n\t\t\t\tvar shadowLeft = 5;\n\t\t\t\tvar shadowTop = 15;\n\t\t\t\tvar edge = 10;\n\t\t\t\tvar alpha = 0.02;\n\n\t\t\t\t// set radius\n\t\t\t\tif (options.series.pie.radius>1)\n\t\t\t\t\tvar radius = options.series.pie.radius;\n\t\t\t\telse\n\t\t\t\t\tvar radius = maxRadius * options.series.pie.radius;\n\n\t\t\t\tif (radius>=(canvas.width/2)-shadowLeft || radius*options.series.pie.tilt>=(canvas.height/2)-shadowTop || radius<=edge)\n\t\t\t\t\treturn;\t// shadow would be outside canvas, so don't draw it\n\n\t\t\t\tctx.save();\n\t\t\t\tctx.translate(shadowLeft,shadowTop);\n\t\t\t\tctx.globalAlpha = alpha;\n\t\t\t\tctx.fillStyle = '#000';\n\n\t\t\t\t// center and rotate to starting position\n\t\t\t\tctx.translate(centerLeft,centerTop);\n\t\t\t\tctx.scale(1, options.series.pie.tilt);\n\n\t\t\t\t//radius -= edge;\n\t\t\t\tfor (var i=1; i<=edge; i++)\n\t\t\t\t{\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.arc(0,0,radius,0,Math.PI*2,false);\n\t\t\t\t\tctx.fill();\n\t\t\t\t\tradius -= i;\n\t\t\t\t}\n\n\t\t\t\tctx.restore();\n\t\t\t}\n\n\t\t\tfunction drawPie()\n\t\t\t{\n\t\t\t\tstartAngle = Math.PI*options.series.pie.startAngle;\n\n\t\t\t\t// set radius\n\t\t\t\tif (options.series.pie.radius>1)\n\t\t\t\t\tvar radius = options.series.pie.radius;\n\t\t\t\telse\n\t\t\t\t\tvar radius = maxRadius * options.series.pie.radius;\n\n\t\t\t\t// center and rotate to starting position\n\t\t\t\tctx.save();\n\t\t\t\tctx.translate(centerLeft,centerTop);\n\t\t\t\tctx.scale(1, options.series.pie.tilt);\n\t\t\t\t//ctx.rotate(startAngle); // start at top; -- This doesn't work properly in Opera\n\n\t\t\t\t// draw slices\n\t\t\t\tctx.save();\n\t\t\t\tvar currentAngle = startAngle;\n\t\t\t\tfor (var i = 0; i < slices.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tslices[i].startAngle = currentAngle;\n\t\t\t\t\tdrawSlice(slices[i].angle, slices[i].color, true);\n\t\t\t\t}\n\t\t\t\tctx.restore();\n\n\t\t\t\t// draw slice outlines\n\t\t\t\tctx.save();\n\t\t\t\tctx.lineWidth = options.series.pie.stroke.width;\n\t\t\t\tcurrentAngle = startAngle;\n\t\t\t\tfor (var i = 0; i < slices.length; ++i)\n\t\t\t\t\tdrawSlice(slices[i].angle, options.series.pie.stroke.color, false);\n\t\t\t\tctx.restore();\n\n\t\t\t\t// draw donut hole\n\t\t\t\tdrawDonutHole(ctx);\n\n\t\t\t\t// draw labels\n\t\t\t\tif (options.series.pie.label.show)\n\t\t\t\t\tdrawLabels();\n\n\t\t\t\t// restore to original state\n\t\t\t\tctx.restore();\n\n\t\t\t\tfunction drawSlice(angle, color, fill)\n\t\t\t\t{\n\t\t\t\t\tif (angle<=0)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tif (fill)\n\t\t\t\t\t\tctx.fillStyle = color;\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tctx.strokeStyle = color;\n\t\t\t\t\t\tctx.lineJoin = 'round';\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tif (Math.abs(angle - Math.PI*2) > 0.000000001)\n\t\t\t\t\t\tctx.moveTo(0,0); // Center of the pie\n\t\t\t\t\telse if ($.browser.msie)\n\t\t\t\t\t\tangle -= 0.0001;\n\t\t\t\t\t//ctx.arc(0,0,radius,0,angle,false); // This doesn't work properly in Opera\n\t\t\t\t\tctx.arc(0,0,radius,currentAngle,currentAngle+angle,false);\n\t\t\t\t\tctx.closePath();\n\t\t\t\t\t//ctx.rotate(angle); // This doesn't work properly in Opera\n\t\t\t\t\tcurrentAngle += angle;\n\n\t\t\t\t\tif (fill)\n\t\t\t\t\t\tctx.fill();\n\t\t\t\t\telse\n\t\t\t\t\t\tctx.stroke();\n\t\t\t\t}\n\n\t\t\t\tfunction drawLabels()\n\t\t\t\t{\n\t\t\t\t\tvar currentAngle = startAngle;\n\n\t\t\t\t\t// set radius\n\t\t\t\t\tif (options.series.pie.label.radius>1)\n\t\t\t\t\t\tvar radius = options.series.pie.label.radius;\n\t\t\t\t\telse\n\t\t\t\t\t\tvar radius = maxRadius * options.series.pie.label.radius;\n\n\t\t\t\t\tfor (var i = 0; i < slices.length; ++i)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (slices[i].percent >= options.series.pie.label.threshold*100)\n\t\t\t\t\t\t\tdrawLabel(slices[i], currentAngle, i);\n\t\t\t\t\t\tcurrentAngle += slices[i].angle;\n\t\t\t\t\t}\n\n\t\t\t\t\tfunction drawLabel(slice, startAngle, index)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (slice.data[0][1]==0)\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t// format label text\n\t\t\t\t\t\tvar lf = options.legend.labelFormatter, text, plf = options.series.pie.label.formatter;\n\t\t\t\t\t\tif (lf)\n\t\t\t\t\t\t\ttext = lf(slice.label, slice);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\ttext = slice.label;\n\t\t\t\t\t\tif (plf)\n\t\t\t\t\t\t\ttext = plf(text, slice);\n\n\t\t\t\t\t\tvar halfAngle = ((startAngle+slice.angle) + startAngle)/2;\n\t\t\t\t\t\tvar x = centerLeft + Math.round(Math.cos(halfAngle) * radius);\n\t\t\t\t\t\tvar y = centerTop + Math.round(Math.sin(halfAngle) * radius) * options.series.pie.tilt;\n\n\t\t\t\t\t\tvar html = '<span class=\"pieLabel\" id=\"pieLabel'+index+'\" style=\"position:absolute;top:' + y + 'px;left:' + x + 'px;\">' + text + \"</span>\";\n\t\t\t\t\t\ttarget.append(html);\n\t\t\t\t\t\tvar label = target.children('#pieLabel'+index);\n\t\t\t\t\t\tvar labelTop = (y - label.height()/2);\n\t\t\t\t\t\tvar labelLeft = (x - label.width()/2);\n\t\t\t\t\t\tlabel.css('top', labelTop);\n\t\t\t\t\t\tlabel.css('left', labelLeft);\n\n\t\t\t\t\t\t// check to make sure that the label is not outside the canvas\n\t\t\t\t\t\tif (0-labelTop>0 || 0-labelLeft>0 || canvas.height-(labelTop+label.height())<0 || canvas.width-(labelLeft+label.width())<0)\n\t\t\t\t\t\t\tredraw = true;\n\n\t\t\t\t\t\tif (options.series.pie.label.background.opacity != 0) {\n\t\t\t\t\t\t\t// put in the transparent background separately to avoid blended labels and label boxes\n\t\t\t\t\t\t\tvar c = options.series.pie.label.background.color;\n\t\t\t\t\t\t\tif (c == null) {\n\t\t\t\t\t\t\t\tc = slice.color;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tvar pos = 'top:'+labelTop+'px;left:'+labelLeft+'px;';\n\t\t\t\t\t\t\t$('<div class=\"pieLabelBackground\" style=\"position:absolute;width:' + label.width() + 'px;height:' + label.height() + 'px;' + pos +'background-color:' + c + ';\"> </div>').insertBefore(label).css('opacity', options.series.pie.label.background.opacity);\n\t\t\t\t\t\t}\n\t\t\t\t\t} // end individual label function\n\t\t\t\t} // end drawLabels function\n\t\t\t} // end drawPie function\n\t\t} // end draw function\n\n\t\t// Placed here because it needs to be accessed from multiple locations\n\t\tfunction drawDonutHole(layer)\n\t\t{\n\t\t\t// draw donut hole\n\t\t\tif(options.series.pie.innerRadius > 0)\n\t\t\t{\n\t\t\t\t// subtract the center\n\t\t\t\tlayer.save();\n\t\t\t\tinnerRadius = options.series.pie.innerRadius > 1 ? options.series.pie.innerRadius : maxRadius * options.series.pie.innerRadius;\n\t\t\t\tlayer.globalCompositeOperation = 'destination-out'; // this does not work with excanvas, but it will fall back to using the stroke color\n\t\t\t\tlayer.beginPath();\n\t\t\t\tlayer.fillStyle = options.series.pie.stroke.color;\n\t\t\t\tlayer.arc(0,0,innerRadius,0,Math.PI*2,false);\n\t\t\t\tlayer.fill();\n\t\t\t\tlayer.closePath();\n\t\t\t\tlayer.restore();\n\n\t\t\t\t// add inner stroke\n\t\t\t\tlayer.save();\n\t\t\t\tlayer.beginPath();\n\t\t\t\tlayer.strokeStyle = options.series.pie.stroke.color;\n\t\t\t\tlayer.arc(0,0,innerRadius,0,Math.PI*2,false);\n\t\t\t\tlayer.stroke();\n\t\t\t\tlayer.closePath();\n\t\t\t\tlayer.restore();\n\t\t\t\t// TODO: add extra shadow inside hole (with a mask) if the pie is tilted.\n\t\t\t}\n\t\t}\n\n\t\t//-- Additional Interactive related functions --\n\n\t\tfunction isPointInPoly(poly, pt)\n\t\t{\n\t\t\tfor(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i)\n\t\t\t\t((poly[i][1] <= pt[1] && pt[1] < poly[j][1]) || (poly[j][1] <= pt[1] && pt[1]< poly[i][1]))\n\t\t\t\t&& (pt[0] < (poly[j][0] - poly[i][0]) * (pt[1] - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0])\n\t\t\t\t&& (c = !c);\n\t\t\treturn c;\n\t\t}\n\n\t\tfunction findNearbySlice(mouseX, mouseY)\n\t\t{\n\t\t\tvar slices = plot.getData(),\n\t\t\t\toptions = plot.getOptions(),\n\t\t\t\tradius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius;\n\n\t\t\tfor (var i = 0; i < slices.length; ++i)\n\t\t\t{\n\t\t\t\tvar s = slices[i];\n\n\t\t\t\tif(s.pie.show)\n\t\t\t\t{\n\t\t\t\t\tctx.save();\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.moveTo(0,0); // Center of the pie\n\t\t\t\t\t//ctx.scale(1, options.series.pie.tilt);\t// this actually seems to break everything when here.\n\t\t\t\t\tctx.arc(0,0,radius,s.startAngle,s.startAngle+s.angle,false);\n\t\t\t\t\tctx.closePath();\n\t\t\t\t\tx = mouseX-centerLeft;\n\t\t\t\t\ty = mouseY-centerTop;\n\t\t\t\t\tif(ctx.isPointInPath)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (ctx.isPointInPath(mouseX-centerLeft, mouseY-centerTop))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t//alert('found slice!');\n\t\t\t\t\t\t\tctx.restore();\n\t\t\t\t\t\t\treturn {datapoint: [s.percent, s.data], dataIndex: 0, series: s, seriesIndex: i};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// excanvas for IE doesn;t support isPointInPath, this is a workaround.\n\t\t\t\t\t\tp1X = (radius * Math.cos(s.startAngle));\n\t\t\t\t\t\tp1Y = (radius * Math.sin(s.startAngle));\n\t\t\t\t\t\tp2X = (radius * Math.cos(s.startAngle+(s.angle/4)));\n\t\t\t\t\t\tp2Y = (radius * Math.sin(s.startAngle+(s.angle/4)));\n\t\t\t\t\t\tp3X = (radius * Math.cos(s.startAngle+(s.angle/2)));\n\t\t\t\t\t\tp3Y = (radius * Math.sin(s.startAngle+(s.angle/2)));\n\t\t\t\t\t\tp4X = (radius * Math.cos(s.startAngle+(s.angle/1.5)));\n\t\t\t\t\t\tp4Y = (radius * Math.sin(s.startAngle+(s.angle/1.5)));\n\t\t\t\t\t\tp5X = (radius * Math.cos(s.startAngle+s.angle));\n\t\t\t\t\t\tp5Y = (radius * Math.sin(s.startAngle+s.angle));\n\t\t\t\t\t\tarrPoly = [[0,0],[p1X,p1Y],[p2X,p2Y],[p3X,p3Y],[p4X,p4Y],[p5X,p5Y]];\n\t\t\t\t\t\tarrPoint = [x,y];\n\t\t\t\t\t\t// TODO: perhaps do some mathmatical trickery here with the Y-coordinate to compensate for pie tilt?\n\t\t\t\t\t\tif(isPointInPoly(arrPoly, arrPoint))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tctx.restore();\n\t\t\t\t\t\t\treturn {datapoint: [s.percent, s.data], dataIndex: 0, series: s, seriesIndex: i};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tctx.restore();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\tfunction onMouseMove(e)\n\t\t{\n\t\t\ttriggerClickHoverEvent('plothover', e);\n\t\t}\n\n        function onClick(e)\n\t\t{\n\t\t\ttriggerClickHoverEvent('plotclick', e);\n        }\n\n\t\t// trigger click or hover event (they send the same parameters so we share their code)\n\t\tfunction triggerClickHoverEvent(eventname, e)\n\t\t{\n\t\t\tvar offset = plot.offset(),\n\t\t\t\tcanvasX = parseInt(e.pageX - offset.left),\n\t\t\t\tcanvasY =  parseInt(e.pageY - offset.top),\n\t\t\t\titem = findNearbySlice(canvasX, canvasY);\n\n\t\t\tif (options.grid.autoHighlight)\n\t\t\t{\n\t\t\t\t// clear auto-highlights\n\t\t\t\tfor (var i = 0; i < highlights.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tvar h = highlights[i];\n\t\t\t\t\tif (h.auto == eventname && !(item && h.series == item.series))\n\t\t\t\t\t\tunhighlight(h.series);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// highlight the slice\n\t\t\tif (item)\n\t\t\t    highlight(item.series, eventname);\n\n\t\t\t// trigger any hover bind events\n\t\t\tvar pos = { pageX: e.pageX, pageY: e.pageY };\n\t\t\ttarget.trigger(eventname, [ pos, item ]);\n\t\t}\n\n\t\tfunction highlight(s, auto)\n\t\t{\n\t\t\tif (typeof s == \"number\")\n\t\t\t\ts = series[s];\n\n\t\t\tvar i = indexOfHighlight(s);\n\t\t\tif (i == -1)\n\t\t\t{\n\t\t\t\thighlights.push({ series: s, auto: auto });\n\t\t\t\tplot.triggerRedrawOverlay();\n\t\t\t}\n\t\t\telse if (!auto)\n\t\t\t\thighlights[i].auto = false;\n\t\t}\n\n\t\tfunction unhighlight(s)\n\t\t{\n\t\t\tif (s == null)\n\t\t\t{\n\t\t\t\thighlights = [];\n\t\t\t\tplot.triggerRedrawOverlay();\n\t\t\t}\n\n\t\t\tif (typeof s == \"number\")\n\t\t\t\ts = series[s];\n\n\t\t\tvar i = indexOfHighlight(s);\n\t\t\tif (i != -1)\n\t\t\t{\n\t\t\t\thighlights.splice(i, 1);\n\t\t\t\tplot.triggerRedrawOverlay();\n\t\t\t}\n\t\t}\n\n\t\tfunction indexOfHighlight(s)\n\t\t{\n\t\t\tfor (var i = 0; i < highlights.length; ++i)\n\t\t\t{\n\t\t\t\tvar h = highlights[i];\n\t\t\t\tif (h.series == s)\n\t\t\t\t\treturn i;\n\t\t\t}\n\t\t\treturn -1;\n\t\t}\n\n\t\tfunction drawOverlay(plot, octx)\n\t\t{\n\t\t\t//alert(options.series.pie.radius);\n\t\t\tvar options = plot.getOptions();\n\t\t\t//alert(options.series.pie.radius);\n\n\t\t\tvar radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius;\n\n\t\t\toctx.save();\n\t\t\toctx.translate(centerLeft, centerTop);\n\t\t\toctx.scale(1, options.series.pie.tilt);\n\n\t\t\tfor (i = 0; i < highlights.length; ++i)\n\t\t\t\tdrawHighlight(highlights[i].series);\n\n\t\t\tdrawDonutHole(octx);\n\n\t\t\toctx.restore();\n\n\t\t\tfunction drawHighlight(series)\n\t\t\t{\n\t\t\t\tif (series.angle < 0) return;\n\n\t\t\t\t//octx.fillStyle = parseColor(options.series.pie.highlight.color).scale(null, null, null, options.series.pie.highlight.opacity).toString();\n\t\t\t\toctx.fillStyle = \"rgba(255, 255, 255, \"+options.series.pie.highlight.opacity+\")\"; // this is temporary until we have access to parseColor\n\n\t\t\t\toctx.beginPath();\n\t\t\t\tif (Math.abs(series.angle - Math.PI*2) > 0.000000001)\n\t\t\t\t\toctx.moveTo(0,0); // Center of the pie\n\t\t\t\toctx.arc(0,0,radius,series.startAngle,series.startAngle+series.angle,false);\n\t\t\t\toctx.closePath();\n\t\t\t\toctx.fill();\n\t\t\t}\n\n\t\t}\n\n\t} // end init (plugin body)\n\n\t// define pie specific options and their default values\n\tvar options = {\n\t\tseries: {\n\t\t\tpie: {\n\t\t\t\tshow: false,\n\t\t\t\tradius: 'auto',\t// actual radius of the visible pie (based on full calculated radius if <=1, or hard pixel value)\n\t\t\t\tinnerRadius:0, /* for donut */\n\t\t\t\tstartAngle: 3/2,\n\t\t\t\ttilt: 1,\n\t\t\t\toffset: {\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tleft: 'auto'\n\t\t\t\t},\n\t\t\t\tstroke: {\n\t\t\t\t\tcolor: '#FFF',\n\t\t\t\t\twidth: 1\n\t\t\t\t},\n\t\t\t\tlabel: {\n\t\t\t\t\tshow: 'auto',\n\t\t\t\t\tformatter: function(label, slice){\n\t\t\t\t\t\treturn '<div style=\"font-size:x-small;text-align:center;padding:2px;color:'+slice.color+';\">'+label+'<br/>'+Math.round(slice.percent)+'%</div>';\n\t\t\t\t\t},\t// formatter function\n\t\t\t\t\tradius: 1,\t// radius at which to place the labels (based on full calculated radius if <=1, or hard pixel value)\n\t\t\t\t\tbackground: {\n\t\t\t\t\t\tcolor: null,\n\t\t\t\t\t\topacity: 0\n\t\t\t\t\t},\n\t\t\t\t\tthreshold: 0\t// percentage at which to hide the label (i.e. the slice is too narrow)\n\t\t\t\t},\n\t\t\t\tcombine: {\n\t\t\t\t\tthreshold: -1,\t// percentage at which to combine little slices into one larger slice\n\t\t\t\t\tcolor: null,\t// color to give the new slice (auto-generated if null)\n\t\t\t\t\tlabel: 'Other'\t// label to give the new slice\n\t\t\t\t},\n\t\t\t\thighlight: {\n\t\t\t\t\t//color: '#FFF',\t\t// will add this functionality once parseColor is available\n\t\t\t\t\topacity: 0.5\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t$.plot.plugins.push({\n\t\tinit: init,\n\t\toptions: options,\n\t\tname: \"pie\",\n\t\tversion: \"1.0\"\n\t});\n})(jQuery);\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/flot/jquery.flot.resize.js",
    "content": "/* Flot plugin for automatically redrawing plots as the placeholder resizes.\n\nCopyright (c) 2007-2013 IOLA and Ole Laursen.\nLicensed under the MIT license.\n\nIt works by listening for changes on the placeholder div (through the jQuery\nresize event plugin) - if the size changes, it will redraw the plot.\n\nThere are no options. If you need to disable the plugin for some plots, you\ncan just fix the size of their placeholders.\n\n*/\n\n/* Inline dependency:\n * jQuery resize event - v1.1 - 3/14/2010\n * http://benalman.com/projects/jquery-resize-plugin/\n *\n * Copyright (c) 2010 \"Cowboy\" Ben Alman\n * Dual licensed under the MIT and GPL licenses.\n * http://benalman.com/about/license/\n */\n\n(function($,h,c){var a=$([]),e=$.resize=$.extend($.resize,{}),i,k=\"setTimeout\",j=\"resize\",d=j+\"-special-event\",b=\"delay\",f=\"throttleWindow\";e[b]=250;e[f]=true;$.event.special[j]={setup:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.add(l);$.data(this,d,{w:l.width(),h:l.height()});if(a.length===1){g()}},teardown:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.not(l);l.removeData(d);if(!a.length){clearTimeout(i)}},add:function(l){if(!e[f]&&this[k]){return false}var n;function m(s,o,p){var q=$(this),r=$.data(this,d);r.w=o!==c?o:q.width();r.h=p!==c?p:q.height();n.apply(this,arguments)}if($.isFunction(l)){n=l;return m}else{n=l.handler;l.handler=m}}};function g(){i=h[k](function(){a.each(function(){var n=$(this),m=n.width(),l=n.height(),o=$.data(this,d);if(m!==o.w||l!==o.h){n.trigger(j,[o.w=m,o.h=l])}});g()},e[b])}})(jQuery,this);\n\n(function ($) {\n    var options = { }; // no options\n\n    function init(plot) {\n        function onResize() {\n            var placeholder = plot.getPlaceholder();\n\n            // somebody might have hidden us and we can't plot\n            // when we don't have the dimensions\n            if (placeholder.width() == 0 || placeholder.height() == 0)\n                return;\n\n            plot.resize();\n            plot.setupGrid();\n            plot.draw();\n        }\n\n        function bindEvents(plot, eventHolder) {\n            plot.getPlaceholder().resize(onResize);\n        }\n\n        function shutdown(plot, eventHolder) {\n            plot.getPlaceholder().unbind(\"resize\", onResize);\n        }\n\n        plot.hooks.bindEvents.push(bindEvents);\n        plot.hooks.shutdown.push(shutdown);\n    }\n\n    $.plot.plugins.push({\n        init: init,\n        options: options,\n        name: 'resize',\n        version: '1.0'\n    });\n})(jQuery);\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/flot/jquery.flot.spline.js",
    "content": "/**\n * Flot plugin that provides spline interpolation for line graphs\n * author: Alex Bardas < alex.bardas@gmail.com >\n * modified by: Avi Kohn https://github.com/AMKohn\n * based on the spline interpolation described at:\n *\t\t http://scaledinnovation.com/analytics/splines/aboutSplines.html\n *\n * Example usage: (add in plot options series object)\n *\t\tfor linespline:\n *\t\t\tseries: {\n *\t\t\t\t...\n *\t\t\t\tlines: {\n *\t\t\t\t\tshow: false\n *\t\t\t\t},\n *\t\t\t\tsplines: {\n *\t\t\t\t\tshow: true,\n *\t\t\t\t\ttension: x, (float between 0 and 1, defaults to 0.5),\n *\t\t\t\t\tlineWidth: y (number, defaults to 2),\n *\t\t\t\t\tfill: z (float between 0 .. 1 or false, as in flot documentation)\n *\t\t\t\t},\n *\t\t\t\t...\n *\t\t\t}\n *\t\tareaspline:\n *\t\t\tseries: {\n *\t\t\t\t...\n *\t\t\t\tlines: {\n *\t\t\t\t\tshow: true,\n *\t\t\t\t\tlineWidth: 0, (line drawing will not execute)\n *\t\t\t\t\tfill: x, (float between 0 .. 1, as in flot documentation)\n *\t\t\t\t\t...\n *\t\t\t\t},\n *\t\t\t\tsplines: {\n *\t\t\t\t\tshow: true,\n *\t\t\t\t\ttension: 0.5 (float between 0 and 1)\n *\t\t\t\t},\n *\t\t\t\t...\n *\t\t\t}\n *\n */\n\n(function($) {\n    'use strict'\n\n    /**\n     * @param {Number} x0, y0, x1, y1: coordinates of the end (knot) points of the segment\n     * @param {Number} x2, y2: the next knot (not connected, but needed to calculate p2)\n     * @param {Number} tension: control how far the control points spread\n     * @return {Array}: p1 -> control point, from x1 back toward x0\n     * \t\t\t\t\tp2 -> the next control point, returned to become the next segment's p1\n     *\n     * @api private\n     */\n    function getControlPoints(x0, y0, x1, y1, x2, y2, tension) {\n\n        var pow = Math.pow,\n            sqrt = Math.sqrt,\n            d01, d12, fa, fb, p1x, p1y, p2x, p2y;\n\n        //  Scaling factors: distances from this knot to the previous and following knots.\n        d01 = sqrt(pow(x1 - x0, 2) + pow(y1 - y0, 2));\n        d12 = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));\n\n        fa = tension * d01 / (d01 + d12);\n        fb = tension - fa;\n\n        p1x = x1 + fa * (x0 - x2);\n        p1y = y1 + fa * (y0 - y2);\n\n        p2x = x1 - fb * (x0 - x2);\n        p2y = y1 - fb * (y0 - y2);\n\n        return [p1x, p1y, p2x, p2y];\n    }\n\n    var line = [];\n\n    function drawLine(points, ctx, height, fill, seriesColor) {\n        var c = $.color.parse(seriesColor);\n\n        c.a = typeof fill == \"number\" ? fill : .3;\n        c.normalize();\n        c = c.toString();\n\n        ctx.beginPath();\n        ctx.moveTo(points[0][0], points[0][1]);\n\n        var plength = points.length;\n\n        for (var i = 0; i < plength; i++) {\n            ctx[points[i][3]].apply(ctx, points[i][2]);\n        }\n\n        ctx.stroke();\n\n        ctx.lineWidth = 0;\n        ctx.lineTo(points[plength - 1][0], height);\n        ctx.lineTo(points[0][0], height);\n\n        ctx.closePath();\n\n        if (fill !== false) {\n            ctx.fillStyle = c;\n            ctx.fill();\n        }\n    }\n\n    /**\n     * @param {Object} ctx: canvas context\n     * @param {String} type: accepted strings: 'bezier' or 'quadratic' (defaults to quadratic)\n     * @param {Array} points: 2 points for which to draw the interpolation\n     * @param {Array} cpoints: control points for those segment points\n     *\n     * @api private\n     */\n    function queue(ctx, type, points, cpoints) {\n        if (type === void 0 || (type !== 'bezier' && type !== 'quadratic')) {\n            type = 'quadratic';\n        }\n        type = type + 'CurveTo';\n\n        if (line.length == 0) line.push([points[0], points[1], cpoints.concat(points.slice(2)), type]);\n        else if (type == \"quadraticCurveTo\" && points.length == 2) {\n            cpoints = cpoints.slice(0, 2).concat(points);\n\n            line.push([points[0], points[1], cpoints, type]);\n        }\n        else line.push([points[2], points[3], cpoints.concat(points.slice(2)), type]);\n    }\n\n    /**\n     * @param {Object} plot\n     * @param {Object} ctx: canvas context\n     * @param {Object} series\n     *\n     * @api private\n     */\n\n    function drawSpline(plot, ctx, series) {\n        // Not interested if spline is not requested\n        if (series.splines.show !== true) {\n            return;\n        }\n\n        var cp = [],\n        // array of control points\n            tension = series.splines.tension || 0.5,\n            idx, x, y, points = series.datapoints.points,\n            ps = series.datapoints.pointsize,\n            plotOffset = plot.getPlotOffset(),\n            len = points.length,\n            pts = [];\n\n        line = [];\n\n        // Cannot display a linespline/areaspline if there are less than 3 points\n        if (len / ps < 4) {\n            $.extend(series.lines, series.splines);\n            return;\n        }\n\n        for (idx = 0; idx < len; idx += ps) {\n            x = points[idx];\n            y = points[idx + 1];\n            if (x == null || x < series.xaxis.min || x > series.xaxis.max || y < series.yaxis.min || y > series.yaxis.max) {\n                continue;\n            }\n\n            pts.push(series.xaxis.p2c(x) + plotOffset.left, series.yaxis.p2c(y) + plotOffset.top);\n        }\n\n        len = pts.length;\n\n        // Draw an open curve, not connected at the ends\n        for (idx = 0; idx < len - 2; idx += 2) {\n            cp = cp.concat(getControlPoints.apply(this, pts.slice(idx, idx + 6).concat([tension])));\n        }\n\n        ctx.save();\n        ctx.strokeStyle = series.color;\n        ctx.lineWidth = series.splines.lineWidth;\n\n        queue(ctx, 'quadratic', pts.slice(0, 4), cp.slice(0, 2));\n\n        for (idx = 2; idx < len - 3; idx += 2) {\n            queue(ctx, 'bezier', pts.slice(idx, idx + 4), cp.slice(2 * idx - 2, 2 * idx + 2));\n        }\n\n        queue(ctx, 'quadratic', pts.slice(len - 2, len), [cp[2 * len - 10], cp[2 * len - 9], pts[len - 4], pts[len - 3]]);\n\n        drawLine(line, ctx, plot.height() + 10, series.splines.fill, series.color);\n\n        ctx.restore();\n    }\n\n    $.plot.plugins.push({\n        init: function(plot) {\n            plot.hooks.drawSeries.push(drawSpline);\n        },\n        options: {\n            series: {\n                splines: {\n                    show: false,\n                    lineWidth: 2,\n                    tension: 0.5,\n                    fill: false\n                }\n            }\n        },\n        name: 'spline',\n        version: '0.8.2'\n    });\n})(jQuery);\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/flot/jquery.flot.symbol.js",
    "content": "/* Flot plugin that adds some extra symbols for plotting points.\n\n Copyright (c) 2007-2014 IOLA and Ole Laursen.\n Licensed under the MIT license.\n\n The symbols are accessed as strings through the standard symbol options:\n\n series: {\n points: {\n symbol: \"square\" // or \"diamond\", \"triangle\", \"cross\"\n }\n }\n\n */\n\n(function ($) {\n    function processRawData(plot, series, datapoints) {\n        // we normalize the area of each symbol so it is approximately the\n        // same as a circle of the given radius\n\n        var handlers = {\n            square: function (ctx, x, y, radius, shadow) {\n                // pi * r^2 = (2s)^2  =>  s = r * sqrt(pi)/2\n                var size = radius * Math.sqrt(Math.PI) / 2;\n                ctx.rect(x - size, y - size, size + size, size + size);\n            },\n            diamond: function (ctx, x, y, radius, shadow) {\n                // pi * r^2 = 2s^2  =>  s = r * sqrt(pi/2)\n                var size = radius * Math.sqrt(Math.PI / 2);\n                ctx.moveTo(x - size, y);\n                ctx.lineTo(x, y - size);\n                ctx.lineTo(x + size, y);\n                ctx.lineTo(x, y + size);\n                ctx.lineTo(x - size, y);\n            },\n            triangle: function (ctx, x, y, radius, shadow) {\n                // pi * r^2 = 1/2 * s^2 * sin (pi / 3)  =>  s = r * sqrt(2 * pi / sin(pi / 3))\n                var size = radius * Math.sqrt(2 * Math.PI / Math.sin(Math.PI / 3));\n                var height = size * Math.sin(Math.PI / 3);\n                ctx.moveTo(x - size/2, y + height/2);\n                ctx.lineTo(x + size/2, y + height/2);\n                if (!shadow) {\n                    ctx.lineTo(x, y - height/2);\n                    ctx.lineTo(x - size/2, y + height/2);\n                }\n            },\n            cross: function (ctx, x, y, radius, shadow) {\n                // pi * r^2 = (2s)^2  =>  s = r * sqrt(pi)/2\n                var size = radius * Math.sqrt(Math.PI) / 2;\n                ctx.moveTo(x - size, y - size);\n                ctx.lineTo(x + size, y + size);\n                ctx.moveTo(x - size, y + size);\n                ctx.lineTo(x + size, y - size);\n            }\n        };\n\n        var s = series.points.symbol;\n        if (handlers[s])\n            series.points.symbol = handlers[s];\n    }\n\n    function init(plot) {\n        plot.hooks.processDatapoints.push(processRawData);\n    }\n\n    $.plot.plugins.push({\n        init: init,\n        name: 'symbols',\n        version: '1.0'\n    });\n})(jQuery);\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/gritter/jquery.gritter.css",
    "content": "/* the norm */\n#gritter-notice-wrapper {\n\tposition:fixed;\n\ttop:40px;\n\tright:20px;\n\twidth:301px;\n\tz-index:9999;\n\n    -webkit-animation-duration: 1s;\n    animation-duration: 1s;\n    -webkit-animation-fill-mode: both;\n    animation-fill-mode: both;\n\n    -webkit-animation-name: bounceIn;\n    animation-name: bounceIn;\n}\n@keyframes bounceIn {\n    0% {\n        opacity: 0;\n        -webkit-transform: scale(.3);\n        -ms-transform: scale(.3);\n        transform: scale(.3);\n    }\n\n    50% {\n        opacity: 1;\n        -webkit-transform: scale(1.05);\n        -ms-transform: scale(1.05);\n        transform: scale(1.05);\n    }\n\n    70% {\n        -webkit-transform: scale(.9);\n        -ms-transform: scale(.9);\n        transform: scale(.9);\n    }\n\n    100% {\n        opacity: 1;\n        -webkit-transform: scale(1);\n        -ms-transform: scale(1);\n        transform: scale(1);\n    }\n}\n#gritter-notice-wrapper.top-left {\n    left: 20px;\n    right: auto;\n}\n#gritter-notice-wrapper.bottom-right {\n    top: auto;\n    left: auto;\n    bottom: 20px;\n    right: 20px;\n}\n#gritter-notice-wrapper.bottom-left {\n    top: auto;\n    right: auto;\n    bottom: 20px;\n    left: 20px;\n}\n.gritter-item-wrapper {\n\tposition:relative;\n\tmargin:0 0 10px 0;\n\tbackground:url('images/ie-spacer.gif'); /* ie7/8 fix */\n}\n\n.hover .gritter-top {\n\t/*background-position:right -30px;*/\n}\n.gritter-bottom {\n\theight:8px;\n\tmargin:0;\n}\n\n.gritter-item {\n\tdisplay:block;\n\tbackground-color: rgba(39,58,75,0.8);\n    border-radius: 4px;\n\tcolor:#eee;\n\tpadding:10px 11px 10px 11px;\n\tfont-size: 11px;\n\tfont-family:verdana;\n}\n.hover .gritter-item {\n\tbackground-position:right -40px;\n}\n.gritter-item p {\n\tpadding:0;\n\tmargin:0;\n\tword-wrap:break-word;\n}\n\n.gritter-item a:hover {\n    color: #f8ac59;\n    text-decoration: underline;\n}\n.gritter-close {\n\tdisplay:none;\n\tposition:absolute;\n\ttop:5px;\n\tright:3px;\n\tbackground:url(images/gritter.png) no-repeat left top;\n\tcursor:pointer;\n\twidth:30px;\n\theight:30px;\n\ttext-indent:-9999em;\n}\n.gritter-title {\n\tfont-size:12px;\n\tfont-weight:bold;\n\tpadding:0 0 7px 0;\n\tdisplay:block;\n    text-transform: uppercase;\n}\n.gritter-image {\n\twidth:48px;\n\theight:48px;\n\tfloat:left;\n}\n.gritter-with-image,\n.gritter-without-image {\n\tpadding:0;\n}\n.gritter-with-image {\n\twidth:220px;\n\tfloat:right;\n}\n/* for the light (white) version of the gritter notice */\n.gritter-light .gritter-item,\n.gritter-light .gritter-bottom,\n.gritter-light .gritter-top,\n.gritter-light .gritter-close {\n    background-image: url(images/gritter-light.png);\n    color: #222;\n}\n.gritter-light .gritter-title {\n    text-shadow: none;\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/jeditable/jquery.jeditable.js",
    "content": "/*\n * Jeditable - jQuery in place edit plugin\n *\n * Copyright (c) 2006-2009 Mika Tuupola, Dylan Verheul\n *\n * Licensed under the MIT license:\n *   http://www.opensource.org/licenses/mit-license.php\n *\n * Project home:\n *   http://www.appelsiini.net/projects/jeditable\n *\n * Based on editable by Dylan Verheul <dylan_at_dyve.net>:\n *    http://www.dyve.net/jquery/?editable\n *\n */\n\n/**\n * Version 1.7.1\n *\n * ** means there is basic unit tests for this parameter.\n *\n * @name  Jeditable\n * @type  jQuery\n * @param String  target             (POST) URL or function to send edited content to **\n * @param Hash    options            additional options\n * @param String  options[method]    method to use to send edited content (POST or PUT) **\n * @param Function options[callback] Function to run after submitting edited content **\n * @param String  options[name]      POST parameter name of edited content\n * @param String  options[id]        POST parameter name of edited div id\n * @param Hash    options[submitdata] Extra parameters to send when submitting edited content.\n * @param String  options[type]      text, textarea or select (or any 3rd party input type) **\n * @param Integer options[rows]      number of rows if using textarea **\n * @param Integer options[cols]      number of columns if using textarea **\n * @param Mixed   options[height]    'auto', 'none' or height in pixels **\n * @param Mixed   options[width]     'auto', 'none' or width in pixels **\n * @param String  options[loadurl]   URL to fetch input content before editing **\n * @param String  options[loadtype]  Request type for load url. Should be GET or POST.\n * @param String  options[loadtext]  Text to display while loading external content.\n * @param Mixed   options[loaddata]  Extra parameters to pass when fetching content before editing.\n * @param Mixed   options[data]      Or content given as paramameter. String or function.**\n * @param String  options[indicator] indicator html to show when saving\n * @param String  options[tooltip]   optional tooltip text via title attribute **\n * @param String  options[event]     jQuery event such as 'click' of 'dblclick' **\n * @param String  options[submit]    submit button value, empty means no button **\n * @param String  options[cancel]    cancel button value, empty means no button **\n * @param String  options[cssclass]  CSS class to apply to input form. 'inherit' to copy from parent. **\n * @param String  options[style]     Style to apply to input form 'inherit' to copy from parent. **\n * @param String  options[select]    true or false, when true text is highlighted ??\n * @param String  options[placeholder] Placeholder text or html to insert when element is empty. **\n * @param String  options[onblur]    'cancel', 'submit', 'ignore' or function ??\n *\n * @param Function options[onsubmit] function(settings, original) { ... } called before submit\n * @param Function options[onreset]  function(settings, original) { ... } called before reset\n * @param Function options[onerror]  function(settings, original, xhr) { ... } called on error\n *\n * @param Hash    options[ajaxoptions]  jQuery Ajax options. See docs.jquery.com.\n *\n */\n\n(function($) {\n\n    $.fn.editable = function(target, options) {\n\n        if ('disable' == target) {\n            $(this).data('disabled.editable', true);\n            return;\n        }\n        if ('enable' == target) {\n            $(this).data('disabled.editable', false);\n            return;\n        }\n        if ('destroy' == target) {\n            $(this)\n                .unbind($(this).data('event.editable'))\n                .removeData('disabled.editable')\n                .removeData('event.editable');\n            return;\n        }\n\n        var settings = $.extend({}, $.fn.editable.defaults, {target:target}, options);\n\n        /* setup some functions */\n        var plugin   = $.editable.types[settings.type].plugin || function() { };\n        var submit   = $.editable.types[settings.type].submit || function() { };\n        var buttons  = $.editable.types[settings.type].buttons\n            || $.editable.types['defaults'].buttons;\n        var content  = $.editable.types[settings.type].content\n            || $.editable.types['defaults'].content;\n        var element  = $.editable.types[settings.type].element\n            || $.editable.types['defaults'].element;\n        var reset    = $.editable.types[settings.type].reset\n            || $.editable.types['defaults'].reset;\n        var callback = settings.callback || function() { };\n        var onedit   = settings.onedit   || function() { };\n        var onsubmit = settings.onsubmit || function() { };\n        var onreset  = settings.onreset  || function() { };\n        var onerror  = settings.onerror  || reset;\n\n        /* show tooltip */\n        if (settings.tooltip) {\n            $(this).attr('title', settings.tooltip);\n        }\n\n        settings.autowidth  = 'auto' == settings.width;\n        settings.autoheight = 'auto' == settings.height;\n\n        return this.each(function() {\n\n            /* save this to self because this changes when scope changes */\n            var self = this;\n\n            /* inlined block elements lose their width and height after first edit */\n            /* save them for later use as workaround */\n            var savedwidth  = $(self).width();\n            var savedheight = $(self).height();\n\n            /* save so it can be later used by $.editable('destroy') */\n            $(this).data('event.editable', settings.event);\n\n            /* if element is empty add something clickable (if requested) */\n            if (!$.trim($(this).html())) {\n                $(this).html(settings.placeholder);\n            }\n\n            $(this).bind(settings.event, function(e) {\n\n                /* abort if disabled for this element */\n                if (true === $(this).data('disabled.editable')) {\n                    return;\n                }\n\n                /* prevent throwing an exeption if edit field is clicked again */\n                if (self.editing) {\n                    return;\n                }\n\n                /* abort if onedit hook returns false */\n                if (false === onedit.apply(this, [settings, self])) {\n                    return;\n                }\n\n                /* prevent default action and bubbling */\n                e.preventDefault();\n                e.stopPropagation();\n\n                /* remove tooltip */\n                if (settings.tooltip) {\n                    $(self).removeAttr('title');\n                }\n\n                /* figure out how wide and tall we are, saved width and height */\n                /* are workaround for http://dev.jquery.com/ticket/2190 */\n                if (0 == $(self).width()) {\n                    //$(self).css('visibility', 'hidden');\n                    settings.width  = savedwidth;\n                    settings.height = savedheight;\n                } else {\n                    if (settings.width != 'none') {\n                        settings.width =\n                            settings.autowidth ? $(self).width()  : settings.width;\n                    }\n                    if (settings.height != 'none') {\n                        settings.height =\n                            settings.autoheight ? $(self).height() : settings.height;\n                    }\n                }\n                //$(this).css('visibility', '');\n\n                /* remove placeholder text, replace is here because of IE */\n                if ($(this).html().toLowerCase().replace(/(;|\")/g, '') ==\n                    settings.placeholder.toLowerCase().replace(/(;|\")/g, '')) {\n                    $(this).html('');\n                }\n\n                self.editing    = true;\n                self.revert     = $(self).html();\n                $(self).html('');\n\n                /* create the form object */\n                var form = $('<form />');\n\n                /* apply css or style or both */\n                if (settings.cssclass) {\n                    if ('inherit' == settings.cssclass) {\n                        form.attr('class', $(self).attr('class'));\n                    } else {\n                        form.attr('class', settings.cssclass);\n                    }\n                }\n\n                if (settings.style) {\n                    if ('inherit' == settings.style) {\n                        form.attr('style', $(self).attr('style'));\n                        /* IE needs the second line or display wont be inherited */\n                        form.css('display', $(self).css('display'));\n                    } else {\n                        form.attr('style', settings.style);\n                    }\n                }\n\n                /* add main input element to form and store it in input */\n                var input = element.apply(form, [settings, self]);\n\n                /* set input content via POST, GET, given data or existing value */\n                var input_content;\n\n                if (settings.loadurl) {\n                    var t = setTimeout(function() {\n                        input.disabled = true;\n                        content.apply(form, [settings.loadtext, settings, self]);\n                    }, 100);\n\n                    var loaddata = {};\n                    loaddata[settings.id] = self.id;\n                    if ($.isFunction(settings.loaddata)) {\n                        $.extend(loaddata, settings.loaddata.apply(self, [self.revert, settings]));\n                    } else {\n                        $.extend(loaddata, settings.loaddata);\n                    }\n                    $.ajax({\n                        type : settings.loadtype,\n                        url  : settings.loadurl,\n                        data : loaddata,\n                        async : false,\n                        success: function(result) {\n                            window.clearTimeout(t);\n                            input_content = result;\n                            input.disabled = false;\n                        }\n                    });\n                } else if (settings.data) {\n                    input_content = settings.data;\n                    if ($.isFunction(settings.data)) {\n                        input_content = settings.data.apply(self, [self.revert, settings]);\n                    }\n                } else {\n                    input_content = self.revert;\n                }\n                content.apply(form, [input_content, settings, self]);\n\n                input.attr('name', settings.name);\n\n                /* add buttons to the form */\n                buttons.apply(form, [settings, self]);\n\n                /* add created form to self */\n                $(self).append(form);\n\n                /* attach 3rd party plugin if requested */\n                plugin.apply(form, [settings, self]);\n\n                /* focus to first visible form element */\n                $(':input:visible:enabled:first', form).focus();\n\n                /* highlight input contents when requested */\n                if (settings.select) {\n                    input.select();\n                }\n\n                /* discard changes if pressing esc */\n                input.keydown(function(e) {\n                    if (e.keyCode == 27) {\n                        e.preventDefault();\n                        //self.reset();\n                        reset.apply(form, [settings, self]);\n                    }\n                });\n\n                /* discard, submit or nothing with changes when clicking outside */\n                /* do nothing is usable when navigating with tab */\n                var t;\n                if ('cancel' == settings.onblur) {\n                    input.blur(function(e) {\n                        /* prevent canceling if submit was clicked */\n                        t = setTimeout(function() {\n                            reset.apply(form, [settings, self]);\n                        }, 500);\n                    });\n                } else if ('submit' == settings.onblur) {\n                    input.blur(function(e) {\n                        /* prevent double submit if submit was clicked */\n                        t = setTimeout(function() {\n                            form.submit();\n                        }, 200);\n                    });\n                } else if ($.isFunction(settings.onblur)) {\n                    input.blur(function(e) {\n                        settings.onblur.apply(self, [input.val(), settings]);\n                    });\n                } else {\n                    input.blur(function(e) {\n                        /* TODO: maybe something here */\n                    });\n                }\n\n                form.submit(function(e) {\n\n                    if (t) {\n                        clearTimeout(t);\n                    }\n\n                    /* do no submit */\n                    e.preventDefault();\n\n                    /* call before submit hook. */\n                    /* if it returns false abort submitting */\n                    if (false !== onsubmit.apply(form, [settings, self])) {\n                        /* custom inputs call before submit hook. */\n                        /* if it returns false abort submitting */\n                        if (false !== submit.apply(form, [settings, self])) {\n\n                            /* check if given target is function */\n                            if ($.isFunction(settings.target)) {\n                                var str = settings.target.apply(self, [input.val(), settings]);\n                                $(self).html(str);\n                                self.editing = false;\n                                callback.apply(self, [self.innerHTML, settings]);\n                                /* TODO: this is not dry */\n                                if (!$.trim($(self).html())) {\n                                    $(self).html(settings.placeholder);\n                                }\n                            } else {\n                                /* add edited content and id of edited element to POST */\n                                var submitdata = {};\n                                submitdata[settings.name] = input.val();\n                                submitdata[settings.id] = self.id;\n                                /* add extra data to be POST:ed */\n                                if ($.isFunction(settings.submitdata)) {\n                                    $.extend(submitdata, settings.submitdata.apply(self, [self.revert, settings]));\n                                } else {\n                                    $.extend(submitdata, settings.submitdata);\n                                }\n\n                                /* quick and dirty PUT support */\n                                if ('PUT' == settings.method) {\n                                    submitdata['_method'] = 'put';\n                                }\n\n                                /* show the saving indicator */\n                                $(self).html(settings.indicator);\n\n                                /* defaults for ajaxoptions */\n                                var ajaxoptions = {\n                                    type    : 'POST',\n                                    data    : submitdata,\n                                    dataType: 'html',\n                                    url     : settings.target,\n                                    success : function(result, status) {\n                                        if (ajaxoptions.dataType == 'html') {\n                                            $(self).html(result);\n                                        }\n                                        self.editing = false;\n                                        callback.apply(self, [result, settings]);\n                                        if (!$.trim($(self).html())) {\n                                            $(self).html(settings.placeholder);\n                                        }\n                                    },\n                                    error   : function(xhr, status, error) {\n                                        onerror.apply(form, [settings, self, xhr]);\n                                    }\n                                };\n\n                                /* override with what is given in settings.ajaxoptions */\n                                $.extend(ajaxoptions, settings.ajaxoptions);\n                                $.ajax(ajaxoptions);\n\n                            }\n                        }\n                    }\n\n                    /* show tooltip again */\n                    $(self).attr('title', settings.tooltip);\n\n                    return false;\n                });\n            });\n\n            /* privileged methods */\n            this.reset = function(form) {\n                /* prevent calling reset twice when blurring */\n                if (this.editing) {\n                    /* before reset hook, if it returns false abort reseting */\n                    if (false !== onreset.apply(form, [settings, self])) {\n                        $(self).html(self.revert);\n                        self.editing   = false;\n                        if (!$.trim($(self).html())) {\n                            $(self).html(settings.placeholder);\n                        }\n                        /* show tooltip again */\n                        if (settings.tooltip) {\n                            $(self).attr('title', settings.tooltip);\n                        }\n                    }\n                }\n            };\n        });\n\n    };\n\n\n    $.editable = {\n        types: {\n            defaults: {\n                element : function(settings, original) {\n                    var input = $('<input type=\"hidden\"></input>');\n                    $(this).append(input);\n                    return(input);\n                },\n                content : function(string, settings, original) {\n                    $(':input:first', this).val(string);\n                },\n                reset : function(settings, original) {\n                    original.reset(this);\n                },\n                buttons : function(settings, original) {\n                    var form = this;\n                    if (settings.submit) {\n                        /* if given html string use that */\n                        if (settings.submit.match(/>$/)) {\n                            var submit = $(settings.submit).click(function() {\n                                if (submit.attr(\"type\") != \"submit\") {\n                                    form.submit();\n                                }\n                            });\n                            /* otherwise use button with given string as text */\n                        } else {\n                            var submit = $('<button type=\"submit\" />');\n                            submit.html(settings.submit);\n                        }\n                        $(this).append(submit);\n                    }\n                    if (settings.cancel) {\n                        /* if given html string use that */\n                        if (settings.cancel.match(/>$/)) {\n                            var cancel = $(settings.cancel);\n                            /* otherwise use button with given string as text */\n                        } else {\n                            var cancel = $('<button type=\"cancel\" />');\n                            cancel.html(settings.cancel);\n                        }\n                        $(this).append(cancel);\n\n                        $(cancel).click(function(event) {\n                            //original.reset();\n                            if ($.isFunction($.editable.types[settings.type].reset)) {\n                                var reset = $.editable.types[settings.type].reset;\n                            } else {\n                                var reset = $.editable.types['defaults'].reset;\n                            }\n                            reset.apply(form, [settings, original]);\n                            return false;\n                        });\n                    }\n                }\n            },\n            text: {\n                element : function(settings, original) {\n                    var input = $('<input />');\n                    if (settings.width  != 'none') { input.width(settings.width);  }\n                    if (settings.height != 'none') { input.height(settings.height); }\n                    /* https://bugzilla.mozilla.org/show_bug.cgi?id=236791 */\n                    //input[0].setAttribute('autocomplete','off');\n                    input.attr('autocomplete','off');\n                    $(this).append(input);\n                    return(input);\n                }\n            },\n            textarea: {\n                element : function(settings, original) {\n                    var textarea = $('<textarea />');\n                    if (settings.rows) {\n                        textarea.attr('rows', settings.rows);\n                    } else if (settings.height != \"none\") {\n                        textarea.height(settings.height);\n                    }\n                    if (settings.cols) {\n                        textarea.attr('cols', settings.cols);\n                    } else if (settings.width != \"none\") {\n                        textarea.width(settings.width);\n                    }\n                    $(this).append(textarea);\n                    return(textarea);\n                }\n            },\n            select: {\n                element : function(settings, original) {\n                    var select = $('<select />');\n                    $(this).append(select);\n                    return(select);\n                },\n                content : function(data, settings, original) {\n                    /* If it is string assume it is json. */\n                    if (String == data.constructor) {\n                        eval ('var json = ' + data);\n                    } else {\n                        /* Otherwise assume it is a hash already. */\n                        var json = data;\n                    }\n                    for (var key in json) {\n                        if (!json.hasOwnProperty(key)) {\n                            continue;\n                        }\n                        if ('selected' == key) {\n                            continue;\n                        }\n                        var option = $('<option />').val(key).append(json[key]);\n                        $('select', this).append(option);\n                    }\n                    /* Loop option again to set selected. IE needed this... */\n                    $('select', this).children().each(function() {\n                        if ($(this).val() == json['selected'] ||\n                            $(this).text() == $.trim(original.revert)) {\n                            $(this).attr('selected', 'selected');\n                        }\n                    });\n                }\n            }\n        },\n\n        /* Add new input type */\n        addInputType: function(name, input) {\n            $.editable.types[name] = input;\n        }\n    };\n\n    // publicly accessible defaults\n    $.fn.editable.defaults = {\n        name       : 'value',\n        id         : 'id',\n        type       : 'text',\n        width      : 'auto',\n        height     : 'auto',\n        event      : 'click.editable',\n        onblur     : 'cancel',\n        loadtype   : 'GET',\n        loadtext   : 'Loading...',\n        placeholder: 'Click to edit',\n        loaddata   : {},\n        submitdata : {},\n        ajaxoptions: {}\n    };\n\n})(jQuery);\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/jqgrid/i18n/grid.locale-cnffe4.js",
    "content": "/**\n * jqGrid Chinese Translation\n * 咖啡兔 yanhonglei@gmail.com\n * http://www.kafeitu.me\n * Dual licensed under the MIT and GPL licenses:\n * http://www.opensource.org/licenses/mit-license.php\n * http://www.gnu.org/licenses/gpl.html\n**/\n/*global jQuery, define */\n(function( factory ) {\n\t\"use strict\";\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([\n\t\t\t\"jquery\",\n\t\t\t\"../grid.base\"\n\t\t], factory );\n\t} else {\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n}(function( $ ) {\n\n$.jgrid = $.jgrid || {};\nif(!$.jgrid.hasOwnProperty(\"regional\")) {\n\t$.jgrid.regional = [];\n}\n$.jgrid.regional[\"cn\"] = {\n    defaults : {\n        recordtext: \"{0} - {1}\\u3000共 {2} 条\", // 共字前是全角空格\n        emptyrecords: \"无数据显示\",\n        loadtext: \"读取中...\",\n\t\tsavetext: \"Saving...\",\n        pgtext : \" {0} 共 {1} 页\",\n\t\tpgfirst : \"First Page\",\n\t\tpglast : \"Last Page\",\n\t\tpgnext : \"Next Page\",\n\t\tpgprev : \"Previous Page\",\n\t\tpgrecs : \"Records per Page\",\n\t\tshowhide: \"Toggle Expand Collapse Grid\",\n\t\t// mobile\n\t\tpagerCaption : \"Grid::Page Settings\",\n\t\tpageText : \"Page:\",\n\t\trecordPage : \"Records per Page\",\n\t\tnomorerecs : \"No more records...\",\n\t\tscrollPullup: \"Pull up to load more...\",\n\t\tscrollPulldown : \"Pull down to refresh...\",\n\t\tscrollRefresh : \"Release to refresh...\"\n    },\n    search : {\n        caption: \"搜索...\",\n        Find: \"查找\",\n        Reset: \"重置\",\n        odata: [{ oper:'eq', text:'等于\\u3000\\u3000'},{ oper:'ne', text:'不等\\u3000\\u3000'},{ oper:'lt', text:'小于\\u3000\\u3000'},{ oper:'le', text:'小于等于'},{ oper:'gt', text:'大于\\u3000\\u3000'},{ oper:'ge', text:'大于等于'},{ oper:'bw', text:'开始于'},{ oper:'bn', text:'不开始于'},{ oper:'in', text:'属于\\u3000\\u3000'},{ oper:'ni', text:'不属于'},{ oper:'ew', text:'结束于'},{ oper:'en', text:'不结束于'},{ oper:'cn', text:'包含\\u3000\\u3000'},{ oper:'nc', text:'不包含'},{ oper:'nu', text:'不存在'},{ oper:'nn', text:'存在'}],\n        groupOps: [ { op: \"AND\", text: \"所有\" },    { op: \"OR\",  text: \"任一\" } ],\n\t\toperandTitle : \"Click to select search operation.\",\n\t\tresetTitle : \"Reset Search Value\"\n    },\n    edit : {\n        addCaption: \"添加记录\",\n        editCaption: \"编辑记录\",\n        bSubmit: \"提交\",\n        bCancel: \"取消\",\n        bClose: \"关闭\",\n        saveData: \"数据已改变，是否保存？\",\n        bYes : \"是\",\n        bNo : \"否\",\n        bExit : \"取消\",\n        msg: {\n            required:\"此字段必需\",\n            number:\"请输入有效数字\",\n            minValue:\"输值必须大于等于 \",\n            maxValue:\"输值必须小于等于 \",\n            email: \"这不是有效的e-mail地址\",\n            integer: \"请输入有效整数\",\n            date: \"请输入有效时间\",\n            url: \"无效网址。前缀必须为 ('http://' 或 'https://')\",\n            nodefined : \" 未定义！\",\n            novalue : \" 需要返回值！\",\n            customarray : \"自定义函数需要返回数组！\",\n            customfcheck : \"必须有自定义函数!\"\n        }\n    },\n    view : {\n        caption: \"查看记录\",\n        bClose: \"关闭\"\n    },\n    del : {\n        caption: \"删除\",\n        msg: \"删除所选记录？\",\n        bSubmit: \"删除\",\n        bCancel: \"取消\"\n    },\n    nav : {\n        edittext: \"\",\n        edittitle: \"编辑所选记录\",\n        addtext:\"\",\n        addtitle: \"添加新记录\",\n        deltext: \"\",\n        deltitle: \"删除所选记录\",\n        searchtext: \"\",\n        searchtitle: \"查找\",\n        refreshtext: \"\",\n        refreshtitle: \"刷新表格\",\n        alertcap: \"注意\",\n        alerttext: \"请选择记录\",\n        viewtext: \"\",\n        viewtitle: \"查看所选记录\",\n\t\tsavetext: \"\",\n\t\tsavetitle: \"Save row\",\n\t\tcanceltext: \"\",\n\t\tcanceltitle : \"Cancel row editing\",\n\t\tselectcaption : \"Actions...\"\n    },\n    col : {\n        caption: \"选择列\",\n        bSubmit: \"确定\",\n        bCancel: \"取消\"\n    },\n    errors : {\n        errcap : \"错误\",\n        nourl : \"没有设置url\",\n        norecords: \"没有要处理的记录\",\n        model : \"colNames 和 colModel 长度不等！\"\n    },\n    formatter : {\n        integer : {thousandsSeparator: \",\", defaultValue: '0'},\n        number : {decimalSeparator:\".\", thousandsSeparator: \",\", decimalPlaces: 2, defaultValue: '0.00'},\n        currency : {decimalSeparator:\".\", thousandsSeparator: \",\", decimalPlaces: 2, prefix: \"\", suffix:\"\", defaultValue: '0.00'},\n        date : {\n            dayNames:   [\n                \"日\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\",\n                \"星期日\", \"星期一\", \"星期二\", \"星期三\", \"星期四\", \"星期五\", \"星期六\",\n            ],\n            monthNames: [\n                \"一\", \"二\", \"三\", \"四\", \"五\", \"六\", \"七\", \"八\", \"九\", \"十\", \"十一\", \"十二\",\n                \"一月\", \"二月\", \"三月\", \"四月\", \"五月\", \"六月\", \"七月\", \"八月\", \"九月\", \"十月\", \"十一月\", \"十二月\"\n            ],\n            AmPm : [\"am\",\"pm\",\"上午\",\"下午\"],\n            S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th';},\n            srcformat: 'Y-m-d',\n            newformat: 'Y-m-d',\n            parseRe : /[#%\\\\\\/:_;.,\\t\\s-]/,\n            masks : {\n                // see http://php.net/manual/en/function.date.php for PHP format used in jqGrid\n                // and see http://docs.jquery.com/UI/Datepicker/formatDate\n                // and https://github.com/jquery/globalize#dates for alternative formats used frequently\n                // one can find on https://github.com/jquery/globalize/tree/master/lib/cultures many\n                // information about date, time, numbers and currency formats used in different countries\n                // one should just convert the information in PHP format\n                ISO8601Long:\"Y-m-d H:i:s\",\n                ISO8601Short:\"Y-m-d\",\n                // short date:\n                //    n - Numeric representation of a month, without leading zeros\n                //    j - Day of the month without leading zeros\n                //    Y - A full numeric representation of a year, 4 digits\n                // example: 3/1/2012 which means 1 March 2012\n                ShortDate: \"n/j/Y\", // in jQuery UI Datepicker: \"M/d/yyyy\"\n                // long date:\n                //    l - A full textual representation of the day of the week\n                //    F - A full textual representation of a month\n                //    d - Day of the month, 2 digits with leading zeros\n                //    Y - A full numeric representation of a year, 4 digits\n                LongDate: \"l, F d, Y\", // in jQuery UI Datepicker: \"dddd, MMMM dd, yyyy\"\n                // long date with long time:\n                //    l - A full textual representation of the day of the week\n                //    F - A full textual representation of a month\n                //    d - Day of the month, 2 digits with leading zeros\n                //    Y - A full numeric representation of a year, 4 digits\n                //    g - 12-hour format of an hour without leading zeros\n                //    i - Minutes with leading zeros\n                //    s - Seconds, with leading zeros\n                //    A - Uppercase Ante meridiem and Post meridiem (AM or PM)\n                FullDateTime: \"l, F d, Y g:i:s A\", // in jQuery UI Datepicker: \"dddd, MMMM dd, yyyy h:mm:ss tt\"\n                // month day:\n                //    F - A full textual representation of a month\n                //    d - Day of the month, 2 digits with leading zeros\n                MonthDay: \"F d\", // in jQuery UI Datepicker: \"MMMM dd\"\n                // short time (without seconds)\n                //    g - 12-hour format of an hour without leading zeros\n                //    i - Minutes with leading zeros\n                //    A - Uppercase Ante meridiem and Post meridiem (AM or PM)\n                ShortTime: \"g:i A\", // in jQuery UI Datepicker: \"h:mm tt\"\n                // long time (with seconds)\n                //    g - 12-hour format of an hour without leading zeros\n                //    i - Minutes with leading zeros\n                //    s - Seconds, with leading zeros\n                //    A - Uppercase Ante meridiem and Post meridiem (AM or PM)\n                LongTime: \"g:i:s A\", // in jQuery UI Datepicker: \"h:mm:ss tt\"\n                SortableDateTime: \"Y-m-d\\\\TH:i:s\",\n                UniversalSortableDateTime: \"Y-m-d H:i:sO\",\n                // month with year\n                //    Y - A full numeric representation of a year, 4 digits\n                //    F - A full textual representation of a month\n                YearMonth: \"F, Y\" // in jQuery UI Datepicker: \"MMMM, yyyy\"\n            },\n            reformatAfterEdit : false,\n\t\t\tuserLocalTime : false\n        },\n        baseLinkUrl: '',\n        showAction: '',\n        target: '',\n        checkbox : {disabled:true},\n        idName : 'id'\n    }\n};\n}));\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/jqgrid/jquery.jqGrid.minffe4.js",
    "content": "/**\n*\n* @license Guriddo jqGrid JS - v5.0.0 - 2015-08-03\n* Copyright(c) 2008, Tony Tomov, tony@trirand.com\n*\n* License: http://guriddo.net/?page_id=103334\n*/\n\n!function(a){\"use strict\";\"function\"==typeof define&&define.amd?define([\"jquery\"],a):a(jQuery)}(function($){\"use strict\";function _pivotfilter(a,b){var c,d,e,f=[];if(!this||\"function\"!=typeof a||a instanceof RegExp)throw new TypeError;for(e=this.length,c=0;e>c;c++)if(this.hasOwnProperty(c)&&(d=this[c],a.call(b,d,c,this))){f.push(d);break}return f}$.jgrid=$.jgrid||{},$.jgrid.hasOwnProperty(\"defaults\")||($.jgrid.defaults={}),$.extend($.jgrid,{version:\"5.0.0\",htmlDecode:function(a){return a&&(\"&nbsp;\"===a||\"&#160;\"===a||1===a.length&&160===a.charCodeAt(0))?\"\":a?String(a).replace(/&gt;/g,\">\").replace(/&lt;/g,\"<\").replace(/&quot;/g,'\"').replace(/&amp;/g,\"&\"):a},htmlEncode:function(a){return a?String(a).replace(/&/g,\"&amp;\").replace(/\\\"/g,\"&quot;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\"):a},template:function(a){var b,c=$.makeArray(arguments).slice(1),d=c.length;return null==a&&(a=\"\"),a.replace(/\\{([\\w\\-]+)(?:\\:([\\w\\.]*)(?:\\((.*?)?\\))?)?\\}/g,function(a,e){if(!isNaN(parseInt(e,10)))return c[parseInt(e,10)];for(b=0;d>b;b++)if($.isArray(c[b]))for(var f=c[b],g=f.length;g--;)if(e===f[g].nm)return f[g].v})},msie:\"Microsoft Internet Explorer\"===navigator.appName,msiever:function(){var a=-1,b=navigator.userAgent,c=new RegExp(\"MSIE ([0-9]{1,}[.0-9]{0,})\");return null!=c.exec(b)&&(a=parseFloat(RegExp.$1)),a},getCellIndex:function(a){var b=$(a);return b.is(\"tr\")?-1:(b=(b.is(\"td\")||b.is(\"th\")?b:b.closest(\"td,th\"))[0],$.jgrid.msie?$.inArray(b,b.parentNode.cells):b.cellIndex)},stripHtml:function(a){a=String(a);var b=/<(\"[^\"]*\"|'[^']*'|[^'\">])*>/gi;return a?(a=a.replace(b,\"\"),a&&\"&nbsp;\"!==a&&\"&#160;\"!==a?a.replace(/\\\"/g,\"'\"):\"\"):a},stripPref:function(a,b){var c=$.type(a);return(\"string\"===c||\"number\"===c)&&(a=String(a),b=\"\"!==a?String(b).replace(String(a),\"\"):b),b},parse:function(jsonString){var js=jsonString;return\"while(1);\"===js.substr(0,9)&&(js=js.substr(9)),\"/*\"===js.substr(0,2)&&(js=js.substr(2,js.length-4)),js||(js=\"{}\"),$.jgrid.useJSON===!0&&\"object\"==typeof JSON&&\"function\"==typeof JSON.parse?JSON.parse(js):eval(\"(\"+js+\")\")},parseDate:function(a,b,c,d){var e,f,g,h=/\\\\.|[dDjlNSwzWFmMntLoYyaABgGhHisueIOPTZcrU]/g,i=/\\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\\d{4})?)\\b/g,j=/[^-+\\dA-Z]/g,k=new RegExp(\"^/Date\\\\((([-+])?[0-9]+)(([-+])([0-9]{2})([0-9]{2}))?\\\\)/$\"),l=\"string\"==typeof b?b.match(k):null,m=function(a,b){for(a=String(a),b=parseInt(b,10)||2;a.length<b;)a=\"0\"+a;return a},n={m:1,d:1,y:1970,h:0,i:0,s:0,u:0},o=0,p=function(a,b){return 0===a?12===b&&(b=0):12!==b&&(b+=12),b},q=0;if(void 0===d&&(d=$.jgrid.getRegional(this,\"formatter.date\")),void 0===d.parseRe&&(d.parseRe=/[#%\\\\\\/:_;.,\\t\\s-]/),d.masks.hasOwnProperty(a)&&(a=d.masks[a]),b&&null!=b)if(isNaN(b-0)||\"u\"!==String(a).toLowerCase())if(b.constructor===Date)o=b;else if(null!==l)o=new Date(parseInt(l[1],10)),l[3]&&(q=60*Number(l[5])+Number(l[6]),q*=\"-\"===l[4]?1:-1,q-=o.getTimezoneOffset(),o.setTime(Number(Number(o)+60*q*1e3)));else{for(\"ISO8601Long\"===d.srcformat&&\"Z\"===b.charAt(b.length-1)&&(q-=(new Date).getTimezoneOffset()),b=String(b).replace(/\\T/g,\"#\").replace(/\\t/,\"%\").split(d.parseRe),a=a.replace(/\\T/g,\"#\").replace(/\\t/,\"%\").split(d.parseRe),f=0,g=a.length;g>f;f++){switch(a[f]){case\"M\":e=$.inArray(b[f],d.monthNames),-1!==e&&12>e&&(b[f]=e+1,n.m=b[f]);break;case\"F\":e=$.inArray(b[f],d.monthNames,12),-1!==e&&e>11&&(b[f]=e+1-12,n.m=b[f]);break;case\"n\":a[f]=\"m\";break;case\"j\":a[f]=\"d\";break;case\"a\":e=$.inArray(b[f],d.AmPm),-1!==e&&2>e&&b[f]===d.AmPm[e]&&(b[f]=e,n.h=p(b[f],n.h));break;case\"A\":e=$.inArray(b[f],d.AmPm),-1!==e&&e>1&&b[f]===d.AmPm[e]&&(b[f]=e-2,n.h=p(b[f],n.h));break;case\"g\":n.h=parseInt(b[f],10)}void 0!==b[f]&&(n[a[f].toLowerCase()]=parseInt(b[f],10))}if(n.f&&(n.m=n.f),0===n.m&&0===n.y&&0===n.d)return\"&#160;\";n.m=parseInt(n.m,10)-1;var r=n.y;r>=70&&99>=r?n.y=1900+n.y:r>=0&&69>=r&&(n.y=2e3+n.y),o=new Date(n.y,n.m,n.d,n.h,n.i,n.s,n.u),q>0&&o.setTime(Number(Number(o)+60*q*1e3))}else o=new Date(1e3*parseFloat(b));else o=new Date(n.y,n.m,n.d,n.h,n.i,n.s,n.u);if(d.userLocalTime&&0===q&&(q-=(new Date).getTimezoneOffset(),q>0&&o.setTime(Number(Number(o)+60*q*1e3))),void 0===c)return o;d.masks.hasOwnProperty(c)?c=d.masks[c]:c||(c=\"Y-m-d\");var s=o.getHours(),t=o.getMinutes(),u=o.getDate(),v=o.getMonth()+1,w=o.getTimezoneOffset(),x=o.getSeconds(),y=o.getMilliseconds(),z=o.getDay(),A=o.getFullYear(),B=(z+6)%7+1,C=(new Date(A,v-1,u)-new Date(A,0,1))/864e5,D={d:m(u),D:d.dayNames[z],j:u,l:d.dayNames[z+7],N:B,S:d.S(u),w:z,z:C,W:5>B?Math.floor((C+B-1)/7)+1:Math.floor((C+B-1)/7)||((new Date(A-1,0,1).getDay()+6)%7<4?53:52),F:d.monthNames[v-1+12],m:m(v),M:d.monthNames[v-1],n:v,t:\"?\",L:\"?\",o:\"?\",Y:A,y:String(A).substring(2),a:12>s?d.AmPm[0]:d.AmPm[1],A:12>s?d.AmPm[2]:d.AmPm[3],B:\"?\",g:s%12||12,G:s,h:m(s%12||12),H:m(s),i:m(t),s:m(x),u:y,e:\"?\",I:\"?\",O:(w>0?\"-\":\"+\")+m(100*Math.floor(Math.abs(w)/60)+Math.abs(w)%60,4),P:\"?\",T:(String(o).match(i)||[\"\"]).pop().replace(j,\"\"),Z:\"?\",c:\"?\",r:\"?\",U:Math.floor(o/1e3)};return c.replace(h,function(a){return D.hasOwnProperty(a)?D[a]:a.substring(1)})},jqID:function(a){return String(a).replace(/[!\"#$%&'()*+,.\\/:; <=>?@\\[\\\\\\]\\^`{|}~]/g,\"\\\\$&\")},guid:1,uidPref:\"jqg\",randId:function(a){return(a||$.jgrid.uidPref)+$.jgrid.guid++},getAccessor:function(a,b){var c,d,e,f=[];if(\"function\"==typeof b)return b(a);if(c=a[b],void 0===c)try{if(\"string\"==typeof b&&(f=b.split(\".\")),e=f.length)for(c=a;c&&e--;)d=f.shift(),c=c[d]}catch(g){}return c},getXmlData:function(a,b,c){var d,e=\"string\"==typeof b?b.match(/^(.*)\\[(\\w+)\\]$/):null;return\"function\"==typeof b?b(a):e&&e[2]?e[1]?$(e[1],a).attr(e[2]):$(a).attr(e[2]):(d=$(b,a),c?d:d.length>0?$(d).text():void 0)},cellWidth:function(){var a=$(\"<div class='ui-jqgrid' style='left:10000px'><table class='ui-jqgrid-btable ui-common-table' style='width:5px;'><tr class='jqgrow'><td style='width:5px;display:block;'></td></tr></table></div>\"),b=a.appendTo(\"body\").find(\"td\").width();return a.remove(),Math.abs(b-5)>.1},isLocalStorage:function(){try{return\"localStorage\"in window&&null!==window.localStorage}catch(a){return!1}},getRegional:function(a,b,c){var d;return void 0!==c?c:(a.p&&a.p.regional&&$.jgrid.regional&&(d=$.jgrid.getAccessor($.jgrid.regional[a.p.regional]||{},b)),void 0===d&&(d=$.jgrid.getAccessor($.jgrid,b)),d)},isMobile:function(){try{return/Android|webOS|iPhone|iPad|iPod|pocket|psp|kindle|avantgo|blazer|midori|Tablet|Palm|maemo|plucker|phone|BlackBerry|symbian|IEMobile|mobile|ZuneWP7|Windows Phone|Opera Mini/i.test(navigator.userAgent)?!0:!1}catch(a){return!1}},cell_width:!0,ajaxOptions:{},from:function(source){var $t=this,QueryObject=function(d,q){\"string\"==typeof d&&(d=$.data(d));var self=this,_data=d,_usecase=!0,_trim=!1,_query=q,_stripNum=/[\\$,%]/g,_lastCommand=null,_lastField=null,_orDepth=0,_negate=!1,_queuedOperator=\"\",_sorting=[],_useProperties=!0;if(\"object\"!=typeof d||!d.push)throw\"data provides is not an array\";return d.length>0&&(_useProperties=\"object\"!=typeof d[0]?!1:!0),this._hasData=function(){return null===_data?!1:0===_data.length?!1:!0},this._getStr=function(a){var b=[];return _trim&&b.push(\"jQuery.trim(\"),b.push(\"String(\"+a+\")\"),_trim&&b.push(\")\"),_usecase||b.push(\".toLowerCase()\"),b.join(\"\")},this._strComp=function(a){return\"string\"==typeof a?\".toString()\":\"\"},this._group=function(a,b){return{field:a.toString(),unique:b,items:[]}},this._toStr=function(a){return _trim&&(a=$.trim(a)),a=a.toString().replace(/\\\\/g,\"\\\\\\\\\").replace(/\\\"/g,'\\\\\"'),_usecase?a:a.toLowerCase()},this._funcLoop=function(a){var b=[];return $.each(_data,function(c,d){b.push(a(d))}),b},this._append=function(a){var b;for(null===_query?_query=\"\":_query+=\"\"===_queuedOperator?\" && \":_queuedOperator,b=0;_orDepth>b;b++)_query+=\"(\";_negate&&(_query+=\"!\"),_query+=\"(\"+a+\")\",_negate=!1,_queuedOperator=\"\",_orDepth=0},this._setCommand=function(a,b){_lastCommand=a,_lastField=b},this._resetNegate=function(){_negate=!1},this._repeatCommand=function(a,b){return null===_lastCommand?self:null!==a&&null!==b?_lastCommand(a,b):null===_lastField?_lastCommand(a):_useProperties?_lastCommand(_lastField,a):_lastCommand(a)},this._equals=function(a,b){return 0===self._compare(a,b,1)},this._compare=function(a,b,c){var d=Object.prototype.toString;return void 0===c&&(c=1),void 0===a&&(a=null),void 0===b&&(b=null),null===a&&null===b?0:null===a&&null!==b?1:null!==a&&null===b?-1:\"[object Date]\"===d.call(a)&&\"[object Date]\"===d.call(b)?b>a?-c:a>b?c:0:(_usecase||\"number\"==typeof a||\"number\"==typeof b||(a=String(a),b=String(b)),b>a?-c:a>b?c:0)},this._performSort=function(){0!==_sorting.length&&(_data=self._doSort(_data,0))},this._doSort=function(a,b){var c=_sorting[b].by,d=_sorting[b].dir,e=_sorting[b].type,f=_sorting[b].datefmt,g=_sorting[b].sfunc;if(b===_sorting.length-1)return self._getOrder(a,c,d,e,f,g);b++;var h,i,j,k=self._getGroup(a,c,d,e,f),l=[];for(h=0;h<k.length;h++)for(j=self._doSort(k[h].items,b),i=0;i<j.length;i++)l.push(j[i]);return l},this._getOrder=function(a,b,c,d,e,f){var g,h,i,j,k=[],l=[],m=\"a\"===c?1:-1;void 0===d&&(d=\"text\"),j=\"float\"===d||\"number\"===d||\"currency\"===d||\"numeric\"===d?function(a){var b=parseFloat(String(a).replace(_stripNum,\"\"));return isNaN(b)?Number.NEGATIVE_INFINITY:b}:\"int\"===d||\"integer\"===d?function(a){return a?parseFloat(String(a).replace(_stripNum,\"\")):Number.NEGATIVE_INFINITY}:\"date\"===d||\"datetime\"===d?function(a){return $.jgrid.parseDate.call($t,e,a).getTime()}:$.isFunction(d)?d:function(a){return a=a?$.trim(String(a)):\"\",_usecase?a:a.toLowerCase()},$.each(a,function(a,c){h=\"\"!==b?$.jgrid.getAccessor(c,b):c,void 0===h&&(h=\"\"),h=j(h,c),l.push({vSort:h,index:a})}),l.sort($.isFunction(f)?function(a,b){return a=a.vSort,b=b.vSort,f.call(this,a,b,m)}:function(a,b){return a=a.vSort,b=b.vSort,self._compare(a,b,m)}),i=0;for(var n=a.length;n>i;)g=l[i].index,k.push(a[g]),i++;return k},this._getGroup=function(a,b,c,d,e){var f,g=[],h=null,i=null;return $.each(self._getOrder(a,b,c,d,e),function(a,c){f=$.jgrid.getAccessor(c,b),null==f&&(f=\"\"),self._equals(i,f)||(i=f,null!==h&&g.push(h),h=self._group(b,f)),h.items.push(c)}),null!==h&&g.push(h),g},this.ignoreCase=function(){return _usecase=!1,self},this.useCase=function(){return _usecase=!0,self},this.trim=function(){return _trim=!0,self},this.noTrim=function(){return _trim=!1,self},this.execute=function(){var match=_query,results=[];return null===match?self:($.each(_data,function(){eval(match)&&results.push(this)}),_data=results,self)},this.data=function(){return _data},this.select=function(a){if(self._performSort(),!self._hasData())return[];if(self.execute(),$.isFunction(a)){var b=[];return $.each(_data,function(c,d){b.push(a(d))}),b}return _data},this.hasMatch=function(){return self._hasData()?(self.execute(),_data.length>0):!1},this.andNot=function(a,b,c){return _negate=!_negate,self.and(a,b,c)},this.orNot=function(a,b,c){return _negate=!_negate,self.or(a,b,c)},this.not=function(a,b,c){return self.andNot(a,b,c)},this.and=function(a,b,c){return _queuedOperator=\" && \",void 0===a?self:self._repeatCommand(a,b,c)},this.or=function(a,b,c){return _queuedOperator=\" || \",void 0===a?self:self._repeatCommand(a,b,c)},this.orBegin=function(){return _orDepth++,self},this.orEnd=function(){return null!==_query&&(_query+=\")\"),self},this.isNot=function(a){return _negate=!_negate,self.is(a)},this.is=function(a){return self._append(\"this.\"+a),self._resetNegate(),self},this._compareValues=function(a,b,c,d,e){var f;f=_useProperties?\"jQuery.jgrid.getAccessor(this,'\"+b+\"')\":\"this\",void 0===c&&(c=null);var g=c,h=void 0===e.stype?\"text\":e.stype;if(null!==c)switch(h){case\"int\":case\"integer\":g=isNaN(Number(g))||\"\"===g?\"0\":g,f=\"parseInt(\"+f+\",10)\",g=\"parseInt(\"+g+\",10)\";break;case\"float\":case\"number\":case\"numeric\":g=String(g).replace(_stripNum,\"\"),g=isNaN(Number(g))||\"\"===g?\"0\":g,f=\"parseFloat(\"+f+\")\",g=\"parseFloat(\"+g+\")\";break;case\"date\":case\"datetime\":g=String($.jgrid.parseDate.call($t,e.srcfmt||\"Y-m-d\",g).getTime()),f='jQuery.jgrid.parseDate.call(jQuery(\"#'+$.jgrid.jqID($t.p.id)+'\")[0],\"'+e.srcfmt+'\",'+f+\").getTime()\";break;default:f=self._getStr(f),g=self._getStr('\"'+self._toStr(g)+'\"')}return self._append(f+\" \"+d+\" \"+g),self._setCommand(a,b),self._resetNegate(),self},this.equals=function(a,b,c){return self._compareValues(self.equals,a,b,\"==\",c)},this.notEquals=function(a,b,c){return self._compareValues(self.equals,a,b,\"!==\",c)},this.isNull=function(a,b,c){return self._compareValues(self.equals,a,null,\"===\",c)},this.greater=function(a,b,c){return self._compareValues(self.greater,a,b,\">\",c)},this.less=function(a,b,c){return self._compareValues(self.less,a,b,\"<\",c)},this.greaterOrEquals=function(a,b,c){return self._compareValues(self.greaterOrEquals,a,b,\">=\",c)},this.lessOrEquals=function(a,b,c){return self._compareValues(self.lessOrEquals,a,b,\"<=\",c)},this.startsWith=function(a,b){var c=null==b?a:b,d=_trim?$.trim(c.toString()).length:c.toString().length;return _useProperties?self._append(self._getStr(\"jQuery.jgrid.getAccessor(this,'\"+a+\"')\")+\".substr(0,\"+d+\") == \"+self._getStr('\"'+self._toStr(b)+'\"')):(null!=b&&(d=_trim?$.trim(b.toString()).length:b.toString().length),self._append(self._getStr(\"this\")+\".substr(0,\"+d+\") == \"+self._getStr('\"'+self._toStr(a)+'\"'))),self._setCommand(self.startsWith,a),self._resetNegate(),self},this.endsWith=function(a,b){var c=null==b?a:b,d=_trim?$.trim(c.toString()).length:c.toString().length;return self._append(_useProperties?self._getStr(\"jQuery.jgrid.getAccessor(this,'\"+a+\"')\")+\".substr(\"+self._getStr(\"jQuery.jgrid.getAccessor(this,'\"+a+\"')\")+\".length-\"+d+\",\"+d+') == \"'+self._toStr(b)+'\"':self._getStr(\"this\")+\".substr(\"+self._getStr(\"this\")+'.length-\"'+self._toStr(a)+'\".length,\"'+self._toStr(a)+'\".length) == \"'+self._toStr(a)+'\"'),self._setCommand(self.endsWith,a),self._resetNegate(),self},this.contains=function(a,b){return self._append(_useProperties?self._getStr(\"jQuery.jgrid.getAccessor(this,'\"+a+\"')\")+'.indexOf(\"'+self._toStr(b)+'\",0) > -1':self._getStr(\"this\")+'.indexOf(\"'+self._toStr(a)+'\",0) > -1'),self._setCommand(self.contains,a),self._resetNegate(),self},this.groupBy=function(a,b,c,d){return self._hasData()?self._getGroup(_data,a,b,c,d):null},this.orderBy=function(a,b,c,d,e){return b=null==b?\"a\":$.trim(b.toString().toLowerCase()),null==c&&(c=\"text\"),null==d&&(d=\"Y-m-d\"),null==e&&(e=!1),(\"desc\"===b||\"descending\"===b)&&(b=\"d\"),(\"asc\"===b||\"ascending\"===b)&&(b=\"a\"),_sorting.push({by:a,dir:b,type:c,datefmt:d,sfunc:e}),self},self};return new QueryObject(source,null)},getMethod:function(a){return this.getAccessor($.fn.jqGrid,a)},extend:function(a){$.extend($.fn.jqGrid,a),this.no_legacy_api||$.fn.extend(a)},clearBeforeUnload:function(a){var b,c=$(\"#\"+$.jgrid.jqID(a))[0];if(c.grid){b=c.grid,$.isFunction(b.emptyRows)&&b.emptyRows.call(c,!0,!0),$(document).unbind(\"mouseup.jqGrid\"+c.p.id),$(b.hDiv).unbind(\"mousemove\"),$(c).unbind();var d,e=b.headers.length,f=[\"formatCol\",\"sortData\",\"updatepager\",\"refreshIndex\",\"setHeadCheckBox\",\"constructTr\",\"formatter\",\"addXmlData\",\"addJSONData\",\"grid\",\"p\"];for(d=0;e>d;d++)b.headers[d].el=null;for(d in b)b.hasOwnProperty(d)&&(b[d]=null);for(d in c.p)c.p.hasOwnProperty(d)&&(c.p[d]=$.isArray(c.p[d])?[]:null);for(e=f.length,d=0;e>d;d++)c.hasOwnProperty(f[d])&&(c[f[d]]=null,delete c[f[d]])}},gridUnload:function(a){if(a){a=$.trim(a),0===a.indexOf(\"#\")&&(a=a.substring(1));var b=$(\"#\"+$.jgrid.jqID(a))[0];if(b.grid){var c={id:$(b).attr(\"id\"),cl:$(b).attr(\"class\")};b.p.pager&&$(b.p.pager).unbind().empty().removeClass(\"ui-state-default ui-jqgrid-pager ui-corner-bottom\");var d=document.createElement(\"table\");d.className=c.cl;var e=$.jgrid.jqID(b.id);$(d).removeClass(\"ui-jqgrid-btable ui-common-table\").insertBefore(\"#gbox_\"+e),1===$(b.p.pager).parents(\"#gbox_\"+e).length&&$(b.p.pager).insertBefore(\"#gbox_\"+e),$.jgrid.clearBeforeUnload(a),$(\"#gbox_\"+e).remove(),$(d).attr({id:c.id}),$(\"#alertmod_\"+$.jgrid.jqID(a)).remove()}}},gridDestroy:function(a){if(a){a=$.trim(a),0===a.indexOf(\"#\")&&(a=a.substring(1));var b=$(\"#\"+$.jgrid.jqID(a))[0];if(b.grid){b.p.pager&&$(b.p.pager).remove();try{$.jgrid.clearBeforeUnload(a),$(\"#gbox_\"+$.jgrid.jqID(a)).remove()}catch(c){}}}},styleUI:{jQueryUI:{common:{disabled:\"ui-state-disabled\",highlight:\"ui-state-highlight\",hover:\"ui-state-hover\",cornerall:\"ui-corner-all\",cornertop:\"ui-corner-top\",cornerbottom:\"ui-corner-bottom\",hidden:\"ui-helper-hidden\",icon_base:\"ui-icon\",overlay:\"ui-widget-overlay\",active:\"ui-state-active\",error:\"ui-state-error\",button:\"ui-state-default ui-corner-all\",content:\"ui-widget-content\"},base:{entrieBox:\"ui-widget ui-widget-content ui-corner-all\",viewBox:\"\",headerTable:\"\",headerBox:\"ui-state-default\",rowTable:\"\",rowBox:\"ui-widget-content\",footerTable:\"\",footerBox:\"ui-widget-content\",headerDiv:\"ui-state-default\",gridtitleBox:\"ui-widget-header ui-corner-top ui-helper-clearfix\",customtoolbarBox:\"ui-state-default\",loadingBox:\"ui-state-default ui-state-active\",rownumBox:\"ui-state-default\",scrollBox:\"ui-widget-content\",multiBox:\"cbox\",pagerBox:\"ui-state-default ui-corner-bottom\",toppagerBox:\"ui-state-default\",pgInput:\"ui-corner-all\",pgSelectBox:\"ui-widget-content ui-corner-all\",pgButtonBox:\"ui-corner-all\",icon_first:\"ui-icon-seek-first\",icon_prev:\"ui-icon-seek-prev\",icon_next:\"ui-icon-seek-next\",icon_end:\"ui-icon-seek-end\",icon_asc:\"ui-icon-triangle-1-n\",icon_desc:\"ui-icon-triangle-1-s\",icon_caption_open:\"ui-icon-circle-triangle-n\",icon_caption_close:\"ui-icon-circle-triangle-s\"},modal:{modal:\"ui-widget ui-widget-content ui-corner-all\",header:\"ui-widget-header ui-corner-all ui-helper-clearfix\",content:\"ui-widget-content\",resizable:\"ui-resizable-handle ui-resizable-se\",icon_close:\"ui-icon-closethick\",icon_resizable:\"ui-icon-gripsmall-diagonal-se\"},celledit:{inputClass:\"ui-widget-content ui-corner-all\"},inlinedit:{inputClass:\"ui-widget-content ui-corner-all\",icon_edit_nav:\"ui-icon-pencil\",icon_add_nav:\"ui-icon-plus\",icon_save_nav:\"ui-icon-disk\",icon_cancel_nav:\"ui-icon-cancel\"},formedit:{inputClass:\"ui-widget-content ui-corner-all\",icon_prev:\"ui-icon-triangle-1-w\",icon_next:\"ui-icon-triangle-1-e\",icon_save:\"ui-icon-disk\",icon_close:\"ui-icon-close\",icon_del:\"ui-icon-scissors\",icon_cancel:\"ui-icon-cancel\"},navigator:{icon_edit_nav:\"ui-icon-pencil\",icon_add_nav:\"ui-icon-plus\",icon_del_nav:\"ui-icon-trash\",icon_search_nav:\"ui-icon-search\",icon_refresh_nav:\"ui-icon-refresh\",icon_view_nav:\"ui-icon-document\",icon_newbutton_nav:\"ui-icon-newwin\"},grouping:{icon_plus:\"ui-icon-circlesmall-plus\",icon_minus:\"ui-icon-circlesmall-minus\"},filter:{table_widget:\"ui-widget ui-widget-content\",srSelect:\"ui-widget-content ui-corner-all\",srInput:\"ui-widget-content ui-corner-all\",menu_widget:\"ui-widget ui-widget-content ui-corner-all\",icon_search:\"ui-icon-search\",icon_reset:\"ui-icon-arrowreturnthick-1-w\",icon_query:\"ui-icon-comment\"},subgrid:{icon_plus:\"ui-icon-plus\",icon_minus:\"ui-icon-minus\",icon_open:\"ui-icon-carat-1-sw\"},treegrid:{icon_plus:\"ui-icon-triangle-1-\",icon_minus:\"ui-icon-triangle-1-s\",icon_leaf:\"ui-icon-radio-off\"},fmatter:{icon_edit:\"ui-icon-pencil\",icon_add:\"ui-icon-plus\",icon_save:\"ui-icon-disk\",icon_cancel:\"ui-icon-cancel\",icon_del:\"ui-icon-trash\"}},Bootstrap:{common:{disabled:\"ui-disabled\",highlight:\"success\",hover:\"active\",cornerall:\"\",cornertop:\"\",cornerbottom:\"\",hidden:\"\",icon_base:\"glyphicon\",overlay:\"ui-overlay\",active:\"active\",error:\"bg-danger\",button:\"btn btn-default\",content:\"\"},base:{entrieBox:\"\",viewBox:\"table-responsive\",headerTable:\"table table-bordered\",headerBox:\"\",rowTable:\"table table-bordered\",rowBox:\"\",footerTable:\"table table-bordered\",footerBox:\"\",headerDiv:\"\",gridtitleBox:\"\",customtoolbarBox:\"\",loadingBox:\"row\",rownumBox:\"active\",scrollBox:\"\",multiBox:\"checkbox\",pagerBox:\"\",toppagerBox:\"\",pgInput:\"form-control\",pgSelectBox:\"form-control\",pgButtonBox:\"\",icon_first:\"glyphicon-step-backward\",icon_prev:\"glyphicon-backward\",icon_next:\"glyphicon-forward\",icon_end:\"glyphicon-step-forward\",icon_asc:\"glyphicon-triangle-top\",icon_desc:\"glyphicon-triangle-bottom\",icon_caption_open:\"glyphicon-circle-arrow-up\",icon_caption_close:\"glyphicon-circle-arrow-down\"},modal:{modal:\"modal-content\",header:\"modal-header\",title:\"modal-title\",content:\"modal-body\",resizable:\"ui-resizable-handle ui-resizable-se\",icon_close:\"glyphicon-remove-circle\",icon_resizable:\"glyphicon-import\"},celledit:{inputClass:\"form-control\"},inlinedit:{inputClass:\"form-control\",icon_edit_nav:\"glyphicon-edit\",icon_add_nav:\"glyphicon-plus\",icon_save_nav:\"glyphicon-save\",icon_cancel_nav:\"glyphicon-remove-circle\"},formedit:{inputClass:\"form-control\",icon_prev:\"glyphicon-step-backward\",icon_next:\"glyphicon-step-forward\",icon_save:\"glyphicon-save\",icon_close:\"glyphicon-remove-circle\",icon_del:\"glyphicon-trash\",icon_cancel:\"glyphicon-remove-circle\"},navigator:{icon_edit_nav:\"glyphicon-edit\",icon_add_nav:\"glyphicon-plus\",icon_del_nav:\"glyphicon-trash\",icon_search_nav:\"glyphicon-search\",icon_refresh_nav:\"glyphicon-refresh\",icon_view_nav:\"glyphicon-info-sign\",icon_newbutton_nav:\"glyphicon-new-window\"},grouping:{icon_plus:\"glyphicon-triangle-right\",icon_minus:\"glyphicon-triangle-bottom\"},filter:{table_widget:\"table table-condensed\",srSelect:\"form-control\",srInput:\"form-control\",menu_widget:\"\",icon_search:\"glyphicon-search\",icon_reset:\"glyphicon-refresh\",icon_query:\"glyphicon-comment\"},subgrid:{icon_plus:\"glyphicon-triangle-right\",icon_minus:\"glyphicon-triangle-bottom\",icon_open:\"glyphicon-indent-left\"},treegrid:{icon_plus:\"glyphicon-triangle-right\",icon_minus:\"glyphicon-triangle-bottom\",icon_leaf:\"glyphicon-unchecked\"},fmatter:{icon_edit:\"glyphicon-edit\",icon_add:\"glyphicon-plus\",icon_save:\"glyphicon-save\",icon_cancel:\"glyphicon-remove-circle\",icon_del:\"glyphicon-trash\"}}}}),$.fn.jqGrid=function(a){if(\"string\"==typeof a){var b=$.jgrid.getMethod(a);if(!b)throw\"jqGrid - No such method: \"+a;var c=$.makeArray(arguments).slice(1);return b.apply(this,c)}return this.each(function(){if(!this.grid){var b;null!=a&&void 0!==a.data&&(b=a.data,a.data=[]);var c=$.extend(!0,{url:\"\",height:150,page:1,rowNum:20,rowTotal:null,records:0,pager:\"\",pgbuttons:!0,pginput:!0,colModel:[],rowList:[],colNames:[],sortorder:\"asc\",sortname:\"\",datatype:\"xml\",mtype:\"GET\",altRows:!1,selarrrow:[],savedRow:[],shrinkToFit:!0,xmlReader:{},jsonReader:{},subGrid:!1,subGridModel:[],reccount:0,lastpage:0,lastsort:0,selrow:null,beforeSelectRow:null,onSelectRow:null,onSortCol:null,ondblClickRow:null,onRightClickRow:null,onPaging:null,onSelectAll:null,onInitGrid:null,loadComplete:null,gridComplete:null,loadError:null,loadBeforeSend:null,afterInsertRow:null,beforeRequest:null,beforeProcessing:null,onHeaderClick:null,viewrecords:!1,loadonce:!1,multiselect:!1,multikey:!1,editurl:null,search:!1,caption:\"\",hidegrid:!0,hiddengrid:!1,postData:{},userData:{},treeGrid:!1,treeGridModel:\"nested\",treeReader:{},treeANode:-1,ExpandColumn:null,tree_root_level:0,prmNames:{page:\"page\",rows:\"rows\",sort:\"sidx\",order:\"sord\",search:\"_search\",nd:\"nd\",id:\"id\",oper:\"oper\",editoper:\"edit\",addoper:\"add\",deloper:\"del\",subgridid:\"id\",npage:null,totalrows:\"totalrows\"},forceFit:!1,gridstate:\"visible\",cellEdit:!1,cellsubmit:\"remote\",nv:0,loadui:\"enable\",toolbar:[!1,\"\"],scroll:!1,multiboxonly:!1,deselectAfterSort:!0,scrollrows:!1,autowidth:!1,scrollOffset:18,cellLayout:5,subGridWidth:20,multiselectWidth:30,gridview:!0,rownumWidth:35,rownumbers:!1,pagerpos:\"center\",recordpos:\"right\",footerrow:!1,userDataOnFooter:!1,hoverrows:!0,altclass:\"ui-priority-secondary\",viewsortcols:[!1,\"vertical\",!0],resizeclass:\"\",autoencode:!1,remapColumns:[],ajaxGridOptions:{},direction:\"ltr\",toppager:!1,headertitles:!1,scrollTimeout:40,data:[],_index:{},grouping:!1,groupingView:{groupField:[],groupOrder:[],groupText:[],groupColumnShow:[],groupSummary:[],showSummaryOnHide:!1,sortitems:[],sortnames:[],summary:[],summaryval:[],plusicon:\"\",minusicon:\"\",displayField:[],groupSummaryPos:[],formatDisplayField:[],_locgr:!1},ignoreCase:!0,cmTemplate:{},idPrefix:\"\",multiSort:!1,minColWidth:33,scrollPopUp:!1,scrollTopOffset:0,scrollLeftOffset:\"100%\",storeNavOptions:!1,regional:\"en\",styleUI:\"jQueryUI\",responsive:!1},$.jgrid.defaults,a);void 0!==b&&(c.data=b,a.data=b);var d=this,e={headers:[],cols:[],footers:[],dragStart:function(a,b,e){var f=$(this.bDiv).offset().left;this.resizing={idx:a,startX:b.pageX,sOL:b.pageX-f},this.hDiv.style.cursor=\"col-resize\",this.curGbox=$(\"#rs_m\"+$.jgrid.jqID(c.id),\"#gbox_\"+$.jgrid.jqID(c.id)),this.curGbox.css({display:\"block\",left:b.pageX-f,top:e[1],height:e[2]}),$(d).triggerHandler(\"jqGridResizeStart\",[b,a]),$.isFunction(c.resizeStart)&&c.resizeStart.call(d,b,a),document.onselectstart=function(){return!1}},dragMove:function(a){if(this.resizing){var b,d,e=a.pageX-this.resizing.startX,f=this.headers[this.resizing.idx],g=\"ltr\"===c.direction?f.width+e:f.width-e;g>33&&(this.curGbox.css({left:this.resizing.sOL+e}),c.forceFit===!0?(b=this.headers[this.resizing.idx+c.nv],d=\"ltr\"===c.direction?b.width-e:b.width+e,d>c.minColWidth&&(f.newWidth=g,b.newWidth=d)):(this.newWidth=\"ltr\"===c.direction?c.tblwidth+e:c.tblwidth-e,f.newWidth=g))}},dragEnd:function(a){if(this.hDiv.style.cursor=\"default\",this.resizing){var b=this.resizing.idx,e=this.headers[b].newWidth||this.headers[b].width;e=parseInt(e,10),this.resizing=!1,$(\"#rs_m\"+$.jgrid.jqID(c.id)).css(\"display\",\"none\"),c.colModel[b].width=e,this.headers[b].width=e,this.headers[b].el.style.width=e+\"px\",this.cols[b].style.width=e+\"px\",this.footers.length>0&&(this.footers[b].style.width=e+\"px\"),c.forceFit===!0?(e=this.headers[b+c.nv].newWidth||this.headers[b+c.nv].width,this.headers[b+c.nv].width=e,this.headers[b+c.nv].el.style.width=e+\"px\",this.cols[b+c.nv].style.width=e+\"px\",this.footers.length>0&&(this.footers[b+c.nv].style.width=e+\"px\"),c.colModel[b+c.nv].width=e):(c.tblwidth=this.newWidth||c.tblwidth,$(\"table:first\",this.bDiv).css(\"width\",c.tblwidth+\"px\"),$(\"table:first\",this.hDiv).css(\"width\",c.tblwidth+\"px\"),this.hDiv.scrollLeft=this.bDiv.scrollLeft,c.footerrow&&($(\"table:first\",this.sDiv).css(\"width\",c.tblwidth+\"px\"),this.sDiv.scrollLeft=this.bDiv.scrollLeft)),a&&($(d).triggerHandler(\"jqGridResizeStop\",[e,b]),$.isFunction(c.resizeStop)&&c.resizeStop.call(d,e,b))}this.curGbox=null,document.onselectstart=function(){return!0}},populateVisible:function(){e.timer&&clearTimeout(e.timer),e.timer=null;var a=$(e.bDiv).height();if(a){var b,f,g=$(\"table:first\",e.bDiv);if(g[0].rows.length)try{b=g[0].rows[1],f=b?$(b).outerHeight()||e.prevRowHeight:e.prevRowHeight}catch(h){f=e.prevRowHeight}if(f){e.prevRowHeight=f;var i,j,k,l=c.rowNum,m=e.scrollTop=e.bDiv.scrollTop,n=Math.round(g.position().top)-m,o=n+g.height(),p=f*l;if(a>o&&0>=n&&(void 0===c.lastpage||(parseInt((o+m+p-1)/p,10)||0)<=c.lastpage)&&(j=parseInt((a-o+p-1)/p,10)||1,o>=0||2>j||c.scroll===!0?(i=(Math.round((o+m)/p)||0)+1,n=-1):n=1),n>0&&(i=(parseInt(m/p,10)||0)+1,j=(parseInt((m+a)/p,10)||0)+2-i,k=!0),j){if(c.lastpage&&(i>c.lastpage||1===c.lastpage||i===c.page&&i===c.lastpage))return;e.hDiv.loading?e.timer=setTimeout(e.populateVisible,c.scrollTimeout):(c.page=i,k&&(e.selectionPreserver(g[0]),e.emptyRows.call(g[0],!1,!1)),e.populate(j)),c.scrollPopUp&&null!=c.lastpage&&($(\"#scroll_g\"+c.id).show().html($.jgrid.template($.jgrid.getRegional(d,\"defaults.pgtext\",c.pgtext),c.page,c.lastpage)).css({top:c.scrollTopOffset+m*((parseInt(c.height,10)-45)/(parseInt(f,10)*parseInt(c.records,10)))+\"px\",left:c.scrollLeftOffset}),$(this).mouseout(function(){$(\"#scroll_g\"+c.id).hide()}))}}}},scrollGrid:function(a){if(c.scroll){var b=e.bDiv.scrollTop;void 0===e.scrollTop&&(e.scrollTop=0),b!==e.scrollTop&&(e.scrollTop=b,e.timer&&clearTimeout(e.timer),e.timer=setTimeout(e.populateVisible,c.scrollTimeout))}e.hDiv.scrollLeft=e.bDiv.scrollLeft,c.footerrow&&(e.sDiv.scrollLeft=e.bDiv.scrollLeft),c.frozenColumns&&$(e.fbDiv).scrollTop(e.bDiv.scrollTop),a&&a.stopPropagation()},selectionPreserver:function(a){var b=a.p,c=b.selrow,d=b.selarrrow?$.makeArray(b.selarrrow):null,e=a.grid.bDiv.scrollLeft,f=function(){var g;if(b.selrow=null,b.selarrrow=[],b.multiselect&&d&&d.length>0)for(g=0;g<d.length;g++)d[g]!==c&&$(a).jqGrid(\"setSelection\",d[g],!1,null);c&&$(a).jqGrid(\"setSelection\",c,!1,null),a.grid.bDiv.scrollLeft=e,$(a).unbind(\".selectionPreserver\",f)};$(a).bind(\"jqGridGridComplete.selectionPreserver\",f)}};if(\"TABLE\"!==this.tagName.toUpperCase()||null==this.id)return void alert(\"Element is not a table or has no id!\");if(void 0!==document.documentMode&&document.documentMode<=5)return void alert(\"Grid can not be used in this ('quirks') mode!\");var f,g,h,i=0;for(g in $.jgrid.regional)$.jgrid.regional.hasOwnProperty(g)&&(0===i&&(f=g),i++);if(1===i&&f!==c.regional&&(c.regional=f),$(this).empty().attr(\"tabindex\",\"0\"),this.p=c,this.p.useProp=!!$.fn.prop,0===this.p.colNames.length)for(i=0;i<this.p.colModel.length;i++)this.p.colNames[i]=this.p.colModel[i].label||this.p.colModel[i].name;if(this.p.colNames.length!==this.p.colModel.length)return void alert($.jgrid.getRegional(this,\"errors.model\"));var j,k=$.jgrid.getMethod(\"getStyleUI\"),l=d.p.styleUI+\".common\",m=k(l,\"disabled\",!0),n=k(l,\"highlight\",!0),o=k(l,\"hover\",!0),p=k(l,\"cornerall\",!0),q=k(l,\"icon_base\",!0),r=$.jgrid.msie,s=[],t=[],u=[];l=d.p.styleUI+\".base\",j=$(\"<div \"+k(l,\"viewBox\",!1,\"ui-jqgrid-view\")+\" role='grid'></div>\"),d.p.direction=$.trim(d.p.direction.toLowerCase()),d.p._ald=!1,-1===$.inArray(d.p.direction,[\"ltr\",\"rtl\"])&&(d.p.direction=\"ltr\"),h=d.p.direction,$(j).insertBefore(this),$(this).appendTo(j);var v=$(\"<div \"+k(l,\"entrieBox\",!1,\"ui-jqgrid\")+\"></div>\");$(v).attr({id:\"gbox_\"+this.id,dir:h}).insertBefore(j),$(j).attr(\"id\",\"gview_\"+this.id).appendTo(v),$(\"<div \"+k(d.p.styleUI+\".common\",\"overlay\",!1,\"jqgrid-overlay\")+\" id='lui_\"+this.id+\"'></div>\").insertBefore(j),$(\"<div \"+k(l,\"loadingBox\",!1,\"loading\")+\" id='load_\"+this.id+\"'>\"+$.jgrid.getRegional(d,\"defaults.loadtext\",this.p.loadtext)+\"</div>\").insertBefore(j),$(this).attr({role:\"presentation\",\"aria-multiselectable\":!!this.p.multiselect,\"aria-labelledby\":\"gbox_\"+this.id});var w,x=[\"shiftKey\",\"altKey\",\"ctrlKey\"],y=function(a,b){return a=parseInt(a,10),isNaN(a)?b||0:a},z=function(a,b,c,f,g,h){var i,j,k=d.p.colModel[a],l=k.align,m='style=\"',n=k.classes,o=k.name,p=[];return l&&(m+=\"text-align:\"+l+\";\"),k.hidden===!0&&(m+=\"display:none;\"),0===b?m+=\"width: \"+e.headers[a].width+\"px;\":($.isFunction(k.cellattr)||\"string\"==typeof k.cellattr&&null!=$.jgrid.cellattr&&$.isFunction($.jgrid.cellattr[k.cellattr]))&&(i=$.isFunction(k.cellattr)?k.cellattr:$.jgrid.cellattr[k.cellattr],j=i.call(d,g,c,f,k,h),j&&\"string\"==typeof j&&(j=j.replace(/style/i,\"style\").replace(/title/i,\"title\"),j.indexOf(\"title\")>-1&&(k.title=!1),j.indexOf(\"class\")>-1&&(n=void 0),p=j.replace(/\\-style/g,\"-sti\").split(/style/),2===p.length?(p[1]=$.trim(p[1].replace(/\\-sti/g,\"-style\").replace(\"=\",\"\")),(0===p[1].indexOf(\"'\")||0===p[1].indexOf('\"'))&&(p[1]=p[1].substring(1)),m+=p[1].replace(/'/gi,'\"')):m+='\"')),p.length||(p[0]=\"\",m+='\"'),m+=(void 0!==n?' class=\"'+n+'\"':\"\")+(k.title&&c?' title=\"'+$.jgrid.stripHtml(c)+'\"':\"\"),m+=' aria-describedby=\"'+d.p.id+\"_\"+o+'\"',m+p[0]},A=function(a){return null==a||\"\"===a?\"&#160;\":d.p.autoencode?$.jgrid.htmlEncode(a):String(a)},B=function(a,b,c,e,f){var g,h=d.p.colModel[c];if(void 0!==h.formatter){a=\"\"!==String(d.p.idPrefix)?$.jgrid.stripPref(d.p.idPrefix,a):a;var i={rowId:a,colModel:h,gid:d.p.id,pos:c,styleUI:d.p.styleUI};g=$.isFunction(h.formatter)?h.formatter.call(d,b,i,e,f):$.fmatter?$.fn.fmatter.call(d,h.formatter,b,i,e,f):A(b)}else g=A(b);return g},C=function(a,b,c,d,e,f){var g,h;return g=B(a,b,c,e,\"add\"),h=z(c,d,g,e,a,f),'<td role=\"gridcell\" '+h+\">\"+g+\"</td>\"},D=function(a,b,c,e,f){var g='<input role=\"checkbox\" type=\"checkbox\" id=\"jqg_'+d.p.id+\"_\"+a+'\" '+f+' name=\"jqg_'+d.p.id+\"_\"+a+'\"'+(e?'checked=\"checked\"':\"\")+\"/>\",h=z(b,c,\"\",null,a,!0);return'<td role=\"gridcell\" '+h+\">\"+g+\"</td>\"},E=function(a,b,c,d,e){var f=(parseInt(c,10)-1)*parseInt(d,10)+1+b,g=z(a,b,f,null,b,!0);return'<td role=\"gridcell\" '+e+\" \"+g+\">\"+f+\"</td>\"},F=function(a){var b,c,e=[],f=0;for(c=0;c<d.p.colModel.length;c++)b=d.p.colModel[c],\"cb\"!==b.name&&\"subgrid\"!==b.name&&\"rn\"!==b.name&&(e[f]=\"local\"===a?b.name:\"xml\"===a||\"xmlstring\"===a?b.xmlmap||b.name:b.jsonmap||b.name,d.p.keyName!==!1&&b.key===!0&&(d.p.keyName=e[f]),f++);\nreturn e},G=function(a){var b=d.p.remapColumns;return b&&b.length||(b=$.map(d.p.colModel,function(a,b){return b})),a&&(b=$.map(b,function(b){return a>b?null:b-a})),b},H=function(a,b){var c;this.p.deepempty?$(this.rows).slice(1).remove():(c=this.rows.length>0?this.rows[0]:null,$(this.firstChild).empty().append(c)),a&&this.p.scroll&&($(this.grid.bDiv.firstChild).css({height:\"auto\"}),$(this.grid.bDiv.firstChild.firstChild).css({height:\"0px\",display:\"none\"}),0!==this.grid.bDiv.scrollTop&&(this.grid.bDiv.scrollTop=0)),b===!0&&this.p.treeGrid&&!this.p.loadonce&&(this.p.data=[],this.p._index={})},I=function(){var a,b,c,e,f,g,h,i,j,k,l,m=d.p,n=m.data,o=n.length,p=m.localReader,q=m.colModel,r=p.cell,s=(m.multiselect===!0?1:0)+(m.subGrid===!0?1:0)+(m.rownumbers===!0?1:0),t=m.scroll?$.jgrid.randId():1;if(\"local\"===m.datatype&&p.repeatitems===!0)for(j=G(s),k=F(\"local\"),e=m.keyIndex===!1?$.isFunction(p.id)?p.id.call(d,n):p.id:m.keyIndex,a=0;o>a;a++){for(c=n[a],f=$.jgrid.getAccessor(c,e),void 0===f&&(\"number\"==typeof e&&null!=q[e+s]&&(f=$.jgrid.getAccessor(c,q[e+s].name)),void 0===f&&(f=t+a,r&&(g=$.jgrid.getAccessor(c,r)||c,f=null!=g&&void 0!==g[e]?g[e]:f,g=null))),i={},i[p.id]=f,r&&(c=$.jgrid.getAccessor(c,r)||c),l=$.isArray(c)?j:k,b=0;b<l.length;b++)h=$.jgrid.getAccessor(c,l[b]),i[q[b+s].name]=h;$.extend(!0,n[a],i)}},J=function(){var a,b,c,e=d.p.data.length;for(a=d.p.keyName===!1||d.p.loadonce===!0?d.p.localReader.id:d.p.keyName,d.p._index=[],b=0;e>b;b++)c=$.jgrid.getAccessor(d.p.data[b],a),void 0===c&&(c=String(b+1)),d.p._index[c]=b},K=function(a,b,c,e,f){var g,h=\"-1\",i=\"\",j=b?\"display:none;\":\"\",k=$(d).triggerHandler(\"jqGridRowAttr\",[e,f,a]);if(\"object\"!=typeof k&&(k=$.isFunction(d.p.rowattr)?d.p.rowattr.call(d,e,f,a):\"string\"==typeof d.p.rowattr&&null!=$.jgrid.rowattr&&$.isFunction($.jgrid.rowattr[d.p.rowattr])?$.jgrid.rowattr[d.p.rowattr].call(d,e,f,a):{}),!$.isEmptyObject(k)){k.hasOwnProperty(\"id\")&&(a=k.id,delete k.id),k.hasOwnProperty(\"tabindex\")&&(h=k.tabindex,delete k.tabindex),k.hasOwnProperty(\"style\")&&(j+=k.style,delete k.style),k.hasOwnProperty(\"class\")&&(c+=\" \"+k[\"class\"],delete k[\"class\"]);try{delete k.role}catch(l){}for(g in k)k.hasOwnProperty(g)&&(i+=\" \"+g+\"=\"+k[g])}return'<tr role=\"row\" id=\"'+a+'\" tabindex=\"'+h+'\" class=\"'+c+'\"'+(\"\"===j?\"\":' style=\"'+j+'\"')+i+\">\"},L=function(a,b,c,e){var f=new Date,g=\"local\"!==d.p.datatype&&d.p.loadonce||\"xmlstring\"===d.p.datatype,h=\"_id_\",i=d.p.xmlReader,j=\"local\"===d.p.datatype?\"local\":\"xml\";if(g&&(d.p.data=[],d.p._index={},d.p.localReader.id=h),d.p.reccount=0,$.isXMLDoc(a)){-1!==d.p.treeANode||d.p.scroll?b=b>1?b:1:(H.call(d,!1,!0),b=1);var m,n,o,p,q,r,s,t,u,v,w=$(d),x=0,z=d.p.multiselect===!0?1:0,A=0,B=d.p.rownumbers===!0?1:0,I=[],J={},L=[],M=d.p.altRows===!0?d.p.altclass:\"\",N=k(l,\"rowBox\",!0,\"jqgrow ui-row-\"+d.p.direction);d.p.subGrid===!0&&(A=1,p=$.jgrid.getMethod(\"addSubGridCell\")),i.repeatitems||(I=F(j)),q=d.p.keyName===!1?$.isFunction(i.id)?i.id.call(d,a):i.id:d.p.keyName,r=-1===String(q).indexOf(\"[\")?I.length?function(a,b){return $(q,a).text()||b}:function(a,b){return $(i.cell,a).eq(q).text()||b}:function(a,b){return a.getAttribute(q.replace(/[\\[\\]]/g,\"\"))||b},d.p.userData={},d.p.page=y($.jgrid.getXmlData(a,i.page),d.p.page),d.p.lastpage=y($.jgrid.getXmlData(a,i.total),1),d.p.records=y($.jgrid.getXmlData(a,i.records)),$.isFunction(i.userdata)?d.p.userData=i.userdata.call(d,a)||{}:$.jgrid.getXmlData(a,i.userdata,!0).each(function(){d.p.userData[this.getAttribute(\"name\")]=$(this).text()});var O=$.jgrid.getXmlData(a,i.root,!0);O=$.jgrid.getXmlData(O,i.row,!0),O||(O=[]);var P,Q=O.length,R=0,S=[],T=parseInt(d.p.rowNum,10),U=d.p.scroll?$.jgrid.randId():1;if(Q>0&&d.p.page<=0&&(d.p.page=1),O&&Q){e&&(T*=e+1);var V,W=$.isFunction(d.p.afterInsertRow),X=!1,Y=$(\"#\"+$.jgrid.jqID(d.p.id)+\" tbody:first\"),Z=B?k(l,\"rownumBox\",!1,\"jqgrid-rownum\"):\"\",_=z?k(l,\"multiBox\",!1,\"cbox\"):\"\";for(d.p.grouping&&(X=d.p.groupingView.groupCollapse===!0,V=$.jgrid.getMethod(\"groupingPrepare\"));Q>R;){t=O[R],u=r(t,U+R),u=d.p.idPrefix+u,P=0===b?0:b+1,v=N+((P+R)%2===1?\" \"+M:\"\");var ab=L.length;if(L.push(\"\"),B&&L.push(E(0,R,d.p.page,d.p.rowNum,Z)),z&&L.push(D(u,B,R,!1,_)),A&&L.push(p.call(w,z+B,R+b)),i.repeatitems){s||(s=G(z+A+B));var bb=$.jgrid.getXmlData(t,i.cell,!0);$.each(s,function(a){var c=bb[this];return c?(o=c.textContent||c.text,J[d.p.colModel[a+z+A+B].name]=o,void L.push(C(u,o,a+z+A+B,R+b,t,J))):!1})}else for(m=0;m<I.length;m++)o=$.jgrid.getXmlData(t,I[m]),J[d.p.colModel[m+z+A+B].name]=o,L.push(C(u,o,m+z+A+B,R+b,t,J));if(L[ab]=K(u,X,v,J,t),L.push(\"</tr>\"),d.p.grouping&&(S.push(L),d.p.groupingView._locgr||V.call(w,J,R),L=[]),(g||d.p.treeGrid===!0&&!d.p._ald)&&(J[h]=$.jgrid.stripPref(d.p.idPrefix,u),d.p.data.push(J),d.p._index[J[h]]=d.p.data.length-1),d.p.gridview===!1&&(Y.append(L.join(\"\")),w.triggerHandler(\"jqGridAfterInsertRow\",[u,J,t]),W&&d.p.afterInsertRow.call(d,u,J,t),L=[]),J={},x++,R++,x===T)break}}if(d.p.gridview===!0&&(n=d.p.treeANode>-1?d.p.treeANode:0,d.p.grouping?g||(w.jqGrid(\"groupingRender\",S,d.p.colModel.length,d.p.page,T),S=null):d.p.treeGrid===!0&&n>0?$(d.rows[n]).after(L.join(\"\")):(Y.append(L.join(\"\")),d.grid.cols=d.rows[0].cells)),d.p.subGrid===!0)try{w.jqGrid(\"addSubGrid\",z+B)}catch(cb){}if(d.p.totaltime=new Date-f,x>0&&0===d.p.records&&(d.p.records=Q),L=null,d.p.treeGrid===!0)try{w.jqGrid(\"setTreeNode\",n+1,x+n+1)}catch(db){}if(d.p.reccount=x,d.p.treeANode=-1,d.p.userDataOnFooter&&w.jqGrid(\"footerData\",\"set\",d.p.userData,!0),g&&(d.p.records=Q,d.p.lastpage=Math.ceil(Q/T)),c||d.updatepager(!1,!0),g){for(;Q>x;){if(t=O[x],u=r(t,x+U),u=d.p.idPrefix+u,i.repeatitems){s||(s=G(z+A+B));var eb=$.jgrid.getXmlData(t,i.cell,!0);$.each(s,function(a){var b=eb[this];return b?(o=b.textContent||b.text,void(J[d.p.colModel[a+z+A+B].name]=o)):!1})}else for(m=0;m<I.length;m++)o=$.jgrid.getXmlData(t,I[m]),J[d.p.colModel[m+z+A+B].name]=o;J[h]=$.jgrid.stripPref(d.p.idPrefix,u),d.p.grouping&&V.call(w,J,x),d.p.data.push(J),d.p._index[J[h]]=d.p.data.length-1,J={},x++}d.p.grouping&&(d.p.groupingView._locgr=!0,w.jqGrid(\"groupingRender\",S,d.p.colModel.length,d.p.page,T),S=null)}}},M=function(a,b,c,e){var f=new Date;if(a){-1!==d.p.treeANode||d.p.scroll?b=b>1?b:1:(H.call(d,!1,!0),b=1);var g,h,i=\"_id_\",j=\"local\"!==d.p.datatype&&d.p.loadonce||\"jsonstring\"===d.p.datatype;j&&(d.p.data=[],d.p._index={},d.p.localReader.id=i),d.p.reccount=0,\"local\"===d.p.datatype?(g=d.p.localReader,h=\"local\"):(g=d.p.jsonReader,h=\"json\");var m,o,p,q,r,s,t,u,v,w,x,z,A=$(d),B=0,I=[],J=d.p.multiselect?1:0,L=d.p.subGrid===!0?1:0,M=d.p.rownumbers===!0?1:0,N=G(J+L+M),O=F(h),P={},Q=[],R=d.p.altRows===!0?d.p.altclass:\"\",S=k(l,\"rowBox\",!0,\"jqgrow ui-row-\"+d.p.direction);d.p.page=y($.jgrid.getAccessor(a,g.page),d.p.page),d.p.lastpage=y($.jgrid.getAccessor(a,g.total),1),d.p.records=y($.jgrid.getAccessor(a,g.records)),d.p.userData=$.jgrid.getAccessor(a,g.userdata)||{},L&&(r=$.jgrid.getMethod(\"addSubGridCell\")),v=d.p.keyName===!1?$.isFunction(g.id)?g.id.call(d,a):g.id:d.p.keyName,u=$.jgrid.getAccessor(a,g.root),null==u&&$.isArray(a)&&(u=a),u||(u=[]),t=u.length,o=0,t>0&&d.p.page<=0&&(d.p.page=1);var T,U,V=parseInt(d.p.rowNum,10),W=d.p.scroll?$.jgrid.randId():1,X=!1;e&&(V*=e+1),\"local\"!==d.p.datatype||d.p.deselectAfterSort||(X=!0);var Y,Z=$.isFunction(d.p.afterInsertRow),_=[],ab=!1,bb=$(\"#\"+$.jgrid.jqID(d.p.id)+\" tbody:first\"),cb=M?k(l,\"rownumBox\",!1,\"jqgrid-rownum\"):\"\",db=J?k(l,\"multiBox\",!1,\"cbox\"):\"\";for(d.p.grouping&&(ab=d.p.groupingView.groupCollapse===!0,Y=$.jgrid.getMethod(\"groupingPrepare\"));t>o;){if(q=u[o],x=$.jgrid.getAccessor(q,v),void 0===x&&(\"number\"==typeof v&&null!=d.p.colModel[v+J+L+M]&&(x=$.jgrid.getAccessor(q,d.p.colModel[v+J+L+M].name)),void 0===x&&(x=W+o,0===I.length&&g.cell))){var eb=$.jgrid.getAccessor(q,g.cell)||q;x=null!=eb&&void 0!==eb[v]?eb[v]:x,eb=null}x=d.p.idPrefix+x,T=1===b?0:b,z=S+((T+o)%2===1?\" \"+R:\"\"),X&&(U=d.p.multiselect?-1!==$.inArray(x,d.p.selarrrow):x===d.p.selrow);var fb=Q.length;for(Q.push(\"\"),M&&Q.push(E(0,o,d.p.page,d.p.rowNum,cb)),J&&Q.push(D(x,M,o,U,db)),L&&Q.push(r.call(A,J+M,o+b)),s=O,g.repeatitems&&(g.cell&&(q=$.jgrid.getAccessor(q,g.cell)||q),$.isArray(q)&&(s=N)),p=0;p<s.length;p++)m=$.jgrid.getAccessor(q,s[p]),P[d.p.colModel[p+J+L+M].name]=m,Q.push(C(x,m,p+J+L+M,o+b,q,P));if(z+=U?\" \"+n:\"\",Q[fb]=K(x,ab,z,P,q),Q.push(\"</tr>\"),d.p.grouping&&(_.push(Q),d.p.groupingView._locgr||Y.call(A,P,o),Q=[]),(j||d.p.treeGrid===!0&&!d.p._ald)&&(P[i]=$.jgrid.stripPref(d.p.idPrefix,x),d.p.data.push(P),d.p._index[P[i]]=d.p.data.length-1),d.p.gridview===!1&&(bb.append(Q.join(\"\")),A.triggerHandler(\"jqGridAfterInsertRow\",[x,P,q]),Z&&d.p.afterInsertRow.call(d,x,P,q),Q=[]),P={},B++,o++,B===V)break}if(d.p.gridview===!0&&(w=d.p.treeANode>-1?d.p.treeANode:0,d.p.grouping?j||(A.jqGrid(\"groupingRender\",_,d.p.colModel.length,d.p.page,V),_=null):d.p.treeGrid===!0&&w>0?$(d.rows[w]).after(Q.join(\"\")):(bb.append(Q.join(\"\")),d.grid.cols=d.rows[0].cells)),d.p.subGrid===!0)try{A.jqGrid(\"addSubGrid\",J+M)}catch(gb){}if(d.p.totaltime=new Date-f,B>0&&0===d.p.records&&(d.p.records=t),Q=null,d.p.treeGrid===!0)try{A.jqGrid(\"setTreeNode\",w+1,B+w+1)}catch(hb){}if(d.p.reccount=B,d.p.treeANode=-1,d.p.userDataOnFooter&&A.jqGrid(\"footerData\",\"set\",d.p.userData,!0),j&&(d.p.records=t,d.p.lastpage=Math.ceil(t/V)),c||d.updatepager(!1,!0),j){for(;t>B&&u[B];){if(q=u[B],x=$.jgrid.getAccessor(q,v),void 0===x&&(\"number\"==typeof v&&null!=d.p.colModel[v+J+L+M]&&(x=$.jgrid.getAccessor(q,d.p.colModel[v+J+L+M].name)),void 0===x&&(x=W+B,0===I.length&&g.cell))){var ib=$.jgrid.getAccessor(q,g.cell)||q;x=null!=ib&&void 0!==ib[v]?ib[v]:x,ib=null}if(q){for(x=d.p.idPrefix+x,s=O,g.repeatitems&&(g.cell&&(q=$.jgrid.getAccessor(q,g.cell)||q),$.isArray(q)&&(s=N)),p=0;p<s.length;p++)P[d.p.colModel[p+J+L+M].name]=$.jgrid.getAccessor(q,s[p]);P[i]=$.jgrid.stripPref(d.p.idPrefix,x),d.p.grouping&&Y.call(A,P,B),d.p.data.push(P),d.p._index[P[i]]=d.p.data.length-1,P={}}B++}d.p.grouping&&(d.p.groupingView._locgr=!0,A.jqGrid(\"groupingRender\",_,d.p.colModel.length,d.p.page,V),_=null)}}},N=function(){function a(b){var c,e,f,g,h,i,k=0;if(null!=b.groups){for(e=b.groups.length&&\"OR\"===b.groupOp.toString().toUpperCase(),e&&q.orBegin(),c=0;c<b.groups.length;c++){k>0&&e&&q.or();try{a(b.groups[c])}catch(l){alert(l)}k++}e&&q.orEnd()}if(null!=b.rules)try{for(f=b.rules.length&&\"OR\"===b.groupOp.toString().toUpperCase(),f&&q.orBegin(),c=0;c<b.rules.length;c++)h=b.rules[c],g=b.groupOp.toString().toUpperCase(),p[h.op]&&h.field&&(k>0&&g&&\"OR\"===g&&(q=q.or()),i=j[h.field],\"date\"===i.stype&&i.srcfmt&&i.newfmt&&i.srcfmt!==i.newfmt&&(h.data=$.jgrid.parseDate.call(d,i.newfmt,h.data,i.srcfmt)),q=p[h.op](q,g)(h.field,h.data,j[h.field])),k++;f&&q.orEnd()}catch(m){alert(m)}}var b,c,e,f,g=d.p.multiSort?[]:\"\",h=[],i=!1,j={},k=[],l=[];if($.isArray(d.p.data)){var m,n,o=d.p.grouping?d.p.groupingView:!1;if($.each(d.p.colModel,function(){if(c=this.sorttype||\"text\",\"date\"===c||\"datetime\"===c?(this.formatter&&\"string\"==typeof this.formatter&&\"date\"===this.formatter?(b=this.formatoptions&&this.formatoptions.srcformat?this.formatoptions.srcformat:$.jgrid.getRegional(d,\"formatter.date.srcformat\"),e=this.formatoptions&&this.formatoptions.newformat?this.formatoptions.newformat:$.jgrid.getRegional(d,\"formatter.date.newformat\")):b=e=this.datefmt||\"Y-m-d\",j[this.name]={stype:c,srcfmt:b,newfmt:e,sfunc:this.sortfunc||null}):j[this.name]={stype:c,srcfmt:\"\",newfmt:\"\",sfunc:this.sortfunc||null},d.p.grouping)for(n=0,m=o.groupField.length;m>n;n++)if(this.name===o.groupField[n]){var a=this.name;this.index&&(a=this.index),k[n]=j[a],l[n]=a}d.p.multiSort||i||this.index!==d.p.sortname&&this.name!==d.p.sortname||(g=this.name,i=!0)}),d.p.multiSort&&(g=s,h=t),d.p.treeGrid&&d.p._sort)return void $(d).jqGrid(\"SortTree\",g,d.p.sortorder,j[g].stype||\"text\",j[g].srcfmt||\"\");var p={eq:function(a){return a.equals},ne:function(a){return a.notEquals},lt:function(a){return a.less},le:function(a){return a.lessOrEquals},gt:function(a){return a.greater},ge:function(a){return a.greaterOrEquals},cn:function(a){return a.contains},nc:function(a,b){return\"OR\"===b?a.orNot().contains:a.andNot().contains},bw:function(a){return a.startsWith},bn:function(a,b){return\"OR\"===b?a.orNot().startsWith:a.andNot().startsWith},en:function(a,b){return\"OR\"===b?a.orNot().endsWith:a.andNot().endsWith},ew:function(a){return a.endsWith},ni:function(a,b){return\"OR\"===b?a.orNot().equals:a.andNot().equals},\"in\":function(a){return a.equals},nu:function(a){return a.isNull},nn:function(a,b){return\"OR\"===b?a.orNot().isNull:a.andNot().isNull}},q=$.jgrid.from.call(d,d.p.data);if(d.p.ignoreCase&&(q=q.ignoreCase()),d.p.search===!0){var r=d.p.postData.filters;if(r)\"string\"==typeof r&&(r=$.jgrid.parse(r)),a(r);else try{f=j[d.p.postData.searchField],\"date\"===f.stype&&f.srcfmt&&f.newfmt&&f.srcfmt!==f.newfmt&&(d.p.postData.searchString=$.jgrid.parseDate.call(d,f.newfmt,d.p.postData.searchString,f.srcfmt)),q=p[d.p.postData.searchOper](q)(d.p.postData.searchField,d.p.postData.searchString,j[d.p.postData.searchField])}catch(u){}}else d.p.treeGrid&&\"nested\"===d.p.treeGridModel&&q.orderBy(d.p.treeReader.left_field,\"asc\",\"integer\",\"\",null);if(d.p.treeGrid&&\"adjacency\"===d.p.treeGridModel&&(m=0,g=null),d.p.grouping)for(n=0;m>n;n++)q.orderBy(l[n],o.groupOrder[n],k[n].stype,k[n].srcfmt);d.p.multiSort?$.each(g,function(a){q.orderBy(this,h[a],j[this].stype,j[this].srcfmt,j[this].sfunc)}):g&&d.p.sortorder&&i&&(\"DESC\"===d.p.sortorder.toUpperCase()?q.orderBy(d.p.sortname,\"d\",j[g].stype,j[g].srcfmt,j[g].sfunc):q.orderBy(d.p.sortname,\"a\",j[g].stype,j[g].srcfmt,j[g].sfunc));var v=q.select(),w=parseInt(d.p.rowNum,10),x=v.length,y=parseInt(d.p.page,10),z=Math.ceil(x/w),A={};if((d.p.search||d.p.resetsearch)&&d.p.grouping&&d.p.groupingView._locgr){d.p.groupingView.groups=[];var B,C,D,E=$.jgrid.getMethod(\"groupingPrepare\");if(d.p.footerrow&&d.p.userDataOnFooter){for(C in d.p.userData)d.p.userData.hasOwnProperty(C)&&(d.p.userData[C]=0);D=!0}for(B=0;x>B;B++){if(D)for(C in d.p.userData)d.p.userData.hasOwnProperty(C)&&(d.p.userData[C]+=parseFloat(v[B][C]||0));E.call($(d),v[B],B,w)}}return v=d.p.treeGrid&&d.p.search?$(d).jqGrid(\"searchTree\",v):v.slice((y-1)*w,y*w),q=null,j=null,A[d.p.localReader.total]=z,A[d.p.localReader.page]=y,A[d.p.localReader.records]=x,A[d.p.localReader.root]=v,A[d.p.localReader.userdata]=d.p.userData,v=null,A}},O=function(a,b){var c,e,f,g,h,i,j,n,p=\"\",q=d.p.pager?$.jgrid.jqID(d.p.pager.substr(1)):\"\",r=q?\"_\"+q:\"\",s=d.p.toppager?\"_\"+d.p.toppager.substr(1):\"\";if(f=parseInt(d.p.page,10)-1,0>f&&(f=0),f*=parseInt(d.p.rowNum,10),h=f+d.p.reccount,d.p.scroll){var t=$(\"tbody:first > tr:gt(0)\",d.grid.bDiv);f=h-t.length,d.p.reccount=t.length;var u=t.outerHeight()||d.grid.prevRowHeight;if(u){var v=f*u,w=parseInt(d.p.records,10)*u;$(\">div:first\",d.grid.bDiv).css({height:w}).children(\"div:first\").css({height:v,display:v?\"\":\"none\"}),0===d.grid.bDiv.scrollTop&&d.p.page>1&&(d.grid.bDiv.scrollTop=d.p.rowNum*(d.p.page-1)*u)}d.grid.bDiv.scrollLeft=d.grid.hDiv.scrollLeft}if(p=d.p.pager||\"\",p+=d.p.toppager?p?\",\"+d.p.toppager:d.p.toppager:\"\"){if(j=$.jgrid.getRegional(d,\"formatter.integer\"),c=y(d.p.page),e=y(d.p.lastpage),$(\".selbox\",p)[this.p.useProp?\"prop\":\"attr\"](\"disabled\",!1),d.p.pginput===!0&&($(\"#input\"+r).html($.jgrid.template($.jgrid.getRegional(d,\"defaults.pgtext\",d.p.pgtext)||\"\",\"<input \"+k(l,\"pgInput\",!1,\"ui-pg-input\")+\" type='text' size='2' maxlength='7' value='0' role='textbox'/>\",\"<span id='sp_1_\"+$.jgrid.jqID(q)+\"'></span>\")),d.p.toppager&&$(\"#input_t\"+s).html($.jgrid.template($.jgrid.getRegional(d,\"defaults.pgtext\",d.p.pgtext)||\"\",\"<input \"+k(l,\"pgInput\",!1,\"ui-pg-input\")+\" type='text' size='2' maxlength='7' value='0' role='textbox'/>\",\"<span id='sp_1_\"+$.jgrid.jqID(q)+\"_toppager'></span>\")),$(\".ui-pg-input\",p).val(d.p.page),n=d.p.toppager?\"#sp_1\"+r+\",#sp_1\"+r+\"_toppager\":\"#sp_1\"+r,$(n).html($.fmatter?$.fmatter.util.NumberFormat(d.p.lastpage,j):d.p.lastpage)),d.p.viewrecords)if(0===d.p.reccount)$(\".ui-paging-info\",p).html($.jgrid.getRegional(d,\"defaults.emptyrecords\",d.p.emptyrecords));else{g=f+1,i=d.p.records,$.fmatter&&(g=$.fmatter.util.NumberFormat(g,j),h=$.fmatter.util.NumberFormat(h,j),i=$.fmatter.util.NumberFormat(i,j));var x=$.jgrid.getRegional(d,\"defaults.recordtext\",d.p.recordtext);$(\".ui-paging-info\",p).html($.jgrid.template(x,g,h,i))}d.p.pgbuttons===!0&&(0>=c&&(c=e=0),1===c||0===c?($(\"#first\"+r+\", #prev\"+r).addClass(m).removeClass(o),d.p.toppager&&$(\"#first_t\"+s+\", #prev_t\"+s).addClass(m).removeClass(o)):($(\"#first\"+r+\", #prev\"+r).removeClass(m),d.p.toppager&&$(\"#first_t\"+s+\", #prev_t\"+s).removeClass(m)),c===e||0===c?($(\"#next\"+r+\", #last\"+r).addClass(m).removeClass(o),d.p.toppager&&$(\"#next_t\"+s+\", #last_t\"+s).addClass(m).removeClass(o)):($(\"#next\"+r+\", #last\"+r).removeClass(m),d.p.toppager&&$(\"#next_t\"+s+\", #last_t\"+s).removeClass(m)))}a===!0&&d.p.rownumbers===!0&&$(\">td.jqgrid-rownum\",d.rows).each(function(a){$(this).html(f+1+a)}),b&&d.p.jqgdnd&&$(d).jqGrid(\"gridDnD\",\"updateDnD\"),$(d).triggerHandler(\"jqGridGridComplete\"),$.isFunction(d.p.gridComplete)&&d.p.gridComplete.call(d),$(d).triggerHandler(\"jqGridAfterGridComplete\")},P=function(){d.grid.hDiv.loading=!0,d.p.hiddengrid||$(d).jqGrid(\"progressBar\",{method:\"show\",loadtype:d.p.loadui,htmlcontent:$.jgrid.getRegional(d,\"defaults.loadtext\",d.p.loadtext)})},Q=function(){d.grid.hDiv.loading=!1,$(d).jqGrid(\"progressBar\",{method:\"hide\",loadtype:d.p.loadui})},R=function(a){if(!d.grid.hDiv.loading){var b,c,e=d.p.scroll&&a===!1,f={},g=d.p.prmNames;d.p.page<=0&&(d.p.page=Math.min(1,d.p.lastpage)),null!==g.search&&(f[g.search]=d.p.search),null!==g.nd&&(f[g.nd]=(new Date).getTime()),null!==g.rows&&(f[g.rows]=d.p.rowNum),null!==g.page&&(f[g.page]=d.p.page),null!==g.sort&&(f[g.sort]=d.p.sortname),null!==g.order&&(f[g.order]=d.p.sortorder),null!==d.p.rowTotal&&null!==g.totalrows&&(f[g.totalrows]=d.p.rowTotal);var h=$.isFunction(d.p.loadComplete),i=h?d.p.loadComplete:null,j=0;if(a=a||1,a>1?null!==g.npage?(f[g.npage]=a,j=a-1,a=1):i=function(b){d.p.page++,d.grid.hDiv.loading=!1,h&&d.p.loadComplete.call(d,b),R(a-1)}:null!==g.npage&&delete d.p.postData[g.npage],d.p.grouping){$(d).jqGrid(\"groupingSetup\");var k,l=d.p.groupingView,m=\"\";for(k=0;k<l.groupField.length;k++){var n=l.groupField[k];$.each(d.p.colModel,function(a,b){b.name===n&&b.index&&(n=b.index)}),m+=n+\" \"+l.groupOrder[k]+\", \"}f[g.sort]=m+f[g.sort]}$.extend(d.p.postData,f);var o=d.p.scroll?d.rows.length-1:1,p=$(d).triggerHandler(\"jqGridBeforeRequest\");if(p===!1||\"stop\"===p)return;if($.isFunction(d.p.datatype))return void d.p.datatype.call(d,d.p.postData,\"load_\"+d.p.id,o,a,j);if($.isFunction(d.p.beforeRequest)&&(p=d.p.beforeRequest.call(d),void 0===p&&(p=!0),p===!1))return;switch(b=d.p.datatype.toLowerCase()){case\"json\":case\"jsonp\":case\"xml\":case\"script\":$.ajax($.extend({url:d.p.url,type:d.p.mtype,dataType:b,data:$.isFunction(d.p.serializeGridData)?d.p.serializeGridData.call(d,d.p.postData):d.p.postData,success:function(c,f,g){return $.isFunction(d.p.beforeProcessing)&&d.p.beforeProcessing.call(d,c,f,g)===!1?void Q():(\"xml\"===b?L(c,o,a>1,j):M(c,o,a>1,j),$(d).triggerHandler(\"jqGridLoadComplete\",[c]),i&&i.call(d,c),$(d).triggerHandler(\"jqGridAfterLoadComplete\",[c]),e&&d.grid.populateVisible(),(d.p.loadonce||d.p.treeGrid)&&(d.p.datatype=\"local\"),c=null,void(1===a&&Q()))},error:function(b,c,e){$.isFunction(d.p.loadError)&&d.p.loadError.call(d,b,c,e),1===a&&Q(),b=null},beforeSend:function(a,b){var c=!0;return $.isFunction(d.p.loadBeforeSend)&&(c=d.p.loadBeforeSend.call(d,a,b)),void 0===c&&(c=!0),c===!1?!1:void P()}},$.jgrid.ajaxOptions,d.p.ajaxGridOptions));break;case\"xmlstring\":P(),c=\"string\"!=typeof d.p.datastr?d.p.datastr:$.parseXML(d.p.datastr),L(c),$(d).triggerHandler(\"jqGridLoadComplete\",[c]),h&&d.p.loadComplete.call(d,c),$(d).triggerHandler(\"jqGridAfterLoadComplete\",[c]),d.p.datatype=\"local\",d.p.datastr=null,Q();break;case\"jsonstring\":P(),c=\"string\"==typeof d.p.datastr?$.jgrid.parse(d.p.datastr):d.p.datastr,M(c),$(d).triggerHandler(\"jqGridLoadComplete\",[c]),h&&d.p.loadComplete.call(d,c),$(d).triggerHandler(\"jqGridAfterLoadComplete\",[c]),d.p.datatype=\"local\",d.p.datastr=null,Q();break;case\"local\":case\"clientside\":P(),d.p.datatype=\"local\",d.p._ald=!0;var q=N();M(q,o,a>1,j),$(d).triggerHandler(\"jqGridLoadComplete\",[q]),i&&i.call(d,q),$(d).triggerHandler(\"jqGridAfterLoadComplete\",[q]),e&&d.grid.populateVisible(),Q(),d.p._ald=!1}d.p._sort=!1}},S=function(a){$(\"#cb_\"+$.jgrid.jqID(d.p.id),d.grid.hDiv)[d.p.useProp?\"prop\":\"attr\"](\"checked\",a);var b=d.p.frozenColumns?d.p.id+\"_frozen\":\"\";b&&$(\"#cb_\"+$.jgrid.jqID(d.p.id),d.grid.fhDiv)[d.p.useProp?\"prop\":\"attr\"](\"checked\",a)},T=function(a,b){var c,e,f,g,i,j,n,p=\"<td class='ui-pg-button \"+m+\"'><span class='ui-separator'></span></td>\",r=\"\",s=\"<table class='ui-pg-table ui-common-table ui-paging-pager'><tbody><tr>\",t=\"\",u=function(a,b){var c;return $.isFunction(d.p.onPaging)&&(c=d.p.onPaging.call(d,a,b)),\"stop\"===c?!1:(d.p.selrow=null,d.p.multiselect&&(d.p.selarrrow=[],S(!1)),d.p.savedRow=[],!0)};if(a=a.substr(1),b+=\"_\"+a,c=\"pg_\"+a,e=a+\"_left\",f=a+\"_center\",g=a+\"_right\",$(\"#\"+$.jgrid.jqID(a)).append(\"<div id='\"+c+\"' class='ui-pager-control' role='group'><table class='ui-pg-table ui-common-table ui-pager-table'><tbody><tr><td id='\"+e+\"' align='left'></td><td id='\"+f+\"' align='center' style='white-space:pre;'></td><td id='\"+g+\"' align='right'></td></tr></tbody></table></div>\").attr(\"dir\",\"ltr\"),d.p.rowList.length>0){t='<td dir=\"'+h+'\">',t+=\"<select \"+k(l,\"pgSelectBox\",!1,\"ui-pg-selbox\")+' role=\"listbox\" title=\"'+($.jgrid.getRegional(d,\"defaults.pgrecs\",d.p.pgrecs)||\"\")+'\">';var v;for(n=0;n<d.p.rowList.length;n++)v=d.p.rowList[n].toString().split(\":\"),1===v.length&&(v[1]=v[0]),t+='<option role=\"option\" value=\"'+v[0]+'\"'+(y(d.p.rowNum,0)===y(v[0],0)?' selected=\"selected\"':\"\")+\">\"+v[1]+\"</option>\";t+=\"</select></td>\"}if(\"rtl\"===h&&(s+=t),d.p.pginput===!0&&(r=\"<td id='input\"+b+\"' dir='\"+h+\"'>\"+$.jgrid.template($.jgrid.getRegional(d,\"defaults.pgtext\",d.p.pgtext)||\"\",\"<input class='ui-pg-input' type='text' size='2' maxlength='7' value='0' role='textbox'/>\",\"<span id='sp_1_\"+$.jgrid.jqID(a)+\"'></span>\")+\"</td>\"),d.p.pgbuttons===!0){var w=[\"first\"+b,\"prev\"+b,\"next\"+b,\"last\"+b],x=k(l,\"pgButtonBox\",!0,\"ui-pg-button\"),z=[$.jgrid.getRegional(d,\"defaults.pgfirst\",d.p.pgfirst)||\"\",$.jgrid.getRegional(d,\"defaults.pgprev\",d.p.pgprev)||\"\",$.jgrid.getRegional(d,\"defaults.pgnext\",d.p.pgnext)||\"\",$.jgrid.getRegional(d,\"defaults.pglast\",d.p.pglast)||\"\"];\"rtl\"===h&&(w.reverse(),z.reverse()),s+=\"<td id='\"+w[0]+\"' class='\"+x+\"' title='\"+z[0]+\"'><span \"+k(l,\"icon_first\",!1,q)+\"></span></td>\",s+=\"<td id='\"+w[1]+\"' class='\"+x+\"'  title='\"+z[1]+\"'><span \"+k(l,\"icon_prev\",!1,q)+\"></span></td>\",s+=\"\"!==r?p+r+p:\"\",s+=\"<td id='\"+w[2]+\"' class='\"+x+\"' title='\"+z[2]+\"'><span \"+k(l,\"icon_next\",!1,q)+\"></span></td>\",s+=\"<td id='\"+w[3]+\"' class='\"+x+\"' title='\"+z[3]+\"'><span \"+k(l,\"icon_end\",!1,q)+\"></span></td>\"}else\"\"!==r&&(s+=r);\"ltr\"===h&&(s+=t),s+=\"</tr></tbody></table>\",d.p.viewrecords===!0&&$(\"td#\"+a+\"_\"+d.p.recordpos,\"#\"+c).append(\"<div dir='\"+h+\"' style='text-align:\"+d.p.recordpos+\"' class='ui-paging-info'></div>\"),$(\"td#\"+a+\"_\"+d.p.pagerpos,\"#\"+c).append(s),j=$(\"#gbox_\"+$.jgrid.jqID(d.p.id)).css(\"font-size\")||\"11px\",$(\"#gbox_\"+$.jgrid.jqID(d.p.id)).append(\"<div id='testpg' \"+k(l,\"entrieBox\",!1,\"ui-jqgrid\")+\" style='font-size:\"+j+\";visibility:hidden;' ></div>\"),i=$(s).clone().appendTo(\"#testpg\").width(),$(\"#testpg\").remove(),i>0&&(\"\"!==r&&(i+=50),$(\"td#\"+a+\"_\"+d.p.pagerpos,\"#\"+c).width(i)),d.p._nvtd=[],d.p._nvtd[0]=Math.floor(i?(d.p.width-i)/2:d.p.width/3),d.p._nvtd[1]=0,s=null,$(\".ui-pg-selbox\",\"#\"+c).bind(\"change\",function(){return u(\"records\",this)?(d.p.page=Math.round(d.p.rowNum*(d.p.page-1)/this.value-.5)+1,d.p.rowNum=this.value,d.p.pager&&$(\".ui-pg-selbox\",d.p.pager).val(this.value),d.p.toppager&&$(\".ui-pg-selbox\",d.p.toppager).val(this.value),R(),!1):!1}),d.p.pgbuttons===!0&&($(\".ui-pg-button\",\"#\"+c).hover(function(){$(this).hasClass(m)?this.style.cursor=\"default\":($(this).addClass(o),this.style.cursor=\"pointer\")},function(){$(this).hasClass(m)||($(this).removeClass(o),this.style.cursor=\"default\")}),$(\"#first\"+$.jgrid.jqID(b)+\", #prev\"+$.jgrid.jqID(b)+\", #next\"+$.jgrid.jqID(b)+\", #last\"+$.jgrid.jqID(b)).click(function(){if($(this).hasClass(m))return!1;var a=y(d.p.page,1),c=y(d.p.lastpage,1),e=!1,f=!0,g=!0,h=!0,i=!0;return 0===c||1===c?(f=!1,g=!1,h=!1,i=!1):c>1&&a>=1?1===a?(f=!1,g=!1):a===c&&(h=!1,i=!1):c>1&&0===a&&(h=!1,i=!1,a=c-1),u(this.id.split(\"_\")[0],this)?(this.id===\"first\"+b&&f&&(d.p.page=1,e=!0),this.id===\"prev\"+b&&g&&(d.p.page=a-1,e=!0),this.id===\"next\"+b&&h&&(d.p.page=a+1,e=!0),this.id===\"last\"+b&&i&&(d.p.page=c,e=!0),e&&R(),!1):!1})),d.p.pginput===!0&&$(\"#\"+c).on(\"keypress\",\"input.ui-pg-input\",function(a){var b=a.charCode||a.keyCode||0;return 13===b?u(\"user\",this)?($(this).val(y($(this).val(),1)),d.p.page=$(this).val()>0?$(this).val():d.p.page,R(),!1):!1:this})},U=function(a,b){var c,e=d.p.colModel,f=d.p.frozenColumns?b:d.grid.headers[a].el,g=\"\";$(\"span.ui-grid-ico-sort\",f).addClass(m),$(f).attr(\"aria-selected\",\"false\"),c=\"local\"===d.p.datatype?e[a].name:e[a].index||e[a].name,e[a].lso?\"asc\"===e[a].lso?(e[a].lso+=\"-desc\",g=\"desc\"):\"desc\"===e[a].lso?(e[a].lso+=\"-asc\",g=\"asc\"):(\"asc-desc\"===e[a].lso||\"desc-asc\"===e[a].lso)&&(e[a].lso=\"\"):e[a].lso=g=e[a].firstsortorder||\"asc\",g?($(\"span.s-ico\",f).show(),$(\"span.ui-icon-\"+g,f).removeClass(m),$(f).attr(\"aria-selected\",\"true\")):d.p.viewsortcols[0]||$(\"span.s-ico\",f).hide();var h=s.indexOf(c);-1===h?(s.push(c),t.push(g)):g?t[h]=g:(t.splice(h,1),s.splice(h,1)),d.p.sortorder=\"\",d.p.sortname=\"\";for(var i=0,j=s.length;j>i;i++)i>0&&(d.p.sortname+=\", \"),d.p.sortname+=s[i],i!==j-1&&(d.p.sortname+=\" \"+t[i]);d.p.sortorder=t[j-1]},V=function(a,b,c,e,f){if(d.p.colModel[b].sortable&&!(d.p.savedRow.length>0)){if(c||(d.p.lastsort===b&&\"\"!==d.p.sortname?\"asc\"===d.p.sortorder?d.p.sortorder=\"desc\":\"desc\"===d.p.sortorder&&(d.p.sortorder=\"asc\"):d.p.sortorder=d.p.colModel[b].firstsortorder||\"asc\",d.p.page=1),d.p.multiSort)U(b,f);else{if(e){if(d.p.lastsort===b&&d.p.sortorder===e&&!c)return;d.p.sortorder=e}var g,h=d.grid.headers[d.p.lastsort]?d.grid.headers[d.p.lastsort].el:null,i=d.p.frozenColumns?f:d.grid.headers[b].el,j=\"single\"===d.p.viewsortcols[1]?!0:!1;g=$(h).find(\"span.ui-grid-ico-sort\"),g.addClass(m),j&&$(g).css(\"display\",\"none\"),$(h).attr(\"aria-selected\",\"false\"),d.p.frozenColumns&&(g=d.grid.fhDiv.find(\"span.ui-grid-ico-sort\"),g.addClass(m),j&&g.css(\"display\",\"none\"),d.grid.fhDiv.find(\"th\").attr(\"aria-selected\",\"false\")),g=$(i).find(\"span.ui-icon-\"+d.p.sortorder),g.removeClass(m),j&&g.css(\"display\",\"\"),$(i).attr(\"aria-selected\",\"true\"),d.p.viewsortcols[0]||(d.p.lastsort!==b?(d.p.frozenColumns&&d.grid.fhDiv.find(\"span.s-ico\").hide(),$(\"span.s-ico\",h).hide(),$(\"span.s-ico\",i).show()):\"\"===d.p.sortname&&$(\"span.s-ico\",i).show()),a=a.substring(5+d.p.id.length+1),d.p.sortname=d.p.colModel[b].index||a}if(\"stop\"===$(d).triggerHandler(\"jqGridSortCol\",[d.p.sortname,b,d.p.sortorder]))return void(d.p.lastsort=b);if($.isFunction(d.p.onSortCol)&&\"stop\"===d.p.onSortCol.call(d,d.p.sortname,b,d.p.sortorder))return void(d.p.lastsort=b);if(\"local\"===d.p.datatype?d.p.deselectAfterSort&&$(d).jqGrid(\"resetSelection\"):(d.p.selrow=null,d.p.multiselect&&S(!1),d.p.selarrrow=[],d.p.savedRow=[]),d.p.scroll){var k=d.grid.bDiv.scrollLeft;H.call(d,!0,!1),d.grid.hDiv.scrollLeft=k}d.p.subGrid&&\"local\"===d.p.datatype&&$(\"td.sgexpanded\",\"#\"+$.jgrid.jqID(d.p.id)).each(function(){$(this).trigger(\"click\")}),d.p._sort=!0,R(),d.p.lastsort=b,d.p.sortname!==a&&b&&(d.p.lastsort=b)}},W=function(){var a,b,c,f,g=0,h=$.jgrid.cell_width?0:y(d.p.cellLayout,0),i=0,j=y(d.p.scrollOffset,0),k=!1,l=0;$.each(d.p.colModel,function(){if(void 0===this.hidden&&(this.hidden=!1),d.p.grouping&&d.p.autowidth){var a=$.inArray(this.name,d.p.groupingView.groupField);a>=0&&d.p.groupingView.groupColumnShow.length>a&&(this.hidden=!d.p.groupingView.groupColumnShow[a])}this.widthOrg=b=y(this.width,0),this.hidden===!1&&(g+=b+h,this.fixed?l+=b+h:i++)}),isNaN(d.p.width)&&(d.p.width=g+(d.p.shrinkToFit!==!1||isNaN(d.p.height)?0:j)),e.width=d.p.width,d.p.tblwidth=g,d.p.shrinkToFit===!1&&d.p.forceFit===!0&&(d.p.forceFit=!1),d.p.shrinkToFit===!0&&i>0&&(c=e.width-h*i-l,isNaN(d.p.height)||(c-=j,k=!0),g=0,$.each(d.p.colModel,function(e){this.hidden!==!1||this.fixed||(b=Math.round(c*this.width/(d.p.tblwidth-h*i-l)),this.width=b,g+=b,a=e)}),f=0,k?e.width-l-(g+h*i)!==j&&(f=e.width-l-(g+h*i)-j):k||1===Math.abs(e.width-l-(g+h*i))||(f=e.width-l-(g+h*i)),d.p.colModel[a].width+=f,d.p.tblwidth=g+f+h*i+l,d.p.tblwidth>d.p.width&&(d.p.colModel[a].width-=d.p.tblwidth-parseInt(d.p.width,10),d.p.tblwidth=d.p.width))},X=function(a){var b,c=a,e=a;for(b=a+1;b<d.p.colModel.length;b++)if(d.p.colModel[b].hidden!==!0){e=b;break}return e-c},Y=function(a){var b=$(d.grid.headers[a].el),c=[b.position().left+b.outerWidth()];return\"rtl\"===d.p.direction&&(c[0]=d.p.width-c[0]),c[0]-=d.grid.bDiv.scrollLeft,c.push($(d.grid.hDiv).position().top),c.push($(d.grid.bDiv).offset().top-$(d.grid.hDiv).offset().top+$(d.grid.bDiv).height()),c},Z=function(a){var b,c=d.grid.headers,e=$.jgrid.getCellIndex(a);for(b=0;b<c.length;b++)if(a===c[b].el){e=b;break}return e};for(this.p.id=this.id,-1===$.inArray(d.p.multikey,x)&&(d.p.multikey=!1),d.p.keyName=!1,i=0;i<d.p.colModel.length;i++)w=\"string\"==typeof d.p.colModel[i].template?null!=$.jgrid.cmTemplate&&\"object\"==typeof $.jgrid.cmTemplate[d.p.colModel[i].template]?$.jgrid.cmTemplate[d.p.colModel[i].template]:{}:d.p.colModel[i].template,d.p.colModel[i]=$.extend(!0,{},d.p.cmTemplate,w||{},d.p.colModel[i]),d.p.keyName===!1&&d.p.colModel[i].key===!0&&(d.p.keyName=d.p.colModel[i].name);if(d.p.sortorder=d.p.sortorder.toLowerCase(),$.jgrid.cell_width=$.jgrid.cellWidth(),d.p.grouping===!0&&(d.p.scroll=!1,d.p.rownumbers=!1,d.p.treeGrid=!1,d.p.gridview=!0),this.p.treeGrid===!0){try{$(this).jqGrid(\"setTreeGrid\")}catch(_){}\"local\"!==d.p.datatype&&(d.p.localReader={id:\"_id_\"})}if(this.p.subGrid)try{$(d).jqGrid(\"setSubGrid\")}catch(ab){}this.p.multiselect&&(this.p.colNames.unshift(\"<input role='checkbox' id='cb_\"+this.p.id+\"' class='cbox' type='checkbox'/>\"),this.p.colModel.unshift({name:\"cb\",width:$.jgrid.cell_width?d.p.multiselectWidth+d.p.cellLayout:d.p.multiselectWidth,sortable:!1,resizable:!1,hidedlg:!0,search:!1,align:\"center\",fixed:!0,frozen:!0})),this.p.rownumbers&&(this.p.colNames.unshift(\"\"),this.p.colModel.unshift({name:\"rn\",width:d.p.rownumWidth,sortable:!1,resizable:!1,hidedlg:!0,search:!1,align:\"center\",fixed:!0,frozen:!0})),d.p.xmlReader=$.extend(!0,{root:\"rows\",row:\"row\",page:\"rows>page\",total:\"rows>total\",records:\"rows>records\",repeatitems:!0,cell:\"cell\",id:\"[id]\",userdata:\"userdata\",subgrid:{root:\"rows\",row:\"row\",repeatitems:!0,cell:\"cell\"}},d.p.xmlReader),d.p.jsonReader=$.extend(!0,{root:\"rows\",page:\"page\",total:\"total\",records:\"records\",repeatitems:!0,cell:\"cell\",id:\"id\",userdata:\"userdata\",subgrid:{root:\"rows\",repeatitems:!0,cell:\"cell\"}},d.p.jsonReader),d.p.localReader=$.extend(!0,{root:\"rows\",page:\"page\",total:\"total\",records:\"records\",repeatitems:!1,cell:\"cell\",id:\"id\",userdata:\"userdata\",subgrid:{root:\"rows\",repeatitems:!0,cell:\"cell\"}},d.p.localReader),d.p.scroll&&(d.p.pgbuttons=!1,d.p.pginput=!1,d.p.rowList=[]),d.p.data.length&&(I(),J());var bb,cb,db,eb,fb,gb,hb,ib,jb=\"<thead><tr class='ui-jqgrid-labels' role='row'>\",kb=\"\",lb=\"\",mb=\"\";if(d.p.shrinkToFit===!0&&d.p.forceFit===!0)for(i=d.p.colModel.length-1;i>=0;i--)if(!d.p.colModel[i].hidden){d.p.colModel[i].resizable=!1;break}if(\"horizontal\"===d.p.viewsortcols[1]?(lb=\" ui-i-asc\",mb=\" ui-i-desc\"):\"single\"===d.p.viewsortcols[1]&&(lb=\" ui-single-sort-asc\",mb=\" ui-single-sort-desc\",kb=\" style='display:none'\",d.p.viewsortcols[0]=!1),bb=r?\"class='ui-th-div-ie'\":\"\",ib=\"<span class='s-ico' style='display:none'>\",ib+=\"<span sort='asc'  class='ui-grid-ico-sort ui-icon-asc\"+lb+\" ui-sort-\"+h+\" \"+m+\" \"+q+\" \"+k(l,\"icon_asc\",!0)+\"'\"+kb+\"></span>\",ib+=\"<span sort='desc' class='ui-grid-ico-sort ui-icon-desc\"+mb+\" ui-sort-\"+h+\" \"+m+\" \"+q+\" \"+k(l,\"icon_desc\",!0)+\"'\"+kb+\"></span></span>\",d.p.multiSort&&d.p.sortname)for(s=d.p.sortname.split(\",\"),i=0;i<s.length;i++)u=$.trim(s[i]).split(\" \"),s[i]=$.trim(u[0]),t[i]=u[1]?$.trim(u[1]):d.p.sortorder||\"asc\";\nfor(i=0;i<this.p.colNames.length;i++){var nb=d.p.headertitles?' title=\"'+$.jgrid.stripHtml(d.p.colNames[i])+'\"':\"\";jb+=\"<th id='\"+d.p.id+\"_\"+d.p.colModel[i].name+\"' role='columnheader' \"+k(l,\"headerBox\",!1,\"ui-th-column ui-th-\"+h)+\" \"+nb+\">\",cb=d.p.colModel[i].index||d.p.colModel[i].name,jb+=\"<div id='jqgh_\"+d.p.id+\"_\"+d.p.colModel[i].name+\"' \"+bb+\">\"+d.p.colNames[i],d.p.colModel[i].width=d.p.colModel[i].width?parseInt(d.p.colModel[i].width,10):150,\"boolean\"!=typeof d.p.colModel[i].title&&(d.p.colModel[i].title=!0),d.p.colModel[i].lso=\"\",cb===d.p.sortname&&(d.p.lastsort=i),d.p.multiSort&&(u=$.inArray(cb,s),-1!==u&&(d.p.colModel[i].lso=t[u])),jb+=ib+\"</div></th>\"}if(jb+=\"</tr></thead>\",ib=null,$(this).append(jb),$(\"thead tr:first th\",this).hover(function(){$(this).addClass(o)},function(){$(this).removeClass(o)}),this.p.multiselect){var ob,pb=[];$(\"#cb_\"+$.jgrid.jqID(d.p.id),this).bind(\"click\",function(){d.p.selarrrow=[];var a=d.p.frozenColumns===!0?d.p.id+\"_frozen\":\"\";this.checked?($(d.rows).each(function(b){b>0&&($(this).hasClass(\"ui-subgrid\")||$(this).hasClass(\"jqgroup\")||$(this).hasClass(m)||$(this).hasClass(\"jqfoot\")||($(\"#jqg_\"+$.jgrid.jqID(d.p.id)+\"_\"+$.jgrid.jqID(this.id))[d.p.useProp?\"prop\":\"attr\"](\"checked\",!0),$(this).addClass(n).attr(\"aria-selected\",\"true\"),d.p.selarrrow.push(this.id),d.p.selrow=this.id,a&&($(\"#jqg_\"+$.jgrid.jqID(d.p.id)+\"_\"+$.jgrid.jqID(this.id),d.grid.fbDiv)[d.p.useProp?\"prop\":\"attr\"](\"checked\",!0),$(\"#\"+$.jgrid.jqID(this.id),d.grid.fbDiv).addClass(n))))}),ob=!0,pb=[]):($(d.rows).each(function(b){b>0&&($(this).hasClass(\"ui-subgrid\")||$(this).hasClass(\"jqgroup\")||$(this).hasClass(m)||$(this).hasClass(\"jqfoot\")||($(\"#jqg_\"+$.jgrid.jqID(d.p.id)+\"_\"+$.jgrid.jqID(this.id))[d.p.useProp?\"prop\":\"attr\"](\"checked\",!1),$(this).removeClass(n).attr(\"aria-selected\",\"false\"),pb.push(this.id),a&&($(\"#jqg_\"+$.jgrid.jqID(d.p.id)+\"_\"+$.jgrid.jqID(this.id),d.grid.fbDiv)[d.p.useProp?\"prop\":\"attr\"](\"checked\",!1),$(\"#\"+$.jgrid.jqID(this.id),d.grid.fbDiv).removeClass(n))))}),d.p.selrow=null,ob=!1),$(d).triggerHandler(\"jqGridSelectAll\",[ob?d.p.selarrrow:pb,ob]),$.isFunction(d.p.onSelectAll)&&d.p.onSelectAll.call(d,ob?d.p.selarrrow:pb,ob)})}if(d.p.autowidth===!0){var qb=$(v).innerWidth();d.p.width=qb>0?qb:\"nw\"}W(),$(v).css(\"width\",e.width+\"px\").append(\"<div class='ui-jqgrid-resize-mark' id='rs_m\"+d.p.id+\"'>&#160;</div>\"),d.p.scrollPopUp&&$(v).append(\"<div \"+k(l,\"scrollBox\",!1,\"loading ui-scroll-popup\")+\" id='scroll_g\"+d.p.id+\"'></div>\"),$(j).css(\"width\",e.width+\"px\"),jb=$(\"thead:first\",d).get(0);var rb=\"\";d.p.footerrow&&(rb+=\"<table role='presentation' style='width:\"+d.p.tblwidth+\"px' \"+k(l,\"footerTable\",!1,\"ui-jqgrid-ftable ui-common-table\")+\"><tbody><tr role='row' \"+k(l,\"footerBox\",!1,\"footrow footrow-\"+h)+\">\");var sb=$(\"tr:first\",jb),tb=\"<tr class='jqgfirstrow' role='row'>\";if(d.p.disableClick=!1,$(\"th\",sb).each(function(a){db=d.p.colModel[a].width,void 0===d.p.colModel[a].resizable&&(d.p.colModel[a].resizable=!0),d.p.colModel[a].resizable?(eb=document.createElement(\"span\"),$(eb).html(\"&#160;\").addClass(\"ui-jqgrid-resize ui-jqgrid-resize-\"+h).css(\"cursor\",\"col-resize\"),$(this).addClass(d.p.resizeclass)):eb=\"\",$(this).css(\"width\",db+\"px\").prepend(eb),eb=null;var b=\"\";d.p.colModel[a].hidden&&($(this).css(\"display\",\"none\"),b=\"display:none;\"),tb+=\"<td role='gridcell' style='height:0px;width:\"+db+\"px;\"+b+\"'></td>\",e.headers[a]={width:db,el:this},kb=d.p.colModel[a].sortable,\"boolean\"!=typeof kb&&(d.p.colModel[a].sortable=!0,kb=!0);var c=d.p.colModel[a].name;\"cb\"!==c&&\"subgrid\"!==c&&\"rn\"!==c&&d.p.viewsortcols[2]&&$(\">div\",this).addClass(\"ui-jqgrid-sortable\"),kb&&(d.p.multiSort?d.p.viewsortcols[0]?($(\"div span.s-ico\",this).show(),d.p.colModel[a].lso&&$(\"div span.ui-icon-\"+d.p.colModel[a].lso,this).removeClass(m).css(\"display\",\"\")):d.p.colModel[a].lso&&($(\"div span.s-ico\",this).show(),$(\"div span.ui-icon-\"+d.p.colModel[a].lso,this).removeClass(m).css(\"display\",\"\")):d.p.viewsortcols[0]?($(\"div span.s-ico\",this).show(),a===d.p.lastsort&&$(\"div span.ui-icon-\"+d.p.sortorder,this).removeClass(m).css(\"display\",\"\")):a===d.p.lastsort&&\"\"!==d.p.sortname&&($(\"div span.s-ico\",this).show(),$(\"div span.ui-icon-\"+d.p.sortorder,this).removeClass(m).css(\"display\",\"\"))),d.p.footerrow&&(rb+=\"<td role='gridcell' \"+z(a,0,\"\",null,\"\",!1)+\">&#160;</td>\")}).mousedown(function(a){if(1===$(a.target).closest(\"th>span.ui-jqgrid-resize\").length){var b=Z(this);return d.p.forceFit===!0&&(d.p.nv=X(b)),e.dragStart(b,a,Y(b)),!1}}).click(function(a){if(d.p.disableClick)return d.p.disableClick=!1,!1;var b,c,e=\"th>div.ui-jqgrid-sortable\";d.p.viewsortcols[2]||(e=\"th>div>span>span.ui-grid-ico-sort\");var f=$(a.target).closest(e);if(1===f.length){var g;if(d.p.frozenColumns){var h=$(this)[0].id.substring(d.p.id.length+1);$(d.p.colModel).each(function(a){return this.name===h?(g=a,!1):void 0})}else g=Z(this);return d.p.viewsortcols[2]||(b=!0,c=f.attr(\"sort\")),null!=g&&V($(\"div\",this)[0].id,g,b,c,this),!1}}),d.p.sortable&&$.fn.sortable)try{$(d).jqGrid(\"sortableColumns\",sb)}catch(ub){}d.p.footerrow&&(rb+=\"</tr></tbody></table>\"),tb+=\"</tr>\",hb=document.createElement(\"tbody\"),this.appendChild(hb),$(this).addClass(k(l,\"rowTable\",!0,\"ui-jqgrid-btable ui-common-table\")).append(tb),tb=null;var vb=$(\"<table \"+k(l,\"headerTable\",!1,\"ui-jqgrid-htable ui-common-table\")+\" style='width:\"+d.p.tblwidth+\"px' role='presentation' aria-labelledby='gbox_\"+this.id+\"'></table>\").append(jb),wb=d.p.caption&&d.p.hiddengrid===!0?!0:!1,xb=$(\"<div class='ui-jqgrid-hbox\"+(\"rtl\"===h?\"-rtl\":\"\")+\"'></div>\");jb=null,e.hDiv=document.createElement(\"div\"),e.hDiv.style.width=e.width+\"px\",e.hDiv.className=k(l,\"headerDiv\",!0,\"ui-jqgrid-hdiv\"),$(e.hDiv).append(xb),$(xb).append(vb),vb=null,wb&&$(e.hDiv).hide(),d.p.pager&&(\"string\"==typeof d.p.pager?\"#\"!==d.p.pager.substr(0,1)&&(d.p.pager=\"#\"+d.p.pager):d.p.pager=\"#\"+$(d.p.pager).attr(\"id\"),$(d.p.pager).css({width:e.width+\"px\"}).addClass(k(l,\"pagerBox\",!0,\"ui-jqgrid-pager\")).appendTo(v),wb&&$(d.p.pager).hide(),T(d.p.pager,\"\")),d.p.cellEdit===!1&&d.p.hoverrows===!0&&$(d).bind(\"mouseover\",function(a){gb=$(a.target).closest(\"tr.jqgrow\"),\"ui-subgrid\"!==$(gb).attr(\"class\")&&$(gb).addClass(o)}).bind(\"mouseout\",function(a){gb=$(a.target).closest(\"tr.jqgrow\"),$(gb).removeClass(o)});var yb,zb,Ab;$(d).before(e.hDiv).click(function(a){if(fb=a.target,gb=$(fb,d.rows).closest(\"tr.jqgrow\"),0===$(gb).length||gb[0].className.indexOf(m)>-1||($(fb,d).closest(\"table.ui-jqgrid-btable\").attr(\"id\")||\"\").replace(\"_frozen\",\"\")!==d.id)return this;var b=$(fb).hasClass(\"cbox\"),c=$(d).triggerHandler(\"jqGridBeforeSelectRow\",[gb[0].id,a]);if(c=c===!1||\"stop\"===c?!1:!0,$.isFunction(d.p.beforeSelectRow)){var e=d.p.beforeSelectRow.call(d,gb[0].id,a);(e===!1||\"stop\"===e)&&(c=!1)}if(\"A\"!==fb.tagName&&(\"INPUT\"!==fb.tagName&&\"TEXTAREA\"!==fb.tagName&&\"OPTION\"!==fb.tagName&&\"SELECT\"!==fb.tagName||b)){if(yb=gb[0].id,fb=$(fb).closest(\"tr.jqgrow>td\"),fb.length>0&&(zb=$.jgrid.getCellIndex(fb),Ab=$(fb).closest(\"td,th\").html(),$(d).triggerHandler(\"jqGridCellSelect\",[yb,zb,Ab,a]),$.isFunction(d.p.onCellSelect)&&d.p.onCellSelect.call(d,yb,zb,Ab,a)),d.p.cellEdit===!0)if(d.p.multiselect&&b&&c)$(d).jqGrid(\"setSelection\",yb,!0,a);else if(fb.length>0){yb=gb[0].rowIndex;try{$(d).jqGrid(\"editCell\",yb,zb,!0)}catch(f){}}if(c)if(d.p.multikey)a[d.p.multikey]?$(d).jqGrid(\"setSelection\",yb,!0,a):d.p.multiselect&&b&&(b=$(\"#jqg_\"+$.jgrid.jqID(d.p.id)+\"_\"+yb).is(\":checked\"),$(\"#jqg_\"+$.jgrid.jqID(d.p.id)+\"_\"+yb)[d.p.useProp?\"prop\":\"attr\"](\"checked\",!b));else if(d.p.multiselect&&d.p.multiboxonly)if(b)$(d).jqGrid(\"setSelection\",yb,!0,a);else{var g=d.p.frozenColumns?d.p.id+\"_frozen\":\"\";$(d.p.selarrrow).each(function(a,b){var c=$(d).jqGrid(\"getGridRowById\",b);c&&$(c).removeClass(n),$(\"#jqg_\"+$.jgrid.jqID(d.p.id)+\"_\"+$.jgrid.jqID(b))[d.p.useProp?\"prop\":\"attr\"](\"checked\",!1),g&&($(\"#\"+$.jgrid.jqID(b),\"#\"+$.jgrid.jqID(g)).removeClass(n),$(\"#jqg_\"+$.jgrid.jqID(d.p.id)+\"_\"+$.jgrid.jqID(b),\"#\"+$.jgrid.jqID(g))[d.p.useProp?\"prop\":\"attr\"](\"checked\",!1))}),d.p.selarrrow=[],$(d).jqGrid(\"setSelection\",yb,!0,a)}else $(d).jqGrid(\"setSelection\",yb,!0,a)}}).bind(\"reloadGrid\",function(a,b){if(d.p.treeGrid===!0&&(d.p.datatype=d.p.treedatatype),b=b||{},b.current&&d.grid.selectionPreserver(d),\"local\"===d.p.datatype?($(d).jqGrid(\"resetSelection\"),d.p.data.length&&(I(),J())):d.p.treeGrid||(d.p.selrow=null,d.p.multiselect&&(d.p.selarrrow=[],S(!1)),d.p.savedRow=[]),d.p.scroll&&H.call(d,!0,!1),b.page){var c=b.page;c>d.p.lastpage&&(c=d.p.lastpage),1>c&&(c=1),d.p.page=c,d.grid.bDiv.scrollTop=d.grid.prevRowHeight?(c-1)*d.grid.prevRowHeight*d.p.rowNum:0}return d.grid.prevRowHeight&&d.p.scroll&&void 0===b.page?(delete d.p.lastpage,d.grid.populateVisible()):d.grid.populate(),d.p.inlineNav===!0&&$(d).jqGrid(\"showAddEditButtons\"),!1}).dblclick(function(a){if(fb=a.target,gb=$(fb,d.rows).closest(\"tr.jqgrow\"),0!==$(gb).length){yb=gb[0].rowIndex,zb=$.jgrid.getCellIndex(fb);var b=$(d).triggerHandler(\"jqGridDblClickRow\",[$(gb).attr(\"id\"),yb,zb,a]);return null!=b?b:$.isFunction(d.p.ondblClickRow)&&(b=d.p.ondblClickRow.call(d,$(gb).attr(\"id\"),yb,zb,a),null!=b)?b:void 0}}).bind(\"contextmenu\",function(a){if(fb=a.target,gb=$(fb,d.rows).closest(\"tr.jqgrow\"),0!==$(gb).length){d.p.multiselect||$(d).jqGrid(\"setSelection\",gb[0].id,!0,a),yb=gb[0].rowIndex,zb=$.jgrid.getCellIndex(fb);var b=$(d).triggerHandler(\"jqGridRightClickRow\",[$(gb).attr(\"id\"),yb,zb,a]);return null!=b?b:$.isFunction(d.p.onRightClickRow)&&(b=d.p.onRightClickRow.call(d,$(gb).attr(\"id\"),yb,zb,a),null!=b)?b:void 0}}),e.bDiv=document.createElement(\"div\"),r&&\"auto\"===String(d.p.height).toLowerCase()&&(d.p.height=\"100%\"),$(e.bDiv).append($('<div style=\"position:relative;\"></div>').append(\"<div></div>\").append(this)).addClass(\"ui-jqgrid-bdiv\").css({height:d.p.height+(isNaN(d.p.height)?\"\":\"px\"),width:e.width+\"px\"}).scroll(e.scrollGrid),$(\"table:first\",e.bDiv).css({width:d.p.tblwidth+\"px\"}),$.support.tbody||2===$(\"tbody\",this).length&&$(\"tbody:gt(0)\",this).remove(),d.p.multikey&&($.jgrid.msie?$(e.bDiv).bind(\"selectstart\",function(){return!1}):$(e.bDiv).bind(\"mousedown\",function(){return!1})),wb&&$(e.bDiv).hide();var Bb=q+\" \"+k(l,\"icon_caption_open\",!0),Cb=q+\" \"+k(l,\"icon_caption_close\",!0);e.cDiv=document.createElement(\"div\");var Db=d.p.hidegrid===!0?$(\"<a role='link' class='ui-jqgrid-titlebar-close HeaderButton \"+p+\"' title='\"+($.jgrid.getRegional(d,\"defaults.showhide\",d.p.showhide)||\"\")+\"' />\").hover(function(){Db.addClass(o)},function(){Db.removeClass(o)}).append(\"<span class='ui-jqgrid-headlink \"+Bb+\"'></span>\").css(\"rtl\"===h?\"left\":\"right\",\"0px\"):\"\";if($(e.cDiv).append(Db).append(\"<span class='ui-jqgrid-title'>\"+d.p.caption+\"</span>\").addClass(\"ui-jqgrid-titlebar ui-jqgrid-caption\"+(\"rtl\"===h?\"-rtl\":\"\")+\" \"+k(l,\"gridtitleBox\",!0)),$(e.cDiv).insertBefore(e.hDiv),d.p.toolbar[0]){var Eb=k(l,\"customtoolbarBox\",!0,\"ui-userdata\");e.uDiv=document.createElement(\"div\"),\"top\"===d.p.toolbar[1]?$(e.uDiv).insertBefore(e.hDiv):\"bottom\"===d.p.toolbar[1]&&$(e.uDiv).insertAfter(e.hDiv),\"both\"===d.p.toolbar[1]?(e.ubDiv=document.createElement(\"div\"),$(e.uDiv).addClass(Eb+\" ui-userdata-top\").attr(\"id\",\"t_\"+this.id).insertBefore(e.hDiv).width(e.width),$(e.ubDiv).addClass(Eb+\" ui-userdata-bottom\").attr(\"id\",\"tb_\"+this.id).insertAfter(e.hDiv).width(e.width),wb&&$(e.ubDiv).hide()):$(e.uDiv).width(e.width).addClass(Eb+\" ui-userdata-top\").attr(\"id\",\"t_\"+this.id),wb&&$(e.uDiv).hide()}if(d.p.toppager&&(d.p.toppager=$.jgrid.jqID(d.p.id)+\"_toppager\",e.topDiv=$(\"<div id='\"+d.p.toppager+\"'></div>\")[0],d.p.toppager=\"#\"+d.p.toppager,$(e.topDiv).addClass(k(l,\"toppagerBox\",!0,\"ui-jqgrid-toppager\")).width(e.width).insertBefore(e.hDiv),T(d.p.toppager,\"_t\")),d.p.footerrow&&(e.sDiv=$(\"<div class='ui-jqgrid-sdiv'></div>\")[0],xb=$(\"<div class='ui-jqgrid-hbox\"+(\"rtl\"===h?\"-rtl\":\"\")+\"'></div>\"),$(e.sDiv).append(xb).width(e.width).insertAfter(e.hDiv),$(xb).append(rb),e.footers=$(\".ui-jqgrid-ftable\",e.sDiv)[0].rows[0].cells,d.p.rownumbers&&(e.footers[0].className=k(l,\"rownumBox\",!0,\"jqgrid-rownum\")),wb&&$(e.sDiv).hide()),xb=null,d.p.caption){var Fb=d.p.datatype;d.p.hidegrid===!0&&($(\".ui-jqgrid-titlebar-close\",e.cDiv).click(function(a){var b,c=$.isFunction(d.p.onHeaderClick),f=\".ui-jqgrid-bdiv, .ui-jqgrid-hdiv, .ui-jqgrid-toppager, .ui-jqgrid-pager, .ui-jqgrid-sdiv\",g=this;return d.p.toolbar[0]===!0&&(\"both\"===d.p.toolbar[1]&&(f+=\", #\"+$(e.ubDiv).attr(\"id\")),f+=\", #\"+$(e.uDiv).attr(\"id\")),b=$(f,\"#gview_\"+$.jgrid.jqID(d.p.id)).length,\"visible\"===d.p.gridstate?$(f,\"#gbox_\"+$.jgrid.jqID(d.p.id)).slideUp(\"fast\",function(){b--,0===b&&($(\"span\",g).removeClass(Bb).addClass(Cb),d.p.gridstate=\"hidden\",$(\"#gbox_\"+$.jgrid.jqID(d.p.id)).hasClass(\"ui-resizable\")&&$(\".ui-resizable-handle\",\"#gbox_\"+$.jgrid.jqID(d.p.id)).hide(),$(d).triggerHandler(\"jqGridHeaderClick\",[d.p.gridstate,a]),c&&(wb||d.p.onHeaderClick.call(d,d.p.gridstate,a)))}):\"hidden\"===d.p.gridstate&&$(f,\"#gbox_\"+$.jgrid.jqID(d.p.id)).slideDown(\"fast\",function(){b--,0===b&&($(\"span\",g).removeClass(Cb).addClass(Bb),wb&&(d.p.datatype=Fb,R(),wb=!1),d.p.gridstate=\"visible\",$(\"#gbox_\"+$.jgrid.jqID(d.p.id)).hasClass(\"ui-resizable\")&&$(\".ui-resizable-handle\",\"#gbox_\"+$.jgrid.jqID(d.p.id)).show(),$(d).triggerHandler(\"jqGridHeaderClick\",[d.p.gridstate,a]),c&&(wb||d.p.onHeaderClick.call(d,d.p.gridstate,a)))}),!1}),wb&&(d.p.datatype=\"local\",$(\".ui-jqgrid-titlebar-close\",e.cDiv).trigger(\"click\")))}else $(e.cDiv).hide(),d.p.toppager||$(e.hDiv).addClass(k(d.p.styleUI+\".common\",\"cornertop\",!0));if($(e.hDiv).after(e.bDiv).mousemove(function(a){return e.resizing?(e.dragMove(a),!1):void 0}),$(\".ui-jqgrid-labels\",e.hDiv).bind(\"selectstart\",function(){return!1}),$(document).bind(\"mouseup.jqGrid\"+d.p.id,function(){return e.resizing?(e.dragEnd(!0),!1):!0}),d.formatCol=z,d.sortData=V,d.updatepager=O,d.refreshIndex=J,d.setHeadCheckBox=S,d.constructTr=K,d.formatter=function(a,b,c,d,e){return B(a,b,c,d,e)},$.extend(e,{populate:R,emptyRows:H,beginReq:P,endReq:Q}),this.grid=e,d.addXmlData=function(a){L(a)},d.addJSONData=function(a){M(a)},this.grid.cols=this.rows[0].cells,$(d).triggerHandler(\"jqGridInitGrid\"),$.isFunction(d.p.onInitGrid)&&d.p.onInitGrid.call(d),R(),d.p.hiddengrid=!1,d.p.responsive){var Gb=\"onorientationchange\"in window,Hb=Gb?\"orientationchange\":\"resize\";$(window).on(Hb,function(){$(d).jqGrid(\"resizeGrid\")})}}})},$.jgrid.extend({getGridParam:function(a,b){var c,d=this[0];if(d&&d.grid){if(void 0===b&&\"string\"!=typeof b&&(b=\"jqGrid\"),c=d.p,\"jqGrid\"!==b)try{c=$(d).data(b)}catch(e){c=d.p}return a?void 0!==c[a]?c[a]:null:c}},setGridParam:function(a,b){return this.each(function(){if(null==b&&(b=!1),this.grid&&\"object\"==typeof a)if(b===!0){var c=$.extend({},this.p,a);this.p=c}else $.extend(!0,this.p,a)})},getGridRowById:function(a){var b;return this.each(function(){try{for(var c=this.rows.length;c--;)if(a.toString()===this.rows[c].id){b=this.rows[c];break}}catch(d){b=$(this.grid.bDiv).find(\"#\"+$.jgrid.jqID(a))}}),b},getDataIDs:function(){var a,b=[],c=0,d=0;return this.each(function(){if(a=this.rows.length,a&&a>0)for(;a>c;)$(this.rows[c]).hasClass(\"jqgrow\")&&(b[d]=this.rows[c].id,d++),c++}),b},setSelection:function(a,b,c){return this.each(function(){function d(a){var b=$(l.grid.bDiv)[0].clientHeight,c=$(l.grid.bDiv)[0].scrollTop,d=$(l.rows[a]).position().top,e=l.rows[a].clientHeight;d+e>=b+c?$(l.grid.bDiv)[0].scrollTop=d-(b+c)+e+c:b+c>d&&c>d&&($(l.grid.bDiv)[0].scrollTop=d)}var e,f,g,h,i,j,k,l=this,m=$.jgrid.getMethod(\"getStyleUI\"),n=m(l.p.styleUI+\".common\",\"highlight\",!0),o=m(l.p.styleUI+\".common\",\"disabled\",!0);void 0!==a&&(b=b===!1?!1:!0,f=$(l).jqGrid(\"getGridRowById\",a),!f||!f.className||f.className.indexOf(o)>-1||(l.p.scrollrows===!0&&(g=$(l).jqGrid(\"getGridRowById\",a).rowIndex,g>=0&&d(g)),l.p.frozenColumns===!0&&(j=l.p.id+\"_frozen\"),l.p.multiselect?(l.setHeadCheckBox(!1),l.p.selrow=f.id,h=$.inArray(l.p.selrow,l.p.selarrrow),-1===h?(\"ui-subgrid\"!==f.className&&$(f).addClass(n).attr(\"aria-selected\",\"true\"),e=!0,l.p.selarrrow.push(l.p.selrow)):(\"ui-subgrid\"!==f.className&&$(f).removeClass(n).attr(\"aria-selected\",\"false\"),e=!1,l.p.selarrrow.splice(h,1),i=l.p.selarrrow[0],l.p.selrow=void 0===i?null:i),$(\"#jqg_\"+$.jgrid.jqID(l.p.id)+\"_\"+$.jgrid.jqID(f.id))[l.p.useProp?\"prop\":\"attr\"](\"checked\",e),j&&(-1===h?$(\"#\"+$.jgrid.jqID(a),\"#\"+$.jgrid.jqID(j)).addClass(n):$(\"#\"+$.jgrid.jqID(a),\"#\"+$.jgrid.jqID(j)).removeClass(n),$(\"#jqg_\"+$.jgrid.jqID(l.p.id)+\"_\"+$.jgrid.jqID(a),\"#\"+$.jgrid.jqID(j))[l.p.useProp?\"prop\":\"attr\"](\"checked\",e)),b&&($(l).triggerHandler(\"jqGridSelectRow\",[f.id,e,c]),l.p.onSelectRow&&l.p.onSelectRow.call(l,f.id,e,c))):\"ui-subgrid\"!==f.className&&(l.p.selrow!==f.id?(k=$(l).jqGrid(\"getGridRowById\",l.p.selrow),k&&$(k).removeClass(n).attr({\"aria-selected\":\"false\",tabindex:\"-1\"}),$(f).addClass(n).attr({\"aria-selected\":\"true\",tabindex:\"0\"}),j&&($(\"#\"+$.jgrid.jqID(l.p.selrow),\"#\"+$.jgrid.jqID(j)).removeClass(n),$(\"#\"+$.jgrid.jqID(a),\"#\"+$.jgrid.jqID(j)).addClass(n)),e=!0):e=!1,l.p.selrow=f.id,b&&($(l).triggerHandler(\"jqGridSelectRow\",[f.id,e,c]),l.p.onSelectRow&&l.p.onSelectRow.call(l,f.id,e,c)))))})},resetSelection:function(a){return this.each(function(){var b,c,d=this,e=$.jgrid.getMethod(\"getStyleUI\"),f=e(d.p.styleUI+\".common\",\"highlight\",!0),g=e(d.p.styleUI+\".common\",\"hover\",!0);if(d.p.frozenColumns===!0&&(c=d.p.id+\"_frozen\"),void 0!==a){if(b=a===d.p.selrow?d.p.selrow:a,$(\"#\"+$.jgrid.jqID(d.p.id)+\" tbody:first tr#\"+$.jgrid.jqID(b)).removeClass(f).attr(\"aria-selected\",\"false\"),c&&$(\"#\"+$.jgrid.jqID(b),\"#\"+$.jgrid.jqID(c)).removeClass(f),d.p.multiselect){$(\"#jqg_\"+$.jgrid.jqID(d.p.id)+\"_\"+$.jgrid.jqID(b),\"#\"+$.jgrid.jqID(d.p.id))[d.p.useProp?\"prop\":\"attr\"](\"checked\",!1),c&&$(\"#jqg_\"+$.jgrid.jqID(d.p.id)+\"_\"+$.jgrid.jqID(b),\"#\"+$.jgrid.jqID(c))[d.p.useProp?\"prop\":\"attr\"](\"checked\",!1),d.setHeadCheckBox(!1);var h=$.inArray($.jgrid.jqID(b),d.p.selarrrow);-1!==h&&d.p.selarrrow.splice(h,1)}d.p.onUnSelectRow&&d.p.onUnSelectRow.call(d,b),b=null}else d.p.multiselect?($(d.p.selarrrow).each(function(a,b){$($(d).jqGrid(\"getGridRowById\",b)).removeClass(f).attr(\"aria-selected\",\"false\"),$(\"#jqg_\"+$.jgrid.jqID(d.p.id)+\"_\"+$.jgrid.jqID(b))[d.p.useProp?\"prop\":\"attr\"](\"checked\",!1),c&&($(\"#\"+$.jgrid.jqID(b),\"#\"+$.jgrid.jqID(c)).removeClass(f),$(\"#jqg_\"+$.jgrid.jqID(d.p.id)+\"_\"+$.jgrid.jqID(b),\"#\"+$.jgrid.jqID(c))[d.p.useProp?\"prop\":\"attr\"](\"checked\",!1)),d.p.onUnSelectRow&&d.p.onUnSelectRow.call(d,b)}),d.setHeadCheckBox(!1),d.p.selarrrow=[],d.p.selrow=null):d.p.selrow&&($(\"#\"+$.jgrid.jqID(d.p.id)+\" tbody:first tr#\"+$.jgrid.jqID(d.p.selrow)).removeClass(f).attr(\"aria-selected\",\"false\"),c&&$(\"#\"+$.jgrid.jqID(d.p.selrow),\"#\"+$.jgrid.jqID(c)).removeClass(f),d.p.onUnSelectRow&&d.p.onUnSelectRow.call(d,d.p.selrow),d.p.selrow=null);d.p.cellEdit===!0&&parseInt(d.p.iCol,10)>=0&&parseInt(d.p.iRow,10)>=0&&($(\"td:eq(\"+d.p.iCol+\")\",d.rows[d.p.iRow]).removeClass(\"edit-cell \"+f),$(d.rows[d.p.iRow]).removeClass(\"selected-row \"+g)),d.p.savedRow=[]})},getRowData:function(a,b){var c,d,e={},f=!1,g=0;return this.each(function(){var h,i,j=this;if(null==a)f=!0,c=[],d=j.rows.length;else{if(i=$(j).jqGrid(\"getGridRowById\",a),!i)return e;d=2}for(b&&b===!0&&j.p.data.length>0||(b=!1);d>g;)f&&(i=j.rows[g]),$(i).hasClass(\"jqgrow\")&&(b?e=j.p.data[j.p._index[i.id]]:$('td[role=\"gridcell\"]',i).each(function(a){if(h=j.p.colModel[a].name,\"cb\"!==h&&\"subgrid\"!==h&&\"rn\"!==h)if(j.p.treeGrid===!0&&h===j.p.ExpandColumn)e[h]=$.jgrid.htmlDecode($(\"span:first\",this).html());else try{e[h]=$.unformat.call(j,this,{rowId:i.id,colModel:j.p.colModel[a]},a)}catch(b){e[h]=$.jgrid.htmlDecode($(this).html())}}),f&&(c.push(e),e={})),g++}),c||e},delRowData:function(a){var b,c,d,e=!1;return this.each(function(){var f=this;if(b=$(f).jqGrid(\"getGridRowById\",a),!b)return!1;if(f.p.subGrid&&(d=$(b).next(),d.hasClass(\"ui-subgrid\")&&d.remove()),$(b).remove(),f.p.records--,f.p.reccount--,f.updatepager(!0,!1),e=!0,f.p.multiselect&&(c=$.inArray(a,f.p.selarrrow),-1!==c&&f.p.selarrrow.splice(c,1)),f.p.selrow=f.p.multiselect&&f.p.selarrrow.length>0?f.p.selarrrow[f.p.selarrrow.length-1]:null,\"local\"===f.p.datatype){var g=$.jgrid.stripPref(f.p.idPrefix,a),h=f.p._index[g];void 0!==h&&(f.p.data.splice(h,1),f.refreshIndex())}if(f.p.altRows===!0&&e){var i=f.p.altclass;$(f.rows).each(function(a){a%2===1?$(this).addClass(i):$(this).removeClass(i)})}}),e},setRowData:function(a,b,c){var d,e,f=!0;return this.each(function(){if(!this.grid)return!1;var g,h,i=this,j=typeof c,k={};if(h=$(this).jqGrid(\"getGridRowById\",a),!h)return!1;if(b)try{if($(this.p.colModel).each(function(c){d=this.name;var f=$.jgrid.getAccessor(b,d);void 0!==f&&(k[d]=this.formatter&&\"string\"==typeof this.formatter&&\"date\"===this.formatter?$.unformat.date.call(i,f,this):f,g=i.formatter(a,k[d],c,b,\"edit\"),e=this.title?{title:$.jgrid.stripHtml(g)}:{},i.p.treeGrid===!0&&d===i.p.ExpandColumn?$(\"td[role='gridcell']:eq(\"+c+\") > span:first\",h).html(g).attr(e):$(\"td[role='gridcell']:eq(\"+c+\")\",h).html(g).attr(e))}),\"local\"===i.p.datatype){var l,m=$.jgrid.stripPref(i.p.idPrefix,a),n=i.p._index[m];if(i.p.treeGrid)for(l in i.p.treeReader)i.p.treeReader.hasOwnProperty(l)&&delete k[i.p.treeReader[l]];void 0!==n&&(i.p.data[n]=$.extend(!0,i.p.data[n],k)),k=null}}catch(o){f=!1}f&&(\"string\"===j?$(h).addClass(c):null!==c&&\"object\"===j&&$(h).css(c),$(i).triggerHandler(\"jqGridAfterGridComplete\"))}),f},addRowData:function(a,b,c,d){-1==[\"first\",\"last\",\"before\",\"after\"].indexOf(c)&&(c=\"last\");var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s=!1,t=\"\",u=\"\",v=\"\";return b&&($.isArray(b)?(m=!0,n=a):(b=[b],m=!1),this.each(function(){var w=this,x=b.length;i=w.p.rownumbers===!0?1:0,g=w.p.multiselect===!0?1:0,h=w.p.subGrid===!0?1:0,m||(void 0!==a?a=String(a):(a=$.jgrid.randId(),w.p.keyName!==!1&&(n=w.p.keyName,void 0!==b[0][n]&&(a=b[0][n])))),o=w.p.altclass;var y,z=0,A=$(w).jqGrid(\"getStyleUI\",w.p.styleUI+\".base\",\"rowBox\",!0,\"jqgrow ui-row-\"+w.p.direction),B={},C=$.isFunction(w.p.afterInsertRow)?!0:!1;for(i&&(t=$(w).jqGrid(\"getStyleUI\",w.p.styleUI+\".base\",\"rownumBox\",!1,\"jqgrid-rownum\")),g&&(u=$(w).jqGrid(\"getStyleUI\",w.p.styleUI+\".base\",\"multiBox\",!1,\"cbox\"));x>z;){if(p=b[z],f=[],y=A,m){try{a=p[n],void 0===a&&(a=$.jgrid.randId())}catch(D){a=$.jgrid.randId()}y+=w.p.altRows===!0&&(w.rows.length-1)%2===0?\" \"+o:\"\"}for(r=a,a=w.p.idPrefix+a,i&&(v=w.formatCol(0,1,\"\",null,a,!0),f[f.length]='<td role=\"gridcell\" '+t+\" \"+v+\">0</td>\"),g&&(l='<input role=\"checkbox\" type=\"checkbox\" id=\"jqg_'+w.p.id+\"_\"+a+'\" '+u+\"/>\",v=w.formatCol(i,1,\"\",null,a,!0),f[f.length]='<td role=\"gridcell\" '+v+\">\"+l+\"</td>\"),h&&(f[f.length]=$(w).jqGrid(\"addSubGridCell\",g+i,1)),k=g+h+i;k<w.p.colModel.length;k++)q=w.p.colModel[k],e=q.name,B[e]=p[e],l=w.formatter(a,$.jgrid.getAccessor(p,e),k,p),v=w.formatCol(k,1,l,p,a,B),f[f.length]='<td role=\"gridcell\" '+v+\">\"+l+\"</td>\";if(f.unshift(w.constructTr(a,!1,y,B,p)),f[f.length]=\"</tr>\",0===w.rows.length)$(\"table:first\",w.grid.bDiv).append(f.join(\"\"));else switch(c){case\"last\":$(w.rows[w.rows.length-1]).after(f.join(\"\")),j=w.rows.length-1;break;case\"first\":$(w.rows[0]).after(f.join(\"\")),j=1;break;case\"after\":j=$(w).jqGrid(\"getGridRowById\",d),j&&($(w.rows[j.rowIndex+1]).hasClass(\"ui-subgrid\")?$(w.rows[j.rowIndex+1]).after(f):$(j).after(f.join(\"\")),j=j.rowIndex+1);break;case\"before\":j=$(w).jqGrid(\"getGridRowById\",d),j&&($(j).before(f.join(\"\")),j=j.rowIndex-1)}w.p.subGrid===!0&&$(w).jqGrid(\"addSubGrid\",g+i,j),w.p.records++,w.p.reccount++,$(w).triggerHandler(\"jqGridAfterInsertRow\",[a,p,p]),C&&w.p.afterInsertRow.call(w,a,p,p),z++,\"local\"===w.p.datatype&&(B[w.p.localReader.id]=r,w.p._index[r]=w.p.data.length,w.p.data.push(B),B={})}w.p.altRows!==!0||m||(\"last\"===c?(w.rows.length-1)%2===0&&$(w.rows[w.rows.length-1]).addClass(o):$(w.rows).each(function(a){a%2===0?$(this).addClass(o):$(this).removeClass(o)})),w.updatepager(!0,!0),s=!0})),s},footerData:function(a,b,c){function d(a){var b;for(b in a)if(a.hasOwnProperty(b))return!1;return!0}var e,f,g=!1,h={};return void 0===a&&(a=\"get\"),\"boolean\"!=typeof c&&(c=!0),a=a.toLowerCase(),this.each(function(){var i,j=this;return j.grid&&j.p.footerrow?\"set\"===a&&d(b)?!1:(g=!0,void $(this.p.colModel).each(function(d){e=this.name,\"set\"===a?void 0!==b[e]&&(i=c?j.formatter(\"\",b[e],d,b,\"edit\"):b[e],f=this.title?{title:$.jgrid.stripHtml(i)}:{},$(\"tr.footrow td:eq(\"+d+\")\",j.grid.sDiv).html(i).attr(f),g=!0):\"get\"===a&&(h[e]=$(\"tr.footrow td:eq(\"+d+\")\",j.grid.sDiv).html())})):!1}),\"get\"===a?h:g},showHideCol:function(a,b){return this.each(function(){var c,d=this,e=!1,f=$.jgrid.cell_width?0:d.p.cellLayout;if(d.grid){\"string\"==typeof a&&(a=[a]),b=\"none\"!==b?\"\":\"none\";var g=\"\"===b?!0:!1,h=d.p.groupHeader&&($.isArray(d.p.groupHeader)||$.isFunction(d.p.groupHeader));if(h&&$(d).jqGrid(\"destroyGroupHeader\",!1),$(this.p.colModel).each(function(h){if(-1!==$.inArray(this.name,a)&&this.hidden===g){if(d.p.frozenColumns===!0&&this.frozen===!0)return!0;$(\"tr[role=row]\",d.grid.hDiv).each(function(){$(this.cells[h]).css(\"display\",b)}),$(d.rows).each(function(){$(this).hasClass(\"jqgroup\")||$(this.cells[h]).css(\"display\",b)}),d.p.footerrow&&$(\"tr.footrow td:eq(\"+h+\")\",d.grid.sDiv).css(\"display\",b),c=parseInt(this.width,10),\"none\"===b?d.p.tblwidth-=c+f:d.p.tblwidth+=c+f,this.hidden=!g,e=!0,$(d).triggerHandler(\"jqGridShowHideCol\",[g,this.name,h])}}),e===!0&&(d.p.shrinkToFit!==!0||isNaN(d.p.height)||(d.p.tblwidth+=parseInt(d.p.scrollOffset,10)),$(d).jqGrid(\"setGridWidth\",d.p.shrinkToFit===!0?d.p.tblwidth:d.p.width)),h){var i=$.extend([],d.p.groupHeader);d.p.groupHeader=null;for(var j=0;j<i.length;j++)$(d).jqGrid(\"setGroupHeaders\",i[j])}}})},hideCol:function(a){return this.each(function(){$(this).jqGrid(\"showHideCol\",a,\"none\")})},showCol:function(a){return this.each(function(){$(this).jqGrid(\"showHideCol\",a,\"\")})},remapColumns:function(a,b,c){function d(b){var c;c=b.length?$.makeArray(b):$.extend({},b),$.each(a,function(a){b[a]=c[this]})}function e(b,c){$(\">tr\"+(c||\"\"),b).each(function(){var b=this,c=$.makeArray(b.cells);$.each(a,function(){var a=c[this];a&&b.appendChild(a)})})}var f=this.get(0);d(f.p.colModel),d(f.p.colNames),d(f.grid.headers),e($(\"thead:first\",f.grid.hDiv),c&&\":not(.ui-jqgrid-labels)\"),b&&e($(\"#\"+$.jgrid.jqID(f.p.id)+\" tbody:first\"),\".jqgfirstrow, tr.jqgrow, tr.jqfoot\"),f.p.footerrow&&e($(\"tbody:first\",f.grid.sDiv)),f.p.remapColumns&&(f.p.remapColumns.length?d(f.p.remapColumns):f.p.remapColumns=$.makeArray(a)),f.p.lastsort=$.inArray(f.p.lastsort,a),f.p.treeGrid&&(f.p.expColInd=$.inArray(f.p.expColInd,a)),$(f).triggerHandler(\"jqGridRemapColumns\",[a,b,c])},setGridWidth:function(a,b){return this.each(function(){if(this.grid){var c,d,e,f,g=this,h=0,i=$.jgrid.cell_width?0:g.p.cellLayout,j=0,k=!1,l=g.p.scrollOffset,m=0;if(\"boolean\"!=typeof b&&(b=g.p.shrinkToFit),!isNaN(a)){if(a=parseInt(a,10),g.grid.width=g.p.width=a,$(\"#gbox_\"+$.jgrid.jqID(g.p.id)).css(\"width\",a+\"px\"),$(\"#gview_\"+$.jgrid.jqID(g.p.id)).css(\"width\",a+\"px\"),$(g.grid.bDiv).css(\"width\",a+\"px\"),$(g.grid.hDiv).css(\"width\",a+\"px\"),g.p.pager&&$(g.p.pager).css(\"width\",a+\"px\"),g.p.toppager&&$(g.p.toppager).css(\"width\",a+\"px\"),g.p.toolbar[0]===!0&&($(g.grid.uDiv).css(\"width\",a+\"px\"),\"both\"===g.p.toolbar[1]&&$(g.grid.ubDiv).css(\"width\",a+\"px\")),g.p.footerrow&&$(g.grid.sDiv).css(\"width\",a+\"px\"),b===!1&&g.p.forceFit===!0&&(g.p.forceFit=!1),b===!0){if($.each(g.p.colModel,function(){this.hidden===!1&&(c=this.widthOrg,h+=c+i,this.fixed?m+=c+i:j++)}),0===j)return;g.p.tblwidth=h,e=a-i*j-m,isNaN(g.p.height)||($(g.grid.bDiv)[0].clientHeight<$(g.grid.bDiv)[0].scrollHeight||1===g.rows.length)&&(k=!0,e-=l),h=0;var n=g.grid.cols.length>0;if($.each(g.p.colModel,function(a){if(this.hidden===!1&&!this.fixed){if(c=this.widthOrg,c=Math.round(e*c/(g.p.tblwidth-i*j-m)),0>c)return;this.width=c,h+=c,g.grid.headers[a].width=c,g.grid.headers[a].el.style.width=c+\"px\",g.p.footerrow&&(g.grid.footers[a].style.width=c+\"px\"),n&&(g.grid.cols[a].style.width=c+\"px\"),d=a}}),!d)return;if(f=0,k?a-m-(h+i*j)!==l&&(f=a-m-(h+i*j)-l):1!==Math.abs(a-m-(h+i*j))&&(f=a-m-(h+i*j)),g.p.colModel[d].width+=f,g.p.tblwidth=h+f+i*j+m,g.p.tblwidth>a){var o=g.p.tblwidth-parseInt(a,10);g.p.tblwidth=a,c=g.p.colModel[d].width=g.p.colModel[d].width-o}else c=g.p.colModel[d].width;g.grid.headers[d].width=c,g.grid.headers[d].el.style.width=c+\"px\",n&&(g.grid.cols[d].style.width=c+\"px\"),g.p.footerrow&&(g.grid.footers[d].style.width=c+\"px\")}g.p.tblwidth&&($(\"table:first\",g.grid.bDiv).css(\"width\",g.p.tblwidth+\"px\"),$(\"table:first\",g.grid.hDiv).css(\"width\",g.p.tblwidth+\"px\"),g.grid.hDiv.scrollLeft=g.grid.bDiv.scrollLeft,g.p.footerrow&&$(\"table:first\",g.grid.sDiv).css(\"width\",g.p.tblwidth+\"px\"))}}})},setGridHeight:function(a){return this.each(function(){var b=this;if(b.grid){var c=$(b.grid.bDiv);c.css({height:a+(isNaN(a)?\"\":\"px\")}),b.p.frozenColumns===!0&&$(\"#\"+$.jgrid.jqID(b.p.id)+\"_frozen\").parent().height(c.height()-16),b.p.height=a,b.p.scroll&&b.grid.populateVisible()}})},setCaption:function(a){return this.each(function(){var b=$(this).jqGrid(\"getStyleUI\",this.p.styleUI+\".common\",\"cornertop\",!0);this.p.caption=a,$(\".ui-jqgrid-title, .ui-jqgrid-title-rtl\",this.grid.cDiv).html(a),$(this.grid.cDiv).show(),$(this.grid.hDiv).removeClass(b)})},setLabel:function(a,b,c,d){return this.each(function(){var e=this,f=-1;if(e.grid&&void 0!==a&&($(e.p.colModel).each(function(b){return this.name===a?(f=b,!1):void 0}),f>=0)){var g=$(\"tr.ui-jqgrid-labels th:eq(\"+f+\")\",e.grid.hDiv);if(b){var h=$(\".s-ico\",g);$(\"[id^=jqgh_]\",g).empty().html(b).append(h),e.p.colNames[f]=b}c&&(\"string\"==typeof c?$(g).addClass(c):$(g).css(c)),\"object\"==typeof d&&$(g).attr(d)}})},setCell:function(a,b,c,d,e,f){return this.each(function(){var g,h,i=this,j=-1;if(i.grid&&(isNaN(b)?$(i.p.colModel).each(function(a){return this.name===b?(j=a,!1):void 0}):j=parseInt(b,10),j>=0)){var k=$(i).jqGrid(\"getGridRowById\",a);if(k){var l=$(\"td:eq(\"+j+\")\",k),m=0,n=[];if(\"\"!==c||f===!0){if(void 0!==k.cells)for(;m<k.cells.length;)n.push(k.cells[m].innerHTML),m++;if(g=i.formatter(a,c,j,n,\"edit\"),h=i.p.colModel[j].title?{title:$.jgrid.stripHtml(g)}:{},i.p.treeGrid&&$(\".tree-wrap\",$(l)).length>0?$(\"span\",$(l)).html(g).attr(h):$(l).html(g).attr(h),\"local\"===i.p.datatype){var o,p=i.p.colModel[j];c=p.formatter&&\"string\"==typeof p.formatter&&\"date\"===p.formatter?$.unformat.date.call(i,c,p):c,o=i.p._index[$.jgrid.stripPref(i.p.idPrefix,a)],void 0!==o&&(i.p.data[o][p.name]=c)}}\"string\"==typeof d?$(l).addClass(d):d&&$(l).css(d),\"object\"==typeof e&&$(l).attr(e)}}})},getCell:function(a,b){var c=!1;return this.each(function(){var d=this,e=-1;if(d.grid&&(isNaN(b)?$(d.p.colModel).each(function(a){return this.name===b?(e=a,!1):void 0}):e=parseInt(b,10),e>=0)){var f=$(d).jqGrid(\"getGridRowById\",a);if(f)try{c=$.unformat.call(d,$(\"td:eq(\"+e+\")\",f),{rowId:f.id,colModel:d.p.colModel[e]},e)}catch(g){c=$.jgrid.htmlDecode($(\"td:eq(\"+e+\")\",f).html())}}}),c},getCol:function(a,b,c){var d,e,f,g,h=[],i=0;return b=\"boolean\"!=typeof b?!1:b,void 0===c&&(c=!1),this.each(function(){var j=this,k=-1;if(j.grid&&(isNaN(a)?$(j.p.colModel).each(function(b){return this.name===a?(k=b,!1):void 0}):k=parseInt(a,10),k>=0)){var l=j.rows.length,m=0,n=0;if(l&&l>0){for(;l>m;){if($(j.rows[m]).hasClass(\"jqgrow\")){try{d=$.unformat.call(j,$(j.rows[m].cells[k]),{rowId:j.rows[m].id,colModel:j.p.colModel[k]},k)}catch(o){d=$.jgrid.htmlDecode(j.rows[m].cells[k].innerHTML)}c?(g=parseFloat(d),isNaN(g)||(i+=g,void 0===f&&(f=e=g),e=Math.min(e,g),f=Math.max(f,g),n++)):h.push(b?{id:j.rows[m].id,value:d}:d)}m++}if(c)switch(c.toLowerCase()){case\"sum\":h=i;break;case\"avg\":h=i/n;break;case\"count\":h=l-1;break;case\"min\":h=e;break;case\"max\":h=f}}}}),h},clearGridData:function(a){return this.each(function(){var b=this;if(b.grid){if(\"boolean\"!=typeof a&&(a=!1),b.p.deepempty)$(\"#\"+$.jgrid.jqID(b.p.id)+\" tbody:first tr:gt(0)\").remove();else{var c=$(\"#\"+$.jgrid.jqID(b.p.id)+\" tbody:first tr:first\")[0];$(\"#\"+$.jgrid.jqID(b.p.id)+\" tbody:first\").empty().append(c)}b.p.footerrow&&a&&$(\".ui-jqgrid-ftable td\",b.grid.sDiv).html(\"&#160;\"),b.p.selrow=null,b.p.selarrrow=[],b.p.savedRow=[],b.p.records=0,b.p.page=1,b.p.lastpage=0,b.p.reccount=0,b.p.data=[],b.p._index={},b.updatepager(!0,!1)}})},getInd:function(a,b){var c,d=!1;\nreturn this.each(function(){c=$(this).jqGrid(\"getGridRowById\",a),c&&(d=b===!0?c:c.rowIndex)}),d},bindKeys:function(a){var b=$.extend({onEnter:null,onSpace:null,onLeftKey:null,onRightKey:null,scrollingRows:!0},a||{});return this.each(function(){var a=this;$(\"body\").is(\"[role]\")||$(\"body\").attr(\"role\",\"application\"),a.p.scrollrows=b.scrollingRows,$(a).keydown(function(c){var d,e,f,g=$(a).find(\"tr[tabindex=0]\")[0],h=a.p.treeReader.expanded_field;if(g)if(f=a.p._index[$.jgrid.stripPref(a.p.idPrefix,g.id)],37===c.keyCode||38===c.keyCode||39===c.keyCode||40===c.keyCode){if(38===c.keyCode){if(e=g.previousSibling,d=\"\",e)if($(e).is(\":hidden\")){for(;e;)if(e=e.previousSibling,!$(e).is(\":hidden\")&&$(e).hasClass(\"jqgrow\")){d=e.id;break}}else d=e.id;$(a).jqGrid(\"setSelection\",d,!0,c),c.preventDefault()}if(40===c.keyCode){if(e=g.nextSibling,d=\"\",e)if($(e).is(\":hidden\")){for(;e;)if(e=e.nextSibling,!$(e).is(\":hidden\")&&$(e).hasClass(\"jqgrow\")){d=e.id;break}}else d=e.id;$(a).jqGrid(\"setSelection\",d,!0,c),c.preventDefault()}37===c.keyCode&&(a.p.treeGrid&&a.p.data[f][h]&&$(g).find(\"div.treeclick\").trigger(\"click\"),$(a).triggerHandler(\"jqGridKeyLeft\",[a.p.selrow]),$.isFunction(b.onLeftKey)&&b.onLeftKey.call(a,a.p.selrow)),39===c.keyCode&&(a.p.treeGrid&&!a.p.data[f][h]&&$(g).find(\"div.treeclick\").trigger(\"click\"),$(a).triggerHandler(\"jqGridKeyRight\",[a.p.selrow]),$.isFunction(b.onRightKey)&&b.onRightKey.call(a,a.p.selrow))}else 13===c.keyCode?($(a).triggerHandler(\"jqGridKeyEnter\",[a.p.selrow]),$.isFunction(b.onEnter)&&b.onEnter.call(a,a.p.selrow)):32===c.keyCode&&($(a).triggerHandler(\"jqGridKeySpace\",[a.p.selrow]),$.isFunction(b.onSpace)&&b.onSpace.call(a,a.p.selrow))})})},unbindKeys:function(){return this.each(function(){$(this).unbind(\"keydown\")})},getLocalRow:function(a){var b,c=!1;return this.each(function(){void 0!==a&&(b=this.p._index[$.jgrid.stripPref(this.p.idPrefix,a)],b>=0&&(c=this.p.data[b]))}),c},progressBar:function(a){return a=$.extend({htmlcontent:\"\",method:\"hide\",loadtype:\"disable\"},a||{}),this.each(function(){var b,c,d=\"show\"===a.method?!0:!1,e=$(\"#load_\"+$.jgrid.jqID(this.p.id)),f=$(window).scrollTop();switch(\"\"!==a.htmlcontent&&e.html(a.htmlcontent),a.loadtype){case\"disable\":break;case\"enable\":e.toggle(d);break;case\"block\":$(\"#lui_\"+$.jgrid.jqID(this.p.id)).toggle(d),e.toggle(d)}e.is(\":visible\")&&(b=e.offsetParent(),e.css(\"top\",\"\"),e.offset().top<f&&(c=Math.min(10+f-b.offset().top,b.height()-e.height()),e.css(\"top\",c+\"px\")))})},getColProp:function(a){var b={},c=this[0];if(!c.grid)return!1;var d,e=c.p.colModel;for(d=0;d<e.length;d++)if(e[d].name===a){b=e[d];break}return b},setColProp:function(a,b){return this.each(function(){if(this.grid&&b){var c,d=this.p.colModel;for(c=0;c<d.length;c++)if(d[c].name===a){$.extend(!0,this.p.colModel[c],b);break}}})},sortGrid:function(a,b,c){return this.each(function(){var d,e=this,f=-1,g=!1;if(e.grid){for(a||(a=e.p.sortname),d=0;d<e.p.colModel.length;d++)if(e.p.colModel[d].index===a||e.p.colModel[d].name===a){f=d,e.p.frozenColumns===!0&&e.p.colModel[d].frozen===!0&&(g=e.grid.fhDiv.find(\"#\"+e.p.id+\"_\"+a));break}if(-1!==f){var h=e.p.colModel[f].sortable;g||(g=e.grid.headers[f].el),\"boolean\"!=typeof h&&(h=!0),\"boolean\"!=typeof b&&(b=!1),h&&e.sortData(\"jqgh_\"+e.p.id+\"_\"+a,f,b,c,g)}}})},setGridState:function(a){return this.each(function(){if(this.grid){var b=this,c=$(this).jqGrid(\"getStyleUI\",this.p.styleUI+\".base\",\"icon_caption_open\",!0),d=$(this).jqGrid(\"getStyleUI\",this.p.styleUI+\".base\",\"icon_caption_close\",!0);\"hidden\"===a?($(\".ui-jqgrid-bdiv, .ui-jqgrid-hdiv\",\"#gview_\"+$.jgrid.jqID(b.p.id)).slideUp(\"fast\"),b.p.pager&&$(b.p.pager).slideUp(\"fast\"),b.p.toppager&&$(b.p.toppager).slideUp(\"fast\"),b.p.toolbar[0]===!0&&(\"both\"===b.p.toolbar[1]&&$(b.grid.ubDiv).slideUp(\"fast\"),$(b.grid.uDiv).slideUp(\"fast\")),b.p.footerrow&&$(\".ui-jqgrid-sdiv\",\"#gbox_\"+$.jgrid.jqID(b.p.id)).slideUp(\"fast\"),$(\".ui-jqgrid-headlink\",b.grid.cDiv).removeClass(c).addClass(d),b.p.gridstate=\"hidden\"):\"visible\"===a&&($(\".ui-jqgrid-hdiv, .ui-jqgrid-bdiv\",\"#gview_\"+$.jgrid.jqID(b.p.id)).slideDown(\"fast\"),b.p.pager&&$(b.p.pager).slideDown(\"fast\"),b.p.toppager&&$(b.p.toppager).slideDown(\"fast\"),b.p.toolbar[0]===!0&&(\"both\"===b.p.toolbar[1]&&$(b.grid.ubDiv).slideDown(\"fast\"),$(b.grid.uDiv).slideDown(\"fast\")),b.p.footerrow&&$(\".ui-jqgrid-sdiv\",\"#gbox_\"+$.jgrid.jqID(b.p.id)).slideDown(\"fast\"),$(\".ui-jqgrid-headlink\",b.grid.cDiv).removeClass(d).addClass(c),b.p.gridstate=\"visible\")}})},setFrozenColumns:function(){return this.each(function(){if(this.grid){var a=this,b=a.p.colModel,c=0,d=b.length,e=-1,f=!1,g=$(a).jqGrid(\"getStyleUI\",a.p.styleUI+\".base\",\"headerDiv\",!0,\"ui-jqgrid-hdiv\"),h=$(a).jqGrid(\"getStyleUI\",a.p.styleUI+\".common\",\"hover\",!0);if(a.p.subGrid!==!0&&a.p.treeGrid!==!0&&a.p.cellEdit!==!0&&!a.p.sortable&&!a.p.scroll){for(a.p.rownumbers&&c++,a.p.multiselect&&c++;d>c&&b[c].frozen===!0;)f=!0,e=c,c++;if(e>=0&&f){var i=a.p.caption?$(a.grid.cDiv).outerHeight():0,j=$(\".ui-jqgrid-htable\",\"#gview_\"+$.jgrid.jqID(a.p.id)).height();a.p.toppager&&(i+=$(a.grid.topDiv).outerHeight()),a.p.toolbar[0]===!0&&\"bottom\"!==a.p.toolbar[1]&&(i+=$(a.grid.uDiv).outerHeight()),a.grid.fhDiv=$('<div style=\"position:absolute;'+(\"rtl\"===a.p.direction?\"right:0;\":\"left:0;\")+\"top:\"+i+\"px;height:\"+j+'px;\" class=\"frozen-div '+g+'\"></div>'),a.grid.fbDiv=$('<div style=\"position:absolute;'+(\"rtl\"===a.p.direction?\"right:0;\":\"left:0;\")+\"top:\"+(parseInt(i,10)+parseInt(j,10)+1)+'px;overflow-y:hidden\" class=\"frozen-bdiv ui-jqgrid-bdiv\"></div>'),$(\"#gview_\"+$.jgrid.jqID(a.p.id)).append(a.grid.fhDiv);var k=$(\".ui-jqgrid-htable\",\"#gview_\"+$.jgrid.jqID(a.p.id)).clone(!0);if(a.p.groupHeader){$(\"tr.jqg-first-row-header, tr.jqg-third-row-header\",k).each(function(){$(\"th:gt(\"+e+\")\",this).remove()});var l,m,n=-1,o=-1;$(\"tr.jqg-second-row-header th\",k).each(function(){return l=parseInt($(this).attr(\"colspan\"),10),m=parseInt($(this).attr(\"rowspan\"),10),m&&(n++,o++),l&&(n+=l,o++),n===e?(o=e,!1):void 0}),n!==e&&(o=e),$(\"tr.jqg-second-row-header\",k).each(function(){$(\"th:gt(\"+o+\")\",this).remove()})}else $(\"tr\",k).each(function(){$(\"th:gt(\"+e+\")\",this).remove()});if($(k).width(1),$(a.grid.fhDiv).append(k).mousemove(function(b){return a.grid.resizing?(a.grid.dragMove(b),!1):void 0}),a.p.footerrow){var p=$(\".ui-jqgrid-bdiv\",\"#gview_\"+$.jgrid.jqID(a.p.id)).height();a.grid.fsDiv=$('<div style=\"position:absolute;left:0px;top:'+(parseInt(i,10)+parseInt(j,10)+parseInt(p,10)+1)+'px;\" class=\"frozen-sdiv ui-jqgrid-sdiv\"></div>'),$(\"#gview_\"+$.jgrid.jqID(a.p.id)).append(a.grid.fsDiv);var q=$(\".ui-jqgrid-ftable\",\"#gview_\"+$.jgrid.jqID(a.p.id)).clone(!0);$(\"tr\",q).each(function(){$(\"td:gt(\"+e+\")\",this).remove()}),$(q).width(1),$(a.grid.fsDiv).append(q)}$(a).bind(\"jqGridResizeStop.setFrozenColumns\",function(b,c,d){var e=$(\".ui-jqgrid-htable\",a.grid.fhDiv);$(\"th:eq(\"+d+\")\",e).width(c);var f=$(\".ui-jqgrid-btable\",a.grid.fbDiv);if($(\"tr:first td:eq(\"+d+\")\",f).width(c),a.p.footerrow){var g=$(\".ui-jqgrid-ftable\",a.grid.fsDiv);$(\"tr:first td:eq(\"+d+\")\",g).width(c)}}),$(\"#gview_\"+$.jgrid.jqID(a.p.id)).append(a.grid.fbDiv),$(a.grid.fbDiv).bind(\"mousewheel DOMMouseScroll\",function(b){var c=$(a.grid.bDiv).scrollTop();$(a.grid.bDiv).scrollTop(b.originalEvent.wheelDelta>0||b.originalEvent.detail<0?c-25:c+25),b.preventDefault()}),a.p.hoverrows===!0&&$(\"#\"+$.jgrid.jqID(a.p.id)).unbind(\"mouseover\").unbind(\"mouseout\"),$(a).bind(\"jqGridAfterGridComplete.setFrozenColumns\",function(){$(\"#\"+$.jgrid.jqID(a.p.id)+\"_frozen\").remove(),$(a.grid.fbDiv).height($(a.grid.bDiv).height()-16);var b=$(\"#\"+$.jgrid.jqID(a.p.id)).clone(!0);$(\"tr[role=row]\",b).each(function(){$(\"td[role=gridcell]:gt(\"+e+\")\",this).remove()}),$(b).width(1).attr(\"id\",a.p.id+\"_frozen\"),$(a.grid.fbDiv).append(b),a.p.hoverrows===!0&&($(\"tr.jqgrow\",b).hover(function(){$(this).addClass(h),$(\"#\"+$.jgrid.jqID(this.id),\"#\"+$.jgrid.jqID(a.p.id)).addClass(h)},function(){$(this).removeClass(h),$(\"#\"+$.jgrid.jqID(this.id),\"#\"+$.jgrid.jqID(a.p.id)).removeClass(h)}),$(\"tr.jqgrow\",\"#\"+$.jgrid.jqID(a.p.id)).hover(function(){$(this).addClass(h),$(\"#\"+$.jgrid.jqID(this.id),\"#\"+$.jgrid.jqID(a.p.id)+\"_frozen\").addClass(h)},function(){$(this).removeClass(h),$(\"#\"+$.jgrid.jqID(this.id),\"#\"+$.jgrid.jqID(a.p.id)+\"_frozen\").removeClass(h)})),b=null}),a.grid.hDiv.loading||$(a).triggerHandler(\"jqGridAfterGridComplete\"),a.p.frozenColumns=!0}}}})},destroyFrozenColumns:function(){return this.each(function(){if(this.grid&&this.p.frozenColumns===!0){var a=this,b=$(a).jqGrid(\"getStyleUI\",a.p.styleUI+\".common\",\"hover\",!0);if($(a.grid.fhDiv).remove(),$(a.grid.fbDiv).remove(),a.grid.fhDiv=null,a.grid.fbDiv=null,a.p.footerrow&&($(a.grid.fsDiv).remove(),a.grid.fsDiv=null),$(this).unbind(\".setFrozenColumns\"),a.p.hoverrows===!0){var c;$(\"#\"+$.jgrid.jqID(a.p.id)).bind(\"mouseover\",function(a){c=$(a.target).closest(\"tr.jqgrow\"),\"ui-subgrid\"!==$(c).attr(\"class\")&&$(c).addClass(b)}).bind(\"mouseout\",function(a){c=$(a.target).closest(\"tr.jqgrow\"),$(c).removeClass(b)})}this.p.frozenColumns=!1}})},resizeColumn:function(a,b){return this.each(function(){var c,d,e,f=this.grid,g=this.p,h=g.colModel,i=h.length;if(\"string\"==typeof a){for(c=0;i>c;c++)if(h[c].name===a){a=c;break}}else a=parseInt(a,10);if(b=parseInt(b,10),!(\"number\"!=typeof a||0>a||a>h.length-1||\"number\"!=typeof b||b<g.minColWidth)){if(g.forceFit)for(g.nv=0,c=a+1;i>c;c++)if(h[c].hidden!==!0){g.nv=c-a;break}if(f.resizing={idx:a},d=b-f.headers[a].width,g.forceFit){if(e=f.headers[a+g.nv].width-d,e<g.minColWidth)return;f.headers[a+g.nv].newWidth=f.headers[a+g.nv].width-d}f.newWidth=g.tblwidth+d,f.headers[a].newWidth=b,f.dragEnd(!1)}})},getStyleUI:function(a,b,c,d){try{var e=\"\",f=a.split(\".\"),g=\"\";switch(c||(e=\"class=\",g='\"'),null==d&&(d=\"\"),f.length){case 1:e+=g+d+\" \"+$.jgrid.styleUI[f[0]][b]+g;break;case 2:e+=g+d+\" \"+$.jgrid.styleUI[f[0]][f[1]][b]+g}}catch(h){e=\"\"}return $.trim(e)},resizeGrid:function(a){return this.each(function(){var b=this;void 0===a&&(a=500),setTimeout(function(){var a=$(window).width(),c=$(\"#gbox_\"+$.jgrid.jqID(b.p.id)).parent().width(),d=b.p.width;d=a-c>3?c:a,$(\"#\"+$.jgrid.jqID(b.p.id)).jqGrid(\"setGridWidth\",d)},a)})}}),$.jgrid.extend({editCell:function(a,b,c){return this.each(function(){var d,e,f,g,h=this,i=$(this).jqGrid(\"getStyleUI\",h.p.styleUI+\".common\",\"highlight\",!0),j=$(this).jqGrid(\"getStyleUI\",h.p.styleUI+\".common\",\"hover\",!0),k=$(this).jqGrid(\"getStyleUI\",h.p.styleUI+\".celledit\",\"inputClass\",!0);if(h.grid&&h.p.cellEdit===!0){if(b=parseInt(b,10),h.p.selrow=h.rows[a].id,h.p.knv||$(h).jqGrid(\"GridNav\"),h.p.savedRow.length>0){if(c===!0&&a==h.p.iRow&&b==h.p.iCol)return;$(h).jqGrid(\"saveCell\",h.p.savedRow[0].id,h.p.savedRow[0].ic)}else window.setTimeout(function(){$(\"#\"+$.jgrid.jqID(h.p.knv)).attr(\"tabindex\",\"-1\").focus()},1);if(g=h.p.colModel[b],d=g.name,\"subgrid\"!==d&&\"cb\"!==d&&\"rn\"!==d){if(f=$(\"td:eq(\"+b+\")\",h.rows[a]),g.editable!==!0||c!==!0||f.hasClass(\"not-editable-cell\")||$.isFunction(h.p.isCellEditable)&&!h.p.isCellEditable.call(h,d,a,b))parseInt(h.p.iCol,10)>=0&&parseInt(h.p.iRow,10)>=0&&$(h.rows[h.p.iRow]).removeClass(\"selected-row \"+j).find(\"td:eq(\"+h.p.iCol+\")\").removeClass(\"edit-cell \"+i),f.addClass(\"edit-cell \"+i),$(h.rows[a]).addClass(\"selected-row \"+j),e=f.html().replace(/\\&#160\\;/gi,\"\"),$(h).triggerHandler(\"jqGridSelectCell\",[h.rows[a].id,d,e,a,b]),$.isFunction(h.p.onSelectCell)&&h.p.onSelectCell.call(h,h.rows[a].id,d,e,a,b);else{parseInt(h.p.iCol,10)>=0&&parseInt(h.p.iRow,10)>=0&&$(h.rows[h.p.iRow]).removeClass(\"selected-row \"+j).find(\"td:eq(\"+h.p.iCol+\")\").removeClass(\"edit-cell \"+i),$(f).addClass(\"edit-cell \"+i),$(h.rows[a]).addClass(\"selected-row \"+j);try{e=$.unformat.call(h,f,{rowId:h.rows[a].id,colModel:g},b)}catch(l){e=g.edittype&&\"textarea\"===g.edittype?$(f).text():$(f).html()}if(h.p.autoencode&&(e=$.jgrid.htmlDecode(e)),g.edittype||(g.edittype=\"text\"),h.p.savedRow.push({id:a,ic:b,name:d,v:e}),(\"&nbsp;\"===e||\"&#160;\"===e||1===e.length&&160===e.charCodeAt(0))&&(e=\"\"),$.isFunction(h.p.formatCell)){var m=h.p.formatCell.call(h,h.rows[a].id,d,e,a,b);void 0!==m&&(e=m)}$(h).triggerHandler(\"jqGridBeforeEditCell\",[h.rows[a].id,d,e,a,b]),$.isFunction(h.p.beforeEditCell)&&h.p.beforeEditCell.call(h,h.rows[a].id,d,e,a,b);var n=$.extend({},g.editoptions||{},{id:a+\"_\"+d,name:d,rowId:h.rows[a].id,oper:\"edit\"}),o=$.jgrid.createEl.call(h,g.edittype,n,e,!0,$.extend({},$.jgrid.ajaxOptions,h.p.ajaxSelectOptions||{}));$.inArray(g.edittype,[\"text\",\"textarea\",\"password\",\"select\"])>-1&&$(o).addClass(k),$(f).html(\"\").append(o).attr(\"tabindex\",\"0\"),$.jgrid.bindEv.call(h,o,n),window.setTimeout(function(){$(o).focus()},1),$(\"input, select, textarea\",f).bind(\"keydown\",function(c){if(27===c.keyCode&&($(\"input.hasDatepicker\",f).length>0?$(\".ui-datepicker\").is(\":hidden\")?$(h).jqGrid(\"restoreCell\",a,b):$(\"input.hasDatepicker\",f).datepicker(\"hide\"):$(h).jqGrid(\"restoreCell\",a,b)),13===c.keyCode&&!c.shiftKey)return $(h).jqGrid(\"saveCell\",a,b),!1;if(9===c.keyCode){if(h.grid.hDiv.loading)return!1;c.shiftKey?$(h).jqGrid(\"prevCell\",a,b):$(h).jqGrid(\"nextCell\",a,b)}c.stopPropagation()}),$(h).triggerHandler(\"jqGridAfterEditCell\",[h.rows[a].id,d,e,a,b]),$.isFunction(h.p.afterEditCell)&&h.p.afterEditCell.call(h,h.rows[a].id,d,e,a,b)}h.p.iCol=b,h.p.iRow=a}}})},saveCell:function(a,b){return this.each(function(){var c,d=this,e=$.jgrid.getRegional(this,\"errors\"),f=$.jgrid.getRegional(this,\"edit\");if(d.grid&&d.p.cellEdit===!0){if(c=d.p.savedRow.length>=1?0:null,null!==c){var g,h,i=$(\"td:eq(\"+b+\")\",d.rows[a]),j=d.p.colModel[b],k=j.name,l=$.jgrid.jqID(k);switch(j.edittype){case\"select\":if(j.editoptions.multiple){var m=$(\"#\"+a+\"_\"+l,d.rows[a]),n=[];g=$(m).val(),g?g.join(\",\"):g=\"\",$(\"option:selected\",m).each(function(a,b){n[a]=$(b).text()}),h=n.join(\",\")}else g=$(\"#\"+a+\"_\"+l+\" option:selected\",d.rows[a]).val(),h=$(\"#\"+a+\"_\"+l+\" option:selected\",d.rows[a]).text();j.formatter&&(h=g);break;case\"checkbox\":var o=[\"Yes\",\"No\"];j.editoptions&&(o=j.editoptions.value.split(\":\")),g=$(\"#\"+a+\"_\"+l,d.rows[a]).is(\":checked\")?o[0]:o[1],h=g;break;case\"password\":case\"text\":case\"textarea\":case\"button\":g=$(\"#\"+a+\"_\"+l,d.rows[a]).val(),h=g;break;case\"custom\":try{if(!j.editoptions||!$.isFunction(j.editoptions.custom_value))throw\"e1\";if(g=j.editoptions.custom_value.call(d,$(\".customelement\",i),\"get\"),void 0===g)throw\"e2\";h=g}catch(p){\"e1\"===p?$.jgrid.info_dialog(e.errcap,\"function 'custom_value' \"+f.msg.nodefined,f.bClose,{styleUI:d.p.styleUI}):\"e2\"===p?$.jgrid.info_dialog(e.errcap,\"function 'custom_value' \"+f.msg.novalue,f.bClose,{styleUI:d.p.styleUI}):$.jgrid.info_dialog(e.errcap,p.message,f.bClose,{styleUI:d.p.styleUI})}}if(h!==d.p.savedRow[c].v){var q=$(d).triggerHandler(\"jqGridBeforeSaveCell\",[d.rows[a].id,k,g,a,b]);if(q&&(g=q,h=q),$.isFunction(d.p.beforeSaveCell)){var r=d.p.beforeSaveCell.call(d,d.rows[a].id,k,g,a,b);r&&(g=r,h=r)}var s=$.jgrid.checkValues.call(d,g,b);if(s[0]===!0){var t=$(d).triggerHandler(\"jqGridBeforeSubmitCell\",[d.rows[a].id,k,g,a,b])||{};if($.isFunction(d.p.beforeSubmitCell)&&(t=d.p.beforeSubmitCell.call(d,d.rows[a].id,k,g,a,b),t||(t={})),$(\"input.hasDatepicker\",i).length>0&&$(\"input.hasDatepicker\",i).datepicker(\"hide\"),\"remote\"===d.p.cellsubmit)if(d.p.cellurl){var u={};d.p.autoencode&&(g=$.jgrid.htmlEncode(g)),u[k]=g;var v,w,x;x=d.p.prmNames,v=x.id,w=x.oper,u[v]=$.jgrid.stripPref(d.p.idPrefix,d.rows[a].id),u[w]=x.editoper,u=$.extend(t,u),$(d).jqGrid(\"progressBar\",{method:\"show\",loadtype:d.p.loadui,htmlcontent:$.jgrid.getRegional(d,\"defaults.savetext\")}),d.grid.hDiv.loading=!0,$.ajax($.extend({url:d.p.cellurl,data:$.isFunction(d.p.serializeCellData)?d.p.serializeCellData.call(d,u):u,type:\"POST\",complete:function(c,j){if($(d).jqGrid(\"progressBar\",{method:\"hide\",loadtype:d.p.loadui}),d.grid.hDiv.loading=!1,\"success\"===j){var l=$(d).triggerHandler(\"jqGridAfterSubmitCell\",[d,c,u.id,k,g,a,b])||[!0,\"\"];l[0]===!0&&$.isFunction(d.p.afterSubmitCell)&&(l=d.p.afterSubmitCell.call(d,c,u.id,k,g,a,b)),l[0]===!0?($(i).empty(),$(d).jqGrid(\"setCell\",d.rows[a].id,b,h,!1,!1,!0),$(i).addClass(\"dirty-cell\"),$(d.rows[a]).addClass(\"edited\"),$(d).triggerHandler(\"jqGridAfterSaveCell\",[d.rows[a].id,k,g,a,b]),$.isFunction(d.p.afterSaveCell)&&d.p.afterSaveCell.call(d,d.rows[a].id,k,g,a,b),d.p.savedRow.splice(0,1)):($.jgrid.info_dialog(e.errcap,l[1],f.bClose,{styleUI:d.p.styleUI}),$(d).jqGrid(\"restoreCell\",a,b))}},error:function(c,g,h){$(\"#lui_\"+$.jgrid.jqID(d.p.id)).hide(),d.grid.hDiv.loading=!1,$(d).triggerHandler(\"jqGridErrorCell\",[c,g,h]),$.isFunction(d.p.errorCell)?(d.p.errorCell.call(d,c,g,h),$(d).jqGrid(\"restoreCell\",a,b)):($.jgrid.info_dialog(e.errcap,c.status+\" : \"+c.statusText+\"<br/>\"+g,f.bClose,{styleUI:d.p.styleUI}),$(d).jqGrid(\"restoreCell\",a,b))}},$.jgrid.ajaxOptions,d.p.ajaxCellOptions||{}))}else try{$.jgrid.info_dialog(e.errcap,e.nourl,f.bClose,{styleUI:d.p.styleUI}),$(d).jqGrid(\"restoreCell\",a,b)}catch(p){}\"clientArray\"===d.p.cellsubmit&&($(i).empty(),$(d).jqGrid(\"setCell\",d.rows[a].id,b,h,!1,!1,!0),$(i).addClass(\"dirty-cell\"),$(d.rows[a]).addClass(\"edited\"),$(d).triggerHandler(\"jqGridAfterSaveCell\",[d.rows[a].id,k,g,a,b]),$.isFunction(d.p.afterSaveCell)&&d.p.afterSaveCell.call(d,d.rows[a].id,k,g,a,b),d.p.savedRow.splice(0,1))}else try{window.setTimeout(function(){$.jgrid.info_dialog(e.errcap,g+\" \"+s[1],f.bClose,{styleUI:d.p.styleUI})},100),$(d).jqGrid(\"restoreCell\",a,b)}catch(p){}}else $(d).jqGrid(\"restoreCell\",a,b)}window.setTimeout(function(){$(\"#\"+$.jgrid.jqID(d.p.knv)).attr(\"tabindex\",\"-1\").focus()},0)}})},restoreCell:function(a,b){return this.each(function(){var c,d=this;if(d.grid&&d.p.cellEdit===!0){if(c=d.p.savedRow.length>=1?0:null,null!==c){var e=$(\"td:eq(\"+b+\")\",d.rows[a]);if($.isFunction($.fn.datepicker))try{$(\"input.hasDatepicker\",e).datepicker(\"hide\")}catch(f){}$(e).empty().attr(\"tabindex\",\"-1\"),$(d).jqGrid(\"setCell\",d.rows[a].id,b,d.p.savedRow[c].v,!1,!1,!0),$(d).triggerHandler(\"jqGridAfterRestoreCell\",[d.rows[a].id,d.p.savedRow[c].v,a,b]),$.isFunction(d.p.afterRestoreCell)&&d.p.afterRestoreCell.call(d,d.rows[a].id,d.p.savedRow[c].v,a,b),d.p.savedRow.splice(0,1)}window.setTimeout(function(){$(\"#\"+d.p.knv).attr(\"tabindex\",\"-1\").focus()},0)}})},nextCell:function(a,b){return this.each(function(){var c,d=this,e=!1;if(d.grid&&d.p.cellEdit===!0){for(c=b+1;c<d.p.colModel.length;c++)if(d.p.colModel[c].editable===!0&&(!$.isFunction(d.p.isCellEditable)||d.p.isCellEditable.call(d,d.p.colModel[c].name,a,c))){e=c;break}e!==!1?$(d).jqGrid(\"editCell\",a,e,!0):d.p.savedRow.length>0&&$(d).jqGrid(\"saveCell\",a,b)}})},prevCell:function(a,b){return this.each(function(){var c,d=this,e=!1;if(d.grid&&d.p.cellEdit===!0){for(c=b-1;c>=0;c--)if(d.p.colModel[c].editable===!0&&(!$.isFunction(d.p.isCellEditable)||d.p.isCellEditable.call(d,d.p.colModel[c].name,a,c))){e=c;break}e!==!1?$(d).jqGrid(\"editCell\",a,e,!0):d.p.savedRow.length>0&&$(d).jqGrid(\"saveCell\",a,b)}})},GridNav:function(){return this.each(function(){function a(a,b,d){if(\"v\"===d.substr(0,1)){var e=$(c.grid.bDiv)[0].clientHeight,f=$(c.grid.bDiv)[0].scrollTop,g=c.rows[a].offsetTop+c.rows[a].clientHeight,h=c.rows[a].offsetTop;\"vd\"===d&&g>=e&&($(c.grid.bDiv)[0].scrollTop=$(c.grid.bDiv)[0].scrollTop+c.rows[a].clientHeight),\"vu\"===d&&f>h&&($(c.grid.bDiv)[0].scrollTop=$(c.grid.bDiv)[0].scrollTop-c.rows[a].clientHeight)}if(\"h\"===d){var i=$(c.grid.bDiv)[0].clientWidth,j=$(c.grid.bDiv)[0].scrollLeft,k=c.rows[a].cells[b].offsetLeft+c.rows[a].cells[b].clientWidth,l=c.rows[a].cells[b].offsetLeft;k>=i+parseInt(j,10)?$(c.grid.bDiv)[0].scrollLeft=$(c.grid.bDiv)[0].scrollLeft+c.rows[a].cells[b].clientWidth:j>l&&($(c.grid.bDiv)[0].scrollLeft=$(c.grid.bDiv)[0].scrollLeft-c.rows[a].cells[b].clientWidth)}}function b(a,b){var d,e;if(\"lft\"===b)for(d=a+1,e=a;e>=0;e--)if(c.p.colModel[e].hidden!==!0){d=e;break}if(\"rgt\"===b)for(d=a-1,e=a;e<c.p.colModel.length;e++)if(c.p.colModel[e].hidden!==!0){d=e;break}return d}var c=this;if(c.grid&&c.p.cellEdit===!0){c.p.knv=c.p.id+\"_kn\";var d,e,f=$(\"<div style='position:fixed;top:0px;width:1px;height:1px;' tabindex='0'><div tabindex='-1' style='width:1px;height:1px;' id='\"+c.p.knv+\"'></div></div>\");$(f).insertBefore(c.grid.cDiv),$(\"#\"+c.p.knv).focus().keydown(function(f){switch(e=f.keyCode,\"rtl\"===c.p.direction&&(37===e?e=39:39===e&&(e=37)),e){case 38:c.p.iRow-1>0&&(a(c.p.iRow-1,c.p.iCol,\"vu\"),$(c).jqGrid(\"editCell\",c.p.iRow-1,c.p.iCol,!1));break;case 40:c.p.iRow+1<=c.rows.length-1&&(a(c.p.iRow+1,c.p.iCol,\"vd\"),$(c).jqGrid(\"editCell\",c.p.iRow+1,c.p.iCol,!1));break;case 37:c.p.iCol-1>=0&&(d=b(c.p.iCol-1,\"lft\"),a(c.p.iRow,d,\"h\"),$(c).jqGrid(\"editCell\",c.p.iRow,d,!1));break;case 39:c.p.iCol+1<=c.p.colModel.length-1&&(d=b(c.p.iCol+1,\"rgt\"),a(c.p.iRow,d,\"h\"),$(c).jqGrid(\"editCell\",c.p.iRow,d,!1));break;case 13:parseInt(c.p.iCol,10)>=0&&parseInt(c.p.iRow,10)>=0&&$(c).jqGrid(\"editCell\",c.p.iRow,c.p.iCol,!0);break;default:return!0}return!1})}})},getChangedCells:function(a){var b=[];return a||(a=\"all\"),this.each(function(){var c,d=this;d.grid&&d.p.cellEdit===!0&&$(d.rows).each(function(e){var f={};$(this).hasClass(\"edited\")&&($(\"td\",this).each(function(b){if(c=d.p.colModel[b].name,\"cb\"!==c&&\"subgrid\"!==c)if(\"dirty\"===a){if($(this).hasClass(\"dirty-cell\"))try{f[c]=$.unformat.call(d,this,{rowId:d.rows[e].id,colModel:d.p.colModel[b]},b)}catch(g){f[c]=$.jgrid.htmlDecode($(this).html())}}else try{f[c]=$.unformat.call(d,this,{rowId:d.rows[e].id,colModel:d.p.colModel[b]},b)}catch(g){f[c]=$.jgrid.htmlDecode($(this).html())}}),f.id=this.id,b.push(f))})}),b}}),$.extend($.jgrid,{showModal:function(a){a.w.show()},closeModal:function(a){a.w.hide().attr(\"aria-hidden\",\"true\"),a.o&&a.o.remove()},hideModal:function(a,b){b=$.extend({jqm:!0,gb:\"\",removemodal:!1,formprop:!1,form:\"\"},b||{});var c=b.gb&&\"string\"==typeof b.gb&&\"#gbox_\"===b.gb.substr(0,6)?$(\"#\"+b.gb.substr(6))[0]:!1;if(b.onClose){var d=c?b.onClose.call(c,a):b.onClose(a);if(\"boolean\"==typeof d&&!d)return}if(b.formprop&&c&&b.form){var e=$(a)[0].style.height,f=$(a)[0].style.width;e.indexOf(\"px\")>-1&&(e=parseFloat(e)),f.indexOf(\"px\")>-1&&(f=parseFloat(f));var g,h;\"edit\"===b.form?(g=\"#\"+$.jgrid.jqID(\"FrmGrid_\"+b.gb.substr(6)),h=\"formProp\"):\"view\"===b.form&&(g=\"#\"+$.jgrid.jqID(\"ViewGrid_\"+b.gb.substr(6)),h=\"viewProp\"),$(c).data(h,{top:parseFloat($(a).css(\"top\")),left:parseFloat($(a).css(\"left\")),width:f,height:e,dataheight:$(g).height(),datawidth:$(g).width()})}if($.fn.jqm&&b.jqm===!0)$(a).attr(\"aria-hidden\",\"true\").jqmHide();else{if(\"\"!==b.gb)try{$(\".jqgrid-overlay:first\",b.gb).hide()}catch(i){}$(a).hide().attr(\"aria-hidden\",\"true\")}b.removemodal&&$(a).remove()},findPos:function(a){var b=0,c=0;if(a.offsetParent)do b+=a.offsetLeft,c+=a.offsetTop;while(a=a.offsetParent);return[b,c]},createModal:function(a,b,c,d,e,f,g){c=$.extend(!0,{},$.jgrid.jqModal||{},c);var h=this,i=\"rtl\"===$(c.gbox).attr(\"dir\")?!0:!1,j=$.jgrid.styleUI[c.styleUI||\"jQueryUI\"].modal,k=$.jgrid.styleUI[c.styleUI||\"jQueryUI\"].common,l=document.createElement(\"div\");g=$.extend({},g||{}),l.className=\"ui-jqdialog \"+j.modal,l.id=a.themodal;var m=document.createElement(\"div\");m.className=\"ui-jqdialog-titlebar \"+j.header,m.id=a.modalhead,$(m).append(\"<span class='ui-jqdialog-title'>\"+c.caption+\"</span>\");var n=$(\"<a class='ui-jqdialog-titlebar-close \"+k.cornerall+\"'></a>\").hover(function(){n.addClass(k.hover)},function(){n.removeClass(k.hover)}).append(\"<span class='\"+k.icon_base+\" \"+j.icon_close+\"'></span>\");$(m).append(n),i?(l.dir=\"rtl\",$(\".ui-jqdialog-title\",m).css(\"float\",\"right\"),$(\".ui-jqdialog-titlebar-close\",m).css(\"left\",\"0.3em\")):(l.dir=\"ltr\",$(\".ui-jqdialog-title\",m).css(\"float\",\"left\"),$(\".ui-jqdialog-titlebar-close\",m).css(\"right\",\"0.3em\"));var o=document.createElement(\"div\");$(o).addClass(\"ui-jqdialog-content \"+j.content).attr(\"id\",a.modalcontent),$(o).append(b),l.appendChild(o),$(l).prepend(m),f===!0?$(\"body\").append(l):\"string\"==typeof f?$(f).append(l):$(l).insertBefore(d),$(l).css(g),void 0===c.jqModal&&(c.jqModal=!0);var p={};if($.fn.jqm&&c.jqModal===!0){if(0===c.left&&0===c.top&&c.overlay){var q=[];q=$.jgrid.findPos(e),c.left=q[0]+4,c.top=q[1]+4}p.top=c.top+\"px\",p.left=c.left}else(0!==c.left||0!==c.top)&&(p.left=c.left,p.top=c.top+\"px\");if($(\"a.ui-jqdialog-titlebar-close\",m).click(function(){var b=$(\"#\"+$.jgrid.jqID(a.themodal)).data(\"onClose\")||c.onClose,d=$(\"#\"+$.jgrid.jqID(a.themodal)).data(\"gbox\")||c.gbox;return h.hideModal(\"#\"+$.jgrid.jqID(a.themodal),{gb:d,jqm:c.jqModal,onClose:b,removemodal:c.removemodal||!1,formprop:!c.recreateForm||!1,form:c.form||\"\"}),!1}),0!==c.width&&c.width||(c.width=300),0!==c.height&&c.height||(c.height=200),!c.zIndex){var r=$(d).parents(\"*[role=dialog]\").filter(\":first\").css(\"z-index\");c.zIndex=r?parseInt(r,10)+2:950}var s=0;if(i&&p.left&&!f&&(s=$(c.gbox).width()-(isNaN(c.width)?0:parseInt(c.width,10))-8,p.left=parseInt(p.left,10)+parseInt(s,10)),p.left&&(p.left+=\"px\"),$(l).css($.extend({width:isNaN(c.width)?\"auto\":c.width+\"px\",height:isNaN(c.height)?\"auto\":c.height+\"px\",zIndex:c.zIndex,overflow:\"hidden\"},p)).attr({tabIndex:\"-1\",role:\"dialog\",\"aria-labelledby\":a.modalhead,\"aria-hidden\":\"true\"}),void 0===c.drag&&(c.drag=!0),void 0===c.resize&&(c.resize=!0),c.drag)if($(m).css(\"cursor\",\"move\"),$.fn.jqDrag)$(l).jqDrag(m);else try{$(l).draggable({handle:$(\"#\"+$.jgrid.jqID(m.id))})}catch(t){}if(c.resize)if($.fn.jqResize)$(l).append(\"<div class='jqResize \"+j.resizable+\" \"+k.icon_base+\" \"+j.icon_resizable+\"'></div>\"),$(\"#\"+$.jgrid.jqID(a.themodal)).jqResize(\".jqResize\",a.scrollelm?\"#\"+$.jgrid.jqID(a.scrollelm):!1);else try{$(l).resizable({handles:\"se, sw\",alsoResize:a.scrollelm?\"#\"+$.jgrid.jqID(a.scrollelm):!1})}catch(u){}c.closeOnEscape===!0&&$(l).keydown(function(b){if(27===b.which){var d=$(\"#\"+$.jgrid.jqID(a.themodal)).data(\"onClose\")||c.onClose;h.hideModal(\"#\"+$.jgrid.jqID(a.themodal),{gb:c.gbox,jqm:c.jqModal,onClose:d,removemodal:c.removemodal||!1,formprop:!c.recreateForm||!1,form:c.form||\"\"})}})},viewModal:function(a,b){if(b=$.extend({toTop:!0,overlay:10,modal:!1,overlayClass:\"ui-widget-overlay\",onShow:$.jgrid.showModal,onHide:$.jgrid.closeModal,gbox:\"\",jqm:!0,jqM:!0},b||{}),void 0===b.focusField&&(b.focusField=0),b.focusField=\"number\"==typeof b.focusField&&b.focusField>=0?parseInt(b.focusField,10):\"boolean\"!=typeof b.focusField||b.focusField?0:!1,$.fn.jqm&&b.jqm===!0)b.jqM?$(a).attr(\"aria-hidden\",\"false\").jqm(b).jqmShow():$(a).attr(\"aria-hidden\",\"false\").jqmShow();else if(\"\"!==b.gbox&&($(\".jqgrid-overlay:first\",b.gbox).show(),$(a).data(\"gbox\",b.gbox)),$(a).show().attr(\"aria-hidden\",\"false\"),b.focusField>=0)try{$(\":input:visible\",a)[parseInt(b.focusField,10)].focus()}catch(c){}},info_dialog:function(a,b,c,d){var e={width:290,height:\"auto\",dataheight:\"auto\",drag:!0,resize:!1,left:250,top:170,zIndex:1e3,jqModal:!0,modal:!1,closeOnEscape:!0,align:\"center\",buttonalign:\"center\",buttons:[]};$.extend(!0,e,$.jgrid.jqModal||{},{caption:\"<b>\"+a+\"</b>\"},d||{});var f=e.jqModal,g=this,h=$.jgrid.styleUI[e.styleUI||\"jQueryUI\"].modal,i=$.jgrid.styleUI[e.styleUI||\"jQueryUI\"].common;$.fn.jqm&&!f&&(f=!1);var j,k=\"\";if(e.buttons.length>0)for(j=0;j<e.buttons.length;j++)void 0===e.buttons[j].id&&(e.buttons[j].id=\"info_button_\"+j),k+=\"<a id='\"+e.buttons[j].id+\"' class='fm-button \"+i.button+\"'>\"+e.buttons[j].text+\"</a>\";var l=isNaN(e.dataheight)?e.dataheight:e.dataheight+\"px\",m=\"text-align:\"+e.align+\";\",n=\"<div id='info_id'>\";n+=\"<div id='infocnt' style='margin:0px;padding-bottom:1em;width:100%;overflow:auto;position:relative;height:\"+l+\";\"+m+\"'>\"+b+\"</div>\",n+=c?\"<div class='\"+h.header+\"' style='text-align:\"+e.buttonalign+\";padding-bottom:0.8em;padding-top:0.5em;background-image: none;border-width: 1px 0 0 0;'><a id='closedialog' class='fm-button \"+i.button+\"'>\"+c+\"</a>\"+k+\"</div>\":\"\"!==k?\"<div class='\"+h.header+\"' style='text-align:\"+e.buttonalign+\";padding-bottom:0.8em;padding-top:0.5em;background-image: none;border-width: 1px 0 0 0;'>\"+k+\"</div>\":\"\",n+=\"</div>\";try{\"false\"===$(\"#info_dialog\").attr(\"aria-hidden\")&&$.jgrid.hideModal(\"#info_dialog\",{jqm:f}),$(\"#info_dialog\").remove()}catch(o){}$.jgrid.createModal({themodal:\"info_dialog\",modalhead:\"info_head\",modalcontent:\"info_content\",scrollelm:\"infocnt\"},n,e,\"\",\"\",!0),k&&$.each(e.buttons,function(a){$(\"#\"+$.jgrid.jqID(this.id),\"#info_id\").bind(\"click\",function(){return e.buttons[a].onClick.call($(\"#info_dialog\")),!1})}),$(\"#closedialog\",\"#info_id\").click(function(){return g.hideModal(\"#info_dialog\",{jqm:f,onClose:$(\"#info_dialog\").data(\"onClose\")||e.onClose,gb:$(\"#info_dialog\").data(\"gbox\")||e.gbox}),!1}),$(\".fm-button\",\"#info_dialog\").hover(function(){$(this).addClass(i.hover)},function(){$(this).removeClass(i.hover)}),$.isFunction(e.beforeOpen)&&e.beforeOpen(),$.jgrid.viewModal(\"#info_dialog\",{onHide:function(a){a.w.hide().remove(),a.o&&a.o.remove()},modal:e.modal,jqm:f}),$.isFunction(e.afterOpen)&&e.afterOpen();try{$(\"#info_dialog\").focus()}catch(p){}},bindEv:function(a,b){var c=this;$.isFunction(b.dataInit)&&b.dataInit.call(c,a,b),b.dataEvents&&$.each(b.dataEvents,function(){void 0!==this.data?$(a).bind(this.type,this.data,this.fn):$(a).bind(this.type,this.fn)})},createEl:function(a,b,c,d,e){function f(a,b,c){var d=[\"dataInit\",\"dataEvents\",\"dataUrl\",\"buildSelect\",\"sopt\",\"searchhidden\",\"defaultValue\",\"attr\",\"custom_element\",\"custom_value\",\"oper\"];void 0!==c&&$.isArray(c)&&$.merge(d,c),$.each(b,function(b,c){-1===$.inArray(b,d)&&$(a).attr(b,c)}),b.hasOwnProperty(\"id\")||$(a).attr(\"id\",$.jgrid.randId())}var g=\"\",h=this;switch(a){case\"textarea\":g=document.createElement(\"textarea\"),d?b.cols||$(g).css({width:\"98%\"}):b.cols||(b.cols=20),b.rows||(b.rows=2),(\"&nbsp;\"===c||\"&#160;\"===c||1===c.length&&160===c.charCodeAt(0))&&(c=\"\"),g.value=c,f(g,b),$(g).attr({role:\"textbox\",multiline:\"true\"});break;case\"checkbox\":if(g=document.createElement(\"input\"),g.type=\"checkbox\",b.value){var i=b.value.split(\":\");c===i[0]&&(g.checked=!0,g.defaultChecked=!0),g.value=i[0],$(g).attr(\"offval\",i[1])}else{var j=(c+\"\").toLowerCase();j.search(/(false|f|0|no|n|off|undefined)/i)<0&&\"\"!==j?(g.checked=!0,g.defaultChecked=!0,g.value=c):g.value=\"on\",$(g).attr(\"offval\",\"off\")}f(g,b,[\"value\"]),$(g).attr(\"role\",\"checkbox\");break;case\"select\":g=document.createElement(\"select\"),g.setAttribute(\"role\",\"select\");var k,l=[];if(b.multiple===!0?(k=!0,g.multiple=\"multiple\",$(g).attr(\"aria-multiselectable\",\"true\")):k=!1,null!=b.dataUrl){var m=null,n=b.postData||e.postData;try{m=b.rowId}catch(o){}h.p&&h.p.idPrefix&&(m=$.jgrid.stripPref(h.p.idPrefix,m)),$.ajax($.extend({url:$.isFunction(b.dataUrl)?b.dataUrl.call(h,m,c,String(b.name)):b.dataUrl,type:\"GET\",dataType:\"html\",data:$.isFunction(n)?n.call(h,m,c,String(b.name)):n,context:{elem:g,options:b,vl:c},success:function(a){var b,c=[],d=this.elem,e=this.vl,g=$.extend({},this.options),i=g.multiple===!0,j=g.cacheUrlData===!0,k=\"\",l=$.isFunction(g.buildSelect)?g.buildSelect.call(h,a):a;\"string\"==typeof l&&(l=$($.trim(l)).html()),l&&($(d).append(l),f(d,g,n?[\"postData\"]:void 0),void 0===g.size&&(g.size=i?3:1),i?(c=e.split(\",\"),c=$.map(c,function(a){return $.trim(a)})):c[0]=$.trim(e),setTimeout(function(){if($(\"option\",d).each(function(a){b=$(this).text(),e=$(this).val()||b,j&&(k+=(0!==a?\";\":\"\")+e+\":\"+b),0===a&&d.multiple&&(this.selected=!1),$(this).attr(\"role\",\"option\"),($.inArray($.trim(b),c)>-1||$.inArray($.trim(e),c)>-1)&&(this.selected=\"selected\")}),j)if(\"edit\"===g.oper)$(h).jqGrid(\"setColProp\",g.name,{editoptions:{buildSelect:null,dataUrl:null,value:k}});else if(\"search\"===g.oper)$(h).jqGrid(\"setColProp\",g.name,{searchoptions:{dataUrl:null,value:k}});else if(\"filter\"===g.oper&&$(\"#fbox_\"+h.p.id)[0].p){var a,f=$(\"#fbox_\"+h.p.id)[0].p.columns;$.each(f,function(){return a=this.index||this.name,g.name===a?(this.searchoptions.dataUrl=null,this.searchoptions.value=k,!1):void 0})}$(h).triggerHandler(\"jqGridAddEditAfterSelectUrlComplete\",[d])},0))}},e||{}))}else if(b.value){var p;void 0===b.size&&(b.size=k?3:1),k&&(l=c.split(\",\"),l=$.map(l,function(a){return $.trim(a)})),\"function\"==typeof b.value&&(b.value=b.value());var q,r,s,t,u,v,w=void 0===b.separator?\":\":b.separator,x=void 0===b.delimiter?\";\":b.delimiter;if(\"string\"==typeof b.value)for(q=b.value.split(x),p=0;p<q.length;p++)r=q[p].split(w),r.length>2&&(r[1]=$.map(r,function(a,b){return b>0?a:void 0\n}).join(w)),s=document.createElement(\"option\"),s.setAttribute(\"role\",\"option\"),s.value=r[0],s.innerHTML=r[1],g.appendChild(s),k||$.trim(r[0])!==$.trim(c)&&$.trim(r[1])!==$.trim(c)||(s.selected=\"selected\"),k&&($.inArray($.trim(r[1]),l)>-1||$.inArray($.trim(r[0]),l)>-1)&&(s.selected=\"selected\");else if(\"[object Array]\"===Object.prototype.toString.call(b.value))for(t=b.value,p=0;p<t.length;p++)2===t[p].length&&(u=t[p][0],v=t[p][1],s=document.createElement(\"option\"),s.setAttribute(\"role\",\"option\"),s.value=u,s.innerHTML=v,g.appendChild(s),k||$.trim(u)!==$.trim(c)&&$.trim(v)!==$.trim(c)||(s.selected=\"selected\"),k&&($.inArray($.trim(v),l)>-1||$.inArray($.trim(u),l)>-1)&&(s.selected=\"selected\"));else if(\"object\"==typeof b.value){t=b.value;for(u in t)t.hasOwnProperty(u)&&(s=document.createElement(\"option\"),s.setAttribute(\"role\",\"option\"),s.value=u,s.innerHTML=t[u],g.appendChild(s),k||$.trim(u)!==$.trim(c)&&$.trim(t[u])!==$.trim(c)||(s.selected=\"selected\"),k&&($.inArray($.trim(t[u]),l)>-1||$.inArray($.trim(u),l)>-1)&&(s.selected=\"selected\"))}f(g,b,[\"value\"])}break;case\"image\":case\"file\":g=document.createElement(\"input\"),g.type=a,f(g,b);break;case\"custom\":g=document.createElement(\"span\");try{if(!$.isFunction(b.custom_element))throw\"e1\";var y=b.custom_element.call(h,c,b);if(!y)throw\"e2\";y=$(y).addClass(\"customelement\").attr({id:b.id,name:b.name}),$(g).empty().append(y)}catch(o){var z=$.jgrid.getRegional(h,\"errors\"),A=$.jgrid.getRegional(h,\"edit\");\"e1\"===o?$.jgrid.info_dialog(z.errcap,\"function 'custom_element' \"+A.msg.nodefined,A.bClose,{styleUI:h.p.styleUI}):\"e2\"===o?$.jgrid.info_dialog(z.errcap,\"function 'custom_element' \"+A.msg.novalue,A.bClose,{styleUI:h.p.styleUI}):$.jgrid.info_dialog(z.errcap,\"string\"==typeof o?o:o.message,A.bClose,{styleUI:h.p.styleUI})}break;default:var B;B=\"button\"===a?\"button\":\"textbox\",g=document.createElement(\"input\"),g.type=a,g.value=c,f(g,b),\"button\"!==a&&(d?b.size||$(g).css({width:\"96%\"}):b.size||(b.size=20)),$(g).attr(\"role\",B)}return g},checkDate:function(a,b){var c,d=function(a){return a%4!==0||a%100===0&&a%400!==0?28:29},e={};if(a=a.toLowerCase(),c=-1!==a.indexOf(\"/\")?\"/\":-1!==a.indexOf(\"-\")?\"-\":-1!==a.indexOf(\".\")?\".\":\"/\",a=a.split(c),b=b.split(c),3!==b.length)return!1;var f,g,h=-1,i=-1,j=-1;for(g=0;g<a.length;g++){var k=isNaN(b[g])?0:parseInt(b[g],10);e[a[g]]=k,f=a[g],-1!==f.indexOf(\"y\")&&(h=g),-1!==f.indexOf(\"m\")&&(j=g),-1!==f.indexOf(\"d\")&&(i=g)}f=\"y\"===a[h]||\"yyyy\"===a[h]?4:\"yy\"===a[h]?2:-1;var l,m=[0,31,29,31,30,31,30,31,31,30,31,30,31];return-1===h?!1:(l=e[a[h]].toString(),2===f&&1===l.length&&(f=1),l.length!==f||0===e[a[h]]&&\"00\"!==b[h]?!1:-1===j?!1:(l=e[a[j]].toString(),l.length<1||e[a[j]]<1||e[a[j]]>12?!1:-1===i?!1:(l=e[a[i]].toString(),l.length<1||e[a[i]]<1||e[a[i]]>31||2===e[a[j]]&&e[a[i]]>d(e[a[h]])||e[a[i]]>m[e[a[j]]]?!1:!0)))},isEmpty:function(a){return a.match(/^\\s+$/)||\"\"===a?!0:!1},checkTime:function(a){var b,c=/^(\\d{1,2}):(\\d{2})([apAP][Mm])?$/;if(!$.jgrid.isEmpty(a)){if(b=a.match(c),!b)return!1;if(b[3]){if(b[1]<1||b[1]>12)return!1}else if(b[1]>23)return!1;if(b[2]>59)return!1}return!0},checkValues:function(a,b,c,d){var e,f,g,h,i,j,k=this,l=k.p.colModel,m=$.jgrid.getRegional(this,\"edit.msg\");if(void 0===c)if(\"string\"==typeof b){for(f=0,i=l.length;i>f;f++)if(l[f].name===b){e=l[f].editrules,b=f,null!=l[f].formoptions&&(g=l[f].formoptions.label);break}}else b>=0&&(e=l[b].editrules);else e=c,g=void 0===d?\"_\":d;if(e){if(g||(g=null!=k.p.colNames?k.p.colNames[b]:l[b].label),e.required===!0&&$.jgrid.isEmpty(a))return[!1,g+\": \"+m.required,\"\"];var n=e.required===!1?!1:!0;if(e.number===!0&&(n!==!1||!$.jgrid.isEmpty(a))&&isNaN(a))return[!1,g+\": \"+m.number,\"\"];if(void 0!==e.minValue&&!isNaN(e.minValue)&&parseFloat(a)<parseFloat(e.minValue))return[!1,g+\": \"+m.minValue+\" \"+e.minValue,\"\"];if(void 0!==e.maxValue&&!isNaN(e.maxValue)&&parseFloat(a)>parseFloat(e.maxValue))return[!1,g+\": \"+m.maxValue+\" \"+e.maxValue,\"\"];var o;if(e.email===!0&&!(n===!1&&$.jgrid.isEmpty(a)||(o=/^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?$/i,o.test(a))))return[!1,g+\": \"+m.email,\"\"];if(e.integer===!0&&(n!==!1||!$.jgrid.isEmpty(a))){if(isNaN(a))return[!1,g+\": \"+m.integer,\"\"];if(a%1!==0||-1!==a.indexOf(\".\"))return[!1,g+\": \"+m.integer,\"\"]}if(e.date===!0&&!(n===!1&&$.jgrid.isEmpty(a)||(l[b].formatoptions&&l[b].formatoptions.newformat?(h=l[b].formatoptions.newformat,j=$.jgrid.getRegional(k,\"formatter.date.masks\"),j&&j.hasOwnProperty(h)&&(h=j[h])):h=l[b].datefmt||\"Y-m-d\",$.jgrid.checkDate(h,a))))return[!1,g+\": \"+m.date+\" - \"+h,\"\"];if(e.time===!0&&!(n===!1&&$.jgrid.isEmpty(a)||$.jgrid.checkTime(a)))return[!1,g+\": \"+m.date+\" - hh:mm (am/pm)\",\"\"];if(e.url===!0&&!(n===!1&&$.jgrid.isEmpty(a)||(o=/^(((https?)|(ftp)):\\/\\/([\\-\\w]+\\.)+\\w{2,3}(\\/[%\\-\\w]+(\\.\\w{2,})?)*(([\\w\\-\\.\\?\\\\\\/+@&#;`~=%!]*)(\\.\\w{2,})?)*\\/?)/i,o.test(a))))return[!1,g+\": \"+m.url,\"\"];if(e.custom===!0&&(n!==!1||!$.jgrid.isEmpty(a))){if($.isFunction(e.custom_func)){var p=e.custom_func.call(k,a,g,b);return $.isArray(p)?p:[!1,m.customarray,\"\"]}return[!1,m.customfcheck,\"\"]}}return[!0,\"\",\"\"]}}),$.fn.jqFilter=function(a){if(\"string\"==typeof a){var b=$.fn.jqFilter[a];if(!b)throw\"jqFilter - No such method: \"+a;var c=$.makeArray(arguments).slice(1);return b.apply(this,c)}var d=$.extend(!0,{filter:null,columns:[],sortStrategy:null,onChange:null,afterRedraw:null,checkValues:null,error:!1,errmsg:\"\",errorcheck:!0,showQuery:!0,sopt:null,ops:[],operands:null,numopts:[\"eq\",\"ne\",\"lt\",\"le\",\"gt\",\"ge\",\"nu\",\"nn\",\"in\",\"ni\"],stropts:[\"eq\",\"ne\",\"bw\",\"bn\",\"ew\",\"en\",\"cn\",\"nc\",\"nu\",\"nn\",\"in\",\"ni\"],strarr:[\"text\",\"string\",\"blob\"],groupOps:[{op:\"AND\",text:\"AND\"},{op:\"OR\",text:\"OR\"}],groupButton:!0,ruleButtons:!0,direction:\"ltr\"},$.jgrid.filter,a||{});return this.each(function(){if(!this.filter){this.p=d,(null===this.p.filter||void 0===this.p.filter)&&(this.p.filter={groupOp:this.p.groupOps[0].op,rules:[],groups:[]}),null!=this.p.sortStrategy&&$.isFunction(this.p.sortStrategy)&&this.p.columns.sort(this.p.sortStrategy);var a,b,c=this.p.columns.length,e=/msie/i.test(navigator.userAgent)&&!window.opera;if(this.p.initFilter=$.extend(!0,{},this.p.filter),c){for(a=0;c>a;a++)b=this.p.columns[a],b.stype?b.inputtype=b.stype:b.inputtype||(b.inputtype=\"text\"),b.sorttype?b.searchtype=b.sorttype:b.searchtype||(b.searchtype=\"string\"),void 0===b.hidden&&(b.hidden=!1),b.label||(b.label=b.name),b.index&&(b.name=b.index),b.hasOwnProperty(\"searchoptions\")||(b.searchoptions={}),b.hasOwnProperty(\"searchrules\")||(b.searchrules={});var f=function(){return $(\"#\"+$.jgrid.jqID(d.id))[0]||null},g=f(),h=$.jgrid.styleUI[g.p.styleUI||\"jQueryUI\"].filter,i=$.jgrid.styleUI[g.p.styleUI||\"jQueryUI\"].common;this.p.showQuery&&$(this).append(\"<table class='queryresult \"+h.table_widget+\"' style='display:block;max-width:440px;border:0px none;' dir='\"+this.p.direction+\"'><tbody><tr><td class='query'></td></tr></tbody></table>\");var j=function(a,b){var c=[!0,\"\"],e=f();if($.isFunction(b.searchrules))c=b.searchrules.call(e,a,b);else if($.jgrid&&$.jgrid.checkValues)try{c=$.jgrid.checkValues.call(e,a,-1,b.searchrules,b.label)}catch(g){}c&&c.length&&c[0]===!1&&(d.error=!c[0],d.errmsg=c[1])};this.onchange=function(){return this.p.error=!1,this.p.errmsg=\"\",$.isFunction(this.p.onChange)?this.p.onChange.call(this,this.p):!1},this.reDraw=function(){$(\"table.group:first\",this).remove();var a=this.createTableForGroup(d.filter,null);$(this).append(a),$.isFunction(this.p.afterRedraw)&&this.p.afterRedraw.call(this,this.p)},this.createTableForGroup=function(a,b){var c,e=this,f=$(\"<table class='group \"+h.table_widget+\" ui-search-table' style='border:0px none;'><tbody></tbody></table>\"),g=\"left\";\"rtl\"===this.p.direction&&(g=\"right\",f.attr(\"dir\",\"rtl\")),null===b&&f.append(\"<tr class='error' style='display:none;'><th colspan='5' class='\"+i.error+\"' align='\"+g+\"'></th></tr>\");var j=$(\"<tr></tr>\");f.append(j);var k=$(\"<th colspan='5' align='\"+g+\"'></th>\");if(j.append(k),this.p.ruleButtons===!0){var l=$(\"<select class='opsel \"+h.srSelect+\"'></select>\");k.append(l);var m,n=\"\";for(c=0;c<d.groupOps.length;c++)m=a.groupOp===e.p.groupOps[c].op?\" selected='selected'\":\"\",n+=\"<option value='\"+e.p.groupOps[c].op+\"'\"+m+\">\"+e.p.groupOps[c].text+\"</option>\";l.append(n).bind(\"change\",function(){a.groupOp=$(l).val(),e.onchange()})}var o=\"<span></span>\";if(this.p.groupButton&&(o=$(\"<input type='button' value='+ {}' title='Add subgroup' class='add-group \"+i.button+\"'/>\"),o.bind(\"click\",function(){return void 0===a.groups&&(a.groups=[]),a.groups.push({groupOp:d.groupOps[0].op,rules:[],groups:[]}),e.reDraw(),e.onchange(),!1})),k.append(o),this.p.ruleButtons===!0){var p,q=$(\"<input type='button' value='+' title='Add rule' class='add-rule ui-add \"+i.button+\"'/>\");q.bind(\"click\",function(){for(void 0===a.rules&&(a.rules=[]),c=0;c<e.p.columns.length;c++){var b=void 0===e.p.columns[c].search?!0:e.p.columns[c].search,d=e.p.columns[c].hidden===!0,f=e.p.columns[c].searchoptions.searchhidden===!0;if(f&&b||b&&!d){p=e.p.columns[c];break}}var g;return g=p.searchoptions.sopt?p.searchoptions.sopt:e.p.sopt?e.p.sopt:-1!==$.inArray(p.searchtype,e.p.strarr)?e.p.stropts:e.p.numopts,a.rules.push({field:p.name,op:g[0],data:\"\"}),e.reDraw(),!1}),k.append(q)}if(null!==b){var r=$(\"<input type='button' value='-' title='Delete group' class='delete-group \"+i.button+\"'/>\");k.append(r),r.bind(\"click\",function(){for(c=0;c<b.groups.length;c++)if(b.groups[c]===a){b.groups.splice(c,1);break}return e.reDraw(),e.onchange(),!1})}if(void 0!==a.groups)for(c=0;c<a.groups.length;c++){var s=$(\"<tr></tr>\");f.append(s);var t=$(\"<td class='first'></td>\");s.append(t);var u=$(\"<td colspan='4'></td>\");u.append(this.createTableForGroup(a.groups[c],a)),s.append(u)}if(void 0===a.groupOp&&(a.groupOp=e.p.groupOps[0].op),void 0!==a.rules)for(c=0;c<a.rules.length;c++)f.append(this.createTableRowForRule(a.rules[c],a));return f},this.createTableRowForRule=function(a,b){var c,g,j,k,l,m=this,n=f(),o=$(\"<tr></tr>\"),p=\"\";o.append(\"<td class='first'></td>\");var q=$(\"<td class='columns'></td>\");o.append(q);var r,s=$(\"<select class='\"+h.srSelect+\"'></select>\"),t=[];q.append(s),s.bind(\"change\",function(){for(a.field=$(s).val(),j=$(this).parents(\"tr:first\"),$(\".data\",j).empty(),c=0;c<m.p.columns.length;c++)if(m.p.columns[c].name===a.field){k=m.p.columns[c];break}if(k){k.searchoptions.id=$.jgrid.randId(),k.searchoptions.name=a.field,k.searchoptions.oper=\"filter\",e&&\"text\"===k.inputtype&&(k.searchoptions.size||(k.searchoptions.size=10));var b=$.jgrid.createEl.call(n,k.inputtype,k.searchoptions,\"\",!0,m.p.ajaxSelectOptions||{},!0);$(b).addClass(\"input-elm \"+h.srInput),g=k.searchoptions.sopt?k.searchoptions.sopt:m.p.sopt?m.p.sopt:-1!==$.inArray(k.searchtype,m.p.strarr)?m.p.stropts:m.p.numopts;var d=\"\",f=0;for(t=[],$.each(m.p.ops,function(){t.push(this.oper)}),c=0;c<g.length;c++)r=$.inArray(g[c],t),-1!==r&&(0===f&&(a.op=m.p.ops[r].oper),d+=\"<option value='\"+m.p.ops[r].oper+\"'>\"+m.p.ops[r].text+\"</option>\",f++);if($(\".selectopts\",j).empty().append(d),$(\".selectopts\",j)[0].selectedIndex=0,$.jgrid.msie&&$.jgrid.msiever()<9){var i=parseInt($(\"select.selectopts\",j)[0].offsetWidth,10)+1;$(\".selectopts\",j).width(i),$(\".selectopts\",j).css(\"width\",\"auto\")}$(\".data\",j).append(b),$.jgrid.bindEv.call(n,b,k.searchoptions),$(\".input-elm\",j).bind(\"change\",function(b){var c=b.target;a.data=\"SPAN\"===c.nodeName.toUpperCase()&&k.searchoptions&&$.isFunction(k.searchoptions.custom_value)?k.searchoptions.custom_value.call(n,$(c).children(\".customelement:first\"),\"get\"):c.value,m.onchange()}),setTimeout(function(){a.data=$(b).val(),m.onchange()},0)}});var u=0;for(c=0;c<m.p.columns.length;c++){var v=void 0===m.p.columns[c].search?!0:m.p.columns[c].search,w=m.p.columns[c].hidden===!0,x=m.p.columns[c].searchoptions.searchhidden===!0;(x&&v||v&&!w)&&(l=\"\",a.field===m.p.columns[c].name&&(l=\" selected='selected'\",u=c),p+=\"<option value='\"+m.p.columns[c].name+\"'\"+l+\">\"+m.p.columns[c].label+\"</option>\")}s.append(p);var y=$(\"<td class='operators'></td>\");o.append(y),k=d.columns[u],k.searchoptions.id=$.jgrid.randId(),e&&\"text\"===k.inputtype&&(k.searchoptions.size||(k.searchoptions.size=10)),k.searchoptions.name=a.field,k.searchoptions.oper=\"filter\";var z=$.jgrid.createEl.call(n,k.inputtype,k.searchoptions,a.data,!0,m.p.ajaxSelectOptions||{},!0);(\"nu\"===a.op||\"nn\"===a.op)&&($(z).attr(\"readonly\",\"true\"),$(z).attr(\"disabled\",\"true\"));var A=$(\"<select class='selectopts \"+h.srSelect+\"'></select>\");for(y.append(A),A.bind(\"change\",function(){a.op=$(A).val(),j=$(this).parents(\"tr:first\");var b=$(\".input-elm\",j)[0];\"nu\"===a.op||\"nn\"===a.op?(a.data=\"\",\"SELECT\"!==b.tagName.toUpperCase()&&(b.value=\"\"),b.setAttribute(\"readonly\",\"true\"),b.setAttribute(\"disabled\",\"true\")):(\"SELECT\"===b.tagName.toUpperCase()&&(a.data=b.value),b.removeAttribute(\"readonly\"),b.removeAttribute(\"disabled\")),m.onchange()}),g=k.searchoptions.sopt?k.searchoptions.sopt:m.p.sopt?m.p.sopt:-1!==$.inArray(k.searchtype,m.p.strarr)?m.p.stropts:m.p.numopts,p=\"\",$.each(m.p.ops,function(){t.push(this.oper)}),c=0;c<g.length;c++)r=$.inArray(g[c],t),-1!==r&&(l=a.op===m.p.ops[r].oper?\" selected='selected'\":\"\",p+=\"<option value='\"+m.p.ops[r].oper+\"'\"+l+\">\"+m.p.ops[r].text+\"</option>\");A.append(p);var B=$(\"<td class='data'></td>\");o.append(B),B.append(z),$.jgrid.bindEv.call(n,z,k.searchoptions),$(z).addClass(\"input-elm \"+h.srInput).bind(\"change\",function(){a.data=\"custom\"===k.inputtype?k.searchoptions.custom_value.call(n,$(this).children(\".customelement:first\"),\"get\"):$(this).val(),m.onchange()});var C=$(\"<td></td>\");if(o.append(C),this.p.ruleButtons===!0){var D=$(\"<input type='button' value='-' title='Delete rule' class='delete-rule ui-del \"+i.button+\"'/>\");C.append(D),D.bind(\"click\",function(){for(c=0;c<b.rules.length;c++)if(b.rules[c]===a){b.rules.splice(c,1);break}return m.reDraw(),m.onchange(),!1})}return o},this.getStringForGroup=function(a){var b,c=\"(\";if(void 0!==a.groups)for(b=0;b<a.groups.length;b++){c.length>1&&(c+=\" \"+a.groupOp+\" \");try{c+=this.getStringForGroup(a.groups[b])}catch(d){alert(d)}}if(void 0!==a.rules)try{for(b=0;b<a.rules.length;b++)c.length>1&&(c+=\" \"+a.groupOp+\" \"),c+=this.getStringForRule(a.rules[b])}catch(e){alert(e)}return c+=\")\",\"()\"===c?\"\":c},this.getStringForRule=function(a){var b,c,e,f,g=\"\",h=\"\",i=[\"int\",\"integer\",\"float\",\"number\",\"currency\"];for(b=0;b<this.p.ops.length;b++)if(this.p.ops[b].oper===a.op){g=this.p.operands.hasOwnProperty(a.op)?this.p.operands[a.op]:\"\",h=this.p.ops[b].oper;break}for(b=0;b<this.p.columns.length;b++)if(this.p.columns[b].name===a.field){c=this.p.columns[b];break}return void 0===c?\"\":(f=a.data,(\"bw\"===h||\"bn\"===h)&&(f+=\"%\"),(\"ew\"===h||\"en\"===h)&&(f=\"%\"+f),(\"cn\"===h||\"nc\"===h)&&(f=\"%\"+f+\"%\"),(\"in\"===h||\"ni\"===h)&&(f=\" (\"+f+\")\"),d.errorcheck&&j(a.data,c),e=-1!==$.inArray(c.searchtype,i)||\"nn\"===h||\"nu\"===h?a.field+\" \"+g+\" \"+f:a.field+\" \"+g+' \"'+f+'\"')},this.resetFilter=function(){this.p.filter=$.extend(!0,{},this.p.initFilter),this.reDraw(),this.onchange()},this.hideError=function(){$(\"th.\"+i.error,this).html(\"\"),$(\"tr.error\",this).hide()},this.showError=function(){$(\"th.\"+i.error,this).html(this.p.errmsg),$(\"tr.error\",this).show()},this.toUserFriendlyString=function(){return this.getStringForGroup(d.filter)},this.toString=function(){function a(a){if(c.p.errorcheck){var b,d;for(b=0;b<c.p.columns.length;b++)if(c.p.columns[b].name===a.field){d=c.p.columns[b];break}d&&j(a.data,d)}return a.op+\"(item.\"+a.field+\",'\"+a.data+\"')\"}function b(c){var d,e=\"(\";if(void 0!==c.groups)for(d=0;d<c.groups.length;d++)e.length>1&&(e+=\"OR\"===c.groupOp?\" || \":\" && \"),e+=b(c.groups[d]);if(void 0!==c.rules)for(d=0;d<c.rules.length;d++)e.length>1&&(e+=\"OR\"===c.groupOp?\" || \":\" && \"),e+=a(c.rules[d]);return e+=\")\",\"()\"===e?\"\":e}var c=this;return b(this.p.filter)},this.reDraw(),this.p.showQuery&&this.onchange(),this.filter=!0}}})},$.extend($.fn.jqFilter,{toSQLString:function(){var a=\"\";return this.each(function(){a=this.toUserFriendlyString()}),a},filterData:function(){var a;return this.each(function(){a=this.p.filter}),a},getParameter:function(a){return void 0!==a&&this.p.hasOwnProperty(a)?this.p[a]:this.p},resetFilter:function(){return this.each(function(){this.resetFilter()})},addFilter:function(a){\"string\"==typeof a&&(a=$.jgrid.parse(a)),this.each(function(){this.p.filter=a,this.reDraw(),this.onchange()})}}),$.jgrid.extend({filterToolbar:function(a){var b=$.jgrid.getRegional(this[0],\"search\");return a=$.extend({autosearch:!0,autosearchDelay:500,searchOnEnter:!0,beforeSearch:null,afterSearch:null,beforeClear:null,afterClear:null,searchurl:\"\",stringResult:!1,groupOp:\"AND\",defaultSearch:\"bw\",searchOperators:!1,resetIcon:\"x\",operands:{eq:\"==\",ne:\"!\",lt:\"<\",le:\"<=\",gt:\">\",ge:\">=\",bw:\"^\",bn:\"!^\",\"in\":\"=\",ni:\"!=\",ew:\"|\",en:\"!@\",cn:\"~\",nc:\"!~\",nu:\"#\",nn:\"!#\"}},b,a||{}),this.each(function(){var c=this;if(!c.p.filterToolbar){$(c).data(\"filterToolbar\")||$(c).data(\"filterToolbar\",a),c.p.force_regional&&(a=$.extend(a,b));var d,e=$.jgrid.styleUI[c.p.styleUI||\"jQueryUI\"].filter,f=$.jgrid.styleUI[c.p.styleUI||\"jQueryUI\"].common,g=$.jgrid.styleUI[c.p.styleUI||\"jQueryUI\"].base,h=function(){var b,d,e,f={},g=0,h={};$.each(c.p.colModel,function(){var i=$(\"#gs_\"+c.p.idPrefix+$.jgrid.jqID(this.name),this.frozen===!0&&c.p.frozenColumns===!0?c.grid.fhDiv:c.grid.hDiv);if(d=this.index||this.name,e=a.searchOperators?i.parent().prev().children(\"a\").attr(\"soper\")||a.defaultSearch:this.searchoptions&&this.searchoptions.sopt?this.searchoptions.sopt[0]:\"select\"===this.stype?\"eq\":a.defaultSearch,b=\"custom\"===this.stype&&$.isFunction(this.searchoptions.custom_value)&&i.length>0&&\"SPAN\"===i[0].nodeName.toUpperCase()?this.searchoptions.custom_value.call(c,i.children(\".customelement:first\"),\"get\"):i.val(),b||\"nu\"===e||\"nn\"===e)f[d]=b,h[d]=e,g++;else try{delete c.p.postData[d]}catch(j){}});var i=g>0?!0:!1;if(a.stringResult===!0||\"local\"===c.p.datatype||a.searchOperators===!0){var j='{\"groupOp\":\"'+a.groupOp+'\",\"rules\":[',k=0;$.each(f,function(a,b){k>0&&(j+=\",\"),j+='{\"field\":\"'+a+'\",',j+='\"op\":\"'+h[a]+'\",',b+=\"\",j+='\"data\":\"'+b.replace(/\\\\/g,\"\\\\\\\\\").replace(/\\\"/g,'\\\\\"')+'\"}',k++}),j+=\"]}\",$.extend(c.p.postData,{filters:j}),$.each([\"searchField\",\"searchString\",\"searchOper\"],function(a,b){c.p.postData.hasOwnProperty(b)&&delete c.p.postData[b]})}else $.extend(c.p.postData,f);var l;c.p.searchurl&&(l=c.p.url,$(c).jqGrid(\"setGridParam\",{url:c.p.searchurl}));var m=\"stop\"===$(c).triggerHandler(\"jqGridToolbarBeforeSearch\")?!0:!1;!m&&$.isFunction(a.beforeSearch)&&(m=a.beforeSearch.call(c)),m||$(c).jqGrid(\"setGridParam\",{search:i}).trigger(\"reloadGrid\",[{page:1}]),l&&$(c).jqGrid(\"setGridParam\",{url:l}),$(c).triggerHandler(\"jqGridToolbarAfterSearch\"),$.isFunction(a.afterSearch)&&a.afterSearch.call(c)},i=function(b){var d,e={},f=0;b=\"boolean\"!=typeof b?!0:b,$.each(c.p.colModel,function(){var a,b=$(\"#gs_\"+c.p.idPrefix+$.jgrid.jqID(this.name),this.frozen===!0&&c.p.frozenColumns===!0?c.grid.fhDiv:c.grid.hDiv);switch(this.searchoptions&&void 0!==this.searchoptions.defaultValue&&(a=this.searchoptions.defaultValue),d=this.index||this.name,this.stype){case\"select\":if(b.find(\"option\").each(function(b){return 0===b&&(this.selected=!0),$(this).val()===a?(this.selected=!0,!1):void 0}),void 0!==a)e[d]=a,f++;else try{delete c.p.postData[d]}catch(g){}break;case\"text\":if(b.val(a||\"\"),void 0!==a)e[d]=a,f++;else try{delete c.p.postData[d]}catch(h){}break;case\"custom\":$.isFunction(this.searchoptions.custom_value)&&b.length>0&&\"SPAN\"===b[0].nodeName.toUpperCase()&&this.searchoptions.custom_value.call(c,b.children(\".customelement:first\"),\"set\",a||\"\")}});var g=f>0?!0:!1;if(c.p.resetsearch=!0,a.stringResult===!0||\"local\"===c.p.datatype){var h='{\"groupOp\":\"'+a.groupOp+'\",\"rules\":[',i=0;$.each(e,function(a,b){i>0&&(h+=\",\"),h+='{\"field\":\"'+a+'\",',h+='\"op\":\"eq\",',b+=\"\",h+='\"data\":\"'+b.replace(/\\\\/g,\"\\\\\\\\\").replace(/\\\"/g,'\\\\\"')+'\"}',i++}),h+=\"]}\",$.extend(c.p.postData,{filters:h}),$.each([\"searchField\",\"searchString\",\"searchOper\"],function(a,b){c.p.postData.hasOwnProperty(b)&&delete c.p.postData[b]})}else $.extend(c.p.postData,e);var j;c.p.searchurl&&(j=c.p.url,$(c).jqGrid(\"setGridParam\",{url:c.p.searchurl}));var k=\"stop\"===$(c).triggerHandler(\"jqGridToolbarBeforeClear\")?!0:!1;!k&&$.isFunction(a.beforeClear)&&(k=a.beforeClear.call(c)),k||b&&$(c).jqGrid(\"setGridParam\",{search:g}).trigger(\"reloadGrid\",[{page:1}]),j&&$(c).jqGrid(\"setGridParam\",{url:j}),$(c).triggerHandler(\"jqGridToolbarAfterClear\"),$.isFunction(a.afterClear)&&a.afterClear()},j=function(){var a=$(\"tr.ui-search-toolbar\",c.grid.hDiv),b=c.p.frozenColumns===!0?$(\"tr.ui-search-toolbar\",c.grid.fhDiv):!1;\"none\"===a.css(\"display\")?(a.show(),b&&b.show()):(a.hide(),b&&b.hide())},k=function(b,d,g){$(\"#sopt_menu\").remove(),d=parseInt(d,10),g=parseInt(g,10)+18;for(var i,j,k=$(\".ui-jqgrid-view\").css(\"font-size\")||\"11px\",l='<ul id=\"sopt_menu\" class=\"ui-search-menu modal-content\" role=\"menu\" tabindex=\"0\" style=\"font-size:'+k+\";left:\"+d+\"px;top:\"+g+'px;\">',m=$(b).attr(\"soper\"),n=[],o=0,p=$(b).attr(\"colname\"),q=c.p.colModel.length;q>o&&c.p.colModel[o].name!==p;)o++;var r=c.p.colModel[o],s=$.extend({},r.searchoptions);for(s.sopt||(s.sopt=[],s.sopt[0]=\"select\"===r.stype?\"eq\":a.defaultSearch),$.each(a.odata,function(){n.push(this.oper)}),o=0;o<s.sopt.length;o++)j=$.inArray(s.sopt[o],n),-1!==j&&(i=m===a.odata[j].oper?f.highlight:\"\",l+='<li class=\"ui-menu-item '+i+'\" role=\"presentation\"><a class=\"'+f.cornerall+' g-menu-item\" tabindex=\"0\" role=\"menuitem\" value=\"'+a.odata[j].oper+'\" oper=\"'+a.operands[a.odata[j].oper]+'\"><table class=\"ui-common-table\"><tr><td width=\"25px\">'+a.operands[a.odata[j].oper]+\"</td><td>\"+a.odata[j].text+\"</td></tr></table></a></li>\");l+=\"</ul>\",$(\"body\").append(l),$(\"#sopt_menu\").addClass(\"ui-menu \"+e.menu_widget),$(\"#sopt_menu > li > a\").hover(function(){$(this).addClass(f.hover)},function(){$(this).removeClass(f.hover)}).click(function(){var d=$(this).attr(\"value\"),e=$(this).attr(\"oper\");if($(c).triggerHandler(\"jqGridToolbarSelectOper\",[d,e,b]),$(\"#sopt_menu\").hide(),$(b).text(e).attr(\"soper\",d),a.autosearch===!0){var f=$(b).parent().next().children()[0];($(f).val()||\"nu\"===d||\"nn\"===d)&&h()}})},l=$(\"<tr class='ui-search-toolbar' role='row'></tr>\");$.each(c.p.colModel,function(b){var f,i,j,k,m,n,o,p=this,q=\"\",r=\"=\",s=$(\"<th role='columnheader' class='\"+g.headerBox+\" ui-th-\"+c.p.direction+\"' id='gsh_\"+c.p.id+\"_\"+p.name+\"' ></th>\"),t=$(\"<div></div>\"),u=$(\"<table class='ui-search-table' cellspacing='0'><tr><td class='ui-search-oper' headers=''></td><td class='ui-search-input' headers=''></td><td class='ui-search-clear' headers=''></td></tr></table>\");if(this.hidden===!0&&$(s).css(\"display\",\"none\"),this.search=this.search===!1?!1:!0,void 0===this.stype&&(this.stype=\"text\"),f=$.extend({},this.searchoptions||{},{name:p.index||p.name,id:\"gs_\"+c.p.idPrefix+p.name,oper:\"search\"}),this.search){if(a.searchOperators){for(i=f.sopt?f.sopt[0]:\"select\"===p.stype?\"eq\":a.defaultSearch,j=0;j<a.odata.length;j++)if(a.odata[j].oper===i){r=a.operands[i]||\"\";break}k=null!=f.searchtitle?f.searchtitle:a.operandTitle,q=\"<a title='\"+k+\"' style='padding-right: 0.5em;' soper='\"+i+\"' class='soptclass' colname='\"+this.name+\"'>\"+r+\"</a>\"}switch($(\"td:eq(0)\",u).attr(\"colindex\",b).append(q),void 0===f.clearSearch&&(f.clearSearch=!0),f.clearSearch?(m=a.resetTitle||\"Clear Search Value\",$(\"td:eq(2)\",u).append(\"<a title='\"+m+\"' style='padding-right: 0.3em;padding-left: 0.3em;' class='clearsearchclass'>\"+a.resetIcon+\"</a>\")):$(\"td:eq(2)\",u).hide(),this.surl&&(f.dataUrl=this.surl),n=\"\",f.defaultValue&&(n=$.isFunction(f.defaultValue)?f.defaultValue.call(c):f.defaultValue),o=$.jgrid.createEl.call(c,this.stype,f,n,!1,$.extend({},$.jgrid.ajaxOptions,c.p.ajaxSelectOptions||{})),$(o).css({width:\"100%\"}).addClass(e.srInput),$(\"td:eq(1)\",u).append(o),$(t).append(u),this.stype){case\"select\":a.autosearch===!0&&(f.dataEvents=[{type:\"change\",fn:function(){return h(),!1}}]);break;case\"text\":a.autosearch===!0&&(f.dataEvents=a.searchOnEnter?[{type:\"keypress\",fn:function(a){var b=a.charCode||a.keyCode||0;return 13===b?(h(),!1):this}}]:[{type:\"keydown\",fn:function(b){var c=b.which;switch(c){case 13:return!1;case 9:case 16:case 37:case 38:case 39:case 40:case 27:break;default:d&&clearTimeout(d),d=setTimeout(function(){h()},a.autosearchDelay)}}}])}$.jgrid.bindEv.call(c,o,f)}$(s).append(t),$(l).append(s),a.searchOperators||$(\"td:eq(0)\",u).hide()}),$(\"table thead\",c.grid.hDiv).append(l),a.searchOperators&&($(\".soptclass\",l).click(function(a){var b=$(this).offset(),c=b.left,d=b.top;k(this,c,d),a.stopPropagation()}),$(\"body\").on(\"click\",function(a){\"soptclass\"!==a.target.className&&$(\"#sopt_menu\").hide()})),$(\".clearsearchclass\",l).click(function(){var b=$(this).parents(\"tr:first\"),d=parseInt($(\"td.ui-search-oper\",b).attr(\"colindex\"),10),e=$.extend({},c.p.colModel[d].searchoptions||{}),f=e.defaultValue?e.defaultValue:\"\";\"select\"===c.p.colModel[d].stype?f?$(\"td.ui-search-input select\",b).val(f):$(\"td.ui-search-input select\",b)[0].selectedIndex=0:$(\"td.ui-search-input input\",b).val(f),a.autosearch===!0&&h()}),this.p.filterToolbar=!0,this.triggerToolbar=h,this.clearToolbar=i,this.toggleToolbar=j}})},destroyFilterToolbar:function(){return this.each(function(){this.p.filterToolbar&&(this.triggerToolbar=null,this.clearToolbar=null,this.toggleToolbar=null,this.p.filterToolbar=!1,$(this.grid.hDiv).find(\"table thead tr.ui-search-toolbar\").remove())})},searchGrid:function(a){var b=$.jgrid.getRegional(this[0],\"search\");return a=$.extend(!0,{recreateFilter:!1,drag:!0,sField:\"searchField\",sValue:\"searchString\",sOper:\"searchOper\",sFilter:\"filters\",loadDefaults:!0,beforeShowSearch:null,afterShowSearch:null,onInitializeSearch:null,afterRedraw:null,afterChange:null,sortStrategy:null,closeAfterSearch:!1,closeAfterReset:!1,closeOnEscape:!1,searchOnEnter:!1,multipleSearch:!1,multipleGroup:!1,top:0,left:0,jqModal:!0,modal:!1,resize:!0,width:450,height:\"auto\",dataheight:\"auto\",showQuery:!1,errorcheck:!0,sopt:null,stringResult:void 0,onClose:null,onSearch:null,onReset:null,toTop:!0,overlay:30,columns:[],tmplNames:null,tmplFilters:null,tmplLabel:\" Template: \",showOnLoad:!1,layer:null,operands:{eq:\"=\",ne:\"<>\",lt:\"<\",le:\"<=\",gt:\">\",ge:\">=\",bw:\"LIKE\",bn:\"NOT LIKE\",\"in\":\"IN\",ni:\"NOT IN\",ew:\"LIKE\",en:\"NOT LIKE\",cn:\"LIKE\",nc:\"NOT LIKE\",nu:\"IS NULL\",nn:\"ISNOT NULL\"}},b,a||{}),this.each(function(){function b(b){f=$(c).triggerHandler(\"jqGridFilterBeforeShow\",[b]),void 0===f&&(f=!0),f&&$.isFunction(a.beforeShowSearch)&&(f=a.beforeShowSearch.call(c,b)),f&&($.jgrid.viewModal(\"#\"+$.jgrid.jqID(h.themodal),{gbox:\"#gbox_\"+$.jgrid.jqID(e),jqm:a.jqModal,modal:a.modal,overlay:a.overlay,toTop:a.toTop}),$(c).triggerHandler(\"jqGridFilterAfterShow\",[b]),$.isFunction(a.afterShowSearch)&&a.afterShowSearch.call(c,b))}var c=this;if(c.grid){var d,e=\"fbox_\"+c.p.id,f=!0,g=!0,h={themodal:\"searchmod\"+e,modalhead:\"searchhd\"+e,modalcontent:\"searchcnt\"+e,scrollelm:e},i=c.p.postData[a.sFilter],j=$.jgrid.styleUI[c.p.styleUI||\"jQueryUI\"].filter,k=$.jgrid.styleUI[c.p.styleUI||\"jQueryUI\"].common;if(a.styleUI=c.p.styleUI,\"string\"==typeof i&&(i=$.jgrid.parse(i)),a.recreateFilter===!0&&$(\"#\"+$.jgrid.jqID(h.themodal)).remove(),void 0!==$(\"#\"+$.jgrid.jqID(h.themodal))[0])b($(\"#fbox_\"+$.jgrid.jqID(c.p.id)));else{var l=$(\"<div><div id='\"+e+\"' class='searchFilter' style='overflow:auto'></div></div>\").insertBefore(\"#gview_\"+$.jgrid.jqID(c.p.id)),m=\"left\",n=\"\";\"rtl\"===c.p.direction&&(m=\"right\",n=\" style='text-align:left'\",l.attr(\"dir\",\"rtl\"));var o,p,q=$.extend([],c.p.colModel),r=\"<a id='\"+e+\"_search' class='fm-button \"+k.button+\" fm-button-icon-right ui-search'><span class='\"+k.icon_base+\" \"+j.icon_search+\"'></span>\"+a.Find+\"</a>\",s=\"<a id='\"+e+\"_reset' class='fm-button \"+k.button+\" fm-button-icon-left ui-reset'><span class='\"+k.icon_base+\" \"+j.icon_reset+\"'></span>\"+a.Reset+\"</a>\",t=\"\",u=\"\",v=!1,w=-1;if(a.showQuery&&(t=\"<a id='\"+e+\"_query' class='fm-button \"+k.button+\" fm-button-icon-left'><span class='\"+k.icon_base+\" \"+j.icon_query+\"'></span>Query</a>\"),a.columns.length?(q=a.columns,w=0,o=q[0].index||q[0].name):$.each(q,function(a,b){if(b.label||(b.label=c.p.colNames[a]),!v){var d=void 0===b.search?!0:b.search,e=b.hidden===!0,f=b.searchoptions&&b.searchoptions.searchhidden===!0;(f&&d||d&&!e)&&(v=!0,o=b.index||b.name,w=a)}}),!i&&o||a.multipleSearch===!1){var x=\"eq\";w>=0&&q[w].searchoptions&&q[w].searchoptions.sopt?x=q[w].searchoptions.sopt[0]:a.sopt&&a.sopt.length&&(x=a.sopt[0]),i={groupOp:\"AND\",rules:[{field:o,op:x,data:\"\"}]}}v=!1,a.tmplNames&&a.tmplNames.length&&(v=!0,u=\"<tr><td class='ui-search-label'>\"+a.tmplLabel+\"</td>\",u+=\"<td><select class='ui-template \"+j.srSelect+\"'>\",u+=\"<option value='default'>Default</option>\",$.each(a.tmplNames,function(a,b){u+=\"<option value='\"+a+\"'>\"+b+\"</option>\"}),u+=\"</select></td></tr>\"),p=\"<table class='EditTable' style='border:0px none;margin-top:5px' id='\"+e+\"_2'><tbody><tr><td colspan='2'><hr class='\"+k.content+\"' style='margin:1px'/></td></tr>\"+u+\"<tr><td class='EditButton' style='text-align:\"+m+\"'>\"+s+\"</td><td class='EditButton' \"+n+\">\"+t+r+\"</td></tr></tbody></table>\",e=$.jgrid.jqID(e),$(\"#\"+e).jqFilter({columns:q,sortStrategy:a.sortStrategy,filter:a.loadDefaults?i:null,showQuery:a.showQuery,errorcheck:a.errorcheck,sopt:a.sopt,groupButton:a.multipleGroup,ruleButtons:a.multipleSearch,afterRedraw:a.afterRedraw,ops:a.odata,operands:a.operands,ajaxSelectOptions:c.p.ajaxSelectOptions,groupOps:a.groupOps,onChange:function(){this.p.showQuery&&$(\".query\",this).html(this.toUserFriendlyString()),$.isFunction(a.afterChange)&&a.afterChange.call(c,$(\"#\"+e),a)},direction:c.p.direction,id:c.p.id}),l.append(p),v&&a.tmplFilters&&a.tmplFilters.length&&$(\".ui-template\",l).bind(\"change\",function(){var b=$(this).val();return\"default\"===b?$(\"#\"+e).jqFilter(\"addFilter\",i):$(\"#\"+e).jqFilter(\"addFilter\",a.tmplFilters[parseInt(b,10)]),!1}),a.multipleGroup===!0&&(a.multipleSearch=!0),$(c).triggerHandler(\"jqGridFilterInitialize\",[$(\"#\"+e)]),$.isFunction(a.onInitializeSearch)&&a.onInitializeSearch.call(c,$(\"#\"+e)),a.gbox=\"#gbox_\"+e,a.layer?$.jgrid.createModal(h,l,a,\"#gview_\"+$.jgrid.jqID(c.p.id),$(\"#gbox_\"+$.jgrid.jqID(c.p.id))[0],\"#\"+$.jgrid.jqID(a.layer),{position:\"relative\"}):$.jgrid.createModal(h,l,a,\"#gview_\"+$.jgrid.jqID(c.p.id),$(\"#gbox_\"+$.jgrid.jqID(c.p.id))[0]),(a.searchOnEnter||a.closeOnEscape)&&$(\"#\"+$.jgrid.jqID(h.themodal)).keydown(function(b){var c=$(b.target);return!a.searchOnEnter||13!==b.which||c.hasClass(\"add-group\")||c.hasClass(\"add-rule\")||c.hasClass(\"delete-group\")||c.hasClass(\"delete-rule\")||c.hasClass(\"fm-button\")&&c.is(\"[id$=_query]\")?a.closeOnEscape&&27===b.which?($(\"#\"+$.jgrid.jqID(h.modalhead)).find(\".ui-jqdialog-titlebar-close\").click(),!1):void 0:($(\"#\"+e+\"_search\").click(),!1)}),t&&$(\"#\"+e+\"_query\").bind(\"click\",function(){return $(\".queryresult\",l).toggle(),!1}),void 0===a.stringResult&&(a.stringResult=a.multipleSearch),$(\"#\"+e+\"_search\").bind(\"click\",function(){var b,f,i={};if(d=$(\"#\"+e),d.find(\".input-elm:focus\").change(),f=d.jqFilter(\"filterData\"),a.errorcheck&&(d[0].hideError(),a.showQuery||d.jqFilter(\"toSQLString\"),d[0].p.error))return d[0].showError(),!1;if(a.stringResult){try{b=JSON.stringify(f)}catch(j){}\"string\"==typeof b&&(i[a.sFilter]=b,$.each([a.sField,a.sValue,a.sOper],function(){i[this]=\"\"}))}else a.multipleSearch?(i[a.sFilter]=f,$.each([a.sField,a.sValue,a.sOper],function(){i[this]=\"\"\n})):(i[a.sField]=f.rules[0].field,i[a.sValue]=f.rules[0].data,i[a.sOper]=f.rules[0].op,i[a.sFilter]=\"\");return c.p.search=!0,$.extend(c.p.postData,i),g=$(c).triggerHandler(\"jqGridFilterSearch\"),void 0===g&&(g=!0),g&&$.isFunction(a.onSearch)&&(g=a.onSearch.call(c,c.p.filters)),g!==!1&&$(c).trigger(\"reloadGrid\",[{page:1}]),a.closeAfterSearch&&$.jgrid.hideModal(\"#\"+$.jgrid.jqID(h.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(c.p.id),jqm:a.jqModal,onClose:a.onClose}),!1}),$(\"#\"+e+\"_reset\").bind(\"click\",function(){var b={},d=$(\"#\"+e);return c.p.search=!1,c.p.resetsearch=!0,a.multipleSearch===!1?b[a.sField]=b[a.sValue]=b[a.sOper]=\"\":b[a.sFilter]=\"\",d[0].resetFilter(),v&&$(\".ui-template\",l).val(\"default\"),$.extend(c.p.postData,b),g=$(c).triggerHandler(\"jqGridFilterReset\"),void 0===g&&(g=!0),g&&$.isFunction(a.onReset)&&(g=a.onReset.call(c)),g!==!1&&$(c).trigger(\"reloadGrid\",[{page:1}]),a.closeAfterReset&&$.jgrid.hideModal(\"#\"+$.jgrid.jqID(h.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(c.p.id),jqm:a.jqModal,onClose:a.onClose}),!1}),b($(\"#\"+e)),$(\".fm-button:not(.\"+k.disabled+\")\",l).hover(function(){$(this).addClass(k.hover)},function(){$(this).removeClass(k.hover)})}}})}});var rp_ge={};if($.jgrid.extend({editGridRow:function(a,b){var c=$.jgrid.getRegional(this[0],\"edit\"),d=this[0].p.styleUI,e=$.jgrid.styleUI[d].formedit,f=$.jgrid.styleUI[d].common;return b=$.extend(!0,{top:0,left:0,width:\"500\",datawidth:\"auto\",height:\"auto\",dataheight:\"auto\",modal:!1,overlay:30,drag:!0,resize:!0,url:null,mtype:\"POST\",clearAfterAdd:!0,closeAfterEdit:!1,reloadAfterSubmit:!0,onInitializeForm:null,beforeInitData:null,beforeShowForm:null,afterShowForm:null,beforeSubmit:null,afterSubmit:null,onclickSubmit:null,afterComplete:null,onclickPgButtons:null,afterclickPgButtons:null,editData:{},recreateForm:!1,jqModal:!0,closeOnEscape:!1,addedrow:\"first\",topinfo:\"\",bottominfo:\"\",saveicon:[],closeicon:[],savekey:[!1,13],navkeys:[!1,38,40],checkOnSubmit:!1,checkOnUpdate:!1,_savedData:{},processing:!1,onClose:null,ajaxEditOptions:{},serializeEditData:null,viewPagerButtons:!0,overlayClass:f.overlay,removemodal:!0,form:\"edit\",template:null,focusField:!0},c,b||{}),rp_ge[$(this)[0].p.id]=b,this.each(function(){function c(){return $(x).find(\".FormElement\").each(function(){var a=$(\".customelement\",this);if(a.length){var b=a[0],c=$(b).attr(\"name\");$.each(p.p.colModel,function(){if(this.name===c&&this.editoptions&&$.isFunction(this.editoptions.custom_value)){try{if(r[c]=this.editoptions.custom_value.call(p,$(\"#\"+$.jgrid.jqID(c),x),\"get\"),void 0===r[c])throw\"e1\"}catch(a){\"e1\"===a?$.jgrid.info_dialog(D.errcap,\"function 'custom_value' \"+rp_ge[$(this)[0]].p.msg.novalue,rp_ge[$(this)[0]].p.bClose,{styleUI:rp_ge[$(this)[0]].p.styleUI}):$.jgrid.info_dialog(D.errcap,a.message,rp_ge[$(this)[0]].p.bClose,{styleUI:rp_ge[$(this)[0]].p.styleUI})}return!0}})}else{switch($(this).get(0).type){case\"checkbox\":if($(this).is(\":checked\"))r[this.name]=$(this).val();else{var d=$(this).attr(\"offval\");r[this.name]=d}break;case\"select-one\":r[this.name]=$(\"option:selected\",this).val();break;case\"select-multiple\":r[this.name]=$(this).val(),r[this.name]=r[this.name]?r[this.name].join(\",\"):\"\";var e=[];$(\"option:selected\",this).each(function(a,b){e[a]=$(b).text()});break;case\"password\":case\"text\":case\"textarea\":case\"button\":r[this.name]=$(this).val()}p.p.autoencode&&(r[this.name]=$.jgrid.htmlEncode(r[this.name]))}}),!0}function d(a,b,c,d){var f,g,h,i,j,k,l,m=0,n=[],o=!1,q=\"<td class='CaptionTD'>&#160;</td><td class='DataTD'>&#160;</td>\",r=\"\";for(l=1;d>=l;l++)r+=q;if(\"_empty\"!==a&&(o=$(b).jqGrid(\"getInd\",a)),$(b.p.colModel).each(function(l){if(f=this.name,g=this.editrules&&this.editrules.edithidden===!0?!1:this.hidden===!0?!0:!1,j=g?\"style='display:none'\":\"\",\"cb\"!==f&&\"subgrid\"!==f&&this.editable===!0&&\"rn\"!==f){if(o===!1)i=\"\";else if(f===b.p.ExpandColumn&&b.p.treeGrid===!0)i=$(\"td[role='gridcell']:eq(\"+l+\")\",b.rows[o]).text();else{try{i=$.unformat.call(b,$(\"td[role='gridcell']:eq(\"+l+\")\",b.rows[o]),{rowId:a,colModel:this},l)}catch(q){i=this.edittype&&\"textarea\"===this.edittype?$(\"td[role='gridcell']:eq(\"+l+\")\",b.rows[o]).text():$(\"td[role='gridcell']:eq(\"+l+\")\",b.rows[o]).html()}(!i||\"&nbsp;\"===i||\"&#160;\"===i||1===i.length&&160===i.charCodeAt(0))&&(i=\"\")}var s=$.extend({},this.editoptions||{},{id:f,name:f,rowId:a,oper:\"edit\"}),t=$.extend({},{elmprefix:\"\",elmsuffix:\"\",rowabove:!1,rowcontent:\"\"},this.formoptions||{}),u=parseInt(t.rowpos,10)||m+1,w=parseInt(2*(parseInt(t.colpos,10)||1),10);if(\"_empty\"===a&&s.defaultValue&&(i=$.isFunction(s.defaultValue)?s.defaultValue.call(p):s.defaultValue),this.edittype||(this.edittype=\"text\"),p.p.autoencode&&(i=$.jgrid.htmlDecode(i)),k=$.jgrid.createEl.call(p,this.edittype,s,i,!1,$.extend({},$.jgrid.ajaxOptions,b.p.ajaxSelectOptions||{})),\"select\"===this.edittype&&(i=$(k).val(),\"select-multiple\"===$(k).get(0).type&&i&&(i=i.join(\",\"))),\"checkbox\"===this.edittype&&(i=$(k).is(\":checked\")?$(k).val():$(k).attr(\"offval\")),(rp_ge[p.p.id].checkOnSubmit||rp_ge[p.p.id].checkOnUpdate)&&(rp_ge[p.p.id]._savedData[f]=i),$(k).addClass(\"FormElement\"),$.inArray(this.edittype,[\"text\",\"textarea\",\"password\",\"select\"])>-1&&$(k).addClass(e.inputClass),C)$(I).find(\"#\"+f).replaceWith(k);else{if(h=$(c).find(\"tr[rowpos=\"+u+\"]\"),t.rowabove){var x=$(\"<tr><td class='contentinfo' colspan='\"+2*d+\"'>\"+t.rowcontent+\"</td></tr>\");$(c).append(x),x[0].rp=u}0===h.length&&(h=$(\"<tr \"+j+\" rowpos='\"+u+\"'></tr>\").addClass(\"FormData\").attr(\"id\",\"tr_\"+f),$(h).append(r),$(c).append(h),h[0].rp=u),$(\"td:eq(\"+(w-2)+\")\",h[0]).html(\"<label for='\"+f+\"'>\"+(void 0===t.label?b.p.colNames[l]:t.label)+\"</label>\"),$(\"td:eq(\"+(w-1)+\")\",h[0]).append(t.elmprefix).append(k).append(t.elmsuffix)}\"custom\"===this.edittype&&$.isFunction(s.custom_value)&&s.custom_value.call(p,$(\"#\"+f,v),\"set\",i),$.jgrid.bindEv.call(p,k,s),n[m]=l,m++}}),m>0){var s;C?(s=\"<div class='FormData' style='display:none'><input class='FormElement' id='id_g' type='text' name='\"+b.p.id+\"_id' value='\"+a+\"'/>\",$(I).append(s)):(s=$(\"<tr class='FormData' style='display:none'><td class='CaptionTD'></td><td colspan='\"+(2*d-1)+\"' class='DataTD'><input class='FormElement' id='id_g' type='text' name='\"+b.p.id+\"_id' value='\"+a+\"'/></td></tr>\"),s[0].rp=m+999,$(c).append(s)),(rp_ge[p.p.id].checkOnSubmit||rp_ge[p.p.id].checkOnUpdate)&&(rp_ge[p.p.id]._savedData[b.p.id+\"_id\"]=a)}return n}function g(a,b,c){var d,e,f,g,h,i,j=0;(rp_ge[p.p.id].checkOnSubmit||rp_ge[p.p.id].checkOnUpdate)&&(rp_ge[p.p.id]._savedData={},rp_ge[p.p.id]._savedData[b.p.id+\"_id\"]=a);var k=b.p.colModel;if(\"_empty\"===a)return $(k).each(function(){d=this.name,g=$.extend({},this.editoptions||{}),f=$(\"#\"+$.jgrid.jqID(d),c),f&&f.length&&null!==f[0]&&(h=\"\",\"custom\"===this.edittype&&$.isFunction(g.custom_value)?g.custom_value.call(p,$(\"#\"+d,c),\"set\",h):g.defaultValue?(h=$.isFunction(g.defaultValue)?g.defaultValue.call(p):g.defaultValue,\"checkbox\"===f[0].type?(i=h.toLowerCase(),i.search(/(false|f|0|no|n|off|undefined)/i)<0&&\"\"!==i?(f[0].checked=!0,f[0].defaultChecked=!0,f[0].value=h):(f[0].checked=!1,f[0].defaultChecked=!1)):f.val(h)):\"checkbox\"===f[0].type?(f[0].checked=!1,f[0].defaultChecked=!1,h=$(f).attr(\"offval\")):f[0].type&&\"select\"===f[0].type.substr(0,6)?f[0].selectedIndex=0:f.val(h),(rp_ge[p.p.id].checkOnSubmit===!0||rp_ge[p.p.id].checkOnUpdate)&&(rp_ge[p.p.id]._savedData[d]=h))}),void $(\"#id_g\",c).val(a);var l=$(b).jqGrid(\"getInd\",a,!0);l&&($('td[role=\"gridcell\"]',l).each(function(f){if(d=k[f].name,\"cb\"!==d&&\"subgrid\"!==d&&\"rn\"!==d&&k[f].editable===!0){if(d===b.p.ExpandColumn&&b.p.treeGrid===!0)e=$(this).text();else try{e=$.unformat.call(b,$(this),{rowId:a,colModel:k[f]},f)}catch(g){e=\"textarea\"===k[f].edittype?$(this).text():$(this).html()}switch(p.p.autoencode&&(e=$.jgrid.htmlDecode(e)),(rp_ge[p.p.id].checkOnSubmit===!0||rp_ge[p.p.id].checkOnUpdate)&&(rp_ge[p.p.id]._savedData[d]=e),d=$.jgrid.jqID(d),k[f].edittype){case\"password\":case\"text\":case\"button\":case\"image\":case\"textarea\":(\"&nbsp;\"===e||\"&#160;\"===e||1===e.length&&160===e.charCodeAt(0))&&(e=\"\"),$(\"#\"+d,c).val(e);break;case\"select\":var h=e.split(\",\");h=$.map(h,function(a){return $.trim(a)}),$(\"#\"+d+\" option\",c).each(function(){this.selected=k[f].editoptions.multiple||$.trim(e)!==$.trim($(this).text())&&h[0]!==$.trim($(this).text())&&h[0]!==$.trim($(this).val())?k[f].editoptions.multiple&&($.inArray($.trim($(this).text()),h)>-1||$.inArray($.trim($(this).val()),h)>-1)?!0:!1:!0}),(rp_ge[p.p.id].checkOnSubmit===!0||rp_ge[p.p.id].checkOnUpdate)&&(e=$(\"#\"+d,c).val(),k[f].editoptions.multiple&&(e=e.join(\",\")),rp_ge[p.p.id]._savedData[d]=e);break;case\"checkbox\":if(e=String(e),k[f].editoptions&&k[f].editoptions.value){var i=k[f].editoptions.value.split(\":\");$(\"#\"+d,c)[p.p.useProp?\"prop\":\"attr\"](i[0]===e?{checked:!0,defaultChecked:!0}:{checked:!1,defaultChecked:!1})}else e=e.toLowerCase(),e.search(/(false|f|0|no|n|off|undefined)/i)<0&&\"\"!==e?($(\"#\"+d,c)[p.p.useProp?\"prop\":\"attr\"](\"checked\",!0),$(\"#\"+d,c)[p.p.useProp?\"prop\":\"attr\"](\"defaultChecked\",!0)):($(\"#\"+d,c)[p.p.useProp?\"prop\":\"attr\"](\"checked\",!1),$(\"#\"+d,c)[p.p.useProp?\"prop\":\"attr\"](\"defaultChecked\",!1));(rp_ge[p.p.id].checkOnSubmit===!0||rp_ge[p.p.id].checkOnUpdate)&&(e=$(\"#\"+d,c).is(\":checked\")?$(\"#\"+d,c).val():$(\"#\"+d,c).attr(\"offval\"));break;case\"custom\":try{if(!k[f].editoptions||!$.isFunction(k[f].editoptions.custom_value))throw\"e1\";k[f].editoptions.custom_value.call(p,$(\"#\"+d,c),\"set\",e)}catch(l){\"e1\"===l?$.jgrid.info_dialog(D.errcap,\"function 'custom_value' \"+rp_ge[$(this)[0]].p.msg.nodefined,$.rp_ge[$(this)[0]].p.bClose,{styleUI:rp_ge[$(this)[0]].p.styleUI}):$.jgrid.info_dialog(D.errcap,l.message,$.rp_ge[$(this)[0]].p.bClose,{styleUI:rp_ge[$(this)[0]].p.styleUI})}}j++}}),j>0&&$(\"#id_g\",x).val(a))}function h(){$.each(p.p.colModel,function(a,b){b.editoptions&&b.editoptions.NullIfEmpty===!0&&r.hasOwnProperty(b.name)&&\"\"===r[b.name]&&(r[b.name]=\"null\")})}function i(){var a,c,d,e,i,j,k,l=[!0,\"\",\"\"],m={},n=p.p.prmNames,o=$(p).triggerHandler(\"jqGridAddEditBeforeCheckValues\",[$(v),t]);o&&\"object\"==typeof o&&(r=o),$.isFunction(rp_ge[p.p.id].beforeCheckValues)&&(o=rp_ge[p.p.id].beforeCheckValues.call(p,r,$(v),t),o&&\"object\"==typeof o&&(r=o));for(e in r)if(r.hasOwnProperty(e)&&(l=$.jgrid.checkValues.call(p,r[e],e),l[0]===!1))break;if(h(),l[0]&&(m=$(p).triggerHandler(\"jqGridAddEditClickSubmit\",[rp_ge[p.p.id],r,t]),void 0===m&&$.isFunction(rp_ge[p.p.id].onclickSubmit)&&(m=rp_ge[p.p.id].onclickSubmit.call(p,rp_ge[p.p.id],r,t)||{}),l=$(p).triggerHandler(\"jqGridAddEditBeforeSubmit\",[r,$(v),t]),void 0===l&&(l=[!0,\"\",\"\"]),l[0]&&$.isFunction(rp_ge[p.p.id].beforeSubmit)&&(l=rp_ge[p.p.id].beforeSubmit.call(p,r,$(v),t))),l[0]&&!rp_ge[p.p.id].processing){if(rp_ge[p.p.id].processing=!0,$(\"#sData\",x+\"_2\").addClass(f.active),k=rp_ge[p.p.id].url||$(p).jqGrid(\"getGridParam\",\"editurl\"),d=n.oper,c=\"clientArray\"===k?p.p.keyName:n.id,r[d]=\"_empty\"===$.trim(r[p.p.id+\"_id\"])?n.addoper:n.editoper,r[d]!==n.addoper?r[c]=r[p.p.id+\"_id\"]:void 0===r[c]&&(r[c]=r[p.p.id+\"_id\"]),delete r[p.p.id+\"_id\"],r=$.extend(r,rp_ge[p.p.id].editData,m),p.p.treeGrid===!0){if(r[d]===n.addoper){i=$(p).jqGrid(\"getGridParam\",\"selrow\");var q=\"adjacency\"===p.p.treeGridModel?p.p.treeReader.parent_id_field:\"parent_id\";r[q]=i}for(j in p.p.treeReader)if(p.p.treeReader.hasOwnProperty(j)){var s=p.p.treeReader[j];if(r.hasOwnProperty(s)){if(r[d]===n.addoper&&\"parent_id_field\"===j)continue;delete r[s]}}}r[c]=$.jgrid.stripPref(p.p.idPrefix,r[c]);var w=$.extend({url:k,type:rp_ge[p.p.id].mtype,data:$.isFunction(rp_ge[p.p.id].serializeEditData)?rp_ge[p.p.id].serializeEditData.call(p,r):r,complete:function(e,h){var j;if($(\"#sData\",x+\"_2\").removeClass(f.active),r[c]=p.p.idPrefix+r[c],e.status>=300&&304!==e.status?(l[0]=!1,l[1]=$(p).triggerHandler(\"jqGridAddEditErrorTextFormat\",[e,t]),l[1]=$.isFunction(rp_ge[p.p.id].errorTextFormat)?rp_ge[p.p.id].errorTextFormat.call(p,e,t):h+\" Status: '\"+e.statusText+\"'. Error code: \"+e.status):(l=$(p).triggerHandler(\"jqGridAddEditAfterSubmit\",[e,r,t]),void 0===l&&(l=[!0,\"\",\"\"]),l[0]&&$.isFunction(rp_ge[p.p.id].afterSubmit)&&(l=rp_ge[p.p.id].afterSubmit.call(p,e,r,t))),l[0]===!1)$(\".FormError\",v).html(l[1]),$(\".FormError\",v).show();else if(p.p.autoencode&&$.each(r,function(a,b){r[a]=$.jgrid.htmlDecode(b)}),r[d]===n.addoper?(l[2]||(l[2]=$.jgrid.randId()),null==r[c]||\"_empty\"===r[c]?r[c]=l[2]:l[2]=r[c],rp_ge[p.p.id].reloadAfterSubmit?$(p).trigger(\"reloadGrid\"):p.p.treeGrid===!0?$(p).jqGrid(\"addChildNode\",l[2],i,r):$(p).jqGrid(\"addRowData\",l[2],r,b.addedrow),rp_ge[p.p.id].closeAfterAdd?(p.p.treeGrid!==!0&&$(p).jqGrid(\"setSelection\",l[2]),$.jgrid.hideModal(\"#\"+$.jgrid.jqID(y.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(u),jqm:b.jqModal,onClose:rp_ge[p.p.id].onClose,removemodal:rp_ge[p.p.id].removemodal,formprop:!rp_ge[p.p.id].recreateForm,form:rp_ge[p.p.id].form})):rp_ge[p.p.id].clearAfterAdd&&g(\"_empty\",p,v)):(rp_ge[p.p.id].reloadAfterSubmit?($(p).trigger(\"reloadGrid\"),rp_ge[p.p.id].closeAfterEdit||setTimeout(function(){$(p).jqGrid(\"setSelection\",r[c])},1e3)):p.p.treeGrid===!0?$(p).jqGrid(\"setTreeRow\",r[c],r):$(p).jqGrid(\"setRowData\",r[c],r),rp_ge[p.p.id].closeAfterEdit&&$.jgrid.hideModal(\"#\"+$.jgrid.jqID(y.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(u),jqm:b.jqModal,onClose:rp_ge[p.p.id].onClose,removemodal:rp_ge[p.p.id].removemodal,formprop:!rp_ge[p.p.id].recreateForm,form:rp_ge[p.p.id].form})),$.isFunction(rp_ge[p.p.id].afterComplete)&&(a=e,setTimeout(function(){$(p).triggerHandler(\"jqGridAddEditAfterComplete\",[a,r,$(v),t]),rp_ge[p.p.id].afterComplete.call(p,a,r,$(v),t),a=null},500)),(rp_ge[p.p.id].checkOnSubmit||rp_ge[p.p.id].checkOnUpdate)&&($(v).data(\"disabled\",!1),\"_empty\"!==rp_ge[p.p.id]._savedData[p.p.id+\"_id\"]))for(j in rp_ge[p.p.id]._savedData)rp_ge[p.p.id]._savedData.hasOwnProperty(j)&&r[j]&&(rp_ge[p.p.id]._savedData[j]=r[j]);rp_ge[p.p.id].processing=!1;try{$(\":input:visible\",v)[0].focus()}catch(k){}}},$.jgrid.ajaxOptions,rp_ge[p.p.id].ajaxEditOptions);if(w.url||rp_ge[p.p.id].useDataProxy||($.isFunction(p.p.dataProxy)?rp_ge[p.p.id].useDataProxy=!0:(l[0]=!1,l[1]+=\" \"+D.nourl)),l[0])if(rp_ge[p.p.id].useDataProxy){var z=p.p.dataProxy.call(p,w,\"set_\"+p.p.id);void 0===z&&(z=[!0,\"\"]),z[0]===!1?(l[0]=!1,l[1]=z[1]||\"Error deleting the selected row!\"):(w.data.oper===n.addoper&&rp_ge[p.p.id].closeAfterAdd&&$.jgrid.hideModal(\"#\"+$.jgrid.jqID(y.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(u),jqm:b.jqModal,onClose:rp_ge[p.p.id].onClose,removemodal:rp_ge[p.p.id].removemodal,formprop:!rp_ge[p.p.id].recreateForm,form:rp_ge[p.p.id].form}),w.data.oper===n.editoper&&rp_ge[p.p.id].closeAfterEdit&&$.jgrid.hideModal(\"#\"+$.jgrid.jqID(y.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(u),jqm:b.jqModal,onClose:rp_ge[p.p.id].onClose,removemodal:rp_ge[p.p.id].removemodal,formprop:!rp_ge[p.p.id].recreateForm,form:rp_ge[p.p.id].form}))}else\"clientArray\"===w.url?(rp_ge[p.p.id].reloadAfterSubmit=!1,r=w.data,w.complete({status:200,statusText:\"\"},\"\")):$.ajax(w)}l[0]===!1&&($(\".FormError\",v).html(l[1]),$(\".FormError\",v).show())}function j(a,b){var c,d=!1;for(c in a)if(a.hasOwnProperty(c)&&a[c]!=b[c]){d=!0;break}return d}function k(){var a=!0;return $(\".FormError\",v).hide(),rp_ge[p.p.id].checkOnUpdate&&(r={},c(),s=j(r,rp_ge[p.p.id]._savedData),s&&($(v).data(\"disabled\",!0),$(\".confirm\",\"#\"+y.themodal).show(),a=!1)),a}function l(){var b;if(\"_empty\"!==a&&void 0!==p.p.savedRow&&p.p.savedRow.length>0&&$.isFunction($.fn.jqGrid.restoreRow))for(b=0;b<p.p.savedRow.length;b++)if(p.p.savedRow[b].id===a){$(p).jqGrid(\"restoreRow\",a);break}}function m(a,b){var c=b[1].length-1;0===a?$(\"#pData\",q).addClass(f.disabled):void 0!==b[1][a-1]&&$(\"#\"+$.jgrid.jqID(b[1][a-1])).hasClass(f.disabled)?$(\"#pData\",q).addClass(f.disabled):$(\"#pData\",q).removeClass(f.disabled),a===c?$(\"#nData\",q).addClass(f.disabled):void 0!==b[1][a+1]&&$(\"#\"+$.jgrid.jqID(b[1][a+1])).hasClass(f.disabled)?$(\"#nData\",q).addClass(f.disabled):$(\"#nData\",q).removeClass(f.disabled)}function n(){var a=$(p).jqGrid(\"getDataIDs\"),b=$(\"#id_g\",x).val(),c=$.inArray(b,a);return[c,a]}function o(a){var b=\"\";return\"string\"==typeof a&&(b=a.replace(/\\{([\\w\\-]+)(?:\\:([\\w\\.]*)(?:\\((.*?)?\\))?)?\\}/g,function(a,b){return'<span id=\"'+b+'\" ></span>'})),b}var p=this;if(p.grid&&a){var q,r,s,t,u=p.p.id,v=\"FrmGrid_\"+u,w=\"TblGrid_\"+u,x=\"#\"+$.jgrid.jqID(w),y={themodal:\"editmod\"+u,modalhead:\"edithd\"+u,modalcontent:\"editcnt\"+u,scrollelm:v},z=!0,A=1,B=0,C=\"string\"==typeof rp_ge[p.p.id].template&&rp_ge[p.p.id].template.length>0,D=$.jgrid.getRegional(this,\"errors\");rp_ge[p.p.id].styleUI=p.p.styleUI||\"jQueryUI\",$.jgrid.isMobile()&&(rp_ge[p.p.id].resize=!1),\"new\"===a?(a=\"_empty\",t=\"add\",b.caption=rp_ge[p.p.id].addCaption):(b.caption=rp_ge[p.p.id].editCaption,t=\"edit\"),b.recreateForm||$(p).data(\"formProp\")&&$.extend(rp_ge[$(this)[0].p.id],$(p).data(\"formProp\"));var E=!0;b.checkOnUpdate&&b.jqModal&&!b.modal&&(E=!1);var F,G=isNaN(rp_ge[$(this)[0].p.id].dataheight)?rp_ge[$(this)[0].p.id].dataheight:rp_ge[$(this)[0].p.id].dataheight+\"px\",H=isNaN(rp_ge[$(this)[0].p.id].datawidth)?rp_ge[$(this)[0].p.id].datawidth:rp_ge[$(this)[0].p.id].datawidth+\"px\",I=$(\"<form name='FormPost' id='\"+v+\"' class='FormGrid' onSubmit='return false;' style='width:\"+H+\";height:\"+G+\";'></form>\").data(\"disabled\",!1);if(C?(F=o(rp_ge[$(this)[0].p.id].template),q=x):(F=$(\"<table id='\"+w+\"' class='EditTable ui-common-table'><tbody></tbody></table>\"),q=x+\"_2\"),v=\"#\"+$.jgrid.jqID(v),$(I).append(\"<div class='FormError \"+f.error+\"' style='display:none;'></div>\"),$(I).append(\"<div class='tinfo topinfo'>\"+rp_ge[p.p.id].topinfo+\"</div>\"),$(p.p.colModel).each(function(){var a=this.formoptions;A=Math.max(A,a?a.colpos||0:0),B=Math.max(B,a?a.rowpos||0:0)}),$(I).append(F),z=$(p).triggerHandler(\"jqGridAddEditBeforeInitData\",[I,t]),void 0===z&&(z=!0),z&&$.isFunction(rp_ge[p.p.id].beforeInitData)&&(z=rp_ge[p.p.id].beforeInitData.call(p,I,t)),z!==!1){l(),d(a,p,F,A);var J=\"rtl\"===p.p.direction?!0:!1,K=J?\"nData\":\"pData\",L=J?\"pData\":\"nData\",M=\"<a id='\"+K+\"' class='fm-button \"+f.button+\"'><span class='\"+f.icon_base+\" \"+e.icon_prev+\"'></span></a>\",N=\"<a id='\"+L+\"' class='fm-button \"+f.button+\"'><span class='\"+f.icon_base+\" \"+e.icon_next+\"'></span></a>\",O=\"<a id='sData' class='fm-button \"+f.button+\"'>\"+b.bSubmit+\"</a>\",P=\"<a id='cData' class='fm-button \"+f.button+\"'>\"+b.bCancel+\"</a>\",Q=\"<table style='height:auto' class='EditTable ui-common-table' id='\"+w+\"_2'><tbody><tr><td colspan='2'><hr class='\"+f.content+\"' style='margin:1px'/></td></tr><tr id='Act_Buttons'><td class='navButton'>\"+(J?N+M:M+N)+\"</td><td class='EditButton'>\"+O+P+\"</td></tr>\";if(Q+=\"</tbody></table>\",B>0){var R=[];$.each($(F)[0].rows,function(a,b){R[a]=b}),R.sort(function(a,b){return a.rp>b.rp?1:a.rp<b.rp?-1:0}),$.each(R,function(a,b){$(\"tbody\",F).append(b)})}b.gbox=\"#gbox_\"+$.jgrid.jqID(u);var S=!1;b.closeOnEscape===!0&&(b.closeOnEscape=!1,S=!0);var T;if(C?($(I).find(\"#pData\").replaceWith(M),$(I).find(\"#nData\").replaceWith(N),$(I).find(\"#sData\").replaceWith(O),$(I).find(\"#cData\").replaceWith(P),T=$(\"<div id=\"+w+\"></div>\").append(I)):T=$(\"<div></div>\").append(I).append(Q),$(I).append(\"<div class='binfo topinfo bottominfo'>\"+rp_ge[p.p.id].bottominfo+\"</div>\"),$.jgrid.createModal(y,T,rp_ge[$(this)[0].p.id],\"#gview_\"+$.jgrid.jqID(p.p.id),$(\"#gbox_\"+$.jgrid.jqID(p.p.id))[0]),J&&($(\"#pData, #nData\",x+\"_2\").css(\"float\",\"right\"),$(\".EditButton\",x+\"_2\").css(\"text-align\",\"left\")),rp_ge[p.p.id].topinfo&&$(\".tinfo\",v).show(),rp_ge[p.p.id].bottominfo&&$(\".binfo\",v).show(),T=null,Q=null,$(\"#\"+$.jgrid.jqID(y.themodal)).keydown(function(a){var c=a.target;if($(v).data(\"disabled\")===!0)return!1;if(rp_ge[p.p.id].savekey[0]===!0&&a.which===rp_ge[p.p.id].savekey[1]&&\"TEXTAREA\"!==c.tagName)return $(\"#sData\",x+\"_2\").trigger(\"click\"),!1;if(27===a.which)return k()?(S&&$.jgrid.hideModal(\"#\"+$.jgrid.jqID(y.themodal),{gb:b.gbox,jqm:b.jqModal,onClose:rp_ge[p.p.id].onClose,removemodal:rp_ge[p.p.id].removemodal,formprop:!rp_ge[p.p.id].recreateForm,form:rp_ge[p.p.id].form}),!1):!1;if(rp_ge[p.p.id].navkeys[0]===!0){if(\"_empty\"===$(\"#id_g\",x).val())return!0;if(a.which===rp_ge[p.p.id].navkeys[1])return $(\"#pData\",q).trigger(\"click\"),!1;if(a.which===rp_ge[p.p.id].navkeys[2])return $(\"#nData\",q).trigger(\"click\"),!1}}),b.checkOnUpdate&&($(\"a.ui-jqdialog-titlebar-close span\",\"#\"+$.jgrid.jqID(y.themodal)).removeClass(\"jqmClose\"),$(\"a.ui-jqdialog-titlebar-close\",\"#\"+$.jgrid.jqID(y.themodal)).unbind(\"click\").click(function(){return k()?($.jgrid.hideModal(\"#\"+$.jgrid.jqID(y.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(u),jqm:b.jqModal,onClose:rp_ge[p.p.id].onClose,removemodal:rp_ge[p.p.id].removemodal,formprop:!rp_ge[p.p.id].recreateForm,form:rp_ge[p.p.id].form}),!1):!1})),b.saveicon=$.extend([!0,\"left\",e.icon_save],b.saveicon),b.closeicon=$.extend([!0,\"left\",e.icon_close],b.closeicon),b.saveicon[0]===!0&&$(\"#sData\",q).addClass(\"right\"===b.saveicon[1]?\"fm-button-icon-right\":\"fm-button-icon-left\").append(\"<span class='\"+f.icon_base+\" \"+b.saveicon[2]+\"'></span>\"),b.closeicon[0]===!0&&$(\"#cData\",q).addClass(\"right\"===b.closeicon[1]?\"fm-button-icon-right\":\"fm-button-icon-left\").append(\"<span class='\"+f.icon_base+\" \"+b.closeicon[2]+\"'></span>\"),rp_ge[p.p.id].checkOnSubmit||rp_ge[p.p.id].checkOnUpdate){O=\"<a id='sNew' class='fm-button \"+f.button+\"' style='z-index:1002'>\"+b.bYes+\"</a>\",N=\"<a id='nNew' class='fm-button \"+f.button+\"' style='z-index:1002;margin-left:5px'>\"+b.bNo+\"</a>\",P=\"<a id='cNew' class='fm-button \"+f.button+\"' style='z-index:1002;margin-left:5px;'>\"+b.bExit+\"</a>\";var U=b.zIndex||999;U++,$(\"<div class='\"+b.overlayClass+\" jqgrid-overlay confirm' style='z-index:\"+U+\";display:none;'>&#160;</div><div class='confirm ui-jqconfirm \"+f.content+\"' style='z-index:\"+(U+1)+\"'>\"+b.saveData+\"<br/><br/>\"+O+N+P+\"</div>\").insertAfter(v),$(\"#sNew\",\"#\"+$.jgrid.jqID(y.themodal)).click(function(){return i(),$(v).data(\"disabled\",!1),$(\".confirm\",\"#\"+$.jgrid.jqID(y.themodal)).hide(),!1}),$(\"#nNew\",\"#\"+$.jgrid.jqID(y.themodal)).click(function(){return $(\".confirm\",\"#\"+$.jgrid.jqID(y.themodal)).hide(),$(v).data(\"disabled\",!1),setTimeout(function(){$(\":input:visible\",v)[0].focus()},0),!1}),$(\"#cNew\",\"#\"+$.jgrid.jqID(y.themodal)).click(function(){return $(\".confirm\",\"#\"+$.jgrid.jqID(y.themodal)).hide(),$(v).data(\"disabled\",!1),$.jgrid.hideModal(\"#\"+$.jgrid.jqID(y.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(u),jqm:b.jqModal,onClose:rp_ge[p.p.id].onClose,removemodal:rp_ge[p.p.id].removemodal,formprop:!rp_ge[p.p.id].recreateForm,form:rp_ge[p.p.id].form}),!1})}$(p).triggerHandler(\"jqGridAddEditInitializeForm\",[$(v),t]),$.isFunction(rp_ge[p.p.id].onInitializeForm)&&rp_ge[p.p.id].onInitializeForm.call(p,$(v),t),\"_empty\"!==a&&rp_ge[p.p.id].viewPagerButtons?$(\"#pData,#nData\",q).show():$(\"#pData,#nData\",q).hide(),$(p).triggerHandler(\"jqGridAddEditBeforeShowForm\",[$(v),t]),$.isFunction(rp_ge[p.p.id].beforeShowForm)&&rp_ge[p.p.id].beforeShowForm.call(p,$(v),t),$(\"#\"+$.jgrid.jqID(y.themodal)).data(\"onClose\",rp_ge[p.p.id].onClose),$.jgrid.viewModal(\"#\"+$.jgrid.jqID(y.themodal),{gbox:\"#gbox_\"+$.jgrid.jqID(u),jqm:b.jqModal,overlay:b.overlay,modal:b.modal,overlayClass:b.overlayClass,focusField:b.focusField,onHide:function(a){var b=$(\"#editmod\"+u)[0].style.height,c=$(\"#editmod\"+u)[0].style.width;b.indexOf(\"px\")>-1&&(b=parseFloat(b)),c.indexOf(\"px\")>-1&&(c=parseFloat(c)),$(p).data(\"formProp\",{top:parseFloat($(a.w).css(\"top\")),left:parseFloat($(a.w).css(\"left\")),width:c,height:b,dataheight:$(v).height(),datawidth:$(v).width()}),a.w.remove(),a.o&&a.o.remove()}}),E||$(\".\"+$.jgrid.jqID(b.overlayClass)).click(function(){return k()?($.jgrid.hideModal(\"#\"+$.jgrid.jqID(y.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(u),jqm:b.jqModal,onClose:rp_ge[p.p.id].onClose,removemodal:rp_ge[p.p.id].removemodal,formprop:!rp_ge[p.p.id].recreateForm,form:rp_ge[p.p.id].form}),!1):!1}),$(\".fm-button\",\"#\"+$.jgrid.jqID(y.themodal)).hover(function(){$(this).addClass(f.hover)},function(){$(this).removeClass(f.hover)}),$(\"#sData\",q).click(function(){return r={},$(\".FormError\",v).hide(),c(),\"_empty\"===r[p.p.id+\"_id\"]?i():b.checkOnSubmit===!0?(s=j(r,rp_ge[p.p.id]._savedData),s?($(v).data(\"disabled\",!0),$(\".confirm\",\"#\"+$.jgrid.jqID(y.themodal)).show()):i()):i(),!1}),$(\"#cData\",q).click(function(){return k()?($.jgrid.hideModal(\"#\"+$.jgrid.jqID(y.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(u),jqm:b.jqModal,onClose:rp_ge[p.p.id].onClose,removemodal:rp_ge[p.p.id].removemodal,formprop:!rp_ge[p.p.id].recreateForm,form:rp_ge[p.p.id].form}),!1):!1}),$(\"#nData\",q).click(function(){if(!k())return!1;$(\".FormError\",v).hide();var a=n();if(a[0]=parseInt(a[0],10),-1!==a[0]&&a[1][a[0]+1]){$(p).triggerHandler(\"jqGridAddEditClickPgButtons\",[\"next\",$(v),a[1][a[0]]]);var c;if($.isFunction(b.onclickPgButtons)&&(c=b.onclickPgButtons.call(p,\"next\",$(v),a[1][a[0]]),void 0!==c&&c===!1))return!1;if($(\"#\"+$.jgrid.jqID(a[1][a[0]+1])).hasClass(f.disabled))return!1;g(a[1][a[0]+1],p,v),$(p).jqGrid(\"setSelection\",a[1][a[0]+1]),$(p).triggerHandler(\"jqGridAddEditAfterClickPgButtons\",[\"next\",$(v),a[1][a[0]]]),$.isFunction(b.afterclickPgButtons)&&b.afterclickPgButtons.call(p,\"next\",$(v),a[1][a[0]+1]),m(a[0]+1,a)}return!1}),$(\"#pData\",q).click(function(){if(!k())return!1;$(\".FormError\",v).hide();var a=n();if(-1!==a[0]&&a[1][a[0]-1]){$(p).triggerHandler(\"jqGridAddEditClickPgButtons\",[\"prev\",$(v),a[1][a[0]]]);var c;if($.isFunction(b.onclickPgButtons)&&(c=b.onclickPgButtons.call(p,\"prev\",$(v),a[1][a[0]]),void 0!==c&&c===!1))return!1;if($(\"#\"+$.jgrid.jqID(a[1][a[0]-1])).hasClass(f.disabled))return!1;g(a[1][a[0]-1],p,v),$(p).jqGrid(\"setSelection\",a[1][a[0]-1]),$(p).triggerHandler(\"jqGridAddEditAfterClickPgButtons\",[\"prev\",$(v),a[1][a[0]]]),$.isFunction(b.afterclickPgButtons)&&b.afterclickPgButtons.call(p,\"prev\",$(v),a[1][a[0]-1]),m(a[0]-1,a)}return!1}),$(p).triggerHandler(\"jqGridAddEditAfterShowForm\",[$(v),t]),$.isFunction(rp_ge[p.p.id].afterShowForm)&&rp_ge[p.p.id].afterShowForm.call(p,$(v),t);var V=n();m(V[0],V)}}})},viewGridRow:function(a,b){var c=$.jgrid.getRegional(this[0],\"view\"),d=this[0].p.styleUI,e=$.jgrid.styleUI[d].formedit,f=$.jgrid.styleUI[d].common;return b=$.extend(!0,{top:0,left:0,width:500,datawidth:\"auto\",height:\"auto\",dataheight:\"auto\",modal:!1,overlay:30,drag:!0,resize:!0,jqModal:!0,closeOnEscape:!1,labelswidth:\"30%\",closeicon:[],navkeys:[!1,38,40],onClose:null,beforeShowForm:null,beforeInitData:null,viewPagerButtons:!0,recreateForm:!1,removemodal:!0,form:\"view\"},c,b||{}),rp_ge[$(this)[0].p.id]=b,this.each(function(){function c(){(rp_ge[j.p.id].closeOnEscape===!0||rp_ge[j.p.id].navkeys[0]===!0)&&setTimeout(function(){$(\".ui-jqdialog-titlebar-close\",\"#\"+$.jgrid.jqID(p.modalhead)).attr(\"tabindex\",\"-1\").focus()},0)}function d(a,c,d,e){var g,h,i,j,k,l,m,n,o,p=0,q=[],r=!1,s=\"<td class='CaptionTD form-view-label \"+f.content+\"' width='\"+b.labelswidth+\"'>&#160;</td><td class='DataTD form-view-data ui-helper-reset \"+f.content+\"'>&#160;</td>\",t=\"\",u=\"<td class='CaptionTD form-view-label \"+f.content+\"'>&#160;</td><td class='DataTD form-view-data \"+f.content+\"'>&#160;</td>\",v=[\"integer\",\"number\",\"currency\"],w=0,x=0;for(l=1;e>=l;l++)t+=1===l?s:u;if($(c.p.colModel).each(function(){h=this.editrules&&this.editrules.edithidden===!0?!1:this.hidden===!0?!0:!1,h||\"right\"!==this.align||(this.formatter&&-1!==$.inArray(this.formatter,v)?w=Math.max(w,parseInt(this.width,10)):x=Math.max(x,parseInt(this.width,10)))}),m=0!==w?w:0!==x?x:0,r=$(c).jqGrid(\"getInd\",a),$(c.p.colModel).each(function(a){if(g=this.name,n=!1,h=this.editrules&&this.editrules.edithidden===!0?!1:this.hidden===!0?!0:!1,k=h?\"style='display:none'\":\"\",o=\"boolean\"!=typeof this.viewable?!0:this.viewable,\"cb\"!==g&&\"subgrid\"!==g&&\"rn\"!==g&&o){j=r===!1?\"\":g===c.p.ExpandColumn&&c.p.treeGrid===!0?$(\"td:eq(\"+a+\")\",c.rows[r]).text():$(\"td:eq(\"+a+\")\",c.rows[r]).html(),n=\"right\"===this.align&&0!==m?!0:!1;var b=$.extend({},{rowabove:!1,rowcontent:\"\"},this.formoptions||{}),f=parseInt(b.rowpos,10)||p+1,l=parseInt(2*(parseInt(b.colpos,10)||1),10);if(b.rowabove){var s=$(\"<tr><td class='contentinfo' colspan='\"+2*e+\"'>\"+b.rowcontent+\"</td></tr>\");$(d).append(s),s[0].rp=f}i=$(d).find(\"tr[rowpos=\"+f+\"]\"),0===i.length&&(i=$(\"<tr \"+k+\" rowpos='\"+f+\"'></tr>\").addClass(\"FormData\").attr(\"id\",\"trv_\"+g),$(i).append(t),$(d).append(i),i[0].rp=f),$(\"td:eq(\"+(l-2)+\")\",i[0]).html(\"<b>\"+(void 0===b.label?c.p.colNames[a]:b.label)+\"</b>\"),$(\"td:eq(\"+(l-1)+\")\",i[0]).append(\"<span>\"+j+\"</span>\").attr(\"id\",\"v_\"+g),n&&$(\"td:eq(\"+(l-1)+\") span\",i[0]).css({\"text-align\":\"right\",width:m+\"px\"}),q[p]=a,p++}}),p>0){var y=$(\"<tr class='FormData' style='display:none'><td class='CaptionTD'></td><td colspan='\"+(2*e-1)+\"' class='DataTD'><input class='FormElement' id='id_g' type='text' name='id' value='\"+a+\"'/></td></tr>\");y[0].rp=p+99,$(d).append(y)}return q}function g(a,b){var c,d,e,f,g=0;f=$(b).jqGrid(\"getInd\",a,!0),f&&($(\"td\",f).each(function(a){c=b.p.colModel[a].name,d=b.p.colModel[a].editrules&&b.p.colModel[a].editrules.edithidden===!0?!1:b.p.colModel[a].hidden===!0?!0:!1,\"cb\"!==c&&\"subgrid\"!==c&&\"rn\"!==c&&(e=c===b.p.ExpandColumn&&b.p.treeGrid===!0?$(this).text():$(this).html(),c=$.jgrid.jqID(\"v_\"+c),$(\"#\"+c+\" span\",\"#\"+m).html(e),d&&$(\"#\"+c,\"#\"+m).parents(\"tr:first\").hide(),g++)}),g>0&&$(\"#id_g\",\"#\"+m).val(a))}function h(a,b){var c=b[1].length-1;0===a?$(\"#pData\",\"#\"+m+\"_2\").addClass(f.disabled):void 0!==b[1][a-1]&&$(\"#\"+$.jgrid.jqID(b[1][a-1])).hasClass(f.disabled)?$(\"#pData\",m+\"_2\").addClass(f.disabled):$(\"#pData\",\"#\"+m+\"_2\").removeClass(f.disabled),a===c?$(\"#nData\",\"#\"+m+\"_2\").addClass(f.disabled):void 0!==b[1][a+1]&&$(\"#\"+$.jgrid.jqID(b[1][a+1])).hasClass(f.disabled)?$(\"#nData\",m+\"_2\").addClass(f.disabled):$(\"#nData\",\"#\"+m+\"_2\").removeClass(f.disabled)}function i(){var a=$(j).jqGrid(\"getDataIDs\"),b=$(\"#id_g\",\"#\"+m).val(),c=$.inArray(b,a);return[c,a]}var j=this;if(j.grid&&a){var k=j.p.id,l=\"ViewGrid_\"+$.jgrid.jqID(k),m=\"ViewTbl_\"+$.jgrid.jqID(k),n=\"ViewGrid_\"+k,o=\"ViewTbl_\"+k,p={themodal:\"viewmod\"+k,modalhead:\"viewhd\"+k,modalcontent:\"viewcnt\"+k,scrollelm:l},q=$.isFunction(rp_ge[j.p.id].beforeInitData)?rp_ge[j.p.id].beforeInitData:!1,r=!0,s=1,t=0;rp_ge[j.p.id].styleUI=j.p.styleUI||\"jQueryUI\",b.recreateForm||$(j).data(\"viewProp\")&&$.extend(rp_ge[$(this)[0].p.id],$(j).data(\"viewProp\"));var u=isNaN(rp_ge[$(this)[0].p.id].dataheight)?rp_ge[$(this)[0].p.id].dataheight:rp_ge[$(this)[0].p.id].dataheight+\"px\",v=isNaN(rp_ge[$(this)[0].p.id].datawidth)?rp_ge[$(this)[0].p.id].datawidth:rp_ge[$(this)[0].p.id].datawidth+\"px\",w=$(\"<form name='FormPost' id='\"+n+\"' class='FormGrid' style='width:\"+v+\";height:\"+u+\";'></form>\"),x=$(\"<table id='\"+o+\"' class='EditTable ViewTable'><tbody></tbody></table>\");if($(j.p.colModel).each(function(){var a=this.formoptions;s=Math.max(s,a?a.colpos||0:0),t=Math.max(t,a?a.rowpos||0:0)}),$(w).append(x),q&&(r=q.call(j,w),void 0===r&&(r=!0)),r!==!1){d(a,j,x,s);var y=\"rtl\"===j.p.direction?!0:!1,z=y?\"nData\":\"pData\",A=y?\"pData\":\"nData\",B=\"<a id='\"+z+\"' class='fm-button \"+f.button+\"'><span class='\"+f.icon_base+\" \"+e.icon_prev+\"'></span></a>\",C=\"<a id='\"+A+\"' class='fm-button \"+f.button+\"'><span class='\"+f.icon_base+\" \"+e.icon_next+\"'></span></a>\",D=\"<a id='cData' class='fm-button \"+f.button+\"'>\"+b.bClose+\"</a>\";if(t>0){var E=[];$.each($(x)[0].rows,function(a,b){E[a]=b}),E.sort(function(a,b){return a.rp>b.rp?1:a.rp<b.rp?-1:0}),$.each(E,function(a,b){$(\"tbody\",x).append(b)})}b.gbox=\"#gbox_\"+$.jgrid.jqID(k);var F=$(\"<div></div>\").append(w).append(\"<table border='0' class='EditTable' id='\"+m+\"_2'><tbody><tr id='Act_Buttons'><td class='navButton' width='\"+b.labelswidth+\"'>\"+(y?C+B:B+C)+\"</td><td class='EditButton'>\"+D+\"</td></tr></tbody></table>\");$.jgrid.createModal(p,F,rp_ge[$(this)[0].p.id],\"#gview_\"+$.jgrid.jqID(j.p.id),$(\"#gview_\"+$.jgrid.jqID(j.p.id))[0]),y&&($(\"#pData, #nData\",\"#\"+m+\"_2\").css(\"float\",\"right\"),$(\".EditButton\",\"#\"+m+\"_2\").css(\"text-align\",\"left\")),b.viewPagerButtons||$(\"#pData, #nData\",\"#\"+m+\"_2\").hide(),F=null,$(\"#\"+p.themodal).keydown(function(a){if(27===a.which)return rp_ge[j.p.id].closeOnEscape&&$.jgrid.hideModal(\"#\"+$.jgrid.jqID(p.themodal),{gb:b.gbox,jqm:b.jqModal,onClose:b.onClose,removemodal:rp_ge[j.p.id].removemodal,formprop:!rp_ge[j.p.id].recreateForm,form:rp_ge[j.p.id].form}),!1;\nif(b.navkeys[0]===!0){if(a.which===b.navkeys[1])return $(\"#pData\",\"#\"+m+\"_2\").trigger(\"click\"),!1;if(a.which===b.navkeys[2])return $(\"#nData\",\"#\"+m+\"_2\").trigger(\"click\"),!1}}),b.closeicon=$.extend([!0,\"left\",e.icon_close],b.closeicon),b.closeicon[0]===!0&&$(\"#cData\",\"#\"+m+\"_2\").addClass(\"right\"===b.closeicon[1]?\"fm-button-icon-right\":\"fm-button-icon-left\").append(\"<span class='\"+f.icon_base+\" \"+b.closeicon[2]+\"'></span>\"),$.isFunction(b.beforeShowForm)&&b.beforeShowForm.call(j,$(\"#\"+l)),$.jgrid.viewModal(\"#\"+$.jgrid.jqID(p.themodal),{gbox:\"#gbox_\"+$.jgrid.jqID(k),jqm:b.jqModal,overlay:b.overlay,modal:b.modal,onHide:function(a){$(j).data(\"viewProp\",{top:parseFloat($(a.w).css(\"top\")),left:parseFloat($(a.w).css(\"left\")),width:$(a.w).width(),height:$(a.w).height(),dataheight:$(\"#\"+l).height(),datawidth:$(\"#\"+l).width()}),a.w.remove(),a.o&&a.o.remove()}}),$(\".fm-button:not(.\"+f.disabled+\")\",\"#\"+m+\"_2\").hover(function(){$(this).addClass(f.hover)},function(){$(this).removeClass(f.hover)}),c(),$(\"#cData\",\"#\"+m+\"_2\").click(function(){return $.jgrid.hideModal(\"#\"+$.jgrid.jqID(p.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(k),jqm:b.jqModal,onClose:b.onClose,removemodal:rp_ge[j.p.id].removemodal,formprop:!rp_ge[j.p.id].recreateForm,form:rp_ge[j.p.id].form}),!1}),$(\"#nData\",\"#\"+m+\"_2\").click(function(){$(\"#FormError\",\"#\"+m).hide();var a=i();return a[0]=parseInt(a[0],10),-1!==a[0]&&a[1][a[0]+1]&&($.isFunction(b.onclickPgButtons)&&b.onclickPgButtons.call(j,\"next\",$(\"#\"+l),a[1][a[0]]),g(a[1][a[0]+1],j),$(j).jqGrid(\"setSelection\",a[1][a[0]+1]),$.isFunction(b.afterclickPgButtons)&&b.afterclickPgButtons.call(j,\"next\",$(\"#\"+l),a[1][a[0]+1]),h(a[0]+1,a)),c(),!1}),$(\"#pData\",\"#\"+m+\"_2\").click(function(){$(\"#FormError\",\"#\"+m).hide();var a=i();return-1!==a[0]&&a[1][a[0]-1]&&($.isFunction(b.onclickPgButtons)&&b.onclickPgButtons.call(j,\"prev\",$(\"#\"+l),a[1][a[0]]),g(a[1][a[0]-1],j),$(j).jqGrid(\"setSelection\",a[1][a[0]-1]),$.isFunction(b.afterclickPgButtons)&&b.afterclickPgButtons.call(j,\"prev\",$(\"#\"+l),a[1][a[0]-1]),h(a[0]-1,a)),c(),!1});var G=i();h(G[0],G)}}})},delGridRow:function(a,b){var c=$.jgrid.getRegional(this[0],\"del\"),d=this[0].p.styleUI,e=$.jgrid.styleUI[d].formedit,f=$.jgrid.styleUI[d].common;return b=$.extend(!0,{top:0,left:0,width:240,height:\"auto\",dataheight:\"auto\",modal:!1,overlay:30,drag:!0,resize:!0,url:\"\",mtype:\"POST\",reloadAfterSubmit:!0,beforeShowForm:null,beforeInitData:null,afterShowForm:null,beforeSubmit:null,onclickSubmit:null,afterSubmit:null,jqModal:!0,closeOnEscape:!1,delData:{},delicon:[],cancelicon:[],onClose:null,ajaxDelOptions:{},processing:!1,serializeDelData:null,useDataProxy:!1},c,b||{}),rp_ge[$(this)[0].p.id]=b,this.each(function(){var c=this;if(c.grid&&a){var d,g,h,i,j=$.isFunction(rp_ge[c.p.id].beforeShowForm),k=$.isFunction(rp_ge[c.p.id].afterShowForm),l=$.isFunction(rp_ge[c.p.id].beforeInitData)?rp_ge[c.p.id].beforeInitData:!1,m=c.p.id,n={},o=!0,p=\"DelTbl_\"+$.jgrid.jqID(m),q=\"DelTbl_\"+m,r={themodal:\"delmod\"+m,modalhead:\"delhd\"+m,modalcontent:\"delcnt\"+m,scrollelm:p};if(rp_ge[c.p.id].styleUI=c.p.styleUI||\"jQueryUI\",$.isArray(a)&&(a=a.join()),void 0!==$(\"#\"+$.jgrid.jqID(r.themodal))[0]){if(l&&(o=l.call(c,$(\"#\"+p)),void 0===o&&(o=!0)),o===!1)return;$(\"#DelData>td\",\"#\"+p).text(a),$(\"#DelError\",\"#\"+p).hide(),rp_ge[c.p.id].processing===!0&&(rp_ge[c.p.id].processing=!1,$(\"#dData\",\"#\"+p).removeClass(f.active)),j&&rp_ge[c.p.id].beforeShowForm.call(c,$(\"#\"+p)),$.jgrid.viewModal(\"#\"+$.jgrid.jqID(r.themodal),{gbox:\"#gbox_\"+$.jgrid.jqID(m),jqm:rp_ge[c.p.id].jqModal,jqM:!1,overlay:rp_ge[c.p.id].overlay,modal:rp_ge[c.p.id].modal}),k&&rp_ge[c.p.id].afterShowForm.call(c,$(\"#\"+p))}else{var s=isNaN(rp_ge[c.p.id].dataheight)?rp_ge[c.p.id].dataheight:rp_ge[c.p.id].dataheight+\"px\",t=isNaN(b.datawidth)?b.datawidth:b.datawidth+\"px\",u=\"<div id='\"+q+\"' class='formdata' style='width:\"+t+\";overflow:auto;position:relative;height:\"+s+\";'>\";u+=\"<table class='DelTable'><tbody>\",u+=\"<tr id='DelError' style='display:none'><td class='\"+f.error+\"'></td></tr>\",u+=\"<tr id='DelData' style='display:none'><td >\"+a+\"</td></tr>\",u+='<tr><td class=\"delmsg\" style=\"white-space:pre;\">'+rp_ge[c.p.id].msg+\"</td></tr><tr><td >&#160;</td></tr>\",u+=\"</tbody></table></div>\";var v=\"<a id='dData' class='fm-button \"+f.button+\"'>\"+b.bSubmit+\"</a>\",w=\"<a id='eData' class='fm-button \"+f.button+\"'>\"+b.bCancel+\"</a>\";if(u+=\"<table class='EditTable ui-common-table' id='\"+p+\"_2'><tbody><tr><td><hr class='\"+f.content+\"' style='margin:1px'/></td></tr><tr><td class='DelButton EditButton'>\"+v+\"&#160;\"+w+\"</td></tr></tbody></table>\",b.gbox=\"#gbox_\"+$.jgrid.jqID(m),$.jgrid.createModal(r,u,rp_ge[c.p.id],\"#gview_\"+$.jgrid.jqID(c.p.id),$(\"#gview_\"+$.jgrid.jqID(c.p.id))[0]),l&&(o=l.call(c,$(u)),void 0===o&&(o=!0)),o===!1)return;$(\".fm-button\",\"#\"+p+\"_2\").hover(function(){$(this).addClass(f.hover)},function(){$(this).removeClass(f.hover)}),b.delicon=$.extend([!0,\"left\",e.icon_del],rp_ge[c.p.id].delicon),b.cancelicon=$.extend([!0,\"left\",e.icon_cancel],rp_ge[c.p.id].cancelicon),b.delicon[0]===!0&&$(\"#dData\",\"#\"+p+\"_2\").addClass(\"right\"===b.delicon[1]?\"fm-button-icon-right\":\"fm-button-icon-left\").append(\"<span class='\"+f.icon_base+\" \"+b.delicon[2]+\"'></span>\"),b.cancelicon[0]===!0&&$(\"#eData\",\"#\"+p+\"_2\").addClass(\"right\"===b.cancelicon[1]?\"fm-button-icon-right\":\"fm-button-icon-left\").append(\"<span class='\"+f.icon_base+\" \"+b.cancelicon[2]+\"'></span>\"),$(\"#dData\",\"#\"+p+\"_2\").click(function(){var a,e=[!0,\"\"],j=$(\"#DelData>td\",\"#\"+p).text();if(n={},$.isFunction(rp_ge[c.p.id].onclickSubmit)&&(n=rp_ge[c.p.id].onclickSubmit.call(c,rp_ge[c.p.id],j)||{}),$.isFunction(rp_ge[c.p.id].beforeSubmit)&&(e=rp_ge[c.p.id].beforeSubmit.call(c,j)),e[0]&&!rp_ge[c.p.id].processing){if(rp_ge[c.p.id].processing=!0,h=c.p.prmNames,d=$.extend({},rp_ge[c.p.id].delData,n),i=h.oper,d[i]=h.deloper,g=h.id,j=String(j).split(\",\"),!j.length)return!1;for(a in j)j.hasOwnProperty(a)&&(j[a]=$.jgrid.stripPref(c.p.idPrefix,j[a]));d[g]=j.join(),$(this).addClass(f.active);var k=$.extend({url:rp_ge[c.p.id].url||$(c).jqGrid(\"getGridParam\",\"editurl\"),type:rp_ge[c.p.id].mtype,data:$.isFunction(rp_ge[c.p.id].serializeDelData)?rp_ge[c.p.id].serializeDelData.call(c,d):d,complete:function(a,g){var h;if($(\"#dData\",\"#\"+p+\"_2\").removeClass(f.active),a.status>=300&&304!==a.status?(e[0]=!1,e[1]=$.isFunction(rp_ge[c.p.id].errorTextFormat)?rp_ge[c.p.id].errorTextFormat.call(c,a):g+\" Status: '\"+a.statusText+\"'. Error code: \"+a.status):$.isFunction(rp_ge[c.p.id].afterSubmit)&&(e=rp_ge[c.p.id].afterSubmit.call(c,a,d)),e[0]===!1)$(\"#DelError>td\",\"#\"+p).html(e[1]),$(\"#DelError\",\"#\"+p).show();else{if(rp_ge[c.p.id].reloadAfterSubmit&&\"local\"!==c.p.datatype)$(c).trigger(\"reloadGrid\");else{if(c.p.treeGrid===!0)try{$(c).jqGrid(\"delTreeNode\",c.p.idPrefix+j[0])}catch(i){}else for(h=0;h<j.length;h++)$(c).jqGrid(\"delRowData\",c.p.idPrefix+j[h]);c.p.selrow=null,c.p.selarrrow=[]}$.isFunction(rp_ge[c.p.id].afterComplete)&&setTimeout(function(){rp_ge[c.p.id].afterComplete.call(c,a,j)},500)}rp_ge[c.p.id].processing=!1,e[0]&&$.jgrid.hideModal(\"#\"+$.jgrid.jqID(r.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(m),jqm:b.jqModal,onClose:rp_ge[c.p.id].onClose})}},$.jgrid.ajaxOptions,rp_ge[c.p.id].ajaxDelOptions);if(k.url||rp_ge[c.p.id].useDataProxy||($.isFunction(c.p.dataProxy)?rp_ge[c.p.id].useDataProxy=!0:(e[0]=!1,e[1]+=\" \"+$.jgrid.getRegional(c,\"errors.nourl\"))),e[0])if(rp_ge[c.p.id].useDataProxy){var l=c.p.dataProxy.call(c,k,\"del_\"+c.p.id);void 0===l&&(l=[!0,\"\"]),l[0]===!1?(e[0]=!1,e[1]=l[1]||\"Error deleting the selected row!\"):$.jgrid.hideModal(\"#\"+$.jgrid.jqID(r.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(m),jqm:b.jqModal,onClose:rp_ge[c.p.id].onClose})}else\"clientArray\"===k.url?(d=k.data,k.complete({status:200,statusText:\"\"},\"\")):$.ajax(k)}return e[0]===!1&&($(\"#DelError>td\",\"#\"+p).html(e[1]),$(\"#DelError\",\"#\"+p).show()),!1}),$(\"#eData\",\"#\"+p+\"_2\").click(function(){return $.jgrid.hideModal(\"#\"+$.jgrid.jqID(r.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(m),jqm:rp_ge[c.p.id].jqModal,onClose:rp_ge[c.p.id].onClose}),!1}),j&&rp_ge[c.p.id].beforeShowForm.call(c,$(\"#\"+p)),$.jgrid.viewModal(\"#\"+$.jgrid.jqID(r.themodal),{gbox:\"#gbox_\"+$.jgrid.jqID(m),jqm:rp_ge[c.p.id].jqModal,overlay:rp_ge[c.p.id].overlay,modal:rp_ge[c.p.id].modal}),k&&rp_ge[c.p.id].afterShowForm.call(c,$(\"#\"+p))}rp_ge[c.p.id].closeOnEscape===!0&&setTimeout(function(){$(\".ui-jqdialog-titlebar-close\",\"#\"+$.jgrid.jqID(r.modalhead)).attr(\"tabindex\",\"-1\").focus()},0)}})},navGrid:function(a,b,c,d,e,f,g){var h=$.jgrid.getRegional(this[0],\"nav\"),i=this[0].p.styleUI,j=$.jgrid.styleUI[i].navigator,k=$.jgrid.styleUI[i].common;return b=$.extend({edit:!0,editicon:j.icon_edit_nav,add:!0,addicon:j.icon_add_nav,del:!0,delicon:j.icon_del_nav,search:!0,searchicon:j.icon_search_nav,refresh:!0,refreshicon:j.icon_refresh_nav,refreshstate:\"firstpage\",view:!1,viewicon:j.icon_view_nav,position:\"left\",closeOnEscape:!0,beforeRefresh:null,afterRefresh:null,cloneToTop:!1,alertwidth:200,alertheight:\"auto\",alerttop:null,alertleft:null,alertzIndex:null,dropmenu:!1},h,b||{}),this.each(function(){if(!this.p.navGrid){var j,l,m,n={themodal:\"alertmod_\"+this.p.id,modalhead:\"alerthd_\"+this.p.id,modalcontent:\"alertcnt_\"+this.p.id},o=this;if(o.grid&&\"string\"==typeof a){$(o).data(\"navGrid\")||$(o).data(\"navGrid\",b),m=$(o).data(\"navGrid\"),o.p.force_regional&&(m=$.extend(m,h)),void 0===$(\"#\"+n.themodal)[0]&&(m.alerttop||m.alertleft||(void 0!==window.innerWidth?(m.alertleft=window.innerWidth,m.alerttop=window.innerHeight):void 0!==document.documentElement&&void 0!==document.documentElement.clientWidth&&0!==document.documentElement.clientWidth?(m.alertleft=document.documentElement.clientWidth,m.alerttop=document.documentElement.clientHeight):(m.alertleft=1024,m.alerttop=768),m.alertleft=m.alertleft/2-parseInt(m.alertwidth,10)/2,m.alerttop=m.alerttop/2-25),$.jgrid.createModal(n,\"<div>\"+m.alerttext+\"</div><span tabindex='0'><span tabindex='-1' id='jqg_alrt'></span></span>\",{gbox:\"#gbox_\"+$.jgrid.jqID(o.p.id),jqModal:!0,drag:!0,resize:!0,caption:m.alertcap,top:m.alerttop,left:m.alertleft,width:m.alertwidth,height:m.alertheight,closeOnEscape:m.closeOnEscape,zIndex:m.alertzIndex,styleUI:o.p.styleUI},\"#gview_\"+$.jgrid.jqID(o.p.id),$(\"#gbox_\"+$.jgrid.jqID(o.p.id))[0],!0));var p,q=1,r=function(){$(this).hasClass(k.disabled)||$(this).addClass(k.hover)},s=function(){$(this).removeClass(k.hover)};for(m.cloneToTop&&o.p.toppager&&(q=2),p=0;q>p;p++){var t,u,v,w=$(\"<table class='ui-pg-table navtable ui-common-table'><tbody><tr></tr></tbody></table>\"),x=\"<td class='ui-pg-button \"+k.disabled+\"' style='width:4px;'><span class='ui-separator'></span></td>\";0===p?(u=a,v=o.p.id,u===o.p.toppager&&(v+=\"_top\",q=1)):(u=o.p.toppager,v=o.p.id+\"_top\"),\"rtl\"===o.p.direction&&$(w).attr(\"dir\",\"rtl\").css(\"float\",\"right\"),d=d||{},m.add&&(t=$(\"<td class='ui-pg-button \"+k.cornerall+\"'></td>\"),$(t).append(\"<div class='ui-pg-div'><span class='\"+k.icon_base+\" \"+m.addicon+\"'></span>\"+m.addtext+\"</div>\"),$(\"tr\",w).append(t),$(t,w).attr({title:m.addtitle||\"\",id:d.id||\"add_\"+v}).click(function(){return $(this).hasClass(k.disabled)||($.isFunction(m.addfunc)?m.addfunc.call(o):$(o).jqGrid(\"editGridRow\",\"new\",d)),!1}).hover(r,s),t=null),c=c||{},m.edit&&(t=$(\"<td class='ui-pg-button \"+k.cornerall+\"'></td>\"),$(t).append(\"<div class='ui-pg-div'><span class='\"+k.icon_base+\" \"+m.editicon+\"'></span>\"+m.edittext+\"</div>\"),$(\"tr\",w).append(t),$(t,w).attr({title:m.edittitle||\"\",id:c.id||\"edit_\"+v}).click(function(){if(!$(this).hasClass(k.disabled)){var a=o.p.selrow;a?$.isFunction(m.editfunc)?m.editfunc.call(o,a):$(o).jqGrid(\"editGridRow\",a,c):($.jgrid.viewModal(\"#\"+n.themodal,{gbox:\"#gbox_\"+$.jgrid.jqID(o.p.id),jqm:!0}),$(\"#jqg_alrt\").focus())}return!1}).hover(r,s),t=null),g=g||{},m.view&&(t=$(\"<td class='ui-pg-button \"+k.cornerall+\"'></td>\"),$(t).append(\"<div class='ui-pg-div'><span class='\"+k.icon_base+\" \"+m.viewicon+\"'></span>\"+m.viewtext+\"</div>\"),$(\"tr\",w).append(t),$(t,w).attr({title:m.viewtitle||\"\",id:g.id||\"view_\"+v}).click(function(){if(!$(this).hasClass(k.disabled)){var a=o.p.selrow;a?$.isFunction(m.viewfunc)?m.viewfunc.call(o,a):$(o).jqGrid(\"viewGridRow\",a,g):($.jgrid.viewModal(\"#\"+n.themodal,{gbox:\"#gbox_\"+$.jgrid.jqID(o.p.id),jqm:!0}),$(\"#jqg_alrt\").focus())}return!1}).hover(r,s),t=null),e=e||{},m.del&&(t=$(\"<td class='ui-pg-button \"+k.cornerall+\"'></td>\"),$(t).append(\"<div class='ui-pg-div'><span class='\"+k.icon_base+\" \"+m.delicon+\"'></span>\"+m.deltext+\"</div>\"),$(\"tr\",w).append(t),$(t,w).attr({title:m.deltitle||\"\",id:e.id||\"del_\"+v}).click(function(){if(!$(this).hasClass(k.disabled)){var a;o.p.multiselect?(a=o.p.selarrrow,0===a.length&&(a=null)):a=o.p.selrow,a?$.isFunction(m.delfunc)?m.delfunc.call(o,a):$(o).jqGrid(\"delGridRow\",a,e):($.jgrid.viewModal(\"#\"+n.themodal,{gbox:\"#gbox_\"+$.jgrid.jqID(o.p.id),jqm:!0}),$(\"#jqg_alrt\").focus())}return!1}).hover(r,s),t=null),(m.add||m.edit||m.del||m.view)&&$(\"tr\",w).append(x),f=f||{},m.search&&(t=$(\"<td class='ui-pg-button \"+k.cornerall+\"'></td>\"),$(t).append(\"<div class='ui-pg-div'><span class='\"+k.icon_base+\" \"+m.searchicon+\"'></span>\"+m.searchtext+\"</div>\"),$(\"tr\",w).append(t),$(t,w).attr({title:m.searchtitle||\"\",id:f.id||\"search_\"+v}).click(function(){return $(this).hasClass(k.disabled)||($.isFunction(m.searchfunc)?m.searchfunc.call(o,f):$(o).jqGrid(\"searchGrid\",f)),!1}).hover(r,s),f.showOnLoad&&f.showOnLoad===!0&&$(t,w).click(),t=null),m.refresh&&(t=$(\"<td class='ui-pg-button \"+k.cornerall+\"'></td>\"),$(t).append(\"<div class='ui-pg-div'><span class='\"+k.icon_base+\" \"+m.refreshicon+\"'></span>\"+m.refreshtext+\"</div>\"),$(\"tr\",w).append(t),$(t,w).attr({title:m.refreshtitle||\"\",id:\"refresh_\"+v}).click(function(){if(!$(this).hasClass(k.disabled)){$.isFunction(m.beforeRefresh)&&m.beforeRefresh.call(o),o.p.search=!1,o.p.resetsearch=!0;try{if(\"currentfilter\"!==m.refreshstate){var a=o.p.id;o.p.postData.filters=\"\";try{$(\"#fbox_\"+$.jgrid.jqID(a)).jqFilter(\"resetFilter\")}catch(b){}$.isFunction(o.clearToolbar)&&o.clearToolbar.call(o,!1)}}catch(c){}switch(m.refreshstate){case\"firstpage\":$(o).trigger(\"reloadGrid\",[{page:1}]);break;case\"current\":case\"currentfilter\":$(o).trigger(\"reloadGrid\",[{current:!0}])}$.isFunction(m.afterRefresh)&&m.afterRefresh.call(o)}return!1}).hover(r,s),t=null),l=$(\".ui-jqgrid\").css(\"font-size\")||\"11px\",$(\"body\").append(\"<div id='testpg2' class='ui-jqgrid \"+$.jgrid.styleUI[i].base.entrieBox+\"' style='font-size:\"+l+\";visibility:hidden;' ></div>\"),j=$(w).clone().appendTo(\"#testpg2\").width(),$(\"#testpg2\").remove(),o.p._nvtd&&(m.dropmenu?(w=null,$(o).jqGrid(\"_buildNavMenu\",u,v,b,c,d,e,f,g)):j>o.p._nvtd[0]?(o.p.responsive?(w=null,$(o).jqGrid(\"_buildNavMenu\",u,v,b,c,d,e,f,g)):$(u+\"_\"+m.position,u).width(j),o.p._nvtd[0]=j):$(u+\"_\"+m.position,u).append(w),o.p._nvtd[1]=j),o.p.navGrid=!0}o.p.storeNavOptions&&(o.p.navOptions=m,o.p.editOptions=c,o.p.addOptions=d,o.p.delOptions=e,o.p.searchOptions=f,o.p.viewOptions=g)}}})},navButtonAdd:function(a,b){var c=this[0].p.styleUI,d=$.jgrid.styleUI[c].navigator;return b=$.extend({caption:\"newButton\",title:\"\",buttonicon:d.icon_newbutton_nav,onClickButton:null,position:\"last\",cursor:\"pointer\"},b||{}),this.each(function(){if(this.grid){\"string\"==typeof a&&0!==a.indexOf(\"#\")&&(a=\"#\"+$.jgrid.jqID(a));var d=$(\".navtable\",a)[0],e=this,f=$.jgrid.styleUI[c].common.disabled,g=$.jgrid.styleUI[c].common.hover,h=$.jgrid.styleUI[c].common.cornerall,i=$.jgrid.styleUI[c].common.icon_base;if(d){if(b.id&&void 0!==$(\"#\"+$.jgrid.jqID(b.id),d)[0])return;var j=$(\"<td></td>\");$(j).addClass(\"ui-pg-button \"+h).append(\"NONE\"===b.buttonicon.toString().toUpperCase()?\"<div class='ui-pg-div'>\"+b.caption+\"</div>\":\"<div class='ui-pg-div'><span class='\"+i+\" \"+b.buttonicon+\"'></span>\"+b.caption+\"</div>\"),b.id&&$(j).attr(\"id\",b.id),\"first\"===b.position?0===d.rows[0].cells.length?$(\"tr\",d).append(j):$(\"tr td:eq(0)\",d).before(j):$(\"tr\",d).append(j),$(j,d).attr(\"title\",b.title||\"\").click(function(a){return $(this).hasClass(f)||$.isFunction(b.onClickButton)&&b.onClickButton.call(e,a),!1}).hover(function(){$(this).hasClass(f)||$(this).addClass(g)},function(){$(this).removeClass(g)})}else if(d=$(\".dropdownmenu\",a)[0]){var k=$(d).val(),l=b.id||$.jgrid.randId(),m=$('<li class=\"ui-menu-item\" role=\"presentation\"><a class=\"'+h+' g-menu-item\" tabindex=\"0\" role=\"menuitem\" id=\"'+l+'\">'+(b.caption||b.title)+\"</a></li>\");k&&(\"first\"===b.position?$(\"#\"+k).prepend(m):$(\"#\"+k).append(m),$(m).on(\"click\",function(a){return $(this).hasClass(f)||($(\"#\"+k).hide(),$.isFunction(b.onClickButton)&&b.onClickButton.call(e,a)),!1}).find(\"a\").hover(function(){$(this).hasClass(f)||$(this).addClass(g)},function(){$(this).removeClass(g)}))}}})},navSeparatorAdd:function(a,b){var c=this[0].p.styleUI,d=$.jgrid.styleUI[c].common;return b=$.extend({sepclass:\"ui-separator\",sepcontent:\"\",position:\"last\"},b||{}),this.each(function(){if(this.grid){\"string\"==typeof a&&0!==a.indexOf(\"#\")&&(a=\"#\"+$.jgrid.jqID(a));var c,e,f=$(\".navtable\",a)[0];f?(c=\"<td class='ui-pg-button \"+d.disabled+\"' style='width:4px;'><span class='\"+b.sepclass+\"'></span>\"+b.sepcontent+\"</td>\",\"first\"===b.position?0===f.rows[0].cells.length?$(\"tr\",f).append(c):$(\"tr td:eq(0)\",f).before(c):$(\"tr\",f).append(c)):(f=$(\".dropdownmenu\",a)[0],c=\"<li class='ui-menu-item \"+d.disabled+\"' style='width:100%' role='presentation'><hr class='ui-separator-li'></li>\",f&&(e=$(f).val(),e&&(\"first\"===b.position?$(\"#\"+e).prepend(c):$(\"#\"+e).append(c))))}})},_buildNavMenu:function(a,b,c,d,e,f,g,h){return this.each(function(){var i=this,j=i.p.styleUI,k=($.jgrid.styleUI[j].navigator,$.jgrid.styleUI[j].filter),l=$.jgrid.styleUI[j].common,m=\"form_menu_\"+$.jgrid.randId(),n=\"<button class='dropdownmenu \"+l.button+\"' value='\"+m+\"'>Actions</button>\";$(a+\"_\"+c.position,a).append(n);var o={themodal:\"alertmod_\"+this.p.id,modalhead:\"alerthd_\"+this.p.id,modalcontent:\"alertcnt_\"+this.p.id},p=function(){var a,j,n=$(\".ui-jqgrid-view\").css(\"font-size\")||\"11px\",p=$('<ul id=\"'+m+'\" class=\"ui-nav-menu modal-content\" role=\"menu\" tabindex=\"0\" style=\"display:none;font-size:'+n+'\"></ul>');c.add&&(e=e||{},a=e.id||\"add_\"+b,j=$('<li class=\"ui-menu-item\" role=\"presentation\"><a class=\"'+l.cornerall+' g-menu-item\" tabindex=\"0\" role=\"menuitem\" id=\"'+a+'\">'+(c.addtext||c.addtitle)+\"</a></li>\").click(function(){return $(this).hasClass(l.disabled)||($.isFunction(c.addfunc)?c.addfunc.call(i):$(i).jqGrid(\"editGridRow\",\"new\",e),$(p).hide()),!1}),$(p).append(j)),c.edit&&(d=d||{},a=d.id||\"edit_\"+b,j=$('<li class=\"ui-menu-item\" role=\"presentation\"><a class=\"'+l.cornerall+' g-menu-item\" tabindex=\"0\" role=\"menuitem\" id=\"'+a+'\">'+(c.edittext||c.edittitle)+\"</a></li>\").click(function(){if(!$(this).hasClass(l.disabled)){var a=i.p.selrow;a?$.isFunction(c.editfunc)?c.editfunc.call(i,a):$(i).jqGrid(\"editGridRow\",a,d):($.jgrid.viewModal(\"#\"+o.themodal,{gbox:\"#gbox_\"+$.jgrid.jqID(i.p.id),jqm:!0}),$(\"#jqg_alrt\").focus()),$(p).hide()}return!1}),$(p).append(j)),c.view&&(h=h||{},a=h.id||\"view_\"+b,j=$('<li class=\"ui-menu-item\" role=\"presentation\"><a class=\"'+l.cornerall+' g-menu-item\" tabindex=\"0\" role=\"menuitem\" id=\"'+a+'\">'+(c.viewtext||c.viewtitle)+\"</a></li>\").click(function(){if(!$(this).hasClass(l.disabled)){var a=i.p.selrow;a?$.isFunction(c.editfunc)?c.viewfunc.call(i,a):$(i).jqGrid(\"viewGridRow\",a,h):($.jgrid.viewModal(\"#\"+o.themodal,{gbox:\"#gbox_\"+$.jgrid.jqID(i.p.id),jqm:!0}),$(\"#jqg_alrt\").focus()),$(p).hide()}return!1}),$(p).append(j)),c.del&&(f=f||{},a=f.id||\"del_\"+b,j=$('<li class=\"ui-menu-item\" role=\"presentation\"><a class=\"'+l.cornerall+' g-menu-item\" tabindex=\"0\" role=\"menuitem\" id=\"'+a+'\">'+(c.deltext||c.deltitle)+\"</a></li>\").click(function(){if(!$(this).hasClass(l.disabled)){var a;i.p.multiselect?(a=i.p.selarrrow,0===a.length&&(a=null)):a=i.p.selrow,a?$.isFunction(c.delfunc)?c.delfunc.call(i,a):$(i).jqGrid(\"delGridRow\",a,f):($.jgrid.viewModal(\"#\"+o.themodal,{gbox:\"#gbox_\"+$.jgrid.jqID(i.p.id),jqm:!0}),$(\"#jqg_alrt\").focus()),$(p).hide()}return!1}),$(p).append(j)),(c.add||c.edit||c.del||c.view)&&$(p).append(\"<li class='ui-menu-item \"+l.disabled+\"' style='width:100%' role='presentation'><hr class='ui-separator-li'></li>\"),c.search&&(g=g||{},a=g.id||\"search_\"+b,j=$('<li class=\"ui-menu-item\" role=\"presentation\"><a class=\"'+l.cornerall+' g-menu-item\" tabindex=\"0\" role=\"menuitem\" id=\"'+a+'\">'+(c.searchtext||c.searchtitle)+\"</a></li>\").click(function(){return $(this).hasClass(l.disabled)||($.isFunction(c.searchfunc)?c.searchfunc.call(i,g):$(i).jqGrid(\"searchGrid\",g),$(p).hide()),!1}),$(p).append(j),g.showOnLoad&&g.showOnLoad===!0&&$(j).click()),c.refresh&&(a=g.id||\"search_\"+b,j=$('<li class=\"ui-menu-item\" role=\"presentation\"><a class=\"'+l.cornerall+' g-menu-item\" tabindex=\"0\" role=\"menuitem\" id=\"'+a+'\">'+(c.refreshtext||c.refreshtitle)+\"</a></li>\").click(function(){if(!$(this).hasClass(l.disabled)){$.isFunction(c.beforeRefresh)&&c.beforeRefresh.call(i),i.p.search=!1,i.p.resetsearch=!0;try{if(\"currentfilter\"!==c.refreshstate){var a=i.p.id;i.p.postData.filters=\"\";try{$(\"#fbox_\"+$.jgrid.jqID(a)).jqFilter(\"resetFilter\")}catch(b){}$.isFunction(i.clearToolbar)&&i.clearToolbar.call(i,!1)}}catch(d){}switch(c.refreshstate){case\"firstpage\":$(i).trigger(\"reloadGrid\",[{page:1}]);break;case\"current\":case\"currentfilter\":$(i).trigger(\"reloadGrid\",[{current:!0}])}$.isFunction(c.afterRefresh)&&c.afterRefresh.call(i),$(p).hide()}return!1}),$(p).append(j)),$(p).hide(),$(\"body\").append(p),$(\"#\"+m).addClass(\"ui-menu \"+k.menu_widget),$(\"#\"+m+\" > li > a\").hover(function(){$(this).addClass(l.hover)},function(){$(this).removeClass(l.hover)})};p(),$(\".dropdownmenu\").on(\"click\",function(){var a=$(this).offset(),b=a.left,c=parseInt(a.top),d=$(this).val();$(\"#\"+d).show().css({top:c-($(\"#\"+d).height()+10)+\"px\",left:b+\"px\"})}),$(\"body\").on(\"click\",function(a){$(a.target).hasClass(\"dropdownmenu\")||$(\"#\"+m).hide()})})},GridToForm:function(a,b){return this.each(function(){var c,d=this;if(d.grid){var e=$(d).jqGrid(\"getRowData\",a);if(e)for(c in e)e.hasOwnProperty(c)&&($(\"[name=\"+$.jgrid.jqID(c)+\"]\",b).is(\"input:radio\")||$(\"[name=\"+$.jgrid.jqID(c)+\"]\",b).is(\"input:checkbox\")?$(\"[name=\"+$.jgrid.jqID(c)+\"]\",b).each(function(){$(this).val()==e[c]?$(this)[d.p.useProp?\"prop\":\"attr\"](\"checked\",!0):$(this)[d.p.useProp?\"prop\":\"attr\"](\"checked\",!1)}):$(\"[name=\"+$.jgrid.jqID(c)+\"]\",b).val(e[c]))}})},FormToGrid:function(a,b,c,d){return this.each(function(){var e=this;if(e.grid){c||(c=\"set\"),d||(d=\"first\");var f=$(b).serializeArray(),g={};$.each(f,function(a,b){g[b.name]=b.value}),\"add\"===c?$(e).jqGrid(\"addRowData\",a,g,d):\"set\"===c&&$(e).jqGrid(\"setRowData\",a,g)}})}}),$.jgrid.extend({groupingSetup:function(){return this.each(function(){var a,b,c,d=this,e=d.p.colModel,f=d.p.groupingView,g=$.jgrid.styleUI[d.p.styleUI||\"jQueryUI\"].grouping;if(null===f||\"object\"!=typeof f&&!$.isFunction(f))d.p.grouping=!1;else if(f.plusicon||(f.plusicon=g.icon_plus),f.minusicon||(f.minusicon=g.icon_minus),f.groupField.length){for(void 0===f.visibiltyOnNextGrouping&&(f.visibiltyOnNextGrouping=[]),f.lastvalues=[],f._locgr||(f.groups=[]),f.counters=[],a=0;a<f.groupField.length;a++)f.groupOrder[a]||(f.groupOrder[a]=\"asc\"),f.groupText[a]||(f.groupText[a]=\"{0}\"),\"boolean\"!=typeof f.groupColumnShow[a]&&(f.groupColumnShow[a]=!0),\"boolean\"!=typeof f.groupSummary[a]&&(f.groupSummary[a]=!1),f.groupSummaryPos[a]||(f.groupSummaryPos[a]=\"footer\"),f.groupColumnShow[a]===!0?(f.visibiltyOnNextGrouping[a]=!0,$(d).jqGrid(\"showCol\",f.groupField[a])):(f.visibiltyOnNextGrouping[a]=$(\"#\"+$.jgrid.jqID(d.p.id+\"_\"+f.groupField[a])).is(\":visible\"),$(d).jqGrid(\"hideCol\",f.groupField[a]));for(f.summary=[],f.hideFirstGroupCol&&(f.formatDisplayField[0]=function(a){return a}),b=0,c=e.length;c>b;b++)f.hideFirstGroupCol&&(e[b].hidden||f.groupField[0]!==e[b].name||(e[b].formatter=function(){return\"\"})),e[b].summaryType&&f.summary.push(e[b].summaryDivider?{nm:e[b].name,st:e[b].summaryType,v:\"\",sd:e[b].summaryDivider,vd:\"\",sr:e[b].summaryRound,srt:e[b].summaryRoundType||\"round\"}:{nm:e[b].name,st:e[b].summaryType,v:\"\",sr:e[b].summaryRound,srt:e[b].summaryRoundType||\"round\"})}else d.p.grouping=!1})},groupingPrepare:function(a,b){return this.each(function(){var c,d,e,f,g,h=this.p.groupingView,i=this,j=function(){$.isFunction(this.st)?this.v=this.st.call(i,this.v,this.nm,a):(this.v=$(i).jqGrid(\"groupingCalculations.handler\",this.st,this.v,this.nm,this.sr,this.srt,a),\"avg\"===this.st.toLowerCase()&&this.sd&&(this.vd=$(i).jqGrid(\"groupingCalculations.handler\",this.st,this.vd,this.sd,this.sr,this.srt,a)))},k=h.groupField.length,l=0;for(c=0;k>c;c++)d=h.groupField[c],f=h.displayField[c],e=a[d],g=null==f?null:a[f],null==g&&(g=e),void 0!==e&&(0===b?(h.groups.push({idx:c,dataIndex:d,value:e,displayValue:g,startRow:b,cnt:1,summary:[]}),h.lastvalues[c]=e,h.counters[c]={cnt:1,pos:h.groups.length-1,summary:$.extend(!0,[],h.summary)},$.each(h.counters[c].summary,j),h.groups[h.counters[c].pos].summary=h.counters[c].summary):\"object\"==typeof e||($.isArray(h.isInTheSameGroup)&&$.isFunction(h.isInTheSameGroup[c])?h.isInTheSameGroup[c].call(i,h.lastvalues[c],e,c,h):h.lastvalues[c]===e)?1===l?(h.groups.push({idx:c,dataIndex:d,value:e,displayValue:g,startRow:b,cnt:1,summary:[]}),h.lastvalues[c]=e,h.counters[c]={cnt:1,pos:h.groups.length-1,summary:$.extend(!0,[],h.summary)},$.each(h.counters[c].summary,j),h.groups[h.counters[c].pos].summary=h.counters[c].summary):(h.counters[c].cnt+=1,h.groups[h.counters[c].pos].cnt=h.counters[c].cnt,$.each(h.counters[c].summary,j),h.groups[h.counters[c].pos].summary=h.counters[c].summary):(h.groups.push({idx:c,dataIndex:d,value:e,displayValue:g,startRow:b,cnt:1,summary:[]}),h.lastvalues[c]=e,l=1,h.counters[c]={cnt:1,pos:h.groups.length-1,summary:$.extend(!0,[],h.summary)},$.each(h.counters[c].summary,j),h.groups[h.counters[c].pos].summary=h.counters[c].summary))}),this},groupingToggle:function(a){return this.each(function(){var b=this,c=b.p.groupingView,d=a.split(\"_\"),e=parseInt(d[d.length-2],10);d.splice(d.length-2,2);var f,g,h=d.join(\"_\"),i=c.minusicon,j=c.plusicon,k=$(\"#\"+$.jgrid.jqID(a)),l=k.length?k[0].nextSibling:null,m=$(\"#\"+$.jgrid.jqID(a)+\" span.tree-wrap-\"+b.p.direction),n=function(a){var b=$.map(a.split(\" \"),function(a){return a.substring(0,h.length+1)===h+\"_\"?parseInt(a.substring(h.length+1),10):void 0});return b.length>0?b[0]:void 0},o=!1,p=!1,q=b.p.frozenColumns?b.p.id+\"_frozen\":!1,r=q?$(\"#\"+$.jgrid.jqID(a),\"#\"+$.jgrid.jqID(q)):!1,s=r&&r.length?r[0].nextSibling:null;if(m.hasClass(i)){if(c.showSummaryOnHide){if(l)for(;l&&(f=n(l.className),!(void 0!==f&&e>=f));)$(l).hide(),l=l.nextSibling,q&&($(s).hide(),s=s.nextSibling)}else if(l)for(;l&&(f=n(l.className),!(void 0!==f&&e>=f));)$(l).hide(),l=l.nextSibling,q&&($(s).hide(),s=s.nextSibling);m.removeClass(i).addClass(j),o=!0}else{if(l)for(g=void 0;l;){if(f=n(l.className),void 0===g&&(g=void 0===f),p=$(l).hasClass(\"ui-subgrid\")&&$(l).hasClass(\"ui-sg-collapsed\"),void 0!==f){if(e>=f)break;f===e+1&&(p||($(l).show().find(\">td>span.tree-wrap-\"+b.p.direction).removeClass(i).addClass(j),q&&$(s).show().find(\">td>span.tree-wrap-\"+b.p.direction).removeClass(i).addClass(j)))}else g&&(p||($(l).show(),q&&$(s).show()));l=l.nextSibling,q&&(s=s.nextSibling)}m.removeClass(j).addClass(i)}$(b).triggerHandler(\"jqGridGroupingClickGroup\",[a,o]),$.isFunction(b.p.onClickGroup)&&b.p.onClickGroup.call(b,a,o)}),!1},groupingRender:function(a,b,c,d){return this.each(function(){function e(a,b,c){var d,e=!1;if(0===b)e=c[a];else{var f=c[a].idx;if(0===f)e=c[a];else for(d=a;d>=0;d--)if(c[d].idx===f-b){e=c[d];break}}return e}function f(a,c,d,f){var g,h,i=e(a,c,d),k=j.p.colModel,l=i.cnt,m=\"\";for(h=f;b>h;h++){var n=\"<td \"+j.formatCol(h,1,\"\")+\">&#160;</td>\",o=\"{0}\";$.each(i.summary,function(){if(this.nm===k[h].name){k[h].summaryTpl&&(o=k[h].summaryTpl),\"string\"==typeof this.st&&\"avg\"===this.st.toLowerCase()&&(this.sd&&this.vd?this.v=this.v/this.vd:this.v&&l>0&&(this.v=this.v/l));try{this.groupCount=i.cnt,this.groupIndex=i.dataIndex,this.groupValue=i.value,g=j.formatter(\"\",this.v,h,this)}catch(a){g=this.v}return n=\"<td \"+j.formatCol(h,1,\"\")+\">\"+$.jgrid.template(o,g)+\"</td>\",!1}}),m+=n}return m}var g,h,i,j=this,k=j.p.groupingView,l=\"\",m=\"\",n=k.groupCollapse?k.plusicon:k.minusicon,o=[],p=k.groupField.length,q=$.jgrid.styleUI[j.p.styleUI||\"jQueryUI\"].common;n=n+\" tree-wrap-\"+j.p.direction,$.each(j.p.colModel,function(a,b){var c;for(c=0;p>c;c++)if(k.groupField[c]===b.name){o[c]=a;break}});var r,s=0,t=$.makeArray(k.groupSummary);t.reverse(),r=j.p.multiselect?' colspan=\"2\"':\"\",$.each(k.groups,function(e,u){if(k._locgr&&!(u.startRow+u.cnt>(c-1)*d&&u.startRow<c*d))return!0;s++,h=j.p.id+\"ghead_\"+u.idx,g=h+\"_\"+e,m=\"<span style='cursor:pointer;margin-right:8px;margin-left:5px;' class='\"+q.icon_base+\" \"+n+\"' onclick=\\\"jQuery('#\"+$.jgrid.jqID(j.p.id)+\"').jqGrid('groupingToggle','\"+g+\"');return false;\\\"></span>\";try{$.isArray(k.formatDisplayField)&&$.isFunction(k.formatDisplayField[u.idx])?(u.displayValue=k.formatDisplayField[u.idx].call(j,u.displayValue,u.value,j.p.colModel[o[u.idx]],u.idx,k),i=u.displayValue):i=j.formatter(g,u.displayValue,o[u.idx],u.value)}catch(v){i=u.displayValue}var w=\"\";w=$.isFunction(k.groupText[u.idx])?k.groupText[u.idx].call(j,i,u.cnt,u.summary):$.jgrid.template(k.groupText[u.idx],i,u.cnt,u.summary),\"string\"!=typeof w&&\"number\"!=typeof w&&(w=i),\"header\"===k.groupSummaryPos[u.idx]?(l+='<tr id=\"'+g+'\"'+(k.groupCollapse&&u.idx>0?' style=\"display:none;\" ':\" \")+'role=\"row\" class= \"'+q.content+\" jqgroup ui-row-\"+j.p.direction+\" \"+h+'\"><td style=\"padding-left:'+12*u.idx+'px;\"'+r+\">\"+m+w+\"</td>\",l+=f(e,0,k.groups,k.groupColumnShow[u.idx]===!1?\"\"===r?2:3:\"\"===r?1:2),l+=\"</tr>\"):l+='<tr id=\"'+g+'\"'+(k.groupCollapse&&u.idx>0?' style=\"display:none;\" ':\" \")+'role=\"row\" class= \"'+q.content+\" jqgroup ui-row-\"+j.p.direction+\" \"+h+'\"><td style=\"padding-left:'+12*u.idx+'px;\" colspan=\"'+(k.groupColumnShow[u.idx]===!1?b-1:b)+'\">'+m+w+\"</td></tr>\";var x=p-1===u.idx;if(x){var y,z,A=k.groups[e+1],B=0,C=u.startRow,D=void 0!==A?A.startRow:k.groups[e].startRow+k.groups[e].cnt;for(k._locgr&&(B=(c-1)*d,B>u.startRow&&(C=B)),y=C;D>y&&a[y-B];y++)l+=a[y-B].join(\"\");if(\"header\"!==k.groupSummaryPos[u.idx]){var E;if(void 0!==A){for(E=0;E<k.groupField.length&&A.dataIndex!==k.groupField[E];E++);s=k.groupField.length-E}for(z=0;s>z;z++)if(t[z]){var F=\"\";k.groupCollapse&&!k.showSummaryOnHide&&(F=' style=\"display:none;\"'),l+=\"<tr\"+F+' jqfootlevel=\"'+(u.idx-z)+'\" role=\"row\" class=\"'+q.content+\" jqfoot ui-row-\"+j.p.direction+'\">',l+=f(e,z,k.groups,0),l+=\"</tr>\"}s=E}}}),$(\"#\"+$.jgrid.jqID(j.p.id)+\" tbody:first\").append(l),l=null})},groupingGroupBy:function(a,b){return this.each(function(){var c=this;\"string\"==typeof a&&(a=[a]);var d=c.p.groupingView;c.p.grouping=!0,d._locgr=!1,void 0===d.visibiltyOnNextGrouping&&(d.visibiltyOnNextGrouping=[]);var e;for(e=0;e<d.groupField.length;e++)!d.groupColumnShow[e]&&d.visibiltyOnNextGrouping[e]&&$(c).jqGrid(\"showCol\",d.groupField[e]);for(e=0;e<a.length;e++)d.visibiltyOnNextGrouping[e]=$(\"#\"+$.jgrid.jqID(c.p.id)+\"_\"+$.jgrid.jqID(a[e])).is(\":visible\");c.p.groupingView=$.extend(c.p.groupingView,b||{}),d.groupField=a,$(c).trigger(\"reloadGrid\")})},groupingRemove:function(a){return this.each(function(){var b=this;if(void 0===a&&(a=!0),b.p.grouping=!1,a===!0){var c,d=b.p.groupingView;for(c=0;c<d.groupField.length;c++)!d.groupColumnShow[c]&&d.visibiltyOnNextGrouping[c]&&$(b).jqGrid(\"showCol\",d.groupField);$(\"tr.jqgroup, tr.jqfoot\",\"#\"+$.jgrid.jqID(b.p.id)+\" tbody:first\").remove(),$(\"tr.jqgrow:hidden\",\"#\"+$.jgrid.jqID(b.p.id)+\" tbody:first\").show()}else $(b).trigger(\"reloadGrid\")})},groupingCalculations:{handler:function(a,b,c,d,e,f){var g={sum:function(){return parseFloat(b||0)+parseFloat(f[c]||0)},min:function(){return\"\"===b?parseFloat(f[c]||0):Math.min(parseFloat(b),parseFloat(f[c]||0))},max:function(){return\"\"===b?parseFloat(f[c]||0):Math.max(parseFloat(b),parseFloat(f[c]||0))},count:function(){return\"\"===b&&(b=0),f.hasOwnProperty(c)?b+1:0},avg:function(){return g.sum()}};if(!g[a])throw\"jqGrid Grouping No such method: \"+a;var h=g[a]();if(null!=d)if(\"fixed\"===e)h=h.toFixed(d);else{var i=Math.pow(10,d);h=Math.round(h*i)/i}return h}},setGroupHeaders:function(a){return a=$.extend({useColSpanStyle:!1,groupHeaders:[]},a||{}),this.each(function(){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p=this,q=0,r=p.p.colModel,s=r.length,t=p.grid.headers,u=$(\"table.ui-jqgrid-htable\",p.grid.hDiv),v=u.children(\"thead\").children(\"tr.ui-jqgrid-labels:last\").addClass(\"jqg-second-row-header\"),w=u.children(\"thead\"),x=u.find(\".jqg-first-row-header\"),y=$.jgrid.styleUI[p.p.styleUI||\"jQueryUI\"].base;\np.p.groupHeader||(p.p.groupHeader=[]),p.p.groupHeader.push(a),void 0===x[0]?x=$(\"<tr>\",{role:\"row\",\"aria-hidden\":\"true\"}).addClass(\"jqg-first-row-header\").css(\"height\",\"auto\"):x.empty();var z,A=function(a,b){var c,d=b.length;for(c=0;d>c;c++)if(b[c].startColumnName===a)return c;return-1};for($(p).prepend(w),d=$(\"<tr>\",{role:\"row\"}).addClass(\"ui-jqgrid-labels jqg-third-row-header\"),b=0;s>b;b++)if(f=t[b].el,g=$(f),c=r[b],h={height:\"0px\",width:t[b].width+\"px\",display:c.hidden?\"none\":\"\"},$(\"<th>\",{role:\"gridcell\"}).css(h).addClass(\"ui-first-th-\"+p.p.direction).appendTo(x),f.style.width=\"\",i=A(c.name,a.groupHeaders),i>=0){for(j=a.groupHeaders[i],k=j.numberOfColumns,l=j.titleText,n=j.className||\"\",m=0,i=0;k>i&&s>b+i;i++)r[b+i].hidden||m++;e=$(\"<th>\").attr({role:\"columnheader\"}).addClass(y.headerBox+\" ui-th-column-header ui-th-\"+p.p.direction+\" \"+n).html(l),m>0&&e.attr(\"colspan\",String(m)),p.p.headertitles&&e.attr(\"title\",e.text()),0===m&&e.hide(),g.before(e),d.append(f),q=k-1}else 0===q?a.useColSpanStyle?g.attr(\"rowspan\",\"2\"):($(\"<th>\",{role:\"columnheader\"}).addClass(y.headerBox+\" ui-th-column-header ui-th-\"+p.p.direction).css({display:c.hidden?\"none\":\"\"}).insertBefore(g),d.append(f)):(d.append(f),q--);o=$(p).children(\"thead\"),o.prepend(x),d.insertAfter(v),u.append(o),a.useColSpanStyle&&(u.find(\"span.ui-jqgrid-resize\").each(function(){var a=$(this).parent();a.is(\":visible\")&&(this.style.cssText=\"height: \"+a.height()+\"px !important; cursor: col-resize;\")}),u.find(\"div.ui-jqgrid-sortable\").each(function(){var a=$(this),b=a.parent();b.is(\":visible\")&&b.is(\":has(span.ui-jqgrid-resize)\")&&a.css(\"top\",(b.height()-a.outerHeight())/2-4+\"px\")})),z=o.find(\"tr.jqg-first-row-header\"),$(p).bind(\"jqGridResizeStop.setGroupHeaders\",function(a,b,c){z.find(\"th\").eq(c).width(b)})})},destroyGroupHeader:function(a){return void 0===a&&(a=!0),this.each(function(){var b,c,d,e,f,g,h,i=this,j=i.grid,k=$(\"table.ui-jqgrid-htable thead\",j.hDiv),l=i.p.colModel;if(j){for($(this).unbind(\".setGroupHeaders\"),b=$(\"<tr>\",{role:\"row\"}).addClass(\"ui-jqgrid-labels\"),e=j.headers,c=0,d=e.length;d>c;c++){h=l[c].hidden?\"none\":\"\",f=$(e[c].el).width(e[c].width).css(\"display\",h);try{f.removeAttr(\"rowSpan\")}catch(m){f.attr(\"rowSpan\",1)}b.append(f),g=f.children(\"span.ui-jqgrid-resize\"),g.length>0&&(g[0].style.height=\"\"),f.children(\"div\")[0].style.top=\"\"}$(k).children(\"tr.ui-jqgrid-labels\").remove(),$(k).prepend(b),a===!0&&$(i).jqGrid(\"setGridParam\",{groupHeader:null})}})}}),$.jgrid=$.jgrid||{},$.extend($.jgrid,{saveState:function(a,b){if(b=$.extend({useStorage:!0,storageType:\"localStorage\",beforeSetItem:null,compression:!1,compressionModule:\"LZString\",compressionMethod:\"compressToUTF16\"},b||{}),a){var c,d,e=\"\",f=\"\",g=$(\"#\"+a)[0];if(g.grid){if(d=$(g).data(\"inlineNav\"),d&&g.p.inlineNav&&$(g).jqGrid(\"setGridParam\",{_iN:d}),d=$(g).data(\"filterToolbar\"),d&&g.p.filterToolbar&&$(g).jqGrid(\"setGridParam\",{_fT:d}),e=$(g).jqGrid(\"jqGridExport\",{exptype:\"jsonstring\",ident:\"\",root:\"\"}),$(g.grid.bDiv).find(\".ui-jqgrid-btable tr:gt(0)\").each(function(a,b){f+=b.outerHTML}),$.isFunction(b.beforeSetItem)&&(c=b.beforeSetItem.call(g,e),null!=c&&(e=c)),b.compression&&b.compressionModule)try{c=window[b.compressionModule][b.compressionMethod](e),null!=c&&(e=c,f=window[b.compressionModule][b.compressionMethod](f))}catch(h){}if(b.useStorage&&$.jgrid.isLocalStorage())try{window[b.storageType].setItem(\"jqGrid\"+g.p.id,e),window[b.storageType].setItem(\"jqGrid\"+g.p.id+\"_data\",f)}catch(h){22===h.code&&alert(\"Local storage limit is over!\")}return e}}},loadState:function(a,b,c){if(c=$.extend({useStorage:!0,storageType:\"localStorage\",clearAfterLoad:!1,beforeSetGrid:null,decompression:!1,decompressionModule:\"LZString\",decompressionMethod:\"decompressFromUTF16\"},c||{}),a){var d,e,f,g,h,i=$(\"#\"+a)[0];if(i.grid&&$.jgrid.gridUnload(a),c.useStorage)try{b=window[c.storageType].getItem(\"jqGrid\"+i.id),f=window[c.storageType].getItem(\"jqGrid\"+i.id+\"_data\")}catch(j){}if(b){if(c.decompression&&c.decompressionModule)try{d=window[c.decompressionModule][c.decompressionMethod](b),null!=d&&(b=d,f=window[c.decompressionModule][c.decompressionMethod](f))}catch(j){}if(d=jqGridUtils.parse(b),d&&\"object\"===$.type(d)){$.isFunction(c.beforeSetGrid)&&(e=c.beforeSetGrid(d),e&&\"object\"===$.type(e)&&(d=e));var k=function(a){var b;return b=a},l={reccount:d.reccount,records:d.records,lastpage:d.lastpage,shrinkToFit:k(d.shrinkToFit),data:k(d.data),datatype:k(d.datatype),grouping:k(d.grouping)};d.shrinkToFit=!1,d.data=[],d.datatype=\"local\",d.grouping=!1,d.navGrid=!1,d.inlineNav&&(g=k(d._iN),d._iN=null,delete d._iN),d.filterToolbar&&(h=k(d._fT),d._fT=null,delete d._fT);var m=$(\"#\"+a).jqGrid(d);m.append(f),m.jqGrid(\"setGridParam\",l),d.storeNavOptions&&m.jqGrid(\"navGrid\",d.pager,d.navOptions,d.editOptions,d.addOptions,d.delOptions,d.searchOptions,d.viewOptions),d.inlineNav&&g&&(m.jqGrid(\"setGridParam\",{inlineNav:!1}),m.jqGrid(\"inlineNav\",d.pager,g)),d.filterToolbar&&h&&(m.jqGrid(\"setGridParam\",{filterToolbar:!1}),m.jqGrid(\"filterToolbar\",h)),m[0].updatepager(!0,!0),c.clearAfterLoad&&(window[c.storageType].removeItem(\"jqGrid\"+i.id),window[c.storageType].removeItem(\"jqGrid\"+i.id+\"_data\"))}else alert(\"can not convert to object\")}}},setRegional:function(a,b){$.jgrid.saveState(a,{storageType:\"sessionStorage\"}),$.jgrid.loadState(a,null,{storageType:\"sessionStorage\",beforeSetGrid:function(a){return a.regional=b.regional,a.force_regional=!0,a}});var c=$(\"#\"+a)[0],d=$(c).jqGrid(\"getGridParam\",\"colModel\"),e=-1,f=$.jgrid.getRegional(c,\"nav\");$.each(d,function(a){return this.formatter&&\"actions\"===this.formatter?(e=a,!1):void 0}),-1!==e&&f&&$(\"#\"+a+\" tbody tr\").each(function(){var a=this.cells[e];$(a).find(\".ui-inline-edit\").attr(\"title\",f.edittitle),$(a).find(\".ui-inline-del\").attr(\"title\",f.deltitle),$(a).find(\".ui-inline-save\").attr(\"title\",f.savetitle),$(a).find(\".ui-inline-cancel\").attr(\"title\",f.canceltitle)});try{window.sessionStorage.removeItem(\"jqGrid\"+c.id),window.sessionStorage.removeItem(\"jqGrid\"+c.id+\"_data\")}catch(g){}},jqGridImport:function(a,b){b=$.extend({imptype:\"xml\",impstring:\"\",impurl:\"\",mtype:\"GET\",impData:{},xmlGrid:{config:\"root>grid\",data:\"root>rows\"},jsonGrid:{config:\"grid\",data:\"data\"},ajaxOptions:{}},b||{});var c=(0===a.indexOf(\"#\")?\"\":\"#\")+$.jgrid.jqID(a),d=function(a,b){var d,e,f,g=$(b.xmlGrid.config,a)[0],h=$(b.xmlGrid.data,a)[0];if(jqGridUtils.xmlToJSON){d=jqGridUtils.xmlToJSON(g);for(f in d)d.hasOwnProperty(f)&&(e=d[f]);if(h){var i=d.grid.datatype;d.grid.datatype=\"xmlstring\",d.grid.datastr=a,$(c).jqGrid(e).jqGrid(\"setGridParam\",{datatype:i})}else setTimeout(function(){$(c).jqGrid(e)},0)}else alert(\"xml2json or parse are not present\")},e=function(a,b){if(a&&\"string\"==typeof a){var d=jqGridUtils.parse(a),e=d[b.jsonGrid.config],f=d[b.jsonGrid.data];if(f){var g=e.datatype;e.datatype=\"jsonstring\",e.datastr=f,$(c).jqGrid(e).jqGrid(\"setGridParam\",{datatype:g})}else $(c).jqGrid(e)}};switch(b.imptype){case\"xml\":$.ajax($.extend({url:b.impurl,type:b.mtype,data:b.impData,dataType:\"xml\",complete:function(a,e){\"success\"===e&&(d(a.responseXML,b),$(c).triggerHandler(\"jqGridImportComplete\",[a,b]),$.isFunction(b.importComplete)&&b.importComplete(a)),a=null}},b.ajaxOptions));break;case\"xmlstring\":if(b.impstring&&\"string\"==typeof b.impstring){var f=$.parseXML(b.impstring);f&&(d(f,b),$(c).triggerHandler(\"jqGridImportComplete\",[f,b]),$.isFunction(b.importComplete)&&b.importComplete(f))}break;case\"json\":$.ajax($.extend({url:b.impurl,type:b.mtype,data:b.impData,dataType:\"json\",complete:function(a){try{e(a.responseText,b),$(c).triggerHandler(\"jqGridImportComplete\",[a,b]),$.isFunction(b.importComplete)&&b.importComplete(a)}catch(d){}a=null}},b.ajaxOptions));break;case\"jsonstring\":b.impstring&&\"string\"==typeof b.impstring&&(e(b.impstring,b),$(c).triggerHandler(\"jqGridImportComplete\",[b.impstring,b]),$.isFunction(b.importComplete)&&b.importComplete(b.impstring))}}}),$.jgrid.extend({jqGridExport:function(a){a=$.extend({exptype:\"xmlstring\",root:\"grid\",ident:\"\t\",addOptions:{}},a||{});var b=null;return this.each(function(){if(this.grid){var c,d=$.extend(!0,{},$(this).jqGrid(\"getGridParam\"),a.addOptions);if(d.rownumbers&&(d.colNames.splice(0,1),d.colModel.splice(0,1)),d.multiselect&&(d.colNames.splice(0,1),d.colModel.splice(0,1)),d.subGrid&&(d.colNames.splice(0,1),d.colModel.splice(0,1)),d.knv=null,d.treeGrid)for(c in d.treeReader)d.treeReader.hasOwnProperty(c)&&(d.colNames.splice(d.colNames.length-1),d.colModel.splice(d.colModel.length-1));switch(a.exptype){case\"xmlstring\":b=\"<\"+a.root+\">\"+jqGridUtils.jsonToXML(d,{xmlDecl:\"\"})+\"</\"+a.root+\">\";break;case\"jsonstring\":b=jqGridUtils.stringify(d),a.root&&(b=\"{\"+a.root+\":\"+b+\"}\")}}}),b},excelExport:function(a){return a=$.extend({exptype:\"remote\",url:null,oper:\"oper\",tag:\"excel\",exportOptions:{}},a||{}),this.each(function(){if(this.grid){var b;if(\"remote\"===a.exptype){var c=$.extend({},this.p.postData);c[a.oper]=a.tag;var d=jQuery.param(c);b=-1!==a.url.indexOf(\"?\")?a.url+\"&\"+d:a.url+\"?\"+d,window.location=b}}})}}),$.jgrid.inlineEdit=$.jgrid.inlineEdit||{},$.jgrid.extend({editRow:function(a,b,c,d,e,f,g,h,i){var j={},k=$.makeArray(arguments).slice(1);return\"object\"===$.type(k[0])?j=k[0]:(void 0!==b&&(j.keys=b),$.isFunction(c)&&(j.oneditfunc=c),$.isFunction(d)&&(j.successfunc=d),void 0!==e&&(j.url=e),void 0!==f&&(j.extraparam=f),$.isFunction(g)&&(j.aftersavefunc=g),$.isFunction(h)&&(j.errorfunc=h),$.isFunction(i)&&(j.afterrestorefunc=i)),j=$.extend(!0,{keys:!1,oneditfunc:null,successfunc:null,url:null,extraparam:{},aftersavefunc:null,errorfunc:null,afterrestorefunc:null,restoreAfterError:!0,mtype:\"POST\",focusField:!0},$.jgrid.inlineEdit,j),this.each(function(){var b,c,d,e,f,g,h=this,i=0,k=null,l={},m=$(this).jqGrid(\"getStyleUI\",h.p.styleUI+\".inlinedit\",\"inputClass\",!0);h.grid&&(e=$(h).jqGrid(\"getInd\",a,!0),e!==!1&&(g=$.isFunction(j.beforeEditRow)?j.beforeEditRow.call(h,j,a):void 0,void 0===g&&(g=!0),g&&(d=$(e).attr(\"editable\")||\"0\",\"0\"!==d||$(e).hasClass(\"not-editable-row\")||(f=h.p.colModel,$('td[role=\"gridcell\"]',e).each(function(d){b=f[d].name;var e=h.p.treeGrid===!0&&b===h.p.ExpandColumn;if(e)c=$(\"span:first\",this).html();else try{c=$.unformat.call(h,this,{rowId:a,colModel:f[d]},d)}catch(g){c=f[d].edittype&&\"textarea\"===f[d].edittype?$(this).text():$(this).html()}if(\"cb\"!==b&&\"subgrid\"!==b&&\"rn\"!==b&&(h.p.autoencode&&(c=$.jgrid.htmlDecode(c)),l[b]=c,f[d].editable===!0)){null===k&&(k=d),e?$(\"span:first\",this).html(\"\"):$(this).html(\"\");var j=$.extend({},f[d].editoptions||{},{id:a+\"_\"+b,name:b,rowId:a,oper:\"edit\"});f[d].edittype||(f[d].edittype=\"text\"),(\"&nbsp;\"===c||\"&#160;\"===c||1===c.length&&160===c.charCodeAt(0))&&(c=\"\");var n=$.jgrid.createEl.call(h,f[d].edittype,j,c,!0,$.extend({},$.jgrid.ajaxOptions,h.p.ajaxSelectOptions||{}));$(n).addClass(\"editable inline-edit-cell\"),$.inArray(f[d].edittype,[\"text\",\"textarea\",\"password\",\"select\"])>-1&&$(n).addClass(m),e?$(\"span:first\",this).append(n):$(this).append(n),$.jgrid.bindEv.call(h,n,j),\"select\"===f[d].edittype&&void 0!==f[d].editoptions&&f[d].editoptions.multiple===!0&&void 0===f[d].editoptions.dataUrl&&$.jgrid.msie&&$(n).width($(n).width()),i++}}),i>0&&(l.id=a,h.p.savedRow.push(l),$(e).attr(\"editable\",\"1\"),j.focusField&&(\"number\"==typeof j.focusField&&parseInt(j.focusField,10)<=f.length&&(k=j.focusField),setTimeout(function(){var a=$(\"td:eq(\"+k+\") :input:visible\",e).not(\":disabled\");a.length>0&&a.focus()},0)),j.keys===!0&&$(e).bind(\"keyup\",function(b){if(27===b.keyCode){if($(h).jqGrid(\"restoreRow\",a,j.afterrestorefunc),h.p.inlineNav)try{$(h).jqGrid(\"showAddEditButtons\")}catch(c){}return!1}if(13===b.keyCode){var d=b.target;if(\"TEXTAREA\"===d.tagName)return!0;if($(h).jqGrid(\"saveRow\",a,j)&&h.p.inlineNav)try{$(h).jqGrid(\"showAddEditButtons\")}catch(e){}return!1}}),$(h).triggerHandler(\"jqGridInlineEditRow\",[a,j]),$.isFunction(j.oneditfunc)&&j.oneditfunc.call(h,a))))))})},saveRow:function(a,b,c,d,e,f,g){var h=$.makeArray(arguments).slice(1),i={},j=this[0];\"object\"===$.type(h[0])?i=h[0]:($.isFunction(b)&&(i.successfunc=b),void 0!==c&&(i.url=c),void 0!==d&&(i.extraparam=d),$.isFunction(e)&&(i.aftersavefunc=e),$.isFunction(f)&&(i.errorfunc=f),$.isFunction(g)&&(i.afterrestorefunc=g)),i=$.extend(!0,{successfunc:null,url:null,extraparam:{},aftersavefunc:null,errorfunc:null,afterrestorefunc:null,restoreAfterError:!0,mtype:\"POST\",saveui:\"enable\",savetext:$.jgrid.getRegional(j,\"defaults.savetext\")},$.jgrid.inlineEdit,i);var k,l,m,n,o,p=!1,q={},r={},s={},t=!1,u=$.trim($(j).jqGrid(\"getStyleUI\",j.p.styleUI+\".common\",\"error\",!0));if(!j.grid)return p;if(o=$(j).jqGrid(\"getInd\",a,!0),o===!1)return p;var v=$.jgrid.getRegional(this,\"errors\"),w=$.jgrid.getRegional(this,\"edit\"),x=$.isFunction(i.beforeSaveRow)?i.beforeSaveRow.call(j,i,a):void 0;if(void 0===x&&(x=!0),x){if(l=$(o).attr(\"editable\"),i.url=i.url||j.p.editurl,\"1\"===l){var y;if($('td[role=\"gridcell\"]',o).each(function(a){if(y=j.p.colModel[a],k=y.name,\"cb\"!==k&&\"subgrid\"!==k&&y.editable===!0&&\"rn\"!==k&&!$(this).hasClass(\"not-editable-cell\")){switch(y.edittype){case\"checkbox\":var b=[\"Yes\",\"No\"];y.editoptions&&(b=y.editoptions.value.split(\":\")),q[k]=$(\"input\",this).is(\":checked\")?b[0]:b[1];break;case\"text\":case\"password\":case\"textarea\":case\"button\":q[k]=$(\"input, textarea\",this).val();break;case\"select\":if(y.editoptions.multiple){var c=$(\"select\",this),d=[];q[k]=$(c).val(),q[k]=q[k]?q[k].join(\",\"):\"\",$(\"select option:selected\",this).each(function(a,b){d[a]=$(b).text()}),r[k]=d.join(\",\")}else q[k]=$(\"select option:selected\",this).val(),r[k]=$(\"select option:selected\",this).text();y.formatter&&\"select\"===y.formatter&&(r={});break;case\"custom\":try{if(!y.editoptions||!$.isFunction(y.editoptions.custom_value))throw\"e1\";if(q[k]=y.editoptions.custom_value.call(j,$(\".customelement\",this),\"get\"),void 0===q[k])throw\"e2\"}catch(e){\"e1\"===e?$.jgrid.info_dialog(v.errcap,\"function 'custom_value' \"+w.msg.nodefined,w.bClose,{styleUI:j.p.styleUI}):$.jgrid.info_dialog(v.errcap,e.message,w.bClose,{styleUI:j.p.styleUI})}}if(n=$.jgrid.checkValues.call(j,q[k],a),n[0]===!1)return!1;j.p.autoencode&&(q[k]=$.jgrid.htmlEncode(q[k])),\"clientArray\"!==i.url&&y.editoptions&&y.editoptions.NullIfEmpty===!0&&\"\"===q[k]&&(s[k]=\"null\",t=!0)}}),n[0]===!1){try{var z=$(j).jqGrid(\"getGridRowById\",a),A=$.jgrid.findPos(z);$.jgrid.info_dialog(v.errcap,n[1],w.bClose,{left:A[0],top:A[1]+$(z).outerHeight(),styleUI:j.p.styleUI})}catch(B){alert(n[1])}return p}var C,D=j.p.prmNames,E=a;if(C=j.p.keyName===!1?D.id:j.p.keyName,q){if(q[D.oper]=D.editoper,void 0===q[C]||\"\"===q[C])q[C]=a;else if(o.id!==j.p.idPrefix+q[C]){var F=$.jgrid.stripPref(j.p.idPrefix,a);if(void 0!==j.p._index[F]&&(j.p._index[q[C]]=j.p._index[F],delete j.p._index[F]),a=j.p.idPrefix+q[C],$(o).attr(\"id\",a),j.p.selrow===E&&(j.p.selrow=a),$.isArray(j.p.selarrrow)){var G=$.inArray(E,j.p.selarrrow);G>=0&&(j.p.selarrrow[G]=a)}if(j.p.multiselect){var H=\"jqg_\"+j.p.id+\"_\"+a;$(\"input.cbox\",o).attr(\"id\",H).attr(\"name\",H)}}void 0===j.p.inlineData&&(j.p.inlineData={}),q=$.extend({},q,j.p.inlineData,i.extraparam)}if(\"clientArray\"===i.url){q=$.extend({},q,r),j.p.autoencode&&$.each(q,function(a,b){q[a]=$.jgrid.htmlDecode(b)});var I,J=$(j).jqGrid(\"setRowData\",a,q);for($(o).attr(\"editable\",\"0\"),I=0;I<j.p.savedRow.length;I++)if(String(j.p.savedRow[I].id)===String(E)){m=I;break}m>=0&&j.p.savedRow.splice(m,1),$(j).triggerHandler(\"jqGridInlineAfterSaveRow\",[a,J,q,i]),$.isFunction(i.aftersavefunc)&&i.aftersavefunc.call(j,a,J,q,i),p=!0,$(o).removeClass(\"jqgrid-new-row\").unbind(\"keydown\")}else $(j).jqGrid(\"progressBar\",{method:\"show\",loadtype:i.saveui,htmlcontent:i.savetext}),s=$.extend({},q,s),s[C]=$.jgrid.stripPref(j.p.idPrefix,s[C]),$.ajax($.extend({url:i.url,data:$.isFunction(j.p.serializeRowData)?j.p.serializeRowData.call(j,s):s,type:i.mtype,async:!1,complete:function(b,c){if($(j).jqGrid(\"progressBar\",{method:\"hide\",loadtype:i.saveui,htmlcontent:i.savetext}),\"success\"===c){var d,e,f=!0;if(d=$(j).triggerHandler(\"jqGridInlineSuccessSaveRow\",[b,a,i]),$.isArray(d)||(d=[!0,s]),d[0]&&$.isFunction(i.successfunc)&&(d=i.successfunc.call(j,b)),$.isArray(d)?(f=d[0],q=d[1]||q):f=d,f===!0){for(j.p.autoencode&&$.each(q,function(a,b){q[a]=$.jgrid.htmlDecode(b)}),t&&$.each(q,function(a){\"null\"===q[a]&&(q[a]=\"\")}),q=$.extend({},q,r),$(j).jqGrid(\"setRowData\",a,q),$(o).attr(\"editable\",\"0\"),e=0;e<j.p.savedRow.length;e++)if(String(j.p.savedRow[e].id)===String(a)){m=e;break}m>=0&&j.p.savedRow.splice(m,1),$(j).triggerHandler(\"jqGridInlineAfterSaveRow\",[a,b,q,i]),$.isFunction(i.aftersavefunc)&&i.aftersavefunc.call(j,a,b,q,i),p=!0,$(o).removeClass(\"jqgrid-new-row\").unbind(\"keydown\")}else $(j).triggerHandler(\"jqGridInlineErrorSaveRow\",[a,b,c,null,i]),$.isFunction(i.errorfunc)&&i.errorfunc.call(j,a,b,c,null),i.restoreAfterError===!0&&$(j).jqGrid(\"restoreRow\",a,i.afterrestorefunc)}},error:function(b,c,d){if($(\"#lui_\"+$.jgrid.jqID(j.p.id)).hide(),$(j).triggerHandler(\"jqGridInlineErrorSaveRow\",[a,b,c,d,i]),$.isFunction(i.errorfunc))i.errorfunc.call(j,a,b,c,d);else{var e=b.responseText||b.statusText;try{$.jgrid.info_dialog(v.errcap,'<div class=\"'+u+'\">'+e+\"</div>\",w.bClose,{buttonalign:\"right\",styleUI:j.p.styleUI})}catch(f){alert(e)}}i.restoreAfterError===!0&&$(j).jqGrid(\"restoreRow\",a,i.afterrestorefunc)}},$.jgrid.ajaxOptions,j.p.ajaxRowOptions||{}))}return p}},restoreRow:function(a,b){var c=$.makeArray(arguments).slice(1),d={};return\"object\"===$.type(c[0])?d=c[0]:$.isFunction(b)&&(d.afterrestorefunc=b),d=$.extend(!0,{},$.jgrid.inlineEdit,d),this.each(function(){var b,c,e=this,f=-1,g={};if(e.grid&&(b=$(e).jqGrid(\"getInd\",a,!0),b!==!1)){var h=$.isFunction(d.beforeCancelRow)?d.beforeCancelRow.call(e,d,a):void 0;if(void 0===h&&(h=!0),h){for(c=0;c<e.p.savedRow.length;c++)if(String(e.p.savedRow[c].id)===String(a)){f=c;break}if(f>=0){if($.isFunction($.fn.datepicker))try{$(\"input.hasDatepicker\",\"#\"+$.jgrid.jqID(b.id)).datepicker(\"hide\")}catch(i){}$.each(e.p.colModel,function(){this.editable===!0&&e.p.savedRow[f].hasOwnProperty(this.name)&&(g[this.name]=e.p.savedRow[f][this.name])}),$(e).jqGrid(\"setRowData\",a,g),$(b).attr(\"editable\",\"0\").unbind(\"keydown\"),e.p.savedRow.splice(f,1),$(\"#\"+$.jgrid.jqID(a),\"#\"+$.jgrid.jqID(e.p.id)).hasClass(\"jqgrid-new-row\")&&setTimeout(function(){$(e).jqGrid(\"delRowData\",a),$(e).jqGrid(\"showAddEditButtons\")},0)}$(e).triggerHandler(\"jqGridInlineAfterRestoreRow\",[a]),$.isFunction(d.afterrestorefunc)&&d.afterrestorefunc.call(e,a)}}})},addRow:function(a){return a=$.extend(!0,{rowID:null,initdata:{},position:\"first\",useDefValues:!0,useFormatter:!1,addRowParams:{extraparam:{}}},a||{}),this.each(function(){if(this.grid){var b=this,c=$.isFunction(a.beforeAddRow)?a.beforeAddRow.call(b,a.addRowParams):void 0;if(void 0===c&&(c=!0),c)if(a.rowID=$.isFunction(a.rowID)?a.rowID.call(b,a):null!=a.rowID?a.rowID:$.jgrid.randId(),a.useDefValues===!0&&$(b.p.colModel).each(function(){if(this.editoptions&&this.editoptions.defaultValue){var c=this.editoptions.defaultValue,d=$.isFunction(c)?c.call(b):c;a.initdata[this.name]=d}}),$(b).jqGrid(\"addRowData\",a.rowID,a.initdata,a.position),a.rowID=b.p.idPrefix+a.rowID,$(\"#\"+$.jgrid.jqID(a.rowID),\"#\"+$.jgrid.jqID(b.p.id)).addClass(\"jqgrid-new-row\"),a.useFormatter)$(\"#\"+$.jgrid.jqID(a.rowID)+\" .ui-inline-edit\",\"#\"+$.jgrid.jqID(b.p.id)).click();else{var d=b.p.prmNames,e=d.oper;a.addRowParams.extraparam[e]=d.addoper,$(b).jqGrid(\"editRow\",a.rowID,a.addRowParams),$(b).jqGrid(\"setSelection\",a.rowID)}}})},inlineNav:function(a,b){var c=this[0],d=$.jgrid.getRegional(c,\"nav\"),e=$.jgrid.styleUI[c.p.styleUI].inlinedit;return b=$.extend(!0,{edit:!0,editicon:e.icon_edit_nav,add:!0,addicon:e.icon_add_nav,save:!0,saveicon:e.icon_save_nav,cancel:!0,cancelicon:e.icon_cancel_nav,addParams:{addRowParams:{extraparam:{}}},editParams:{},restoreAfterSelect:!0},d,b||{}),this.each(function(){if(this.grid&&!this.p.inlineNav){var e=$.jgrid.jqID(c.p.id),f=$.trim($(c).jqGrid(\"getStyleUI\",c.p.styleUI+\".common\",\"disabled\",!0));if(c.p.navGrid||$(c).jqGrid(\"navGrid\",a,{refresh:!1,edit:!1,add:!1,del:!1,search:!1,view:!1}),$(c).data(\"inlineNav\")||$(c).data(\"inlineNav\",b),c.p.force_regional&&(b=$.extend(b,d)),c.p.inlineNav=!0,b.addParams.useFormatter===!0){var g,h=c.p.colModel;for(g=0;g<h.length;g++)if(h[g].formatter&&\"actions\"===h[g].formatter){if(h[g].formatoptions){var i={keys:!1,onEdit:null,onSuccess:null,afterSave:null,onError:null,afterRestore:null,extraparam:{},url:null},j=$.extend(i,h[g].formatoptions);b.addParams.addRowParams={keys:j.keys,oneditfunc:j.onEdit,successfunc:j.onSuccess,url:j.url,extraparam:j.extraparam,aftersavefunc:j.afterSave,errorfunc:j.onError,afterrestorefunc:j.afterRestore}}break}}b.add&&$(c).jqGrid(\"navButtonAdd\",a,{caption:b.addtext,title:b.addtitle,buttonicon:b.addicon,id:c.p.id+\"_iladd\",onClickButton:function(){$(c).jqGrid(\"addRow\",b.addParams),b.addParams.useFormatter||($(\"#\"+e+\"_ilsave\").removeClass(f),$(\"#\"+e+\"_ilcancel\").removeClass(f),$(\"#\"+e+\"_iladd\").addClass(f),$(\"#\"+e+\"_iledit\").addClass(f))}}),b.edit&&$(c).jqGrid(\"navButtonAdd\",a,{caption:b.edittext,title:b.edittitle,buttonicon:b.editicon,id:c.p.id+\"_iledit\",onClickButton:function(){var a=$(c).jqGrid(\"getGridParam\",\"selrow\");a?($(c).jqGrid(\"editRow\",a,b.editParams),$(\"#\"+e+\"_ilsave\").removeClass(f),$(\"#\"+e+\"_ilcancel\").removeClass(f),$(\"#\"+e+\"_iladd\").addClass(f),$(\"#\"+e+\"_iledit\").addClass(f)):($.jgrid.viewModal(\"#alertmod_\"+e,{gbox:\"#gbox_\"+e,jqm:!0}),$(\"#jqg_alrt\").focus())}}),b.save&&($(c).jqGrid(\"navButtonAdd\",a,{caption:b.savetext||\"\",title:b.savetitle||\"Save row\",buttonicon:b.saveicon,id:c.p.id+\"_ilsave\",onClickButton:function(){var a=c.p.savedRow[0].id;if(a){var d=c.p.prmNames,f=d.oper,g=b.editParams;$(\"#\"+$.jgrid.jqID(a),\"#\"+e).hasClass(\"jqgrid-new-row\")?(b.addParams.addRowParams.extraparam[f]=d.addoper,g=b.addParams.addRowParams):(b.editParams.extraparam||(b.editParams.extraparam={}),b.editParams.extraparam[f]=d.editoper),$(c).jqGrid(\"saveRow\",a,g)&&$(c).jqGrid(\"showAddEditButtons\")}else $.jgrid.viewModal(\"#alertmod_\"+e,{gbox:\"#gbox_\"+e,jqm:!0}),$(\"#jqg_alrt\").focus()}}),$(\"#\"+e+\"_ilsave\").addClass(f)),b.cancel&&($(c).jqGrid(\"navButtonAdd\",a,{caption:b.canceltext||\"\",title:b.canceltitle||\"Cancel row editing\",buttonicon:b.cancelicon,id:c.p.id+\"_ilcancel\",onClickButton:function(){var a=c.p.savedRow[0].id,d=b.editParams;a?($(\"#\"+$.jgrid.jqID(a),\"#\"+e).hasClass(\"jqgrid-new-row\")&&(d=b.addParams.addRowParams),$(c).jqGrid(\"restoreRow\",a,d),$(c).jqGrid(\"showAddEditButtons\")):($.jgrid.viewModal(\"#alertmod\",{gbox:\"#gbox_\"+e,jqm:!0}),$(\"#jqg_alrt\").focus())}}),$(\"#\"+e+\"_ilcancel\").addClass(f)),b.restoreAfterSelect===!0&&$(c).bind(\"jqGridBeforeSelectRow.inlineNav\",function(a,d){c.p.savedRow.length>0&&c.p.inlineNav===!0&&d!==c.p.selrow&&null!==c.p.selrow&&(c.p.selrow===b.addParams.rowID?$(c).jqGrid(\"delRowData\",c.p.selrow):$(c).jqGrid(\"restoreRow\",c.p.selrow,b.editParams),$(c).jqGrid(\"showAddEditButtons\"))})}})},showAddEditButtons:function(){return this.each(function(){if(this.grid){var a=$.jgrid.jqID(this.p.id),b=$.trim($(this).jqGrid(\"getStyleUI\",this.p.styleUI+\".common\",\"disabled\",!0));$(\"#\"+a+\"_ilsave\").addClass(b),$(\"#\"+a+\"_ilcancel\").addClass(b),$(\"#\"+a+\"_iladd\").removeClass(b),$(\"#\"+a+\"_iledit\").removeClass(b)}})}}),$.jgrid.msie&&8===$.jgrid.msiever()&&($.expr[\":\"].hidden=function(a){return 0===a.offsetWidth||0===a.offsetHeight||\"none\"===a.style.display}),$.jgrid._multiselect=!1,$.ui&&$.ui.multiselect){if($.ui.multiselect.prototype._setSelected){var setSelected=$.ui.multiselect.prototype._setSelected;$.ui.multiselect.prototype._setSelected=function(a,b){var c=setSelected.call(this,a,b);if(b&&this.selectedList){var d=this.element;this.selectedList.find(\"li\").each(function(){$(this).data(\"optionLink\")&&$(this).data(\"optionLink\").remove().appendTo(d)})}return c}}$.ui.multiselect.prototype.destroy&&($.ui.multiselect.prototype.destroy=function(){this.element.show(),this.container.remove(),void 0===$.Widget?$.widget.prototype.destroy.apply(this,arguments):$.Widget.prototype.destroy.apply(this,arguments)}),$.jgrid._multiselect=!0}$.jgrid.extend({sortableColumns:function(a){return this.each(function(){function b(){c.p.disableClick=!0}var c=this,d=$.jgrid.jqID(c.p.id),e={tolerance:\"pointer\",axis:\"x\",scrollSensitivity:\"1\",items:\">th:not(:has(#jqgh_\"+d+\"_cb,#jqgh_\"+d+\"_rn,#jqgh_\"+d+\"_subgrid),:hidden)\",placeholder:{element:function(a){var b=$(document.createElement(a[0].nodeName)).addClass(a[0].className+\" ui-sortable-placeholder ui-state-highlight\").removeClass(\"ui-sortable-helper\")[0];return b},update:function(a,b){b.height(a.currentItem.innerHeight()-parseInt(a.currentItem.css(\"paddingTop\")||0,10)-parseInt(a.currentItem.css(\"paddingBottom\")||0,10)),b.width(a.currentItem.innerWidth()-parseInt(a.currentItem.css(\"paddingLeft\")||0,10)-parseInt(a.currentItem.css(\"paddingRight\")||0,10))}},update:function(a,b){var d=$(b.item).parent(),e=$(\">th\",d),f=c.p.colModel,g={},h=c.p.id+\"_\";$.each(f,function(a){g[this.name]=a});var i=[];e.each(function(){var a=$(\">div\",this).get(0).id.replace(/^jqgh_/,\"\").replace(h,\"\");g.hasOwnProperty(a)&&i.push(g[a])}),$(c).jqGrid(\"remapColumns\",i,!0,!0),$.isFunction(c.p.sortable.update)&&c.p.sortable.update(i),setTimeout(function(){c.p.disableClick=!1},50)}};if(c.p.sortable.options?$.extend(e,c.p.sortable.options):$.isFunction(c.p.sortable)&&(c.p.sortable={update:c.p.sortable}),e.start){var f=e.start;e.start=function(a,c){b(),f.call(this,a,c)}}else e.start=b;c.p.sortable.exclude&&(e.items+=\":not(\"+c.p.sortable.exclude+\")\");var g=a.sortable(e),h=g.data(\"sortable\")||g.data(\"uiSortable\");null!=h&&(h.data(\"sortable\").floating=!0)})},columnChooser:function(a){function b(a,b,c){var d,e;return b>=0?(d=a.slice(),e=d.splice(b,Math.max(a.length-b,b)),b>a.length&&(b=a.length),d[b]=c,d.concat(e)):a}function c(a,b){a&&(\"string\"==typeof a?$.fn[a]&&$.fn[a].apply(b,$.makeArray(arguments).slice(2)):$.isFunction(a)&&a.apply(b,$.makeArray(arguments).slice(2)))}var d,e,f,g,h,i,j,k=this,l={},m=[],n=k.jqGrid(\"getGridParam\",\"colModel\"),o=k.jqGrid(\"getGridParam\",\"colNames\"),p=function(a){return $.ui.multiselect.prototype&&a.data($.ui.multiselect.prototype.widgetFullName||$.ui.multiselect.prototype.widgetName)||a.data(\"ui-multiselect\")||a.data(\"multiselect\")},q=$.jgrid.getRegional(this[0],\"col\");if(!$(\"#colchooser_\"+$.jgrid.jqID(k[0].p.id)).length){if(d=$('<div id=\"colchooser_'+k[0].p.id+'\" style=\"position:relative;overflow:hidden\"><div><select multiple=\"multiple\"></select></div></div>'),e=$(\"select\",d),a=$.extend({width:400,height:240,classname:null,done:function(a){a&&k.jqGrid(\"remapColumns\",a,!0)},msel:\"multiselect\",dlog:\"dialog\",dialog_opts:{minWidth:470,dialogClass:\"ui-jqdialog\"},dlog_opts:function(a){var b={};return b[a.bSubmit]=function(){a.apply_perm(),a.cleanup(!1)},b[a.bCancel]=function(){a.cleanup(!0)},$.extend(!0,{buttons:b,close:function(){a.cleanup(!0)},modal:a.modal||!1,resizable:a.resizable||!0,width:a.width+70,resize:function(){var a=p(e),b=a.container.closest(\".ui-dialog-content\");b.length>0&&\"object\"==typeof b[0].style?b[0].style.width=\"\":b.css(\"width\",\"\"),a.selectedList.height(Math.max(a.selectedContainer.height()-a.selectedActions.outerHeight()-1,1)),a.availableList.height(Math.max(a.availableContainer.height()-a.availableActions.outerHeight()-1,1))}},a.dialog_opts||{})},apply_perm:function(){var c=[];$(\"option\",e).each(function(){$(this).is(\"[selected]\")?k.jqGrid(\"showCol\",n[this.value].name):k.jqGrid(\"hideCol\",n[this.value].name)}),$(\"option[selected]\",e).each(function(){c.push(parseInt(this.value,10))}),$.each(c,function(){delete l[n[parseInt(this,10)].name]}),$.each(l,function(){var a=parseInt(this,10);c=b(c,a,a)}),a.done&&a.done.call(k,c),k.jqGrid(\"setGridWidth\",k[0].p.width,k[0].p.shrinkToFit)},cleanup:function(b){c(a.dlog,d,\"destroy\"),c(a.msel,e,\"destroy\"),d.remove(),b&&a.done&&a.done.call(k)},msel_opts:{}},q,a||{}),$.ui&&$.ui.multiselect&&$.ui.multiselect.defaults){if(!$.jgrid._multiselect)return void alert(\"Multiselect plugin loaded after jqGrid. Please load the plugin before the jqGrid!\");a.msel_opts=$.extend($.ui.multiselect.defaults,a.msel_opts)}a.caption&&d.attr(\"title\",a.caption),a.classname&&(d.addClass(a.classname),e.addClass(a.classname)),a.width&&($(\">div\",d).css({width:a.width,margin:\"0 auto\"}),e.css(\"width\",a.width)),a.height&&($(\">div\",d).css(\"height\",a.height),e.css(\"height\",a.height-10)),e.empty(),$.each(n,function(a){return l[this.name]=a,this.hidedlg?void(this.hidden||m.push(a)):void e.append(\"<option value='\"+a+\"' \"+(this.hidden?\"\":\"selected='selected'\")+\">\"+$.jgrid.stripHtml(o[a])+\"</option>\")}),f=$.isFunction(a.dlog_opts)?a.dlog_opts.call(k,a):a.dlog_opts,c(a.dlog,d,f),g=$.isFunction(a.msel_opts)?a.msel_opts.call(k,a):a.msel_opts,c(a.msel,e,g),h=$(\"#colchooser_\"+$.jgrid.jqID(k[0].p.id)),h.css({margin:\"auto\"}),h.find(\">div\").css({width:\"100%\",height:\"100%\",margin:\"auto\"}),i=p(e),i.container.css({width:\"100%\",height:\"100%\",margin:\"auto\"}),i.selectedContainer.css({width:100*i.options.dividerLocation+\"%\",height:\"100%\",margin:\"auto\",boxSizing:\"border-box\"}),i.availableContainer.css({width:100-100*i.options.dividerLocation+\"%\",height:\"100%\",margin:\"auto\",boxSizing:\"border-box\"}),i.selectedList.css(\"height\",\"auto\"),i.availableList.css(\"height\",\"auto\"),j=Math.max(i.selectedList.height(),i.availableList.height()),j=Math.min(j,$(window).height()),i.selectedList.css(\"height\",j),i.availableList.css(\"height\",j)}},sortableRows:function(a){return this.each(function(){var b=this;b.grid&&(b.p.treeGrid||$.fn.sortable&&(a=$.extend({cursor:\"move\",axis:\"y\",items:\" > .jqgrow\"},a||{}),a.start&&$.isFunction(a.start)?(a._start_=a.start,delete a.start):a._start_=!1,a.update&&$.isFunction(a.update)?(a._update_=a.update,delete a.update):a._update_=!1,a.start=function(c,d){if($(d.item).css(\"border-width\",\"0\"),$(\"td\",d.item).each(function(a){this.style.width=b.grid.cols[a].style.width}),b.p.subGrid){var e=$(d.item).attr(\"id\");try{$(b).jqGrid(\"collapseSubGridRow\",e)}catch(f){}}a._start_&&a._start_.apply(this,[c,d])},a.update=function(c,d){$(d.item).css(\"border-width\",\"\"),b.p.rownumbers===!0&&$(\"td.jqgrid-rownum\",b.rows).each(function(a){$(this).html(a+1+(parseInt(b.p.page,10)-1)*parseInt(b.p.rowNum,10))}),a._update_&&a._update_.apply(this,[c,d])},$(\"tbody:first\",b).sortable(a),$(\"tbody:first > .jqgrow\",b).disableSelection()))})},gridDnD:function(a){return this.each(function(){function b(){var a=$.data(e,\"dnd\");$(\"tr.jqgrow:not(.ui-draggable)\",e).draggable($.isFunction(a.drag)?a.drag.call($(e),a):a.drag)}var c,d,e=this;if(e.grid&&!e.p.treeGrid&&$.fn.draggable&&$.fn.droppable){var f=\"<table id='jqgrid_dnd' class='ui-jqgrid-dnd'></table>\";if(void 0===$(\"#jqgrid_dnd\")[0]&&$(\"body\").append(f),\"string\"==typeof a&&\"updateDnD\"===a&&e.p.jqgdnd===!0)return void b();if(a=$.extend({drag:function(a){return $.extend({start:function(b,c){var d,f;if(e.p.subGrid){f=$(c.helper).attr(\"id\");try{$(e).jqGrid(\"collapseSubGridRow\",f)}catch(g){}}for(d=0;d<$.data(e,\"dnd\").connectWith.length;d++)0===$($.data(e,\"dnd\").connectWith[d]).jqGrid(\"getGridParam\",\"reccount\")&&$($.data(e,\"dnd\").connectWith[d]).jqGrid(\"addRowData\",\"jqg_empty_row\",{});c.helper.addClass(\"ui-state-highlight\"),$(\"td\",c.helper).each(function(a){this.style.width=e.grid.headers[a].width+\"px\"}),a.onstart&&$.isFunction(a.onstart)&&a.onstart.call($(e),b,c)},stop:function(b,c){var d,f;for(c.helper.dropped&&!a.dragcopy&&(f=$(c.helper).attr(\"id\"),void 0===f&&(f=$(this).attr(\"id\")),$(e).jqGrid(\"delRowData\",f)),d=0;d<$.data(e,\"dnd\").connectWith.length;d++)$($.data(e,\"dnd\").connectWith[d]).jqGrid(\"delRowData\",\"jqg_empty_row\");a.onstop&&$.isFunction(a.onstop)&&a.onstop.call($(e),b,c)}},a.drag_opts||{})},drop:function(a){return $.extend({accept:function(a){if(!$(a).hasClass(\"jqgrow\"))return a;var b=$(a).closest(\"table.ui-jqgrid-btable\");if(b.length>0&&void 0!==$.data(b[0],\"dnd\")){var c=$.data(b[0],\"dnd\").connectWith;return-1!==$.inArray(\"#\"+$.jgrid.jqID(this.id),c)?!0:!1}return!1},drop:function(b,c){if($(c.draggable).hasClass(\"jqgrow\")){var d=$(c.draggable).attr(\"id\"),f=c.draggable.parent().parent().jqGrid(\"getRowData\",d);if(!a.dropbyname){var g,h,i=0,j={},k=$(\"#\"+$.jgrid.jqID(this.id)).jqGrid(\"getGridParam\",\"colModel\");\ntry{for(h in f)f.hasOwnProperty(h)&&(g=k[i].name,\"cb\"!==g&&\"rn\"!==g&&\"subgrid\"!==g&&f.hasOwnProperty(h)&&k[i]&&(j[g]=f[h]),i++);f=j}catch(l){}}if(c.helper.dropped=!0,a.beforedrop&&$.isFunction(a.beforedrop)){var m=a.beforedrop.call(this,b,c,f,$(\"#\"+$.jgrid.jqID(e.p.id)),$(this));void 0!==m&&null!==m&&\"object\"==typeof m&&(f=m)}if(c.helper.dropped){var n;a.autoid&&($.isFunction(a.autoid)?n=a.autoid.call(this,f):(n=Math.ceil(1e3*Math.random()),n=a.autoidprefix+n)),$(\"#\"+$.jgrid.jqID(this.id)).jqGrid(\"addRowData\",n,f,a.droppos)}a.ondrop&&$.isFunction(a.ondrop)&&a.ondrop.call(this,b,c,f)}}},a.drop_opts||{})},onstart:null,onstop:null,beforedrop:null,ondrop:null,drop_opts:{activeClass:\"ui-state-active\",hoverClass:\"ui-state-hover\"},drag_opts:{revert:\"invalid\",helper:\"clone\",cursor:\"move\",appendTo:\"#jqgrid_dnd\",zIndex:5e3},dragcopy:!1,dropbyname:!1,droppos:\"first\",autoid:!0,autoidprefix:\"dnd_\"},a||{}),a.connectWith)for(a.connectWith=a.connectWith.split(\",\"),a.connectWith=$.map(a.connectWith,function(a){return $.trim(a)}),$.data(e,\"dnd\",a),0===e.p.reccount||e.p.jqgdnd||b(),e.p.jqgdnd=!0,c=0;c<a.connectWith.length;c++)d=a.connectWith[c],$(d).droppable($.isFunction(a.drop)?a.drop.call($(e),a):a.drop)}})},gridResize:function(opts){return this.each(function(){var $t=this,gID=$.jgrid.jqID($t.p.id),req;if($t.grid&&$.fn.resizable){if(opts=$.extend({},opts||{}),opts.alsoResize?(opts._alsoResize_=opts.alsoResize,delete opts.alsoResize):opts._alsoResize_=!1,opts.stop&&$.isFunction(opts.stop)?(opts._stop_=opts.stop,delete opts.stop):opts._stop_=!1,opts.stop=function(a,b){$($t).jqGrid(\"setGridParam\",{height:$(\"#gview_\"+gID+\" .ui-jqgrid-bdiv\").height()}),$($t).jqGrid(\"setGridWidth\",b.size.width,opts.shrinkToFit),opts._stop_&&opts._stop_.call($t,a,b),$t.p.caption&&$(\"#gbox_\"+gID).css({height:\"auto\"}),$t.p.frozenColumns&&(req&&clearTimeout(req),req=setTimeout(function(){req&&clearTimeout(req),$(\"#\"+gID).jqGrid(\"destroyFrozenColumns\"),$(\"#\"+gID).jqGrid(\"setFrozenColumns\")}))},opts._alsoResize_){var optstest=\"{'#gview_\"+gID+\" .ui-jqgrid-bdiv':true,'\"+opts._alsoResize_+\"':true}\";opts.alsoResize=eval(\"(\"+optstest+\")\")}else opts.alsoResize=$(\".ui-jqgrid-bdiv\",\"#gview_\"+gID);delete opts._alsoResize_,$(\"#gbox_\"+gID).resizable(opts)}})}}),$.assocArraySize=function(a){var b,c=0;for(b in a)a.hasOwnProperty(b)&&c++;return c},$.jgrid.extend({pivotSetup:function(a,b){var c=[],d=[],e=[],f=[],g=[],h={grouping:!0,groupingView:{groupField:[],groupSummary:[],groupSummaryPos:[]}},i=[],j=$.extend({rowTotals:!1,rowTotalsText:\"Total\",colTotals:!1,groupSummary:!0,groupSummaryPos:\"header\",frozenStaticCols:!1},b||{});return this.each(function(){function b(a,b,c){var d;return d=_pivotfilter.call(a,b,c),d.length>0?d[0]:null}function k(a,b){var c,d=0,e=!0;for(c in a)if(a.hasOwnProperty(c)){if(a[c]!=this[d]){e=!1;break}if(d++,d>=this.length)break}return e&&(p=b),e}function l(a,b,c,d){var e;switch(a){case\"sum\":e=parseFloat(b||0)+parseFloat(d[c]||0);break;case\"count\":(\"\"===b||null==b)&&(b=0),e=d.hasOwnProperty(c)?b+1:0;break;case\"min\":e=\"\"===b||null==b?parseFloat(d[c]||0):Math.min(parseFloat(b),parseFloat(d[c]||0));break;case\"max\":e=\"\"===b||null==b?parseFloat(d[c]||0):Math.max(parseFloat(b),parseFloat(d[c]||0))}return e}function m(a,b,c,d){var e,h,i,j,k=b.length,m=\"\",n=[];for($.isArray(c)?(j=c.length,n=c):(j=1,n[0]=c),f=[],g=[],f.root=0,i=0;j>i;i++){var o,p=[];for(e=0;k>e;e++){if(null==c)h=$.trim(b[e].member)+\"_\"+b[e].aggregator,o=h,n[0]=b[e].label||b[e].aggregator+\" \"+$.trim(b[e].member);else{o=c[i].replace(/\\s+/g,\"\");try{h=1===k?m+o:m+o+\"_\"+b[e].aggregator+\"_\"+String(e)}catch(q){}n[i]=c[i]}h=isNaN(parseInt(h,10))?h:h+\" \",d[h]=p[h]=l(b[e].aggregator,d[h],b[e].member,a),1>=i&&\"_r_Totals\"!==o&&\"\"===m&&(m=o)}f[h]=p,g[h]=n[i]}return d}function n(a){var b,d,e,f,g;for(e in a)if(a.hasOwnProperty(e)){if(\"object\"!=typeof a[e]){if(\"level\"===e){if(void 0===J[a.level]&&(J[a.level]=\"\",a.level>0&&\"_r_Totals\"!==a.text&&(i[a.level-1]={useColSpanStyle:!1,groupHeaders:[]})),J[a.level]!==a.text&&a.children.length&&\"_r_Totals\"!==a.text&&a.level>0){i[a.level-1].groupHeaders.push({titleText:a.label,numberOfColumns:0});var h=i[a.level-1].groupHeaders.length-1,k=0===h?L:K+t;if(a.level-1===(j.rowTotals?1:0)&&h>0){for(var l=0,m=0;h>m;m++)l+=i[a.level-1].groupHeaders[m].numberOfColumns;l&&(k=l+r)}c[k]&&(i[a.level-1].groupHeaders[h].startColumnName=c[k].name,i[a.level-1].groupHeaders[h].numberOfColumns=c.length-k),K=c.length}J[a.level]=a.text}if(a.level===s&&\"level\"===e&&s>0)if(t>1){var o=1;for(b in a.fields)a.fields.hasOwnProperty(b)&&(1===o&&i[s-1].groupHeaders.push({startColumnName:b,numberOfColumns:1,titleText:a.label||a.text}),o++);i[s-1].groupHeaders[i[s-1].groupHeaders.length-1].numberOfColumns=o-1}else i.splice(s-1,1)}if(null!=a[e]&&\"object\"==typeof a[e]&&n(a[e]),\"level\"===e&&a.level>0&&a.level===(0===s?a.level:s)){d=0;for(b in a.fields)if(a.fields.hasOwnProperty(b)){g={};for(f in j.aggregates[d])if(j.aggregates[d].hasOwnProperty(f))switch(f){case\"member\":case\"label\":case\"aggregator\":break;default:g[f]=j.aggregates[d][f]}t>1?(g.name=b,g.label=j.aggregates[d].label||a.label):(g.name=a.text,g.label=\"_r_Totals\"===a.text?j.rowTotalsText:a.label),c.push(g),d++}}}}var o,p,q,r,s,t,u,v,w=a.length,x=0;if(j.rowTotals&&j.yDimension.length>0){var y=j.yDimension[0].dataName;j.yDimension.splice(0,0,{dataName:y}),j.yDimension[0].converter=function(){return\"_r_Totals\"}}if(r=$.isArray(j.xDimension)?j.xDimension.length:0,s=j.yDimension.length,t=$.isArray(j.aggregates)?j.aggregates.length:0,0===r||0===t)throw\"xDimension or aggregates optiona are not set!\";var z;for(q=0;r>q;q++)z={name:j.xDimension[q].dataName,frozen:j.frozenStaticCols},null==j.xDimension[q].isGroupField&&(j.xDimension[q].isGroupField=!0),z=$.extend(!0,z,j.xDimension[q]),c.push(z);for(var A=r-1,B={};w>x;){o=a[x];var C=[],D=[];u={},q=0;do C[q]=$.trim(o[j.xDimension[q].dataName]),u[j.xDimension[q].dataName]=C[q],q++;while(r>q);var E=0;if(p=-1,v=b(d,k,C)){if(p>=0){if(E=0,s>=1){for(E=0;s>E;E++)D[E]=$.trim(o[j.yDimension[E].dataName]),j.yDimension[E].converter&&$.isFunction(j.yDimension[E].converter)&&(D[E]=j.yDimension[E].converter.call(this,D[E],C,D));v=m(o,j.aggregates,D,v)}else 0===s&&(v=m(o,j.aggregates,null,v));d[p]=v}}else{if(E=0,s>=1){for(E=0;s>E;E++)D[E]=$.trim(o[j.yDimension[E].dataName]),j.yDimension[E].converter&&$.isFunction(j.yDimension[E].converter)&&(D[E]=j.yDimension[E].converter.call(this,D[E],C,D));u=m(o,j.aggregates,D,u)}else 0===s&&(u=m(o,j.aggregates,null,u));d.push(u)}var F,G=0,H=null,I=null;for(F in f)if(f.hasOwnProperty(F)){if(0===G)B.children&&void 0!==B.children||(B={text:F,level:0,children:[],label:F}),H=B.children;else{for(I=null,q=0;q<H.length;q++)if(H[q].text===F){I=H[q];break}I?H=I.children:(H.push({children:[],text:F,level:G,fields:f[F],label:g[F]}),H=H[H.length-1].children)}G++}x++}var J=[],K=c.length,L=K;s>0&&(i[s-1]={useColSpanStyle:!1,groupHeaders:[]}),n(B);var M;if(j.colTotals)for(var N=d.length;N--;)for(q=r;q<c.length;q++)M=c[q].name,e[M]?e[M]+=parseFloat(d[N][M]||0):e[M]=parseFloat(d[N][M]||0);if(A>0)for(q=0;A>q;q++)c[q].isGroupField&&(h.groupingView.groupField.push(c[q].name),h.groupingView.groupSummary.push(j.groupSummary),h.groupingView.groupSummaryPos.push(j.groupSummaryPos));else h.grouping=!1;h.sortname=c[A].name,h.groupingView.hideFirstGroupCol=!0}),{colModel:c,rows:d,groupOptions:h,groupHeaders:i,summary:e}},jqPivot:function(a,b,c,d){return this.each(function(){function e(a){var d,e=jQuery(f).jqGrid(\"pivotSetup\",a,b),g=$.assocArraySize(e.summary)>0?!0:!1,h=$.jgrid.from.call(f,e.rows);for(d=0;d<e.groupOptions.groupingView.groupField.length;d++)h.orderBy(e.groupOptions.groupingView.groupField[d],\"a\",\"text\",\"\");jQuery(f).jqGrid($.extend(!0,{datastr:$.extend(h.select(),g?{userdata:e.summary}:{}),datatype:\"jsonstring\",footerrow:g,userDataOnFooter:g,colModel:e.colModel,viewrecords:!0,sortname:b.xDimension[0].dataName},e.groupOptions,c||{}));var i=e.groupHeaders;if(i.length)for(d=0;d<i.length;d++)i[d]&&i[d].groupHeaders.length&&jQuery(f).jqGrid(\"setGroupHeaders\",i[d]);b.frozenStaticCols&&jQuery(f).jqGrid(\"setFrozenColumns\")}var f=this;\"string\"==typeof a?$.ajax($.extend({url:a,dataType:\"json\",success:function(a){e($.jgrid.getAccessor(a,d&&d.reader?d.reader:\"rows\"))}},d||{})):e(a)})}}),$.jgrid.extend({setSubGrid:function(){return this.each(function(){var a,b,c=this,d=$.jgrid.styleUI[c.p.styleUI||\"jQueryUI\"].subgrid,e={plusicon:d.icon_plus,minusicon:d.icon_minus,openicon:d.icon_open,expandOnLoad:!1,delayOnLoad:50,selectOnExpand:!1,selectOnCollapse:!1,reloadOnExpand:!0};if(c.p.subGridOptions=$.extend(e,c.p.subGridOptions||{}),c.p.colNames.unshift(\"\"),c.p.colModel.unshift({name:\"subgrid\",width:$.jgrid.cell_width?c.p.subGridWidth+c.p.cellLayout:c.p.subGridWidth,sortable:!1,resizable:!1,hidedlg:!0,search:!1,fixed:!0}),a=c.p.subGridModel,a[0])for(a[0].align=$.extend([],a[0].align||[]),b=0;b<a[0].name.length;b++)a[0].align[b]=a[0].align[b]||\"left\"})},addSubGridCell:function(a,b){var c,d,e,f=\"\";return this.each(function(){f=this.formatCol(a,b),d=this.p.id,c=this.p.subGridOptions.plusicon,e=$.jgrid.styleUI[this.p.styleUI||\"jQueryUI\"].common}),'<td role=\"gridcell\" aria-describedby=\"'+d+'_subgrid\" class=\"ui-sgcollapsed sgcollapsed\" '+f+\"><a style='cursor:pointer;' class='ui-sghref'><span class='\"+e.icon_base+\" \"+c+\"'></span></a></td>\"},addSubGrid:function(a,b){return this.each(function(){var c=this;if(c.grid){var d,e,f,g,h,i=$.jgrid.styleUI[c.p.styleUI||\"jQueryUI\"].base,j=$.jgrid.styleUI[c.p.styleUI||\"jQueryUI\"].common,k=function(a,b,d){var e=$(\"<td align='\"+c.p.subGridModel[0].align[d]+\"'></td>\").html(b);$(a).append(e)},l=function(a,b){var d,e,f,g=$(\"<table class='\"+i.rowTable+\" ui-common-table'><tbody></tbody></table>\"),h=$(\"<tr></tr>\");for(e=0;e<c.p.subGridModel[0].name.length;e++)d=$(\"<th class='\"+i.headerBox+\" ui-th-subgrid ui-th-column ui-th-\"+c.p.direction+\"'></th>\"),$(d).html(c.p.subGridModel[0].name[e]),$(d).width(c.p.subGridModel[0].width[e]),$(h).append(d);$(g).append(h),a&&(f=c.p.xmlReader.subgrid,$(f.root+\" \"+f.row,a).each(function(){if(h=$(\"<tr class='\"+j.content+\" ui-subtblcell'></tr>\"),f.repeatitems===!0)$(f.cell,this).each(function(a){k(h,$(this).text()||\"&#160;\",a)});else{var a=c.p.subGridModel[0].mapping||c.p.subGridModel[0].name;if(a)for(e=0;e<a.length;e++)k(h,$(a[e],this).text()||\"&#160;\",e)}$(g).append(h)}));var l=$(\"table:first\",c.grid.bDiv).attr(\"id\")+\"_\";return $(\"#\"+$.jgrid.jqID(l+b)).append(g),c.grid.hDiv.loading=!1,$(\"#load_\"+$.jgrid.jqID(c.p.id)).hide(),!1},m=function(a,b){var d,e,f,g,h,l,m=$(\"<table class='\"+i.rowTable+\" ui-common-table'><tbody></tbody></table>\"),n=$(\"<tr></tr>\");for(f=0;f<c.p.subGridModel[0].name.length;f++)d=$(\"<th class='\"+i.headerBox+\" ui-th-subgrid ui-th-column ui-th-\"+c.p.direction+\"'></th>\"),$(d).html(c.p.subGridModel[0].name[f]),$(d).width(c.p.subGridModel[0].width[f]),$(n).append(d);if($(m).append(n),a&&(h=c.p.jsonReader.subgrid,e=$.jgrid.getAccessor(a,h.root),void 0!==e))for(f=0;f<e.length;f++){if(g=e[f],n=$(\"<tr class='\"+j.content+\" ui-subtblcell'></tr>\"),h.repeatitems===!0)for(h.cell&&(g=g[h.cell]),l=0;l<g.length;l++)k(n,g[l]||\"&#160;\",l);else{var o=c.p.subGridModel[0].mapping||c.p.subGridModel[0].name;if(o.length)for(l=0;l<o.length;l++)k(n,g[o[l]]||\"&#160;\",l)}$(m).append(n)}var p=$(\"table:first\",c.grid.bDiv).attr(\"id\")+\"_\";return $(\"#\"+$.jgrid.jqID(p+b)).append(m),c.grid.hDiv.loading=!1,$(\"#load_\"+$.jgrid.jqID(c.p.id)).hide(),!1},n=function(a){var b,d,e,f;if(b=$(a).attr(\"id\"),d={nd_:(new Date).getTime()},d[c.p.prmNames.subgridid]=b,!c.p.subGridModel[0])return!1;if(c.p.subGridModel[0].params)for(f=0;f<c.p.subGridModel[0].params.length;f++)for(e=0;e<c.p.colModel.length;e++)c.p.colModel[e].name===c.p.subGridModel[0].params[f]&&(d[c.p.colModel[e].name]=$(\"td:eq(\"+e+\")\",a).text().replace(/\\&#160\\;/gi,\"\"));if(!c.grid.hDiv.loading)switch(c.grid.hDiv.loading=!0,$(\"#load_\"+$.jgrid.jqID(c.p.id)).show(),c.p.subgridtype||(c.p.subgridtype=c.p.datatype),$.isFunction(c.p.subgridtype)?c.p.subgridtype.call(c,d):c.p.subgridtype=c.p.subgridtype.toLowerCase(),c.p.subgridtype){case\"xml\":case\"json\":$.ajax($.extend({type:c.p.mtype,url:$.isFunction(c.p.subGridUrl)?c.p.subGridUrl.call(c,d):c.p.subGridUrl,dataType:c.p.subgridtype,data:$.isFunction(c.p.serializeSubGridData)?c.p.serializeSubGridData.call(c,d):d,complete:function(a){\"xml\"===c.p.subgridtype?l(a.responseXML,b):m($.jgrid.parse(a.responseText),b),a=null}},$.jgrid.ajaxOptions,c.p.ajaxSubgridOptions||{}))}return!1},o=0;$.each(c.p.colModel,function(){(this.hidden===!0||\"rn\"===this.name||\"cb\"===this.name)&&o++});var p=c.rows.length,q=1;for(void 0!==b&&b>0&&(q=b,p=b+1);p>q;)$(c.rows[q]).hasClass(\"jqgrow\")&&(c.p.scroll&&$(c.rows[q].cells[a]).unbind(\"click\"),$(c.rows[q].cells[a]).bind(\"click\",function(){var b=$(this).parent(\"tr\")[0];if(e=c.p.id,d=b.id,h=$(\"#\"+e+\"_\"+d+\"_expandedContent\"),$(this).hasClass(\"sgcollapsed\")){if(g=$(c).triggerHandler(\"jqGridSubGridBeforeExpand\",[e+\"_\"+d,d]),g=g===!1||\"stop\"===g?!1:!0,g&&$.isFunction(c.p.subGridBeforeExpand)&&(g=c.p.subGridBeforeExpand.call(c,e+\"_\"+d,d)),g===!1)return!1;c.p.subGridOptions.reloadOnExpand===!0||c.p.subGridOptions.reloadOnExpand===!1&&!h.hasClass(\"ui-subgrid\")?(f=a>=1?\"<td colspan='\"+a+\"'>&#160;</td>\":\"\",$(b).after(\"<tr role='row' id='\"+e+\"_\"+d+\"_expandedContent' class='ui-subgrid ui-sg-expanded'>\"+f+\"<td class='\"+j.content+\" subgrid-cell'><span class='\"+j.icon_base+\" \"+c.p.subGridOptions.openicon+\"'></span></td><td colspan='\"+parseInt(c.p.colNames.length-1-o,10)+\"' class='\"+j.content+\" subgrid-data'><div id=\"+e+\"_\"+d+\" class='tablediv'></div></td></tr>\"),$(c).triggerHandler(\"jqGridSubGridRowExpanded\",[e+\"_\"+d,d]),$.isFunction(c.p.subGridRowExpanded)?c.p.subGridRowExpanded.call(c,e+\"_\"+d,d):n(b)):h.show().removeClass(\"ui-sg-collapsed\").addClass(\"ui-sg-expanded\"),$(this).html(\"<a style='cursor:pointer;' class='ui-sghref'><span class='\"+j.icon_base+\" \"+c.p.subGridOptions.minusicon+\"'></span></a>\").removeClass(\"sgcollapsed\").addClass(\"sgexpanded\"),c.p.subGridOptions.selectOnExpand&&$(c).jqGrid(\"setSelection\",d)}else if($(this).hasClass(\"sgexpanded\")){if(g=$(c).triggerHandler(\"jqGridSubGridRowColapsed\",[e+\"_\"+d,d]),g=g===!1||\"stop\"===g?!1:!0,g&&$.isFunction(c.p.subGridRowColapsed)&&(g=c.p.subGridRowColapsed.call(c,e+\"_\"+d,d)),g===!1)return!1;c.p.subGridOptions.reloadOnExpand===!0?h.remove(\".ui-subgrid\"):h.hasClass(\"ui-subgrid\")&&h.hide().addClass(\"ui-sg-collapsed\").removeClass(\"ui-sg-expanded\"),$(this).html(\"<a style='cursor:pointer;' class='ui-sghref'><span class='\"+j.icon_base+\" \"+c.p.subGridOptions.plusicon+\"'></span></a>\").removeClass(\"sgexpanded\").addClass(\"sgcollapsed\"),c.p.subGridOptions.selectOnCollapse&&$(c).jqGrid(\"setSelection\",d)}return!1})),q++;c.p.subGridOptions.expandOnLoad===!0&&$(c.rows).filter(\".jqgrow\").each(function(a,b){$(b.cells[0]).click()}),c.subGridXml=function(a,b){l(a,b)},c.subGridJson=function(a,b){m(a,b)}}})},expandSubGridRow:function(a){return this.each(function(){var b=this;if((b.grid||a)&&b.p.subGrid===!0){var c=$(this).jqGrid(\"getInd\",a,!0);if(c){var d=$(\"td.sgcollapsed\",c)[0];d&&$(d).trigger(\"click\")}}})},collapseSubGridRow:function(a){return this.each(function(){var b=this;if((b.grid||a)&&b.p.subGrid===!0){var c=$(this).jqGrid(\"getInd\",a,!0);if(c){var d=$(\"td.sgexpanded\",c)[0];d&&$(d).trigger(\"click\")}}})},toggleSubGridRow:function(a){return this.each(function(){var b=this;if((b.grid||a)&&b.p.subGrid===!0){var c=$(this).jqGrid(\"getInd\",a,!0);if(c){var d=$(\"td.sgcollapsed\",c)[0];d?$(d).trigger(\"click\"):(d=$(\"td.sgexpanded\",c)[0],d&&$(d).trigger(\"click\"))}}})}}),$.jgrid.extend({setTreeNode:function(a,b){return this.each(function(){var c=this;if(c.grid&&c.p.treeGrid)for(var d,e,f,g,h,i,j,k,l=c.p.expColInd,m=c.p.treeReader.expanded_field,n=c.p.treeReader.leaf_field,o=c.p.treeReader.level_field,p=c.p.treeReader.icon_field,q=c.p.treeReader.loaded,r=$.jgrid.styleUI[c.p.styleUI||\"jQueryUI\"].common;b>a;){var s,t=$.jgrid.stripPref(c.p.idPrefix,c.rows[a].id),u=c.p._index[t];j=c.p.data[u],\"nested\"===c.p.treeGridModel&&(j[n]||(d=parseInt(j[c.p.treeReader.left_field],10),e=parseInt(j[c.p.treeReader.right_field],10),j[n]=e===d+1?\"true\":\"false\",c.rows[a].cells[c.p._treeleafpos].innerHTML=j[n])),f=parseInt(j[o],10),0===c.p.tree_root_level?(g=f+1,h=f):(g=f,h=f-1),i=\"<div class='tree-wrap tree-wrap-\"+c.p.direction+\"' style='width:\"+18*g+\"px;'>\",i+=\"<div style='\"+(\"rtl\"===c.p.direction?\"right:\":\"left:\")+18*h+\"px;' class='\"+r.icon_base+\" \",void 0!==j[q]&&(j[q]=\"true\"===j[q]||j[q]===!0?!0:!1),\"true\"===j[n]||j[n]===!0?(i+=(void 0!==j[p]&&\"\"!==j[p]?j[p]:c.p.treeIcons.leaf)+\" tree-leaf treeclick\",j[n]=!0,k=\"leaf\"):(j[n]=!1,k=\"\"),j[m]=(\"true\"===j[m]||j[m]===!0?!0:!1)&&(j[q]||void 0===j[q]),i+=j[m]===!1?j[n]===!0?\"'\":c.p.treeIcons.plus+\" tree-plus treeclick'\":j[n]===!0?\"'\":c.p.treeIcons.minus+\" tree-minus treeclick'\",i+=\"></div></div>\",$(c.rows[a].cells[l]).wrapInner(\"<span class='cell-wrapper\"+k+\"'></span>\").prepend(i),f!==parseInt(c.p.tree_root_level,10)&&(s=$(c).jqGrid(\"isVisibleNode\",j),s||$(c.rows[a]).css(\"display\",\"none\")),$(c.rows[a].cells[l]).find(\"div.treeclick\").bind(\"click\",function(a){var b=a.target||a.srcElement,d=$.jgrid.stripPref(c.p.idPrefix,$(b,c.rows).closest(\"tr.jqgrow\")[0].id),e=c.p._index[d];return c.p.data[e][n]||(c.p.data[e][m]?($(c).jqGrid(\"collapseRow\",c.p.data[e]),$(c).jqGrid(\"collapseNode\",c.p.data[e])):($(c).jqGrid(\"expandRow\",c.p.data[e]),$(c).jqGrid(\"expandNode\",c.p.data[e]))),!1}),c.p.ExpandColClick===!0&&$(c.rows[a].cells[l]).find(\"span.cell-wrapper\").css(\"cursor\",\"pointer\").bind(\"click\",function(a){var b=a.target||a.srcElement,d=$.jgrid.stripPref(c.p.idPrefix,$(b,c.rows).closest(\"tr.jqgrow\")[0].id),e=c.p._index[d];return c.p.data[e][n]||(c.p.data[e][m]?($(c).jqGrid(\"collapseRow\",c.p.data[e]),$(c).jqGrid(\"collapseNode\",c.p.data[e])):($(c).jqGrid(\"expandRow\",c.p.data[e]),$(c).jqGrid(\"expandNode\",c.p.data[e]))),$(c).jqGrid(\"setSelection\",d),!1}),a++}})},setTreeGrid:function(){return this.each(function(){var a,b,c,d,e=this,f=0,g=!1,h=[],i=$.jgrid.styleUI[e.p.styleUI||\"jQueryUI\"].treegrid;if(e.p.treeGrid){e.p.treedatatype||$.extend(e.p,{treedatatype:e.p.datatype}),e.p.loadonce&&(e.p.treedatatype=\"local\"),e.p.subGrid=!1,e.p.altRows=!1,e.p.pgbuttons=!1,e.p.pginput=!1,e.p.gridview=!0,null===e.p.rowTotal&&(e.p.rowNum=1e4),e.p.multiselect=!1,e.p.rowList=[],e.p.expColInd=0,a=i.icon_plus,\"jQueryUI\"===e.p.styleUI&&(a+=\"rtl\"===e.p.direction?\"w\":\"e\"),e.p.treeIcons=$.extend({plus:a,minus:i.icon_minus,leaf:i.icon_leaf},e.p.treeIcons||{}),\"nested\"===e.p.treeGridModel?e.p.treeReader=$.extend({level_field:\"level\",left_field:\"lft\",right_field:\"rgt\",leaf_field:\"isLeaf\",expanded_field:\"expanded\",loaded:\"loaded\",icon_field:\"icon\"},e.p.treeReader):\"adjacency\"===e.p.treeGridModel&&(e.p.treeReader=$.extend({level_field:\"level\",parent_id_field:\"parent\",leaf_field:\"isLeaf\",expanded_field:\"expanded\",loaded:\"loaded\",icon_field:\"icon\"},e.p.treeReader));for(c in e.p.colModel)if(e.p.colModel.hasOwnProperty(c)){b=e.p.colModel[c].name,b!==e.p.ExpandColumn||g||(g=!0,e.p.expColInd=f),f++;for(d in e.p.treeReader)e.p.treeReader.hasOwnProperty(d)&&e.p.treeReader[d]===b&&h.push(b)}$.each(e.p.treeReader,function(a,b){b&&-1===$.inArray(b,h)&&(\"leaf_field\"===a&&(e.p._treeleafpos=f),f++,e.p.colNames.push(b),e.p.colModel.push({name:b,width:1,hidden:!0,sortable:!1,resizable:!1,hidedlg:!0,editable:!0,search:!1}))})}})},expandRow:function(a){this.each(function(){var b=this;if(b.grid&&b.p.treeGrid){var c=$(b).jqGrid(\"getNodeChildren\",a),d=b.p.treeReader.expanded_field,e=a[b.p.localReader.id],f=$.isFunction(b.p.beforeExpandTreeGridRow)?b.p.beforeExpandTreeGridRow.call(b,e,a,c):!0;f!==!1&&($(c).each(function(){var a=b.p.idPrefix+$.jgrid.getAccessor(this,b.p.localReader.id);$($(b).jqGrid(\"getGridRowById\",a)).css(\"display\",\"\"),this[d]&&$(b).jqGrid(\"expandRow\",this)}),$.isFunction(b.p.afterExpandTreeGridRow)&&b.p.afterExpandTreeGridRow.call(b,e,a,c))}})},collapseRow:function(a){this.each(function(){var b=this;if(b.grid&&b.p.treeGrid){var c=$(b).jqGrid(\"getNodeChildren\",a),d=b.p.treeReader.expanded_field,e=a[b.p.localReader.id],f=$.isFunction(b.p.beforeCollapseTreeGridRow)?b.p.beforeCollapseTreeGridRow.call(b,e,a,c):!0;f!==!1&&($(c).each(function(){var a=b.p.idPrefix+$.jgrid.getAccessor(this,b.p.localReader.id);$($(b).jqGrid(\"getGridRowById\",a)).css(\"display\",\"none\"),this[d]&&$(b).jqGrid(\"collapseRow\",this)}),$.isFunction(b.p.afterCollapseTreeGridRow)&&b.p.afterCollapseTreeGridRow.call(b,e,a,c))}})},getRootNodes:function(a){var b=[];return this.each(function(){var c,d,e,f=this;if(f.grid&&f.p.treeGrid)switch(\"boolean\"!=typeof a&&(a=!1),e=a?$(f).jqGrid(\"getRowData\",null,!0):f.p.data,f.p.treeGridModel){case\"nested\":c=f.p.treeReader.level_field,$(e).each(function(){parseInt(this[c],10)===parseInt(f.p.tree_root_level,10)&&b.push(a?f.p.data[f.p._index[this[f.p.keyName]]]:this)});break;case\"adjacency\":d=f.p.treeReader.parent_id_field,$(e).each(function(){(null===this[d]||\"null\"===String(this[d]).toLowerCase())&&b.push(a?f.p.data[f.p._index[this[f.p.keyName]]]:this)})}}),b},getNodeDepth:function(a){var b=null;return this.each(function(){if(this.grid&&this.p.treeGrid){var c=this;switch(c.p.treeGridModel){case\"nested\":var d=c.p.treeReader.level_field;b=parseInt(a[d],10)-parseInt(c.p.tree_root_level,10);break;case\"adjacency\":b=$(c).jqGrid(\"getNodeAncestors\",a).length}}}),b},getNodeParent:function(a){var b=null;return this.each(function(){var c=this;if(c.grid&&c.p.treeGrid)switch(c.p.treeGridModel){case\"nested\":var d=c.p.treeReader.left_field,e=c.p.treeReader.right_field,f=c.p.treeReader.level_field,g=parseInt(a[d],10),h=parseInt(a[e],10),i=parseInt(a[f],10);$(this.p.data).each(function(){return parseInt(this[f],10)===i-1&&parseInt(this[d],10)<g&&parseInt(this[e],10)>h?(b=this,!1):void 0});break;case\"adjacency\":for(var j=c.p.treeReader.parent_id_field,k=c.p.localReader.id,l=a[k],m=c.p._index[l];m--;)if(c.p.data[m][k]===$.jgrid.stripPref(c.p.idPrefix,a[j])){b=c.p.data[m];break}}}),b},getNodeChildren:function(a){var b=[];return this.each(function(){var c=this;if(c.grid&&c.p.treeGrid)switch(c.p.treeGridModel){case\"nested\":var d=c.p.treeReader.left_field,e=c.p.treeReader.right_field,f=c.p.treeReader.level_field,g=parseInt(a[d],10),h=parseInt(a[e],10),i=parseInt(a[f],10);$(this.p.data).each(function(){parseInt(this[f],10)===i+1&&parseInt(this[d],10)>g&&parseInt(this[e],10)<h&&b.push(this)});break;case\"adjacency\":var j=c.p.treeReader.parent_id_field,k=c.p.localReader.id;$(this.p.data).each(function(){this[j]==$.jgrid.stripPref(c.p.idPrefix,a[k])&&b.push(this)})}}),b},getFullTreeNode:function(a,b){var c=[];return this.each(function(){var d,e=this,f=e.p.treeReader.expanded_field;if(e.grid&&e.p.treeGrid)switch((null==b||\"boolean\"!=typeof b)&&(b=!1),e.p.treeGridModel){case\"nested\":var g=e.p.treeReader.left_field,h=e.p.treeReader.right_field,i=e.p.treeReader.level_field,j=parseInt(a[g],10),k=parseInt(a[h],10),l=parseInt(a[i],10);$(this.p.data).each(function(){parseInt(this[i],10)>=l&&parseInt(this[g],10)>=j&&parseInt(this[g],10)<=k&&(b&&(this[f]=!0),c.push(this))});break;case\"adjacency\":if(a){c.push(a);var m=e.p.treeReader.parent_id_field,n=e.p.localReader.id;$(this.p.data).each(function(a){for(d=c.length,a=0;d>a;a++)if($.jgrid.stripPref(e.p.idPrefix,c[a][n])===this[m]){b&&(this[f]=!0),c.push(this);break}})}}}),c},getNodeAncestors:function(a){var b=[];return this.each(function(){if(this.grid&&this.p.treeGrid)for(var c=$(this).jqGrid(\"getNodeParent\",a);c;)b.push(c),c=$(this).jqGrid(\"getNodeParent\",c)}),b},isVisibleNode:function(a){var b=!0;return this.each(function(){var c=this;if(c.grid&&c.p.treeGrid){var d=$(c).jqGrid(\"getNodeAncestors\",a),e=c.p.treeReader.expanded_field;$(d).each(function(){return b=b&&this[e],b?void 0:!1})}}),b},isNodeLoaded:function(a){var b;return this.each(function(){var c=this;if(c.grid&&c.p.treeGrid){var d=c.p.treeReader.leaf_field,e=c.p.treeReader.loaded;b=void 0!==a?void 0!==a[e]?a[e]:a[d]||$(c).jqGrid(\"getNodeChildren\",a).length>0?!0:!1:!1}}),b},reloadNode:function(a){return this.each(function(){if(this.grid&&this.p.treeGrid){var b=this.p.localReader.id,c=this.p.selrow;$(this).jqGrid(\"delChildren\",a[b]);var d=this.p.treeReader.expanded_field,e=this.p.treeReader.parent_id_field,f=this.p.treeReader.loaded,g=this.p.treeReader.level_field,h=this.p.treeReader.left_field,i=this.p.treeReader.right_field,j=$.jgrid.getAccessor(a,this.p.localReader.id),k=$(\"#\"+j,this.grid.bDiv)[0];a[d]=!0,$(\"div.treeclick\",k).removeClass(this.p.treeIcons.plus+\" tree-plus\").addClass(this.p.treeIcons.minus+\" tree-minus\"),this.p.treeANode=k.rowIndex,this.p.datatype=this.p.treedatatype,\"nested\"===this.p.treeGridModel?$(this).jqGrid(\"setGridParam\",{postData:{nodeid:j,n_left:a[h],n_right:a[i],n_level:a[g]}}):$(this).jqGrid(\"setGridParam\",{postData:{nodeid:j,parentid:a[e],n_level:a[g]}}),$(this).trigger(\"reloadGrid\"),a[f]=!0,\"nested\"===this.p.treeGridModel?$(this).jqGrid(\"setGridParam\",{selrow:c,postData:{nodeid:\"\",n_left:\"\",n_right:\"\",n_level:\"\"}}):$(this).jqGrid(\"setGridParam\",{selrow:c,postData:{nodeid:\"\",parentid:\"\",n_level:\"\"}})}})},expandNode:function(a){return this.each(function(){if(this.grid&&this.p.treeGrid){var b=this.p.treeReader.expanded_field,c=this.p.treeReader.parent_id_field,d=this.p.treeReader.loaded,e=this.p.treeReader.level_field,f=this.p.treeReader.left_field,g=this.p.treeReader.right_field;if(!a[b]){var h=$.jgrid.getAccessor(a,this.p.localReader.id),i=$(\"#\"+this.p.idPrefix+$.jgrid.jqID(h),this.grid.bDiv)[0],j=this.p._index[h],k=$.isFunction(this.p.beforeExpandTreeGridNode)?this.p.beforeExpandTreeGridNode.call(this,h,a):!0;if(k===!1)return;$(this).jqGrid(\"isNodeLoaded\",this.p.data[j])?(a[b]=!0,$(\"div.treeclick\",i).removeClass(this.p.treeIcons.plus+\" tree-plus\").addClass(this.p.treeIcons.minus+\" tree-minus\")):this.grid.hDiv.loading||(a[b]=!0,$(\"div.treeclick\",i).removeClass(this.p.treeIcons.plus+\" tree-plus\").addClass(this.p.treeIcons.minus+\" tree-minus\"),this.p.treeANode=i.rowIndex,this.p.datatype=this.p.treedatatype,\"nested\"===this.p.treeGridModel?$(this).jqGrid(\"setGridParam\",{postData:{nodeid:h,n_left:a[f],n_right:a[g],n_level:a[e]}}):$(this).jqGrid(\"setGridParam\",{postData:{nodeid:h,parentid:a[c],n_level:a[e]}}),$(this).trigger(\"reloadGrid\"),a[d]=!0,\"nested\"===this.p.treeGridModel?$(this).jqGrid(\"setGridParam\",{postData:{nodeid:\"\",n_left:\"\",n_right:\"\",n_level:\"\"}}):$(this).jqGrid(\"setGridParam\",{postData:{nodeid:\"\",parentid:\"\",n_level:\"\"}})),$.isFunction(this.p.afterExpandTreeGridNode)&&this.p.afterExpandTreeGridNode.call(this,h,a)}}})},collapseNode:function(a){return this.each(function(){if(this.grid&&this.p.treeGrid){var b=this.p.treeReader.expanded_field;if(a[b]){var c=$.jgrid.getAccessor(a,this.p.localReader.id),d=$.isFunction(this.p.beforeCollapseTreeGridNode)?this.p.beforeCollapseTreeGridNode.call(this,c,a):!0,e=$(\"#\"+this.p.idPrefix+$.jgrid.jqID(c),this.grid.bDiv)[0];if(a[b]=!1,d===!1)return;$(\"div.treeclick\",e).removeClass(this.p.treeIcons.minus+\" tree-minus\").addClass(this.p.treeIcons.plus+\" tree-plus\"),$.isFunction(this.p.afterCollapseTreeGridNode)&&this.p.afterCollapseTreeGridNode.call(this,c,a)}}})},SortTree:function(a,b,c,d){return this.each(function(){if(this.grid&&this.p.treeGrid){var e,f,g,h,i,j=[],k=this,l=$(this).jqGrid(\"getRootNodes\",k.p.search);for(h=$.jgrid.from.call(this,l),h.orderBy(a,b,c,d),i=h.select(),e=0,f=i.length;f>e;e++)g=i[e],j.push(g),$(this).jqGrid(\"collectChildrenSortTree\",j,g,a,b,c,d);$.each(j,function(a){var b=$.jgrid.getAccessor(this,k.p.localReader.id);$(\"#\"+$.jgrid.jqID(k.p.id)+\" tbody tr:eq(\"+a+\")\").after($(\"tr#\"+$.jgrid.jqID(b),k.grid.bDiv))}),h=null,i=null,j=null}})},searchTree:function(a){var b,c,d,e=a.length||0,f=[],g=[],h=[];return this.each(function(){if(this.grid&&this.p.treeGrid&&e)for(c=this.p.localReader.id,b=0;e>b;b++)f=$(this).jqGrid(\"getNodeAncestors\",a[b]),f.length||f.push(a[b]),d=f[f.length-1][c],-1===$.inArray(d,g)&&(g.push(d),f=$(this).jqGrid(\"getFullTreeNode\",f[f.length-1],!0),h=h.concat(f))}),h},collectChildrenSortTree:function(a,b,c,d,e,f){return this.each(function(){if(this.grid&&this.p.treeGrid){var g,h,i,j,k,l;for(j=$(this).jqGrid(\"getNodeChildren\",b),k=$.jgrid.from.call(this,j),k.orderBy(c,d,e,f),l=k.select(),g=0,h=l.length;h>g;g++)i=l[g],a.push(i),$(this).jqGrid(\"collectChildrenSortTree\",a,i,c,d,e,f)}})},setTreeRow:function(a,b){var c=!1;return this.each(function(){var d=this;d.grid&&d.p.treeGrid&&(c=$(d).jqGrid(\"setRowData\",a,b))}),c},delTreeNode:function(a){return this.each(function(){var b,c,d,e,f,g=this,h=g.p.localReader.id,i=g.p.treeReader.left_field,j=g.p.treeReader.right_field;if(g.grid&&g.p.treeGrid){var k=g.p._index[a];if(void 0!==k){c=parseInt(g.p.data[k][j],10),d=c-parseInt(g.p.data[k][i],10)+1;var l=$(g).jqGrid(\"getFullTreeNode\",g.p.data[k]);if(l.length>0)for(b=0;b<l.length;b++)$(g).jqGrid(\"delRowData\",l[b][h]);if(\"nested\"===g.p.treeGridModel){if(e=$.jgrid.from.call(g,g.p.data).greater(i,c,{stype:\"integer\"}).select(),e.length)for(f in e)e.hasOwnProperty(f)&&(e[f][i]=parseInt(e[f][i],10)-d);if(e=$.jgrid.from.call(g,g.p.data).greater(j,c,{stype:\"integer\"}).select(),e.length)for(f in e)e.hasOwnProperty(f)&&(e[f][j]=parseInt(e[f][j],10)-d)}}}})},delChildren:function(a){return this.each(function(){var b,c,d,e,f=this,g=f.p.localReader.id,h=f.p.treeReader.left_field,i=f.p.treeReader.right_field;if(f.grid&&f.p.treeGrid){var j=f.p._index[a];if(void 0!==j){b=parseInt(f.p.data[j][i],10),c=b-parseInt(f.p.data[j][h],10)+1;var k=$(f).jqGrid(\"getFullTreeNode\",f.p.data[j]);if(k.length>0)for(var l=0;l<k.length;l++)k[l][g]!==a&&$(f).jqGrid(\"delRowData\",k[l][g]);if(\"nested\"===f.p.treeGridModel){if(d=$.jgrid.from(f.p.data).greater(h,b,{stype:\"integer\"}).select(),d.length)for(e in d)d.hasOwnProperty(e)&&(d[e][h]=parseInt(d[e][h],10)-c);if(d=$.jgrid.from(f.p.data).greater(i,b,{stype:\"integer\"}).select(),d.length)for(e in d)d.hasOwnProperty(e)&&(d[e][i]=parseInt(d[e][i],10)-c)}}}})},addChildNode:function(a,b,c,d){var e=this[0];if(c){var f,g,h,i,j,k,l,m,n=e.p.treeReader.expanded_field,o=e.p.treeReader.leaf_field,p=e.p.treeReader.level_field,q=e.p.treeReader.parent_id_field,r=e.p.treeReader.left_field,s=e.p.treeReader.right_field,t=e.p.treeReader.loaded,u=0,v=b;if(void 0===d&&(d=!1),null==a){if(j=e.p.data.length-1,j>=0)for(;j>=0;)u=Math.max(u,parseInt(e.p.data[j][e.p.localReader.id],10)),j--;a=u+1}var w=$(e).jqGrid(\"getInd\",b);if(l=!1,void 0===b||null===b||\"\"===b)b=null,v=null,f=\"last\",i=e.p.tree_root_level,j=e.p.data.length+1;else{f=\"after\",g=e.p._index[b],h=e.p.data[g],b=h[e.p.localReader.id],i=parseInt(h[p],10)+1;var x=$(e).jqGrid(\"getFullTreeNode\",h);x.length?(j=x[x.length-1][e.p.localReader.id],v=j,j=$(e).jqGrid(\"getInd\",v)+1):j=$(e).jqGrid(\"getInd\",b)+1,h[o]&&(l=!0,h[n]=!0,$(e.rows[w]).find(\"span.cell-wrapperleaf\").removeClass(\"cell-wrapperleaf\").addClass(\"cell-wrapper\").end().find(\"div.tree-leaf\").removeClass(e.p.treeIcons.leaf+\" tree-leaf\").addClass(e.p.treeIcons.minus+\" tree-minus\"),e.p.data[g][o]=!1,h[t]=!0)}if(k=j+1,void 0===c[n]&&(c[n]=!1),void 0===c[t]&&(c[t]=!1),c[p]=i,void 0===c[o]&&(c[o]=!0),\"adjacency\"===e.p.treeGridModel&&(c[q]=b),\"nested\"===e.p.treeGridModel){var y,z,A;if(null!==b){if(m=parseInt(h[s],10),y=$.jgrid.from.call(e,e.p.data),y=y.greaterOrEquals(s,m,{stype:\"integer\"}),z=y.select(),z.length)for(A in z)z.hasOwnProperty(A)&&(z[A][r]=z[A][r]>m?parseInt(z[A][r],10)+2:z[A][r],z[A][s]=z[A][s]>=m?parseInt(z[A][s],10)+2:z[A][s]);c[r]=m,c[s]=m+1}else{if(m=parseInt($(e).jqGrid(\"getCol\",s,!1,\"max\"),10),z=$.jgrid.from.call(e,e.p.data).greater(r,m,{stype:\"integer\"}).select(),z.length)for(A in z)z.hasOwnProperty(A)&&(z[A][r]=parseInt(z[A][r],10)+2);if(z=$.jgrid.from.call(e,e.p.data).greater(s,m,{stype:\"integer\"}).select(),z.length)for(A in z)z.hasOwnProperty(A)&&(z[A][s]=parseInt(z[A][s],10)+2);c[r]=m+1,c[s]=m+2}}(null===b||$(e).jqGrid(\"isNodeLoaded\",h)||l)&&($(e).jqGrid(\"addRowData\",a,c,f,v),$(e).jqGrid(\"setTreeNode\",j,k)),h&&!h[n]&&d&&$(e.rows[w]).find(\"div.treeclick\").click()}}}),$.fn.jqDrag=function(a){return i(this,a,\"d\")},$.fn.jqResize=function(a,b){return i(this,a,\"r\",b)},$.jqDnR={dnr:{},e:0,drag:function(a){return\"d\"==M.k?E.css({left:M.X+a.pageX-M.pX,top:M.Y+a.pageY-M.pY}):(E.css({width:Math.max(a.pageX-M.pX+M.W,0),height:Math.max(a.pageY-M.pY+M.H,0)}),M1&&E1.css({width:Math.max(a.pageX-M1.pX+M1.W,0),height:Math.max(a.pageY-M1.pY+M1.H,0)})),!1\n},stop:function(){$(document).unbind(\"mousemove\",J.drag).unbind(\"mouseup\",J.stop)}};var J=$.jqDnR,M=J.dnr,E=J.e,E1,M1,i=function(a,b,c,d){return a.each(function(){b=b?$(b,a):a,b.bind(\"mousedown\",{e:a,k:c},function(a){var b=a.data,c={};if(E=b.e,E1=d?$(d):!1,\"relative\"!=E.css(\"position\"))try{E.position(c)}catch(e){}if(M={X:c.left||f(\"left\")||0,Y:c.top||f(\"top\")||0,W:f(\"width\")||E[0].scrollWidth||0,H:f(\"height\")||E[0].scrollHeight||0,pX:a.pageX,pY:a.pageY,k:b.k},M1=E1&&\"d\"!=b.k?{X:c.left||f1(\"left\")||0,Y:c.top||f1(\"top\")||0,W:E1[0].offsetWidth||f1(\"width\")||0,H:E1[0].offsetHeight||f1(\"height\")||0,pX:a.pageX,pY:a.pageY,k:b.k}:!1,$(\"input.hasDatepicker\",E[0])[0])try{$(\"input.hasDatepicker\",E[0]).datepicker(\"hide\")}catch(g){}return $(document).mousemove($.jqDnR.drag).mouseup($.jqDnR.stop),!1})})},f=function(a){return parseInt(E.css(a),10)||!1},f1=function(a){return parseInt(E1.css(a),10)||!1};$.fn.jqm=function(a){var b={overlay:50,closeoverlay:!0,overlayClass:\"jqmOverlay\",closeClass:\"jqmClose\",trigger:\".jqModal\",ajax:F,ajaxText:\"\",target:F,modal:F,toTop:F,onShow:F,onHide:F,onLoad:F};return this.each(function(){return this._jqm?H[this._jqm].c=$.extend({},H[this._jqm].c,a):(s++,this._jqm=s,H[s]={c:$.extend(b,$.jqm.params,a),a:F,w:$(this).addClass(\"jqmID\"+s),s:s},void(b.trigger&&$(this).jqmAddTrigger(b.trigger)))})},$.fn.jqmAddClose=function(a){return hs(this,a,\"jqmHide\")},$.fn.jqmAddTrigger=function(a){return hs(this,a,\"jqmShow\")},$.fn.jqmShow=function(a){return this.each(function(){$.jqm.open(this._jqm,a)})},$.fn.jqmHide=function(a){return this.each(function(){$.jqm.close(this._jqm,a)})},$.jqm={hash:{},open:function(a,b){var c=H[a],d=c.c,f=\".\"+d.closeClass,g=parseInt(c.w.css(\"z-index\"));g=g>0?g:3e3;var h=$(\"<div></div>\").css({height:\"100%\",width:\"100%\",position:\"fixed\",left:0,top:0,\"z-index\":g-1,opacity:d.overlay/100});if(c.a)return F;if(c.t=b,c.a=!0,c.w.css(\"z-index\",g),d.modal?(A[0]||setTimeout(function(){new L(\"bind\")},1),A.push(a)):d.overlay>0?d.closeoverlay&&c.w.jqmAddClose(h):h=F,c.o=h?h.addClass(d.overlayClass).prependTo(\"body\"):F,d.ajax){var i=d.target||c.w,j=d.ajax;i=\"string\"==typeof i?$(i,c.w):$(i),j=\"@\"===j.substr(0,1)?$(b).attr(j.substring(1)):j,i.html(d.ajaxText).load(j,function(){d.onLoad&&d.onLoad.call(this,c),f&&c.w.jqmAddClose($(f,c.w)),e(c)})}else f&&c.w.jqmAddClose($(f,c.w));return d.toTop&&c.o&&c.w.before('<span id=\"jqmP'+c.w[0]._jqm+'\"></span>').insertAfter(c.o),d.onShow?d.onShow(c):c.w.show(),e(c),F},close:function(a){var b=H[a];return b.a?(b.a=F,A[0]&&(A.pop(),A[0]||new L(\"unbind\")),b.c.toTop&&b.o&&$(\"#jqmP\"+b.w[0]._jqm).after(b.w).remove(),b.c.onHide?b.c.onHide(b):(b.w.hide(),b.o&&b.o.remove()),F):F},params:{}};var s=0,H=$.jqm.hash,A=[],F=!1,e=function(a){void 0===a.c.focusField&&(a.c.focusField=0),a.c.focusField>=0&&f(a)},f=function(a){try{$(\":input:visible\",a.w)[parseInt(a.c.focusField,10)].focus()}catch(b){}},L=function(a){$(document)[a](\"keypress\",m)[a](\"keydown\",m)[a](\"mousedown\",m)},m=function(a){var b=H[A[A.length-1]],c=!$(a.target).parents(\".jqmID\"+b.s)[0];return c&&($(\".jqmID\"+b.s).each(function(){var b=$(this),d=b.offset();return d.top<=a.pageY&&a.pageY<=d.top+b.height()&&d.left<=a.pageX&&a.pageX<=d.left+b.width()?(c=!1,!1):void 0}),f(b)),!c},hs=function(a,b,c){return a.each(function(){var a=this._jqm;$(b).each(function(){this[c]||(this[c]=[],$(this).click(function(){for(var a in{jqmShow:1,jqmHide:1})for(var b in this[a])H[this[a][b]]&&H[this[a][b]].w[a](this);return F})),this[c].push(a)})})};$.fmatter={},$.extend($.fmatter,{isBoolean:function(a){return\"boolean\"==typeof a},isObject:function(a){return a&&(\"object\"==typeof a||$.isFunction(a))||!1},isString:function(a){return\"string\"==typeof a},isNumber:function(a){return\"number\"==typeof a&&isFinite(a)},isValue:function(a){return this.isObject(a)||this.isString(a)||this.isNumber(a)||this.isBoolean(a)},isEmpty:function(a){return!this.isString(a)&&this.isValue(a)?!1:this.isValue(a)?(a=$.trim(a).replace(/\\&nbsp\\;/gi,\"\").replace(/\\&#160\\;/gi,\"\"),\"\"===a):!0}}),$.fn.fmatter=function(a,b,c,d,e){var f=b;c=$.extend({},$.jgrid.getRegional(this,\"formatter\"),c);try{f=$.fn.fmatter[a].call(this,b,c,d,e)}catch(g){}return f},$.fmatter.util={NumberFormat:function(a,b){if($.fmatter.isNumber(a)||(a*=1),$.fmatter.isNumber(a)){var c,d=0>a,e=String(a),f=b.decimalSeparator||\".\";if($.fmatter.isNumber(b.decimalPlaces)){var g=b.decimalPlaces,h=Math.pow(10,g);if(e=String(Math.round(a*h)/h),c=e.lastIndexOf(\".\"),g>0)for(0>c?(e+=f,c=e.length-1):\".\"!==f&&(e=e.replace(\".\",f));e.length-1-c<g;)e+=\"0\"}if(b.thousandsSeparator){var i=b.thousandsSeparator;c=e.lastIndexOf(f),c=c>-1?c:e.length;var j,k=e.substring(c),l=-1;for(j=c;j>0;j--)l++,l%3===0&&j!==c&&(!d||j>1)&&(k=i+k),k=e.charAt(j-1)+k;e=k}return e=b.prefix?b.prefix+e:e,e=b.suffix?e+b.suffix:e}return a}},$.fn.fmatter.defaultFormat=function(a,b){return $.fmatter.isValue(a)&&\"\"!==a?a:b.defaultValue||\"&#160;\"},$.fn.fmatter.email=function(a,b){return $.fmatter.isEmpty(a)?$.fn.fmatter.defaultFormat(a,b):'<a href=\"mailto:'+a+'\">'+a+\"</a>\"},$.fn.fmatter.checkbox=function(a,b){var c,d=$.extend({},b.checkbox);void 0!==b.colModel&&void 0!==b.colModel.formatoptions&&(d=$.extend({},d,b.colModel.formatoptions)),c=d.disabled===!0?'disabled=\"disabled\"':\"\",($.fmatter.isEmpty(a)||void 0===a)&&(a=$.fn.fmatter.defaultFormat(a,d)),a=String(a),a=(a+\"\").toLowerCase();var e=a.search(/(false|f|0|no|n|off|undefined)/i)<0?\" checked='checked' \":\"\";return'<input type=\"checkbox\" '+e+' value=\"'+a+'\" offval=\"no\" '+c+\"/>\"},$.fn.fmatter.link=function(a,b){var c={target:b.target},d=\"\";return void 0!==b.colModel&&void 0!==b.colModel.formatoptions&&(c=$.extend({},c,b.colModel.formatoptions)),c.target&&(d=\"target=\"+c.target),$.fmatter.isEmpty(a)?$.fn.fmatter.defaultFormat(a,b):\"<a \"+d+' href=\"'+a+'\">'+a+\"</a>\"},$.fn.fmatter.showlink=function(a,b){var c,d={baseLinkUrl:b.baseLinkUrl,showAction:b.showAction,addParam:b.addParam||\"\",target:b.target,idName:b.idName},e=\"\";return void 0!==b.colModel&&void 0!==b.colModel.formatoptions&&(d=$.extend({},d,b.colModel.formatoptions)),d.target&&(e=\"target=\"+d.target),c=d.baseLinkUrl+d.showAction+\"?\"+d.idName+\"=\"+b.rowId+d.addParam,$.fmatter.isString(a)||$.fmatter.isNumber(a)?\"<a \"+e+' href=\"'+c+'\">'+a+\"</a>\":$.fn.fmatter.defaultFormat(a,b)},$.fn.fmatter.integer=function(a,b){var c=$.extend({},b.integer);return void 0!==b.colModel&&void 0!==b.colModel.formatoptions&&(c=$.extend({},c,b.colModel.formatoptions)),$.fmatter.isEmpty(a)?c.defaultValue:$.fmatter.util.NumberFormat(a,c)},$.fn.fmatter.number=function(a,b){var c=$.extend({},b.number);return void 0!==b.colModel&&void 0!==b.colModel.formatoptions&&(c=$.extend({},c,b.colModel.formatoptions)),$.fmatter.isEmpty(a)?c.defaultValue:$.fmatter.util.NumberFormat(a,c)},$.fn.fmatter.currency=function(a,b){var c=$.extend({},b.currency);return void 0!==b.colModel&&void 0!==b.colModel.formatoptions&&(c=$.extend({},c,b.colModel.formatoptions)),$.fmatter.isEmpty(a)?c.defaultValue:$.fmatter.util.NumberFormat(a,c)},$.fn.fmatter.date=function(a,b,c,d){var e=$.extend({},b.date);return void 0!==b.colModel&&void 0!==b.colModel.formatoptions&&(e=$.extend({},e,b.colModel.formatoptions)),e.reformatAfterEdit||\"edit\"!==d?$.fmatter.isEmpty(a)?$.fn.fmatter.defaultFormat(a,b):$.jgrid.parseDate.call(this,e.srcformat,a,e.newformat,e):$.fn.fmatter.defaultFormat(a,b)},$.fn.fmatter.select=function(a,b){a=String(a);var c,d,e=!1,f=[];if(void 0!==b.colModel.formatoptions?(e=b.colModel.formatoptions.value,c=void 0===b.colModel.formatoptions.separator?\":\":b.colModel.formatoptions.separator,d=void 0===b.colModel.formatoptions.delimiter?\";\":b.colModel.formatoptions.delimiter):void 0!==b.colModel.editoptions&&(e=b.colModel.editoptions.value,c=void 0===b.colModel.editoptions.separator?\":\":b.colModel.editoptions.separator,d=void 0===b.colModel.editoptions.delimiter?\";\":b.colModel.editoptions.delimiter),e){var g,h=(null!=b.colModel.editoptions&&b.colModel.editoptions.multiple===!0)==!0?!0:!1,i=[];if(h&&(i=a.split(\",\"),i=$.map(i,function(a){return $.trim(a)})),$.fmatter.isString(e)){var j,k=e.split(d),l=0;for(j=0;j<k.length;j++)if(g=k[j].split(c),g.length>2&&(g[1]=$.map(g,function(a,b){return b>0?a:void 0}).join(c)),h)$.inArray(g[0],i)>-1&&(f[l]=g[1],l++);else if($.trim(g[0])===$.trim(a)){f[0]=g[1];break}}else $.fmatter.isObject(e)&&(h?f=$.map(i,function(a){return e[a]}):f[0]=e[a]||\"\")}return a=f.join(\", \"),\"\"===a?$.fn.fmatter.defaultFormat(a,b):a},$.fn.fmatter.rowactions=function(a){var b=$(this).closest(\"tr.jqgrow\"),c=b.attr(\"id\"),d=$(this).closest(\"table.ui-jqgrid-btable\").attr(\"id\").replace(/_frozen([^_]*)$/,\"$1\"),e=$(\"#\"+d),f=e[0],g=f.p,h=g.colModel[$.jgrid.getCellIndex(this)],i=h.frozen?$(\"tr#\"+c+\" td:eq(\"+$.jgrid.getCellIndex(this)+\") > div\",e):$(this).parent(),j={extraparam:{}},k=function(a,b){$.isFunction(j.afterSave)&&j.afterSave.call(f,a,b),i.find(\"div.ui-inline-edit,div.ui-inline-del\").show(),i.find(\"div.ui-inline-save,div.ui-inline-cancel\").hide()},l=function(a){$.isFunction(j.afterRestore)&&j.afterRestore.call(f,a),i.find(\"div.ui-inline-edit,div.ui-inline-del\").show(),i.find(\"div.ui-inline-save,div.ui-inline-cancel\").hide()};void 0!==h.formatoptions&&(j=$.extend(j,h.formatoptions)),void 0!==g.editOptions&&(j.editOptions=g.editOptions),void 0!==g.delOptions&&(j.delOptions=g.delOptions),b.hasClass(\"jqgrid-new-row\")&&(j.extraparam[g.prmNames.oper]=g.prmNames.addoper);var m={keys:j.keys,oneditfunc:j.onEdit,successfunc:j.onSuccess,url:j.url,extraparam:j.extraparam,aftersavefunc:k,errorfunc:j.onError,afterrestorefunc:l,restoreAfterError:j.restoreAfterError,mtype:j.mtype};switch(a){case\"edit\":e.jqGrid(\"editRow\",c,m),i.find(\"div.ui-inline-edit,div.ui-inline-del\").hide(),i.find(\"div.ui-inline-save,div.ui-inline-cancel\").show(),e.triggerHandler(\"jqGridAfterGridComplete\");break;case\"save\":e.jqGrid(\"saveRow\",c,m)&&(i.find(\"div.ui-inline-edit,div.ui-inline-del\").show(),i.find(\"div.ui-inline-save,div.ui-inline-cancel\").hide(),e.triggerHandler(\"jqGridAfterGridComplete\"));break;case\"cancel\":e.jqGrid(\"restoreRow\",c,l),i.find(\"div.ui-inline-edit,div.ui-inline-del\").show(),i.find(\"div.ui-inline-save,div.ui-inline-cancel\").hide(),e.triggerHandler(\"jqGridAfterGridComplete\");break;case\"del\":e.jqGrid(\"delGridRow\",c,j.delOptions);break;case\"formedit\":e.jqGrid(\"setSelection\",c),e.jqGrid(\"editGridRow\",c,j.editOptions)}},$.fn.fmatter.actions=function(a,b){var c,d={keys:!1,editbutton:!0,delbutton:!0,editformbutton:!1},e=b.rowId,f=\"\",g=$.jgrid.getRegional(this,\"nav\"),h=$.jgrid.styleUI[b.styleUI||\"jQueryUI\"].fmatter,i=$.jgrid.styleUI[b.styleUI||\"jQueryUI\"].common;if(void 0!==b.colModel.formatoptions&&(d=$.extend(d,b.colModel.formatoptions)),void 0===e||$.fmatter.isEmpty(e))return\"\";var j=\"onmouseover=jQuery(this).addClass('\"+i.hover+\"'); onmouseout=jQuery(this).removeClass('\"+i.hover+\"');  \";return d.editformbutton?(c=\"id='jEditButton_\"+e+\"' onclick=jQuery.fn.fmatter.rowactions.call(this,'formedit'); \"+j,f+=\"<div title='\"+g.edittitle+\"' style='float:left;cursor:pointer;' class='ui-pg-div ui-inline-edit' \"+c+\"><span class='\"+i.icon_base+\" \"+h.icon_edit+\"'></span></div>\"):d.editbutton&&(c=\"id='jEditButton_\"+e+\"' onclick=jQuery.fn.fmatter.rowactions.call(this,'edit'); \"+j,f+=\"<div title='\"+g.edittitle+\"' style='float:left;cursor:pointer;' class='ui-pg-div ui-inline-edit' \"+c+\"><span class='\"+i.icon_base+\" \"+h.icon_edit+\"'></span></div>\"),d.delbutton&&(c=\"id='jDeleteButton_\"+e+\"' onclick=jQuery.fn.fmatter.rowactions.call(this,'del'); \"+j,f+=\"<div title='\"+g.deltitle+\"' style='float:left;' class='ui-pg-div ui-inline-del' \"+c+\"><span class='\"+i.icon_base+\" \"+h.icon_del+\"'></span></div>\"),c=\"id='jSaveButton_\"+e+\"' onclick=jQuery.fn.fmatter.rowactions.call(this,'save'); \"+j,f+=\"<div title='\"+g.savetitle+\"' style='float:left;display:none' class='ui-pg-div ui-inline-save' \"+c+\"><span class='\"+i.icon_base+\" \"+h.icon_save+\"'></span></div>\",c=\"id='jCancelButton_\"+e+\"' onclick=jQuery.fn.fmatter.rowactions.call(this,'cancel'); \"+j,f+=\"<div title='\"+g.canceltitle+\"' style='float:left;display:none;' class='ui-pg-div ui-inline-cancel' \"+c+\"><span class='\"+i.icon_base+\" \"+h.icon_cancel+\"'></span></div>\",\"<div style='margin-left:8px;'>\"+f+\"</div>\"},$.unformat=function(a,b,c,d){var e,f,g=b.colModel.formatter,h=b.colModel.formatoptions||{},i=/([\\.\\*\\_\\'\\(\\)\\{\\}\\+\\?\\\\])/g,j=b.colModel.unformat||$.fn.fmatter[g]&&$.fn.fmatter[g].unformat;if(void 0!==j&&$.isFunction(j))e=j.call(this,$(a).text(),b,a);else if(void 0!==g&&$.fmatter.isString(g)){var k,l=$.jgrid.getRegional(this,\"formatter\")||{};switch(g){case\"integer\":h=$.extend({},l.integer,h),f=h.thousandsSeparator.replace(i,\"\\\\$1\"),k=new RegExp(f,\"g\"),e=$(a).text().replace(k,\"\");break;case\"number\":h=$.extend({},l.number,h),f=h.thousandsSeparator.replace(i,\"\\\\$1\"),k=new RegExp(f,\"g\"),e=$(a).text().replace(k,\"\").replace(h.decimalSeparator,\".\");break;case\"currency\":h=$.extend({},l.currency,h),f=h.thousandsSeparator.replace(i,\"\\\\$1\"),k=new RegExp(f,\"g\"),e=$(a).text(),h.prefix&&h.prefix.length&&(e=e.substr(h.prefix.length)),h.suffix&&h.suffix.length&&(e=e.substr(0,e.length-h.suffix.length)),e=e.replace(k,\"\").replace(h.decimalSeparator,\".\");break;case\"checkbox\":var m=b.colModel.editoptions?b.colModel.editoptions.value.split(\":\"):[\"Yes\",\"No\"];e=$(\"input\",a).is(\":checked\")?m[0]:m[1];break;case\"select\":e=$.unformat.select(a,b,c,d);break;case\"actions\":return\"\";default:e=$(a).text()}}return void 0!==e?e:d===!0?$(a).text():$.jgrid.htmlDecode($(a).html())},$.unformat.select=function(a,b,c,d){var e=[],f=$(a).text();if(d===!0)return f;var g=$.extend({},void 0!==b.colModel.formatoptions?b.colModel.formatoptions:b.colModel.editoptions),h=void 0===g.separator?\":\":g.separator,i=void 0===g.delimiter?\";\":g.delimiter;if(g.value){var j,k=g.value,l=g.multiple===!0?!0:!1,m=[];if(l&&(m=f.split(\",\"),m=$.map(m,function(a){return $.trim(a)})),$.fmatter.isString(k)){var n,o=k.split(i),p=0;for(n=0;n<o.length;n++)if(j=o[n].split(h),j.length>2&&(j[1]=$.map(j,function(a,b){return b>0?a:void 0}).join(h)),l)$.inArray($.trim(j[1]),m)>-1&&(e[p]=j[0],p++);else if($.trim(j[1])===$.trim(f)){e[0]=j[0];break}}else($.fmatter.isObject(k)||$.isArray(k))&&(l||(m[0]=f),e=$.map(m,function(a){var b;return $.each(k,function(c,d){return d===a?(b=c,!1):void 0}),void 0!==b?b:void 0}));return e.join(\", \")}return f||\"\"},$.unformat.date=function(a,b){var c=$.jgrid.getRegional(this,\"formatter.date\")||{};return void 0!==b.formatoptions&&(c=$.extend({},c,b.formatoptions)),$.fmatter.isEmpty(a)?$.fn.fmatter.defaultFormat(a,b):$.jgrid.parseDate.call(this,c.newformat,a,c.srcformat,c)},window.jqGridUtils={stringify:function(a){return JSON.stringify(a,function(a,b){return\"function\"==typeof b?b.toString():b})},parse:function(str){return JSON.parse(str,function(key,value){return\"string\"==typeof value&&-1!==value.indexOf(\"function\")?eval(\"(\"+value+\")\"):value})},encode:function(a){return String(a).replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\")},jsonToXML:function(a,b){var c=$.extend({xmlDecl:'<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\\n',attr_prefix:\"-\",encode:!0},b||{}),d=this,e=function(a,b){return\"#text\"===a?c.encode?d.encode(b):b:\"function\"==typeof b?\"<\"+a+\"><![CDATA[\"+b+\"]]></\"+a+\">\\n\":\"\"===b?\"<\"+a+\">__EMPTY_STRING_</\"+a+\">\\n\":\"<\"+a+\">\"+(c.encode?d.encode(b):b)+\"</\"+a+\">\\n\"},f=function(a,b){for(var c=[],d=0;d<b.length;d++){var h=b[d];c[c.length]=\"undefined\"==typeof h||null==h?\"<\"+a+\" />\":\"object\"==typeof h&&h.constructor==Array?f(a,h):\"object\"==typeof h?g(a,h):e(a,h)}return c.length||(c[0]=\"<\"+a+\">__EMPTY_ARRAY_</\"+a+\">\\n\"),c.join(\"\")},g=function(a,b){var h=[],i=[];for(var j in b)if(b.hasOwnProperty(j)){var k=b[j];j.charAt(0)!==c.attr_prefix?h[h.length]=null==k?\"<\"+j+\" />\":\"object\"==typeof k&&k.constructor===Array?f(j,k):\"object\"==typeof k?g(j,k):e(j,k):i[i.length]=\" \"+j.substring(1)+'=\"'+(c.encode?d.encode(k):k)+'\"'}var l=i.join(\"\"),m=h.join(\"\");return null==a||(m=h.length>0?m.match(/\\n/)?\"<\"+a+l+\">\\n\"+m+\"</\"+a+\">\\n\":\"<\"+a+l+\">\"+m+\"</\"+a+\">\\n\":\"<\"+a+l+\" />\\n\"),m},h=g(null,a);return c.xmlDecl+h},xmlToJSON:function(root,options){var o=$.extend({force_array:[],attr_prefix:\"-\"},options||{});if(root){var __force_array={};if(o.force_array)for(var i=0;i<o.force_array.length;i++)__force_array[o.force_array[i]]=1;\"string\"==typeof root&&(root=$.parseXML(root)),root.documentElement&&(root=root.documentElement);var addNode=function(hash,key,cnts,val){if(\"string\"==typeof val)if(-1!==val.indexOf(\"function\"))val=eval(\"(\"+val+\")\");else switch(val){case\"__EMPTY_ARRAY_\":val=[];break;case\"__EMPTY_STRING_\":val=\"\";break;case\"false\":val=!1;break;case\"true\":val=!0}__force_array[key]?(1===cnts&&(hash[key]=[]),hash[key][hash[key].length]=val):1===cnts?hash[key]=val:2===cnts?hash[key]=[hash[key],val]:hash[key][hash[key].length]=val},parseElement=function(a){if(7!==a.nodeType){if(3===a.nodeType||4===a.nodeType){var b=a.nodeValue.match(/[^\\x00-\\x20]/);if(null==b)return;return a.nodeValue}var c,d,e,f,g={};if(a.attributes&&a.attributes.length)for(c={},d=0;d<a.attributes.length;d++)e=a.attributes[d].nodeName,\"string\"==typeof e&&(f=a.attributes[d].nodeValue,f&&(e=o.attr_prefix+e,\"undefined\"==typeof g[e]&&(g[e]=0),g[e]++,addNode(c,e,g[e],f)));if(a.childNodes&&a.childNodes.length){var h=!0;for(c&&(h=!1),d=0;d<a.childNodes.length&&h;d++){var i=a.childNodes[d].nodeType;3!==i&&4!==i&&(h=!1)}if(h)for(c||(c=\"\"),d=0;d<a.childNodes.length;d++)c+=a.childNodes[d].nodeValue;else for(c||(c={}),d=0;d<a.childNodes.length;d++)e=a.childNodes[d].nodeName,\"string\"==typeof e&&(f=parseElement(a.childNodes[d]),f&&(\"undefined\"==typeof g[e]&&(g[e]=0),g[e]++,addNode(c,e,g[e],f)))}return c}},json=parseElement(root);if(__force_array[root.nodeName]&&(json=[json]),11!==root.nodeType){var tmp={};tmp[root.nodeName]=json,json=tmp}return json}}}});\n//# sourceMappingURL=jquery.jqGrid.min.js.map\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/jsKnob/jquery.knob.js",
    "content": "/*!jQuery Knob*/\n/**\n * Downward compatible, touchable dial\n *\n * Version: 1.2.8\n * Requires: jQuery v1.7+\n *\n * Copyright (c) 2012 Anthony Terrien\n * Under MIT License (http://www.opensource.org/licenses/mit-license.php)\n *\n * Thanks to vor, eskimoblood, spiffistan, FabrizioC\n */\n(function($) {\n\n    /**\n     * Kontrol library\n     */\n    \"use strict\";\n\n    /**\n     * Definition of globals and core\n     */\n    var k = {}, // kontrol\n        max = Math.max,\n        min = Math.min;\n\n    k.c = {};\n    k.c.d = $(document);\n    k.c.t = function (e) {\n        return e.originalEvent.touches.length - 1;\n    };\n\n    /**\n     * Kontrol Object\n     *\n     * Definition of an abstract UI control\n     *\n     * Each concrete component must call this one.\n     * <code>\n     * k.o.call(this);\n     * </code>\n     */\n    k.o = function () {\n        var s = this;\n\n        this.o = null; // array of options\n        this.$ = null; // jQuery wrapped element\n        this.i = null; // mixed HTMLInputElement or array of HTMLInputElement\n        this.g = null; // deprecated 2D graphics context for 'pre-rendering'\n        this.v = null; // value ; mixed array or integer\n        this.cv = null; // change value ; not commited value\n        this.x = 0; // canvas x position\n        this.y = 0; // canvas y position\n        this.w = 0; // canvas width\n        this.h = 0; // canvas height\n        this.$c = null; // jQuery canvas element\n        this.c = null; // rendered canvas context\n        this.t = 0; // touches index\n        this.isInit = false;\n        this.fgColor = null; // main color\n        this.pColor = null; // previous color\n        this.dH = null; // draw hook\n        this.cH = null; // change hook\n        this.eH = null; // cancel hook\n        this.rH = null; // release hook\n        this.scale = 1; // scale factor\n        this.relative = false;\n        this.relativeWidth = false;\n        this.relativeHeight = false;\n        this.$div = null; // component div\n\n        this.run = function () {\n            var cf = function (e, conf) {\n                var k;\n                for (k in conf) {\n                    s.o[k] = conf[k];\n                }\n                s._carve().init();\n                s._configure()\n                    ._draw();\n            };\n\n            if(this.$.data('kontroled')) return;\n            this.$.data('kontroled', true);\n\n            this.extend();\n            this.o = $.extend(\n                {\n                    // Config\n                    min : this.$.data('min') !== undefined ? this.$.data('min') : 0,\n                    max : this.$.data('max') !== undefined ? this.$.data('max') : 100,\n                    stopper : true,\n                    readOnly : this.$.data('readonly') || (this.$.attr('readonly') === 'readonly'),\n\n                    // UI\n                    cursor : (this.$.data('cursor') === true && 30) ||\n                        this.$.data('cursor') || 0,\n                    thickness : (\n                        this.$.data('thickness') &&\n                            Math.max(Math.min(this.$.data('thickness'), 1), 0.01)\n                        ) || 0.35,\n                    lineCap : this.$.data('linecap') || 'butt',\n                    width : this.$.data('width') || 200,\n                    height : this.$.data('height') || 200,\n                    displayInput : this.$.data('displayinput') == null || this.$.data('displayinput'),\n                    displayPrevious : this.$.data('displayprevious'),\n                    fgColor : this.$.data('fgcolor') || '#87CEEB',\n                    inputColor: this.$.data('inputcolor'),\n                    font: this.$.data('font') || 'Arial',\n                    fontWeight: this.$.data('font-weight') || 'bold',\n                    inline : false,\n                    step : this.$.data('step') || 1,\n                    rotation: this.$.data('rotation'),\n\n                    // Hooks\n                    draw : null, // function () {}\n                    change : null, // function (value) {}\n                    cancel : null, // function () {}\n                    release : null, // function (value) {}\n\n                    // Output formatting, allows to add unit: %, ms ...\n                    format: function(v) {\n                        return v;\n                    },\n                    parse: function (v) {\n                        return parseFloat(v);\n                    }\n                }, this.o\n            );\n\n            // finalize options\n            this.o.flip = this.o.rotation === 'anticlockwise' || this.o.rotation === 'acw';\n            if(!this.o.inputColor) {\n                this.o.inputColor = this.o.fgColor;\n            }\n\n            // routing value\n            if(this.$.is('fieldset')) {\n\n                // fieldset = array of integer\n                this.v = {};\n                this.i = this.$.find('input');\n                this.i.each(function(k) {\n                    var $this = $(this);\n                    s.i[k] = $this;\n                    s.v[k] = s.o.parse($this.val());\n\n                    $this.bind(\n                        'change blur'\n                        , function () {\n                            var val = {};\n                            val[k] = $this.val();\n                            s.val(val);\n                        }\n                    );\n                });\n                this.$.find('legend').remove();\n\n            } else {\n\n                // input = integer\n                this.i = this.$;\n                this.v = this.o.parse(this.$.val());\n                (this.v === '') && (this.v = this.o.min);\n\n                this.$.bind(\n                    'change blur'\n                    , function () {\n                        s.val(s._validate(s.o.parse(s.$.val())));\n                    }\n                );\n\n            }\n\n            (!this.o.displayInput) && this.$.hide();\n\n            // adds needed DOM elements (canvas, div)\n            this.$c = $(document.createElement('canvas')).attr({\n                width: this.o.width,\n                height: this.o.height\n            });\n\n            // wraps all elements in a div\n            // add to DOM before Canvas init is triggered\n            this.$div = $('<div style=\"'\n                + (this.o.inline ? 'display:inline;' : '')\n                + 'width:' + this.o.width + 'px;height:' + this.o.height + 'px;'\n                + '\"></div>');\n\n            this.$.wrap(this.$div).before(this.$c);\n            this.$div = this.$.parent();\n\n            if (typeof G_vmlCanvasManager !== 'undefined') {\n                G_vmlCanvasManager.initElement(this.$c[0]);\n            }\n\n            this.c = this.$c[0].getContext ? this.$c[0].getContext('2d') : null;\n\n            if (!this.c) {\n                throw {\n                    name:        \"CanvasNotSupportedException\",\n                    message:     \"Canvas not supported. Please use excanvas on IE8.0.\",\n                    toString:    function(){return this.name + \": \" + this.message}\n                }\n            }\n\n            // hdpi support\n            this.scale = (window.devicePixelRatio || 1) /\n                (\n                    this.c.webkitBackingStorePixelRatio ||\n                        this.c.mozBackingStorePixelRatio ||\n                        this.c.msBackingStorePixelRatio ||\n                        this.c.oBackingStorePixelRatio ||\n                        this.c.backingStorePixelRatio || 1\n                    );\n\n            // detects relative width / height\n            this.relativeWidth = ((this.o.width % 1 !== 0) &&\n                this.o.width.indexOf('%'));\n            this.relativeHeight = ((this.o.height % 1 !== 0) &&\n                this.o.height.indexOf('%'));\n            this.relative = (this.relativeWidth || this.relativeHeight);\n\n            // computes size and carves the component\n            this._carve();\n\n            // prepares props for transaction\n            if (this.v instanceof Object) {\n                this.cv = {};\n                this.copy(this.v, this.cv);\n            } else {\n                this.cv = this.v;\n            }\n\n            // binds configure event\n            this.$\n                .bind(\"configure\", cf)\n                .parent()\n                .bind(\"configure\", cf);\n\n            // finalize init\n            this._listen()\n                ._configure()\n                ._xy()\n                .init();\n\n            this.isInit = true;\n\n            this.$.val(this.o.format(this.v));\n            this._draw();\n\n            return this;\n        };\n\n        this._carve = function() {\n            if(this.relative) {\n                var w = this.relativeWidth ?\n                        this.$div.parent().width() *\n                            parseInt(this.o.width) / 100 :\n                        this.$div.parent().width(),\n                    h = this.relativeHeight ?\n                        this.$div.parent().height() *\n                            parseInt(this.o.height) / 100 :\n                        this.$div.parent().height();\n\n                // apply relative\n                this.w = this.h = Math.min(w, h);\n            } else {\n                this.w = this.o.width;\n                this.h = this.o.height;\n            }\n\n            // finalize div\n            this.$div.css({\n                'width': this.w + 'px',\n                'height': this.h + 'px'\n            });\n\n            // finalize canvas with computed width\n            this.$c.attr({\n                width: this.w,\n                height: this.h\n            });\n\n            // scaling\n            if (this.scale !== 1) {\n                this.$c[0].width = this.$c[0].width * this.scale;\n                this.$c[0].height = this.$c[0].height * this.scale;\n                this.$c.width(this.w);\n                this.$c.height(this.h);\n            }\n\n            return this;\n        }\n\n        this._draw = function () {\n\n            // canvas pre-rendering\n            var d = true;\n\n            s.g = s.c;\n\n            s.clear();\n\n            s.dH\n            && (d = s.dH());\n\n            (d !== false) && s.draw();\n\n        };\n\n        this._touch = function (e) {\n\n            var touchMove = function (e) {\n\n                var v = s.xy2val(\n                    e.originalEvent.touches[s.t].pageX,\n                    e.originalEvent.touches[s.t].pageY\n                );\n\n                if (v == s.cv) return;\n\n                if (s.cH && (s.cH(v) === false)) return;\n\n                s.change(s._validate(v));\n                s._draw();\n            };\n\n            // get touches index\n            this.t = k.c.t(e);\n\n            // First touch\n            touchMove(e);\n\n            // Touch events listeners\n            k.c.d\n                .bind(\"touchmove.k\", touchMove)\n                .bind(\n                \"touchend.k\"\n                , function () {\n                    k.c.d.unbind('touchmove.k touchend.k');\n                    s.val(s.cv);\n                }\n            );\n\n            return this;\n        };\n\n        this._mouse = function (e) {\n\n            var mouseMove = function (e) {\n                var v = s.xy2val(e.pageX, e.pageY);\n\n                if (v == s.cv) return;\n\n                if (s.cH && (s.cH(v) === false)) return;\n\n                s.change(s._validate(v));\n                s._draw();\n            };\n\n            // First click\n            mouseMove(e);\n\n            // Mouse events listeners\n            k.c.d\n                .bind(\"mousemove.k\", mouseMove)\n                .bind(\n                // Escape key cancel current change\n                \"keyup.k\"\n                , function (e) {\n                    if (e.keyCode === 27) {\n                        k.c.d.unbind(\"mouseup.k mousemove.k keyup.k\");\n\n                        if (\n                            s.eH\n                                && (s.eH() === false)\n                            ) return;\n\n                        s.cancel();\n                    }\n                }\n            )\n                .bind(\n                \"mouseup.k\"\n                , function (e) {\n                    k.c.d.unbind('mousemove.k mouseup.k keyup.k');\n                    s.val(s.cv);\n                }\n            );\n\n            return this;\n        };\n\n        this._xy = function () {\n            var o = this.$c.offset();\n            this.x = o.left;\n            this.y = o.top;\n            return this;\n        };\n\n        this._listen = function () {\n\n            if (!this.o.readOnly) {\n                this.$c\n                    .bind(\n                    \"mousedown\"\n                    , function (e) {\n                        e.preventDefault();\n                        s._xy()._mouse(e);\n                    }\n                )\n                    .bind(\n                    \"touchstart\"\n                    , function (e) {\n                        e.preventDefault();\n                        s._xy()._touch(e);\n                    }\n                );\n\n                this.listen();\n            } else {\n                this.$.attr('readonly', 'readonly');\n            }\n\n            if(this.relative) {\n                $(window).resize(function() {\n                    s._carve()\n                        .init();\n                    s._draw();\n                });\n            }\n\n            return this;\n        };\n\n        this._configure = function () {\n\n            // Hooks\n            if (this.o.draw) this.dH = this.o.draw;\n            if (this.o.change) this.cH = this.o.change;\n            if (this.o.cancel) this.eH = this.o.cancel;\n            if (this.o.release) this.rH = this.o.release;\n\n            if (this.o.displayPrevious) {\n                this.pColor = this.h2rgba(this.o.fgColor, \"0.4\");\n                this.fgColor = this.h2rgba(this.o.fgColor, \"0.6\");\n            } else {\n                this.fgColor = this.o.fgColor;\n            }\n\n            return this;\n        };\n\n        this._clear = function () {\n            this.$c[0].width = this.$c[0].width;\n        };\n\n        this._validate = function(v) {\n            return (~~ (((v < 0) ? -0.5 : 0.5) + (v/this.o.step))) * this.o.step;\n        };\n\n        // Abstract methods\n        this.listen = function () {}; // on start, one time\n        this.extend = function () {}; // each time configure triggered\n        this.init = function () {}; // each time configure triggered\n        this.change = function (v) {}; // on change\n        this.val = function (v) {}; // on release\n        this.xy2val = function (x, y) {}; //\n        this.draw = function () {}; // on change / on release\n        this.clear = function () { this._clear(); };\n\n        // Utils\n        this.h2rgba = function (h, a) {\n            var rgb;\n            h = h.substring(1,7)\n            rgb = [parseInt(h.substring(0,2),16)\n                ,parseInt(h.substring(2,4),16)\n                ,parseInt(h.substring(4,6),16)];\n            return \"rgba(\" + rgb[0] + \",\" + rgb[1] + \",\" + rgb[2] + \",\" + a + \")\";\n        };\n\n        this.copy = function (f, t) {\n            for (var i in f) { t[i] = f[i]; }\n        };\n    };\n\n\n    /**\n     * k.Dial\n     */\n    k.Dial = function () {\n        k.o.call(this);\n\n        this.startAngle = null;\n        this.xy = null;\n        this.radius = null;\n        this.lineWidth = null;\n        this.cursorExt = null;\n        this.w2 = null;\n        this.PI2 = 2*Math.PI;\n\n        this.extend = function () {\n            this.o = $.extend(\n                {\n                    bgColor : this.$.data('bgcolor') || '#EEEEEE',\n                    angleOffset : this.$.data('angleoffset') || 0,\n                    angleArc : this.$.data('anglearc') || 360,\n                    inline : true\n                }, this.o\n            );\n        };\n\n        this.val = function (v, triggerRelease) {\n            if (null != v) {\n\n                // reverse format\n                v = this.o.parse(v);\n\n                if (\n                    triggerRelease !== false && (v != this.v) && this.rH &&\n                        (this.rH(v) === false)\n                    ) return;\n\n                this.cv = this.o.stopper ? max(min(v, this.o.max), this.o.min) : v;\n                this.v = this.cv;\n                this.$.val(this.o.format(this.v));\n                this._draw();\n            } else {\n                return this.v;\n            }\n        };\n\n        this.xy2val = function (x, y) {\n            var a, ret;\n\n            a = Math.atan2(\n                x - (this.x + this.w2)\n                , - (y - this.y - this.w2)\n            ) - this.angleOffset;\n\n            if (this.o.flip) {\n                a = this.angleArc - a - this.PI2;\n            }\n\n            if(this.angleArc != this.PI2 && (a < 0) && (a > -0.5)) {\n                // if isset angleArc option, set to min if .5 under min\n                a = 0;\n            } else if (a < 0) {\n                a += this.PI2;\n            }\n\n            ret = ~~ (0.5 + (a * (this.o.max - this.o.min) / this.angleArc))\n                + this.o.min;\n\n            this.o.stopper && (ret = max(min(ret, this.o.max), this.o.min));\n\n            return ret;\n        };\n\n        this.listen = function () {\n            // bind MouseWheel\n            var s = this, mwTimerStop, mwTimerRelease,\n                mw = function (e) {\n                    e.preventDefault();\n\n                    var ori = e.originalEvent\n                        ,deltaX = ori.detail || ori.wheelDeltaX\n                        ,deltaY = ori.detail || ori.wheelDeltaY\n                        ,v = s._validate(s.o.parse(s.$.val()))\n                            + (deltaX>0 || deltaY>0 ? s.o.step : deltaX<0 || deltaY<0 ? -s.o.step : 0);\n\n                    v = max(min(v, s.o.max), s.o.min);\n\n                    s.val(v, false);\n\n                    if(s.rH) {\n                        // Handle mousewheel stop\n                        clearTimeout(mwTimerStop);\n                        mwTimerStop = setTimeout(function() {\n                            s.rH(v);\n                            mwTimerStop = null;\n                        }, 100);\n\n                        // Handle mousewheel releases\n                        if(!mwTimerRelease) {\n                            mwTimerRelease = setTimeout(function() {\n                                if(mwTimerStop) s.rH(v);\n                                mwTimerRelease = null;\n                            }, 200);\n                        }\n                    }\n                }\n                , kval, to, m = 1, kv = {37:-s.o.step, 38:s.o.step, 39:s.o.step, 40:-s.o.step};\n\n            this.$\n                .bind(\n                \"keydown\"\n                ,function (e) {\n                    var kc = e.keyCode;\n\n                    // numpad support\n                    if(kc >= 96 && kc <= 105) {\n                        kc = e.keyCode = kc - 48;\n                    }\n\n                    kval = parseInt(String.fromCharCode(kc));\n\n                    if (isNaN(kval)) {\n\n                        (kc !== 13)         // enter\n                            && (kc !== 8)       // bs\n                            && (kc !== 9)       // tab\n                            && (kc !== 189)     // -\n                            && (kc !== 190 || s.$.val().match(/\\./))     // . only allowed once\n                        && e.preventDefault();\n\n                        // arrows\n                        if ($.inArray(kc,[37,38,39,40]) > -1) {\n                            e.preventDefault();\n\n                            var v = s.o.parse(s.$.val()) + kv[kc] * m;\n                            s.o.stopper && (v = max(min(v, s.o.max), s.o.min));\n\n                            s.change(v);\n                            s._draw();\n\n                            // long time keydown speed-up\n                            to = window.setTimeout(\n                                function () { m *= 2; }, 30\n                            );\n                        }\n                    }\n                }\n            )\n                .bind(\n                \"keyup\"\n                ,function (e) {\n                    if (isNaN(kval)) {\n                        if (to) {\n                            window.clearTimeout(to);\n                            to = null;\n                            m = 1;\n                            s.val(s.$.val());\n                        }\n                    } else {\n                        // kval postcond\n                        (s.$.val() > s.o.max && s.$.val(s.o.max))\n                        || (s.$.val() < s.o.min && s.$.val(s.o.min));\n                    }\n\n                }\n            );\n\n            this.$c.bind(\"mousewheel DOMMouseScroll\", mw);\n            this.$.bind(\"mousewheel DOMMouseScroll\", mw)\n        };\n\n        this.init = function () {\n\n            if (\n                this.v < this.o.min\n                    || this.v > this.o.max\n                ) this.v = this.o.min;\n\n            this.$.val(this.v);\n            this.w2 = this.w / 2;\n            this.cursorExt = this.o.cursor / 100;\n            this.xy = this.w2 * this.scale;\n            this.lineWidth = this.xy * this.o.thickness;\n            this.lineCap = this.o.lineCap;\n            this.radius = this.xy - this.lineWidth / 2;\n\n            this.o.angleOffset\n            && (this.o.angleOffset = isNaN(this.o.angleOffset) ? 0 : this.o.angleOffset);\n\n            this.o.angleArc\n            && (this.o.angleArc = isNaN(this.o.angleArc) ? this.PI2 : this.o.angleArc);\n\n            // deg to rad\n            this.angleOffset = this.o.angleOffset * Math.PI / 180;\n            this.angleArc = this.o.angleArc * Math.PI / 180;\n\n            // compute start and end angles\n            this.startAngle = 1.5 * Math.PI + this.angleOffset;\n            this.endAngle = 1.5 * Math.PI + this.angleOffset + this.angleArc;\n\n            var s = max(\n                String(Math.abs(this.o.max)).length\n                , String(Math.abs(this.o.min)).length\n                , 2\n            ) + 2;\n\n            this.o.displayInput\n                && this.i.css({\n                'width' : ((this.w / 2 + 4) >> 0) + 'px'\n                ,'height' : ((this.w / 3) >> 0) + 'px'\n                ,'position' : 'absolute'\n                ,'vertical-align' : 'middle'\n                ,'margin-top' : ((this.w / 3) >> 0) + 'px'\n                ,'margin-left' : '-' + ((this.w * 3 / 4 + 2) >> 0) + 'px'\n                ,'border' : 0\n                ,'background' : 'none'\n                ,'font' : this.o.fontWeight + ' ' + ((this.w / s) >> 0) + 'px ' + this.o.font\n                ,'text-align' : 'center'\n                ,'color' : this.o.inputColor || this.o.fgColor\n                ,'padding' : '0px'\n                ,'-webkit-appearance': 'none'\n            })\n            || this.i.css({\n                'width' : '0px'\n                ,'visibility' : 'hidden'\n            });\n        };\n\n        this.change = function (v) {\n            this.cv = v;\n            this.$.val(this.o.format(v));\n        };\n\n        this.angle = function (v) {\n            return (v - this.o.min) * this.angleArc / (this.o.max - this.o.min);\n        };\n\n        this.arc = function (v) {\n            var sa, ea;\n            v = this.angle(v);\n            if (this.o.flip) {\n                sa = this.endAngle + 0.00001;\n                ea = sa - v - 0.00001;\n            } else {\n                sa = this.startAngle - 0.00001;\n                ea = sa + v + 0.00001;\n            }\n            this.o.cursor\n                && (sa = ea - this.cursorExt)\n            && (ea = ea + this.cursorExt);\n            return {\n                s: sa,\n                e: ea,\n                d: this.o.flip && !this.o.cursor\n            };\n        };\n\n        this.draw = function () {\n\n            var c = this.g,                 // context\n                a = this.arc(this.cv)       // Arc\n                , pa                        // Previous arc\n                , r = 1;\n\n            c.lineWidth = this.lineWidth;\n            c.lineCap = this.lineCap;\n\n            c.beginPath();\n            c.strokeStyle = this.o.bgColor;\n            c.arc(this.xy, this.xy, this.radius, this.endAngle - 0.00001, this.startAngle + 0.00001, true);\n            c.stroke();\n\n            if (this.o.displayPrevious) {\n                pa = this.arc(this.v);\n                c.beginPath();\n                c.strokeStyle = this.pColor;\n                c.arc(this.xy, this.xy, this.radius, pa.s, pa.e, pa.d);\n                c.stroke();\n                r = (this.cv == this.v);\n            }\n\n            c.beginPath();\n            c.strokeStyle = r ? this.o.fgColor : this.fgColor ;\n            c.arc(this.xy, this.xy, this.radius, a.s, a.e, a.d);\n            c.stroke();\n        };\n\n        this.cancel = function () {\n            this.val(this.v);\n        };\n    };\n\n    $.fn.dial = $.fn.knob = function (o) {\n        return this.each(\n            function () {\n                var d = new k.Dial();\n                d.o = o;\n                d.$ = $(this);\n                d.run();\n            }\n        ).parent();\n    };\n\n})(jQuery);\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/jvectormap/jquery-jvectormap-world-mill-en.js",
    "content": "$.fn.vectorMap('addMap', 'world_mill_en',{\"insets\": [{\"width\": 900.0, \"top\": 0, \"height\": 440.7063107441331, \"bbox\": [{\"y\": -12671671.123330014, \"x\": -20004297.151525836}, {\"y\": 6930392.02513512, \"x\": 20026572.394749384}], \"left\": 0}], \"paths\": {\"BD\": {\"path\": \"M652.71,228.85l-0.04,1.38l-0.46,-0.21l-0.42,0.3l0.05,0.65l-0.17,-1.37l-0.48,-1.26l-1.08,-1.6l-0.23,-0.13l-2.31,-0.11l-0.31,0.36l0.21,0.98l-0.6,1.11l-0.8,-0.4l-0.37,0.09l-0.23,0.3l-0.54,-0.21l-0.78,-0.19l-0.38,-2.04l-0.83,-1.89l0.4,-1.5l-0.16,-0.35l-1.24,-0.57l0.36,-0.62l1.5,-0.95l0.02,-0.49l-1.62,-1.26l0.64,-1.31l1.7,1.0l0.12,0.04l0.96,0.11l0.19,1.62l0.25,0.26l2.38,0.37l2.32,-0.04l1.06,0.33l-0.92,1.79l-0.97,0.13l-0.23,0.16l-0.77,1.51l0.05,0.35l1.37,1.37l0.5,-0.14l0.35,-1.46l0.24,-0.0l1.24,3.92Z\", \"name\": \"Bangladesh\"}, \"BE\": {\"path\": \"M429.28,143.95l1.76,0.25l0.13,-0.01l2.16,-0.64l1.46,1.34l1.26,0.71l-0.23,1.8l-0.44,0.08l-0.24,0.25l-0.2,1.36l-1.8,-1.22l-0.23,-0.05l-1.14,0.23l-1.62,-1.43l-1.15,-1.31l-0.21,-0.1l-0.95,-0.04l-0.21,-0.68l1.66,-0.54Z\", \"name\": \"Belgium\"}, \"BF\": {\"path\": \"M413.48,260.21l-1.22,-0.46l-0.13,-0.02l-1.17,0.1l-0.15,0.06l-0.73,0.53l-0.87,-0.41l-0.39,-0.75l-0.13,-0.13l-0.98,-0.48l-0.14,-1.2l0.63,-0.99l0.05,-0.18l-0.05,-0.73l1.9,-2.01l0.08,-0.14l0.35,-1.65l0.49,-0.44l1.05,0.3l0.21,-0.02l1.05,-0.52l0.13,-0.13l0.3,-0.58l1.87,-1.1l0.11,-0.1l0.43,-0.72l2.23,-1.01l1.21,-0.32l0.51,0.4l0.19,0.06l1.25,-0.01l-0.14,0.89l0.01,0.13l0.34,1.16l0.06,0.11l1.35,1.59l0.07,1.13l0.24,0.28l2.64,0.53l-0.05,1.39l-0.42,0.59l-1.11,0.21l-0.22,0.17l-0.46,0.99l-0.69,0.23l-2.12,-0.05l-1.14,-0.2l-0.19,0.03l-0.72,0.36l-1.07,-0.17l-4.35,0.12l-0.29,0.29l-0.06,1.44l0.25,1.45Z\", \"name\": \"Burkina Faso\"}, \"BG\": {\"path\": \"M477.63,166.84l0.51,0.9l0.33,0.14l0.9,-0.21l1.91,0.47l3.68,0.16l0.17,-0.05l1.2,-0.75l2.78,-0.67l1.72,1.05l1.02,0.24l-0.97,0.97l-0.91,2.17l0.0,0.24l0.56,1.19l-1.58,-0.3l-0.16,0.01l-2.55,0.95l-0.2,0.28l-0.02,1.23l-1.92,0.24l-1.68,-0.99l-0.27,-0.02l-1.94,0.8l-1.52,-0.07l-0.15,-1.72l-0.12,-0.21l-0.99,-0.76l0.18,-0.18l0.02,-0.39l-0.17,-0.22l0.33,-0.75l0.91,-0.91l0.01,-0.42l-1.16,-1.25l-0.18,-0.89l0.24,-0.27Z\", \"name\": \"Bulgaria\"}, \"BA\": {\"path\": \"M468.39,164.66l0.16,0.04l0.43,-0.0l-0.43,0.93l0.06,0.34l1.08,1.06l-0.28,1.09l-0.5,0.13l-0.47,0.28l-0.86,0.74l-0.1,0.16l-0.28,1.29l-1.81,-0.94l-0.9,-1.22l-1.0,-0.73l-1.1,-1.1l-0.55,-0.96l-1.11,-1.3l0.3,-0.75l0.59,0.46l0.42,-0.04l0.46,-0.54l1.0,-0.06l2.11,0.5l1.72,-0.03l1.06,0.64Z\", \"name\": \"Bosnia and Herzegovina\"}, \"BN\": {\"path\": \"M707.34,273.57l0.76,-0.72l1.59,-1.03l-0.18,1.93l-0.9,-0.06l-0.28,0.14l-0.31,0.51l-0.68,-0.78Z\", \"name\": \"Brunei\"}, \"BO\": {\"path\": \"M263.83,340.79l-0.23,-0.12l-2.86,-0.11l-0.28,0.17l-0.77,1.67l-1.17,-1.51l-0.18,-0.11l-3.28,-0.64l-0.28,0.1l-2.02,2.3l-1.43,0.29l-0.91,-3.35l-1.31,-2.88l0.75,-2.41l-0.09,-0.32l-1.23,-1.03l-0.31,-1.76l-0.05,-0.12l-1.12,-1.6l1.49,-2.62l0.01,-0.28l-1.0,-2.0l0.48,-0.72l0.02,-0.29l-0.37,-0.78l0.87,-1.13l0.06,-0.18l0.05,-2.17l0.12,-1.71l0.5,-0.8l0.01,-0.3l-1.9,-3.58l1.3,0.15l1.34,-0.05l0.23,-0.12l0.51,-0.7l2.12,-0.99l1.31,-0.93l2.81,-0.37l-0.21,1.51l0.01,0.13l0.29,0.91l-0.19,1.64l0.11,0.27l2.72,2.27l0.15,0.07l2.71,0.41l0.92,0.88l0.12,0.07l1.64,0.49l1.0,0.71l0.18,0.06l1.5,-0.02l1.24,0.64l0.1,1.31l0.05,0.14l0.44,0.68l0.02,0.73l-0.44,0.03l-0.27,0.39l0.96,2.99l0.28,0.21l4.43,0.1l-0.28,1.12l0.0,0.15l0.27,1.02l0.15,0.19l1.27,0.67l0.52,1.42l-0.42,1.91l-0.66,1.1l-0.04,0.2l0.21,1.3l-0.19,0.13l-0.01,-0.27l-0.15,-0.24l-2.33,-1.33l-0.14,-0.04l-2.38,-0.03l-4.36,0.76l-0.21,0.16l-1.2,2.29l-0.03,0.13l-0.06,1.37l-0.79,2.53l-0.05,-0.08Z\", \"name\": \"Bolivia\"}, \"JP\": {\"path\": \"M781.17,166.78l1.8,0.67l0.28,-0.04l1.38,-1.01l0.43,2.67l-3.44,0.77l-0.18,0.12l-2.04,2.79l-3.71,-1.94l-0.42,0.15l-1.29,3.11l-2.32,0.04l-0.3,-2.63l1.12,-2.1l2.51,-0.16l0.28,-0.25l0.73,-4.22l0.58,-1.9l2.59,2.84l2.0,1.1ZM773.66,187.36l-0.92,2.24l-0.01,0.2l0.4,1.3l-1.18,1.81l-3.06,1.28l-4.35,0.17l-0.19,0.08l-3.4,3.06l-1.36,-0.87l-0.1,-1.95l-0.34,-0.28l-4.35,0.62l-2.99,1.33l-2.87,0.05l-0.28,0.2l0.09,0.33l2.37,1.93l-1.57,4.44l-1.35,0.97l-0.9,-0.79l0.57,-2.32l-0.15,-0.34l-1.5,-0.77l-0.81,-1.53l2.04,-0.75l0.14,-0.1l1.28,-1.72l2.47,-1.43l1.84,-1.92l4.83,-0.82l2.62,0.57l0.33,-0.16l2.45,-4.77l1.38,1.14l0.38,0.0l5.1,-4.02l0.09,-0.11l1.57,-3.57l0.02,-0.16l-0.42,-3.22l0.94,-1.67l2.27,-0.47l1.26,3.82l-0.07,2.23l-2.26,2.86l-0.06,0.19l0.04,2.93ZM757.85,196.18l0.22,0.66l-1.11,1.33l-0.8,-0.7l-0.33,-0.04l-1.28,0.65l-0.14,0.15l-0.54,1.34l-1.17,-0.57l0.02,-1.03l1.2,-1.45l1.24,0.28l0.29,-0.1l0.9,-1.03l1.51,0.5Z\", \"name\": \"Japan\"}, \"BI\": {\"path\": \"M494.7,295.83l-0.14,-2.71l-0.04,-0.13l-0.34,-0.62l0.93,0.12l0.3,-0.16l0.67,-1.25l0.9,0.11l0.11,0.76l0.08,0.16l0.46,0.48l0.02,0.56l-0.55,0.48l-0.96,1.29l-0.82,0.82l-0.61,0.07Z\", \"name\": \"Burundi\"}, \"BJ\": {\"path\": \"M427.4,268.94l-1.58,0.22l-0.52,-1.45l0.11,-5.73l-0.08,-0.21l-0.43,-0.44l-0.09,-1.13l-0.09,-0.19l-1.52,-1.52l0.24,-1.01l0.7,-0.23l0.18,-0.16l0.45,-0.97l1.07,-0.21l0.19,-0.12l0.53,-0.73l0.73,-0.65l0.68,-0.0l1.69,1.3l-0.08,0.67l0.02,0.14l0.52,1.38l-0.44,0.9l-0.01,0.24l0.2,0.52l-1.1,1.42l-0.76,0.76l-0.08,0.13l-0.47,1.59l0.05,1.69l-0.13,3.79Z\", \"name\": \"Benin\"}, \"BT\": {\"path\": \"M650.38,213.78l0.88,0.75l-0.13,1.24l-1.77,0.07l-2.1,-0.18l-1.57,0.4l-2.02,-0.91l-0.02,-0.24l1.54,-1.87l1.18,-0.6l1.67,0.59l1.32,0.08l1.01,0.67Z\", \"name\": \"Bhutan\"}, \"JM\": {\"path\": \"M226.67,238.37l1.64,0.23l1.2,0.56l0.11,0.19l-1.25,0.03l-0.14,0.04l-0.65,0.37l-1.24,-0.37l-1.17,-0.77l0.11,-0.22l0.86,-0.15l0.52,0.08Z\", \"name\": \"Jamaica\"}, \"BW\": {\"path\": \"M484.91,331.96l0.53,0.52l0.82,1.53l2.83,2.86l0.14,0.08l0.85,0.22l0.03,0.81l0.74,1.66l0.21,0.17l1.87,0.39l1.17,0.87l-3.13,1.71l-2.3,2.01l-0.07,0.1l-0.82,1.74l-0.66,0.88l-1.24,0.19l-0.24,0.2l-0.65,1.98l-1.4,0.55l-1.9,-0.12l-1.2,-0.74l-1.06,-0.32l-0.22,0.02l-1.22,0.62l-0.14,0.14l-0.58,1.21l-1.16,0.79l-1.18,1.13l-1.5,0.23l-0.4,-0.68l0.22,-1.53l-0.04,-0.19l-1.48,-2.54l-0.11,-0.11l-0.53,-0.31l-0.0,-7.25l2.18,-0.08l0.29,-0.3l0.07,-9.0l1.63,-0.08l3.69,-0.86l0.84,0.93l0.38,0.05l1.53,-0.97l0.79,-0.03l1.3,-0.53l0.23,0.1l0.92,1.96Z\", \"name\": \"Botswana\"}, \"BR\": {\"path\": \"M259.49,274.87l1.42,0.25l1.97,0.62l0.28,-0.05l0.67,-0.55l1.76,-0.38l2.8,-0.94l0.12,-0.08l0.92,-0.96l0.05,-0.33l-0.15,-0.32l0.73,-0.06l0.36,0.35l-0.27,0.93l0.17,0.36l0.76,0.34l0.44,0.9l-0.58,0.73l-0.06,0.13l-0.4,2.13l0.03,0.19l0.62,1.22l0.17,1.11l0.11,0.19l1.54,1.18l0.15,0.06l1.23,0.12l0.29,-0.15l0.2,-0.36l0.71,-0.11l1.13,-0.44l0.79,-0.63l1.25,0.19l0.65,-0.08l1.32,0.2l0.32,-0.18l0.23,-0.51l-0.05,-0.31l-0.31,-0.37l0.11,-0.31l0.75,0.17l0.13,0.0l1.1,-0.24l1.34,0.5l1.08,0.51l0.33,-0.05l0.67,-0.58l0.27,0.05l0.28,0.57l0.31,0.17l1.2,-0.18l0.17,-0.08l1.03,-1.05l0.76,-1.82l1.39,-2.16l0.49,-0.07l0.52,1.17l1.4,4.37l0.2,0.2l1.14,0.35l0.05,1.39l-1.8,1.97l0.01,0.42l0.78,0.75l0.18,0.08l4.16,0.37l0.08,2.25l0.5,0.22l1.78,-1.54l2.98,0.85l4.07,1.5l1.07,1.28l-0.37,1.23l0.36,0.38l2.83,-0.75l4.8,1.3l3.75,-0.09l3.6,2.02l3.27,2.84l1.93,0.72l2.13,0.11l0.76,0.66l1.22,4.56l-0.96,4.03l-1.22,1.58l-3.52,3.51l-1.63,2.91l-1.75,2.09l-0.5,0.04l-0.26,0.19l-0.72,1.99l0.18,4.76l-0.95,5.56l-0.74,0.96l-0.06,0.15l-0.43,3.39l-2.49,3.34l-0.06,0.13l-0.4,2.56l-1.9,1.07l-0.13,0.16l-0.51,1.38l-2.59,0.0l-3.94,1.01l-1.82,1.19l-2.85,0.81l-3.01,2.17l-2.12,2.65l-0.06,0.13l-0.36,2.0l0.01,0.13l0.4,1.42l-0.45,2.63l-0.53,1.23l-1.76,1.53l-2.76,4.79l-2.16,2.15l-1.69,1.29l-0.09,0.12l-1.12,2.6l-1.3,1.26l-0.45,-1.02l0.99,-1.18l0.01,-0.37l-1.5,-1.95l-1.98,-1.54l-2.58,-1.77l-0.2,-0.05l-0.81,0.07l-2.42,-2.05l-0.25,-0.07l-0.77,0.14l2.75,-3.07l2.8,-2.61l1.67,-1.09l2.11,-1.49l0.13,-0.24l0.05,-2.15l-0.07,-0.2l-1.26,-1.54l-0.35,-0.09l-0.64,0.27l0.3,-0.95l0.34,-1.57l0.01,-1.52l-0.16,-0.26l-0.9,-0.48l-0.27,-0.01l-0.86,0.39l-0.65,-0.08l-0.23,-0.8l-0.23,-2.39l-0.04,-0.12l-0.47,-0.79l-0.14,-0.12l-1.69,-0.71l-0.25,0.01l-0.93,0.47l-2.29,-0.44l0.15,-3.3l-0.03,-0.15l-0.62,-1.22l0.57,-0.39l0.13,-0.3l-0.22,-1.37l0.67,-1.13l0.44,-2.04l-0.01,-0.17l-0.59,-1.61l-0.14,-0.16l-1.25,-0.66l-0.22,-0.82l0.35,-1.41l-0.28,-0.37l-4.59,-0.1l-0.78,-2.41l0.34,-0.02l0.28,-0.31l-0.03,-1.1l-0.05,-0.16l-0.45,-0.68l-0.1,-1.4l-0.16,-0.24l-1.45,-0.76l-0.14,-0.03l-1.48,0.02l-1.04,-0.73l-1.62,-0.48l-0.93,-0.9l-0.16,-0.08l-2.72,-0.41l-2.53,-2.12l0.18,-1.54l-0.01,-0.13l-0.29,-0.91l0.26,-1.83l-0.34,-0.34l-3.28,0.43l-0.14,0.05l-1.3,0.93l-2.16,1.01l-0.12,0.09l-0.47,0.65l-1.12,0.05l-1.84,-0.21l-0.12,0.01l-1.33,0.41l-0.82,-0.21l0.16,-3.6l-0.48,-0.26l-1.97,1.43l-1.96,-0.06l-0.86,-1.23l-0.22,-0.13l-1.23,-0.11l0.34,-0.69l-0.05,-0.33l-1.36,-1.5l-0.92,-2.0l0.45,-0.32l0.13,-0.25l-0.0,-0.87l1.34,-0.64l0.17,-0.32l-0.23,-1.23l0.56,-0.77l0.05,-0.13l0.16,-1.03l2.7,-1.61l2.01,-0.47l0.16,-0.09l0.24,-0.27l2.11,0.11l0.31,-0.25l1.13,-6.87l0.06,-1.12l-0.4,-1.53l-0.1,-0.15l-1.0,-0.82l0.01,-1.45l1.08,-0.32l0.39,0.2l0.44,-0.24l0.08,-0.96l-0.25,-0.32l-1.22,-0.22l-0.02,-1.01l4.57,0.05l0.22,-0.09l0.6,-0.63l0.44,0.5l0.47,1.42l0.45,0.16l0.27,-0.18l1.21,1.16l0.23,0.08l1.95,-0.16l0.23,-0.14l0.43,-0.67l1.76,-0.55l1.05,-0.42l0.18,-0.2l0.25,-0.92l1.65,-0.66l0.18,-0.35l-0.14,-0.53l-0.26,-0.22l-1.91,-0.19l-0.29,-1.33l0.1,-1.64l-0.15,-0.28l-0.44,-0.25Z\", \"name\": \"Brazil\"}, \"BS\": {\"path\": \"M227.51,216.69l0.3,0.18l-0.24,1.07l0.03,-1.04l-0.09,-0.21ZM226.5,224.03l-0.13,0.03l-0.54,-1.3l-0.09,-0.12l-0.78,-0.64l0.4,-1.26l0.33,0.05l0.79,2.0l0.01,1.24ZM225.76,216.5l-2.16,0.34l-0.07,-0.41l0.85,-0.16l1.36,0.07l0.02,0.16Z\", \"name\": \"The Bahamas\"}, \"BY\": {\"path\": \"M480.08,135.28l2.09,0.02l0.13,-0.03l2.72,-1.3l0.16,-0.19l0.55,-1.83l1.94,-1.06l0.15,-0.31l-0.2,-1.33l1.33,-0.52l2.58,-1.3l2.39,0.8l0.3,0.75l0.37,0.17l1.22,-0.39l2.18,0.75l0.2,1.36l-0.48,0.85l0.01,0.32l1.57,2.26l0.92,0.6l-0.1,0.41l0.19,0.35l1.61,0.57l0.48,0.6l-0.64,0.49l-1.91,-0.11l-0.18,0.05l-0.48,0.32l-0.1,0.39l0.57,1.1l0.51,1.78l-1.79,0.17l-0.18,0.08l-0.77,0.73l-0.09,0.19l-0.13,1.31l-0.75,-0.22l-2.11,0.15l-0.56,-0.66l-0.39,-0.06l-0.8,0.49l-0.79,-0.4l-0.13,-0.03l-1.94,-0.07l-2.76,-0.79l-2.58,-0.27l-1.98,0.07l-0.15,0.05l-1.31,0.86l-0.8,0.09l-0.04,-1.16l-0.03,-0.12l-0.63,-1.28l1.22,-0.56l0.17,-0.27l0.01,-1.35l-0.04,-0.15l-0.66,-1.24l-0.08,-1.12Z\", \"name\": \"Belarus\"}, \"BZ\": {\"path\": \"M198.03,239.7l0.28,0.19l0.43,-0.1l0.82,-1.42l0.0,0.07l0.29,0.29l0.16,0.0l-0.02,0.35l-0.39,1.08l0.02,0.25l0.16,0.29l-0.23,0.8l0.04,0.24l0.09,0.14l-0.25,1.12l-0.38,0.53l-0.33,0.06l-0.21,0.15l-0.41,0.74l-0.25,0.0l0.17,-2.58l0.01,-2.2Z\", \"name\": \"Belize\"}, \"RU\": {\"path\": \"M688.57,38.85l0.63,2.39l0.44,0.19l2.22,-1.23l7.18,0.07l5.54,2.49l1.85,1.77l-0.55,2.34l-2.64,1.42l-6.57,2.76l-1.95,1.5l0.12,0.53l3.09,0.68l3.69,1.23l0.21,-0.01l1.98,-0.81l1.16,2.84l0.5,0.08l1.03,-1.18l3.86,-0.74l7.79,0.78l0.56,2.05l0.27,0.22l10.47,0.71l0.32,-0.29l0.13,-3.34l4.98,0.8l3.96,-0.02l3.88,2.43l1.06,2.79l-1.38,1.83l0.01,0.38l3.15,3.64l0.1,0.08l3.94,1.86l0.4,-0.14l2.28,-4.56l3.75,1.94l0.22,0.02l4.18,-1.22l4.76,1.4l0.26,-0.04l1.74,-1.23l3.98,0.63l0.32,-0.41l-1.71,-4.1l3.0,-1.86l22.39,3.04l2.06,2.67l0.1,0.08l6.55,3.51l0.17,0.03l10.08,-0.86l4.86,0.73l1.91,1.72l-0.29,3.13l0.18,0.31l3.08,1.26l0.19,0.01l3.32,-0.9l4.37,-0.11l4.78,0.87l4.61,-0.48l4.26,3.82l0.32,0.05l3.1,-1.4l0.12,-0.45l-1.91,-2.67l0.92,-1.64l7.78,1.22l5.22,-0.26l7.12,2.1l9.6,5.22l6.4,4.15l-0.2,2.44l0.14,0.28l1.69,1.04l0.45,-0.31l-0.51,-2.66l6.31,0.58l4.52,3.61l-2.1,1.52l-4.02,0.42l-0.27,0.29l-0.06,3.83l-0.81,0.67l-2.14,-0.11l-1.91,-1.39l-3.19,-1.13l-0.51,-1.63l-0.21,-0.2l-2.54,-0.67l-0.13,-0.0l-2.69,0.5l-1.12,-1.19l0.48,-1.36l-0.38,-0.39l-3.0,0.98l-0.17,0.44l1.02,1.76l-1.27,1.55l-3.09,1.71l-3.15,-0.29l-0.3,0.18l0.07,0.34l2.22,2.1l1.47,3.22l1.15,1.09l0.25,1.41l-0.48,0.76l-4.47,-0.81l-0.17,0.02l-6.97,2.9l-2.2,0.44l-0.11,0.05l-3.83,2.68l-3.63,2.32l-0.1,0.11l-0.76,1.4l-3.3,-2.4l-0.3,-0.03l-6.31,2.85l-0.99,-1.21l-0.4,-0.06l-2.32,1.54l-3.23,-0.49l-0.33,0.2l-0.79,2.39l-2.97,3.51l-0.07,0.21l0.09,1.47l0.22,0.27l2.62,0.74l-0.3,4.7l-2.06,0.12l-0.26,0.2l-1.07,2.94l0.04,0.27l0.83,1.19l-4.03,1.63l-0.18,0.21l-0.83,3.72l-3.55,0.79l-0.23,0.23l-0.73,3.32l-3.22,2.76l-0.76,-1.88l-1.07,-4.88l-1.39,-7.59l1.17,-4.76l2.05,-2.08l0.09,-0.19l0.11,-1.46l3.67,-0.77l0.15,-0.08l4.47,-4.61l4.29,-3.82l4.48,-3.01l0.11,-0.14l2.01,-5.43l-0.31,-0.4l-3.04,0.33l-0.24,0.17l-1.47,3.11l-5.98,3.94l-1.91,-4.36l-0.33,-0.17l-6.46,1.3l-0.15,0.08l-6.27,6.33l-0.01,0.41l1.7,1.87l-5.04,0.87l-3.51,0.34l0.16,-2.32l-0.26,-0.32l-3.89,-0.56l-0.19,0.04l-3.02,1.77l-7.63,-0.63l-8.24,1.1l-0.16,0.07l-8.11,7.09l-9.6,8.31l0.16,0.52l3.79,0.42l1.16,2.03l0.17,0.14l2.43,0.76l0.31,-0.08l1.5,-1.61l2.49,0.2l3.46,3.6l0.08,2.67l-1.91,3.26l-0.04,0.14l-0.21,3.91l-1.11,5.09l-3.73,4.55l-0.87,2.21l-6.73,7.14l-1.59,1.77l-3.23,1.72l-1.38,0.03l-1.48,-1.39l-0.37,-0.03l-3.36,2.22l-0.11,0.14l-0.16,0.42l-0.01,-1.09l1.0,-0.06l0.28,-0.27l0.36,-3.6l-0.61,-2.51l1.85,-0.94l2.94,0.53l0.32,-0.15l1.71,-3.1l0.84,-3.38l0.97,-1.18l1.32,-2.88l-0.34,-0.42l-4.14,0.95l-2.18,1.25l-3.51,-0.0l-0.95,-2.81l-0.1,-0.14l-2.97,-2.3l-0.11,-0.05l-4.19,-1.0l-0.89,-3.08l-0.87,-2.03l-0.95,-1.46l-1.54,-3.37l-0.12,-0.14l-2.27,-1.28l-3.83,-1.02l-3.37,0.1l-3.11,0.61l-0.13,0.06l-2.07,1.69l0.04,0.49l1.23,0.72l0.03,1.53l-1.34,1.05l-2.26,3.51l-0.05,0.17l0.02,1.27l-3.25,1.9l-2.87,-1.17l-0.14,-0.02l-2.86,0.26l-1.22,-1.02l-0.12,-0.06l-1.5,-0.35l-0.23,0.04l-3.62,2.27l-3.24,0.53l-2.28,0.79l-3.08,-0.51l-2.24,0.03l-1.49,-1.61l-2.45,-1.57l-0.11,-0.04l-2.6,-0.43l-3.17,0.43l-2.31,0.59l-3.31,-1.28l-0.45,-2.31l-0.21,-0.23l-2.94,-0.85l-2.26,-0.39l-2.77,-1.36l-0.37,0.09l-2.59,3.45l-0.03,0.32l0.91,1.74l-2.15,2.01l-3.47,-0.79l-2.44,-0.12l-1.59,-1.46l-0.2,-0.08l-2.55,-0.05l-2.12,-0.98l-0.24,-0.01l-3.85,1.57l-4.74,2.79l-2.59,0.55l-0.79,0.21l-1.21,-1.81l-0.29,-0.13l-3.05,0.41l-0.96,-1.25l-0.14,-0.1l-1.65,-0.6l-1.15,-1.82l-0.13,-0.12l-1.38,-0.6l-0.19,-0.02l-3.49,0.82l-3.35,-1.85l-0.38,0.08l-1.08,1.4l-5.36,-8.17l-3.02,-2.52l0.72,-0.85l0.01,-0.38l-0.37,-0.08l-6.22,3.21l-1.98,0.16l0.17,-1.51l-0.2,-0.31l-3.22,-1.17l-0.19,-0.0l-2.3,0.74l-0.72,-3.27l-0.24,-0.23l-4.5,-0.75l-0.21,0.04l-2.2,1.42l-6.21,1.27l-0.11,0.05l-1.16,0.81l-9.3,1.19l-0.18,0.09l-1.15,1.17l-0.02,0.39l1.56,2.01l-2.02,0.74l-0.16,0.42l0.35,0.68l-2.18,1.49l0.02,0.51l3.83,2.16l-0.45,1.13l-3.31,-0.13l-0.25,0.12l-0.57,0.77l-2.97,-1.59l-0.15,-0.04l-3.97,0.07l-0.13,0.03l-2.53,1.32l-2.84,-1.28l-5.52,-2.3l-0.12,-0.02l-3.91,0.09l-0.16,0.05l-5.17,3.6l-0.13,0.21l-0.25,1.89l-2.17,-1.6l-0.44,0.1l-2.0,3.59l0.06,0.37l0.55,0.5l-1.32,2.23l0.04,0.36l2.13,2.17l0.23,0.09l1.7,-0.08l1.42,1.89l-0.23,1.5l0.19,0.32l0.94,0.38l-0.89,1.44l-2.3,0.49l-0.17,0.11l-2.49,3.2l0.0,0.37l2.2,2.81l-0.23,1.93l0.06,0.22l2.56,3.32l-1.27,1.02l-0.4,0.66l-0.8,-0.15l-1.65,-1.75l-0.18,-0.09l-0.66,-0.09l-1.45,-0.64l-0.72,-1.16l-0.18,-0.13l-2.34,-0.63l-0.17,0.0l-1.32,0.41l-0.31,-0.4l-0.12,-0.09l-3.49,-1.48l-3.67,-0.49l-2.1,-0.52l-0.3,0.1l-0.12,0.14l-2.96,-2.4l-2.89,-1.19l-1.69,-1.42l1.27,-0.35l0.16,-0.1l2.08,-2.61l-0.04,-0.41l-1.02,-0.9l3.21,-1.12l0.2,-0.31l-0.07,-0.69l-0.37,-0.26l-1.86,0.42l0.05,-0.86l1.11,-0.76l2.35,-0.23l0.25,-0.19l0.39,-1.07l0.0,-0.19l-0.51,-1.64l0.95,-1.58l0.04,-0.16l-0.03,-0.95l-0.22,-0.28l-3.69,-1.06l-1.43,0.02l-1.45,-1.44l-0.29,-0.08l-1.83,0.49l-2.88,-1.04l0.04,-0.42l-0.04,-0.18l-0.89,-1.43l-0.23,-0.14l-1.77,-0.14l-0.13,-0.66l0.52,-0.56l0.01,-0.4l-1.6,-1.9l-0.27,-0.1l-2.55,0.32l-0.71,-0.16l-0.3,0.1l-0.53,0.63l-0.58,-0.08l-0.56,-1.97l-0.48,-0.94l0.17,-0.11l1.92,0.11l0.2,-0.06l0.97,-0.74l0.05,-0.42l-0.72,-0.91l-0.13,-0.1l-1.43,-0.51l0.09,-0.36l-0.13,-0.33l-0.97,-0.59l-1.43,-2.06l0.44,-0.77l0.04,-0.19l-0.25,-1.64l-0.2,-0.24l-2.45,-0.84l-0.19,-0.0l-1.05,0.34l-0.25,-0.62l-0.18,-0.17l-2.5,-0.84l-0.74,-1.93l-0.21,-1.7l-0.13,-0.21l-0.92,-0.63l0.83,-0.89l0.07,-0.27l-0.71,-3.26l1.69,-2.01l0.03,-0.34l-0.24,-0.41l2.63,-1.9l-0.01,-0.49l-2.31,-1.57l5.08,-4.61l2.33,-2.24l1.01,-2.08l-0.09,-0.37l-3.52,-2.56l0.94,-2.38l-0.04,-0.29l-2.14,-2.86l1.61,-3.35l-0.01,-0.29l-2.81,-4.58l2.19,-3.04l-0.06,-0.42l-3.7,-2.76l0.32,-2.67l1.87,-0.38l4.26,-1.77l2.46,-1.47l3.96,2.58l0.12,0.05l6.81,1.04l9.37,4.87l1.81,1.92l0.15,2.55l-2.61,2.06l-3.95,1.07l-11.1,-3.15l-0.17,0.0l-1.84,0.53l-0.1,0.53l3.97,2.97l0.15,1.77l0.16,4.14l0.19,0.27l3.21,1.22l1.94,1.03l0.44,-0.22l0.32,-1.94l-0.07,-0.25l-1.32,-1.52l1.25,-1.2l5.87,2.45l0.24,-0.01l2.11,-0.98l0.13,-0.42l-1.55,-2.75l5.52,-3.84l2.13,0.22l2.28,1.42l0.43,-0.12l1.46,-2.87l-0.04,-0.33l-1.97,-2.37l1.14,-2.38l-0.02,-0.3l-1.42,-2.07l6.15,1.22l1.14,1.92l-2.74,0.46l-0.25,0.3l0.02,2.36l0.12,0.24l1.97,1.44l0.25,0.05l3.87,-0.91l0.22,-0.23l0.58,-2.55l5.09,-1.98l8.67,-3.69l1.22,0.14l-2.06,2.2l0.18,0.5l3.11,0.45l0.23,-0.07l1.71,-1.41l4.59,-0.12l0.12,-0.03l3.53,-1.72l2.7,2.48l0.42,-0.01l2.85,-2.88l-0.0,-0.43l-2.42,-2.35l1.0,-1.13l7.2,1.31l3.42,1.36l9.06,4.97l0.39,-0.08l1.67,-2.27l-0.04,-0.4l-2.46,-2.23l-0.06,-0.82l-0.26,-0.27l-2.64,-0.38l0.69,-1.76l0.0,-0.22l-1.32,-3.47l-0.07,-1.27l4.52,-4.09l0.08,-0.11l1.6,-4.18l1.67,-0.84l6.33,1.2l0.46,2.31l-2.31,3.67l0.05,0.38l1.49,1.41l0.77,3.04l-0.56,6.05l0.09,0.24l2.62,2.54l-0.99,2.65l-4.87,5.96l0.17,0.48l2.86,0.61l0.31,-0.13l0.94,-1.42l2.67,-1.04l0.18,-0.19l0.64,-2.01l2.11,-1.98l0.05,-0.37l-1.38,-2.32l1.11,-2.74l-0.24,-0.41l-2.53,-0.33l-0.53,-2.16l1.96,-4.42l-0.05,-0.32l-3.03,-3.48l4.21,-2.94l0.12,-0.3l-0.52,-3.04l0.72,-0.06l1.18,2.35l-0.97,4.39l0.2,0.35l2.68,0.84l0.37,-0.38l-1.05,-3.07l3.89,-1.71l5.05,-0.24l4.55,2.62l0.36,-0.05l0.05,-0.36l-2.19,-3.84l-0.23,-4.78l4.07,-0.92l5.98,0.21l5.47,-0.64l0.2,-0.48l-1.88,-2.37l2.65,-2.99l2.75,-0.13l0.12,-0.03l4.82,-2.48l6.56,-0.67l0.23,-0.14l0.76,-1.27l6.33,-0.46l1.97,1.11l0.28,0.01l5.55,-2.71l4.53,0.08l0.29,-0.21l0.67,-2.18l2.29,-2.15l5.75,-2.13l3.48,1.4l-2.7,1.03l-0.19,0.31l0.26,0.26l5.47,0.78ZM871.83,65.73l0.25,-0.15l1.99,0.01l3.3,1.2l-0.08,0.22l-2.41,1.03l-5.73,0.49l-0.31,-1.0l2.99,-1.8ZM797.64,48.44l-2.22,1.51l-3.85,-0.43l-4.35,-1.85l0.42,-1.13l4.42,0.72l5.59,1.17ZM783.82,46.06l-1.71,3.25l-9.05,-0.14l-4.11,1.15l-4.64,-3.04l1.21,-3.13l3.11,-0.91l6.53,0.22l8.66,2.59ZM780.37,145.71l2.28,5.23l-3.09,-0.89l-0.37,0.19l-1.54,4.65l0.04,0.27l2.38,3.17l-0.05,1.4l-1.41,-1.41l-0.46,0.04l-1.23,1.81l-0.33,-1.86l0.28,-3.1l-0.28,-3.41l0.58,-2.46l0.11,-4.39l-0.03,-0.13l-1.44,-3.2l0.21,-4.39l2.19,-1.49l0.09,-0.41l-0.81,-1.3l0.48,-0.21l0.56,1.94l0.86,3.23l-0.05,3.36l1.03,3.35ZM780.16,57.18l-3.4,0.03l-5.06,-0.53l1.97,-1.59l2.95,-0.42l3.35,1.75l0.18,0.77ZM683.84,31.18l-13.29,1.97l4.16,-6.56l1.88,-0.58l1.77,0.34l6.08,3.02l-0.6,1.8ZM670.94,28.02l-5.18,0.65l-6.89,-1.58l-4.03,-2.07l-1.88,-3.98l-0.18,-0.16l-2.8,-0.93l5.91,-3.62l5.25,-1.29l4.73,2.88l5.63,5.44l-0.57,4.66ZM564.37,68.98l-0.85,0.23l-7.93,-0.57l-0.6,-1.84l-0.21,-0.2l-4.34,-1.18l-0.3,-2.08l2.34,-0.92l0.19,-0.29l-0.08,-2.43l4.85,-4.0l-0.12,-0.52l-1.68,-0.43l5.47,-3.94l0.11,-0.33l-0.6,-2.02l5.36,-2.55l8.22,-3.27l8.29,-0.96l4.34,-1.94l4.67,-0.65l1.45,1.72l-1.43,1.37l-8.8,2.52l-7.65,2.42l-7.92,4.84l-3.73,4.75l-3.92,4.58l-0.07,0.23l0.51,3.88l0.11,0.2l4.32,3.39ZM548.86,18.57l-3.28,0.75l-2.25,0.44l-0.22,0.19l-0.3,0.81l-2.67,0.86l-2.27,-1.14l1.2,-1.51l-0.23,-0.49l-3.14,-0.1l2.48,-0.54l3.55,-0.07l0.44,1.36l0.49,0.12l1.4,-1.35l2.2,-0.9l3.13,1.08l-0.54,0.49ZM477.5,133.25l-4.21,0.05l-2.69,-0.34l0.39,-1.03l3.24,-1.06l2.51,0.58l0.85,0.43l-0.2,0.71l-0.0,0.15l0.12,0.52Z\", \"name\": \"Russia\"}, \"RW\": {\"path\": \"M497.03,288.12l0.78,1.11l-0.12,1.19l-0.49,0.21l-1.25,-0.15l-0.3,0.16l-0.67,1.24l-1.01,-0.13l0.16,-0.92l0.22,-0.12l0.15,-0.24l0.09,-1.37l0.49,-0.48l0.42,0.18l0.25,-0.01l1.26,-0.65Z\", \"name\": \"Rwanda\"}, \"RS\": {\"path\": \"M469.75,168.65l0.21,-0.21l0.36,-1.44l-0.08,-0.29l-1.06,-1.03l0.54,-1.16l-0.28,-0.43l-0.26,0.0l0.55,-0.67l-0.01,-0.39l-0.77,-0.86l-0.45,-0.89l1.56,-0.67l1.39,0.12l1.22,1.1l0.26,0.91l0.16,0.19l1.38,0.66l0.17,1.12l0.14,0.21l1.46,0.9l0.35,-0.03l0.62,-0.54l0.09,0.06l-0.28,0.25l-0.03,0.42l0.29,0.34l-0.44,0.5l-0.07,0.26l0.22,1.12l0.07,0.14l1.02,1.1l-0.81,0.84l-0.42,0.96l0.04,0.3l0.12,0.15l-0.15,0.16l-1.04,0.04l-0.39,0.08l0.33,-0.81l-0.29,-0.41l-0.21,0.01l-0.39,-0.45l-0.13,-0.09l-0.32,-0.11l-0.27,-0.4l-0.14,-0.11l-0.4,-0.16l-0.31,-0.37l-0.34,-0.09l-0.45,0.17l-0.18,0.18l-0.29,0.84l-0.96,-0.65l-0.81,-0.33l-0.32,-0.37l-0.22,-0.18Z\", \"name\": \"Republic of Serbia\"}, \"LT\": {\"path\": \"M478.13,133.31l-0.14,-0.63l0.25,-0.88l-0.15,-0.35l-1.17,-0.58l-2.43,-0.57l-0.45,-2.51l2.58,-0.97l4.14,0.22l2.3,-0.32l0.26,0.54l0.22,0.17l1.26,0.22l2.25,1.6l0.19,1.23l-1.87,1.01l-0.14,0.18l-0.54,1.83l-2.54,1.21l-2.18,-0.02l-0.52,-0.91l-0.18,-0.14l-1.11,-0.32Z\", \"name\": \"Lithuania\"}, \"LU\": {\"path\": \"M435.95,147.99l0.33,0.49l-0.11,1.07l-0.39,0.04l-0.29,-0.15l0.21,-1.4l0.25,-0.05Z\", \"name\": \"Luxembourg\"}, \"LR\": {\"path\": \"M401.37,273.67l-0.32,0.01l-2.48,-1.15l-2.24,-1.89l-2.14,-1.38l-1.47,-1.42l0.44,-0.59l0.05,-0.13l0.12,-0.65l1.07,-1.3l1.08,-1.09l0.52,-0.07l0.43,-0.18l0.84,1.24l-0.15,0.89l0.07,0.25l0.49,0.54l0.22,0.1l0.71,0.01l0.27,-0.16l0.42,-0.83l0.19,0.02l-0.06,0.52l0.23,1.12l-0.5,1.03l0.06,0.35l0.73,0.69l0.14,0.08l0.71,0.15l0.92,0.91l0.06,0.76l-0.17,0.22l-0.06,0.15l-0.17,1.8Z\", \"name\": \"Liberia\"}, \"RO\": {\"path\": \"M477.94,155.19l1.02,-0.64l1.49,0.33l1.52,0.01l1.09,0.73l0.32,0.01l0.81,-0.46l1.8,-0.3l0.18,-0.1l0.54,-0.64l0.86,0.0l0.64,0.26l0.71,0.87l0.8,1.35l1.39,1.81l0.07,1.25l-0.26,1.3l0.01,0.15l0.45,1.42l0.15,0.18l1.12,0.57l0.25,0.01l1.05,-0.45l0.86,0.4l0.03,0.43l-0.92,0.51l-0.63,-0.24l-0.4,0.22l-0.64,3.41l-1.12,-0.24l-1.78,-1.09l-0.23,-0.04l-2.95,0.71l-1.25,0.77l-3.55,-0.16l-1.89,-0.47l-0.14,-0.0l-0.75,0.17l-0.61,-1.07l-0.3,-0.36l0.36,-0.32l-0.04,-0.48l-0.62,-0.38l-0.36,0.03l-0.62,0.54l-1.15,-0.71l-0.18,-1.14l-0.17,-0.22l-1.4,-0.67l-0.24,-0.86l-0.09,-0.14l-0.96,-0.87l1.49,-0.44l0.16,-0.11l1.51,-2.14l1.15,-2.09l1.44,-0.63Z\", \"name\": \"Romania\"}, \"GW\": {\"path\": \"M383.03,256.73l-1.12,-0.88l-0.14,-0.06l-0.94,-0.15l-0.43,-0.54l0.01,-0.27l-0.13,-0.26l-0.68,-0.48l-0.05,-0.16l0.99,-0.31l0.77,0.08l0.15,-0.02l0.61,-0.26l4.25,0.1l-0.02,0.44l-0.19,0.18l-0.08,0.29l0.17,0.66l-0.17,0.14l-0.44,0.0l-0.16,0.05l-0.57,0.37l-0.66,-0.04l-0.24,0.1l-0.92,1.03Z\", \"name\": \"Guinea Bissau\"}, \"GT\": {\"path\": \"M195.13,249.89l-1.05,-0.35l-1.5,-0.04l-1.06,-0.47l-1.19,-0.93l0.04,-0.53l0.27,-0.55l-0.03,-0.31l-0.24,-0.32l1.02,-1.77l3.04,-0.01l0.3,-0.28l0.06,-0.88l-0.19,-0.3l-0.3,-0.11l-0.23,-0.45l-0.11,-0.12l-0.9,-0.58l-0.35,-0.33l0.37,-0.0l0.3,-0.3l0.0,-1.15l4.05,0.02l-0.02,1.74l-0.2,2.89l0.3,0.32l0.67,-0.0l0.75,0.42l0.4,-0.11l-0.62,0.53l-1.17,0.7l-0.13,0.16l-0.18,0.49l0.0,0.21l0.14,0.34l-0.35,0.44l-0.49,0.13l-0.2,0.41l0.03,0.06l-0.27,0.16l-0.86,0.64l-0.12,0.22ZM199.35,245.38l0.07,-0.13l0.05,0.02l-0.13,0.11Z\", \"name\": \"Guatemala\"}, \"GR\": {\"path\": \"M487.2,174.55l-0.64,1.54l-0.43,0.24l-1.41,-0.08l-1.28,-0.28l-0.14,0.0l-3.03,0.77l-0.13,0.51l1.39,1.34l-0.78,0.29l-1.2,0.0l-1.23,-1.42l-0.47,0.02l-0.47,0.65l-0.04,0.27l0.56,1.76l0.06,0.11l1.02,1.12l-0.66,0.45l-0.04,0.46l1.39,1.35l1.15,0.79l0.02,1.06l-1.91,-0.63l-0.36,0.42l0.56,1.12l-1.2,0.23l-0.22,0.4l0.8,2.14l-1.15,0.02l-1.89,-1.15l-0.89,-2.19l-0.43,-1.91l-0.05,-0.11l-0.98,-1.35l-1.24,-1.62l-0.13,-0.63l1.07,-1.32l0.06,-0.14l0.13,-0.81l0.68,-0.36l0.16,-0.25l0.03,-0.54l1.4,-0.23l0.12,-0.05l0.87,-0.6l1.26,0.05l0.25,-0.11l0.34,-0.43l0.33,-0.07l1.81,0.08l0.13,-0.02l1.87,-0.77l1.64,0.97l0.19,0.04l2.28,-0.28l0.26,-0.29l0.02,-0.95l0.56,0.36ZM480.44,192.0l1.05,0.74l0.01,0.0l-1.26,-0.23l0.2,-0.51ZM481.76,192.79l1.86,-0.15l1.53,0.17l-0.02,0.19l0.34,0.3l-2.28,0.15l0.01,-0.13l-0.25,-0.31l-1.19,-0.22ZM485.65,193.28l0.65,-0.16l-0.05,0.12l-0.6,0.04Z\", \"name\": \"Greece\"}, \"GQ\": {\"path\": \"M444.81,282.04l-0.21,-0.17l0.74,-2.4l3.56,0.05l0.02,2.42l-3.34,-0.02l-0.76,0.13Z\", \"name\": \"Equatorial Guinea\"}, \"GY\": {\"path\": \"M271.34,264.25l1.43,0.81l1.44,1.53l0.06,1.19l0.28,0.28l0.84,0.05l2.13,1.92l-0.34,1.93l-1.37,0.59l-0.17,0.34l0.12,0.51l-0.43,1.21l0.03,0.26l1.11,1.82l0.26,0.14l0.56,0.0l0.32,1.29l1.25,1.78l-0.08,0.01l-1.34,-0.21l-0.24,0.06l-0.78,0.64l-1.06,0.41l-0.76,0.1l-0.22,0.15l-0.18,0.32l-0.95,-0.1l-1.38,-1.05l-0.19,-1.13l-0.6,-1.18l0.37,-1.96l0.65,-0.83l0.03,-0.32l-0.57,-1.17l-0.15,-0.14l-0.62,-0.27l0.25,-0.85l-0.08,-0.3l-0.58,-0.58l-0.24,-0.09l-1.15,0.1l-1.41,-1.58l0.48,-0.49l0.09,-0.22l-0.04,-0.92l1.31,-0.34l0.73,-0.52l0.04,-0.44l-0.75,-0.82l0.16,-0.66l1.74,-1.3Z\", \"name\": \"Guyana\"}, \"GE\": {\"path\": \"M525.41,174.19l0.26,-0.88l-0.0,-0.17l-0.63,-2.06l-0.1,-0.15l-1.45,-1.12l-0.11,-0.05l-1.31,-0.33l-0.66,-0.69l1.97,0.48l3.65,0.49l3.3,1.41l0.39,0.5l0.33,0.1l1.43,-0.45l2.14,0.58l0.7,1.14l0.13,0.12l1.06,0.47l-0.18,0.11l-0.08,0.43l1.08,1.41l-0.06,0.06l-1.16,-0.15l-1.82,-0.84l-0.31,0.04l-0.55,0.44l-3.29,0.44l-2.32,-1.41l-0.17,-0.04l-2.25,0.12Z\", \"name\": \"Georgia\"}, \"GB\": {\"path\": \"M412.82,118.6l-2.31,3.4l-0.0,0.33l0.31,0.13l2.52,-0.49l2.34,0.02l-0.56,2.51l-2.22,3.13l0.22,0.47l2.43,0.21l2.35,4.35l0.17,0.14l1.58,0.51l1.49,3.78l0.73,1.37l0.2,0.15l2.76,0.59l-0.25,1.75l-1.18,0.91l-0.08,0.39l0.87,1.49l-1.96,1.51l-3.31,-0.02l-4.15,0.88l-1.07,-0.59l-0.35,0.04l-1.55,1.44l-2.17,-0.35l-0.22,0.05l-1.61,1.15l-0.78,-0.38l3.31,-3.12l2.18,-0.7l0.21,-0.31l-0.26,-0.27l-3.78,-0.54l-0.48,-0.9l2.3,-0.92l0.13,-0.46l-1.29,-1.71l0.39,-1.83l3.46,0.29l0.32,-0.24l0.37,-1.99l-0.06,-0.24l-1.71,-2.17l-0.18,-0.11l-2.91,-0.58l-0.43,-0.68l0.82,-1.4l-0.03,-0.35l-0.82,-0.97l-0.46,0.01l-0.85,1.05l-0.11,-2.6l-0.05,-0.16l-1.19,-1.7l0.86,-3.53l1.81,-2.75l1.88,0.26l2.38,-0.24ZM406.39,132.84l-1.09,1.92l-1.65,-0.62l-1.26,0.02l0.41,-1.46l0.0,-0.16l-0.42,-1.51l1.62,-0.11l2.39,1.92Z\", \"name\": \"United Kingdom\"}, \"GA\": {\"path\": \"M448.76,294.47l-2.38,-2.34l-1.63,-2.04l-1.46,-2.48l0.06,-0.66l0.54,-0.81l0.61,-1.82l0.46,-1.69l0.63,-0.11l3.62,0.03l0.3,-0.3l-0.02,-2.75l0.88,-0.12l1.47,0.32l0.13,0.0l1.39,-0.3l-0.13,0.87l0.03,0.19l0.7,1.29l0.3,0.16l1.74,-0.19l0.36,0.29l-1.01,2.7l0.05,0.29l1.13,1.42l0.25,1.82l-0.3,1.56l-0.64,0.99l-1.93,-0.09l-1.26,-1.13l-0.5,0.17l-0.16,0.91l-1.48,0.27l-0.12,0.05l-0.86,0.63l-0.08,0.39l0.81,1.42l-1.48,1.08Z\", \"name\": \"Gabon\"}, \"GN\": {\"path\": \"M399.83,265.31l-0.69,-0.06l-0.3,0.16l-0.43,0.85l-0.39,-0.01l-0.3,-0.33l0.14,-0.87l-0.05,-0.22l-1.05,-1.54l-0.37,-0.11l-0.61,0.27l-0.84,0.12l0.02,-0.54l-0.04,-0.17l-0.35,-0.57l0.07,-0.63l-0.03,-0.17l-0.57,-1.11l-0.7,-0.9l-0.24,-0.12l-2.0,-0.0l-0.19,0.07l-0.51,0.42l-0.6,0.05l-0.21,0.11l-0.43,0.55l-0.3,0.7l-1.04,0.86l-0.91,-1.24l-1.0,-1.02l-0.69,-0.37l-0.52,-0.42l-0.3,-1.11l-0.37,-0.56l-0.1,-0.1l-0.4,-0.23l0.77,-0.85l0.62,0.04l0.18,-0.05l0.58,-0.38l0.46,-0.0l0.19,-0.07l0.39,-0.34l0.1,-0.3l-0.17,-0.67l0.15,-0.14l0.09,-0.2l0.03,-0.57l0.87,0.02l1.76,0.6l0.13,0.01l0.55,-0.06l0.22,-0.13l0.08,-0.12l1.18,0.17l0.17,-0.02l0.09,0.56l0.3,0.25l0.4,-0.0l0.14,-0.03l0.56,-0.29l0.23,0.05l0.63,0.59l0.15,0.07l1.07,0.2l0.24,-0.06l0.65,-0.52l0.77,-0.32l0.55,-0.32l0.3,0.04l0.44,0.45l0.34,0.74l0.84,0.87l-0.35,0.45l-0.06,0.15l-0.1,0.82l0.42,0.31l0.35,-0.16l0.05,0.04l-0.1,0.59l0.09,0.27l0.42,0.4l-0.06,0.02l-0.18,0.21l-0.2,0.86l0.03,0.21l0.56,1.02l0.52,1.71l-0.65,0.21l-0.15,0.12l-0.24,0.35l-0.03,0.28l0.16,0.41l-0.1,0.76l-0.12,0.0Z\", \"name\": \"Guinea\"}, \"GM\": {\"path\": \"M379.18,251.48l0.15,-0.55l2.51,-0.07l0.21,-0.09l0.48,-0.52l0.58,-0.03l0.91,0.58l0.16,0.05l0.78,0.01l0.14,-0.03l0.59,-0.31l0.16,0.24l-0.71,0.38l-0.94,-0.04l-1.02,-0.51l-0.3,0.01l-0.86,0.55l-0.37,0.02l-0.14,0.04l-0.53,0.31l-1.81,-0.04Z\", \"name\": \"Gambia\"}, \"GL\": {\"path\": \"M304.13,6.6l8.19,-3.63l8.72,0.28l0.19,-0.06l3.12,-2.28l8.75,-0.61l19.94,0.8l14.93,4.75l-3.92,2.01l-9.52,0.27l-13.48,0.6l-0.27,0.2l0.09,0.33l1.26,1.09l0.22,0.07l8.81,-0.67l7.49,2.07l0.19,-0.01l4.68,-1.78l1.76,1.84l-2.59,3.26l-0.01,0.36l0.34,0.11l6.35,-2.2l12.09,-2.32l7.31,1.14l1.17,2.13l-9.9,4.05l-1.43,1.32l-7.91,0.98l-0.26,0.31l0.29,0.29l5.25,0.25l-2.63,3.72l-2.02,3.61l-0.04,0.15l0.08,6.05l0.07,0.19l2.61,3.0l-3.4,0.2l-4.12,1.66l-0.04,0.54l4.5,2.67l0.53,3.9l-2.39,0.42l-0.19,0.48l2.91,3.83l-5.0,0.32l-0.27,0.22l0.12,0.33l2.69,1.84l-0.65,1.35l-3.36,0.71l-3.46,0.01l-0.21,0.51l3.05,3.15l0.02,1.53l-4.54,-1.79l-0.32,0.06l-1.29,1.26l0.11,0.5l3.33,1.15l3.17,2.74l0.85,3.29l-4.0,0.78l-1.83,-1.66l-3.1,-2.64l-0.36,-0.02l-0.13,0.33l0.8,2.92l-2.76,2.26l-0.09,0.33l0.28,0.2l6.59,0.19l2.47,0.18l-5.86,3.38l-6.76,3.43l-7.26,1.48l-2.73,0.02l-0.16,0.05l-2.67,1.72l-3.44,4.42l-5.28,2.86l-1.73,0.18l-3.33,1.01l-3.59,0.96l-0.15,0.1l-2.15,2.52l-0.07,0.19l-0.03,2.76l-1.21,2.49l-4.03,3.1l-0.1,0.33l0.98,2.94l-2.31,6.57l-3.21,0.21l-3.6,-3.0l-0.19,-0.07l-4.9,-0.02l-2.29,-1.97l-1.69,-3.78l-4.31,-4.86l-1.23,-2.52l-0.34,-3.58l-0.08,-0.17l-3.35,-3.67l0.85,-2.92l-0.09,-0.31l-1.5,-1.34l2.33,-4.7l3.67,-1.57l0.15,-0.13l1.02,-1.93l0.52,-3.47l-0.44,-0.31l-2.85,1.57l-1.33,0.64l-2.12,0.59l-2.81,-1.32l-0.15,-2.79l0.88,-2.17l2.09,-0.06l5.07,1.2l0.34,-0.17l-0.11,-0.37l-4.3,-2.9l-2.24,-1.58l-0.25,-0.05l-2.38,0.62l-1.7,-0.93l2.62,-4.1l-0.03,-0.36l-1.51,-1.75l-1.97,-3.3l-3.01,-5.21l-0.1,-0.11l-3.04,-1.85l0.03,-1.94l-0.18,-0.28l-6.82,-3.01l-5.35,-0.38l-6.69,0.21l-6.03,0.37l-2.81,-1.59l-3.84,-2.9l5.94,-1.5l5.01,-0.28l0.28,-0.29l-0.26,-0.31l-10.68,-1.38l-5.38,-2.1l0.27,-1.68l9.3,-2.6l9.18,-2.68l0.19,-0.16l0.97,-2.05l-0.18,-0.42l-6.29,-1.91l1.81,-1.9l8.58,-4.05l3.6,-0.63l0.23,-0.4l-0.92,-2.37l5.59,-1.5l7.66,-0.95l7.58,-0.05l2.65,1.84l0.31,0.02l6.52,-3.29l5.85,2.24l3.55,0.49l5.17,1.95l0.38,-0.16l-0.13,-0.39l-5.77,-3.16l0.29,-2.26Z\", \"name\": \"Greenland\"}, \"KW\": {\"path\": \"M540.87,207.81l0.41,0.94l-0.18,0.51l0.0,0.21l0.65,1.66l-1.15,0.05l-0.54,-1.12l-0.24,-0.17l-1.73,-0.2l1.44,-2.06l1.33,0.18Z\", \"name\": \"Kuwait\"}, \"GH\": {\"path\": \"M423.16,269.88l-3.58,1.34l-1.41,0.87l-2.13,0.69l-1.91,-0.61l0.09,-0.75l-0.03,-0.17l-1.04,-2.07l0.62,-2.7l1.04,-2.08l0.03,-0.19l-1.0,-5.46l0.05,-1.12l4.04,-0.11l1.08,0.18l0.18,-0.03l0.72,-0.36l0.75,0.13l-0.11,0.48l0.06,0.26l0.98,1.22l-0.0,1.77l0.24,1.99l0.05,0.13l0.55,0.81l-0.52,2.14l0.19,1.37l0.69,1.66l0.38,0.62Z\", \"name\": \"Ghana\"}, \"OM\": {\"path\": \"M568.16,231.0l-0.08,0.1l-0.84,1.61l-0.93,-0.11l-0.27,0.11l-0.58,0.73l-0.4,1.32l-0.01,0.14l0.29,1.61l-0.07,0.09l-1.0,-0.01l-0.16,0.04l-1.56,0.97l-0.14,0.2l-0.23,1.17l-0.41,0.4l-1.44,-0.02l-0.17,0.05l-0.98,0.65l-0.13,0.25l0.01,0.87l-0.97,0.57l-1.27,-0.22l-0.19,0.03l-1.63,0.84l-0.88,0.11l-2.55,-5.57l7.2,-2.49l0.19,-0.19l1.67,-5.23l-0.03,-0.25l-1.1,-1.78l0.05,-0.89l0.68,-1.03l0.05,-0.16l0.01,-0.89l0.96,-0.44l0.07,-0.5l-0.32,-0.26l0.16,-1.31l0.85,-0.01l1.03,1.67l0.09,0.09l1.4,0.96l0.11,0.05l1.82,0.34l1.37,0.45l1.75,2.32l0.13,0.1l0.7,0.26l-0.0,0.3l-1.25,2.19l-1.01,0.8ZM561.88,218.47l-0.01,0.02l-0.15,-0.29l0.3,-0.38l-0.14,0.65Z\", \"name\": \"Oman\"}, \"_3\": {\"path\": \"M543.2,261.06l-1.07,1.46l-1.65,1.99l-1.91,0.01l-8.08,-2.95l-0.89,-0.84l-0.9,-1.19l-0.81,-1.23l0.44,-0.73l0.76,-1.12l0.49,0.28l0.52,1.05l1.13,1.06l0.2,0.08l1.24,0.01l2.42,-0.65l2.77,-0.31l2.17,-0.78l1.31,-0.19l0.84,-0.43l1.03,-0.06l-0.01,4.54Z\", \"name\": \"Somaliland\"}, \"_2\": {\"path\": \"M384.23,230.37l0.07,-0.06l0.28,-0.89l0.99,-1.13l0.07,-0.13l0.8,-3.54l3.4,-2.8l0.09,-0.13l0.76,-2.17l0.07,5.5l-2.07,0.21l-0.24,0.17l-0.61,1.36l-0.02,0.16l0.43,3.46l-4.01,-0.01ZM391.82,218.2l0.07,-0.06l0.75,-1.93l1.86,-0.25l0.94,0.34l1.14,0.0l0.18,-0.06l0.73,-0.56l1.41,-0.08l-0.0,2.72l-7.08,-0.12Z\", \"name\": \"Western Sahara\"}, \"_1\": {\"path\": \"M472.71,172.84l-0.07,-0.43l-0.16,-0.22l-0.53,-0.27l-0.38,-0.58l0.3,-0.43l0.51,-0.19l0.18,-0.18l0.3,-0.87l0.12,-0.04l0.22,0.26l0.12,0.09l0.38,0.15l0.28,0.41l0.15,0.12l0.34,0.12l0.43,0.5l0.15,0.07l-0.12,0.3l-0.27,0.32l-0.03,0.18l-0.31,0.06l-1.48,0.47l-0.15,0.17Z\", \"name\": \"Kosovo\"}, \"_0\": {\"path\": \"M503.54,192.92l0.09,-0.17l0.41,0.01l-0.08,0.01l-0.42,0.15ZM504.23,192.76l1.02,0.02l0.4,-0.13l-0.09,0.29l0.03,0.08l-0.35,0.16l-0.24,-0.04l-0.06,-0.1l-0.18,-0.17l-0.19,-0.08l-0.33,-0.02Z\", \"name\": \"Northern Cyprus\"}, \"JO\": {\"path\": \"M510.26,200.93l0.28,-0.57l2.53,1.0l0.27,-0.02l4.57,-2.77l0.84,2.84l-0.28,0.25l-4.95,1.37l-0.14,0.49l2.24,2.48l-0.5,0.28l-0.13,0.14l-0.35,0.78l-1.76,0.35l-0.2,0.14l-0.57,0.94l-0.94,0.73l-2.45,-0.38l-0.03,-0.12l1.23,-4.32l-0.04,-1.1l0.34,-0.75l0.03,-0.12l0.0,-1.63Z\", \"name\": \"Jordan\"}, \"HR\": {\"path\": \"M455.49,162.73l1.53,0.09l0.24,-0.1l0.29,-0.34l0.64,0.38l0.14,0.04l0.98,0.06l0.32,-0.3l-0.01,-0.66l0.67,-0.25l0.19,-0.22l0.21,-1.11l1.72,-0.72l0.65,0.32l1.94,1.37l2.07,0.6l0.22,-0.02l0.67,-0.33l0.47,0.94l0.67,0.76l-0.63,0.77l-0.91,-0.55l-0.16,-0.04l-1.69,0.04l-2.2,-0.51l-1.17,0.07l-0.21,0.11l-0.36,0.42l-0.67,-0.53l-0.46,0.12l-0.52,1.29l0.05,0.31l1.21,1.42l0.58,0.99l1.15,1.14l0.95,0.68l0.92,1.23l0.1,0.09l1.75,0.91l-1.87,-0.89l-1.5,-1.11l-2.23,-0.88l-1.77,-1.9l0.12,-0.06l0.1,-0.47l-1.07,-1.22l-0.04,-0.94l-0.21,-0.27l-1.61,-0.49l-0.35,0.14l-0.53,0.93l-0.41,-0.57l0.04,-0.73Z\", \"name\": \"Croatia\"}, \"HT\": {\"path\": \"M237.82,234.68l1.35,0.1l1.95,0.37l0.18,1.15l-0.16,0.83l-0.51,0.37l-0.06,0.44l0.57,0.68l-0.02,0.22l-1.31,-0.35l-1.26,0.17l-1.49,-0.18l-0.15,0.02l-1.03,0.43l-1.02,-0.61l0.09,-0.36l2.04,0.32l1.9,0.21l0.19,-0.05l0.9,-0.58l0.05,-0.47l-1.05,-1.03l0.02,-0.86l-0.23,-0.3l-1.13,-0.29l0.18,-0.23Z\", \"name\": \"Haiti\"}, \"HU\": {\"path\": \"M461.96,157.92l0.68,-1.66l-0.03,-0.29l-0.15,-0.22l0.84,-0.0l0.3,-0.26l0.12,-0.84l0.88,0.57l0.98,0.38l0.16,0.01l2.1,-0.39l0.23,-0.21l0.14,-0.45l0.88,-0.1l1.06,-0.43l0.13,0.1l0.28,0.04l1.18,-0.4l0.14,-0.1l0.52,-0.67l0.63,-0.15l2.6,0.95l0.26,-0.03l0.38,-0.23l1.12,0.7l0.1,0.49l-1.31,0.57l-0.14,0.13l-1.18,2.14l-1.44,2.04l-1.85,0.55l-1.51,-0.13l-0.14,0.02l-1.92,0.82l-0.85,0.42l-1.91,-0.55l-1.83,-1.31l-0.74,-0.37l-0.44,-0.97l-0.26,-0.18Z\", \"name\": \"Hungary\"}, \"HN\": {\"path\": \"M202.48,251.87l-0.33,-0.62l-0.18,-0.14l-0.5,-0.15l0.13,-0.76l-0.11,-0.28l-0.34,-0.28l-0.6,-0.23l-0.18,-0.01l-0.81,0.22l-0.16,-0.24l-0.72,-0.39l-0.51,-0.48l-0.12,-0.07l-0.31,-0.09l0.24,-0.3l0.04,-0.3l-0.16,-0.4l0.1,-0.28l1.14,-0.69l1.0,-0.86l0.09,0.04l0.3,-0.05l0.47,-0.39l0.49,-0.03l0.14,0.13l0.29,0.06l0.31,-0.1l1.16,0.22l1.24,-0.08l0.81,-0.28l0.29,-0.25l0.63,0.1l0.69,0.18l0.65,-0.06l0.49,-0.2l1.04,0.32l0.38,0.06l0.7,0.44l0.71,0.56l0.92,0.41l0.1,0.11l-0.11,-0.01l-0.23,0.09l-0.3,0.3l-0.76,0.29l-0.58,0.0l-0.15,0.04l-0.45,0.26l-0.31,-0.07l-0.37,-0.34l-0.28,-0.07l-0.26,0.07l-0.18,0.15l-0.23,0.43l-0.04,-0.0l-0.33,0.28l-0.03,0.4l-0.76,0.61l-0.45,0.3l-0.15,0.16l-0.51,-0.36l-0.41,0.06l-0.45,0.56l-0.41,-0.01l-0.59,0.06l-0.27,0.31l0.04,0.96l-0.07,0.0l-0.25,0.16l-0.24,0.45l-0.42,0.06Z\", \"name\": \"Honduras\"}, \"PR\": {\"path\": \"M254.95,238.31l1.15,0.21l0.2,0.23l-0.36,0.36l-1.76,-0.01l-1.2,0.07l-0.09,-0.69l0.17,-0.18l1.89,0.01Z\", \"name\": \"Puerto Rico\"}, \"PS\": {\"path\": \"M509.66,201.06l-0.0,1.44l-0.29,0.63l-0.59,0.19l0.02,-0.11l0.52,-0.31l-0.02,-0.53l-0.41,-0.2l0.36,-1.28l0.41,0.17Z\", \"name\": \"West Bank\"}, \"PT\": {\"path\": \"M398.65,173.6l0.75,-0.63l0.7,-0.3l0.51,1.2l0.28,0.18l1.48,-0.0l0.2,-0.08l0.33,-0.3l1.16,0.08l0.52,1.11l-0.95,0.66l-0.13,0.24l-0.03,2.2l-0.33,0.35l-0.08,0.18l-0.08,1.17l-0.86,0.19l-0.2,0.44l0.93,1.64l-0.64,1.79l0.07,0.31l0.72,0.72l-0.24,0.56l-0.9,1.05l-0.07,0.26l0.17,0.77l-0.73,0.54l-1.18,-0.36l-0.16,-0.0l-0.85,0.21l0.31,-1.81l-0.23,-1.87l-0.23,-0.25l-0.99,-0.24l-0.49,-0.91l0.18,-1.72l0.93,-0.99l0.08,-0.16l0.17,-1.17l0.52,-1.76l-0.04,-1.36l-0.51,-1.14l-0.09,-0.8Z\", \"name\": \"Portugal\"}, \"PY\": {\"path\": \"M264.33,341.43l0.93,-2.96l0.07,-1.42l1.1,-2.1l4.19,-0.73l2.22,0.04l2.12,1.21l0.07,0.76l0.7,1.38l-0.16,3.48l0.24,0.31l2.64,0.5l0.19,-0.03l0.9,-0.45l1.47,0.62l0.38,0.64l0.23,2.35l0.3,1.07l0.25,0.21l0.93,0.12l0.16,-0.02l0.8,-0.37l0.61,0.33l-0.0,1.25l-0.33,1.53l-0.5,1.57l-0.39,2.26l-2.14,1.94l-1.85,0.4l-2.74,-0.4l-2.13,-0.62l2.26,-3.75l0.03,-0.24l-0.36,-1.18l-0.17,-0.19l-2.55,-1.03l-3.04,-1.95l-2.07,-0.43l-4.4,-4.12Z\", \"name\": \"Paraguay\"}, \"PA\": {\"path\": \"M213.65,263.79l0.18,-0.43l0.02,-0.18l-0.06,-0.28l0.23,-0.18l-0.01,-0.48l-0.4,-0.29l-0.01,-0.62l0.57,-0.13l0.68,0.69l-0.04,0.39l0.26,0.33l1.0,0.11l0.27,-0.1l0.49,0.44l0.24,0.07l1.34,-0.22l1.04,-0.62l1.49,-0.5l0.86,-0.73l0.99,0.11l0.18,0.28l1.35,0.08l1.02,0.4l0.78,0.72l0.71,0.53l-0.1,0.12l-0.05,0.3l0.53,1.34l-0.28,0.44l-0.6,-0.13l-0.36,0.22l-0.2,0.76l-0.41,-0.36l-0.44,-1.12l0.49,-0.53l-0.14,-0.49l-0.51,-0.14l-0.41,-0.72l-0.11,-0.11l-1.25,-0.7l-0.19,-0.04l-1.1,0.16l-0.22,0.15l-0.47,0.81l-0.9,0.56l-0.49,0.08l-0.22,0.17l-0.25,0.52l0.05,0.32l0.93,1.07l-0.41,0.21l-0.29,0.3l-0.81,0.09l-0.36,-1.26l-0.53,-0.1l-0.21,0.28l-0.5,-0.09l-0.44,-0.88l-0.22,-0.16l-0.99,-0.16l-0.61,-0.28l-0.13,-0.03l-1.0,0.0Z\", \"name\": \"Panama\"}, \"PG\": {\"path\": \"M808.4,298.6l0.62,0.46l1.19,1.56l1.04,0.77l-0.18,0.37l-0.42,0.15l-0.92,-0.82l-1.05,-1.53l-0.27,-0.96ZM804.09,296.06l-0.3,0.26l-0.36,-1.11l-0.66,-1.06l-2.55,-1.89l-1.42,-0.59l0.17,-0.15l1.16,0.6l0.85,0.55l1.01,0.58l0.97,1.02l0.9,0.76l0.24,1.03ZM796.71,297.99l0.15,0.82l0.34,0.24l1.43,-0.19l0.19,-0.11l0.68,-0.82l1.36,-0.87l0.13,-0.31l-0.21,-1.13l1.04,-0.03l0.3,0.25l-0.04,1.17l-0.74,1.34l-1.17,0.18l-0.22,0.15l-0.35,0.62l-2.51,1.13l-1.21,-0.0l-1.99,-0.71l-1.19,-0.58l0.07,-0.28l1.98,0.32l1.46,-0.2l0.24,-0.21l0.25,-0.79ZM789.24,303.52l0.11,0.15l2.19,1.62l1.6,2.62l0.27,0.14l1.09,-0.06l-0.07,0.77l0.23,0.32l1.23,0.27l-0.14,0.09l0.05,0.53l2.39,0.95l-0.11,0.28l-1.33,0.14l-0.51,-0.55l-0.18,-0.09l-4.59,-0.65l-1.87,-1.55l-1.38,-1.35l-1.28,-2.17l-0.16,-0.13l-3.27,-1.1l-0.19,0.0l-2.12,0.72l-1.58,0.85l-0.15,0.31l0.28,1.63l-1.65,0.73l-1.37,-0.4l-2.3,-0.09l-0.08,-15.65l3.95,1.57l4.58,1.42l1.67,1.25l1.32,1.19l0.36,1.39l0.19,0.21l4.06,1.51l0.39,0.85l-1.9,0.22l-0.25,0.39l0.55,1.68Z\", \"name\": \"Papua New Guinea\"}, \"PE\": {\"path\": \"M246.44,329.21l-0.63,1.25l-1.05,0.54l-2.25,-1.33l-0.19,-0.93l-0.16,-0.21l-4.95,-2.58l-4.46,-2.79l-1.87,-1.52l-0.94,-1.91l0.33,-0.6l-0.01,-0.31l-2.11,-3.33l-2.46,-4.66l-2.36,-5.02l-1.04,-1.18l-0.77,-1.81l-0.08,-0.11l-1.95,-1.64l-1.54,-0.88l0.61,-0.85l0.02,-0.31l-1.15,-2.27l0.69,-1.56l1.59,-1.26l0.12,0.42l-0.56,0.47l-0.11,0.25l0.07,0.92l0.36,0.27l0.97,-0.19l0.85,0.23l0.99,1.19l0.41,0.05l1.42,-1.03l0.11,-0.16l0.46,-1.64l1.45,-2.06l2.92,-0.96l0.11,-0.07l2.73,-2.62l0.84,-1.72l0.02,-0.18l-0.3,-1.65l0.28,-0.1l1.49,1.06l0.77,1.14l0.1,0.09l1.08,0.6l1.43,2.55l0.21,0.15l1.86,0.31l0.18,-0.03l1.25,-0.6l0.77,0.37l0.17,0.03l1.4,-0.2l1.57,0.96l-1.45,2.29l0.23,0.46l0.63,0.05l0.66,0.7l-1.51,-0.08l-0.24,0.1l-0.27,0.31l-1.96,0.46l-2.95,1.74l-0.14,0.21l-0.17,1.1l-0.6,0.82l-0.05,0.23l0.21,1.13l-1.31,0.63l-0.17,0.27l0.0,0.91l-0.53,0.37l-0.1,0.37l1.04,2.27l1.31,1.46l-0.44,0.9l0.24,0.43l1.52,0.13l0.87,1.23l0.24,0.13l2.21,0.07l0.18,-0.06l1.55,-1.13l-0.14,3.22l0.23,0.3l1.14,0.29l0.16,-0.0l1.18,-0.36l1.97,3.71l-0.45,0.71l-0.04,0.14l-0.12,1.8l-0.05,2.07l-0.92,1.2l-0.03,0.31l0.38,0.8l-0.48,0.72l-0.02,0.3l1.01,2.02l-1.5,2.64Z\", \"name\": \"Peru\"}, \"PK\": {\"path\": \"M609.08,187.76l1.66,1.21l0.71,2.11l0.2,0.19l3.62,1.01l-1.98,1.95l-2.65,0.4l-3.75,-0.68l-0.26,0.08l-1.23,1.22l-0.07,0.31l0.89,2.46l0.88,1.92l0.1,0.12l1.67,1.14l-1.8,1.35l-0.12,0.25l0.04,1.85l-2.35,2.67l-1.59,2.79l-2.5,2.72l-2.76,-0.2l-0.24,0.09l-2.76,2.83l0.04,0.45l1.54,1.13l0.27,1.94l0.09,0.17l1.34,1.29l0.4,1.83l-5.14,-0.01l-0.22,0.09l-1.53,1.63l-1.52,-0.56l-0.76,-1.88l-1.93,-2.03l-0.25,-0.09l-4.6,0.5l-4.05,0.05l-3.1,0.33l0.77,-2.53l3.48,-1.33l0.19,-0.33l-0.21,-1.24l-0.19,-0.23l-1.01,-0.37l-0.06,-2.18l-0.17,-0.26l-2.32,-1.16l-0.96,-1.57l-0.56,-0.65l3.16,1.05l0.14,0.01l2.45,-0.4l1.44,0.33l0.3,-0.1l0.4,-0.47l1.58,0.22l0.14,-0.01l3.25,-1.14l0.2,-0.27l0.08,-2.23l1.23,-1.38l1.73,0.0l0.28,-0.2l0.22,-0.61l1.68,-0.32l0.86,0.24l0.27,-0.05l0.98,-0.78l0.11,-0.26l-0.13,-1.57l0.96,-1.52l1.51,-0.67l0.14,-0.41l-0.74,-1.4l1.86,0.07l0.26,-0.13l0.69,-1.01l0.05,-0.2l-0.09,-0.94l1.14,-1.09l0.09,-0.28l-0.29,-1.41l-0.51,-1.07l1.23,-1.05l2.6,-0.58l2.86,-0.33l1.33,-0.54l1.3,-0.29Z\", \"name\": \"Pakistan\"}, \"PH\": {\"path\": \"M737.11,263.82l0.25,1.66l0.14,1.34l-0.54,1.46l-0.64,-1.79l-0.5,-0.1l-1.17,1.28l-0.05,0.32l0.74,1.71l-0.49,0.81l-2.6,-1.28l-0.61,-1.57l0.68,-1.07l-0.07,-0.4l-1.59,-1.19l-0.42,0.06l-0.69,0.91l-1.01,-0.08l-0.21,0.06l-1.58,1.2l-0.17,-0.3l0.87,-1.88l1.48,-0.66l1.18,-0.81l0.71,0.92l0.34,0.1l1.9,-0.69l0.18,-0.18l0.34,-0.94l1.57,-0.06l0.29,-0.32l-0.1,-1.38l1.41,0.83l0.36,2.06ZM734.94,254.42l0.56,2.24l-1.41,-0.49l-0.4,0.3l0.07,0.94l0.51,1.3l-0.54,0.26l-0.08,-1.34l-0.25,-0.28l-0.56,-0.1l-0.23,-0.91l1.03,0.14l0.34,-0.31l-0.03,-0.96l-0.06,-0.18l-1.14,-1.44l1.62,0.04l0.57,0.78ZM724.68,238.33l1.48,0.71l0.33,-0.04l0.44,-0.38l0.05,0.13l-0.37,0.97l0.01,0.23l0.81,1.75l-0.59,1.92l-1.37,0.79l-0.14,0.2l-0.39,2.07l0.01,0.14l0.56,2.04l0.23,0.21l1.33,0.28l0.14,-0.0l1.0,-0.27l2.82,1.28l-0.2,1.16l0.12,0.29l0.66,0.5l-0.13,0.56l-1.54,-0.99l-0.89,-1.29l-0.49,0.0l-0.44,0.65l-1.34,-1.28l-0.26,-0.08l-2.18,0.36l-0.96,-0.44l0.09,-0.72l0.69,-0.57l-0.01,-0.47l-0.75,-0.59l-0.47,0.14l-0.15,0.43l-0.86,-1.02l-0.34,-1.02l-0.07,-1.74l0.49,0.41l0.49,-0.21l0.26,-3.99l0.73,-2.1l1.23,0.0ZM731.12,258.92l-0.82,0.75l-0.83,1.64l-0.52,0.5l-1.17,-1.33l0.36,-0.47l0.62,-0.7l0.07,-0.15l0.24,-1.35l0.73,-0.08l-0.31,1.29l0.16,0.34l0.37,-0.09l1.21,-1.6l-0.12,1.24ZM726.66,255.58l0.85,0.45l0.14,0.03l1.28,-0.0l-0.03,0.62l-1.04,0.96l-1.15,0.55l-0.05,-0.71l0.17,-1.26l-0.01,-0.13l-0.16,-0.51ZM724.92,252.06l-0.45,1.5l-0.7,-0.83l-0.95,-1.43l1.44,0.06l0.67,0.7ZM717.48,261.28l-1.87,1.35l0.21,-0.3l1.81,-1.57l1.5,-1.75l0.97,-1.84l0.23,1.08l-1.56,1.33l-1.29,1.7Z\", \"name\": \"Philippines\"}, \"PL\": {\"path\": \"M458.8,144.25l-0.96,-1.98l0.18,-1.06l-0.01,-0.15l-0.62,-1.8l-0.82,-1.11l0.56,-0.73l0.05,-0.28l-0.51,-1.51l1.48,-0.87l3.88,-1.58l3.06,-1.14l2.23,0.52l0.15,0.66l0.29,0.23l2.4,0.04l3.11,0.39l4.56,-0.05l1.12,0.32l0.51,0.89l0.1,1.45l0.03,0.12l0.66,1.23l-0.01,1.08l-1.33,0.61l-0.14,0.41l0.74,1.5l0.07,1.53l1.22,2.79l-0.19,0.66l-1.09,0.33l-0.14,0.09l-2.27,2.72l-0.04,0.31l0.35,0.8l-2.22,-1.16l-0.21,-0.02l-1.72,0.44l-1.1,-0.31l-0.21,0.02l-1.3,0.61l-1.11,-1.02l-0.32,-0.05l-0.81,0.35l-1.15,-1.61l-0.21,-0.12l-1.65,-0.17l-0.19,-0.82l-0.23,-0.23l-1.72,-0.37l-0.34,0.17l-0.25,0.56l-0.88,-0.44l0.12,-0.69l-0.25,-0.35l-1.78,-0.27l-1.08,-0.97Z\", \"name\": \"Poland\"}, \"ZM\": {\"path\": \"M502.81,308.32l1.09,1.04l0.58,1.94l-0.39,0.66l-0.5,2.05l-0.0,0.14l0.45,1.95l-0.69,0.77l-0.06,0.11l-0.76,2.37l0.15,0.36l0.62,0.31l-6.85,1.9l-0.22,0.33l0.2,1.54l-1.62,0.3l-0.12,0.05l-1.43,1.02l-0.11,0.15l-0.25,0.73l-0.73,0.17l-0.14,0.08l-2.18,2.12l-1.33,1.6l-0.65,0.05l-0.83,-0.29l-2.75,-0.28l-0.24,-0.1l-0.15,-0.27l-0.99,-0.58l-0.12,-0.04l-1.73,-0.14l-1.88,0.54l-1.5,-1.48l-1.61,-2.01l0.11,-7.73l4.92,0.03l0.29,-0.37l-0.19,-0.79l0.34,-0.86l0.0,-0.21l-0.41,-1.11l0.26,-1.14l-0.01,-0.16l-0.12,-0.36l0.18,0.01l0.1,0.56l0.31,0.25l1.14,-0.06l1.44,0.21l0.76,1.05l0.19,0.12l2.01,0.35l0.19,-0.03l1.24,-0.65l0.44,1.03l0.22,0.18l1.81,0.34l0.85,0.99l1.02,1.39l0.24,0.12l1.92,0.02l0.3,-0.32l-0.21,-2.74l-0.47,-0.23l-0.53,0.36l-1.58,-0.89l-0.51,-0.34l0.29,-2.36l0.44,-2.99l-0.03,-0.18l-0.5,-0.99l0.61,-1.38l0.53,-0.24l3.26,-0.41l0.89,0.23l1.01,0.62l1.04,0.44l1.6,0.43l1.35,0.72Z\", \"name\": \"Zambia\"}, \"EE\": {\"path\": \"M482.19,120.88l0.23,-1.68l-0.43,-0.31l-0.75,0.37l-1.34,-1.1l-0.18,-1.75l2.92,-0.95l3.07,-0.53l2.66,0.6l2.48,-0.1l0.18,0.31l-1.65,1.96l-0.06,0.26l0.71,3.25l-0.88,0.94l-1.85,-0.01l-2.08,-1.3l-1.14,-0.47l-0.2,-0.01l-1.69,0.51Z\", \"name\": \"Estonia\"}, \"EG\": {\"path\": \"M508.07,208.8l-0.66,1.06l-0.53,2.03l-0.64,1.32l-0.32,0.26l-1.74,-1.85l-1.77,-3.86l-0.48,-0.09l-0.26,0.25l-0.07,0.32l1.04,2.88l1.55,2.76l1.89,4.18l0.94,1.48l0.83,1.54l2.08,2.73l-0.3,0.28l-0.1,0.23l0.08,1.72l0.11,0.22l2.91,2.37l-28.78,0.0l0.0,-19.06l-0.73,-2.2l0.61,-1.59l0.0,-0.2l-0.34,-1.04l0.73,-1.08l3.13,-0.04l2.36,0.72l2.48,0.81l1.15,0.43l0.23,-0.01l1.93,-0.87l1.02,-0.78l2.08,-0.21l1.59,0.31l0.62,1.24l0.52,0.03l0.46,-0.71l1.86,0.59l1.95,0.16l0.17,-0.04l0.92,-0.52l1.48,4.24Z\", \"name\": \"Egypt\"}, \"ZA\": {\"path\": \"M467.06,373.27l-0.13,-0.29l0.01,-1.58l-0.02,-0.12l-0.71,-1.64l0.59,-0.37l0.14,-0.26l-0.07,-2.13l-0.05,-0.15l-1.63,-2.58l-1.25,-2.31l-1.71,-3.37l0.88,-0.98l0.7,0.52l0.39,1.08l0.23,0.19l1.1,0.19l1.55,0.51l0.14,0.01l1.35,-0.2l0.11,-0.04l2.24,-1.39l0.14,-0.25l0.0,-9.4l0.16,0.09l1.39,2.38l-0.22,1.53l0.04,0.19l0.56,0.94l0.3,0.14l1.79,-0.27l0.16,-0.08l1.23,-1.18l1.17,-0.79l0.1,-0.12l0.57,-1.19l1.02,-0.52l0.9,0.28l1.16,0.73l0.14,0.05l2.04,0.13l0.13,-0.02l1.6,-0.62l0.18,-0.19l0.63,-1.93l1.18,-0.19l0.19,-0.12l0.78,-1.05l0.81,-1.71l2.18,-1.91l3.44,-1.88l0.89,0.02l1.17,0.43l0.21,-0.0l0.76,-0.29l1.07,0.21l1.15,3.55l0.63,1.82l-0.44,2.9l0.1,0.52l-0.74,-0.29l-0.18,-0.01l-0.72,0.19l-0.21,0.2l-0.22,0.74l-0.66,0.97l-0.05,0.18l0.02,0.93l0.09,0.21l1.49,1.46l0.27,0.08l1.47,-0.29l0.22,-0.18l0.43,-1.01l1.29,0.02l-0.51,1.63l-0.29,2.2l-0.59,1.12l-2.2,1.78l-1.06,1.39l-0.72,1.44l-1.39,1.93l-2.81,2.84l-1.75,1.65l-1.85,1.24l-2.55,1.06l-1.23,0.14l-0.24,0.18l-0.22,0.54l-1.27,-0.35l-0.2,0.01l-1.15,0.5l-2.62,-0.52l-0.12,0.0l-1.46,0.33l-0.98,-0.14l-0.16,0.02l-2.55,1.1l-2.11,0.44l-1.59,1.07l-0.93,0.06l-0.97,-0.92l-0.19,-0.08l-0.72,-0.04l-1.0,-1.16l-0.25,0.05ZM493.72,359.24l-1.12,-0.86l-0.31,-0.03l-1.23,0.59l-1.36,1.07l-1.39,1.78l0.01,0.38l1.88,2.11l0.31,0.09l0.9,-0.27l0.18,-0.15l0.4,-0.77l1.28,-0.39l0.18,-0.16l0.42,-0.88l0.76,-1.32l-0.05,-0.37l-0.87,-0.82Z\", \"name\": \"South Africa\"}, \"EC\": {\"path\": \"M220.2,293.48l1.25,-1.76l0.02,-0.31l-0.54,-1.09l-0.5,-0.06l-0.78,0.94l-1.03,-0.75l0.33,-0.46l0.05,-0.23l-0.38,-2.04l0.66,-0.28l0.17,-0.19l0.45,-1.52l0.93,-1.58l0.04,-0.2l-0.13,-0.78l1.19,-0.47l1.57,-0.91l2.35,1.34l0.17,0.04l0.28,-0.02l0.52,0.91l0.21,0.15l2.12,0.35l0.2,-0.03l0.55,-0.31l1.08,0.73l0.97,0.54l0.31,1.67l-0.71,1.49l-2.64,2.54l-2.95,0.97l-0.15,0.11l-1.53,2.18l-0.49,1.68l-1.1,0.8l-0.87,-1.05l-0.15,-0.1l-1.01,-0.27l-0.13,-0.0l-0.7,0.14l-0.03,-0.43l0.6,-0.5l0.1,-0.31l-0.26,-0.91Z\", \"name\": \"Ecuador\"}, \"AL\": {\"path\": \"M470.27,171.7l0.38,0.19l0.45,-0.18l0.4,0.61l0.11,0.1l0.46,0.24l0.13,0.87l-0.3,0.95l-0.0,0.17l0.36,1.28l0.12,0.17l0.9,0.63l-0.03,0.44l-0.67,0.35l-0.16,0.22l-0.14,0.88l-0.96,1.18l-0.06,-0.03l-0.04,-0.48l-0.12,-0.22l-1.28,-0.92l-0.19,-1.25l0.2,-1.96l0.33,-0.89l-0.06,-0.3l-0.36,-0.41l-0.13,-0.75l0.66,-0.9Z\", \"name\": \"Albania\"}, \"AO\": {\"path\": \"M461.62,299.93l0.55,1.67l0.73,1.54l1.56,2.18l0.28,0.12l1.66,-0.2l0.81,-0.34l1.28,0.33l0.33,-0.14l0.39,-0.67l0.56,-1.3l1.37,-0.09l0.27,-0.21l0.07,-0.23l0.67,-0.01l-0.13,0.53l0.29,0.37l2.74,-0.02l0.04,1.29l0.03,0.13l0.46,0.87l-0.35,1.52l0.18,1.55l0.07,0.16l0.75,0.85l-0.13,2.89l0.41,0.29l0.56,-0.21l1.11,0.05l1.5,-0.37l0.9,0.12l0.18,0.53l-0.27,1.15l0.01,0.17l0.4,1.08l-0.33,0.85l-0.01,0.18l0.12,0.51l-4.83,-0.03l-0.3,0.3l-0.12,8.13l0.07,0.19l1.69,2.1l1.27,1.25l-4.03,0.92l-5.93,-0.36l-1.66,-1.19l-0.18,-0.06l-10.15,0.11l-0.34,0.13l-1.35,-1.05l-0.17,-0.06l-1.62,-0.08l-1.6,0.45l-0.88,0.36l-0.17,-1.2l0.34,-2.19l0.85,-2.32l0.14,-1.13l0.79,-2.24l0.57,-1.0l1.42,-1.64l0.82,-1.15l0.05,-0.13l0.26,-1.88l-0.13,-1.51l-0.07,-0.16l-0.72,-0.87l-1.23,-2.91l0.09,-0.37l0.73,-0.95l0.05,-0.27l-1.27,-4.12l-1.19,-1.54l0.1,-0.2l0.86,-0.28l0.78,0.03l0.83,-0.29l7.12,0.03ZM451.81,298.94l-0.17,0.07l-0.5,-1.42l0.85,-0.92l0.53,-0.29l0.48,0.44l-0.56,0.32l-0.1,0.1l-0.41,0.65l-0.05,0.14l-0.07,0.91Z\", \"name\": \"Angola\"}, \"KZ\": {\"path\": \"M598.42,172.08l-1.37,0.54l-3.3,2.09l-0.11,0.12l-1.01,1.97l-0.56,0.01l-0.6,-1.24l-0.26,-0.17l-2.95,-0.09l-0.46,-2.22l-0.29,-0.24l-0.91,-0.02l0.17,-2.72l-0.12,-0.26l-3.0,-2.22l-0.2,-0.06l-4.29,0.24l-2.8,0.42l-2.36,-2.7l-6.4,-3.65l-0.23,-0.03l-6.45,1.83l-0.22,0.29l0.1,10.94l-0.84,0.1l-1.65,-2.21l-0.11,-0.09l-1.69,-0.84l-0.2,-0.02l-2.84,0.63l-0.14,0.07l-0.71,0.64l-0.02,-0.11l0.57,-1.17l0.0,-0.26l-0.48,-1.05l-0.17,-0.16l-2.78,-0.99l-1.08,-2.62l-0.13,-0.15l-1.24,-0.7l-0.04,-0.48l2.07,0.25l0.34,-0.29l0.09,-2.03l1.84,-0.44l2.12,0.45l0.36,-0.25l0.45,-3.04l-0.45,-2.06l-0.31,-0.23l-2.44,0.15l-2.07,-0.75l-0.23,0.01l-2.88,1.38l-2.21,0.62l-0.96,-0.38l0.22,-1.39l-0.06,-0.23l-1.6,-2.12l-0.25,-0.12l-1.72,0.08l-1.87,-1.91l1.33,-2.24l-0.06,-0.38l-0.55,-0.5l1.72,-3.08l2.3,1.7l0.48,-0.2l0.29,-2.26l4.99,-3.48l3.76,-0.08l5.46,2.27l2.96,1.33l0.26,-0.01l2.59,-1.36l3.82,-0.06l3.13,1.67l0.38,-0.09l0.63,-0.85l3.36,0.14l0.29,-0.19l0.63,-1.57l-0.13,-0.37l-3.64,-2.05l2.0,-1.36l0.1,-0.38l-0.32,-0.62l2.09,-0.76l0.13,-0.47l-1.65,-2.13l0.89,-0.91l9.27,-1.18l0.13,-0.05l1.17,-0.82l6.2,-1.27l2.26,-1.43l4.19,0.7l0.74,3.39l0.38,0.22l2.52,-0.81l2.9,1.06l-0.18,1.63l0.32,0.33l2.52,-0.23l5.0,-2.58l0.03,0.39l3.16,2.62l5.57,8.48l0.49,0.02l1.18,-1.53l3.22,1.78l0.21,0.03l3.5,-0.83l1.21,0.52l1.16,1.82l0.15,0.12l1.67,0.61l1.01,1.32l0.28,0.11l3.04,-0.41l1.1,1.64l-1.68,1.89l-1.97,0.28l-0.26,0.29l-0.12,3.09l-1.2,1.23l-4.81,-1.01l-0.35,0.2l-1.77,5.51l-1.14,0.62l-4.92,1.23l-0.2,0.41l2.14,5.06l-1.45,0.67l-0.17,0.31l0.15,1.28l-1.05,-0.3l-1.21,-1.04l-0.17,-0.07l-3.73,-0.32l-4.15,-0.08l-0.92,0.31l-3.46,-1.24l-0.22,0.01l-1.42,0.63l-0.17,0.21l-0.32,1.49l-3.82,-0.97l-0.15,0.0l-1.65,0.43l-0.2,0.17l-0.51,1.21Z\", \"name\": \"Kazakhstan\"}, \"ET\": {\"path\": \"M516.0,247.63l1.21,0.92l0.3,0.04l1.3,-0.53l0.46,0.41l0.19,0.08l1.65,0.03l2.05,0.96l0.67,0.88l1.07,0.79l1.0,1.45l0.7,0.68l-0.72,0.92l-0.85,1.19l-0.04,0.25l0.19,0.67l0.04,0.74l0.29,0.28l1.4,0.04l0.55,-0.15l0.23,0.19l-0.41,0.67l0.01,0.32l0.92,1.39l0.93,1.23l0.99,0.94l0.1,0.06l8.19,2.99l1.51,0.01l-6.51,6.95l-3.14,0.11l-0.18,0.06l-2.15,1.71l-1.51,0.04l-0.22,0.1l-0.6,0.69l-1.46,-0.0l-0.93,-0.78l-0.32,-0.04l-2.29,1.05l-0.12,0.1l-0.64,0.9l-1.44,-0.17l-0.51,-0.26l-0.17,-0.03l-0.56,0.07l-0.68,-0.02l-3.1,-2.08l-0.17,-0.05l-1.62,0.0l-0.68,-0.65l0.0,-1.28l-0.21,-0.29l-1.19,-0.38l-1.42,-2.63l-0.13,-0.12l-1.05,-0.53l-0.46,-1.0l-1.27,-1.23l-0.17,-0.08l-1.08,-0.13l0.53,-0.9l1.17,-0.05l0.26,-0.17l0.37,-0.77l0.03,-0.14l-0.03,-2.23l0.7,-2.49l1.08,-0.65l0.14,-0.19l0.24,-1.0l1.03,-1.85l1.47,-1.22l0.09,-0.12l1.02,-2.51l0.36,-1.96l2.62,0.48l0.33,-0.18l0.63,-1.55Z\", \"name\": \"Ethiopia\"}, \"ZW\": {\"path\": \"M498.95,341.2l-1.16,-0.23l-0.16,0.01l-0.74,0.28l-1.11,-0.41l-1.02,-0.04l-1.52,-1.13l-0.12,-0.05l-1.79,-0.37l-0.65,-1.46l-0.01,-0.86l-0.22,-0.29l-0.99,-0.26l-2.74,-2.77l-0.77,-1.46l-0.52,-0.5l-0.72,-1.54l2.24,0.23l0.78,0.28l0.12,0.02l0.85,-0.06l0.21,-0.11l1.38,-1.66l2.11,-2.05l0.81,-0.18l0.22,-0.2l0.27,-0.8l1.29,-0.93l1.53,-0.28l0.11,0.66l0.3,0.25l2.02,-0.05l1.04,0.48l0.5,0.59l0.18,0.1l1.13,0.18l1.11,0.7l0.01,3.06l-0.49,1.82l-0.11,1.94l0.03,0.16l0.35,0.68l-0.24,1.3l-0.27,0.17l-0.12,0.15l-0.64,1.83l-2.49,2.8Z\", \"name\": \"Zimbabwe\"}, \"ES\": {\"path\": \"M398.67,172.8l0.09,-1.45l-0.06,-0.2l-0.82,-1.05l3.16,-1.96l3.01,0.54l3.33,-0.02l2.64,0.52l2.14,-0.15l3.9,0.1l0.91,1.08l0.14,0.09l4.61,1.38l0.26,-0.04l0.77,-0.55l2.66,1.29l0.17,0.03l2.59,-0.35l0.1,1.28l-2.2,1.85l-3.13,0.62l-0.23,0.23l-0.21,0.92l-1.54,1.68l-0.97,2.4l0.02,0.26l0.85,1.46l-1.27,1.14l-0.09,0.14l-0.5,1.73l-1.73,0.53l-0.15,0.1l-1.68,2.1l-3.03,0.04l-2.38,-0.05l-0.17,0.05l-1.57,1.01l-0.9,1.01l-0.96,-0.19l-0.82,-0.86l-0.69,-1.6l-0.22,-0.18l-2.14,-0.41l-0.13,-0.62l0.83,-0.97l0.39,-0.86l-0.06,-0.33l-0.73,-0.73l0.63,-1.74l-0.02,-0.25l-0.8,-1.41l0.69,-0.15l0.23,-0.27l0.09,-1.29l0.33,-0.36l0.08,-0.2l0.03,-2.16l1.03,-0.72l0.1,-0.37l-0.7,-1.5l-0.25,-0.17l-1.46,-0.11l-0.22,0.07l-0.34,0.3l-1.17,0.0l-0.55,-1.29l-0.39,-0.16l-1.02,0.44l-0.45,0.36Z\", \"name\": \"Spain\"}, \"ER\": {\"path\": \"M527.15,253.05l-0.77,-0.74l-1.01,-1.47l-1.14,-0.86l-0.62,-0.84l-0.11,-0.09l-2.18,-1.02l-0.12,-0.03l-1.61,-0.03l-0.52,-0.46l-0.31,-0.05l-1.31,0.54l-1.38,-1.06l-0.46,0.12l-0.69,1.68l-2.49,-0.46l-0.2,-0.76l1.06,-3.69l0.24,-1.65l0.66,-0.66l1.76,-0.4l0.16,-0.1l0.97,-1.13l1.24,2.55l0.68,2.34l0.09,0.14l1.4,1.27l3.39,2.4l1.37,1.43l2.14,2.34l0.94,0.6l-0.32,0.26l-0.85,-0.17Z\", \"name\": \"Eritrea\"}, \"ME\": {\"path\": \"M469.05,172.9l-0.57,-0.8l-0.1,-0.09l-0.82,-0.46l0.16,-0.33l0.35,-1.57l0.72,-0.62l0.27,-0.16l0.48,0.38l0.35,0.4l0.12,0.08l0.79,0.32l0.66,0.43l-0.43,0.62l-0.28,0.11l-0.07,-0.25l-0.53,-0.1l-1.09,1.49l-0.05,0.23l0.06,0.32Z\", \"name\": \"Montenegro\"}, \"MD\": {\"path\": \"M488.2,153.75l0.14,-0.11l1.49,-0.28l1.75,0.95l1.06,0.14l0.92,0.7l-0.15,0.9l0.15,0.31l0.8,0.46l0.33,1.2l0.09,0.14l0.72,0.66l-0.11,0.28l0.1,0.33l-0.06,0.02l-1.25,-0.08l-0.17,-0.29l-0.39,-0.12l-0.52,0.25l-0.16,0.36l0.13,0.42l-0.6,0.88l-0.43,1.03l-0.22,0.12l-0.32,-1.0l0.25,-1.34l-0.08,-1.38l-0.06,-0.17l-1.43,-1.87l-0.81,-1.36l-0.78,-0.95l-0.12,-0.09l-0.29,-0.12Z\", \"name\": \"Moldova\"}, \"MG\": {\"path\": \"M544.77,316.45l0.64,1.04l0.6,1.62l0.4,3.04l0.63,1.21l-0.22,1.07l-0.15,0.26l-0.59,-1.05l-0.52,-0.01l-0.47,0.76l-0.04,0.23l0.46,1.84l-0.19,0.92l-0.61,0.53l-0.1,0.21l-0.16,2.15l-0.97,2.98l-1.24,3.59l-1.55,4.97l-0.96,3.67l-1.08,2.93l-1.94,0.61l-2.05,1.06l-3.2,-1.53l-0.62,-1.26l-0.18,-2.39l-0.87,-2.07l-0.22,-1.8l0.4,-1.69l1.01,-0.4l0.19,-0.28l0.01,-0.79l1.15,-1.91l0.04,-0.11l0.23,-1.66l-0.03,-0.17l-0.57,-1.21l-0.46,-1.58l-0.19,-2.25l0.82,-1.36l0.33,-1.51l1.11,-0.1l1.4,-0.53l0.9,-0.45l1.03,-0.03l0.21,-0.09l1.41,-1.45l2.12,-1.65l0.75,-1.29l0.03,-0.24l-0.17,-0.56l0.53,0.15l0.32,-0.1l1.38,-1.77l0.06,-0.18l0.04,-1.44l0.54,-0.74l0.62,0.77Z\", \"name\": \"Madagascar\"}, \"MA\": {\"path\": \"M378.66,230.13l0.07,-0.75l0.93,-0.72l0.82,-1.37l0.04,-0.21l-0.14,-0.8l0.8,-1.74l1.33,-1.61l0.79,-0.4l0.14,-0.15l0.66,-1.55l0.08,-1.46l0.83,-1.52l1.6,-0.94l0.11,-0.11l1.56,-2.71l1.2,-0.99l2.24,-0.29l0.17,-0.08l1.95,-1.83l1.3,-0.77l2.09,-2.28l0.07,-0.26l-0.61,-3.34l0.92,-2.3l0.33,-1.44l1.52,-1.79l2.48,-1.27l1.86,-1.16l0.1,-0.11l1.67,-2.93l0.72,-1.59l1.54,0.01l1.43,1.14l0.21,0.06l2.33,-0.19l2.55,0.62l0.97,0.03l0.83,1.6l0.15,1.71l0.86,2.96l0.09,0.14l0.5,0.45l-0.31,0.73l-3.11,0.44l-0.16,0.07l-1.07,0.97l-1.36,0.23l-0.25,0.28l-0.1,1.85l-2.74,1.02l-0.14,0.11l-0.9,1.3l-1.93,0.69l-2.56,0.44l-4.04,2.01l-0.17,0.27l0.02,2.91l-0.08,0.0l-0.3,0.31l0.05,1.15l-1.25,0.07l-0.16,0.06l-0.73,0.55l-0.98,0.0l-0.85,-0.33l-0.15,-0.02l-2.11,0.29l-0.24,0.19l-0.76,1.95l-0.63,0.16l-0.21,0.19l-1.15,3.29l-3.42,2.81l-0.1,0.17l-0.81,3.57l-0.98,1.12l-0.3,0.85l-5.13,0.19Z\", \"name\": \"Morocco\"}, \"UZ\": {\"path\": \"M587.83,186.48l0.06,-1.46l-0.19,-0.29l-3.31,-1.24l-2.57,-1.4l-1.63,-1.38l-2.79,-1.98l-1.2,-2.98l-0.12,-0.14l-0.84,-0.54l-0.18,-0.05l-2.61,0.13l-0.76,-0.48l-0.25,-2.25l-0.17,-0.24l-3.37,-1.6l-0.32,0.04l-2.08,1.73l-2.11,1.02l-0.16,0.35l0.31,1.14l-2.14,0.03l-0.09,-10.68l6.1,-1.74l6.25,3.57l2.36,2.72l0.27,0.1l2.92,-0.44l4.17,-0.23l2.78,2.06l-0.18,2.87l0.29,0.32l0.98,0.02l0.46,2.22l0.28,0.24l3.0,0.09l0.61,1.25l0.28,0.17l0.93,-0.02l0.26,-0.16l1.06,-2.06l3.21,-2.03l1.3,-0.5l0.19,0.08l-1.75,1.62l0.05,0.48l1.85,1.12l0.27,0.02l1.65,-0.69l2.4,1.27l-2.69,1.79l-1.79,-0.27l-0.89,0.06l-0.22,-0.52l0.48,-1.26l-0.34,-0.4l-3.35,0.69l-0.22,0.18l-0.78,1.87l-1.07,1.47l-1.93,-0.13l-0.29,0.16l-0.65,1.29l0.16,0.42l1.69,0.64l0.48,1.91l-1.25,2.6l-1.64,-0.53l-1.18,-0.03Z\", \"name\": \"Uzbekistan\"}, \"MM\": {\"path\": \"M670.1,233.39l-1.46,1.11l-1.68,0.11l-0.26,0.19l-1.1,2.7l-0.95,0.42l-0.14,0.42l1.21,2.27l1.61,1.92l0.94,1.55l-0.82,1.99l-0.77,0.42l-0.13,0.39l0.64,1.35l1.62,1.97l0.26,1.32l-0.04,1.15l0.02,0.13l0.92,2.18l-1.3,2.23l-0.79,1.69l-0.1,-0.77l0.74,-1.87l-0.02,-0.26l-0.8,-1.42l0.2,-2.68l-0.06,-0.2l-0.98,-1.27l-0.8,-2.98l-0.45,-3.22l-1.11,-2.22l-0.45,-0.1l-1.64,1.28l-2.74,1.76l-1.26,-0.2l-1.27,-0.49l0.79,-2.93l0.0,-0.14l-0.52,-2.42l-1.93,-2.97l0.26,-0.8l-0.22,-0.39l-1.37,-0.31l-1.65,-1.98l-0.12,-1.5l0.41,0.19l0.42,-0.26l0.05,-1.7l1.08,-0.54l0.16,-0.34l-0.24,-1.0l0.5,-0.79l0.05,-0.15l0.08,-2.35l1.58,0.49l0.36,-0.15l1.12,-2.19l0.15,-1.34l1.35,-2.18l0.04,-0.17l-0.07,-1.35l2.97,-1.71l1.67,0.45l0.38,-0.33l-0.18,-1.46l0.7,-0.4l0.15,-0.32l-0.13,-0.72l0.94,-0.13l0.74,1.41l0.11,0.12l0.95,0.56l0.07,1.89l-0.09,2.08l-2.28,2.15l-0.09,0.19l-0.3,3.15l0.35,0.32l2.37,-0.39l0.53,2.17l0.2,0.21l1.3,0.42l-0.63,1.9l0.14,0.36l1.86,0.99l1.1,0.49l0.24,0.0l1.45,-0.6l0.04,0.51l-2.01,1.6l-0.56,0.96l-1.34,0.56Z\", \"name\": \"Myanmar\"}, \"ML\": {\"path\": \"M390.79,248.2l0.67,-0.37l0.14,-0.18l0.36,-1.31l0.51,-0.04l1.68,0.69l0.21,0.0l1.34,-0.48l0.89,0.16l0.3,-0.13l0.29,-0.44l9.89,-0.04l0.29,-0.21l0.56,-1.8l-0.11,-0.33l-0.33,-0.24l-2.37,-22.1l3.41,-0.04l8.37,5.73l8.38,5.68l0.56,1.15l0.14,0.14l1.56,0.75l0.99,0.36l0.03,1.45l0.33,0.29l2.45,-0.22l0.01,5.52l-1.3,1.64l-0.06,0.15l-0.18,1.37l-1.99,0.36l-3.4,0.22l-0.19,0.09l-0.85,0.83l-1.48,0.09l-1.49,0.01l-0.54,-0.43l-0.26,-0.05l-1.38,0.36l-2.39,1.08l-0.13,0.12l-0.44,0.73l-1.88,1.11l-0.11,0.12l-0.3,0.57l-0.86,0.42l-1.1,-0.31l-0.28,0.07l-0.69,0.62l-0.09,0.16l-0.35,1.66l-1.93,2.04l-0.08,0.23l0.05,0.76l-0.63,0.99l-0.04,0.19l0.14,1.23l-0.81,0.29l-0.32,0.17l-0.27,-0.75l-0.39,-0.18l-0.65,0.26l-0.36,-0.04l-0.29,0.14l-0.37,0.6l-1.69,-0.02l-0.63,-0.34l-0.32,0.02l-0.12,0.09l-0.47,-0.45l0.1,-0.6l-0.09,-0.27l-0.31,-0.3l-0.33,-0.05l-0.05,0.02l0.02,-0.21l0.46,-0.59l-0.02,-0.39l-0.99,-1.02l-0.34,-0.74l-0.56,-0.56l-0.17,-0.09l-0.5,-0.07l-0.19,0.04l-0.58,0.35l-0.79,0.33l-0.65,0.51l-0.85,-0.16l-0.63,-0.59l-0.14,-0.07l-0.41,-0.08l-0.2,0.03l-0.59,0.31l-0.07,0.0l-0.1,-0.63l0.11,-0.85l-0.21,-0.98l-0.11,-0.17l-0.86,-0.66l-0.45,-1.34l-0.1,-1.36Z\", \"name\": \"Mali\"}, \"MN\": {\"path\": \"M641.06,150.59l2.41,-0.53l4.76,-2.8l3.67,-1.49l2.06,0.96l0.12,0.03l2.5,0.05l1.59,1.45l0.19,0.08l2.47,0.12l3.59,0.81l0.27,-0.07l2.43,-2.28l0.06,-0.36l-0.93,-1.77l2.33,-3.1l2.66,1.3l2.26,0.39l2.75,0.8l0.44,2.3l0.19,0.22l3.56,1.38l0.18,0.01l2.35,-0.6l3.1,-0.42l2.4,0.41l2.37,1.52l1.49,1.63l0.23,0.1l2.29,-0.03l3.13,0.52l0.15,-0.01l2.28,-0.79l3.27,-0.53l0.11,-0.04l3.56,-2.23l1.31,0.31l1.26,1.05l0.22,0.07l2.45,-0.22l-0.98,1.96l-1.77,3.21l-0.01,0.28l0.64,1.31l0.35,0.16l1.35,-0.38l2.4,0.48l0.22,-0.04l1.78,-1.09l1.82,0.92l2.11,2.07l-0.17,0.68l-1.79,-0.31l-3.74,0.45l-1.85,0.96l-1.78,2.01l-3.74,1.18l-2.46,1.61l-2.45,-0.6l-1.42,-0.28l-0.31,0.13l-1.31,1.99l0.0,0.33l0.78,1.15l0.3,0.74l-1.58,0.93l-1.75,1.59l-2.83,1.03l-3.77,0.12l-4.05,1.05l-2.81,1.54l-0.95,-0.8l-0.19,-0.07l-2.96,0.0l-3.64,-1.8l-2.55,-0.48l-3.38,0.41l-5.13,-0.67l-2.66,0.06l-1.35,-1.65l-1.12,-2.78l-0.21,-0.18l-1.5,-0.33l-2.98,-1.89l-0.12,-0.04l-3.37,-0.43l-2.84,-0.51l-0.75,-1.13l0.93,-3.54l-0.04,-0.24l-1.73,-2.55l-0.15,-0.12l-3.52,-1.18l-1.99,-1.61l-0.54,-1.85Z\", \"name\": \"Mongolia\"}, \"MK\": {\"path\": \"M472.73,173.87l0.08,0.01l0.32,-0.25l0.08,-0.44l1.29,-0.41l1.37,-0.28l1.03,-0.04l1.06,0.82l0.14,1.59l-0.22,0.04l-0.17,0.11l-0.32,0.4l-1.2,-0.05l-0.18,0.05l-0.9,0.61l-1.45,0.23l-0.85,-0.59l-0.3,-1.09l0.22,-0.71Z\", \"name\": \"Macedonia\"}, \"MW\": {\"path\": \"M507.18,313.84l-0.67,1.85l-0.01,0.16l0.7,3.31l0.31,0.24l0.75,-0.03l0.78,0.71l0.99,1.75l0.2,3.03l-0.91,0.45l-0.14,0.15l-0.59,1.38l-1.24,-1.21l-0.17,-1.62l0.49,-1.12l0.02,-0.16l-0.15,-1.03l-0.13,-0.21l-0.99,-0.65l-0.26,-0.03l-0.53,0.18l-1.31,-1.12l-1.15,-0.59l0.66,-2.06l0.75,-0.84l0.07,-0.27l-0.47,-2.04l0.48,-1.94l0.4,-0.65l0.03,-0.24l-0.64,-2.15l-0.08,-0.13l-0.44,-0.42l1.34,0.26l1.25,1.73l0.67,3.3Z\", \"name\": \"Malawi\"}, \"MR\": {\"path\": \"M390.54,247.66l-1.48,-1.58l-1.51,-1.88l-0.12,-0.09l-1.64,-0.67l-1.17,-0.74l-0.17,-0.05l-1.4,0.03l-0.12,0.03l-1.14,0.52l-1.15,-0.21l-0.26,0.08l-0.44,0.43l-0.11,-0.72l0.68,-1.29l0.31,-2.43l-0.28,-2.63l-0.29,-1.27l0.24,-1.24l-0.03,-0.2l-0.65,-1.24l-1.19,-1.05l0.32,-0.51l9.64,0.02l0.3,-0.34l-0.46,-3.71l0.51,-1.12l2.17,-0.22l0.27,-0.3l-0.08,-6.5l7.91,0.13l0.31,-0.3l0.01,-3.5l8.17,5.63l-2.89,0.04l-0.29,0.33l2.42,22.56l0.12,0.21l0.26,0.19l-0.43,1.38l-9.83,0.04l-0.25,0.13l-0.27,0.41l-0.77,-0.14l-0.15,0.01l-1.3,0.47l-1.64,-0.67l-0.14,-0.02l-0.79,0.06l-0.27,0.22l-0.39,1.39l-0.53,0.29Z\", \"name\": \"Mauritania\"}, \"UG\": {\"path\": \"M500.74,287.17l-2.84,-0.02l-0.92,0.32l-1.37,0.71l-0.29,-0.12l0.02,-1.6l0.54,-0.89l0.04,-0.13l0.14,-1.96l0.49,-1.09l0.91,-1.24l0.97,-0.68l0.8,-0.89l-0.13,-0.49l-0.79,-0.27l0.13,-2.55l0.78,-0.52l1.45,0.51l0.18,0.01l1.97,-0.57l1.72,0.01l0.18,-0.06l1.29,-0.97l0.98,1.44l0.29,1.24l1.05,2.75l-0.84,1.68l-1.94,2.66l-0.06,0.18l0.02,2.36l-4.8,0.18Z\", \"name\": \"Uganda\"}, \"MY\": {\"path\": \"M717.6,273.52l-1.51,0.7l-2.13,-0.41l-2.88,-0.0l-0.29,0.21l-0.84,2.77l-0.9,0.82l-0.08,0.12l-1.23,3.34l-1.81,0.47l-2.29,-0.68l-0.14,-0.01l-1.2,0.22l-0.14,0.07l-1.36,1.18l-1.47,-0.17l-0.12,0.01l-1.46,0.46l-1.51,-1.25l-0.24,-0.97l1.26,0.59l0.2,0.02l1.93,-0.47l0.22,-0.22l0.47,-1.98l0.9,-0.4l2.97,-0.54l0.17,-0.09l1.8,-1.98l1.02,-1.32l0.9,1.03l0.48,-0.04l0.43,-0.7l1.02,0.07l0.32,-0.27l0.25,-2.72l1.84,-1.67l1.23,-1.89l0.73,-0.01l1.12,1.11l0.1,0.99l0.18,0.24l1.66,0.71l1.85,0.67l-0.09,0.51l-1.45,0.11l-0.26,0.4l0.35,0.97ZM673.78,269.53l0.17,1.14l0.35,0.25l1.65,-0.3l0.18,-0.11l0.68,-0.86l0.31,0.13l1.41,1.45l0.99,1.59l0.13,1.57l-0.26,1.09l0.0,0.15l0.24,0.84l0.18,1.46l0.11,0.2l0.82,0.64l0.92,2.08l-0.03,0.52l-1.4,0.13l-2.29,-1.79l-2.86,-1.92l-0.27,-1.16l-0.07,-0.13l-1.39,-1.61l-0.33,-1.99l-0.05,-0.12l-0.84,-1.27l0.26,-1.72l-0.03,-0.18l-0.45,-0.87l0.13,-0.13l1.71,0.92Z\", \"name\": \"Malaysia\"}, \"MX\": {\"path\": \"M133.41,213.83l0.61,0.09l0.27,-0.09l0.93,-1.01l0.08,-0.18l0.09,-1.22l-0.09,-0.23l-1.93,-1.94l-1.46,-0.77l-2.96,-5.62l-0.86,-2.1l2.44,-0.18l2.68,-0.25l-0.03,0.08l0.17,0.4l3.79,1.35l5.81,1.97l6.96,-0.02l0.3,-0.3l0.0,-0.84l3.91,0.0l0.87,0.93l1.27,0.87l1.44,1.17l0.79,1.37l0.62,1.49l0.12,0.14l1.35,0.85l2.08,0.82l0.35,-0.1l1.49,-2.04l1.81,-0.05l1.63,1.01l1.21,1.8l0.86,1.58l1.47,1.55l0.53,1.82l0.73,1.32l0.14,0.13l1.98,0.84l1.78,0.59l0.61,-0.03l-0.78,1.89l-0.45,1.96l-0.19,3.58l-0.24,1.27l0.01,0.14l0.43,1.43l0.78,1.31l0.49,1.98l0.06,0.12l1.63,1.9l0.61,1.51l0.98,1.28l0.16,0.11l2.58,0.67l0.98,1.02l0.31,0.08l2.17,-0.71l1.91,-0.26l1.87,-0.47l1.67,-0.49l1.59,-1.06l0.11,-0.14l0.6,-1.52l0.22,-2.21l0.35,-0.62l1.58,-0.64l2.59,-0.59l2.18,0.09l1.43,-0.2l0.39,0.36l-0.07,1.02l-1.28,1.48l-0.65,1.68l0.07,0.32l0.33,0.32l-0.79,2.49l-0.28,-0.3l-0.24,-0.09l-1.0,0.08l-0.24,0.15l-0.74,1.28l-0.19,-0.13l-0.28,-0.03l-0.3,0.12l-0.19,0.29l0.0,0.06l-4.34,-0.02l-0.3,0.3l-0.0,1.16l-0.83,0.0l-0.28,0.19l0.08,0.33l0.93,0.86l0.9,0.58l0.24,0.48l0.16,0.15l0.2,0.08l-0.03,0.38l-2.94,0.01l-0.26,0.15l-1.21,2.09l0.02,0.33l0.25,0.33l-0.21,0.44l-0.04,0.22l-2.42,-2.35l-1.36,-0.87l-2.04,-0.67l-0.13,-0.01l-1.4,0.19l-2.07,0.98l-1.14,0.23l-1.72,-0.66l-1.85,-0.48l-2.31,-1.16l-1.92,-0.38l-2.79,-1.18l-2.04,-1.2l-0.6,-0.66l-0.19,-0.1l-1.37,-0.15l-2.45,-0.78l-1.07,-1.18l-2.63,-1.44l-1.2,-1.56l-0.44,-0.93l0.5,-0.15l0.2,-0.39l-0.2,-0.58l0.46,-0.55l0.07,-0.19l0.01,-0.91l-0.06,-0.18l-0.81,-1.13l-0.25,-1.08l-0.86,-1.36l-2.21,-2.63l-2.53,-2.09l-1.2,-1.63l-0.11,-0.09l-2.08,-1.06l-0.34,-0.48l0.35,-1.53l-0.16,-0.34l-1.24,-0.61l-1.39,-1.23l-0.6,-1.81l-0.24,-0.2l-1.25,-0.2l-1.38,-1.35l-1.11,-1.25l-0.1,-0.76l-0.05,-0.13l-1.33,-2.04l-0.85,-2.02l0.04,-0.99l-0.14,-0.27l-1.81,-1.1l-0.2,-0.04l-0.74,0.11l-1.34,-0.72l-0.42,0.16l-0.4,1.12l-0.0,0.19l0.41,1.3l0.24,2.04l0.06,0.15l0.88,1.16l1.84,1.86l0.4,0.61l0.12,0.1l0.27,0.14l0.29,0.82l0.31,0.2l0.2,-0.02l0.43,1.51l0.09,0.14l0.72,0.65l0.51,0.91l1.58,1.4l0.8,2.42l0.77,1.23l0.66,1.19l0.13,1.34l0.28,0.27l1.08,0.08l0.92,1.1l0.83,1.08l-0.03,0.24l-0.88,0.81l-0.13,-0.0l-0.59,-1.42l-0.07,-0.11l-1.67,-1.53l-1.81,-1.28l-1.15,-0.61l0.07,-1.85l-0.38,-1.45l-0.12,-0.17l-2.91,-2.03l-0.39,0.04l-0.11,0.11l-0.42,-0.46l-0.11,-0.08l-1.49,-0.63l-1.09,-1.16Z\", \"name\": \"Mexico\"}, \"VU\": {\"path\": \"M839.92,325.66l0.78,0.73l-0.18,0.07l-0.6,-0.8ZM839.13,322.74l0.27,1.36l-0.13,-0.06l-0.21,-0.02l-0.29,0.08l-0.22,-0.43l-0.03,-1.32l0.61,0.4Z\", \"name\": \"Vanuatu\"}, \"FR\": {\"path\": \"M444.58,172.63l-0.68,1.92l-0.72,-0.38l-0.51,-1.79l0.43,-0.95l1.15,-0.83l0.33,2.04ZM429.71,147.03l1.77,1.57l0.26,0.07l1.16,-0.23l2.12,1.44l0.56,0.28l0.16,0.03l0.61,-0.06l1.09,0.78l0.13,0.05l3.18,0.53l-1.09,1.94l-0.3,2.16l-0.48,0.38l-1.0,-0.26l-0.37,0.32l0.07,0.66l-1.73,1.68l-0.09,0.21l-0.04,1.42l0.41,0.29l0.96,-0.4l0.67,1.07l-0.09,0.78l0.04,0.19l0.61,0.97l-0.71,0.78l-0.07,0.28l0.65,2.39l0.21,0.21l1.09,0.31l-0.2,0.95l-2.08,1.58l-4.81,-0.8l-0.13,0.01l-3.65,0.99l-0.22,0.24l-0.25,1.6l-2.59,0.35l-2.74,-1.33l-0.31,0.03l-0.79,0.57l-4.38,-1.31l-0.79,-0.94l1.16,-1.64l0.05,-0.15l0.48,-6.17l-0.06,-0.21l-2.58,-3.3l-1.89,-1.65l-0.11,-0.06l-3.64,-1.17l-0.2,-1.88l2.92,-0.63l4.14,0.82l0.35,-0.36l-0.65,-3.0l1.77,1.05l0.27,0.02l5.83,-2.54l0.17,-0.19l0.71,-2.54l1.75,-0.53l0.27,0.88l0.27,0.21l1.04,0.05l1.08,1.23ZM289.1,278.45l-0.85,0.84l-0.88,0.13l-0.25,-0.51l-0.21,-0.16l-0.56,-0.1l-0.25,0.07l-0.63,0.55l-0.62,-0.29l0.5,-0.88l0.21,-1.11l0.42,-1.05l-0.03,-0.28l-0.93,-1.42l-0.18,-1.54l1.13,-1.87l2.42,0.78l2.55,2.04l0.33,0.81l-1.4,2.16l-0.77,1.84Z\", \"name\": \"France\"}, \"FI\": {\"path\": \"M492.26,76.42l-0.38,3.12l0.12,0.28l3.6,2.69l-2.14,2.96l-0.01,0.33l2.83,4.61l-1.61,3.36l0.03,0.31l2.15,2.87l-0.96,2.44l0.1,0.35l3.51,2.55l-0.81,1.72l-2.28,2.19l-5.28,4.79l-4.51,0.31l-4.39,1.37l-3.87,0.75l-1.34,-1.89l-0.11,-0.09l-2.23,-1.14l0.53,-3.54l-0.01,-0.14l-1.17,-3.37l1.12,-2.13l2.23,-2.44l5.69,-4.33l1.65,-0.84l0.16,-0.31l-0.26,-1.73l-0.15,-0.22l-3.4,-1.91l-0.77,-1.47l-0.07,-6.45l-0.12,-0.24l-3.91,-2.94l-3.0,-1.92l0.97,-0.76l2.6,2.17l0.21,0.07l3.2,-0.21l2.63,1.03l0.3,-0.05l2.39,-1.94l0.09,-0.13l1.18,-3.12l3.63,-1.42l2.87,1.59l-0.98,2.87Z\", \"name\": \"Finland\"}, \"FJ\": {\"path\": \"M869.98,327.07l-1.31,0.44l-0.14,-0.41l0.96,-0.41l0.85,-0.17l1.43,-0.78l-0.16,0.65l-1.64,0.67ZM867.58,329.12l0.54,0.47l-0.31,1.0l-1.32,0.3l-1.13,-0.26l-0.17,-0.78l0.72,-0.66l0.98,0.27l0.25,-0.04l0.43,-0.29Z\", \"name\": \"Fiji\"}, \"FK\": {\"path\": \"M268.15,427.89l2.6,-1.73l1.98,0.77l0.31,-0.05l1.32,-1.17l1.58,1.18l-0.54,0.84l-3.1,0.92l-1.0,-1.04l-0.39,-0.04l-1.9,1.35l-0.86,-1.04Z\", \"name\": \"Falkland Islands\"}, \"NI\": {\"path\": \"M202.1,252.6l0.23,-0.0l0.12,-0.11l0.68,-0.09l0.22,-0.15l0.23,-0.43l0.2,-0.01l0.28,-0.31l-0.04,-0.97l0.29,-0.03l0.5,0.02l0.25,-0.11l0.37,-0.46l0.51,0.35l0.4,-0.06l0.23,-0.28l0.45,-0.29l0.87,-0.7l0.11,-0.21l0.02,-0.26l0.23,-0.12l0.25,-0.48l0.29,0.27l0.14,0.07l0.5,0.12l0.22,-0.03l0.48,-0.28l0.66,-0.02l0.87,-0.33l0.36,-0.32l0.21,0.01l-0.11,0.48l0.0,0.14l0.22,0.8l-0.54,0.85l-0.27,1.03l-0.09,1.18l0.14,0.72l0.05,0.95l-0.24,0.15l-0.13,0.19l-0.23,1.09l0.0,0.14l0.14,0.53l-0.42,0.53l-0.06,0.24l0.12,0.69l0.08,0.15l0.18,0.19l-0.26,0.23l-0.49,-0.11l-0.35,-0.44l-0.16,-0.1l-0.79,-0.21l-0.23,0.03l-0.45,0.26l-1.51,-0.62l-0.31,0.05l-0.17,0.15l-1.81,-1.62l-0.6,-0.9l-1.04,-0.79l-0.77,-0.71Z\", \"name\": \"Nicaragua\"}, \"NL\": {\"path\": \"M436.22,136.65l1.82,0.08l0.36,0.89l-0.6,2.96l-0.53,1.06l-1.32,0.0l-0.3,0.34l0.35,2.89l-0.83,-0.47l-1.56,-1.43l-0.29,-0.07l-2.26,0.67l-1.02,-0.15l0.68,-0.48l0.1,-0.12l2.14,-4.84l3.25,-1.35Z\", \"name\": \"Netherlands\"}, \"NO\": {\"path\": \"M491.45,67.31l7.06,3.0l-2.52,0.94l-0.11,0.49l2.43,2.49l-3.82,1.59l-1.48,0.3l0.89,-2.61l-0.14,-0.36l-3.21,-1.78l-0.25,-0.02l-3.89,1.52l-0.17,0.17l-1.2,3.17l-2.19,1.78l-2.53,-0.99l-0.13,-0.02l-3.15,0.21l-2.69,-2.25l-0.38,-0.01l-1.43,1.11l-1.47,0.17l-0.26,0.26l-0.33,2.57l-4.42,-0.65l-0.33,0.22l-0.6,2.19l-2.17,-0.01l-0.27,0.16l-4.15,7.68l-3.88,5.76l-0.0,0.33l0.81,1.23l-0.7,1.27l-2.3,-0.06l-0.28,0.18l-1.63,3.72l-0.02,0.13l0.15,5.17l0.07,0.18l1.51,1.84l-0.79,4.24l-2.04,2.5l-0.92,1.75l-1.39,-1.88l-0.44,-0.05l-4.89,4.21l-3.16,0.81l-3.24,-1.74l-0.86,-3.82l-0.78,-8.6l2.18,-2.36l6.56,-3.28l5.0,-4.16l4.63,-5.74l5.99,-8.09l4.17,-3.23l6.84,-5.49l5.39,-1.92l4.06,0.24l0.23,-0.09l3.72,-3.67l4.51,0.19l4.4,-0.89ZM484.58,19.95l4.42,1.82l-3.25,2.68l-7.14,0.65l-7.16,-0.91l-0.39,-1.37l-0.28,-0.22l-3.48,-0.1l-2.25,-2.15l7.09,-1.48l3.55,1.36l0.28,-0.03l2.42,-1.66l6.18,1.41ZM481.99,33.92l-4.73,1.85l-3.76,-1.06l1.27,-1.02l0.04,-0.43l-1.18,-1.35l4.46,-0.94l0.89,1.83l0.17,0.15l2.83,0.96ZM466.5,23.95l7.64,3.87l-5.63,1.94l-0.19,0.19l-1.35,3.88l-2.08,0.96l-0.16,0.19l-1.14,4.18l-2.71,0.18l-4.94,-2.95l1.95,-1.63l-0.08,-0.51l-3.7,-1.54l-4.79,-4.54l-1.78,-4.01l6.29,-1.88l1.25,1.81l0.25,0.13l3.57,-0.08l0.26,-0.17l0.87,-1.79l3.41,-0.18l3.08,1.94Z\", \"name\": \"Norway\"}, \"NA\": {\"path\": \"M461.88,357.98l-1.61,-1.77l-0.94,-1.9l-0.54,-2.58l-0.62,-1.95l-0.83,-4.05l-0.06,-3.13l-0.33,-1.5l-0.07,-0.14l-0.95,-1.06l-1.27,-2.12l-1.3,-3.1l-0.59,-1.71l-1.98,-2.46l-0.13,-1.67l0.99,-0.4l1.44,-0.42l1.48,0.07l1.42,1.11l0.31,0.03l0.32,-0.15l9.99,-0.11l1.66,1.18l0.16,0.06l6.06,0.37l4.69,-1.06l2.01,-0.57l1.5,0.14l0.63,0.37l-1.0,0.41l-0.7,0.01l-0.16,0.05l-1.38,0.88l-0.79,-0.88l-0.29,-0.09l-3.83,0.9l-1.84,0.08l-0.29,0.3l-0.07,8.99l-2.18,0.08l-0.29,0.3l-0.0,17.47l-2.04,1.27l-1.21,0.18l-1.51,-0.49l-0.99,-0.18l-0.36,-1.0l-0.1,-0.14l-0.99,-0.74l-0.4,0.04l-0.98,1.09Z\", \"name\": \"Namibia\"}, \"NC\": {\"path\": \"M835.87,338.68l2.06,1.63l1.01,0.94l-0.49,0.32l-1.21,-0.62l-1.76,-1.16l-1.58,-1.36l-1.61,-1.79l-0.16,-0.41l0.54,0.02l1.32,0.83l1.08,0.87l0.79,0.73Z\", \"name\": \"New Caledonia\"}, \"NE\": {\"path\": \"M426.67,254.17l0.03,-1.04l-0.24,-0.3l-2.66,-0.53l-0.06,-1.0l-0.07,-0.17l-1.37,-1.62l-0.3,-1.04l0.15,-0.94l1.37,-0.09l0.19,-0.09l0.85,-0.83l3.34,-0.22l2.22,-0.41l0.24,-0.26l0.2,-1.5l1.32,-1.65l0.07,-0.19l-0.01,-5.74l3.4,-1.13l7.24,-5.12l8.46,-4.95l3.76,1.08l1.35,1.39l0.36,0.05l1.39,-0.77l0.55,3.66l0.12,0.2l0.82,0.6l0.03,0.69l0.1,0.21l0.87,0.74l-0.47,0.99l-0.96,5.26l-0.13,3.25l-3.08,2.34l-0.1,0.15l-1.08,3.37l0.08,0.31l0.94,0.86l-0.01,1.51l0.29,0.3l1.25,0.05l-0.14,0.66l-0.51,0.11l-0.24,0.26l-0.06,0.57l-0.04,0.0l-1.59,-2.62l-0.21,-0.14l-0.59,-0.1l-0.23,0.05l-1.83,1.33l-1.79,-0.68l-1.42,-0.17l-0.17,0.03l-0.65,0.32l-1.39,-0.07l-0.19,0.06l-1.4,1.03l-1.12,0.05l-2.97,-1.29l-0.26,0.01l-1.12,0.59l-1.08,-0.04l-0.85,-0.88l-0.11,-0.07l-2.51,-0.95l-0.14,-0.02l-2.69,0.3l-0.16,0.07l-0.65,0.55l-0.1,0.16l-0.34,1.41l-0.69,0.98l-0.05,0.15l-0.13,1.72l-1.47,-1.13l-0.18,-0.06l-0.9,0.01l-0.2,0.08l-0.32,0.28Z\", \"name\": \"Niger\"}, \"NG\": {\"path\": \"M442.0,272.7l-2.4,0.83l-0.88,-0.12l-0.19,0.04l-0.89,0.52l-1.78,-0.05l-1.23,-1.44l-0.88,-1.87l-1.77,-1.66l-0.21,-0.08l-3.78,0.03l0.13,-3.75l-0.06,-1.58l0.44,-1.47l0.74,-0.75l1.21,-1.56l0.04,-0.29l-0.22,-0.56l0.44,-0.9l0.01,-0.24l-0.54,-1.44l0.26,-2.97l0.72,-1.06l0.33,-1.37l0.51,-0.43l2.53,-0.28l2.38,0.9l0.89,0.91l0.2,0.09l1.28,0.04l0.15,-0.03l1.06,-0.56l2.9,1.26l0.13,0.02l1.28,-0.06l0.16,-0.06l1.39,-1.02l1.36,0.07l0.15,-0.03l0.64,-0.32l1.22,0.13l1.9,0.73l0.28,-0.04l1.86,-1.35l0.33,0.06l1.62,2.67l0.29,0.14l0.32,-0.04l0.73,0.74l-0.19,0.37l-0.12,0.74l-2.03,1.89l-0.07,0.11l-0.66,1.62l-0.35,1.28l-0.48,0.51l-0.07,0.12l-0.48,1.67l-1.26,0.98l-0.1,0.15l-0.38,1.24l-0.58,1.07l-0.2,0.91l-1.43,0.7l-1.26,-0.93l-0.19,-0.06l-0.95,0.04l-0.2,0.09l-1.41,1.39l-0.61,0.02l-0.26,0.17l-1.19,2.42l-0.61,1.67Z\", \"name\": \"Nigeria\"}, \"NZ\": {\"path\": \"M857.9,379.62l1.85,3.1l0.33,0.14l0.22,-0.28l0.04,-1.41l0.57,0.4l0.35,2.06l0.17,0.22l2.02,0.94l1.78,0.26l0.22,-0.06l1.31,-1.01l0.84,0.22l-0.53,2.27l-0.67,1.5l-1.71,-0.05l-0.25,0.12l-0.67,0.89l-0.05,0.23l0.21,1.15l-0.31,0.46l-2.15,3.57l-1.6,0.99l-0.28,-0.51l-0.15,-0.13l-0.72,-0.3l1.27,-2.15l0.01,-0.29l-0.82,-1.63l-0.15,-0.14l-2.5,-1.09l0.05,-0.69l1.67,-0.94l0.15,-0.21l0.42,-2.24l-0.11,-1.95l-0.03,-0.12l-0.97,-1.85l0.05,-0.41l-0.09,-0.25l-1.18,-1.17l-1.94,-2.49l-0.86,-1.64l0.38,-0.09l1.24,1.43l0.12,0.08l1.81,0.68l0.67,2.39ZM853.93,393.55l0.57,1.24l0.44,0.12l1.51,-1.03l0.52,0.91l0.0,1.09l-0.88,1.31l-1.62,2.2l-1.26,1.2l-0.05,0.38l0.64,1.02l-1.4,0.03l-0.14,0.04l-2.14,1.16l-0.14,0.17l-0.67,2.0l-1.38,3.06l-3.07,2.19l-2.12,-0.06l-1.55,-0.99l-0.14,-0.05l-2.53,-0.2l-0.31,-0.84l1.25,-2.15l3.07,-2.97l1.62,-0.59l1.81,-1.17l2.18,-1.63l1.55,-1.65l1.08,-2.18l0.9,-0.72l0.11,-0.17l0.35,-1.56l1.37,-1.07l0.4,0.91Z\", \"name\": \"New Zealand\"}, \"NP\": {\"path\": \"M641.26,213.53l-0.14,0.95l0.32,1.64l-0.21,0.78l-1.83,0.04l-2.98,-0.62l-1.86,-0.25l-1.37,-1.3l-0.18,-0.08l-3.38,-0.34l-3.21,-1.49l-2.38,-1.34l-2.16,-0.92l0.84,-2.2l1.51,-1.18l0.89,-0.57l1.83,0.77l2.5,1.76l1.39,0.41l0.78,1.21l0.17,0.13l1.91,0.53l2.0,1.17l2.92,0.66l2.63,0.24Z\", \"name\": \"Nepal\"}, \"CI\": {\"path\": \"M413.53,272.08l-0.83,0.02l-1.79,-0.49l-1.64,0.03l-3.04,0.46l-1.73,0.72l-2.4,0.89l-0.12,-0.02l0.16,-1.7l0.19,-0.25l0.06,-0.2l-0.08,-0.99l-0.09,-0.19l-1.06,-1.05l-0.15,-0.08l-0.71,-0.15l-0.51,-0.48l0.45,-0.92l0.02,-0.19l-0.24,-1.16l0.07,-0.43l0.14,-0.0l0.3,-0.26l0.15,-1.1l-0.02,-0.15l-0.13,-0.34l0.09,-0.13l0.83,-0.27l0.19,-0.37l-0.62,-2.02l-0.55,-1.0l0.14,-0.59l0.35,-0.14l0.24,-0.16l0.53,0.29l0.14,0.04l1.93,0.02l0.26,-0.14l0.36,-0.58l0.39,0.01l0.43,-0.17l0.28,0.79l0.43,0.16l0.56,-0.31l0.89,-0.32l0.92,0.45l0.39,0.75l0.14,0.13l1.13,0.53l0.3,-0.03l0.81,-0.59l1.02,-0.08l1.49,0.57l0.62,3.33l-1.03,2.09l-0.65,2.84l0.02,0.2l1.05,2.08l-0.07,0.64Z\", \"name\": \"Ivory Coast\"}, \"CH\": {\"path\": \"M444.71,156.27l0.05,0.3l-0.34,0.69l0.13,0.4l1.13,0.58l1.07,0.1l-0.12,0.81l-0.87,0.42l-1.75,-0.37l-0.34,0.18l-0.47,1.1l-0.86,0.07l-0.33,-0.38l-0.41,-0.04l-1.34,1.01l-1.02,0.13l-0.93,-0.58l-0.82,-1.32l-0.37,-0.12l-0.77,0.32l0.02,-0.84l1.74,-1.69l0.09,-0.25l-0.04,-0.38l0.73,0.19l0.26,-0.06l0.6,-0.48l2.02,0.02l0.24,-0.12l0.38,-0.51l2.31,0.84Z\", \"name\": \"Switzerland\"}, \"CO\": {\"path\": \"M232.24,284.95l-0.94,-0.52l-1.22,-0.82l-0.31,-0.01l-0.62,0.35l-1.88,-0.31l-0.54,-0.95l-0.29,-0.15l-0.37,0.03l-2.34,-1.33l-0.15,-0.35l0.57,-0.11l0.24,-0.32l-0.1,-1.15l0.46,-0.71l1.11,-0.15l0.21,-0.13l1.05,-1.57l0.95,-1.31l-0.08,-0.43l-0.73,-0.47l0.4,-1.24l0.01,-0.16l-0.53,-2.15l0.44,-0.54l0.06,-0.24l-0.4,-2.13l-0.06,-0.13l-0.93,-1.22l0.21,-0.8l0.52,0.12l0.32,-0.13l0.47,-0.75l0.03,-0.27l-0.52,-1.32l0.09,-0.11l1.14,0.07l0.22,-0.08l1.82,-1.71l0.96,-0.25l0.22,-0.28l0.02,-0.81l0.43,-2.01l1.28,-1.04l1.48,-0.05l0.27,-0.19l0.12,-0.31l1.73,0.19l0.2,-0.05l1.96,-1.28l0.97,-0.56l1.16,-1.16l0.64,0.11l0.43,0.44l-0.31,0.55l-1.49,0.39l-0.19,0.16l-0.6,1.2l-0.97,0.74l-0.73,0.94l-0.06,0.13l-0.3,1.76l-0.68,1.44l0.23,0.43l1.1,0.14l0.27,0.97l0.08,0.13l0.49,0.49l0.17,0.85l-0.27,0.86l-0.01,0.14l0.09,0.53l0.2,0.23l0.52,0.18l0.54,0.79l0.27,0.13l3.18,-0.24l1.31,0.29l1.7,2.08l0.31,0.1l0.96,-0.26l1.75,0.13l1.41,-0.27l0.56,0.27l-0.36,1.07l-0.54,0.81l-0.05,0.13l-0.2,1.8l0.51,1.79l0.07,0.12l0.65,0.68l0.05,0.32l-1.16,1.14l0.05,0.47l0.86,0.52l0.6,0.79l0.31,1.01l-0.7,-0.81l-0.44,-0.01l-0.74,0.77l-4.75,-0.05l-0.3,0.31l0.03,1.57l0.25,0.29l1.2,0.21l-0.02,0.24l-0.1,-0.05l-0.22,-0.02l-1.41,0.41l-0.22,0.29l-0.01,1.82l0.11,0.23l1.04,0.85l0.35,1.3l-0.06,1.02l-1.02,6.26l-0.84,-0.89l-0.19,-0.09l-0.25,-0.02l1.35,-2.13l-0.1,-0.42l-1.92,-1.17l-0.2,-0.04l-1.41,0.2l-0.82,-0.39l-0.26,0.0l-1.29,0.62l-1.63,-0.27l-1.4,-2.5l-0.12,-0.12l-1.1,-0.61l-0.83,-1.2l-1.67,-1.19l-0.27,-0.04l-0.54,0.19Z\", \"name\": \"Colombia\"}, \"CN\": {\"path\": \"M740.32,148.94l0.22,0.21l4.3,1.03l2.84,2.2l0.99,2.92l0.28,0.2l3.8,0.0l0.15,-0.04l2.13,-1.24l3.5,-0.8l-1.05,2.29l-0.95,1.13l-0.06,0.12l-0.85,3.41l-1.56,2.81l-2.83,-0.51l-0.19,0.03l-2.15,1.09l-0.15,0.34l0.65,2.59l-0.33,3.3l-1.03,0.07l-0.28,0.3l0.01,0.75l-1.09,-1.2l-0.48,0.05l-0.94,1.6l-3.76,1.26l-0.2,0.36l0.29,1.19l-1.67,-0.08l-1.11,-0.88l-0.42,0.05l-1.69,2.08l-2.71,1.57l-2.04,1.88l-3.42,0.84l-0.11,0.05l-1.8,1.34l-1.54,0.46l0.52,-0.53l0.06,-0.33l-0.44,-0.96l1.84,-1.84l0.02,-0.41l-1.32,-1.56l-0.36,-0.08l-2.23,1.08l-2.83,2.06l-1.52,1.85l-2.32,0.13l-0.2,0.09l-1.28,1.37l-0.03,0.37l1.32,1.97l0.18,0.13l1.83,0.43l0.07,1.08l0.18,0.26l1.98,0.84l0.3,-0.03l2.66,-1.96l2.06,1.04l0.12,0.03l1.4,0.07l0.27,1.0l-3.24,0.73l-0.17,0.11l-1.13,1.5l-2.38,1.4l-0.1,0.1l-1.29,1.99l0.1,0.42l2.6,1.5l0.97,2.72l1.52,2.56l1.66,2.08l-0.03,1.76l-1.4,0.67l-0.15,0.38l0.6,1.47l0.13,0.15l1.29,0.75l-0.35,2.0l-0.58,1.96l-1.22,0.21l-0.2,0.14l-1.83,2.93l-2.02,3.51l-2.29,3.13l-3.4,2.42l-3.42,2.18l-2.75,0.3l-0.15,0.06l-1.32,1.01l-0.68,-0.67l-0.41,-0.01l-1.37,1.27l-3.42,1.28l-2.62,0.4l-0.24,0.21l-0.8,2.57l-0.95,0.11l-0.53,-1.54l0.52,-0.89l-0.19,-0.44l-3.36,-0.84l-0.17,0.01l-1.09,0.4l-2.36,-0.64l-1.0,-0.9l0.35,-1.34l-0.23,-0.37l-2.22,-0.47l-1.15,-0.94l-0.36,-0.02l-2.08,1.37l-2.35,0.29l-1.98,-0.01l-0.13,0.03l-1.32,0.63l-1.28,0.38l-0.21,0.33l0.33,2.65l-0.78,-0.04l-0.14,-0.39l-0.07,-1.04l-0.41,-0.26l-1.72,0.71l-0.96,-0.43l-1.63,-0.86l0.65,-1.95l-0.19,-0.38l-1.43,-0.46l-0.56,-2.27l-0.34,-0.22l-2.26,0.38l0.25,-2.65l2.29,-2.15l0.09,-0.2l0.1,-2.21l-0.07,-2.09l-0.15,-0.25l-1.02,-0.6l-0.8,-1.52l-0.31,-0.16l-1.42,0.2l-2.16,-0.32l0.55,-0.74l0.01,-0.35l-1.17,-1.7l-0.41,-0.08l-1.67,1.07l-1.97,-0.63l-0.25,0.03l-2.89,1.73l-2.26,1.99l-1.82,0.3l-1.0,-0.66l-0.15,-0.05l-1.28,-0.06l-1.75,-0.61l-0.24,0.02l-1.35,0.69l-0.1,0.08l-1.2,1.45l-0.14,-1.41l-0.4,-0.25l-1.46,0.55l-2.83,-0.26l-2.77,-0.61l-1.99,-1.17l-1.91,-0.54l-0.78,-1.21l-0.17,-0.13l-1.36,-0.38l-2.54,-1.79l-2.01,-0.84l-0.28,0.02l-0.89,0.56l-3.31,-1.83l-2.35,-1.67l-0.57,-2.49l1.34,0.28l0.36,-0.28l0.08,-1.42l-0.05,-0.19l-0.93,-1.34l0.24,-2.18l-0.07,-0.22l-2.69,-3.32l-0.15,-0.1l-3.97,-1.11l-0.69,-2.05l-0.11,-0.15l-1.79,-1.3l-0.39,-0.73l-0.36,-1.57l0.08,-1.09l-0.18,-0.3l-1.52,-0.66l-0.22,-0.01l-0.51,0.18l-0.52,-2.21l0.59,-0.55l0.06,-0.35l-0.22,-0.44l2.12,-1.24l1.63,-0.55l2.58,0.39l0.31,-0.16l0.87,-1.75l3.05,-0.34l0.21,-0.12l0.84,-1.12l3.87,-1.59l0.15,-0.14l0.35,-0.68l0.03,-0.17l-0.17,-1.51l1.52,-0.7l0.15,-0.39l-2.12,-5.0l4.62,-1.15l1.35,-0.72l0.14,-0.17l1.72,-5.37l4.7,0.99l0.28,-0.08l1.39,-1.43l0.08,-0.2l0.11,-2.95l1.83,-0.26l0.18,-0.1l1.85,-2.08l0.61,-0.17l0.57,1.97l0.1,0.15l2.2,1.75l3.48,1.17l1.59,2.36l-0.93,3.53l0.04,0.24l0.9,1.35l0.2,0.13l2.98,0.53l3.32,0.43l2.97,1.89l1.49,0.35l1.08,2.67l1.52,1.88l0.24,0.11l2.74,-0.07l5.15,0.67l3.36,-0.41l2.39,0.43l3.67,1.81l0.13,0.03l2.92,-0.0l1.02,0.86l0.34,0.03l2.88,-1.59l3.98,-1.03l3.81,-0.13l3.02,-1.12l1.77,-1.61l1.73,-1.01l0.13,-0.37l-0.41,-1.01l-0.72,-1.07l1.09,-1.66l1.21,0.24l2.57,0.63l0.24,-0.04l2.46,-1.62l3.78,-1.19l0.13,-0.09l1.8,-2.03l1.66,-0.84l3.54,-0.41l1.93,0.35l0.34,-0.22l0.27,-1.12l-0.08,-0.29l-2.27,-2.22l-2.08,-1.07l-0.29,0.01l-1.82,1.12l-2.36,-0.47l-0.14,0.01l-1.18,0.34l-0.46,-0.94l1.69,-3.08l1.1,-2.21l2.75,1.12l0.26,-0.02l3.53,-2.06l0.15,-0.26l-0.02,-1.35l2.18,-3.39l1.35,-1.04l0.12,-0.24l-0.03,-1.85l-0.15,-0.25l-1.0,-0.58l1.68,-1.37l3.01,-0.59l3.25,-0.09l3.67,0.99l2.08,1.18l1.51,3.3l0.95,1.45l0.85,1.99l0.92,3.19ZM697.0,237.37l-1.95,1.12l-1.74,-0.68l-0.06,-1.9l1.08,-1.03l2.62,-0.7l1.23,0.05l0.37,0.65l-1.01,1.08l-0.54,1.4Z\", \"name\": \"China\"}, \"CM\": {\"path\": \"M453.76,278.92l-0.26,-0.11l-0.18,-0.02l-1.42,0.31l-1.56,-0.33l-1.17,0.16l-3.7,-0.05l0.3,-1.63l-0.04,-0.21l-0.98,-1.66l-0.15,-0.13l-1.03,-0.38l-0.46,-1.01l-0.13,-0.14l-0.48,-0.27l0.02,-0.46l0.62,-1.72l1.1,-2.25l0.54,-0.02l0.2,-0.09l1.41,-1.39l0.73,-0.03l1.32,0.97l0.31,0.03l1.72,-0.85l0.16,-0.2l0.22,-1.0l0.57,-1.03l0.36,-1.18l1.26,-0.98l0.1,-0.15l0.49,-1.7l0.48,-0.51l0.07,-0.13l0.35,-1.3l0.63,-1.54l2.06,-1.92l0.09,-0.17l0.12,-0.79l0.24,-0.41l-0.04,-0.36l-0.89,-0.91l0.04,-0.45l0.28,-0.06l0.85,1.39l0.16,1.59l-0.09,1.66l0.04,0.17l1.09,1.84l-0.86,-0.02l-0.72,0.17l-1.07,-0.24l-0.34,0.17l-0.54,1.19l0.06,0.34l1.48,1.47l1.06,0.44l0.32,0.94l0.73,1.6l-0.32,0.57l-1.23,2.49l-0.54,0.41l-0.12,0.21l-0.19,1.95l0.24,1.08l-0.18,0.67l0.07,0.28l1.13,1.25l0.24,0.93l0.92,1.29l1.1,0.8l0.1,1.01l0.26,0.73l-0.12,0.93l-1.65,-0.49l-2.02,-0.66l-3.19,-0.11Z\", \"name\": \"Cameroon\"}, \"CL\": {\"path\": \"M246.8,429.1l-1.14,0.78l-2.25,1.21l-0.16,0.23l-0.37,2.94l-0.75,0.06l-2.72,-1.07l-2.83,-2.34l-3.06,-1.9l-0.71,-1.92l0.67,-1.84l-0.02,-0.25l-1.22,-2.13l-0.31,-5.41l1.02,-2.95l2.59,-2.4l-0.13,-0.51l-3.32,-0.8l2.06,-2.4l0.07,-0.15l0.79,-4.77l2.44,0.95l0.4,-0.22l1.31,-6.31l-0.16,-0.33l-1.68,-0.8l-0.42,0.21l-0.72,3.47l-1.01,-0.27l0.74,-4.06l0.85,-5.46l1.12,-1.96l0.03,-0.22l-0.71,-2.82l-0.19,-2.94l0.76,-0.07l0.26,-0.2l1.53,-4.62l1.73,-4.52l1.07,-4.2l-0.56,-4.2l0.73,-2.2l0.01,-0.12l-0.29,-3.3l1.46,-3.34l0.45,-5.19l0.8,-5.52l0.78,-5.89l-0.18,-4.33l-0.49,-3.47l1.1,-0.56l0.13,-0.13l0.44,-0.88l0.9,1.29l0.32,1.8l0.1,0.18l1.16,0.97l-0.73,2.33l0.01,0.21l1.33,2.91l0.97,3.6l0.35,0.22l1.57,-0.31l0.16,0.34l-0.79,2.51l-2.61,1.25l-0.17,0.28l0.08,4.36l-0.48,0.79l0.01,0.33l0.6,0.84l-1.62,1.55l-1.67,2.6l-0.89,2.47l-0.02,0.13l0.23,2.56l-1.5,2.76l-0.03,0.21l1.15,4.8l0.11,0.17l0.54,0.42l-0.01,2.37l-1.4,2.7l-0.03,0.15l0.06,2.25l-1.8,1.78l-0.09,0.21l0.02,2.73l0.71,2.63l-1.33,0.94l-0.12,0.17l-0.67,2.64l-0.59,3.03l0.4,3.55l-0.84,0.51l-0.14,0.31l0.58,3.5l0.08,0.16l0.96,0.99l-0.7,1.08l0.11,0.43l1.04,0.55l0.19,0.8l-0.89,0.48l-0.16,0.31l0.26,1.77l-0.89,4.06l-1.31,2.67l-0.03,0.19l0.28,1.53l-0.73,1.88l-1.85,1.37l-0.12,0.26l0.22,3.46l0.06,0.16l0.88,1.19l0.28,0.12l1.32,-0.17l-0.04,2.13l0.04,0.15l1.04,1.95l0.24,0.16l5.94,0.44ZM248.79,430.71l0.0,7.41l0.3,0.3l2.67,0.0l1.01,0.06l-0.54,0.91l-1.99,1.01l-1.13,-0.1l-1.42,-0.27l-1.87,-1.06l-2.57,-0.49l-3.09,-1.9l-2.52,-1.83l-2.65,-2.93l0.93,0.32l3.54,2.29l3.32,1.23l0.34,-0.09l1.29,-1.57l0.83,-2.32l2.11,-1.28l1.43,0.32Z\", \"name\": \"Chile\"}, \"CA\": {\"path\": \"M280.14,145.66l-1.66,2.88l0.06,0.37l0.37,0.03l1.5,-1.01l1.17,0.49l-0.64,0.83l0.13,0.46l2.22,0.89l0.28,-0.03l1.02,-0.7l2.09,0.83l-0.69,2.1l0.37,0.38l1.43,-0.45l0.27,1.43l0.74,1.88l-0.95,2.5l-0.88,0.09l-1.34,-0.48l0.49,-2.34l-0.14,-0.32l-0.7,-0.4l-0.36,0.04l-2.81,2.66l-0.63,-0.05l1.2,-1.01l-0.1,-0.52l-2.4,-0.77l-2.79,0.18l-4.65,-0.09l-0.22,-0.54l1.37,-0.99l0.01,-0.48l-0.82,-0.65l1.91,-1.79l2.57,-5.17l1.49,-1.81l2.04,-1.07l0.63,0.08l-0.27,0.51l-1.33,2.07ZM193.92,74.85l-0.01,4.24l0.19,0.28l0.33,-0.07l3.14,-3.22l2.65,2.5l-0.71,3.04l0.06,0.26l2.42,2.88l0.46,0.0l2.66,-3.14l1.83,-3.74l0.03,-0.12l0.13,-4.53l3.23,0.31l3.63,0.64l3.18,2.08l0.13,1.91l-1.79,2.22l-0.0,0.37l1.69,2.2l-0.28,1.8l-4.74,2.84l-3.33,0.62l-2.5,-1.21l-0.41,0.17l-0.73,2.05l-2.39,3.44l-0.74,1.78l-2.78,2.61l-3.48,0.26l-0.17,0.07l-1.98,1.68l-0.1,0.21l-0.15,2.33l-2.68,0.45l-0.17,0.09l-3.1,3.2l-2.75,4.38l-0.99,3.06l-0.14,4.31l0.25,0.31l3.5,0.58l1.07,3.24l1.18,2.76l0.34,0.18l3.43,-0.69l4.55,1.52l2.45,1.32l1.76,1.65l0.12,0.07l3.11,0.96l2.63,1.46l0.13,0.04l4.12,0.2l2.41,0.3l-0.36,2.81l0.8,3.51l1.81,3.78l0.08,0.1l3.73,3.17l0.34,0.03l1.93,-1.08l0.13,-0.15l1.35,-3.44l0.01,-0.18l-1.31,-5.38l-0.08,-0.14l-1.46,-1.5l3.68,-1.51l2.84,-2.46l1.45,-2.55l0.04,-0.17l-0.2,-2.39l-0.04,-0.12l-1.7,-3.07l-2.9,-2.64l2.79,-3.66l0.05,-0.27l-1.08,-3.38l-0.8,-5.75l1.45,-0.75l4.18,1.03l2.6,0.38l0.18,-0.03l1.93,-0.95l2.18,1.23l3.01,2.18l0.73,1.42l0.25,0.16l4.18,0.27l-0.06,2.95l0.83,4.7l0.22,0.24l2.19,0.55l1.75,2.08l0.38,0.07l3.63,-2.03l0.11,-0.11l2.38,-4.06l1.36,-1.43l1.76,3.01l3.26,4.68l2.68,4.19l-0.94,2.09l0.12,0.38l3.31,1.98l2.23,1.98l0.13,0.07l3.94,0.89l1.48,1.02l0.96,2.82l0.22,0.2l1.85,0.43l0.88,1.13l0.17,3.53l-1.68,1.16l-1.76,1.14l-4.08,1.17l-0.11,0.06l-3.08,2.65l-4.11,0.52l-5.35,-0.69l-3.76,-0.02l-2.62,0.23l-0.2,0.1l-2.05,2.29l-3.13,1.41l-0.11,0.08l-3.6,4.24l-2.87,2.92l-0.05,0.36l0.33,0.14l2.13,-0.52l0.15,-0.08l3.98,-4.15l5.16,-2.63l3.58,-0.31l1.82,1.3l-2.09,1.91l-0.09,0.29l0.8,3.46l0.82,2.37l0.15,0.17l3.25,1.56l0.16,0.03l4.14,-0.45l0.21,-0.12l2.03,-2.86l0.11,1.46l0.13,0.22l1.26,0.88l-2.7,1.78l-5.51,1.83l-2.52,1.26l-2.75,2.16l-1.52,-0.18l-0.08,-2.16l4.19,-2.47l0.14,-0.34l-0.3,-0.22l-4.01,0.1l-2.66,0.36l-1.45,-1.56l0.0,-4.16l-0.11,-0.23l-1.11,-0.91l-0.28,-0.05l-1.5,0.48l-0.7,-0.7l-0.45,0.02l-1.91,2.39l-0.8,2.5l-0.82,1.31l-0.95,0.43l-0.77,0.15l-0.23,0.2l-0.18,0.56l-8.2,0.02l-0.13,0.03l-1.19,0.61l-2.95,2.45l-0.78,1.13l-4.6,0.01l-0.12,0.02l-1.13,0.48l-0.13,0.44l0.37,0.55l0.2,0.82l-0.01,0.09l-3.1,1.42l-2.63,0.5l-2.84,1.57l-0.47,0.0l-0.72,-0.4l-0.18,-0.27l0.03,-0.15l0.52,-1.0l1.2,-1.71l0.73,-1.8l0.02,-0.17l-1.03,-5.47l-0.15,-0.21l-2.35,-1.32l0.16,-0.29l-0.05,-0.35l-0.37,-0.38l-0.22,-0.09l-0.56,0.0l-0.35,-0.34l-0.11,-0.65l-0.46,-0.2l-0.39,0.26l-0.2,-0.03l-0.11,-0.33l-0.48,-0.25l-0.21,-0.71l-0.15,-0.18l-3.97,-2.07l-4.8,-2.39l-0.25,-0.01l-2.19,0.89l-0.72,0.03l-3.04,-0.82l-0.14,-0.0l-1.94,0.4l-2.4,-0.98l-2.56,-0.51l-1.7,-0.19l-0.62,-0.44l-0.42,-1.67l-0.3,-0.23l-0.85,0.02l-0.29,0.3l-0.01,0.95l-69.26,-0.01l-4.77,-3.14l-1.78,-1.41l-4.51,-1.38l-1.3,-2.73l0.34,-1.96l-0.17,-0.33l-3.06,-1.37l-0.41,-2.58l-0.11,-0.18l-2.92,-2.4l-0.05,-1.53l1.32,-1.59l0.07,-0.2l-0.07,-2.21l-0.16,-0.26l-4.19,-2.22l-2.52,-4.02l-1.56,-2.6l-0.08,-0.09l-2.28,-1.64l-1.65,-1.48l-1.31,-1.89l-0.38,-0.1l-2.51,1.21l-2.28,1.92l-2.03,-2.22l-1.85,-1.71l-2.44,-1.04l-2.28,-0.12l0.03,-37.72l4.27,0.98l4.0,2.13l2.61,0.4l0.24,-0.07l2.17,-1.81l2.92,-1.33l3.63,0.53l0.18,-0.03l3.72,-1.94l3.89,-1.06l1.6,1.72l0.37,0.06l1.87,-1.04l0.14,-0.19l0.48,-1.83l1.37,0.38l4.18,3.96l0.41,0.0l2.89,-2.62l0.28,2.79l0.37,0.26l3.08,-0.73l0.17,-0.12l0.85,-1.16l2.81,0.24l3.83,1.86l5.86,1.61l3.46,0.75l2.44,-0.26l2.89,1.89l-3.12,1.89l-0.14,0.31l0.24,0.24l4.53,0.92l6.84,-0.5l2.04,-0.71l2.54,2.44l0.39,0.02l2.72,-2.16l-0.01,-0.48l-2.26,-1.61l1.27,-1.16l2.94,-0.19l1.94,-0.42l1.89,0.97l2.49,2.32l0.24,0.08l2.71,-0.33l4.35,1.9l0.17,0.02l3.86,-0.67l3.62,0.1l0.31,-0.33l-0.26,-2.44l1.9,-0.65l3.58,1.36l-0.01,3.84l0.23,0.29l0.34,-0.17l1.51,-3.23l1.81,0.1l0.31,-0.22l1.13,-4.37l-0.08,-0.29l-2.68,-2.73l-2.83,-1.76l0.19,-4.73l2.77,-3.15l3.06,0.69l2.44,1.97l3.24,4.88l-2.05,2.02l0.15,0.51l4.41,0.85ZM265.85,150.7l-0.84,0.04l-3.15,-0.99l-1.77,-1.17l0.19,-0.06l3.17,0.79l2.39,1.27l0.01,0.12ZM249.41,3.71l6.68,0.49l5.34,0.79l4.34,1.6l-0.08,1.24l-5.91,2.56l-6.03,1.21l-2.36,1.38l-0.14,0.34l0.29,0.22l4.37,-0.02l-4.96,3.01l-4.06,1.64l-0.11,0.08l-4.21,4.62l-5.07,0.92l-0.12,0.05l-1.53,1.1l-7.5,0.59l-0.28,0.28l0.24,0.31l2.67,0.54l-1.04,0.6l-0.09,0.44l1.89,2.49l-2.11,1.66l-3.83,1.52l-0.15,0.13l-1.14,2.01l-3.41,1.55l-0.16,0.36l0.35,1.19l0.3,0.22l3.98,-0.19l0.03,0.78l-6.42,2.99l-6.44,-1.41l-7.41,0.79l-3.72,-0.62l-4.48,-0.26l-0.25,-2.0l4.37,-1.13l0.21,-0.38l-1.14,-3.55l1.13,-0.28l6.61,2.29l0.35,-0.12l-0.04,-0.37l-3.41,-3.45l-0.14,-0.08l-3.57,-0.92l1.62,-1.7l4.36,-1.3l0.2,-0.18l0.71,-1.94l-0.12,-0.36l-3.45,-2.15l-0.88,-2.43l6.36,0.23l1.94,0.61l0.23,-0.02l3.91,-2.1l0.15,-0.32l-0.26,-0.24l-5.69,-0.67l-8.69,0.37l-4.3,-1.92l-2.12,-2.39l-2.82,-1.68l-0.44,-1.65l3.41,-1.06l2.93,-0.2l4.91,-0.99l3.69,-2.28l2.93,0.31l2.64,1.68l0.42,-0.1l1.84,-3.23l3.17,-0.96l4.45,-0.69l7.56,-0.26l1.26,0.64l0.18,0.03l7.2,-1.06l10.81,0.8ZM203.94,57.59l0.01,0.32l1.97,2.97l0.51,-0.01l2.26,-3.75l6.05,-1.89l4.08,4.72l-0.36,2.95l0.38,0.33l4.95,-1.36l0.11,-0.05l2.23,-1.77l5.37,2.31l3.32,2.14l0.3,1.89l0.36,0.25l4.48,-1.01l2.49,2.8l0.14,0.09l5.99,1.78l2.09,1.74l2.18,3.83l-4.29,1.91l-0.01,0.54l5.9,2.83l3.95,0.94l3.54,3.84l0.2,0.1l3.58,0.25l-0.67,2.51l-4.18,4.54l-2.84,-1.61l-3.91,-3.95l-0.26,-0.09l-3.24,0.52l-0.25,0.26l-0.32,2.37l0.1,0.26l2.63,2.38l3.42,1.89l0.96,1.0l1.57,3.8l-0.74,2.43l-2.85,-0.96l-6.26,-3.15l-0.38,0.09l0.04,0.39l3.54,3.4l2.55,2.31l0.23,0.78l-6.26,-1.43l-5.33,-2.25l-2.73,-1.73l0.67,-0.86l-0.09,-0.45l-7.38,-4.01l-0.44,0.27l0.03,0.89l-6.85,0.61l-1.8,-1.17l1.43,-2.6l4.56,-0.07l5.15,-0.52l0.23,-0.45l-0.76,-1.34l0.8,-1.89l3.21,-4.06l0.05,-0.29l-0.72,-1.95l-0.97,-1.47l-0.11,-0.1l-3.84,-2.1l-4.53,-1.33l1.09,-0.75l0.05,-0.45l-2.65,-2.75l-0.18,-0.09l-2.12,-0.24l-1.91,-1.47l-0.39,0.02l-1.27,1.25l-4.4,0.56l-9.06,-0.99l-5.28,-1.31l-4.01,-0.67l-1.72,-1.31l2.32,-1.85l0.1,-0.33l-0.28,-0.2l-3.3,-0.02l-0.74,-4.36l1.86,-4.09l2.46,-1.88l5.74,-1.15l-1.5,2.55ZM261.28,159.28l0.19,0.14l1.82,0.42l1.66,-0.05l-0.66,0.68l-0.75,0.16l-3.0,-1.25l-0.46,-0.77l0.51,-0.52l0.68,1.19ZM230.87,84.48l-2.48,0.19l-0.52,-1.74l0.96,-2.17l2.03,-0.53l1.71,1.04l0.02,1.6l-0.22,0.46l-1.5,1.16ZM229.52,58.19l0.14,0.82l-4.99,-0.22l-2.73,0.63l-0.59,-0.23l-2.61,-2.4l0.08,-1.38l0.94,-0.25l5.61,0.51l4.14,2.54ZM222.12,105.0l-0.79,1.63l-0.75,-0.22l-0.52,-0.91l0.04,-0.09l0.84,-1.01l0.74,0.06l0.44,0.55ZM183.77,38.22l2.72,1.65l0.16,0.04l4.83,-0.01l1.92,1.52l-0.51,1.75l0.18,0.36l2.84,1.14l1.56,1.19l0.16,0.06l3.37,0.22l3.65,0.42l4.07,-1.1l5.05,-0.43l3.96,0.35l2.53,1.8l0.48,1.79l-1.37,1.16l-3.6,1.03l-3.22,-0.59l-7.17,0.76l-5.1,0.09l-4.0,-0.6l-6.48,-1.56l-0.81,-2.57l-0.3,-2.49l-0.1,-0.19l-2.51,-2.25l-0.16,-0.07l-5.12,-0.63l-2.61,-1.45l0.75,-1.71l4.88,0.32ZM207.46,91.26l0.42,1.62l0.42,0.19l1.12,-0.55l1.35,0.99l2.74,1.39l2.73,1.2l0.2,1.74l0.35,0.26l1.72,-0.29l1.31,0.97l-1.72,0.96l-3.68,-0.9l-1.34,-1.71l-0.43,-0.04l-2.46,2.1l-3.23,1.85l-0.74,-1.98l-0.31,-0.19l-2.47,0.28l1.49,-1.34l0.1,-0.19l0.32,-3.15l0.79,-3.45l1.34,0.25ZM215.59,102.66l-2.73,2.0l-1.49,-0.08l-0.37,-0.7l1.61,-1.56l3.0,0.03l-0.02,0.3ZM202.79,24.07l0.11,0.12l2.54,1.53l-3.01,1.47l-4.55,4.07l-4.3,0.38l-5.07,-0.68l-2.51,-2.09l0.03,-1.72l1.86,-1.4l0.1,-0.34l-0.29,-0.2l-4.49,0.04l-2.63,-1.79l-1.45,-2.36l1.61,-2.38l1.65,-1.69l2.47,-0.4l0.19,-0.48l-0.72,-0.89l5.1,-0.26l3.1,3.05l0.13,0.07l4.21,1.25l3.99,1.06l1.92,3.65ZM187.5,59.3l-0.15,0.1l-2.59,3.4l-2.5,-0.15l-1.47,-3.92l0.04,-2.24l1.22,-1.92l2.34,-1.26l5.11,0.17l4.28,1.06l-3.36,3.86l-2.9,0.9ZM186.19,48.8l-1.15,1.63l-3.42,-0.35l-2.68,-1.15l1.11,-1.88l3.34,-1.27l2.01,1.63l0.79,1.38ZM185.78,35.41l-0.95,0.13l-4.48,-0.33l-0.4,-0.91l4.5,0.07l1.45,0.82l-0.1,0.21ZM180.76,32.56l-3.43,1.03l-1.85,-1.14l-1.01,-1.92l-0.16,-1.87l2.87,0.2l1.39,0.35l2.75,1.75l-0.55,1.6ZM181.03,76.32l-1.21,1.2l-3.19,-1.26l-0.18,-0.01l-1.92,0.45l-2.88,-1.67l1.84,-1.16l1.6,-1.77l2.45,1.17l1.45,0.77l2.05,2.28ZM169.72,54.76l2.83,0.97l0.14,0.01l4.25,-0.58l0.47,1.01l-2.19,2.16l0.07,0.48l3.61,1.95l-0.41,3.84l-3.87,1.68l-2.23,-0.36l-1.73,-1.75l-6.07,-3.53l0.03,-1.01l4.79,0.55l0.3,-0.16l-0.04,-0.34l-2.55,-2.89l2.59,-2.05ZM174.44,40.56l1.49,1.87l0.07,2.48l-1.07,3.52l-3.87,0.48l-2.41,-0.72l0.05,-2.72l-0.33,-0.3l-3.79,0.36l-0.13,-3.31l2.36,0.14l0.15,-0.03l3.7,-1.74l3.44,0.29l0.31,-0.22l0.03,-0.12ZM170.14,31.5l0.75,1.74l-3.52,-0.52l-4.19,-1.77l-4.65,-0.17l1.65,-1.11l-0.05,-0.52l-2.86,-1.26l-0.13,-1.58l4.52,0.7l6.66,1.99l1.84,2.5ZM134.64,58.08l-1.08,1.93l0.34,0.44l5.44,-1.41l3.37,2.32l0.37,-0.02l2.66,-2.28l2.03,1.38l2.01,4.53l0.53,0.04l1.26,-1.93l0.03,-0.27l-1.67,-4.55l1.82,-0.58l2.36,0.73l2.69,1.84l1.53,4.46l0.77,3.24l0.15,0.19l4.22,2.26l4.32,2.04l-0.21,1.51l-3.87,0.34l-0.19,0.5l1.45,1.54l-0.65,1.23l-4.3,-0.65l-4.4,-1.19l-2.97,0.28l-4.67,1.48l-6.31,0.65l-4.27,0.39l-1.26,-1.91l-0.15,-0.12l-3.42,-1.2l-0.16,-0.01l-2.05,0.45l-2.66,-3.02l1.2,-0.34l3.82,-0.76l3.58,0.19l3.27,-0.78l0.23,-0.29l-0.24,-0.29l-4.84,-1.06l-5.42,0.35l-3.4,-0.09l-0.97,-1.22l5.39,-1.7l0.21,-0.33l-0.3,-0.25l-3.82,0.06l-3.95,-1.1l1.88,-3.13l1.68,-1.81l6.54,-2.84l2.11,0.77ZM158.85,56.58l-1.82,2.62l-3.38,-2.9l0.49,-0.39l3.17,-0.18l1.54,0.86ZM149.71,42.7l1.0,1.87l0.37,0.14l2.17,-0.83l2.33,0.2l0.38,2.16l-1.38,2.17l-8.33,0.76l-6.34,2.15l-3.51,0.1l-0.22,-1.13l4.98,-2.12l0.17,-0.34l-0.31,-0.23l-11.27,0.6l-3.04,-0.78l3.14,-4.57l2.2,-1.35l6.87,1.7l4.4,3.0l0.14,0.05l4.37,0.39l0.27,-0.48l-3.41,-4.68l1.96,-1.62l2.28,0.53l0.79,2.32ZM145.44,29.83l-2.18,0.77l-3.79,-0.0l0.02,-0.31l2.34,-1.5l1.2,0.23l2.42,0.83ZM144.83,34.5l-4.44,1.46l-3.18,-1.48l1.6,-1.36l3.51,-0.53l3.1,0.75l-0.6,1.16ZM119.02,65.87l-6.17,2.07l-1.19,-1.82l-0.13,-0.11l-5.48,-2.32l0.92,-1.7l1.73,-3.44l2.16,-3.15l-0.02,-0.36l-2.09,-2.56l7.84,-0.71l3.59,1.02l6.32,0.27l2.35,1.37l2.25,1.71l-2.68,1.04l-6.21,3.41l-3.1,3.28l-0.08,0.21l0.0,1.81ZM129.66,35.4l-0.3,3.55l-1.77,1.67l-2.34,0.27l-4.62,2.2l-3.89,0.76l-2.83,-0.93l3.85,-3.52l5.04,-3.36l3.75,0.07l3.11,-0.7ZM111.24,152.74l-0.82,0.29l-3.92,-1.39l-0.7,-1.06l-0.12,-0.1l-2.15,-1.09l-0.41,-0.84l-0.2,-0.16l-2.44,-0.56l-0.84,-1.56l0.1,-0.36l2.34,0.64l1.53,0.5l2.28,0.34l0.78,1.04l1.24,1.55l0.09,0.08l2.42,1.3l0.81,1.39ZM88.54,134.82l0.14,0.02l2.0,-0.23l-0.67,3.48l0.06,0.24l1.78,2.22l-0.24,-0.0l-1.4,-1.42l-0.91,-1.53l-1.26,-1.08l-0.42,-1.35l0.09,-0.66l0.82,0.31Z\", \"name\": \"Canada\"}, \"CG\": {\"path\": \"M453.66,296.61l-0.9,-0.82l-0.35,-0.04l-0.83,0.48l-0.77,0.83l-1.65,-2.13l1.66,-1.2l0.08,-0.39l-0.81,-1.43l0.59,-0.43l1.62,-0.29l0.24,-0.24l0.1,-0.58l0.94,0.84l0.19,0.08l2.21,0.11l0.27,-0.14l0.81,-1.29l0.32,-1.76l-0.27,-1.96l-0.06,-0.15l-1.08,-1.35l1.02,-2.74l-0.09,-0.34l-0.62,-0.5l-0.22,-0.06l-1.66,0.18l-0.55,-1.03l0.12,-0.73l2.85,0.09l1.98,0.65l2.0,0.59l0.38,-0.25l0.17,-1.3l1.26,-2.24l1.34,-1.19l1.54,0.38l1.35,0.12l-0.11,1.15l-0.74,1.34l-0.5,1.61l-0.31,2.22l0.12,1.41l-0.4,0.9l-0.06,0.88l-0.24,0.67l-1.57,1.15l-1.24,1.41l-1.09,2.43l-0.03,0.13l0.08,1.95l-0.55,0.69l-1.46,1.23l-1.32,1.41l-0.61,-0.29l-0.13,-0.57l-0.29,-0.23l-1.36,-0.02l-0.23,0.1l-0.72,0.81l-0.41,-0.16Z\", \"name\": \"Republic of the Congo\"}, \"CF\": {\"path\": \"M459.41,266.56l1.9,-0.17l0.22,-0.12l0.36,-0.5l0.14,0.02l0.55,0.51l0.29,0.07l3.15,-0.96l0.12,-0.07l1.05,-0.97l1.29,-0.87l0.12,-0.33l-0.17,-0.61l0.38,-0.12l2.36,0.15l0.15,-0.03l2.36,-1.17l0.12,-0.1l1.78,-2.72l1.18,-0.96l1.23,-0.34l0.21,0.79l0.07,0.13l1.37,1.5l0.01,0.86l-0.39,1.0l-0.01,0.17l0.16,0.78l0.1,0.17l0.91,0.76l1.89,1.09l1.24,0.92l0.02,0.67l0.12,0.23l1.67,1.3l0.99,1.03l0.61,1.46l0.14,0.15l1.79,0.95l0.2,0.4l-0.44,0.14l-1.54,-0.06l-1.98,-0.26l-0.93,0.22l-0.19,0.14l-0.3,0.48l-0.57,0.05l-0.91,-0.49l-0.26,-0.01l-2.7,1.21l-1.04,-0.23l-0.21,0.03l-0.34,0.19l-0.12,0.13l-0.64,1.3l-1.67,-0.43l-1.77,-0.24l-1.58,-0.91l-2.06,-0.85l-0.27,0.02l-1.42,0.88l-0.97,1.27l-0.06,0.14l-0.19,1.46l-1.3,-0.11l-1.67,-0.42l-0.27,0.07l-1.55,1.41l-0.99,1.76l-0.14,-1.18l-0.13,-0.22l-1.1,-0.78l-0.86,-1.2l-0.2,-0.84l-0.07,-0.13l-1.07,-1.19l0.16,-0.59l0.0,-0.15l-0.24,-1.01l0.18,-1.77l0.5,-0.38l0.09,-0.11l1.18,-2.4Z\", \"name\": \"Central African Republic\"}, \"CD\": {\"path\": \"M497.85,276.25l-0.14,2.77l0.2,0.3l0.57,0.19l-0.47,0.52l-1.0,0.71l-0.96,1.31l-0.56,1.22l-0.16,2.04l-0.54,0.89l-0.04,0.15l-0.02,1.76l-0.63,0.61l-0.09,0.2l-0.08,1.33l-0.2,0.11l-0.15,0.21l-0.23,1.37l0.03,0.2l0.6,1.08l0.16,2.96l0.44,2.29l-0.24,1.25l0.01,0.15l0.5,1.46l0.07,0.12l1.41,1.37l1.09,2.56l-0.51,-0.11l-3.45,0.45l-0.67,0.3l-0.15,0.15l-0.71,1.61l0.01,0.26l0.52,1.03l-0.43,2.9l-0.31,2.55l0.13,0.29l0.7,0.46l1.75,0.99l0.31,-0.01l0.26,-0.17l0.15,1.9l-1.44,-0.02l-0.94,-1.28l-0.94,-1.1l-0.17,-0.1l-1.76,-0.33l-0.5,-1.18l-0.42,-0.15l-1.44,0.75l-1.79,-0.32l-0.77,-1.05l-0.2,-0.12l-1.59,-0.23l-0.97,0.04l-0.1,-0.53l-0.27,-0.25l-0.86,-0.06l-1.13,-0.15l-1.62,0.37l-1.04,-0.06l-0.32,0.09l0.11,-2.56l-0.08,-0.21l-0.77,-0.87l-0.17,-1.41l0.36,-1.47l-0.03,-0.21l-0.48,-0.91l-0.04,-1.52l-0.3,-0.29l-2.65,0.02l0.13,-0.53l-0.29,-0.37l-1.28,0.01l-0.28,0.21l-0.07,0.24l-1.35,0.09l-0.26,0.18l-0.62,1.45l-0.25,0.42l-1.17,-0.3l-0.19,0.01l-0.79,0.34l-1.44,0.18l-1.41,-1.96l-0.7,-1.47l-0.61,-1.86l-0.28,-0.21l-7.39,-0.03l-0.92,0.3l-0.78,-0.03l-0.78,0.25l-0.11,-0.25l0.35,-0.15l0.18,-0.26l0.07,-1.02l0.33,-0.52l0.72,-0.42l0.52,0.2l0.33,-0.08l0.76,-0.86l0.99,0.02l0.11,0.48l0.16,0.2l0.94,0.44l0.35,-0.07l1.46,-1.56l1.44,-1.21l0.68,-0.85l0.06,-0.2l-0.08,-1.99l1.04,-2.33l1.1,-1.23l1.62,-1.19l0.11,-0.14l0.29,-0.8l0.08,-0.94l0.38,-0.82l0.03,-0.16l-0.13,-1.38l0.3,-2.16l0.47,-1.51l0.73,-1.31l0.04,-0.12l0.15,-1.51l0.21,-1.66l0.89,-1.16l1.16,-0.7l1.9,0.79l1.69,0.95l1.81,0.24l1.85,0.48l0.35,-0.16l0.71,-1.43l0.16,-0.09l1.03,0.23l0.19,-0.02l2.65,-1.19l0.86,0.46l0.17,0.03l0.81,-0.08l0.23,-0.14l0.31,-0.5l0.75,-0.17l1.83,0.26l1.64,0.06l0.72,-0.21l1.39,1.9l0.16,0.11l1.12,0.3l0.24,-0.04l0.58,-0.36l1.05,0.15l0.15,-0.02l1.15,-0.44l0.47,0.84l0.08,0.09l2.08,1.57Z\", \"name\": \"Democratic Republic of the Congo\"}, \"CZ\": {\"path\": \"M463.29,152.22l-0.88,-0.47l-0.18,-0.03l-1.08,0.15l-1.86,-0.94l-0.21,-0.02l-0.88,0.24l-0.13,0.07l-1.25,1.17l-1.63,-0.91l-1.38,-1.36l-1.22,-0.75l-0.24,-1.24l-0.33,-0.75l1.53,-0.6l0.98,-0.84l1.74,-0.62l0.11,-0.07l0.47,-0.47l0.46,0.27l0.24,0.03l0.96,-0.3l1.06,0.95l0.15,0.07l1.57,0.24l-0.1,0.6l0.16,0.32l1.36,0.68l0.41,-0.15l0.28,-0.62l1.29,0.28l0.19,0.84l0.26,0.23l1.73,0.18l0.74,1.02l-0.17,0.0l-0.25,0.13l-0.32,0.49l-0.46,0.11l-0.22,0.23l-0.13,0.57l-0.32,0.1l-0.2,0.22l-0.03,0.14l-0.65,0.25l-1.05,-0.05l-0.28,0.17l-0.22,0.43Z\", \"name\": \"Czech Republic\"}, \"CY\": {\"path\": \"M505.03,193.75l-1.51,0.68l-1.0,-0.3l-0.32,-0.63l0.69,-0.06l0.41,0.13l0.19,-0.0l0.62,-0.22l0.31,0.02l0.06,0.22l0.49,0.17l0.06,-0.01Z\", \"name\": \"Cyprus\"}, \"CR\": {\"path\": \"M213.0,263.84l-0.98,-0.4l-0.3,-0.31l0.16,-0.24l0.05,-0.21l-0.09,-0.56l-0.1,-0.18l-0.76,-0.65l-0.99,-0.5l-0.74,-0.28l-0.13,-0.58l-0.12,-0.18l-0.66,-0.45l-0.34,-0.0l-0.13,0.31l0.13,0.59l-0.17,0.21l-0.34,-0.42l-0.14,-0.1l-0.7,-0.22l-0.23,-0.34l0.01,-0.62l0.31,-0.74l-0.14,-0.38l-0.3,-0.15l0.47,-0.4l1.48,0.6l0.26,-0.02l0.47,-0.27l0.58,0.15l0.35,0.44l0.17,0.11l0.74,0.17l0.27,-0.07l0.3,-0.27l0.52,1.09l0.97,1.02l0.77,0.71l-0.41,0.1l-0.23,0.3l0.01,1.02l0.12,0.24l0.2,0.14l-0.07,0.05l-0.11,0.3l0.08,0.37l-0.23,0.63Z\", \"name\": \"Costa Rica\"}, \"CU\": {\"path\": \"M215.01,226.09l2.08,0.18l1.94,0.03l2.24,0.86l0.95,0.92l0.25,0.08l2.22,-0.28l0.79,0.55l3.68,2.81l0.19,0.06l0.77,-0.03l1.18,0.42l-0.12,0.47l0.27,0.37l1.78,0.1l1.59,0.9l-0.11,0.22l-1.5,0.3l-1.64,0.13l-1.75,-0.2l-2.69,0.19l1.0,-0.86l-0.03,-0.48l-1.02,-0.68l-0.13,-0.05l-1.52,-0.16l-0.74,-0.64l-0.57,-1.42l-0.3,-0.19l-1.36,0.1l-2.23,-0.67l-0.71,-0.52l-0.14,-0.06l-3.2,-0.4l-0.42,-0.25l0.56,-0.39l0.12,-0.33l-0.27,-0.22l-2.46,-0.13l-0.2,0.06l-1.72,1.31l-0.94,0.03l-0.25,0.15l-0.29,0.53l-1.04,0.24l-0.29,-0.07l0.7,-0.43l0.1,-0.11l0.5,-0.87l1.04,-0.54l1.23,-0.49l1.86,-0.25l0.62,-0.28Z\", \"name\": \"Cuba\"}, \"SZ\": {\"path\": \"M500.95,353.41l-0.41,0.97l-1.16,0.23l-1.29,-1.26l-0.02,-0.71l0.63,-0.93l0.23,-0.7l0.47,-0.12l1.04,0.4l0.32,1.05l0.2,1.08Z\", \"name\": \"Swaziland\"}, \"SY\": {\"path\": \"M510.84,199.83l0.09,-0.11l0.07,-0.2l-0.04,-1.08l0.56,-1.4l1.3,-1.01l0.1,-0.34l-0.41,-1.11l-0.24,-0.19l-0.89,-0.11l-0.2,-1.84l0.55,-1.05l1.3,-1.22l0.09,-0.19l0.09,-1.09l0.39,0.27l0.25,0.04l2.66,-0.77l1.35,0.52l2.06,-0.01l2.93,-1.08l1.35,0.04l2.14,-0.34l-0.83,1.16l-1.31,0.68l-0.16,0.3l0.23,2.03l-0.9,3.25l-5.43,2.87l-4.79,2.91l-2.32,-0.92Z\", \"name\": \"Syria\"}, \"KG\": {\"path\": \"M599.04,172.15l0.38,-0.9l1.43,-0.37l4.04,1.02l0.37,-0.23l0.36,-1.64l1.17,-0.52l3.45,1.24l0.2,-0.0l0.86,-0.31l4.09,0.08l3.61,0.31l1.18,1.02l0.11,0.06l1.19,0.34l-0.13,0.26l-3.84,1.58l-0.13,0.1l-0.81,1.08l-3.08,0.34l-0.24,0.16l-0.85,1.7l-2.43,-0.37l-0.14,0.01l-1.79,0.61l-2.39,1.4l-0.12,0.39l0.25,0.49l-0.48,0.45l-4.57,0.43l-3.04,-0.94l-2.45,0.18l0.14,-1.02l2.42,0.44l0.27,-0.08l0.81,-0.81l1.76,0.27l0.21,-0.05l3.21,-2.14l-0.03,-0.51l-2.97,-1.57l-0.26,-0.01l-1.64,0.69l-1.38,-0.84l1.81,-1.67l-0.09,-0.5l-0.46,-0.18Z\", \"name\": \"Kyrgyzstan\"}, \"KE\": {\"path\": \"M523.3,287.04l0.06,0.17l1.29,1.8l-1.46,0.84l-0.11,0.11l-0.55,0.93l-0.81,0.16l-0.24,0.24l-0.34,1.69l-0.81,1.06l-0.46,1.58l-0.76,0.63l-3.3,-2.3l-0.16,-1.32l-0.15,-0.23l-9.35,-5.28l-0.02,-2.4l1.92,-2.63l0.91,-1.83l0.01,-0.24l-1.09,-2.86l-0.29,-1.24l-1.09,-1.63l2.93,-2.85l0.92,0.3l0.0,1.19l0.09,0.22l0.86,0.83l0.21,0.08l1.65,0.0l3.09,2.08l0.16,0.05l0.79,0.03l0.54,-0.06l0.58,0.28l1.67,0.2l0.28,-0.12l0.69,-0.98l2.04,-0.94l0.86,0.73l0.19,0.07l1.1,0.0l-1.82,2.36l-0.06,0.18l0.03,9.12Z\", \"name\": \"Kenya\"}, \"SS\": {\"path\": \"M505.7,261.39l0.02,1.64l-0.27,0.55l-1.15,0.05l-0.24,0.15l-0.85,1.44l0.22,0.45l1.44,0.17l1.15,1.12l0.42,0.95l0.14,0.15l1.06,0.54l1.33,2.45l-3.06,2.98l-1.44,1.08l-1.75,0.01l-1.92,0.56l-1.5,-0.53l-0.27,0.03l-0.85,0.57l-1.98,-1.5l-0.56,-1.02l-0.37,-0.13l-1.32,0.5l-1.08,-0.15l-0.2,0.04l-0.56,0.35l-0.9,-0.24l-1.44,-1.97l-0.39,-0.77l-0.13,-0.13l-1.78,-0.94l-0.65,-1.5l-1.08,-1.12l-1.57,-1.22l-0.02,-0.68l-0.12,-0.23l-1.37,-1.02l-1.17,-0.68l0.2,-0.08l0.86,-0.48l0.14,-0.18l0.63,-2.22l0.6,-1.02l1.47,-0.28l0.35,0.56l1.29,1.48l0.14,0.09l0.69,0.22l0.22,-0.02l0.83,-0.4l1.58,0.08l0.26,0.39l0.25,0.13l2.49,0.0l0.3,-0.25l0.06,-0.35l1.13,-0.42l0.18,-0.18l0.22,-0.63l0.68,-0.38l1.95,1.37l0.23,0.05l1.29,-0.26l0.19,-0.12l1.23,-1.8l1.36,-1.37l0.08,-0.25l-0.21,-1.52l-0.06,-0.15l-0.25,-0.3l0.94,-0.08l0.26,-0.21l0.1,-0.32l0.6,0.09l-0.25,1.67l0.3,1.83l0.11,0.19l1.22,0.94l0.25,0.73l-0.04,1.2l0.26,0.31l0.09,0.01Z\", \"name\": \"South Sudan\"}, \"SR\": {\"path\": \"M278.1,270.26l2.71,0.45l0.31,-0.14l0.19,-0.32l1.82,-0.16l2.25,0.56l-1.09,1.81l-0.04,0.19l0.2,1.72l0.05,0.13l0.9,1.35l-0.39,0.99l-0.21,1.09l-0.48,0.8l-1.2,-0.44l-0.17,-0.01l-1.12,0.24l-0.95,-0.21l-0.35,0.2l-0.25,0.73l0.05,0.29l0.3,0.35l-0.06,0.13l-1.01,-0.15l-1.42,-2.03l-0.32,-1.36l-0.29,-0.23l-0.63,-0.0l-0.95,-1.56l0.41,-1.16l0.01,-0.17l-0.08,-0.35l1.29,-0.56l0.18,-0.22l0.35,-1.97Z\", \"name\": \"Suriname\"}, \"KH\": {\"path\": \"M680.28,257.89l-0.93,-1.2l-1.24,-2.56l-0.56,-2.9l1.45,-1.92l3.07,-0.46l2.26,0.35l2.03,0.98l0.38,-0.11l1.0,-1.55l1.86,0.79l0.52,1.51l-0.28,2.82l-4.05,1.88l-0.12,0.45l0.79,1.1l-2.2,0.17l-2.08,0.98l-1.89,-0.33Z\", \"name\": \"Cambodia\"}, \"SV\": {\"path\": \"M197.02,248.89l0.18,-0.05l0.59,0.17l0.55,0.51l0.64,0.35l0.06,0.22l0.37,0.21l1.01,-0.28l0.38,0.13l0.16,0.13l-0.14,0.81l-0.18,0.38l-1.22,-0.03l-0.84,-0.23l-1.11,-0.52l-1.31,-0.15l-0.49,-0.38l0.02,-0.08l0.76,-0.57l0.46,-0.27l0.11,-0.35Z\", \"name\": \"El Salvador\"}, \"SK\": {\"path\": \"M468.01,150.02l0.05,0.07l0.36,0.1l0.85,-0.37l1.12,1.02l0.33,0.05l1.38,-0.65l1.07,0.3l0.16,0.0l1.69,-0.43l1.95,1.02l-0.51,0.64l-0.45,1.2l-0.32,0.2l-2.55,-0.93l-0.17,-0.01l-0.82,0.2l-0.17,0.11l-0.53,0.68l-0.94,0.32l-0.14,-0.11l-0.29,-0.04l-1.18,0.48l-0.95,0.09l-0.26,0.21l-0.15,0.47l-1.84,0.34l-0.82,-0.31l-1.14,-0.73l-0.2,-0.89l0.42,-0.84l0.91,0.05l0.12,-0.02l0.86,-0.33l0.18,-0.21l0.03,-0.13l0.32,-0.1l0.2,-0.22l0.12,-0.55l0.39,-0.1l0.18,-0.13l0.3,-0.45l0.43,-0.0Z\", \"name\": \"Slovakia\"}, \"KR\": {\"path\": \"M737.31,185.72l0.84,0.08l0.27,-0.12l0.89,-1.2l1.63,-0.13l1.1,-0.2l0.21,-0.16l0.12,-0.24l1.86,2.95l0.59,1.79l0.02,3.17l-0.84,1.38l-2.23,0.55l-1.95,1.14l-1.91,0.21l-0.22,-1.21l0.45,-2.07l-0.01,-0.17l-0.99,-2.67l1.54,-0.4l0.17,-0.46l-1.55,-2.24Z\", \"name\": \"South Korea\"}, \"SI\": {\"path\": \"M455.77,159.59l1.79,0.21l0.18,-0.04l1.2,-0.68l2.12,-0.08l0.21,-0.1l0.38,-0.42l0.1,0.01l0.28,0.62l-1.71,0.71l-0.18,0.22l-0.21,1.1l-0.71,0.26l-0.2,0.28l0.01,0.55l-0.59,-0.04l-0.79,-0.47l-0.38,0.06l-0.36,0.41l-0.84,-0.05l0.05,-0.15l-0.56,-1.24l0.21,-1.17Z\", \"name\": \"Slovenia\"}, \"KP\": {\"path\": \"M747.76,172.02l-0.23,-0.04l-0.26,0.08l-1.09,1.02l-0.78,1.06l-0.06,0.19l0.09,1.95l-1.12,0.57l-0.53,0.58l-0.88,0.82l-1.69,0.51l-1.09,0.79l-0.12,0.22l-0.07,1.17l-0.22,0.25l0.09,0.47l0.96,0.46l1.22,1.1l-0.19,0.37l-0.91,0.16l-1.75,0.14l-0.22,0.12l-0.87,1.18l-0.95,-0.09l-0.3,0.18l-0.97,-0.44l-0.39,0.13l-0.25,0.44l-0.29,0.09l-0.03,-0.2l-0.18,-0.23l-0.62,-0.25l-0.43,-0.29l0.52,-0.97l0.52,-0.3l0.13,-0.38l-0.18,-0.42l0.59,-1.47l0.01,-0.21l-0.16,-0.48l-0.22,-0.2l-1.41,-0.31l-0.82,-0.55l1.74,-1.62l2.73,-1.58l1.62,-1.96l0.96,0.76l0.17,0.06l2.17,0.11l0.31,-0.37l-0.32,-1.31l3.61,-1.21l0.16,-0.13l0.79,-1.34l1.25,1.38Z\", \"name\": \"North Korea\"}, \"SO\": {\"path\": \"M543.8,256.48l0.61,-0.05l1.14,-0.37l1.31,-0.25l0.12,-0.05l1.11,-0.81l0.57,-0.0l0.03,0.39l-0.23,1.49l0.01,1.25l-0.52,0.92l-0.7,2.71l-1.19,2.79l-1.54,3.2l-2.13,3.66l-2.12,2.79l-2.92,3.39l-2.47,2.0l-3.76,2.5l-2.33,1.9l-2.77,3.06l-0.61,1.35l-0.28,0.29l-1.22,-1.69l-0.03,-8.92l2.12,-2.76l0.59,-0.68l1.47,-0.04l0.18,-0.06l2.15,-1.71l3.16,-0.11l0.21,-0.09l7.08,-7.55l1.76,-2.12l1.14,-1.57l0.06,-0.18l0.01,-4.67Z\", \"name\": \"Somalia\"}, \"SN\": {\"path\": \"M379.28,250.34l-0.95,-1.82l-0.09,-0.1l-0.83,-0.6l0.62,-0.28l0.13,-0.11l1.21,-1.8l0.6,-1.31l0.71,-0.68l1.09,0.2l0.18,-0.02l1.17,-0.53l1.25,-0.03l1.17,0.73l1.59,0.65l1.47,1.83l1.59,1.7l0.12,1.56l0.49,1.46l0.1,0.14l0.85,0.65l0.18,0.82l-0.08,0.57l-0.13,0.05l-1.29,-0.19l-0.29,0.13l-0.11,0.16l-0.35,0.04l-1.83,-0.61l-5.84,-0.13l-0.12,0.02l-0.6,0.26l-0.87,-0.06l-1.01,0.32l-0.26,-1.26l1.9,0.04l0.16,-0.04l0.54,-0.32l0.37,-0.02l0.15,-0.05l0.78,-0.5l0.92,0.46l0.12,0.03l1.09,0.04l0.15,-0.03l1.08,-0.57l0.11,-0.44l-0.51,-0.74l-0.39,-0.1l-0.76,0.39l-0.62,-0.01l-0.92,-0.58l-0.18,-0.05l-0.79,0.04l-0.2,0.09l-0.48,0.51l-2.41,0.06Z\", \"name\": \"Senegal\"}, \"SL\": {\"path\": \"M392.19,267.53l-0.44,-0.12l-1.73,-0.97l-1.24,-1.28l-0.4,-0.84l-0.27,-1.65l1.21,-1.0l0.09,-0.12l0.27,-0.66l0.32,-0.41l0.56,-0.05l0.16,-0.07l0.5,-0.41l1.75,0.0l0.59,0.77l0.49,0.96l-0.07,0.64l0.04,0.19l0.36,0.58l-0.03,0.84l0.24,0.2l-0.64,0.65l-1.13,1.37l-0.06,0.14l-0.12,0.66l-0.43,0.58Z\", \"name\": \"Sierra Leone\"}, \"SB\": {\"path\": \"M826.74,311.51l0.23,0.29l-0.95,-0.01l-0.39,-0.63l0.65,0.27l0.45,0.09ZM825.01,308.52l-1.18,-1.39l-0.37,-1.06l0.24,0.0l0.82,1.84l0.49,0.6ZM823.21,309.42l-0.44,0.03l-1.43,-0.24l-0.32,-0.24l0.08,-0.5l1.29,0.31l0.72,0.47l0.11,0.18ZM817.9,303.81l2.59,1.44l0.3,0.41l-1.21,-0.66l-1.34,-0.89l-0.34,-0.3ZM813.77,302.4l0.48,0.34l0.1,0.08l-0.33,-0.17l-0.25,-0.25Z\", \"name\": \"Solomon Islands\"}, \"SA\": {\"path\": \"M528.24,243.1l-0.2,-0.69l-0.07,-0.12l-0.69,-0.71l-0.18,-0.94l-0.12,-0.19l-1.24,-0.89l-1.28,-2.09l-0.7,-2.08l-0.07,-0.11l-1.73,-1.79l-0.11,-0.07l-1.03,-0.39l-1.57,-2.36l-0.27,-1.72l0.1,-1.53l-0.03,-0.15l-1.44,-2.93l-1.25,-1.13l-1.34,-0.56l-0.72,-1.33l0.11,-0.49l-0.02,-0.2l-0.7,-1.38l-0.08,-0.1l-0.68,-0.56l-0.97,-1.98l-2.8,-4.03l-0.25,-0.13l-0.85,0.01l0.29,-1.11l0.12,-0.97l0.23,-0.81l2.52,0.39l0.23,-0.06l1.08,-0.84l0.6,-0.95l1.78,-0.35l0.22,-0.17l0.37,-0.83l0.74,-0.42l0.08,-0.46l-2.17,-2.4l4.55,-1.26l0.12,-0.06l0.36,-0.32l2.83,0.71l3.67,1.91l7.04,5.5l0.17,0.06l4.64,0.22l2.06,0.24l0.55,1.15l0.28,0.17l1.56,-0.06l0.9,2.15l0.14,0.15l1.14,0.57l0.39,0.85l0.11,0.13l1.59,1.06l0.12,0.91l-0.23,0.83l0.01,0.18l0.32,0.9l0.07,0.11l0.68,0.7l0.33,0.86l0.37,0.65l0.09,0.1l0.76,0.53l0.25,0.04l0.45,-0.12l0.35,0.75l0.1,0.63l0.96,2.68l0.23,0.19l7.53,1.33l0.27,-0.09l0.24,-0.26l0.87,1.41l-1.58,4.96l-7.34,2.54l-7.28,1.02l-2.34,1.17l-0.12,0.1l-1.74,2.63l-0.86,0.32l-0.49,-0.68l-0.28,-0.12l-0.92,0.12l-2.32,-0.25l-0.41,-0.23l-0.15,-0.04l-2.89,0.06l-0.63,0.2l-0.91,-0.59l-0.43,0.11l-0.66,1.27l-0.03,0.21l0.21,0.89l-0.6,0.45Z\", \"name\": \"Saudi Arabia\"}, \"SE\": {\"path\": \"M476.42,90.44l-0.15,0.1l-2.43,2.86l-0.07,0.24l0.36,2.31l-3.84,3.1l-4.83,3.38l-0.11,0.15l-1.82,5.45l0.03,0.26l1.78,2.68l2.27,1.99l-2.13,3.88l-2.49,0.82l-0.2,0.24l-0.95,6.05l-1.32,3.09l-2.82,-0.32l-0.3,0.16l-1.34,2.64l-2.48,0.14l-0.76,-3.15l-2.09,-4.04l-1.85,-5.01l1.03,-1.98l2.06,-2.53l0.06,-0.13l0.83,-4.45l-0.06,-0.25l-1.54,-1.86l-0.15,-5.0l1.52,-3.48l2.28,0.06l0.27,-0.16l0.87,-1.59l-0.01,-0.31l-0.8,-1.21l3.79,-5.63l4.07,-7.54l2.23,0.01l0.29,-0.22l0.59,-2.15l4.46,0.66l0.34,-0.26l0.34,-2.64l1.21,-0.14l3.24,2.08l3.78,2.85l0.06,6.37l0.03,0.14l0.67,1.29l-3.95,1.07Z\", \"name\": \"Sweden\"}, \"SD\": {\"path\": \"M505.98,259.75l-0.31,-0.9l-0.1,-0.14l-1.2,-0.93l-0.27,-1.66l0.29,-1.83l-0.25,-0.34l-1.16,-0.17l-0.33,0.21l-0.11,0.37l-1.3,0.11l-0.21,0.49l0.55,0.68l0.18,1.29l-1.31,1.33l-1.18,1.72l-1.04,0.21l-2.0,-1.4l-0.32,-0.02l-0.95,0.52l-0.14,0.16l-0.21,0.6l-1.16,0.43l-0.19,0.23l-0.04,0.27l-2.08,0.0l-0.25,-0.39l-0.24,-0.13l-1.81,-0.09l-0.14,0.03l-0.8,0.38l-0.49,-0.16l-1.22,-1.39l-0.42,-0.67l-0.31,-0.14l-1.81,0.35l-0.2,0.14l-0.72,1.24l-0.61,2.14l-0.73,0.4l-0.62,0.22l-0.83,-0.68l-0.12,-0.6l0.38,-0.97l0.01,-1.14l-0.08,-0.2l-1.39,-1.53l-0.25,-0.97l0.03,-0.57l-0.11,-0.25l-0.81,-0.66l-0.03,-1.34l-0.04,-0.14l-0.52,-0.98l-0.31,-0.15l-0.42,0.07l0.12,-0.44l0.63,-1.03l0.03,-0.23l-0.24,-0.88l0.69,-0.66l0.02,-0.41l-0.4,-0.46l0.58,-1.39l1.04,-1.71l1.97,0.16l0.32,-0.3l-0.12,-10.24l0.02,-0.8l2.59,-0.01l0.3,-0.3l0.0,-4.92l29.19,0.0l0.68,2.17l-0.4,0.35l-0.1,0.27l0.36,2.69l0.93,3.15l0.12,0.16l2.05,1.4l-0.99,1.15l-1.75,0.4l-0.15,0.08l-0.79,0.79l-0.08,0.17l-0.24,1.69l-1.07,3.75l-0.0,0.16l0.25,0.96l-0.38,2.1l-0.98,2.41l-1.52,1.3l-1.07,1.94l-0.25,0.99l-1.08,0.64l-0.13,0.18l-0.46,1.65Z\", \"name\": \"Sudan\"}, \"DO\": {\"path\": \"M241.7,234.97l0.15,-0.22l1.73,0.01l1.43,0.64l0.15,0.03l0.45,-0.04l0.36,0.74l0.28,0.17l1.02,-0.04l-0.04,0.43l0.27,0.33l1.03,0.09l0.91,0.7l-0.57,0.64l-0.99,-0.47l-0.16,-0.03l-1.11,0.11l-0.79,-0.12l-0.26,0.09l-0.38,0.4l-0.66,0.11l-0.28,-0.45l-0.38,-0.12l-0.83,0.37l-0.14,0.13l-0.85,1.49l-0.27,-0.17l-0.1,-0.58l0.05,-0.67l-0.07,-0.21l-0.44,-0.53l0.35,-0.25l0.12,-0.19l0.19,-1.0l-0.2,-1.4Z\", \"name\": \"Dominican Republic\"}, \"DJ\": {\"path\": \"M528.78,253.36l0.34,0.45l-0.06,0.76l-1.26,0.54l-0.05,0.53l0.82,0.53l-0.57,0.83l-0.3,-0.25l-0.27,-0.05l-0.56,0.17l-1.07,-0.03l-0.04,-0.56l-0.16,-0.56l0.76,-1.07l0.76,-0.97l0.89,0.18l0.25,-0.06l0.51,-0.42Z\", \"name\": \"Djibouti\"}, \"DK\": {\"path\": \"M452.4,129.07l-1.27,2.39l-2.25,-1.69l-0.26,-1.08l3.15,-1.0l0.63,1.39ZM447.87,126.25l-0.35,0.76l-0.47,-0.24l-0.38,0.09l-1.8,2.53l-0.03,0.29l0.56,1.4l-1.22,0.4l-1.68,-0.41l-0.92,-1.76l-0.07,-3.47l0.38,-0.88l0.62,-0.93l2.07,-0.21l0.19,-0.1l0.84,-0.95l1.5,-0.76l-0.06,1.26l-0.7,1.1l-0.03,0.25l0.3,1.0l0.18,0.19l1.06,0.42Z\", \"name\": \"Denmark\"}, \"DE\": {\"path\": \"M445.51,131.69l0.03,0.94l0.21,0.28l2.32,0.74l-0.02,1.0l0.37,0.3l2.55,-0.65l1.36,-0.89l2.63,1.27l1.09,1.01l0.51,1.51l-0.6,0.78l-0.0,0.36l0.88,1.17l0.58,1.68l-0.18,1.08l0.03,0.18l0.87,1.81l-0.66,0.2l-0.55,-0.32l-0.36,0.05l-0.58,0.58l-1.73,0.62l-0.99,0.84l-1.77,0.7l-0.16,0.4l0.42,0.94l0.26,1.34l0.14,0.2l1.25,0.76l1.22,1.2l-0.71,1.2l-0.81,0.37l-0.17,0.32l0.34,1.99l-0.04,0.09l-0.47,-0.39l-0.17,-0.07l-1.2,-0.1l-1.85,0.57l-2.15,-0.13l-0.29,0.18l-0.21,0.5l-0.96,-0.67l-0.24,-0.05l-0.67,0.16l-2.6,-0.94l-0.34,0.1l-0.42,0.57l-1.64,-0.02l0.26,-1.88l1.24,-2.15l-0.21,-0.45l-3.54,-0.58l-0.98,-0.71l0.12,-1.26l-0.05,-0.2l-0.44,-0.64l0.27,-2.18l-0.38,-3.14l1.17,-0.0l0.27,-0.17l0.63,-1.26l0.65,-3.17l-0.02,-0.17l-0.41,-1.0l0.32,-0.47l1.77,-0.16l0.37,0.6l0.47,0.06l1.7,-1.69l0.06,-0.33l-0.55,-1.24l-0.09,-1.51l1.5,0.36l0.16,-0.01l1.22,-0.4Z\", \"name\": \"Germany\"}, \"YE\": {\"path\": \"M553.53,242.65l-1.51,0.58l-0.17,0.16l-0.48,1.14l-0.07,0.79l-2.31,1.0l-3.98,1.19l-2.28,1.8l-0.97,0.12l-0.7,-0.14l-0.23,0.05l-1.42,1.03l-1.51,0.47l-2.07,0.13l-0.68,0.15l-0.17,0.1l-0.49,0.6l-0.57,0.16l-0.18,0.13l-0.3,0.49l-1.06,-0.05l-0.13,0.02l-0.73,0.32l-1.48,-0.11l-0.55,-1.26l0.07,-1.32l-0.04,-0.16l-0.39,-0.72l-0.48,-1.85l-0.52,-0.79l0.08,-0.02l0.22,-0.36l-0.23,-1.05l0.24,-0.39l0.04,-0.19l-0.09,-0.95l0.96,-0.72l0.11,-0.31l-0.23,-0.98l0.46,-0.88l0.75,0.49l0.26,0.03l0.63,-0.22l2.76,-0.06l0.5,0.25l2.42,0.26l0.85,-0.11l0.52,0.71l0.35,0.1l1.17,-0.43l0.15,-0.12l1.75,-2.64l2.22,-1.11l6.95,-0.96l2.55,5.58Z\", \"name\": \"Yemen\"}, \"AT\": {\"path\": \"M463.17,154.15l-0.14,0.99l-1.15,0.01l-0.24,0.47l0.39,0.56l-0.75,1.84l-0.36,0.4l-2.06,0.07l-0.14,0.04l-1.18,0.67l-1.96,-0.23l-3.43,-0.78l-0.5,-0.97l-0.33,-0.16l-2.47,0.55l-0.2,0.16l-0.18,0.37l-1.27,-0.38l-1.28,-0.09l-0.81,-0.41l0.25,-0.51l0.03,-0.18l-0.05,-0.28l0.35,-0.08l1.16,0.81l0.45,-0.13l0.27,-0.64l2.0,0.12l1.84,-0.57l1.05,0.09l0.71,0.59l0.47,-0.11l0.23,-0.54l0.02,-0.17l-0.32,-1.85l0.69,-0.31l0.13,-0.12l0.73,-1.23l1.61,0.89l0.35,-0.04l1.35,-1.27l0.7,-0.19l1.84,0.93l0.18,0.03l1.08,-0.15l0.81,0.43l-0.07,0.15l-0.02,0.2l0.24,1.06Z\", \"name\": \"Austria\"}, \"DZ\": {\"path\": \"M450.58,224.94l-8.31,4.86l-7.23,5.12l-3.46,1.13l-2.42,0.22l-0.02,-1.33l-0.2,-0.28l-1.15,-0.42l-1.45,-0.69l-0.55,-1.13l-0.1,-0.12l-8.45,-5.72l-17.72,-12.17l0.03,-0.38l-0.02,-3.21l3.84,-1.91l2.46,-0.41l2.1,-0.75l0.14,-0.11l0.9,-1.3l2.84,-1.06l0.19,-0.27l0.09,-1.81l1.21,-0.2l0.15,-0.07l1.06,-0.96l3.19,-0.46l0.23,-0.18l0.46,-1.08l-0.08,-0.34l-0.6,-0.54l-0.83,-2.85l-0.18,-1.8l-0.82,-1.57l2.13,-1.37l2.65,-0.49l0.13,-0.05l1.55,-1.15l2.34,-0.85l4.2,-0.51l4.07,-0.23l1.21,0.41l0.23,-0.01l2.3,-1.11l2.52,-0.02l0.94,0.62l0.2,0.05l1.25,-0.13l-0.36,1.03l-0.01,0.14l0.39,2.66l-0.56,2.2l-1.49,1.52l-0.08,0.24l0.22,2.12l0.11,0.2l1.94,1.58l0.02,0.54l0.12,0.23l1.45,1.06l1.04,4.85l0.81,2.42l0.13,1.19l-0.43,2.17l0.17,1.28l-0.31,1.53l0.2,1.56l-0.9,1.02l-0.01,0.38l1.43,1.88l0.09,1.06l0.04,0.13l0.89,1.48l0.37,0.12l1.03,-0.43l1.79,1.12l0.89,1.34Z\", \"name\": \"Algeria\"}, \"US\": {\"path\": \"M892.64,99.05l1.16,0.57l0.21,0.02l1.45,-0.38l1.92,0.99l2.17,0.47l-1.65,0.72l-1.75,-0.79l-0.93,-0.7l-0.21,-0.06l-2.11,0.22l-0.35,-0.2l0.09,-0.87ZM183.29,150.37l0.39,1.54l0.12,0.17l0.78,0.55l0.14,0.05l1.74,0.2l2.52,0.5l2.4,0.98l0.17,0.02l1.96,-0.4l3.01,0.81l0.91,-0.02l2.22,-0.88l4.67,2.33l3.86,2.01l0.21,0.71l0.15,0.18l0.33,0.17l-0.02,0.05l0.23,0.43l0.67,0.1l0.21,-0.05l0.1,-0.07l0.05,0.29l0.09,0.16l0.5,0.5l0.21,0.09l0.56,0.0l0.13,0.13l-0.2,0.36l0.12,0.41l2.49,1.39l0.99,5.24l-0.69,1.68l-1.16,1.64l-0.6,1.18l-0.06,0.31l0.04,0.22l0.28,0.43l0.11,0.1l0.85,0.47l0.15,0.04l0.63,0.0l0.14,-0.04l2.87,-1.58l2.6,-0.49l3.28,-1.5l0.17,-0.23l0.04,-0.43l-0.23,-0.93l-0.24,-0.39l0.74,-0.32l4.7,-0.01l0.25,-0.13l0.77,-1.15l2.9,-2.41l1.04,-0.52l8.35,-0.02l0.28,-0.21l0.2,-0.6l0.7,-0.14l1.06,-0.48l0.13,-0.11l0.92,-1.49l0.75,-2.39l1.67,-2.08l0.59,0.6l0.3,0.07l1.52,-0.49l0.88,0.72l-0.0,4.14l0.08,0.2l1.6,1.72l0.31,0.72l-2.42,1.35l-2.55,1.05l-2.64,0.9l-0.14,0.11l-1.33,1.81l-0.44,0.7l-0.05,0.15l-0.03,1.6l0.03,0.14l0.83,1.59l0.24,0.16l0.78,0.06l-1.15,0.33l-1.25,-0.04l-1.83,0.52l-2.51,0.29l-2.17,0.88l-0.17,0.36l0.33,0.22l3.55,-0.54l0.15,0.11l-2.87,0.73l-1.19,0.0l-0.16,-0.33l-0.36,0.06l-0.76,0.82l0.17,0.5l0.42,0.08l-0.45,1.75l-1.4,1.74l-0.04,-0.17l-0.21,-0.22l-0.48,-0.13l-0.77,-0.69l-0.36,-0.03l-0.12,0.34l0.52,1.58l0.09,0.14l0.52,0.43l0.03,0.87l-0.74,1.05l-0.39,0.63l0.05,-0.12l-0.08,-0.34l-1.19,-1.03l-0.28,-2.31l-0.26,-0.26l-0.32,0.19l-0.48,1.27l-0.01,0.19l0.39,1.33l-1.14,-0.31l-0.36,0.18l0.14,0.38l1.57,0.85l0.1,2.58l0.22,0.28l0.55,0.15l0.21,0.81l0.33,2.72l-1.46,1.94l-2.5,0.81l-0.12,0.07l-1.58,1.58l-1.15,0.17l-0.15,0.06l-1.27,1.03l-0.09,0.13l-0.32,0.85l-2.71,1.79l-1.45,1.37l-1.18,1.64l-0.05,0.12l-0.39,1.96l0.0,0.13l0.44,1.91l0.85,2.37l1.1,1.91l0.03,1.2l1.16,3.07l-0.08,1.74l-0.1,0.99l-0.57,1.48l-0.54,0.24l-0.97,-0.26l-0.34,-1.02l-0.12,-0.16l-0.89,-0.58l-2.44,-4.28l-0.34,-0.94l0.49,-1.71l-0.02,-0.21l-0.7,-1.5l-2.0,-2.35l-0.11,-0.08l-0.98,-0.42l-0.25,0.01l-2.42,1.19l-0.26,-0.08l-1.26,-1.29l-1.57,-0.68l-0.16,-0.02l-2.79,0.34l-2.18,-0.3l-1.98,0.19l-1.12,0.45l-0.14,0.44l0.4,0.65l-0.04,1.02l0.09,0.22l0.29,0.3l-0.06,0.05l-0.77,-0.33l-0.26,0.01l-0.87,0.48l-1.64,-0.08l-1.79,-1.39l-0.23,-0.06l-2.11,0.33l-1.75,-0.61l-0.14,-0.01l-1.61,0.2l-2.11,0.64l-0.11,0.06l-2.25,1.99l-2.53,1.21l-1.43,1.38l-0.58,1.22l-0.03,0.12l-0.03,1.86l0.13,1.32l0.3,0.62l-0.46,0.04l-1.71,-0.57l-1.85,-0.79l-0.63,-1.14l-0.54,-1.85l-0.07,-0.12l-1.45,-1.51l-0.86,-1.58l-1.26,-1.87l-0.09,-0.09l-1.76,-1.09l-0.17,-0.04l-2.05,0.05l-0.23,0.12l-1.44,1.97l-1.84,-0.72l-1.19,-0.76l-0.6,-1.45l-0.9,-1.52l-1.49,-1.21l-1.27,-0.87l-0.89,-0.96l-0.22,-0.1l-4.34,-0.0l-0.3,0.3l-0.0,0.84l-6.62,0.02l-5.66,-1.93l-3.48,-1.24l0.11,-0.25l-0.3,-0.42l-3.18,0.3l-2.6,0.2l-0.35,-1.19l-0.08,-0.13l-1.62,-1.61l-0.13,-0.08l-1.02,-0.29l-0.22,-0.66l-0.25,-0.2l-1.31,-0.13l-0.82,-0.7l-0.16,-0.07l-2.25,-0.27l-0.48,-0.34l-0.28,-1.44l-0.07,-0.14l-2.41,-2.84l-2.03,-3.89l0.08,-0.58l-0.1,-0.27l-1.08,-0.94l-1.87,-2.36l-0.33,-2.31l-0.07,-0.15l-1.24,-1.5l0.52,-2.4l-0.09,-2.57l-0.78,-2.3l0.96,-2.83l0.61,-5.66l-0.46,-4.26l-0.79,-2.71l-0.68,-1.4l0.13,-0.26l3.24,0.97l1.28,2.88l0.52,0.06l0.62,-0.84l0.06,-0.22l-0.4,-2.61l-0.74,-2.29l68.9,-0.0l0.3,-0.3l0.01,-0.95l0.32,-0.01ZM32.5,67.43l1.75,1.99l0.41,0.04l1.02,-0.81l3.79,0.25l-0.1,0.72l0.24,0.34l3.83,0.77l2.6,-0.44l5.21,1.41l4.84,0.43l1.9,0.57l0.15,0.01l3.25,-0.71l3.72,1.32l2.52,0.58l-0.03,38.14l0.29,0.3l2.41,0.11l2.34,1.0l1.7,1.59l2.22,2.42l0.42,0.03l2.41,-2.04l2.25,-1.08l1.23,1.76l1.71,1.53l2.24,1.62l1.54,2.56l2.56,4.09l0.11,0.11l4.1,2.17l0.06,1.93l-1.12,1.35l-1.22,-1.14l-2.08,-1.05l-0.68,-2.94l-0.09,-0.16l-3.18,-2.84l-1.32,-3.35l-0.25,-0.19l-2.43,-0.24l-3.93,-0.09l-2.85,-1.02l-5.24,-3.85l-6.77,-2.04l-3.52,0.3l-4.84,-1.7l-2.96,-1.6l-0.23,-0.02l-2.78,0.8l-0.21,0.35l0.46,2.31l-1.11,0.19l-2.9,0.78l-2.24,1.26l-2.42,0.68l-0.29,-1.79l1.07,-3.49l2.54,-1.11l0.12,-0.45l-0.69,-0.96l-0.41,-0.07l-3.19,2.12l-1.76,2.54l-3.57,2.62l-0.03,0.46l1.63,1.59l-2.14,2.38l-2.64,1.49l-2.49,1.09l-0.16,0.17l-0.58,1.48l-3.8,1.79l-0.14,0.14l-0.75,1.57l-2.75,1.41l-1.62,-0.25l-0.16,0.02l-2.35,0.98l-2.54,1.19l-2.06,1.15l-4.05,0.93l-0.1,-0.15l2.45,-1.45l2.49,-1.1l2.61,-1.88l3.03,-0.39l0.19,-0.1l1.2,-1.41l3.43,-2.11l0.61,-0.75l1.81,-1.24l0.13,-0.2l0.42,-2.7l1.24,-2.12l-0.03,-0.35l-0.34,-0.09l-2.73,1.05l-0.67,-0.53l-0.39,0.02l-1.13,1.11l-1.43,-1.62l-0.49,0.06l-0.41,0.8l-0.67,-1.31l-0.42,-0.12l-2.43,1.43l-1.18,-0.0l-0.18,-1.86l0.43,-1.3l-0.09,-0.33l-1.61,-1.33l-0.26,-0.06l-3.11,0.68l-2.0,-1.66l-1.61,-0.85l-0.01,-1.97l-0.11,-0.23l-1.76,-1.48l0.86,-1.96l2.01,-2.13l0.88,-1.94l1.79,-0.25l1.65,0.6l0.31,-0.06l1.91,-1.8l1.67,0.31l0.22,-0.04l1.91,-1.23l0.13,-0.33l-0.47,-1.82l-0.15,-0.19l-1.0,-0.52l1.51,-1.27l0.09,-0.34l-0.29,-0.19l-1.62,0.06l-2.66,0.88l-0.13,0.09l-0.62,0.72l-1.77,-0.8l-0.16,-0.02l-3.48,0.44l-3.5,-0.92l-1.06,-1.61l-2.78,-2.09l3.07,-1.51l5.52,-2.01l1.65,0.0l-0.28,1.73l0.31,0.35l5.29,-0.16l0.23,-0.49l-2.03,-2.59l-0.1,-0.08l-3.03,-1.58l-1.79,-2.12l-2.4,-1.83l-3.18,-1.27l1.13,-1.84l4.28,-0.14l0.15,-0.05l3.16,-2.0l0.13,-0.17l0.57,-2.07l2.43,-2.02l2.42,-0.52l4.67,-1.98l2.22,0.29l0.2,-0.04l3.74,-2.37l3.57,0.91ZM37.66,123.49l-2.31,1.26l-1.04,-0.75l-0.31,-1.35l2.06,-1.16l1.24,-0.51l1.48,0.22l0.76,0.81l-1.89,1.49ZM30.89,233.84l1.2,0.57l0.35,0.3l0.48,0.69l-1.6,0.86l-0.3,0.31l-0.24,-0.14l0.05,-0.54l-0.02,-0.15l-0.36,-0.83l0.05,-0.12l0.39,-0.38l0.07,-0.31l-0.09,-0.27ZM29.06,231.89l0.5,0.14l0.31,0.19l-0.46,0.1l-0.34,-0.43ZM25.02,230.13l0.2,-0.11l0.4,0.47l-0.43,-0.05l-0.17,-0.31ZM21.29,228.68l0.1,-0.07l0.22,0.02l0.02,0.21l-0.02,0.02l-0.32,-0.18ZM6.0,113.33l-1.19,0.45l-1.5,-0.64l-0.94,-0.63l1.76,-0.46l1.71,0.29l0.16,0.98Z\", \"name\": \"United States of America\"}, \"LV\": {\"path\": \"M473.99,127.16l0.07,-2.15l1.15,-2.11l2.05,-1.07l1.84,2.48l0.25,0.12l2.01,-0.07l0.29,-0.25l0.45,-2.58l1.85,-0.56l0.98,0.4l2.13,1.33l0.16,0.05l1.97,0.01l1.02,0.7l0.21,1.67l0.71,1.84l-2.44,1.23l-1.36,0.53l-2.28,-1.62l-0.12,-0.05l-1.18,-0.2l-0.28,-0.6l-0.31,-0.17l-2.43,0.35l-4.17,-0.23l-0.12,0.02l-2.45,0.93Z\", \"name\": \"Latvia\"}, \"UY\": {\"path\": \"M276.9,363.17l1.3,-0.23l2.4,2.04l0.22,0.07l0.82,-0.07l2.48,1.7l1.93,1.5l1.28,1.67l-0.95,1.14l-0.04,0.31l0.63,1.45l-0.96,1.57l-2.65,1.47l-1.73,-0.53l-0.15,-0.01l-1.25,0.28l-2.22,-1.16l-0.16,-0.03l-1.56,0.08l-1.33,-1.36l0.17,-1.58l0.48,-0.55l0.07,-0.2l-0.02,-2.74l0.66,-2.8l0.57,-2.02Z\", \"name\": \"Uruguay\"}, \"LB\": {\"path\": \"M510.44,198.11l-0.48,0.03l-0.26,0.17l-0.15,0.32l-0.21,-0.0l0.72,-1.85l1.19,-1.9l0.74,0.09l0.27,0.73l-1.19,0.93l-0.09,0.13l-0.54,1.36Z\", \"name\": \"Lebanon\"}, \"LA\": {\"path\": \"M684.87,248.8l0.61,-0.86l0.05,-0.16l0.11,-2.17l-0.08,-0.22l-1.96,-2.16l-0.15,-2.44l-0.08,-0.18l-1.9,-2.1l-0.19,-0.1l-1.89,-0.18l-0.29,0.15l-0.42,0.76l-1.21,0.06l-0.67,-0.41l-0.31,-0.0l-2.2,1.29l-0.05,-1.77l0.61,-2.7l-0.27,-0.37l-1.44,-0.1l-0.12,-1.31l-0.12,-0.21l-0.87,-0.65l0.38,-0.68l1.76,-1.41l0.08,0.22l0.27,0.2l1.33,0.07l0.31,-0.34l-0.35,-2.75l0.85,-0.25l1.32,1.88l1.11,2.36l0.27,0.17l2.89,0.02l0.78,1.82l-1.32,0.56l-0.12,0.09l-0.72,0.93l0.1,0.45l2.93,1.52l3.62,5.27l1.88,1.78l0.58,1.67l-0.38,2.11l-1.87,-0.79l-0.37,0.11l-0.99,1.54l-1.51,-0.73Z\", \"name\": \"Laos\"}, \"TW\": {\"path\": \"M725.6,222.5l-1.5,4.22l-0.82,1.65l-1.01,-1.7l-0.26,-1.8l1.4,-2.48l1.8,-1.81l0.76,0.53l-0.38,1.39Z\", \"name\": \"Taiwan\"}, \"TT\": {\"path\": \"M266.35,259.46l0.41,-0.39l0.09,-0.23l-0.04,-0.75l1.14,-0.26l0.2,0.03l-0.07,1.37l-1.73,0.23Z\", \"name\": \"Trinidad and Tobago\"}, \"TR\": {\"path\": \"M513.25,175.38l3.63,1.17l0.14,0.01l2.88,-0.45l2.11,0.26l0.18,-0.03l2.9,-1.53l2.51,-0.13l2.25,1.37l0.36,0.88l-0.23,1.36l0.19,0.33l1.81,0.72l0.61,0.53l-1.31,0.64l-0.16,0.34l0.76,3.24l-0.44,0.8l0.01,0.3l1.19,2.02l-0.71,0.29l-0.74,-0.62l-0.15,-0.07l-2.91,-0.37l-0.15,0.02l-1.04,0.43l-2.78,0.44l-1.44,-0.03l-2.83,1.06l-1.95,0.01l-1.28,-0.52l-0.2,-0.01l-2.62,0.76l-0.7,-0.48l-0.47,0.22l-0.13,1.49l-1.01,0.94l-0.58,-0.82l0.79,-0.9l0.04,-0.34l-0.31,-0.15l-1.46,0.23l-2.03,-0.64l-0.3,0.07l-1.65,1.58l-3.58,0.3l-1.94,-1.47l-0.17,-0.06l-2.7,-0.1l-0.28,0.17l-0.51,1.06l-1.47,0.29l-2.32,-1.46l-0.17,-0.05l-2.55,0.05l-1.4,-2.7l-1.72,-1.54l1.11,-2.06l-0.07,-0.37l-1.35,-1.19l2.47,-2.51l3.74,-0.11l0.26,-0.17l0.96,-2.07l4.56,0.38l0.19,-0.05l2.97,-1.92l2.84,-0.83l4.03,-0.06l4.31,2.08ZM488.85,176.8l-1.81,1.38l-0.57,-1.01l0.02,-0.36l0.45,-0.25l0.13,-0.15l0.78,-1.87l-0.11,-0.37l-0.72,-0.47l1.91,-0.71l1.89,0.35l0.25,0.97l0.17,0.2l1.87,0.83l-0.19,0.31l-2.82,0.16l-0.18,0.07l-1.06,0.91Z\", \"name\": \"Turkey\"}, \"LK\": {\"path\": \"M625.44,266.07l-0.35,2.4l-0.9,0.61l-1.91,0.5l-1.04,-1.75l-0.43,-3.5l1.0,-3.6l1.34,1.09l1.13,1.72l1.16,2.52Z\", \"name\": \"Sri Lanka\"}, \"TN\": {\"path\": \"M444.91,206.18l-0.99,-4.57l-0.12,-0.18l-1.43,-1.04l-0.02,-0.53l-0.11,-0.22l-1.95,-1.59l-0.19,-1.85l1.44,-1.47l0.08,-0.14l0.59,-2.34l-0.38,-2.77l0.44,-1.28l2.52,-1.08l1.41,0.28l-0.06,1.2l0.43,0.28l1.81,-0.9l0.02,0.06l-1.14,1.28l-0.08,0.2l-0.02,1.32l0.11,0.24l0.74,0.6l-0.29,2.18l-1.56,1.35l-0.09,0.32l0.48,1.54l0.28,0.21l1.11,0.04l0.55,1.17l0.15,0.14l0.76,0.35l-0.12,1.79l-1.1,0.72l-0.8,0.91l-1.68,1.04l-0.13,0.32l0.25,1.08l-0.18,0.96l-0.74,0.39Z\", \"name\": \"Tunisia\"}, \"TL\": {\"path\": \"M734.21,307.22l0.17,-0.34l1.99,-0.52l1.72,-0.08l0.78,-0.3l0.29,0.1l-0.43,0.32l-2.57,1.09l-1.71,0.59l-0.05,-0.49l-0.19,-0.36Z\", \"name\": \"East Timor\"}, \"TM\": {\"path\": \"M553.16,173.51l-0.12,1.0l-0.26,-0.65l0.38,-0.34ZM553.54,173.16l0.13,-0.12l0.43,-0.09l-0.56,0.21ZM555.68,172.6l0.65,-0.14l1.53,0.76l1.71,2.29l0.27,0.12l1.27,-0.14l2.81,-0.04l0.29,-0.38l-0.35,-1.27l1.98,-0.97l1.96,-1.63l3.05,1.44l0.25,2.23l0.14,0.22l0.96,0.61l0.18,0.05l2.61,-0.13l0.68,0.44l1.2,2.97l0.1,0.13l2.85,2.03l1.67,1.41l2.66,1.45l3.13,1.17l-0.05,1.23l-0.36,-0.04l-1.12,-0.73l-0.44,0.14l-0.34,0.89l-1.96,0.52l-0.22,0.23l-0.47,2.17l-1.26,0.78l-1.93,0.42l-0.21,0.18l-0.46,1.14l-1.64,0.33l-2.3,-0.97l-0.2,-2.23l-0.28,-0.27l-1.76,-0.1l-2.78,-2.48l-0.15,-0.07l-1.95,-0.31l-2.82,-1.48l-1.78,-0.27l-0.18,0.03l-1.03,0.51l-1.6,-0.08l-0.22,0.08l-1.72,1.6l-1.83,0.46l-0.39,-1.7l0.36,-3.0l-0.16,-0.3l-1.73,-0.88l0.57,-1.77l-0.25,-0.39l-1.33,-0.14l0.41,-1.85l2.05,0.63l0.21,-0.01l2.2,-0.95l0.09,-0.49l-1.78,-1.75l-0.69,-1.66l-0.07,-0.03Z\", \"name\": \"Turkmenistan\"}, \"TJ\": {\"path\": \"M597.99,178.71l-0.23,0.23l-2.57,-0.47l-0.35,0.25l-0.24,1.7l0.32,0.34l2.66,-0.22l3.15,0.95l4.47,-0.42l0.58,2.45l0.39,0.21l0.71,-0.25l1.22,0.53l-0.06,1.01l0.29,1.28l-2.19,-0.0l-1.71,-0.21l-0.23,0.07l-1.51,1.25l-1.05,0.27l-0.77,0.51l-0.71,-0.67l0.22,-2.28l-0.24,-0.32l-0.43,-0.08l0.17,-0.57l-0.16,-0.36l-1.36,-0.66l-0.34,0.05l-1.08,1.01l-0.09,0.15l-0.25,1.09l-0.24,0.26l-1.36,-0.05l-0.27,0.14l-0.65,1.06l-0.58,-0.39l-0.3,-0.02l-1.68,0.86l-0.36,-0.16l1.28,-2.65l0.02,-0.2l-0.54,-2.17l-0.18,-0.21l-1.53,-0.58l0.41,-0.82l1.89,0.13l0.26,-0.12l1.19,-1.63l0.77,-1.82l2.66,-0.55l-0.33,0.87l0.01,0.23l0.36,0.82l0.3,0.18l0.23,-0.02Z\", \"name\": \"Tajikistan\"}, \"LS\": {\"path\": \"M493.32,359.69l0.69,0.65l-0.65,1.12l-0.38,0.8l-1.27,0.39l-0.18,0.15l-0.4,0.77l-0.59,0.18l-1.59,-1.78l1.16,-1.5l1.3,-1.02l0.97,-0.46l0.94,0.72Z\", \"name\": \"Lesotho\"}, \"TH\": {\"path\": \"M677.42,253.68l-1.7,-0.88l-0.14,-0.03l-1.77,0.04l0.3,-1.64l-0.3,-0.35l-2.21,0.01l-0.3,0.28l-0.2,2.76l-2.15,5.9l-0.02,0.13l0.17,1.83l0.28,0.27l1.45,0.07l0.93,2.1l0.44,2.15l0.08,0.15l1.4,1.44l0.16,0.09l1.43,0.27l1.04,1.05l-0.58,0.73l-1.24,0.22l-0.15,-0.99l-0.15,-0.22l-2.04,-1.1l-0.36,0.06l-0.23,0.23l-0.72,-0.71l-0.41,-1.18l-0.06,-0.11l-1.33,-1.42l-1.22,-1.2l-0.5,0.13l-0.15,0.54l-0.14,-0.41l0.26,-1.48l0.73,-2.38l1.2,-2.57l1.37,-2.35l0.02,-0.27l-0.95,-2.26l0.03,-1.19l-0.29,-1.42l-0.06,-0.13l-1.65,-2.0l-0.46,-0.99l0.62,-0.34l0.13,-0.15l0.92,-2.23l-0.02,-0.27l-1.05,-1.74l-1.57,-1.86l-1.04,-1.96l0.76,-0.34l0.16,-0.16l1.07,-2.63l1.58,-0.1l0.16,-0.06l1.43,-1.11l1.24,-0.52l0.84,0.62l0.13,1.43l0.28,0.27l1.34,0.09l-0.54,2.39l0.05,2.39l0.45,0.25l2.48,-1.45l0.6,0.36l0.17,0.04l1.47,-0.07l0.25,-0.15l0.41,-0.73l1.58,0.15l1.76,1.93l0.15,2.44l0.08,0.18l1.94,2.15l-0.1,1.96l-0.66,0.93l-2.25,-0.34l-3.24,0.49l-0.19,0.12l-1.6,2.12l-0.06,0.24l0.48,2.46Z\", \"name\": \"Thailand\"}, \"TF\": {\"path\": \"M593.76,417.73l1.38,0.84l2.15,0.37l0.04,0.31l-0.59,1.24l-3.36,0.19l-0.05,-1.38l0.43,-1.56Z\", \"name\": \"French Southern and Antarctic Lands\"}, \"TG\": {\"path\": \"M425.23,269.29l-1.49,0.4l-0.43,-0.68l-0.64,-1.54l-0.18,-1.16l0.54,-2.21l-0.04,-0.24l-0.59,-0.86l-0.23,-1.9l0.0,-1.82l-0.07,-0.19l-0.95,-1.19l0.1,-0.41l1.58,0.04l-0.23,0.97l0.08,0.28l1.55,1.55l0.09,1.13l0.08,0.19l0.42,0.43l-0.11,5.66l0.52,1.53Z\", \"name\": \"Togo\"}, \"TD\": {\"path\": \"M457.57,252.46l0.23,-1.08l-0.28,-0.36l-1.32,-0.05l0.0,-1.35l-0.1,-0.22l-0.9,-0.82l0.99,-3.1l3.12,-2.37l0.12,-0.23l0.13,-3.33l0.95,-5.2l0.53,-1.09l-0.07,-0.36l-0.94,-0.81l-0.03,-0.7l-0.12,-0.23l-0.84,-0.61l-0.57,-3.76l2.21,-1.26l19.67,9.88l0.12,9.74l-1.83,-0.15l-0.28,0.14l-1.14,1.89l-0.68,1.62l0.05,0.31l0.33,0.38l-0.61,0.58l-0.08,0.3l0.25,0.93l-0.58,0.95l-0.29,1.01l0.34,0.37l0.67,-0.11l0.39,0.73l0.03,1.4l0.11,0.23l0.8,0.65l-0.01,0.24l-1.38,0.37l-0.11,0.06l-1.27,1.03l-1.83,2.76l-2.21,1.1l-2.34,-0.15l-0.82,0.25l-0.2,0.37l0.19,0.68l-1.16,0.79l-1.01,0.94l-2.92,0.89l-0.5,-0.46l-0.17,-0.08l-0.41,-0.05l-0.28,0.12l-0.38,0.54l-1.36,0.12l0.1,-0.18l0.01,-0.27l-0.78,-1.72l-0.35,-1.03l-0.17,-0.18l-1.03,-0.41l-1.29,-1.28l0.36,-0.78l0.9,0.2l0.14,-0.0l0.67,-0.17l1.36,0.02l0.26,-0.45l-1.32,-2.22l0.09,-1.64l-0.17,-1.68l-0.04,-0.13l-0.93,-1.53Z\", \"name\": \"Chad\"}, \"LY\": {\"path\": \"M457.99,226.38l-1.57,0.87l-1.25,-1.28l-0.13,-0.08l-3.85,-1.11l-1.04,-1.57l-0.09,-0.09l-1.98,-1.23l-0.27,-0.02l-0.93,0.39l-0.72,-1.2l-0.09,-1.07l-0.06,-0.16l-1.33,-1.75l0.83,-0.94l0.07,-0.24l-0.21,-1.64l0.31,-1.43l-0.17,-1.29l0.43,-2.26l-0.15,-1.33l-0.73,-2.18l0.99,-0.52l0.16,-0.21l0.22,-1.16l-0.22,-1.06l1.54,-0.95l0.81,-0.92l1.19,-0.78l0.14,-0.23l0.12,-1.76l2.57,0.84l0.16,0.01l0.99,-0.23l2.01,0.45l3.19,1.2l1.12,2.36l0.2,0.16l2.24,0.53l3.5,1.14l2.65,1.36l0.29,-0.01l1.22,-0.71l1.27,-1.32l0.07,-0.29l-0.55,-2.0l0.69,-1.19l1.7,-1.23l1.61,-0.35l3.2,0.54l0.78,1.14l0.24,0.13l0.85,0.01l0.84,0.47l2.35,0.31l0.42,0.63l-0.79,1.16l-0.04,0.26l0.35,1.08l-0.61,1.6l-0.0,0.2l0.73,2.16l0.0,24.24l-2.58,0.01l-0.3,0.29l-0.02,0.62l-19.55,-9.83l-0.28,0.01l-2.53,1.44Z\", \"name\": \"Libya\"}, \"AE\": {\"path\": \"M550.59,223.8l0.12,0.08l1.92,-0.41l3.54,0.15l0.23,-0.09l1.71,-1.79l1.86,-1.7l1.31,-1.36l0.26,0.5l0.28,1.72l-0.93,0.01l-0.3,0.26l-0.21,1.73l0.11,0.27l0.08,0.06l-0.7,0.32l-0.17,0.27l-0.01,0.99l-0.68,1.02l-0.05,0.15l-0.06,0.96l-0.32,0.36l-7.19,-1.27l-0.79,-2.22Z\", \"name\": \"United Arab Emirates\"}, \"VE\": {\"path\": \"M240.66,256.5l0.65,0.91l-0.03,1.13l-1.05,1.39l-0.03,0.31l0.95,2.0l0.32,0.17l1.08,-0.16l0.24,-0.21l0.56,-1.83l-0.06,-0.29l-0.71,-0.81l-0.1,-1.58l2.9,-0.96l0.19,-0.37l-0.29,-1.02l0.45,-0.41l0.72,1.43l0.26,0.16l1.65,0.04l1.46,1.27l0.08,0.72l0.3,0.27l2.28,0.02l2.55,-0.25l1.34,1.06l0.14,0.06l1.92,0.31l0.2,-0.03l1.4,-0.79l0.15,-0.25l0.02,-0.36l2.82,-0.14l1.17,-0.01l-0.41,0.14l-0.14,0.46l0.86,1.19l0.22,0.12l1.93,0.18l1.73,1.13l0.37,1.9l0.31,0.24l1.21,-0.05l0.52,0.32l-1.63,1.21l-0.11,0.17l-0.22,0.92l0.07,0.27l0.63,0.69l-0.31,0.24l-1.48,0.39l-0.22,0.3l0.04,1.03l-0.59,0.6l-0.01,0.41l1.67,1.87l0.23,0.48l-0.72,0.76l-2.71,0.91l-1.78,0.39l-0.13,0.06l-0.6,0.49l-1.84,-0.58l-1.89,-0.33l-0.18,0.03l-0.47,0.23l-0.02,0.53l0.96,0.56l-0.08,1.58l0.35,1.58l0.26,0.23l1.91,0.19l0.02,0.07l-1.54,0.62l-0.18,0.2l-0.25,0.92l-0.88,0.35l-1.85,0.58l-0.16,0.13l-0.4,0.64l-1.66,0.14l-1.22,-1.18l-0.79,-2.52l-0.67,-0.88l-0.66,-0.43l0.99,-0.98l0.09,-0.26l-0.09,-0.56l-0.08,-0.16l-0.66,-0.69l-0.47,-1.54l0.18,-1.67l0.55,-0.85l0.45,-1.35l-0.15,-0.36l-0.89,-0.43l-0.19,-0.02l-1.39,0.28l-1.76,-0.13l-0.92,0.23l-1.64,-2.01l-0.17,-0.1l-1.54,-0.33l-3.05,0.23l-0.5,-0.73l-0.15,-0.12l-0.45,-0.15l-0.05,-0.28l0.28,-0.86l0.01,-0.15l-0.2,-1.01l-0.08,-0.15l-0.5,-0.5l-0.3,-1.08l-0.25,-0.22l-0.89,-0.12l0.54,-1.18l0.29,-1.73l0.66,-0.85l0.94,-0.7l0.09,-0.11l0.3,-0.6Z\", \"name\": \"Venezuela\"}, \"AF\": {\"path\": \"M574.42,192.1l2.24,0.95l0.18,0.02l1.89,-0.38l0.22,-0.18l0.46,-1.14l1.82,-0.4l1.5,-0.91l0.14,-0.19l0.46,-2.12l1.93,-0.51l0.2,-0.18l0.26,-0.68l0.87,0.57l0.13,0.05l0.79,0.09l1.35,0.02l1.83,0.59l0.75,0.34l0.26,-0.01l1.66,-0.85l0.7,0.46l0.42,-0.09l0.72,-1.17l1.32,0.05l0.23,-0.1l0.39,-0.43l0.07,-0.14l0.24,-1.08l0.86,-0.81l0.94,0.46l-0.2,0.64l0.23,0.38l0.49,0.09l-0.21,2.15l0.09,0.25l0.99,0.94l0.38,0.03l0.83,-0.57l1.06,-0.27l0.12,-0.06l1.46,-1.21l1.63,0.2l2.4,0.0l0.17,0.32l-1.12,0.25l-1.23,0.52l-2.86,0.33l-2.69,0.6l-0.13,0.06l-1.46,1.25l-0.07,0.36l0.58,1.18l0.25,1.21l-1.13,1.08l-0.09,0.25l0.09,0.98l-0.53,0.79l-2.22,-0.08l-0.28,0.44l0.83,1.57l-1.3,0.58l-0.13,0.11l-1.06,1.69l-0.05,0.18l0.13,1.51l-0.73,0.58l-0.78,-0.22l-0.14,-0.01l-1.91,0.36l-0.23,0.19l-0.2,0.57l-1.65,-0.0l-0.22,0.1l-1.4,1.56l-0.08,0.19l-0.08,2.13l-2.99,1.05l-1.67,-0.23l-0.27,0.1l-0.39,0.46l-1.43,-0.31l-2.43,0.4l-3.69,-1.23l1.96,-2.15l0.08,-0.24l-0.21,-1.78l-0.23,-0.26l-1.69,-0.42l-0.19,-1.62l-0.77,-2.08l0.98,-1.41l-0.14,-0.45l-0.82,-0.31l0.6,-1.79l0.93,-3.21Z\", \"name\": \"Afghanistan\"}, \"IQ\": {\"path\": \"M534.42,190.89l0.13,0.14l1.5,0.78l0.15,1.34l-1.13,0.87l-0.11,0.16l-0.58,2.2l0.04,0.24l1.73,2.67l0.12,0.1l2.99,1.49l1.18,1.94l-0.39,1.89l0.29,0.36l0.5,-0.0l0.02,1.17l0.08,0.2l0.83,0.86l-2.36,-0.29l-0.29,0.13l-1.74,2.49l-4.4,-0.21l-7.03,-5.49l-3.73,-1.94l-2.92,-0.74l-0.89,-3.0l5.33,-2.81l0.15,-0.19l0.95,-3.43l-0.2,-2.0l1.19,-0.61l0.11,-0.09l1.23,-1.73l0.92,-0.38l2.75,0.35l0.81,0.68l0.31,0.05l0.94,-0.38l1.5,3.17Z\", \"name\": \"Iraq\"}, \"IS\": {\"path\": \"M384.26,87.96l-0.51,2.35l0.08,0.28l2.61,2.58l-2.99,2.83l-7.16,2.72l-2.08,0.7l-9.51,-1.71l1.89,-1.36l-0.07,-0.53l-4.4,-1.59l3.33,-0.59l0.25,-0.32l-0.11,-1.2l-0.25,-0.27l-4.82,-0.88l1.38,-2.2l3.54,-0.57l3.8,2.74l0.33,0.01l3.68,-2.18l3.02,1.12l0.25,-0.02l4.01,-2.18l3.72,0.27Z\", \"name\": \"Iceland\"}, \"IR\": {\"path\": \"M556.2,187.5l2.05,-0.52l0.13,-0.07l1.69,-1.57l1.55,0.08l0.15,-0.03l1.02,-0.5l1.64,0.25l2.82,1.48l1.91,0.3l2.8,2.49l0.18,0.08l1.61,0.09l0.19,2.09l-1.0,3.47l-0.69,2.04l0.18,0.38l0.73,0.28l-0.85,1.22l-0.04,0.28l0.81,2.19l0.19,1.72l0.23,0.26l1.69,0.42l0.17,1.43l-2.18,2.39l-0.01,0.4l1.22,1.42l1.0,1.62l0.12,0.11l2.23,1.11l0.06,2.2l0.2,0.27l1.03,0.38l0.14,0.83l-3.38,1.3l-0.18,0.19l-0.87,2.85l-4.44,-0.76l-2.75,-0.62l-2.64,-0.32l-1.01,-3.11l-0.17,-0.19l-1.2,-0.48l-0.18,-0.01l-1.99,0.51l-2.42,1.25l-2.89,-0.84l-2.48,-2.03l-2.41,-0.79l-1.61,-2.47l-1.84,-3.63l-0.36,-0.15l-1.22,0.4l-1.48,-0.84l-0.37,0.06l-0.72,0.82l-1.08,-1.12l-0.02,-1.35l-0.3,-0.29l-0.43,0.0l0.34,-1.64l-0.04,-0.22l-1.29,-2.11l-0.12,-0.11l-3.0,-1.49l-1.62,-2.49l0.52,-1.98l1.18,-0.92l0.11,-0.27l-0.19,-1.66l-0.16,-0.23l-1.55,-0.81l-1.58,-3.33l-1.3,-2.2l0.41,-0.75l0.03,-0.21l-0.73,-3.12l1.2,-0.59l0.35,0.9l1.26,1.35l0.15,0.09l1.81,0.39l0.91,-0.09l0.15,-0.06l2.9,-2.13l0.7,-0.16l0.48,0.56l-0.75,1.26l0.05,0.37l1.56,1.53l0.28,0.08l0.37,-0.09l0.7,1.89l0.21,0.19l2.31,0.59l1.69,1.4l0.15,0.07l3.66,0.49l3.91,-0.76l0.23,-0.19l0.19,-0.52Z\", \"name\": \"Iran\"}, \"AM\": {\"path\": \"M530.51,176.08l2.91,-0.39l0.41,0.63l0.11,0.1l0.66,0.36l-0.32,0.47l0.07,0.41l1.1,0.84l-0.53,0.7l0.06,0.42l1.06,0.8l1.01,0.44l0.04,1.56l-0.44,0.04l-0.88,-1.46l0.01,-0.37l-0.3,-0.31l-0.98,0.01l-0.65,-0.69l-0.26,-0.09l-0.38,0.06l-0.97,-0.82l-1.64,-0.65l0.2,-1.2l-0.02,-0.16l-0.28,-0.69Z\", \"name\": \"Armenia\"}, \"IT\": {\"path\": \"M451.68,158.58l0.2,0.16l3.3,0.75l-0.22,1.26l0.02,0.18l0.35,0.78l-1.4,-0.32l-0.21,0.03l-2.04,1.1l-0.16,0.29l0.13,1.47l-0.29,0.82l0.02,0.24l0.82,1.57l0.1,0.11l2.28,1.5l1.29,2.53l2.79,2.43l0.2,0.07l1.83,-0.02l0.31,0.34l-0.46,0.39l0.06,0.5l4.06,1.97l2.06,1.49l0.17,0.36l-0.24,0.53l-1.08,-1.07l-0.15,-0.08l-2.18,-0.49l-0.33,0.15l-1.05,1.91l0.11,0.4l1.63,0.98l-0.22,1.12l-0.84,0.14l-0.22,0.15l-1.27,2.38l-0.54,0.12l0.01,-0.47l0.48,-1.46l0.5,-0.58l0.03,-0.35l-0.97,-1.69l-0.76,-1.48l-0.17,-0.15l-0.94,-0.33l-0.68,-1.18l-0.16,-0.13l-1.53,-0.52l-1.03,-1.14l-0.19,-0.1l-1.78,-0.19l-1.88,-1.3l-2.27,-1.94l-1.64,-1.68l-0.76,-2.94l-0.21,-0.21l-1.22,-0.35l-2.01,-1.0l-0.24,-0.01l-1.15,0.42l-0.11,0.07l-1.38,1.36l-0.5,0.11l0.19,-0.87l-0.21,-0.35l-1.19,-0.34l-0.56,-2.06l0.76,-0.82l0.03,-0.36l-0.68,-1.08l0.04,-0.31l0.68,0.42l0.19,0.04l1.21,-0.15l0.14,-0.06l1.18,-0.89l0.25,0.29l0.25,0.1l1.19,-0.1l0.25,-0.18l0.45,-1.04l1.61,0.34l0.19,-0.02l1.1,-0.53l0.17,-0.22l0.15,-0.95l1.19,0.35l0.35,-0.16l0.23,-0.47l2.11,-0.47l0.45,0.89ZM459.35,184.63l-0.71,1.81l0.0,0.23l0.33,0.79l-0.37,1.03l-1.6,-0.91l-1.33,-0.34l-3.24,-1.36l0.23,-0.99l2.73,0.24l3.95,-0.5ZM443.95,175.91l1.26,1.77l-0.31,3.47l-0.82,-0.13l-0.26,0.08l-0.83,0.79l-0.64,-0.52l-0.1,-3.42l-0.44,-1.34l0.91,0.1l0.21,-0.06l1.01,-0.74Z\", \"name\": \"Italy\"}, \"VN\": {\"path\": \"M690.8,230.21l-2.86,1.93l-2.09,2.46l-0.06,0.11l-0.55,1.8l0.04,0.26l4.26,6.1l2.31,1.63l1.46,1.97l1.12,4.62l-0.32,4.3l-1.97,1.57l-2.85,1.62l-2.09,2.14l-2.83,2.13l-0.67,-1.19l0.65,-1.58l-0.09,-0.35l-1.47,-1.14l1.67,-0.79l2.57,-0.18l0.22,-0.47l-0.89,-1.24l3.88,-1.8l0.17,-0.24l0.31,-3.05l-0.01,-0.13l-0.56,-1.63l0.44,-2.48l-0.01,-0.15l-0.63,-1.81l-0.08,-0.12l-1.87,-1.77l-3.64,-5.3l-0.11,-0.1l-2.68,-1.39l0.45,-0.59l1.53,-0.65l0.16,-0.39l-0.97,-2.27l-0.27,-0.18l-2.89,-0.02l-1.04,-2.21l-1.28,-1.83l0.96,-0.46l1.97,0.01l2.43,-0.3l0.13,-0.05l1.95,-1.29l1.04,0.85l0.13,0.06l1.98,0.42l-0.32,1.21l0.09,0.3l1.19,1.07l0.12,0.07l1.88,0.51Z\", \"name\": \"Vietnam\"}, \"AR\": {\"path\": \"M258.11,341.34l1.4,1.81l0.51,-0.06l0.89,-1.94l2.51,0.1l0.36,0.49l4.6,4.31l0.15,0.08l1.99,0.39l3.01,1.93l2.5,1.01l0.28,0.91l-2.4,3.97l0.17,0.44l2.57,0.74l2.81,0.41l2.09,-0.44l0.14,-0.07l2.27,-2.06l0.09,-0.17l0.38,-2.2l0.88,-0.36l1.05,1.29l-0.04,1.88l-1.98,1.4l-1.72,1.13l-2.84,2.65l-3.34,3.73l-0.07,0.12l-0.63,2.22l-0.67,2.85l0.02,2.73l-0.47,0.54l-0.07,0.17l-0.36,3.28l0.12,0.27l3.03,2.32l-0.31,1.78l0.11,0.29l1.44,1.15l-0.11,1.17l-2.32,3.57l-3.59,1.51l-4.95,0.6l-2.72,-0.29l-0.32,0.38l0.5,1.67l-0.49,2.13l0.01,0.16l0.4,1.29l-1.27,0.88l-2.41,0.39l-2.33,-1.05l-0.31,0.04l-0.97,0.78l-0.11,0.27l0.35,2.98l0.16,0.23l1.69,0.91l0.31,-0.02l1.08,-0.75l0.46,0.96l-2.1,0.88l-2.01,1.89l-0.09,0.18l-0.36,3.05l-0.51,1.42l-2.16,0.01l-0.19,0.07l-1.96,1.59l-0.1,0.15l-0.72,2.34l0.08,0.31l2.46,2.31l0.13,0.07l2.09,0.56l-0.74,2.45l-2.86,1.75l-0.12,0.14l-1.59,3.71l-2.2,1.24l-0.1,0.09l-1.03,1.54l-0.04,0.23l0.81,3.45l0.06,0.13l1.13,1.32l-2.59,-0.57l-5.89,-0.44l-0.92,-1.73l0.05,-2.4l-0.34,-0.3l-1.49,0.19l-0.72,-0.98l-0.2,-3.21l1.79,-1.33l0.1,-0.13l0.79,-2.04l0.02,-0.16l-0.27,-1.52l1.31,-2.69l0.91,-4.15l-0.23,-1.72l0.91,-0.49l0.15,-0.33l-0.27,-1.16l-0.15,-0.2l-0.87,-0.46l0.65,-1.01l-0.04,-0.37l-1.06,-1.09l-0.54,-3.2l0.83,-0.51l0.14,-0.29l-0.42,-3.6l0.58,-2.98l0.64,-2.5l1.41,-1.0l0.12,-0.32l-0.75,-2.8l-0.01,-2.48l1.81,-1.78l0.09,-0.22l-0.06,-2.3l1.39,-2.69l0.03,-0.14l0.01,-2.58l-0.11,-0.24l-0.57,-0.45l-1.1,-4.59l1.49,-2.73l0.04,-0.17l-0.23,-2.59l0.86,-2.38l1.6,-2.48l1.74,-1.65l0.04,-0.39l-0.64,-0.89l0.42,-0.7l0.04,-0.16l-0.08,-4.26l2.55,-1.23l0.16,-0.18l0.86,-2.75l-0.01,-0.22l-0.22,-0.48l1.84,-2.1l3.0,0.59ZM256.77,438.98l-2.1,0.15l-1.18,-1.14l-0.19,-0.08l-1.53,-0.09l-2.38,-0.0l-0.0,-6.28l0.4,0.65l1.25,2.55l0.11,0.12l3.26,2.07l3.19,0.8l-0.82,1.26Z\", \"name\": \"Argentina\"}, \"AU\": {\"path\": \"M705.55,353.06l0.09,0.09l0.37,0.05l0.13,-0.35l-0.57,-1.69l0.48,0.3l0.71,0.99l0.34,0.11l0.2,-0.29l-0.04,-1.37l-0.04,-0.14l-1.22,-2.07l-0.28,-0.9l-0.51,-0.69l0.24,-1.33l0.52,-0.7l0.34,-1.32l0.01,-0.13l-0.25,-1.44l0.51,-0.94l0.1,1.03l0.23,0.26l0.32,-0.14l1.01,-1.72l1.94,-0.84l1.27,-1.14l1.84,-0.92l1.0,-0.18l0.6,0.28l0.26,-0.0l1.94,-0.96l1.48,-0.28l0.19,-0.13l0.32,-0.49l0.51,-0.18l1.42,0.05l2.63,-0.76l0.11,-0.06l1.36,-1.15l0.08,-0.1l0.61,-1.33l1.42,-1.27l0.1,-0.19l0.11,-1.03l0.06,-1.32l1.39,-1.74l0.85,1.79l0.4,0.14l1.07,-0.51l0.11,-0.45l-0.77,-1.05l0.53,-0.84l0.86,0.43l0.43,-0.22l0.29,-1.85l1.29,-1.19l0.6,-0.98l1.16,-0.4l0.2,-0.27l0.02,-0.34l0.74,0.2l0.38,-0.27l0.03,-0.44l1.98,-0.61l1.7,1.08l1.36,1.48l0.22,0.1l1.55,0.02l1.57,0.24l0.33,-0.4l-0.48,-1.27l1.09,-1.86l1.06,-0.63l0.1,-0.42l-0.28,-0.46l0.93,-1.24l1.36,-0.8l1.16,0.27l0.14,0.0l2.1,-0.48l0.23,-0.3l-0.05,-1.3l-0.18,-0.26l-1.08,-0.49l0.44,-0.12l1.52,0.58l1.39,1.06l2.11,0.65l0.19,-0.0l0.59,-0.21l1.44,0.72l0.27,0.0l1.37,-0.68l0.84,0.2l0.26,-0.06l0.37,-0.3l0.82,0.89l-0.56,1.14l-0.84,0.91l-0.75,0.07l-0.26,0.38l0.26,0.9l-0.67,1.15l-0.88,1.24l-0.05,0.25l0.18,0.72l0.12,0.17l1.99,1.42l1.96,0.84l1.25,0.86l1.8,1.51l0.19,0.07l0.63,-0.0l1.15,0.58l0.34,0.7l0.17,0.15l2.39,0.88l0.24,-0.02l1.65,-0.88l0.14,-0.16l0.49,-1.37l0.52,-1.19l0.31,-1.39l0.75,-2.02l0.01,-0.19l-0.33,-1.16l0.16,-0.67l0.0,-0.13l-0.28,-1.41l0.3,-1.78l0.42,-0.45l0.05,-0.33l-0.33,-0.73l0.56,-1.25l0.48,-1.39l0.07,-0.69l0.58,-0.59l0.48,0.84l0.17,1.53l0.17,0.24l0.47,0.23l0.09,0.9l0.05,0.14l0.87,1.23l0.17,1.33l-0.09,0.89l0.03,0.15l0.9,2.0l0.43,0.13l1.38,-0.83l0.71,0.92l1.06,0.88l-0.22,0.96l0.0,0.14l0.53,2.2l0.38,1.3l0.15,0.18l0.52,0.26l0.62,2.01l-0.23,1.27l0.02,0.18l0.81,1.76l0.14,0.14l2.69,1.35l3.21,2.21l-0.2,0.4l0.04,0.34l1.39,1.6l0.95,2.78l0.43,0.16l0.79,-0.46l0.85,0.96l0.39,0.05l0.22,-0.15l0.36,2.33l0.09,0.18l1.78,1.63l1.16,1.01l1.9,2.1l0.67,2.05l0.06,1.47l-0.17,1.64l0.03,0.17l1.16,2.22l-0.14,2.28l-0.43,1.24l-0.68,2.44l0.04,1.63l-0.48,1.92l-1.06,2.43l-1.79,1.32l-0.1,0.12l-0.91,2.15l-0.82,1.37l-0.76,2.47l-0.98,1.46l-0.63,2.14l-0.33,2.02l0.1,0.82l-1.21,0.85l-2.71,0.1l-0.13,0.03l-2.31,1.19l-1.21,1.17l-1.34,1.11l-1.89,-1.18l-1.33,-0.46l0.32,-1.24l-0.4,-0.35l-1.46,0.61l-2.06,1.98l-1.99,-0.73l-1.43,-0.46l-1.45,-0.22l-2.32,-0.81l-1.51,-1.67l-0.45,-2.11l-0.6,-1.5l-0.07,-0.11l-1.23,-1.16l-0.16,-0.08l-1.96,-0.28l0.59,-0.99l0.03,-0.24l-0.61,-2.1l-0.54,-0.08l-1.16,1.85l-1.23,0.29l0.73,-0.88l0.06,-0.12l0.37,-1.57l0.93,-1.33l0.05,-0.2l-0.2,-2.07l-0.53,-0.17l-2.01,2.35l-1.52,0.94l-0.12,0.14l-0.82,1.93l-1.5,-0.9l0.07,-1.32l-0.06,-0.2l-1.57,-2.04l-1.15,-0.92l0.3,-0.41l-0.1,-0.44l-3.21,-1.69l-0.13,-0.03l-1.69,-0.08l-2.35,-1.31l-0.16,-0.04l-4.55,0.27l-3.24,0.99l-2.8,0.91l-2.33,-0.18l-0.17,0.03l-2.63,1.41l-2.14,0.64l-0.2,0.19l-0.47,1.42l-0.8,0.99l-1.99,0.06l-1.55,0.24l-2.27,-0.5l-1.79,0.3l-1.71,0.13l-0.19,0.09l-1.38,1.39l-0.58,-0.1l-0.21,0.04l-1.26,0.8l-1.13,0.85l-1.72,-0.1l-1.6,-0.0l-2.58,-1.76l-1.21,-0.49l0.04,-1.19l1.04,-0.32l0.16,-0.12l0.42,-0.64l0.05,-0.19l-0.09,-0.97l0.3,-2.0l-0.28,-1.64l-1.34,-2.84l-0.39,-1.49l0.1,-1.51l-0.04,-0.17l-0.96,-1.72l-0.06,-0.73l-0.09,-0.19l-1.04,-1.01l-0.3,-2.02l-0.05,-0.12l-1.23,-1.83ZM784.95,393.35l2.39,1.01l0.2,0.01l3.26,-0.96l1.19,0.16l0.16,3.19l-0.78,0.95l-0.07,0.16l-0.19,1.83l-0.43,-0.41l-0.44,0.03l-1.61,1.96l-0.4,-0.12l-1.38,-0.09l-1.43,-2.42l-0.37,-2.03l-1.4,-2.53l0.04,-0.94l1.27,0.2Z\", \"name\": \"Australia\"}, \"IL\": {\"path\": \"M509.04,199.22l0.71,0.0l0.27,-0.17l0.15,-0.33l0.19,-0.01l0.02,0.73l-0.27,0.34l0.02,0.08l-0.32,0.62l-0.65,-0.27l-0.41,0.19l-0.52,1.85l0.16,0.35l0.14,0.07l-0.17,0.1l-0.14,0.21l-0.11,0.73l0.39,0.33l0.81,-0.26l0.03,0.64l-0.97,3.43l-1.28,-3.67l0.62,-0.78l-0.03,-0.41l0.58,-1.16l0.5,-2.07l0.27,-0.54Z\", \"name\": \"Israel\"}, \"IN\": {\"path\": \"M615.84,192.58l2.4,2.97l-0.24,2.17l0.05,0.2l0.94,1.35l-0.06,0.97l-1.46,-0.3l-0.35,0.36l0.7,3.06l0.12,0.18l2.46,1.75l3.11,1.72l-1.23,0.96l-0.1,0.13l-0.97,2.55l0.16,0.38l2.41,1.02l2.37,1.33l3.27,1.52l3.43,0.37l1.37,1.3l0.17,0.08l1.92,0.25l3.0,0.62l2.15,-0.04l0.28,-0.22l0.29,-1.06l0.0,-0.13l-0.32,-1.66l0.16,-0.94l1.0,-0.37l0.23,2.28l0.18,0.24l2.28,1.02l0.2,0.02l1.52,-0.41l2.06,0.18l2.08,-0.08l0.29,-0.27l0.18,-1.66l-0.1,-0.26l-0.53,-0.44l1.38,-0.23l0.15,-0.07l2.26,-2.0l2.75,-1.65l1.97,0.63l0.25,-0.03l1.54,-0.99l0.89,1.28l-0.72,0.97l0.2,0.48l2.49,0.37l0.11,0.61l-0.69,0.39l-0.15,0.3l0.15,1.22l-1.36,-0.37l-0.23,0.03l-3.24,1.86l-0.15,0.28l0.07,1.44l-1.33,2.16l-0.04,0.13l-0.12,1.24l-0.98,1.91l-1.72,-0.53l-0.39,0.28l-0.09,2.66l-0.52,0.83l-0.04,0.23l0.21,0.89l-0.71,0.36l-1.21,-3.85l-0.29,-0.21l-0.69,0.01l-0.29,0.23l-0.28,1.17l-0.84,-0.84l0.6,-1.17l0.97,-0.13l0.23,-0.16l1.15,-2.25l-0.18,-0.42l-1.54,-0.47l-2.3,0.04l-2.13,-0.33l-0.19,-1.63l-0.26,-0.26l-1.13,-0.13l-1.93,-1.13l-0.42,0.13l-0.88,1.82l0.08,0.37l1.47,1.15l-1.21,0.77l-0.1,0.1l-0.56,0.97l0.13,0.42l1.31,0.61l-0.36,1.35l0.01,0.2l0.85,1.95l0.37,2.05l-0.26,0.68l-1.55,-0.02l-3.09,0.54l-0.25,0.32l0.13,1.84l-1.21,1.4l-3.64,1.79l-2.79,3.04l-1.86,1.61l-2.48,1.68l-0.13,0.25l-0.0,1.0l-1.07,0.55l-2.21,0.9l-1.13,0.13l-0.25,0.19l-0.75,1.96l-0.02,0.15l0.52,3.31l0.13,2.03l-1.03,2.35l-0.03,0.12l-0.01,4.03l-1.02,0.1l-0.23,0.15l-1.14,1.93l0.04,0.36l0.44,0.48l-1.83,0.57l-0.18,0.15l-0.81,1.65l-0.74,0.53l-2.14,-2.12l-1.14,-3.47l-0.96,-2.57l-0.9,-1.26l-1.3,-2.38l-0.61,-3.14l-0.44,-1.62l-2.29,-3.56l-1.03,-4.94l-0.74,-3.29l0.01,-3.12l-0.49,-2.51l-0.41,-0.22l-3.56,1.53l-1.59,-0.28l-2.96,-2.87l0.94,-0.74l0.06,-0.41l-0.74,-1.03l-2.73,-2.1l1.35,-1.43l5.38,0.01l0.29,-0.36l-0.5,-2.29l-0.09,-0.15l-1.33,-1.28l-0.27,-1.96l-0.12,-0.2l-1.36,-1.0l2.42,-2.48l2.77,0.2l0.24,-0.1l2.62,-2.85l1.59,-2.8l2.41,-2.74l0.07,-0.2l-0.04,-1.82l2.01,-1.51l-0.01,-0.49l-1.95,-1.33l-0.83,-1.81l-0.82,-2.27l0.98,-0.97l3.64,0.66l2.89,-0.42l0.17,-0.08l2.18,-2.15Z\", \"name\": \"India\"}, \"TZ\": {\"path\": \"M505.77,287.58l0.36,0.23l8.95,5.03l0.15,1.3l0.13,0.21l3.4,2.37l-1.07,2.88l-0.02,0.14l0.15,1.42l0.15,0.23l1.47,0.84l0.05,0.42l-0.66,1.44l-0.02,0.18l0.13,0.72l-0.16,1.16l0.03,0.19l0.87,1.57l1.03,2.48l0.12,0.14l0.53,0.32l-1.59,1.18l-2.64,0.95l-1.45,-0.04l-0.2,0.07l-0.81,0.69l-1.64,0.06l-0.68,0.3l-2.9,-0.69l-1.71,0.17l-0.65,-3.18l-0.05,-0.12l-1.35,-1.88l-0.19,-0.12l-2.41,-0.46l-1.38,-0.74l-1.63,-0.44l-0.96,-0.41l-0.95,-0.58l-1.31,-3.09l-1.47,-1.46l-0.45,-1.31l0.24,-1.34l-0.39,-1.99l0.71,-0.08l0.18,-0.09l0.91,-0.91l0.98,-1.31l0.59,-0.5l0.11,-0.24l-0.02,-0.81l-0.08,-0.2l-0.47,-0.5l-0.1,-0.67l0.51,-0.23l0.18,-0.25l0.14,-1.47l-0.05,-0.2l-0.76,-1.09l0.45,-0.15l2.71,0.03l5.01,-0.19Z\", \"name\": \"Tanzania\"}, \"AZ\": {\"path\": \"M539.36,175.66l0.16,0.09l1.11,0.2l0.32,-0.15l0.4,-0.71l1.22,-0.99l1.11,1.33l1.26,2.09l0.22,0.14l1.06,0.13l0.28,0.29l-1.46,0.17l-0.26,0.24l-0.43,2.26l-0.39,0.92l-0.85,0.63l-0.12,0.25l0.06,1.2l-0.22,0.05l-1.28,-1.25l0.74,-1.25l-0.03,-0.35l-0.74,-0.86l-0.3,-0.1l-1.05,0.27l-2.49,1.82l-0.04,-1.46l-0.18,-0.27l-1.09,-0.47l-0.8,-0.6l0.53,-0.7l-0.06,-0.42l-1.11,-0.84l0.34,-0.51l-0.11,-0.43l-0.89,-0.48l-0.33,-0.49l0.25,-0.2l1.78,0.81l1.35,0.18l0.25,-0.09l0.34,-0.35l0.02,-0.39l-1.04,-1.36l0.28,-0.18l0.49,0.07l1.65,1.74ZM533.53,180.16l0.63,0.67l0.22,0.09l0.8,-0.0l0.04,0.31l0.66,1.09l-0.94,-0.21l-1.16,-1.24l-0.25,-0.71Z\", \"name\": \"Azerbaijan\"}, \"IE\": {\"path\": \"M405.17,135.35l0.36,2.16l-1.78,2.84l-4.28,1.91l-3.02,-0.43l1.81,-3.13l0.02,-0.26l-1.23,-3.26l3.24,-2.56l1.54,-1.32l0.37,1.33l-0.49,1.77l0.3,0.38l1.49,-0.05l1.68,0.63Z\", \"name\": \"Ireland\"}, \"ID\": {\"path\": \"M756.56,287.86l0.69,4.02l0.15,0.21l2.59,1.5l0.39,-0.07l2.05,-2.61l2.75,-1.45l2.09,-0.0l2.08,0.85l1.85,0.89l2.52,0.46l0.08,15.44l-1.72,-1.6l-0.15,-0.07l-2.54,-0.51l-0.29,0.1l-0.53,0.62l-2.53,0.06l0.78,-1.51l1.48,-0.66l0.17,-0.34l-0.65,-2.74l-1.23,-2.19l-0.14,-0.13l-4.85,-2.13l-2.09,-0.23l-3.7,-2.28l-0.41,0.1l-0.67,1.11l-0.63,0.14l-0.41,-0.67l-0.01,-1.01l-0.14,-0.25l-1.39,-0.89l2.05,-0.69l1.73,0.05l0.29,-0.39l-0.21,-0.66l-0.29,-0.21l-3.5,-0.0l-0.9,-1.36l-0.19,-0.13l-2.14,-0.44l-0.65,-0.76l2.86,-0.51l1.28,-0.79l3.75,0.96l0.32,0.76ZM758.01,300.37l-0.79,1.04l-0.14,-1.07l0.4,-0.81l0.29,-0.47l0.24,0.31l-0.0,1.0ZM747.45,292.9l0.48,1.02l-1.45,-0.69l-2.09,-0.21l-1.45,0.16l-1.28,-0.07l0.35,-0.81l2.86,-0.1l2.58,0.68ZM741.15,285.69l-0.16,-0.25l-0.72,-3.08l0.47,-1.86l0.35,-0.38l0.1,0.73l0.25,0.26l1.28,0.19l0.18,0.78l-0.11,1.8l-0.96,-0.18l-0.35,0.22l-0.38,1.52l0.05,0.24ZM741.19,285.75l0.76,0.97l-0.11,0.05l-0.65,-1.02ZM739.18,293.52l-0.61,0.54l-1.44,-0.38l-0.25,-0.55l1.93,-0.09l0.36,0.48ZM728.4,295.87l-0.27,-0.07l-2.26,0.89l-0.37,-0.41l0.27,-0.8l-0.09,-0.33l-1.68,-1.37l0.17,-2.29l-0.42,-0.3l-1.67,0.76l-0.17,0.29l0.21,2.92l0.09,3.34l-1.22,0.28l-0.78,-0.54l0.65,-2.1l0.01,-0.14l-0.39,-2.42l-0.29,-0.25l-0.86,-0.02l-0.63,-1.4l0.99,-1.61l0.35,-1.97l1.24,-3.73l0.49,-0.96l1.95,-1.7l1.86,0.69l3.16,0.35l2.92,-0.1l0.17,-0.06l2.24,-1.65l0.11,0.14l-1.8,2.22l-1.72,0.44l-2.41,-0.48l-4.21,0.13l-2.19,0.36l-0.25,0.24l-0.36,1.9l0.08,0.27l2.24,2.23l0.4,0.02l1.29,-1.08l3.19,-0.58l-0.19,0.06l-1.04,1.4l-2.13,0.94l-0.12,0.45l2.26,3.06l-0.37,0.69l0.03,0.32l1.51,1.95ZM728.48,295.97l0.59,0.76l-0.02,1.37l-1.0,0.55l-0.64,-0.58l1.09,-1.84l-0.02,-0.26ZM728.64,286.95l0.79,-0.14l-0.07,0.39l-0.72,-0.24ZM732.38,310.1l-1.89,0.49l-0.06,-0.06l0.17,-0.64l1.0,-1.42l2.14,-0.87l0.1,0.2l0.04,0.58l-1.49,1.72ZM728.26,305.71l-0.17,0.63l-3.53,0.67l-3.02,-0.28l-0.0,-0.42l1.66,-0.44l1.47,0.71l0.16,0.03l1.75,-0.21l1.69,-0.69ZM722.98,310.33l-0.74,0.03l-2.52,-1.35l1.42,-0.3l1.19,0.7l0.72,0.63l-0.06,0.28ZM716.24,305.63l0.66,0.49l0.22,0.06l1.35,-0.18l0.31,0.53l-4.18,0.77l-0.8,-0.01l0.51,-0.86l1.2,-0.02l0.24,-0.12l0.49,-0.65ZM715.84,280.21l0.09,0.34l2.25,1.86l-2.25,0.22l-0.24,0.17l-0.84,1.71l-0.03,0.15l0.1,2.11l-2.27,1.62l-0.13,0.24l-0.06,2.46l-0.74,2.92l-0.02,-0.05l-0.39,-0.16l-2.62,1.04l-0.86,-1.33l-0.23,-0.14l-1.71,-0.14l-1.19,-0.76l-0.25,-0.03l-2.78,0.84l-0.79,-1.05l-0.26,-0.12l-1.61,0.13l-1.8,-0.25l-0.36,-3.13l-0.15,-0.23l-1.18,-0.65l-1.13,-2.02l-0.33,-2.1l0.27,-2.19l1.05,-1.17l0.28,1.12l0.1,0.16l1.71,1.41l0.28,0.05l1.55,-0.49l1.54,0.17l0.23,-0.07l1.4,-1.21l1.05,-0.19l2.3,0.68l0.16,0.0l2.04,-0.53l0.21,-0.19l1.26,-3.41l0.91,-0.82l0.09,-0.14l0.8,-2.64l2.63,0.0l1.71,0.33l-1.19,1.89l0.02,0.34l1.74,2.24l-0.37,1.0ZM692.67,302.0l0.26,0.19l4.8,0.25l0.28,-0.16l0.44,-0.83l4.29,1.12l0.85,1.52l0.23,0.15l3.71,0.45l2.37,1.15l-2.06,0.69l-2.77,-1.0l-2.25,0.07l-2.57,-0.18l-2.31,-0.45l-2.94,-0.97l-1.84,-0.25l-0.13,0.01l-0.97,0.29l-4.34,-0.98l-0.38,-0.94l-0.25,-0.19l-1.76,-0.14l1.31,-1.84l2.81,0.14l1.97,0.96l0.95,0.19l0.28,0.74ZM685.63,299.27l-2.36,0.04l-2.07,-2.05l-3.17,-2.02l-1.06,-1.5l-1.88,-2.02l-1.22,-1.85l-1.9,-3.49l-2.2,-2.11l-0.71,-2.08l-0.94,-1.99l-0.1,-0.12l-2.21,-1.54l-1.35,-2.17l-1.86,-1.39l-2.53,-2.68l-0.14,-0.81l1.22,0.08l3.76,0.47l2.16,2.4l1.94,1.7l1.37,1.04l2.35,2.67l0.22,0.1l2.44,0.04l1.99,1.62l1.42,2.06l0.09,0.09l1.67,1.0l-0.88,1.8l0.11,0.39l1.44,0.87l0.13,0.04l0.68,0.05l0.41,1.62l0.87,1.4l0.22,0.14l1.71,0.21l1.06,1.38l-0.61,3.04l-0.09,3.6Z\", \"name\": \"Indonesia\"}, \"UA\": {\"path\": \"M500.54,141.42l0.9,0.13l0.27,-0.11l0.52,-0.62l0.68,0.13l2.43,-0.3l1.32,1.57l-0.45,0.48l-0.07,0.26l0.21,1.03l0.27,0.24l1.85,0.15l0.76,1.22l-0.05,0.55l0.2,0.31l3.18,1.15l0.18,0.01l1.75,-0.47l1.42,1.41l0.22,0.09l1.42,-0.03l3.44,0.99l0.02,0.65l-0.97,1.62l-0.03,0.24l0.52,1.67l-0.29,0.79l-2.24,0.22l-0.14,0.05l-1.29,0.89l-0.13,0.23l-0.07,1.16l-1.75,0.22l-0.12,0.04l-1.6,0.98l-2.27,0.16l-0.12,0.04l-2.16,1.17l-0.16,0.29l0.15,1.94l0.14,0.23l1.23,0.75l0.18,0.04l2.06,-0.15l-0.22,0.51l-2.67,0.54l-3.27,1.72l-1.0,-0.45l0.45,-1.19l-0.19,-0.39l-2.34,-0.78l0.15,-0.2l2.32,-1.0l0.09,-0.49l-0.73,-0.72l-0.15,-0.08l-3.69,-0.75l-0.14,-0.96l-0.35,-0.25l-2.32,0.39l-0.21,0.15l-0.91,1.7l-1.77,2.1l-0.93,-0.44l-0.24,-0.0l-1.05,0.45l-0.48,-0.25l0.13,-0.07l0.14,-0.15l0.43,-1.04l0.67,-0.97l0.04,-0.26l-0.1,-0.31l0.04,-0.02l0.11,0.19l0.24,0.15l1.48,0.09l0.78,-0.25l0.07,-0.53l-0.27,-0.19l0.09,-0.25l-0.08,-0.33l-0.81,-0.74l-0.34,-1.24l-0.14,-0.18l-0.73,-0.42l0.15,-0.87l-0.11,-0.29l-1.13,-0.86l-0.15,-0.06l-0.97,-0.11l-1.79,-0.97l-0.2,-0.03l-1.66,0.32l-0.13,0.06l-0.52,0.41l-0.95,-0.0l-0.23,0.11l-0.56,0.66l-1.74,0.29l-0.79,0.43l-1.01,-0.68l-0.16,-0.05l-1.57,-0.01l-1.52,-0.35l-0.23,0.04l-0.71,0.45l-0.09,-0.43l-0.13,-0.19l-1.18,-0.74l0.38,-1.02l0.53,-0.64l0.35,0.12l0.37,-0.41l-0.57,-1.29l2.1,-2.5l1.16,-0.36l0.2,-0.2l0.27,-0.92l-0.01,-0.2l-1.1,-2.52l0.79,-0.09l0.13,-0.05l1.3,-0.86l1.83,-0.07l2.48,0.26l2.84,0.8l1.91,0.06l0.88,0.45l0.29,-0.01l0.72,-0.44l0.49,0.58l0.25,0.11l2.2,-0.16l0.94,0.3l0.39,-0.26l0.15,-1.57l0.61,-0.59l2.01,-0.19Z\", \"name\": \"Ukraine\"}, \"QA\": {\"path\": \"M548.47,221.47l-0.15,-1.72l0.59,-1.23l0.38,-0.16l0.54,0.6l0.04,1.4l-0.47,1.37l-0.41,0.11l-0.53,-0.37Z\", \"name\": \"Qatar\"}, \"MZ\": {\"path\": \"M507.71,314.14l1.65,-0.18l2.96,0.7l0.2,-0.02l0.6,-0.29l1.68,-0.06l0.18,-0.07l0.8,-0.69l1.5,0.02l2.74,-0.98l1.74,-1.27l0.25,0.7l-0.1,2.47l0.31,2.27l0.1,3.97l0.42,1.24l-0.7,1.71l-0.94,1.73l-1.52,1.52l-5.06,2.21l-2.88,2.8l-1.01,0.51l-1.72,1.81l-0.99,0.58l-0.15,0.23l-0.21,1.86l0.04,0.19l1.17,1.95l0.47,1.47l0.03,0.74l0.39,0.28l0.05,-0.01l-0.06,2.13l-0.39,1.19l0.1,0.33l0.42,0.32l-0.28,0.83l-0.95,0.86l-2.03,0.88l-3.08,1.49l-1.1,0.99l-0.09,0.28l0.21,1.13l0.21,0.23l0.38,0.11l-0.14,0.89l-1.39,-0.02l-0.17,-0.94l-0.38,-1.23l-0.2,-0.89l0.44,-2.91l-0.01,-0.14l-0.65,-1.88l-1.15,-3.55l2.52,-2.85l0.68,-1.89l0.29,-0.18l0.14,-0.2l0.28,-1.53l-0.03,-0.19l-0.36,-0.7l0.1,-1.83l0.49,-1.84l-0.01,-3.26l-0.14,-0.25l-1.3,-0.83l-0.11,-0.04l-1.08,-0.17l-0.47,-0.55l-0.1,-0.08l-1.16,-0.54l-0.13,-0.03l-1.83,0.04l-0.32,-2.25l7.19,-1.99l1.32,1.12l0.29,0.06l0.55,-0.19l0.75,0.49l0.11,0.81l-0.49,1.11l-0.02,0.15l0.19,1.81l0.09,0.18l1.63,1.59l0.48,-0.1l0.72,-1.68l0.99,-0.49l0.17,-0.29l-0.21,-3.29l-0.04,-0.13l-1.11,-1.92l-0.9,-0.82l-0.21,-0.08l-0.62,0.03l-0.63,-2.98l0.61,-1.67Z\", \"name\": \"Mozambique\"}}, \"height\": 440.7063107441331, \"projection\": {\"type\": \"mill\", \"centralMeridian\": 11.5}, \"width\": 900.0});\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/layer/extend/layer.ext.js",
    "content": "﻿/*! layer弹层组件拓展类 */\n;!function(){layer.use(\"skin/layer.ext.css\",function(){layer.layui_layer_extendlayerextjs=!0});var a=layer.cache||{},b=function(b){return a.skin?\" \"+a.skin+\" \"+a.skin+\"-\"+b:\"\"};layer.prompt=function(a,c){a=a||{},\"function\"==typeof a&&(c=a);var d,e=2==a.formType?'<textarea class=\"layui-layer-input\">'+(a.value||\"\")+\"</textarea>\":function(){return'<input type=\"'+(1==a.formType?\"password\":\"text\")+'\" class=\"layui-layer-input\" value=\"'+(a.value||\"\")+'\">'}();return layer.open($.extend({btn:[\"&#x786E;&#x5B9A;\",\"&#x53D6;&#x6D88;\"],content:e,skin:\"layui-layer-prompt\"+b(\"prompt\"),success:function(a){d=a.find(\".layui-layer-input\"),d.focus()},yes:function(b){var e=d.val();\"\"===e?d.focus():e.length>(a.maxlength||500)?layer.tips(\"&#x6700;&#x591A;&#x8F93;&#x5165;\"+(a.maxlength||500)+\"&#x4E2A;&#x5B57;&#x6570;\",d,{tips:1}):c&&c(e,b,d)}},a))},layer.tab=function(a){a=a||{};var c=a.tab||{};return layer.open($.extend({type:1,skin:\"layui-layer-tab\"+b(\"tab\"),title:function(){var a=c.length,b=1,d=\"\";if(a>0)for(d='<span class=\"layui-layer-tabnow\">'+c[0].title+\"</span>\";a>b;b++)d+=\"<span>\"+c[b].title+\"</span>\";return d}(),content:'<ul class=\"layui-layer-tabmain\">'+function(){var a=c.length,b=1,d=\"\";if(a>0)for(d='<li class=\"layui-layer-tabli xubox_tab_layer\">'+(c[0].content||\"no content\")+\"</li>\";a>b;b++)d+='<li class=\"layui-layer-tabli\">'+(c[b].content||\"no  content\")+\"</li>\";return d}()+\"</ul>\",success:function(a){var b=a.find(\".layui-layer-title\").children(),c=a.find(\".layui-layer-tabmain\").children();b.on(\"mousedown\",function(a){a.stopPropagation?a.stopPropagation():a.cancelBubble=!0;var b=$(this),d=b.index();b.addClass(\"layui-layer-tabnow\").siblings().removeClass(\"layui-layer-tabnow\"),c.eq(d).show().siblings().hide()})}},a))},layer.photos=function(a,c,d){function e(a,b,c){var d=new Image;d.onload=function(){d.onload=null,b(d)},d.onerror=function(a){d.onerror=null,c(a)},d.src=a}var f={};if(a=a||{},a.photos){var g=a.photos.constructor===Object,h=g?a.photos:{},i=h.data||[],j=h.start||0;if(f.imgIndex=j+1,g){if(0===i.length)return void layer.msg(\"&#x6CA1;&#x6709;&#x56FE;&#x7247;\")}else{var k=$(a.photos),l=k.find(a.img||\"img\");if(0===l.length)return;if(c||k.find(h.img||\"img\").each(function(b){var c=$(this);i.push({alt:c.attr(\"alt\"),pid:c.attr(\"layer-pid\"),src:c.attr(\"layer-src\")||c.attr(\"src\"),thumb:c.attr(\"src\")}),c.on(\"click\",function(){layer.photos($.extend(a,{photos:{start:b,data:i,tab:a.tab},full:a.full}),!0)})}),!c)return}f.imgprev=function(a){f.imgIndex--,f.imgIndex<1&&(f.imgIndex=i.length),f.tabimg(a)},f.imgnext=function(a,b){f.imgIndex++,f.imgIndex>i.length&&(f.imgIndex=1,b)||f.tabimg(a)},f.keyup=function(a){if(!f.end){var b=a.keyCode;a.preventDefault(),37===b?f.imgprev(!0):39===b?f.imgnext(!0):27===b&&layer.close(f.index)}},f.tabimg=function(b){i.length<=1||(h.start=f.imgIndex-1,layer.close(f.index),layer.photos(a,!0,b))},f.event=function(){f.bigimg.hover(function(){f.imgsee.show()},function(){f.imgsee.hide()}),f.bigimg.find(\".layui-layer-imgprev\").on(\"click\",function(a){a.preventDefault(),f.imgprev()}),f.bigimg.find(\".layui-layer-imgnext\").on(\"click\",function(a){a.preventDefault(),f.imgnext()}),$(document).on(\"keyup\",f.keyup)},f.loadi=layer.load(1,{shade:\"shade\"in a?!1:.9,scrollbar:!1}),e(i[j].src,function(c){layer.close(f.loadi),f.index=layer.open($.extend({type:1,area:function(){var b=[c.width,c.height],d=[$(window).width()-100,$(window).height()-100];return!a.full&&b[0]>d[0]&&(b[0]=d[0],b[1]=b[0]*d[1]/b[0]),[b[0]+\"px\",b[1]+\"px\"]}(),title:!1,shade:.9,shadeClose:!0,closeBtn:!1,move:\".layui-layer-phimg img\",moveType:1,scrollbar:!1,moveOut:!0,shift:5*Math.random()|0,skin:\"layui-layer-photos\"+b(\"photos\"),content:'<div class=\"layui-layer-phimg\"><img src=\"'+i[j].src+'\" alt=\"'+(i[j].alt||\"\")+'\" layer-pid=\"'+i[j].pid+'\"><div class=\"layui-layer-imgsee\">'+(i.length>1?'<span class=\"layui-layer-imguide\"><a href=\"javascript:;\" class=\"layui-layer-iconext layui-layer-imgprev\"></a><a href=\"javascript:;\" class=\"layui-layer-iconext layui-layer-imgnext\"></a></span>':\"\")+'<div class=\"layui-layer-imgbar\" style=\"display:'+(d?\"block\":\"\")+'\"><span class=\"layui-layer-imgtit\"><a href=\"javascript:;\">'+(i[j].alt||\"\")+\"</a><em>\"+f.imgIndex+\"/\"+i.length+\"</em></span></div></div></div>\",success:function(b,c){f.bigimg=b.find(\".layui-layer-phimg\"),f.imgsee=b.find(\".layui-layer-imguide,.layui-layer-imgbar\"),f.event(b),a.tab&&a.tab(i[j],b)},end:function(){f.end=!0,$(document).off(\"keyup\",f.keyup)}},a))},function(){layer.close(f.loadi),layer.msg(\"&#x5F53;&#x524D;&#x56FE;&#x7247;&#x5730;&#x5740;&#x5F02;&#x5E38;<br>&#x662F;&#x5426;&#x7EE7;&#x7EED;&#x67E5;&#x770B;&#x4E0B;&#x4E00;&#x5F20;&#xFF1F;\",{time:3e4,btn:[\"下一张\",\"不看了\"],yes:function(){i.length>1&&f.imgnext(!0,!0)}})})}}}();\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/layer/laydate/laydate.js",
    "content": "﻿/**\n \n @Name : layDate v1.1 日期控件\n @Author: 贤心\n @Date: 2014-06-25\n @QQ群：176047195\n @Site：http://sentsin.com/layui/laydate\n \n */\n\n;!function(a){var b={path:\"\",defSkin:\"default\",format:\"YYYY-MM-DD\",min:\"1900-01-01 00:00:00\",max:\"2099-12-31 23:59:59\",isv:!1},c={},d=document,e=\"createElement\",f=\"getElementById\",g=\"getElementsByTagName\",h=[\"laydate_box\",\"laydate_void\",\"laydate_click\",\"LayDateSkin\",\"skins/\",\"/laydate.css\"];a.laydate=function(b){b=b||{};try{h.event=a.event?a.event:laydate.caller.arguments[0]}catch(d){}return c.run(b),laydate},laydate.v=\"1.1\",c.getPath=function(){var a=document.scripts,c=a[a.length-1].src;return b.path?b.path:c.substring(0,c.lastIndexOf(\"/\")+1)}(),c.use=function(a,b){var f=d[e](\"link\");f.type=\"text/css\",f.rel=\"stylesheet\",f.href=c.getPath+a+h[5],b&&(f.id=b),d[g](\"head\")[0].appendChild(f),f=null},c.trim=function(a){return a=a||\"\",a.replace(/^\\s|\\s$/g,\"\").replace(/\\s+/g,\" \")},c.digit=function(a){return 10>a?\"0\"+(0|a):a},c.stopmp=function(b){return b=b||a.event,b.stopPropagation?b.stopPropagation():b.cancelBubble=!0,this},c.each=function(a,b){for(var c=0,d=a.length;d>c&&b(c,a[c])!==!1;c++);},c.hasClass=function(a,b){return a=a||{},new RegExp(\"\\\\b\"+b+\"\\\\b\").test(a.className)},c.addClass=function(a,b){return a=a||{},c.hasClass(a,b)||(a.className+=\" \"+b),a.className=c.trim(a.className),this},c.removeClass=function(a,b){if(a=a||{},c.hasClass(a,b)){var d=new RegExp(\"\\\\b\"+b+\"\\\\b\");a.className=a.className.replace(d,\"\")}return this},c.removeCssAttr=function(a,b){var c=a.style;c.removeProperty?c.removeProperty(b):c.removeAttribute(b)},c.shde=function(a,b){a.style.display=b?\"none\":\"block\"},c.query=function(a){var e,b,h,i,j;return a=c.trim(a).split(\" \"),b=d[f](a[0].substr(1)),b?a[1]?/^\\./.test(a[1])?(i=a[1].substr(1),j=new RegExp(\"\\\\b\"+i+\"\\\\b\"),e=[],h=d.getElementsByClassName?b.getElementsByClassName(i):b[g](\"*\"),c.each(h,function(a,b){j.test(b.className)&&e.push(b)}),e[0]?e:\"\"):(e=b[g](a[1]),e[0]?b[g](a[1]):\"\"):b:void 0},c.on=function(b,d,e){return b.attachEvent?b.attachEvent(\"on\"+d,function(){e.call(b,a.even)}):b.addEventListener(d,e,!1),c},c.stopMosup=function(a,b){\"mouseup\"!==a&&c.on(b,\"mouseup\",function(a){c.stopmp(a)})},c.run=function(a){var d,e,g,b=c.query,f=h.event;try{g=f.target||f.srcElement||{}}catch(i){g={}}if(d=a.elem?b(a.elem):g,f&&g.tagName){if(!d||d===c.elem)return;c.stopMosup(f.type,d),c.stopmp(f),c.view(d,a),c.reshow()}else e=a.event||\"click\",c.each((0|d.length)>0?d:[d],function(b,d){c.stopMosup(e,d),c.on(d,e,function(b){c.stopmp(b),d!==c.elem&&(c.view(d,a),c.reshow())})})},c.scroll=function(a){return a=a?\"scrollLeft\":\"scrollTop\",d.body[a]|d.documentElement[a]},c.winarea=function(a){return document.documentElement[a?\"clientWidth\":\"clientHeight\"]},c.isleap=function(a){return 0===a%4&&0!==a%100||0===a%400},c.checkVoid=function(a,b,d){var e=[];return a=0|a,b=0|b,d=0|d,a<c.mins[0]?e=[\"y\"]:a>c.maxs[0]?e=[\"y\",1]:a>=c.mins[0]&&a<=c.maxs[0]&&(a==c.mins[0]&&(b<c.mins[1]?e=[\"m\"]:b==c.mins[1]&&d<c.mins[2]&&(e=[\"d\"])),a==c.maxs[0]&&(b>c.maxs[1]?e=[\"m\",1]:b==c.maxs[1]&&d>c.maxs[2]&&(e=[\"d\",1]))),e},c.timeVoid=function(a,b){if(c.ymd[1]+1==c.mins[1]&&c.ymd[2]==c.mins[2]){if(0===b&&a<c.mins[3])return 1;if(1===b&&a<c.mins[4])return 1;if(2===b&&a<c.mins[5])return 1}else if(c.ymd[1]+1==c.maxs[1]&&c.ymd[2]==c.maxs[2]){if(0===b&&a>c.maxs[3])return 1;if(1===b&&a>c.maxs[4])return 1;if(2===b&&a>c.maxs[5])return 1}return a>(b?59:23)?1:void 0},c.check=function(){var a=c.options.format.replace(/YYYY|MM|DD|hh|mm|ss/g,\"\\\\d+\\\\\").replace(/\\\\$/g,\"\"),b=new RegExp(a),d=c.elem[h.elemv],e=d.match(/\\d+/g)||[],f=c.checkVoid(e[0],e[1],e[2]);if(\"\"!==d.replace(/\\s/g,\"\")){if(!b.test(d))return c.elem[h.elemv]=\"\",c.msg(\"日期不符合格式，请重新选择。\"),1;if(f[0])return c.elem[h.elemv]=\"\",c.msg(\"日期不在有效期内，请重新选择。\"),1;f.value=c.elem[h.elemv].match(b).join(),e=f.value.match(/\\d+/g),e[1]<1?(e[1]=1,f.auto=1):e[1]>12?(e[1]=12,f.auto=1):e[1].length<2&&(f.auto=1),e[2]<1?(e[2]=1,f.auto=1):e[2]>c.months[(0|e[1])-1]?(e[2]=31,f.auto=1):e[2].length<2&&(f.auto=1),e.length>3&&(c.timeVoid(e[3],0)&&(f.auto=1),c.timeVoid(e[4],1)&&(f.auto=1),c.timeVoid(e[5],2)&&(f.auto=1)),f.auto?c.creation([e[0],0|e[1],0|e[2]],1):f.value!==c.elem[h.elemv]&&(c.elem[h.elemv]=f.value)}},c.months=[31,null,31,30,31,30,31,31,30,31,30,31],c.viewDate=function(a,b,d){var f=(c.query,{}),g=new Date;a<(0|c.mins[0])&&(a=0|c.mins[0]),a>(0|c.maxs[0])&&(a=0|c.maxs[0]),g.setFullYear(a,b,d),f.ymd=[g.getFullYear(),g.getMonth(),g.getDate()],c.months[1]=c.isleap(f.ymd[0])?29:28,g.setFullYear(f.ymd[0],f.ymd[1],1),f.FDay=g.getDay(),f.PDay=c.months[0===b?11:b-1]-f.FDay+1,f.NDay=1,c.each(h.tds,function(a,b){var g,d=f.ymd[0],e=f.ymd[1]+1;b.className=\"\",a<f.FDay?(b.innerHTML=g=a+f.PDay,c.addClass(b,\"laydate_nothis\"),1===e&&(d-=1),e=1===e?12:e-1):a>=f.FDay&&a<f.FDay+c.months[f.ymd[1]]?(b.innerHTML=g=a-f.FDay+1,a-f.FDay+1===f.ymd[2]&&(c.addClass(b,h[2]),f.thisDay=b)):(b.innerHTML=g=f.NDay++,c.addClass(b,\"laydate_nothis\"),12===e&&(d+=1),e=12===e?1:e+1),c.checkVoid(d,e,g)[0]&&c.addClass(b,h[1]),c.options.festival&&c.festival(b,e+\".\"+g),b.setAttribute(\"y\",d),b.setAttribute(\"m\",e),b.setAttribute(\"d\",g),d=e=g=null}),c.valid=!c.hasClass(f.thisDay,h[1]),c.ymd=f.ymd,h.year.value=c.ymd[0]+\"年\",h.month.value=c.digit(c.ymd[1]+1)+\"月\",c.each(h.mms,function(a,b){var d=c.checkVoid(c.ymd[0],(0|b.getAttribute(\"m\"))+1);\"y\"===d[0]||\"m\"===d[0]?c.addClass(b,h[1]):c.removeClass(b,h[1]),c.removeClass(b,h[2]),d=null}),c.addClass(h.mms[c.ymd[1]],h[2]),f.times=[0|c.inymd[3]||0,0|c.inymd[4]||0,0|c.inymd[5]||0],c.each(new Array(3),function(a){c.hmsin[a].value=c.digit(c.timeVoid(f.times[a],a)?0|c.mins[a+3]:0|f.times[a])}),c[c.valid?\"removeClass\":\"addClass\"](h.ok,h[1])},c.festival=function(a,b){var c;switch(b){case\"1.1\":c=\"元旦\";break;case\"3.8\":c=\"妇女\";break;case\"4.5\":c=\"清明\";break;case\"5.1\":c=\"劳动\";break;case\"6.1\":c=\"儿童\";break;case\"9.10\":c=\"教师\";break;case\"10.1\":c=\"国庆\"}c&&(a.innerHTML=c),c=null},c.viewYears=function(a){var b=c.query,d=\"\";c.each(new Array(14),function(b){d+=7===b?\"<li \"+(parseInt(h.year.value)===a?'class=\"'+h[2]+'\"':\"\")+' y=\"'+a+'\">'+a+\"年</li>\":'<li y=\"'+(a-7+b)+'\">'+(a-7+b)+\"年</li>\"}),b(\"#laydate_ys\").innerHTML=d,c.each(b(\"#laydate_ys li\"),function(a,b){\"y\"===c.checkVoid(b.getAttribute(\"y\"))[0]?c.addClass(b,h[1]):c.on(b,\"click\",function(a){c.stopmp(a).reshow(),c.viewDate(0|this.getAttribute(\"y\"),c.ymd[1],c.ymd[2])})})},c.initDate=function(){var d=(c.query,new Date),e=c.elem[h.elemv].match(/\\d+/g)||[];e.length<3&&(e=c.options.start.match(/\\d+/g)||[],e.length<3&&(e=[d.getFullYear(),d.getMonth()+1,d.getDate()])),c.inymd=e,c.viewDate(e[0],e[1]-1,e[2])},c.iswrite=function(){var a=c.query,b={time:a(\"#laydate_hms\")};c.shde(b.time,!c.options.istime),c.shde(h.oclear,!(\"isclear\"in c.options?c.options.isclear:1)),c.shde(h.otoday,!(\"istoday\"in c.options?c.options.istoday:1)),c.shde(h.ok,!(\"issure\"in c.options?c.options.issure:1))},c.orien=function(a,b){var d,e=c.elem.getBoundingClientRect();a.style.left=e.left+(b?0:c.scroll(1))+\"px\",d=e.bottom+a.offsetHeight/1.5<=c.winarea()?e.bottom-1:e.top>a.offsetHeight/1.5?e.top-a.offsetHeight+1:c.winarea()-a.offsetHeight,a.style.top=d+(b?0:c.scroll())+\"px\"},c.follow=function(a){c.options.fixed?(a.style.position=\"fixed\",c.orien(a,1)):(a.style.position=\"absolute\",c.orien(a))},c.viewtb=function(){var a,b=[],f=[\"日\",\"一\",\"二\",\"三\",\"四\",\"五\",\"六\"],h={},i=d[e](\"table\"),j=d[e](\"thead\");return j.appendChild(d[e](\"tr\")),h.creath=function(a){var b=d[e](\"th\");b.innerHTML=f[a],j[g](\"tr\")[0].appendChild(b),b=null},c.each(new Array(6),function(d){b.push([]),a=i.insertRow(0),c.each(new Array(7),function(c){b[d][c]=0,0===d&&h.creath(c),a.insertCell(c)})}),i.insertBefore(j,i.children[0]),i.id=i.className=\"laydate_table\",a=b=null,i.outerHTML.toLowerCase()}(),c.view=function(a,f){var i,g=c.query,j={};f=f||a,c.elem=a,c.options=f,c.options.format||(c.options.format=b.format),c.options.start=c.options.start||\"\",c.mm=j.mm=[c.options.min||b.min,c.options.max||b.max],c.mins=j.mm[0].match(/\\d+/g),c.maxs=j.mm[1].match(/\\d+/g),h.elemv=/textarea|input/.test(c.elem.tagName.toLocaleLowerCase())?\"value\":\"innerHTML\",c.box?c.shde(c.box):(i=d[e](\"div\"),i.id=h[0],i.className=h[0],i.style.cssText=\"position: absolute;\",i.setAttribute(\"name\",\"laydate-v\"+laydate.v),i.innerHTML=j.html='<div class=\"laydate_top\"><div class=\"laydate_ym laydate_y\" id=\"laydate_YY\"><a class=\"laydate_choose laydate_chprev laydate_tab\"><cite></cite></a><input id=\"laydate_y\" readonly><label></label><a class=\"laydate_choose laydate_chnext laydate_tab\"><cite></cite></a><div class=\"laydate_yms\"><a class=\"laydate_tab laydate_chtop\"><cite></cite></a><ul id=\"laydate_ys\"></ul><a class=\"laydate_tab laydate_chdown\"><cite></cite></a></div></div><div class=\"laydate_ym laydate_m\" id=\"laydate_MM\"><a class=\"laydate_choose laydate_chprev laydate_tab\"><cite></cite></a><input id=\"laydate_m\" readonly><label></label><a class=\"laydate_choose laydate_chnext laydate_tab\"><cite></cite></a><div class=\"laydate_yms\" id=\"laydate_ms\">'+function(){var a=\"\";return c.each(new Array(12),function(b){a+='<span m=\"'+b+'\">'+c.digit(b+1)+\"月</span>\"}),a}()+\"</div>\"+\"</div>\"+\"</div>\"+c.viewtb+'<div class=\"laydate_bottom\">'+'<ul id=\"laydate_hms\">'+'<li class=\"laydate_sj\">时间</li>'+\"<li><input readonly>:</li>\"+\"<li><input readonly>:</li>\"+\"<li><input readonly></li>\"+\"</ul>\"+'<div class=\"laydate_time\" id=\"laydate_time\"></div>'+'<div class=\"laydate_btn\">'+'<a id=\"laydate_clear\">清空</a>'+'<a id=\"laydate_today\">今天</a>'+'<a id=\"laydate_ok\">确认</a>'+\"</div>\"+(b.isv?'<a href=\"http://sentsin.com/layui/laydate/\" class=\"laydate_v\" target=\"_blank\">laydate-v'+laydate.v+\"</a>\":\"\")+\"</div>\",d.body.appendChild(i),c.box=g(\"#\"+h[0]),c.events(),i=null),c.follow(c.box),f.zIndex?c.box.style.zIndex=f.zIndex:c.removeCssAttr(c.box,\"z-index\"),c.stopMosup(\"click\",c.box),c.initDate(),c.iswrite(),c.check()},c.reshow=function(){return c.each(c.query(\"#\"+h[0]+\" .laydate_show\"),function(a,b){c.removeClass(b,\"laydate_show\")}),this},c.close=function(){c.reshow(),c.shde(c.query(\"#\"+h[0]),1),c.elem=null},c.parse=function(a,d,e){return a=a.concat(d),e=e||(c.options?c.options.format:b.format),e.replace(/YYYY|MM|DD|hh|mm|ss/g,function(){return a.index=0|++a.index,c.digit(a[a.index])})},c.creation=function(a,b){var e=(c.query,c.hmsin),f=c.parse(a,[e[0].value,e[1].value,e[2].value]);c.elem[h.elemv]=f,b||(c.close(),\"function\"==typeof c.options.choose&&c.options.choose(f))},c.events=function(){var b=c.query,e={box:\"#\"+h[0]};c.addClass(d.body,\"laydate_body\"),h.tds=b(\"#laydate_table td\"),h.mms=b(\"#laydate_ms span\"),h.year=b(\"#laydate_y\"),h.month=b(\"#laydate_m\"),c.each(b(e.box+\" .laydate_ym\"),function(a,b){c.on(b,\"click\",function(b){c.stopmp(b).reshow(),c.addClass(this[g](\"div\")[0],\"laydate_show\"),a||(e.YY=parseInt(h.year.value),c.viewYears(e.YY))})}),c.on(b(e.box),\"click\",function(){c.reshow()}),e.tabYear=function(a){0===a?c.ymd[0]--:1===a?c.ymd[0]++:2===a?e.YY-=14:e.YY+=14,2>a?(c.viewDate(c.ymd[0],c.ymd[1],c.ymd[2]),c.reshow()):c.viewYears(e.YY)},c.each(b(\"#laydate_YY .laydate_tab\"),function(a,b){c.on(b,\"click\",function(b){c.stopmp(b),e.tabYear(a)})}),e.tabMonth=function(a){a?(c.ymd[1]++,12===c.ymd[1]&&(c.ymd[0]++,c.ymd[1]=0)):(c.ymd[1]--,-1===c.ymd[1]&&(c.ymd[0]--,c.ymd[1]=11)),c.viewDate(c.ymd[0],c.ymd[1],c.ymd[2])},c.each(b(\"#laydate_MM .laydate_tab\"),function(a,b){c.on(b,\"click\",function(b){c.stopmp(b).reshow(),e.tabMonth(a)})}),c.each(b(\"#laydate_ms span\"),function(a,b){c.on(b,\"click\",function(a){c.stopmp(a).reshow(),c.hasClass(this,h[1])||c.viewDate(c.ymd[0],0|this.getAttribute(\"m\"),c.ymd[2])})}),c.each(b(\"#laydate_table td\"),function(a,b){c.on(b,\"click\",function(a){c.hasClass(this,h[1])||(c.stopmp(a),c.creation([0|this.getAttribute(\"y\"),0|this.getAttribute(\"m\"),0|this.getAttribute(\"d\")]))})}),h.oclear=b(\"#laydate_clear\"),c.on(h.oclear,\"click\",function(){c.elem[h.elemv]=\"\",c.close()}),h.otoday=b(\"#laydate_today\"),c.on(h.otoday,\"click\",function(){c.elem[h.elemv]=laydate.now(0,c.options.format),c.close()}),h.ok=b(\"#laydate_ok\"),c.on(h.ok,\"click\",function(){c.valid&&c.creation([c.ymd[0],c.ymd[1]+1,c.ymd[2]])}),e.times=b(\"#laydate_time\"),c.hmsin=e.hmsin=b(\"#laydate_hms input\"),e.hmss=[\"小时\",\"分钟\",\"秒数\"],e.hmsarr=[],c.msg=function(a,d){var f='<div class=\"laydte_hsmtex\">'+(d||\"提示\")+\"<span>×</span></div>\";\"string\"==typeof a?(f+=\"<p>\"+a+\"</p>\",c.shde(b(\"#\"+h[0])),c.removeClass(e.times,\"laydate_time1\").addClass(e.times,\"laydate_msg\")):(e.hmsarr[a]?f=e.hmsarr[a]:(f+='<div id=\"laydate_hmsno\" class=\"laydate_hmsno\">',c.each(new Array(0===a?24:60),function(a){f+=\"<span>\"+a+\"</span>\"}),f+=\"</div>\",e.hmsarr[a]=f),c.removeClass(e.times,\"laydate_msg\"),c[0===a?\"removeClass\":\"addClass\"](e.times,\"laydate_time1\")),c.addClass(e.times,\"laydate_show\"),e.times.innerHTML=f},e.hmson=function(a,d){var e=b(\"#laydate_hmsno span\"),f=c.valid?null:1;c.each(e,function(b,e){f?c.addClass(e,h[1]):c.timeVoid(b,d)?c.addClass(e,h[1]):c.on(e,\"click\",function(){c.hasClass(this,h[1])||(a.value=c.digit(0|this.innerHTML))})}),c.addClass(e[0|a.value],\"laydate_click\")},c.each(e.hmsin,function(a,b){c.on(b,\"click\",function(b){c.stopmp(b).reshow(),c.msg(a,e.hmss[a]),e.hmson(this,a)})}),c.on(d,\"mouseup\",function(){var a=b(\"#\"+h[0]);a&&\"none\"!==a.style.display&&(c.check()||c.close())}).on(d,\"keydown\",function(b){b=b||a.event;var d=b.keyCode;13===d&&c.creation([c.ymd[0],c.ymd[1]+1,c.ymd[2]])})},c.init=function(){c.use(\"need\"),c.use(h[4]+b.defSkin,h[3]),c.skinLink=c.query(\"#\"+h[3])}(),laydate.reset=function(){c.box&&c.elem&&c.follow(c.box)},laydate.now=function(a,b){var d=new Date(0|a?function(a){return 864e5>a?+new Date+864e5*a:a}(parseInt(a)):+new Date);return c.parse([d.getFullYear(),d.getMonth()+1,d.getDate()],[d.getHours(),d.getMinutes(),d.getSeconds()],b)},laydate.skin=function(a){c.skinLink.href=c.getPath+h[4]+a+h[5]}}(window);"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/layer/laydate/need/laydate.css",
    "content": "﻿/**\n\n @Name锛� laydate 鏍稿績鏍峰紡\n @Author锛氳搐蹇�\n @Site锛歨ttp://sentsin.com/layui/laydate\n\n**/\n\nhtml{_background-image:url(about:blank); _background-attachment:fixed;}\n.layer-date{display: inline-block!important;vertical-align:text-top;max-width:240px;}\n.laydate_body .laydate_box, .laydate_body .laydate_box *{margin:0; padding:0;}\n.laydate-icon,\n.laydate-icon-default,\n.laydate-icon-danlan,\n.laydate-icon-dahong,\n.laydate-icon-molv{height:34px; padding-right:20px;min-width:34px;vertical-align: text-top;border:1px solid #C6C6C6; background-repeat:no-repeat; background-position:right center;  background-color:#fff; outline:0;}\n.laydate-icon-default{ background-image:url(../skins/default/icon.png)}\n.laydate-icon-danlan{border:1px solid #B1D2EC; background-image:url(../skins/danlan/icon.png)}\n.laydate-icon-dahong{background-image:url(../skins/dahong/icon.png)}\n.laydate-icon-molv{background-image:url(../skins/molv/icon.png)}\n.laydate_body .laydate_box{width:240px; font:12px '\\5B8B\\4F53'; z-index:99999999; *margin:-2px 0 0 -2px; *overflow:hidden; _margin:0; _position:absolute!important; background-color:#fff;}\n.laydate_body .laydate_box li{list-style:none;}\n.laydate_body .laydate_box .laydate_void{cursor:text!important;}\n.laydate_body .laydate_box a, .laydate_body .laydate_box a:hover{text-decoration:none; blr:expression(this.onFocus=this.blur()); cursor:pointer;}\n.laydate_body .laydate_box a:hover{text-decoration:none;}\n.laydate_body .laydate_box cite, .laydate_body .laydate_box label{position:absolute; width:0; height:0; border-width:5px; border-style:dashed; border-color:transparent; overflow:hidden; cursor:pointer;}\n.laydate_body .laydate_box .laydate_yms, .laydate_body .laydate_box .laydate_time{display:none;}\n.laydate_body .laydate_box .laydate_show{display:block;}\n.laydate_body .laydate_box input{outline:0; font-size:14px; background-color:#fff;}\n.laydate_body .laydate_top{position:relative; height:26px; padding:5px; *width:100%; z-index:99;}\n.laydate_body .laydate_ym{position:relative; float:left; height:24px; cursor:pointer;}\n.laydate_body .laydate_ym input{float:left; height:24px; line-height:24px; text-align:center; border:none; cursor:pointer;}\n.laydate_body .laydate_ym .laydate_yms{position:absolute; left: -1px; top: 24px; height:181px;}\n.laydate_body .laydate_y{width:121px;}\n.laydate_body .laydate_y input{width:64px; margin-right:15px;}\n.laydate_body .laydate_y .laydate_yms{width:121px; text-align:center;}\n.laydate_body .laydate_y .laydate_yms a{position:relative; display:block; height:20px;}\n.laydate_body .laydate_y .laydate_yms ul{height:139px; padding:0; *overflow:hidden;}\n.laydate_body .laydate_y .laydate_yms ul li{float:left; width:60px; height:20px; line-height: 20px; text-overflow: ellipsis; overflow: hidden; white-space: nowrap;}\n.laydate_box *{box-sizing:content-box!important;}\n.laydate_body .laydate_m{width:99px;float: right;margin-right:-2px;}\n.laydate_body .laydate_m .laydate_yms{width:99px; padding:0;}\n.laydate_body .laydate_m input{width:42px; margin-right:15px;}\n.laydate_body .laydate_m .laydate_yms span{display:block; float:left; width:42px; margin: 5px 0 0 5px; line-height:24px; text-align:center; _display:inline;}\n.laydate_body .laydate_choose{display:block; float:left; position:relative; width:20px; height:24px;}\n.laydate_body .laydate_choose cite, .laydate_body .laydate_tab cite{left:50%; top:50%;}\n.laydate_body .laydate_chtop cite{margin:-7px 0 0 -5px; border-bottom-style:solid;}\n.laydate_body .laydate_chdown cite, .laydate_body .laydate_ym label{top:50%; margin:-2px 0 0 -5px; border-top-style:solid;}\n.laydate_body .laydate_chprev cite{margin:-5px 0 0 -7px;}\n.laydate_body .laydate_chnext cite{margin:-5px 0 0 -2px;}\n.laydate_body .laydate_ym label{right:28px;}\n.laydate_body .laydate_table{ width:230px; margin:0 5px; border-collapse:collapse; border-spacing:0px; }\n.laydate_body .laydate_table td{width:31px; height:19px; line-height:19px; text-align: center; cursor:pointer; font-size: 12px;}\n.laydate_body .laydate_table thead{height:22px; line-height:22px;}\n.laydate_body .laydate_table thead th{font-weight:400; font-size:12px; text-align:center;}\n.laydate_body .laydate_bottom{position:relative; height:22px; line-height:20px; padding:5px; font-size:12px;}\n.laydate_body .laydate_bottom #laydate_hms{position: relative; z-index: 1; float:left; }\n.laydate_body .laydate_time{ position:absolute; left:5px; bottom: 26px; width:129px; height:125px; *overflow:hidden;}\n.laydate_body .laydate_time .laydate_hmsno{ padding:5px 0 0 5px;}\n.laydate_body .laydate_time .laydate_hmsno span{display:block; float:left; width:24px; height:19px; line-height:19px; text-align:center; cursor:pointer; *margin-bottom:-5px;}\n.laydate_body .laydate_time1{width:228px; height:154px;}\n.laydate_body .laydate_time1 .laydate_hmsno{padding: 6px 0 0 8px;}\n.laydate_body .laydate_time1 .laydate_hmsno span{width:21px; height:20px; line-height:20px;}\n.laydate_body .laydate_msg{left:49px; bottom:67px; width:141px; height:auto; overflow: hidden;}\n.laydate_body .laydate_msg p{padding:5px 10px;}\n.laydate_body .laydate_bottom li{float:left; height:20px; line-height:20px; border-right:none; font-weight:900;}\n.laydate_body .laydate_bottom .laydate_sj{width:33px; text-align:center; font-weight:400;}\n.laydate_body .laydate_bottom input{float:left; width:21px; height:20px; line-height:20px; border:none; text-align:center; cursor:pointer; font-size:12px;  font-weight:400;}\n.laydate_body .laydate_bottom .laydte_hsmtex{height:20px; line-height:20px; text-align:center;}\n.laydate_body .laydate_bottom .laydte_hsmtex span{position:absolute; width:20px; top:0; right:0px; cursor:pointer;}\n.laydate_body .laydate_bottom .laydte_hsmtex span:hover{font-size:14px;}\n.laydate_body .laydate_bottom .laydate_btn{position:absolute; right:5px; top:5px;}\n.laydate_body .laydate_bottom .laydate_btn a{float:left; height:20px; padding:0 6px; _padding:0 5px;}\n.laydate_body .laydate_bottom .laydate_v{position:absolute; left:10px; top:6px; font-family:Courier; z-index:0;}\n\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/layer/laydate/skins/dahong/laydate.css",
    "content": "﻿/** \n \n @Name： laydate皮肤：大红\n @Author：贤心\n @Site：http://sentsin.com/layui/laydate\n \n**/\n\n.laydate-icon{border:1px solid #ccc; background-image:url(icon.png)}\n\n.laydate_body .laydate_bottom #laydate_hms,\n.laydate_body .laydate_time{border:1px solid #ccc;}\n\n.laydate_body .laydate_box, \n.laydate_body .laydate_time{box-shadow: 2px 2px 5px rgba(0,0,0,.1);}\n\n.laydate_body .laydate_box{border-top:none; border-bottom:none; background-color:#fff; color:#333;}\n.laydate_body .laydate_box input{background:none!important; color:#fff;}\n.laydate_body .laydate_box .laydate_void{color:#ccc!important;}\n.laydate_body .laydate_box a, .laydate_body .laydate_box a:hover{color:#333;}\n.laydate_body .laydate_box a:hover{color:#666;}\n.laydate_body .laydate_click{background-color:#F32043!important; color:#fff!important;}\n.laydate_body .laydate_top{border-top:1px solid #D91600; background-color:#D91600}\n.laydate_body .laydate_ym{border:1px solid #D91600; background-color:#D91600;}\n.laydate_body .laydate_ym .laydate_yms{border:1px solid #D91600; background-color:#D91600; color:#fff;}\n.laydate_body .laydate_y .laydate_yms a{border-bottom:1px solid #D91600;}\n.laydate_body .laydate_y .laydate_yms .laydate_chdown{border-top:1px solid #D91600; border-bottom:none;}\n.laydate_body .laydate_choose{border-left:1px solid #D91600;}\n.laydate_body .laydate_chprev{border-left:none; border-right:1px solid #D91600;}\n.laydate_body .laydate_choose:hover, \n.laydate_body .laydate_y .laydate_yms a:hover{background-color:#F54766;}\n.laydate_body .laydate_chtop cite{border-bottom-color:#fff;}\n.laydate_body .laydate_chdown cite, .laydate_body .laydate_ym label{border-top-color:#fff;}\n.laydate_body .laydate_chprev cite{border-right-style:solid; border-right-color:#fff;}\n.laydate_body .laydate_chnext cite{border-left-style:solid; border-left-color:#fff;}\n.laydate_body .laydate_table{width: 240px!important; margin: 0!important; border:1px solid #ccc; border-top:none; border-bottom:none;}\n.laydate_body .laydate_table td{border:none;  height:21px!important; line-height:21px!important; background-color:#fff; color:#333;}\n.laydate_body .laydate_table .laydate_nothis{color:#999;}\n.laydate_body .laydate_table thead{border-bottom:1px solid #ccc; height:21px!important; line-height:21px!important;}\n.laydate_body .laydate_table thead th{}\n.laydate_body .laydate_bottom{border:1px solid #ccc; border-top:none;}\n.laydate_body .laydate_bottom #laydate_hms{background-color:#fff;}\n.laydate_body .laydate_time{background-color:#fff;}\n.laydate_body .laydate_time1{width: 226px!important; height: 152px!important;}\n.laydate_body .laydate_bottom .laydate_sj{width:31px!important; border-right:1px solid #ccc; background-color:#fff;}\n.laydate_body .laydate_bottom input{background-color:#fff; color:#333;}\n.laydate_body .laydate_bottom .laydte_hsmtex{border-bottom:1px solid #ccc;}\n.laydate_body .laydate_bottom .laydate_btn{border-right:1px solid #ccc;}\n.laydate_body .laydate_bottom .laydate_v{color:#999}\n.laydate_body .laydate_bottom .laydate_btn a{border: 1px solid #ccc; border-right:none; background-color:#fff;}\n.laydate_body .laydate_bottom .laydate_btn a:hover{background-color:#F6F6F6; color:#333;}\n\n.laydate_body .laydate_m .laydate_yms span:hover,\n.laydate_body .laydate_time .laydate_hmsno span:hover,\n.laydate_body .laydate_y .laydate_yms ul li:hover,\n.laydate_body .laydate_table td:hover{background-color:#F54766; color:#fff;}\n\n\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/layer/laydate/skins/default/laydate.css",
    "content": "﻿\n\n.laydate-icon{border:1px solid #ccc; background-image:url(icon.png)}\n\n.laydate_body .laydate_bottom #laydate_hms,\n.laydate_body .laydate_time{border:1px solid #ccc;}\n\n.laydate_body .laydate_box,\n.laydate_body .laydate_ym .laydate_yms,\n.laydate_body .laydate_time{box-shadow: 2px 2px 5px rgba(0,0,0,.1);}\n\n.laydate_body .laydate_box{border-top:none; border-bottom:none; background-color:#fff; color:#00625A;}\n.laydate_body .laydate_box input{background:none!important; color:#fff;}\n.laydate_body .laydate_box .laydate_void{color:#00E8D7!important;}\n.laydate_body .laydate_box a, .laydate_body .laydate_box a:hover{color:#00625A;}\n.laydate_body .laydate_box a:hover{color:#666;}\n.laydate_body .laydate_click{background-color:#009F95!important; color:#fff!important;}\n.laydate_body .laydate_top{border-top:1px solid #009F95; background-color:#009F95}\n.laydate_body .laydate_ym{border:1px solid #009F95; background-color:#009F95;}\n.laydate_body .laydate_ym .laydate_yms{border:1px solid #009F95; background-color:#009F95; color:#fff;}\n.laydate_body .laydate_y .laydate_yms a{border-bottom:1px solid #009F95;}\n.laydate_body .laydate_y .laydate_yms .laydate_chdown{border-top:1px solid #009F95; border-bottom:none;}\n.laydate_body .laydate_choose{border-left:1px solid #009F95;}\n.laydate_body .laydate_chprev{border-left:none; border-right:1px solid #009F95;}\n.laydate_body .laydate_choose:hover,\n.laydate_body .laydate_y .laydate_yms a:hover{background-color:#00C1B3;}\n.laydate_body .laydate_chtop cite{border-bottom-color:#fff;}\n.laydate_body .laydate_chdown cite, .laydate_body .laydate_ym label{border-top-color:#fff;}\n.laydate_body .laydate_chprev cite{border-right-style:solid; border-right-color:#fff;}\n.laydate_body .laydate_chnext cite{border-left-style:solid; border-left-color:#fff;}\n.laydate_body .laydate_table{width: 240px!important; margin: 0!important; border:1px solid #ccc; border-top:none; border-bottom:none;}\n.laydate_body .laydate_table td{border:none;  height:21px!important; line-height:21px!important; background-color:#fff; color:#00625A;}\n.laydate_body .laydate_table .laydate_nothis{color:#999;}\n.laydate_body .laydate_table thead{border-bottom:1px solid #ccc; height:21px!important; line-height:21px!important;}\n.laydate_body .laydate_table thead th{}\n.laydate_body .laydate_bottom{border:1px solid #ccc; border-top:none;}\n.laydate_body .laydate_bottom #laydate_hms{background-color:#fff;}\n.laydate_body .laydate_time{background-color:#fff;}\n.laydate_body .laydate_time1{width: 226px!important; height: 152px!important;}\n.laydate_body .laydate_bottom .laydate_sj{width:31px!important; border-right:1px solid #ccc; background-color:#fff;}\n.laydate_body .laydate_bottom input{background-color:#fff; color:#00625A;}\n.laydate_body .laydate_bottom .laydte_hsmtex{border-bottom:1px solid #ccc;}\n.laydate_body .laydate_bottom .laydate_btn{border-right:1px solid #ccc;}\n.laydate_body .laydate_bottom .laydate_v{color:#999}\n.laydate_body .laydate_bottom .laydate_btn a{border: 1px solid #ccc; border-right:none; background-color:#fff;}\n.laydate_body .laydate_bottom .laydate_btn a:hover{background-color:#F6F6F6; color:#00625A;}\n\n.laydate_body .laydate_m .laydate_yms span:hover,\n.laydate_body .laydate_time .laydate_hmsno span:hover,\n.laydate_body .laydate_y .laydate_yms ul li:hover,\n.laydate_body .laydate_table td:hover{background-color:#00C1B3; color:#fff;}\n\n\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/layer/laydate/skins/molv/laydate.css",
    "content": "﻿/** \n \n @Name： laydate皮肤：墨绿\n @Author：贤心\n @Site：http://sentsin.com/layui/laydate\n \n**/\n\n.laydate-icon{border:1px solid #ccc; background-image:url(icon.png)}\n\n.laydate_body .laydate_bottom #laydate_hms,\n.laydate_body .laydate_time{border:1px solid #ccc;}\n\n.laydate_body .laydate_box, \n.laydate_body .laydate_ym .laydate_yms,\n.laydate_body .laydate_time{box-shadow: 2px 2px 5px rgba(0,0,0,.1);}\n\n.laydate_body .laydate_box{border-top:none; border-bottom:none; background-color:#fff; color:#00625A;}\n.laydate_body .laydate_box input{background:none!important; color:#fff;}\n.laydate_body .laydate_box .laydate_void{color:#00E8D7!important;}\n.laydate_body .laydate_box a, .laydate_body .laydate_box a:hover{color:#00625A;}\n.laydate_body .laydate_box a:hover{color:#666;}\n.laydate_body .laydate_click{background-color:#009F95!important; color:#fff!important;}\n.laydate_body .laydate_top{border-top:1px solid #009F95; background-color:#009F95}\n.laydate_body .laydate_ym{border:1px solid #009F95; background-color:#009F95;}\n.laydate_body .laydate_ym .laydate_yms{border:1px solid #009F95; background-color:#009F95; color:#fff;}\n.laydate_body .laydate_y .laydate_yms a{border-bottom:1px solid #009F95;}\n.laydate_body .laydate_y .laydate_yms .laydate_chdown{border-top:1px solid #009F95; border-bottom:none;}\n.laydate_body .laydate_choose{border-left:1px solid #009F95;}\n.laydate_body .laydate_chprev{border-left:none; border-right:1px solid #009F95;}\n.laydate_body .laydate_choose:hover, \n.laydate_body .laydate_y .laydate_yms a:hover{background-color:#00C1B3;}\n.laydate_body .laydate_chtop cite{border-bottom-color:#fff;}\n.laydate_body .laydate_chdown cite, .laydate_body .laydate_ym label{border-top-color:#fff;}\n.laydate_body .laydate_chprev cite{border-right-style:solid; border-right-color:#fff;}\n.laydate_body .laydate_chnext cite{border-left-style:solid; border-left-color:#fff;}\n.laydate_body .laydate_table{width: 240px!important; margin: 0!important; border:1px solid #ccc; border-top:none; border-bottom:none;}\n.laydate_body .laydate_table td{border:none;  height:21px!important; line-height:21px!important; background-color:#fff; color:#00625A;}\n.laydate_body .laydate_table .laydate_nothis{color:#999;}\n.laydate_body .laydate_table thead{border-bottom:1px solid #ccc; height:21px!important; line-height:21px!important;}\n.laydate_body .laydate_table thead th{}\n.laydate_body .laydate_bottom{border:1px solid #ccc; border-top:none;}\n.laydate_body .laydate_bottom #laydate_hms{background-color:#fff;}\n.laydate_body .laydate_time{background-color:#fff;}\n.laydate_body .laydate_time1{width: 226px!important; height: 152px!important;}\n.laydate_body .laydate_bottom .laydate_sj{width:31px!important; border-right:1px solid #ccc; background-color:#fff;}\n.laydate_body .laydate_bottom input{background-color:#fff; color:#00625A;}\n.laydate_body .laydate_bottom .laydte_hsmtex{border-bottom:1px solid #ccc;}\n.laydate_body .laydate_bottom .laydate_btn{border-right:1px solid #ccc;}\n.laydate_body .laydate_bottom .laydate_v{color:#999}\n.laydate_body .laydate_bottom .laydate_btn a{border: 1px solid #ccc; border-right:none; background-color:#fff;}\n.laydate_body .laydate_bottom .laydate_btn a:hover{background-color:#F6F6F6; color:#00625A;}\n\n.laydate_body .laydate_m .laydate_yms span:hover,\n.laydate_body .laydate_time .laydate_hmsno span:hover,\n.laydate_body .laydate_y .laydate_yms ul li:hover,\n.laydate_body .laydate_table td:hover{background-color:#00C1B3; color:#fff;}\n\n\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/layer/laydate-v1.1/demo.html",
    "content": "﻿<!doctype html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<title>layDate Demo</title>\n<script src=\"laydate/laydate.js\"></script>\n<style>\nhtml{background-color:#E3E3E3; font-size:14px; color:#000; font-family:'微软雅黑'}\nh2{line-height:30px; font-size:20px;}\na,a:hover{ text-decoration:none;}\npre{font-family:'微软雅黑'}\n.box{width:970px; padding:10px 20px; background-color:#fff; margin:10px auto;}\n.box a{padding-right:20px;}\n</style>\n</head>\n<body>\n<div style=\"width:970px; margin:10px auto;\">\n    演示一：<input placeholder=\"请输入日期\" class=\"laydate-icon\" onclick=\"laydate()\">\n</div>\n<div class=\"box\">\n<pre>\n @Name：laydate-v<script>document.write(laydate.v)</script> 日期控件说明\n @Author：贤心\n @Blog：<a href=\"http://sentsin.com\" target=\"_blank\">http://sentsin.com</a>\n @官网：<a href=\"http://sentsin.com/layui/laydate\"  target=\"_blank\">http://sentsin.com/layui/laydate</a>\n @开发版源码：<a href=\"http://sentsin.com/lily/lib/laydate/laydate.dev.js\"  target=\"_blank\">http://sentsin.com/lily/lib/laydate/laydate.dev.js</a>\n\n<strong>【注意事项】</strong>\n一、请千万勿移动laydate中的目录结构，它们具有完整的依赖体系。使用时，只需引入laydate/laydate.js即可。\n二、如果您的网站的js采用合并或模块加载，您需要打开laydate.js，修改path。\n三、laydate遵循LGPL开源协议，永不收费！\n四、版权最终解释权：贤心。\n</pre>\n演示二：<input class=\"laydate-icon\" id=\"demo\" value=\"2014-6-25更新\">\n</div>\n<div class=\"box\" style=\"text-align:center\">\n    <p>现在，您已经看到了layDate的第一个版本了，路漫漫其修远兮，不管您的网站是否存有别的日期控件，但我相信总有一日您会对layDate情有独钟。</p>\n    <a href=\"http://sentsin.com/layui/laydate/api.html\" target=\"_blank\">使用文档</a>\n    <a href=\"http://sentsin.com/layui/laydate/skins.html\" target=\"_blank\">皮肤库</a>\n    <a href=\"http://say.sentsin.com/say-922.html\" target=\"_blank\">更新日志</a>\n    <a href=\"http://say.sentsin.com/home-58.html\" id=\"suggest\" target=\"_blank\">有问必答</a>\n</div>\n\n<script>\n;!function(){\n\n//laydate.skin('molv');\n\nlaydate({\n   elem: '#demo'\n})\n\n}();\n</script>\n</body>\n</html>"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/layer/laydate-v1.1/layDate官网.url",
    "content": "[{000214A0-0000-0000-C000-000000000046}]\nProp3=19,2\n[InternetShortcut]\nURL=http://sentsin.com/layui/laydate/\nIDList=\nHotKey=0\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/layer/laydate-v1.1/laydate/laydate.js",
    "content": "﻿/**\n \n @Name : layDate v1.1 日期控件\n @Author: 贤心\n @Date: 2014-06-25\n @QQ群：176047195\n @Site：http://sentsin.com/layui/laydate\n \n */\n\n;!function(a){var b={path:\"\",defSkin:\"default\",format:\"YYYY-MM-DD\",min:\"1900-01-01 00:00:00\",max:\"2099-12-31 23:59:59\",isv:!1},c={},d=document,e=\"createElement\",f=\"getElementById\",g=\"getElementsByTagName\",h=[\"laydate_box\",\"laydate_void\",\"laydate_click\",\"LayDateSkin\",\"skins/\",\"/laydate.css\"];a.laydate=function(b){b=b||{};try{h.event=a.event?a.event:laydate.caller.arguments[0]}catch(d){}return c.run(b),laydate},laydate.v=\"1.1\",c.getPath=function(){var a=document.scripts,c=a[a.length-1].src;return b.path?b.path:c.substring(0,c.lastIndexOf(\"/\")+1)}(),c.use=function(a,b){var f=d[e](\"link\");f.type=\"text/css\",f.rel=\"stylesheet\",f.href=c.getPath+a+h[5],b&&(f.id=b),d[g](\"head\")[0].appendChild(f),f=null},c.trim=function(a){return a=a||\"\",a.replace(/^\\s|\\s$/g,\"\").replace(/\\s+/g,\" \")},c.digit=function(a){return 10>a?\"0\"+(0|a):a},c.stopmp=function(b){return b=b||a.event,b.stopPropagation?b.stopPropagation():b.cancelBubble=!0,this},c.each=function(a,b){for(var c=0,d=a.length;d>c&&b(c,a[c])!==!1;c++);},c.hasClass=function(a,b){return a=a||{},new RegExp(\"\\\\b\"+b+\"\\\\b\").test(a.className)},c.addClass=function(a,b){return a=a||{},c.hasClass(a,b)||(a.className+=\" \"+b),a.className=c.trim(a.className),this},c.removeClass=function(a,b){if(a=a||{},c.hasClass(a,b)){var d=new RegExp(\"\\\\b\"+b+\"\\\\b\");a.className=a.className.replace(d,\"\")}return this},c.removeCssAttr=function(a,b){var c=a.style;c.removeProperty?c.removeProperty(b):c.removeAttribute(b)},c.shde=function(a,b){a.style.display=b?\"none\":\"block\"},c.query=function(a){var e,b,h,i,j;return a=c.trim(a).split(\" \"),b=d[f](a[0].substr(1)),b?a[1]?/^\\./.test(a[1])?(i=a[1].substr(1),j=new RegExp(\"\\\\b\"+i+\"\\\\b\"),e=[],h=d.getElementsByClassName?b.getElementsByClassName(i):b[g](\"*\"),c.each(h,function(a,b){j.test(b.className)&&e.push(b)}),e[0]?e:\"\"):(e=b[g](a[1]),e[0]?b[g](a[1]):\"\"):b:void 0},c.on=function(b,d,e){return b.attachEvent?b.attachEvent(\"on\"+d,function(){e.call(b,a.even)}):b.addEventListener(d,e,!1),c},c.stopMosup=function(a,b){\"mouseup\"!==a&&c.on(b,\"mouseup\",function(a){c.stopmp(a)})},c.run=function(a){var d,e,g,b=c.query,f=h.event;try{g=f.target||f.srcElement||{}}catch(i){g={}}if(d=a.elem?b(a.elem):g,f&&g.tagName){if(!d||d===c.elem)return;c.stopMosup(f.type,d),c.stopmp(f),c.view(d,a),c.reshow()}else e=a.event||\"click\",c.each((0|d.length)>0?d:[d],function(b,d){c.stopMosup(e,d),c.on(d,e,function(b){c.stopmp(b),d!==c.elem&&(c.view(d,a),c.reshow())})})},c.scroll=function(a){return a=a?\"scrollLeft\":\"scrollTop\",d.body[a]|d.documentElement[a]},c.winarea=function(a){return document.documentElement[a?\"clientWidth\":\"clientHeight\"]},c.isleap=function(a){return 0===a%4&&0!==a%100||0===a%400},c.checkVoid=function(a,b,d){var e=[];return a=0|a,b=0|b,d=0|d,a<c.mins[0]?e=[\"y\"]:a>c.maxs[0]?e=[\"y\",1]:a>=c.mins[0]&&a<=c.maxs[0]&&(a==c.mins[0]&&(b<c.mins[1]?e=[\"m\"]:b==c.mins[1]&&d<c.mins[2]&&(e=[\"d\"])),a==c.maxs[0]&&(b>c.maxs[1]?e=[\"m\",1]:b==c.maxs[1]&&d>c.maxs[2]&&(e=[\"d\",1]))),e},c.timeVoid=function(a,b){if(c.ymd[1]+1==c.mins[1]&&c.ymd[2]==c.mins[2]){if(0===b&&a<c.mins[3])return 1;if(1===b&&a<c.mins[4])return 1;if(2===b&&a<c.mins[5])return 1}else if(c.ymd[1]+1==c.maxs[1]&&c.ymd[2]==c.maxs[2]){if(0===b&&a>c.maxs[3])return 1;if(1===b&&a>c.maxs[4])return 1;if(2===b&&a>c.maxs[5])return 1}return a>(b?59:23)?1:void 0},c.check=function(){var a=c.options.format.replace(/YYYY|MM|DD|hh|mm|ss/g,\"\\\\d+\\\\\").replace(/\\\\$/g,\"\"),b=new RegExp(a),d=c.elem[h.elemv],e=d.match(/\\d+/g)||[],f=c.checkVoid(e[0],e[1],e[2]);if(\"\"!==d.replace(/\\s/g,\"\")){if(!b.test(d))return c.elem[h.elemv]=\"\",c.msg(\"日期不符合格式，请重新选择。\"),1;if(f[0])return c.elem[h.elemv]=\"\",c.msg(\"日期不在有效期内，请重新选择。\"),1;f.value=c.elem[h.elemv].match(b).join(),e=f.value.match(/\\d+/g),e[1]<1?(e[1]=1,f.auto=1):e[1]>12?(e[1]=12,f.auto=1):e[1].length<2&&(f.auto=1),e[2]<1?(e[2]=1,f.auto=1):e[2]>c.months[(0|e[1])-1]?(e[2]=31,f.auto=1):e[2].length<2&&(f.auto=1),e.length>3&&(c.timeVoid(e[3],0)&&(f.auto=1),c.timeVoid(e[4],1)&&(f.auto=1),c.timeVoid(e[5],2)&&(f.auto=1)),f.auto?c.creation([e[0],0|e[1],0|e[2]],1):f.value!==c.elem[h.elemv]&&(c.elem[h.elemv]=f.value)}},c.months=[31,null,31,30,31,30,31,31,30,31,30,31],c.viewDate=function(a,b,d){var f=(c.query,{}),g=new Date;a<(0|c.mins[0])&&(a=0|c.mins[0]),a>(0|c.maxs[0])&&(a=0|c.maxs[0]),g.setFullYear(a,b,d),f.ymd=[g.getFullYear(),g.getMonth(),g.getDate()],c.months[1]=c.isleap(f.ymd[0])?29:28,g.setFullYear(f.ymd[0],f.ymd[1],1),f.FDay=g.getDay(),f.PDay=c.months[0===b?11:b-1]-f.FDay+1,f.NDay=1,c.each(h.tds,function(a,b){var g,d=f.ymd[0],e=f.ymd[1]+1;b.className=\"\",a<f.FDay?(b.innerHTML=g=a+f.PDay,c.addClass(b,\"laydate_nothis\"),1===e&&(d-=1),e=1===e?12:e-1):a>=f.FDay&&a<f.FDay+c.months[f.ymd[1]]?(b.innerHTML=g=a-f.FDay+1,a-f.FDay+1===f.ymd[2]&&(c.addClass(b,h[2]),f.thisDay=b)):(b.innerHTML=g=f.NDay++,c.addClass(b,\"laydate_nothis\"),12===e&&(d+=1),e=12===e?1:e+1),c.checkVoid(d,e,g)[0]&&c.addClass(b,h[1]),c.options.festival&&c.festival(b,e+\".\"+g),b.setAttribute(\"y\",d),b.setAttribute(\"m\",e),b.setAttribute(\"d\",g),d=e=g=null}),c.valid=!c.hasClass(f.thisDay,h[1]),c.ymd=f.ymd,h.year.value=c.ymd[0]+\"年\",h.month.value=c.digit(c.ymd[1]+1)+\"月\",c.each(h.mms,function(a,b){var d=c.checkVoid(c.ymd[0],(0|b.getAttribute(\"m\"))+1);\"y\"===d[0]||\"m\"===d[0]?c.addClass(b,h[1]):c.removeClass(b,h[1]),c.removeClass(b,h[2]),d=null}),c.addClass(h.mms[c.ymd[1]],h[2]),f.times=[0|c.inymd[3]||0,0|c.inymd[4]||0,0|c.inymd[5]||0],c.each(new Array(3),function(a){c.hmsin[a].value=c.digit(c.timeVoid(f.times[a],a)?0|c.mins[a+3]:0|f.times[a])}),c[c.valid?\"removeClass\":\"addClass\"](h.ok,h[1])},c.festival=function(a,b){var c;switch(b){case\"1.1\":c=\"元旦\";break;case\"3.8\":c=\"妇女\";break;case\"4.5\":c=\"清明\";break;case\"5.1\":c=\"劳动\";break;case\"6.1\":c=\"儿童\";break;case\"9.10\":c=\"教师\";break;case\"10.1\":c=\"国庆\"}c&&(a.innerHTML=c),c=null},c.viewYears=function(a){var b=c.query,d=\"\";c.each(new Array(14),function(b){d+=7===b?\"<li \"+(parseInt(h.year.value)===a?'class=\"'+h[2]+'\"':\"\")+' y=\"'+a+'\">'+a+\"年</li>\":'<li y=\"'+(a-7+b)+'\">'+(a-7+b)+\"年</li>\"}),b(\"#laydate_ys\").innerHTML=d,c.each(b(\"#laydate_ys li\"),function(a,b){\"y\"===c.checkVoid(b.getAttribute(\"y\"))[0]?c.addClass(b,h[1]):c.on(b,\"click\",function(a){c.stopmp(a).reshow(),c.viewDate(0|this.getAttribute(\"y\"),c.ymd[1],c.ymd[2])})})},c.initDate=function(){var d=(c.query,new Date),e=c.elem[h.elemv].match(/\\d+/g)||[];e.length<3&&(e=c.options.start.match(/\\d+/g)||[],e.length<3&&(e=[d.getFullYear(),d.getMonth()+1,d.getDate()])),c.inymd=e,c.viewDate(e[0],e[1]-1,e[2])},c.iswrite=function(){var a=c.query,b={time:a(\"#laydate_hms\")};c.shde(b.time,!c.options.istime),c.shde(h.oclear,!(\"isclear\"in c.options?c.options.isclear:1)),c.shde(h.otoday,!(\"istoday\"in c.options?c.options.istoday:1)),c.shde(h.ok,!(\"issure\"in c.options?c.options.issure:1))},c.orien=function(a,b){var d,e=c.elem.getBoundingClientRect();a.style.left=e.left+(b?0:c.scroll(1))+\"px\",d=e.bottom+a.offsetHeight/1.5<=c.winarea()?e.bottom-1:e.top>a.offsetHeight/1.5?e.top-a.offsetHeight+1:c.winarea()-a.offsetHeight,a.style.top=d+(b?0:c.scroll())+\"px\"},c.follow=function(a){c.options.fixed?(a.style.position=\"fixed\",c.orien(a,1)):(a.style.position=\"absolute\",c.orien(a))},c.viewtb=function(){var a,b=[],f=[\"日\",\"一\",\"二\",\"三\",\"四\",\"五\",\"六\"],h={},i=d[e](\"table\"),j=d[e](\"thead\");return j.appendChild(d[e](\"tr\")),h.creath=function(a){var b=d[e](\"th\");b.innerHTML=f[a],j[g](\"tr\")[0].appendChild(b),b=null},c.each(new Array(6),function(d){b.push([]),a=i.insertRow(0),c.each(new Array(7),function(c){b[d][c]=0,0===d&&h.creath(c),a.insertCell(c)})}),i.insertBefore(j,i.children[0]),i.id=i.className=\"laydate_table\",a=b=null,i.outerHTML.toLowerCase()}(),c.view=function(a,f){var i,g=c.query,j={};f=f||a,c.elem=a,c.options=f,c.options.format||(c.options.format=b.format),c.options.start=c.options.start||\"\",c.mm=j.mm=[c.options.min||b.min,c.options.max||b.max],c.mins=j.mm[0].match(/\\d+/g),c.maxs=j.mm[1].match(/\\d+/g),h.elemv=/textarea|input/.test(c.elem.tagName.toLocaleLowerCase())?\"value\":\"innerHTML\",c.box?c.shde(c.box):(i=d[e](\"div\"),i.id=h[0],i.className=h[0],i.style.cssText=\"position: absolute;\",i.setAttribute(\"name\",\"laydate-v\"+laydate.v),i.innerHTML=j.html='<div class=\"laydate_top\"><div class=\"laydate_ym laydate_y\" id=\"laydate_YY\"><a class=\"laydate_choose laydate_chprev laydate_tab\"><cite></cite></a><input id=\"laydate_y\" readonly><label></label><a class=\"laydate_choose laydate_chnext laydate_tab\"><cite></cite></a><div class=\"laydate_yms\"><a class=\"laydate_tab laydate_chtop\"><cite></cite></a><ul id=\"laydate_ys\"></ul><a class=\"laydate_tab laydate_chdown\"><cite></cite></a></div></div><div class=\"laydate_ym laydate_m\" id=\"laydate_MM\"><a class=\"laydate_choose laydate_chprev laydate_tab\"><cite></cite></a><input id=\"laydate_m\" readonly><label></label><a class=\"laydate_choose laydate_chnext laydate_tab\"><cite></cite></a><div class=\"laydate_yms\" id=\"laydate_ms\">'+function(){var a=\"\";return c.each(new Array(12),function(b){a+='<span m=\"'+b+'\">'+c.digit(b+1)+\"月</span>\"}),a}()+\"</div>\"+\"</div>\"+\"</div>\"+c.viewtb+'<div class=\"laydate_bottom\">'+'<ul id=\"laydate_hms\">'+'<li class=\"laydate_sj\">时间</li>'+\"<li><input readonly>:</li>\"+\"<li><input readonly>:</li>\"+\"<li><input readonly></li>\"+\"</ul>\"+'<div class=\"laydate_time\" id=\"laydate_time\"></div>'+'<div class=\"laydate_btn\">'+'<a id=\"laydate_clear\">清空</a>'+'<a id=\"laydate_today\">今天</a>'+'<a id=\"laydate_ok\">确认</a>'+\"</div>\"+(b.isv?'<a href=\"http://sentsin.com/layui/laydate/\" class=\"laydate_v\" target=\"_blank\">laydate-v'+laydate.v+\"</a>\":\"\")+\"</div>\",d.body.appendChild(i),c.box=g(\"#\"+h[0]),c.events(),i=null),c.follow(c.box),f.zIndex?c.box.style.zIndex=f.zIndex:c.removeCssAttr(c.box,\"z-index\"),c.stopMosup(\"click\",c.box),c.initDate(),c.iswrite(),c.check()},c.reshow=function(){return c.each(c.query(\"#\"+h[0]+\" .laydate_show\"),function(a,b){c.removeClass(b,\"laydate_show\")}),this},c.close=function(){c.reshow(),c.shde(c.query(\"#\"+h[0]),1),c.elem=null},c.parse=function(a,d,e){return a=a.concat(d),e=e||(c.options?c.options.format:b.format),e.replace(/YYYY|MM|DD|hh|mm|ss/g,function(){return a.index=0|++a.index,c.digit(a[a.index])})},c.creation=function(a,b){var e=(c.query,c.hmsin),f=c.parse(a,[e[0].value,e[1].value,e[2].value]);c.elem[h.elemv]=f,b||(c.close(),\"function\"==typeof c.options.choose&&c.options.choose(f))},c.events=function(){var b=c.query,e={box:\"#\"+h[0]};c.addClass(d.body,\"laydate_body\"),h.tds=b(\"#laydate_table td\"),h.mms=b(\"#laydate_ms span\"),h.year=b(\"#laydate_y\"),h.month=b(\"#laydate_m\"),c.each(b(e.box+\" .laydate_ym\"),function(a,b){c.on(b,\"click\",function(b){c.stopmp(b).reshow(),c.addClass(this[g](\"div\")[0],\"laydate_show\"),a||(e.YY=parseInt(h.year.value),c.viewYears(e.YY))})}),c.on(b(e.box),\"click\",function(){c.reshow()}),e.tabYear=function(a){0===a?c.ymd[0]--:1===a?c.ymd[0]++:2===a?e.YY-=14:e.YY+=14,2>a?(c.viewDate(c.ymd[0],c.ymd[1],c.ymd[2]),c.reshow()):c.viewYears(e.YY)},c.each(b(\"#laydate_YY .laydate_tab\"),function(a,b){c.on(b,\"click\",function(b){c.stopmp(b),e.tabYear(a)})}),e.tabMonth=function(a){a?(c.ymd[1]++,12===c.ymd[1]&&(c.ymd[0]++,c.ymd[1]=0)):(c.ymd[1]--,-1===c.ymd[1]&&(c.ymd[0]--,c.ymd[1]=11)),c.viewDate(c.ymd[0],c.ymd[1],c.ymd[2])},c.each(b(\"#laydate_MM .laydate_tab\"),function(a,b){c.on(b,\"click\",function(b){c.stopmp(b).reshow(),e.tabMonth(a)})}),c.each(b(\"#laydate_ms span\"),function(a,b){c.on(b,\"click\",function(a){c.stopmp(a).reshow(),c.hasClass(this,h[1])||c.viewDate(c.ymd[0],0|this.getAttribute(\"m\"),c.ymd[2])})}),c.each(b(\"#laydate_table td\"),function(a,b){c.on(b,\"click\",function(a){c.hasClass(this,h[1])||(c.stopmp(a),c.creation([0|this.getAttribute(\"y\"),0|this.getAttribute(\"m\"),0|this.getAttribute(\"d\")]))})}),h.oclear=b(\"#laydate_clear\"),c.on(h.oclear,\"click\",function(){c.elem[h.elemv]=\"\",c.close()}),h.otoday=b(\"#laydate_today\"),c.on(h.otoday,\"click\",function(){c.elem[h.elemv]=laydate.now(0,c.options.format),c.close()}),h.ok=b(\"#laydate_ok\"),c.on(h.ok,\"click\",function(){c.valid&&c.creation([c.ymd[0],c.ymd[1]+1,c.ymd[2]])}),e.times=b(\"#laydate_time\"),c.hmsin=e.hmsin=b(\"#laydate_hms input\"),e.hmss=[\"小时\",\"分钟\",\"秒数\"],e.hmsarr=[],c.msg=function(a,d){var f='<div class=\"laydte_hsmtex\">'+(d||\"提示\")+\"<span>×</span></div>\";\"string\"==typeof a?(f+=\"<p>\"+a+\"</p>\",c.shde(b(\"#\"+h[0])),c.removeClass(e.times,\"laydate_time1\").addClass(e.times,\"laydate_msg\")):(e.hmsarr[a]?f=e.hmsarr[a]:(f+='<div id=\"laydate_hmsno\" class=\"laydate_hmsno\">',c.each(new Array(0===a?24:60),function(a){f+=\"<span>\"+a+\"</span>\"}),f+=\"</div>\",e.hmsarr[a]=f),c.removeClass(e.times,\"laydate_msg\"),c[0===a?\"removeClass\":\"addClass\"](e.times,\"laydate_time1\")),c.addClass(e.times,\"laydate_show\"),e.times.innerHTML=f},e.hmson=function(a,d){var e=b(\"#laydate_hmsno span\"),f=c.valid?null:1;c.each(e,function(b,e){f?c.addClass(e,h[1]):c.timeVoid(b,d)?c.addClass(e,h[1]):c.on(e,\"click\",function(){c.hasClass(this,h[1])||(a.value=c.digit(0|this.innerHTML))})}),c.addClass(e[0|a.value],\"laydate_click\")},c.each(e.hmsin,function(a,b){c.on(b,\"click\",function(b){c.stopmp(b).reshow(),c.msg(a,e.hmss[a]),e.hmson(this,a)})}),c.on(d,\"mouseup\",function(){var a=b(\"#\"+h[0]);a&&\"none\"!==a.style.display&&(c.check()||c.close())}).on(d,\"keydown\",function(b){b=b||a.event;var d=b.keyCode;13===d&&c.creation([c.ymd[0],c.ymd[1]+1,c.ymd[2]])})},c.init=function(){c.use(\"need\"),c.use(h[4]+b.defSkin,h[3]),c.skinLink=c.query(\"#\"+h[3])}(),laydate.reset=function(){c.box&&c.elem&&c.follow(c.box)},laydate.now=function(a,b){var d=new Date(0|a?function(a){return 864e5>a?+new Date+864e5*a:a}(parseInt(a)):+new Date);return c.parse([d.getFullYear(),d.getMonth()+1,d.getDate()],[d.getHours(),d.getMinutes(),d.getSeconds()],b)},laydate.skin=function(a){c.skinLink.href=c.getPath+h[4]+a+h[5]}}(window);"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/layer/laydate-v1.1/laydate/need/laydate.css",
    "content": "﻿/** \n \n @Name： laydate 核心样式\n @Author：贤心\n @Site：http://sentsin.com/layui/laydate\n \n**/\n\nhtml{_background-image:url(about:blank); _background-attachment:fixed;}\n.laydate_body .laydate_box, .laydate_body .laydate_box *{margin:0; padding:0;}\n.laydate-icon,\n.laydate-icon-default,\n.laydate-icon-danlan,\n.laydate-icon-dahong,\n.laydate-icon-molv{height:22px; line-height:22px; padding-right:20px; border:1px solid #C6C6C6; background-repeat:no-repeat; background-position:right center;  background-color:#fff; outline:0;}\n.laydate-icon-default{ background-image:url(../skins/default/icon.png)}\n.laydate-icon-danlan{border:1px solid #B1D2EC; background-image:url(../skins/danlan/icon.png)}\n.laydate-icon-dahong{background-image:url(../skins/dahong/icon.png)}\n.laydate-icon-molv{background-image:url(../skins/molv/icon.png)}\n.laydate_body .laydate_box{width:240px; font:12px '\\5B8B\\4F53'; z-index:99999999; *margin:-2px 0 0 -2px; *overflow:hidden; _margin:0; _position:absolute!important; background-color:#fff;}\n.laydate_body .laydate_box li{list-style:none;}\n.laydate_body .laydate_box .laydate_void{cursor:text!important;}\n.laydate_body .laydate_box a, .laydate_body .laydate_box a:hover{text-decoration:none; blr:expression(this.onFocus=this.blur()); cursor:pointer;}\n.laydate_body .laydate_box a:hover{text-decoration:none;}\n.laydate_body .laydate_box cite, .laydate_body .laydate_box label{position:absolute; width:0; height:0; border-width:5px; border-style:dashed; border-color:transparent; overflow:hidden; cursor:pointer;}\n.laydate_body .laydate_box .laydate_yms, .laydate_body .laydate_box .laydate_time{display:none;}\n.laydate_body .laydate_box .laydate_show{display:block;}\n.laydate_body .laydate_box input{outline:0; font-size:14px; background-color:#fff;}\n.laydate_body .laydate_top{position:relative; height:26px; padding:5px; *width:100%; z-index:99;}\n.laydate_body .laydate_ym{position:relative; float:left; height:24px; cursor:pointer;}\n.laydate_body .laydate_ym input{float:left; height:24px; line-height:24px; text-align:center; border:none; cursor:pointer;}\n.laydate_body .laydate_ym .laydate_yms{position:absolute; left: -1px; top: 24px; height:181px;}\n.laydate_body .laydate_y{width:121px; margin-right:6px;}\n.laydate_body .laydate_y input{width:64px; margin-right:15px;}\n.laydate_body .laydate_y .laydate_yms{width:121px; text-align:center;}\n.laydate_body .laydate_y .laydate_yms a{position:relative; display:block; height:20px;}\n.laydate_body .laydate_y .laydate_yms ul{height:139px; padding:0; *overflow:hidden;}\n.laydate_body .laydate_y .laydate_yms ul li{float:left; width:60px; height:20px; line-height: 20px; text-overflow: ellipsis; overflow: hidden; white-space: nowrap;}\n.laydate_body .laydate_m{width:99px;}\n.laydate_body .laydate_m .laydate_yms{width:99px; padding:0;}\n.laydate_body .laydate_m input{width:42px; margin-right:15px;}\n.laydate_body .laydate_m .laydate_yms span{display:block; float:left; width:42px; margin: 5px 0 0 5px; line-height:24px; text-align:center; _display:inline;}\n.laydate_body .laydate_choose{display:block; float:left; position:relative; width:20px; height:24px;}\n.laydate_body .laydate_choose cite, .laydate_body .laydate_tab cite{left:50%; top:50%;}\n.laydate_body .laydate_chtop cite{margin:-7px 0 0 -5px; border-bottom-style:solid;}\n.laydate_body .laydate_chdown cite, .laydate_body .laydate_ym label{top:50%; margin:-2px 0 0 -5px; border-top-style:solid;}\n.laydate_body .laydate_chprev cite{margin:-5px 0 0 -7px;}\n.laydate_body .laydate_chnext cite{margin:-5px 0 0 -2px;}\n.laydate_body .laydate_ym label{right:28px;}\n.laydate_body .laydate_table{ width:230px; margin:0 5px; border-collapse:collapse; border-spacing:0px; }\n.laydate_body .laydate_table td{width:31px; height:19px; line-height:19px; text-align: center; cursor:pointer; font-size: 12px;}\n.laydate_body .laydate_table thead{height:22px; line-height:22px;}\n.laydate_body .laydate_table thead th{font-weight:400; font-size:12px; text-align:center;}\n.laydate_body .laydate_bottom{position:relative; height:22px; line-height:20px; padding:5px; font-size:12px;}\n.laydate_body .laydate_bottom #laydate_hms{position: relative; z-index: 1; float:left; }\n.laydate_body .laydate_time{ position:absolute; left:5px; bottom: 26px; width:129px; height:125px; *overflow:hidden;}\n.laydate_body .laydate_time .laydate_hmsno{ padding:5px 0 0 5px;}\n.laydate_body .laydate_time .laydate_hmsno span{display:block; float:left; width:24px; height:19px; line-height:19px; text-align:center; cursor:pointer; *margin-bottom:-5px;}\n.laydate_body .laydate_time1{width:228px; height:154px;}\n.laydate_body .laydate_time1 .laydate_hmsno{padding: 6px 0 0 8px;}\n.laydate_body .laydate_time1 .laydate_hmsno span{width:21px; height:20px; line-height:20px;}\n.laydate_body .laydate_msg{left:49px; bottom:67px; width:141px; height:auto; overflow: hidden;}\n.laydate_body .laydate_msg p{padding:5px 10px;}\n.laydate_body .laydate_bottom li{float:left; height:20px; line-height:20px; border-right:none; font-weight:900;}\n.laydate_body .laydate_bottom .laydate_sj{width:33px; text-align:center; font-weight:400;}\n.laydate_body .laydate_bottom input{float:left; width:21px; height:20px; line-height:20px; border:none; text-align:center; cursor:pointer; font-size:12px;  font-weight:400;}\n.laydate_body .laydate_bottom .laydte_hsmtex{height:20px; line-height:20px; text-align:center;}\n.laydate_body .laydate_bottom .laydte_hsmtex span{position:absolute; width:20px; top:0; right:0px; cursor:pointer;}\n.laydate_body .laydate_bottom .laydte_hsmtex span:hover{font-size:14px;}\n.laydate_body .laydate_bottom .laydate_btn{position:absolute; right:5px; top:5px;}\n.laydate_body .laydate_bottom .laydate_btn a{float:left; height:20px; padding:0 6px; _padding:0 5px;}\n.laydate_body .laydate_bottom .laydate_v{position:absolute; left:10px; top:6px; font-family:Courier; z-index:0;}\n\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/layer/laydate-v1.1/laydate/skins/dahong/laydate.css",
    "content": "﻿/** \n \n @Name： laydate皮肤：大红\n @Author：贤心\n @Site：http://sentsin.com/layui/laydate\n \n**/\n\n.laydate-icon{border:1px solid #ccc; background-image:url(icon.png)}\n\n.laydate_body .laydate_bottom #laydate_hms,\n.laydate_body .laydate_time{border:1px solid #ccc;}\n\n.laydate_body .laydate_box, \n.laydate_body .laydate_time{box-shadow: 2px 2px 5px rgba(0,0,0,.1);}\n\n.laydate_body .laydate_box{border-top:none; border-bottom:none; background-color:#fff; color:#333;}\n.laydate_body .laydate_box input{background:none!important; color:#fff;}\n.laydate_body .laydate_box .laydate_void{color:#ccc!important;}\n.laydate_body .laydate_box a, .laydate_body .laydate_box a:hover{color:#333;}\n.laydate_body .laydate_box a:hover{color:#666;}\n.laydate_body .laydate_click{background-color:#F32043!important; color:#fff!important;}\n.laydate_body .laydate_top{border-top:1px solid #D91600; background-color:#D91600}\n.laydate_body .laydate_ym{border:1px solid #D91600; background-color:#D91600;}\n.laydate_body .laydate_ym .laydate_yms{border:1px solid #D91600; background-color:#D91600; color:#fff;}\n.laydate_body .laydate_y .laydate_yms a{border-bottom:1px solid #D91600;}\n.laydate_body .laydate_y .laydate_yms .laydate_chdown{border-top:1px solid #D91600; border-bottom:none;}\n.laydate_body .laydate_choose{border-left:1px solid #D91600;}\n.laydate_body .laydate_chprev{border-left:none; border-right:1px solid #D91600;}\n.laydate_body .laydate_choose:hover, \n.laydate_body .laydate_y .laydate_yms a:hover{background-color:#F54766;}\n.laydate_body .laydate_chtop cite{border-bottom-color:#fff;}\n.laydate_body .laydate_chdown cite, .laydate_body .laydate_ym label{border-top-color:#fff;}\n.laydate_body .laydate_chprev cite{border-right-style:solid; border-right-color:#fff;}\n.laydate_body .laydate_chnext cite{border-left-style:solid; border-left-color:#fff;}\n.laydate_body .laydate_table{width: 240px!important; margin: 0!important; border:1px solid #ccc; border-top:none; border-bottom:none;}\n.laydate_body .laydate_table td{border:none;  height:21px!important; line-height:21px!important; background-color:#fff; color:#333;}\n.laydate_body .laydate_table .laydate_nothis{color:#999;}\n.laydate_body .laydate_table thead{border-bottom:1px solid #ccc; height:21px!important; line-height:21px!important;}\n.laydate_body .laydate_table thead th{}\n.laydate_body .laydate_bottom{border:1px solid #ccc; border-top:none;}\n.laydate_body .laydate_bottom #laydate_hms{background-color:#fff;}\n.laydate_body .laydate_time{background-color:#fff;}\n.laydate_body .laydate_time1{width: 226px!important; height: 152px!important;}\n.laydate_body .laydate_bottom .laydate_sj{width:31px!important; border-right:1px solid #ccc; background-color:#fff;}\n.laydate_body .laydate_bottom input{background-color:#fff; color:#333;}\n.laydate_body .laydate_bottom .laydte_hsmtex{border-bottom:1px solid #ccc;}\n.laydate_body .laydate_bottom .laydate_btn{border-right:1px solid #ccc;}\n.laydate_body .laydate_bottom .laydate_v{color:#999}\n.laydate_body .laydate_bottom .laydate_btn a{border: 1px solid #ccc; border-right:none; background-color:#fff;}\n.laydate_body .laydate_bottom .laydate_btn a:hover{background-color:#F6F6F6; color:#333;}\n\n.laydate_body .laydate_m .laydate_yms span:hover,\n.laydate_body .laydate_time .laydate_hmsno span:hover,\n.laydate_body .laydate_y .laydate_yms ul li:hover,\n.laydate_body .laydate_table td:hover{background-color:#F54766; color:#fff;}\n\n\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/layer/laydate-v1.1/laydate/skins/default/laydate.css",
    "content": "﻿/** \n \n @Name： laydate皮肤：默认\n @Author：贤心\n @Site：http://sentsin.com/layui/laydate\n \n**/\n\n.laydate-icon{border:1px solid #C6C6C6; background-image:url(icon.png)}\n\n.laydate_body .laydate_box,\n.laydate_body .laydate_ym,\n.laydate_body .laydate_ym .laydate_yms,\n.laydate_body .laydate_table,\n.laydate_body .laydate_table td,\n.laydate_body .laydate_bottom #laydate_hms,\n.laydate_body .laydate_time,\n.laydate_body .laydate_bottom .laydate_btn a{border:1px solid #ccc;}\n\n.laydate_body .laydate_y .laydate_yms a,\n.laydate_body .laydate_choose,\n.laydate_body .laydate_table thead,\n.laydate_body .laydate_bottom .laydte_hsmtex{background-color:#F6F6F6;}\n\n.laydate_body .laydate_box, \n.laydate_body .laydate_ym .laydate_yms,\n.laydate_body .laydate_time{box-shadow: 2px 2px 5px rgba(0,0,0,.1);}\n\n.laydate_body .laydate_box{border-top:none; border-bottom:none; background-color:#fff; color:#333;}\n.laydate_body .laydate_box input{color:#333;}\n.laydate_body .laydate_box .laydate_void{color:#ccc!important; /*text-decoration:line-through;*/}\n.laydate_body .laydate_box .laydate_void:hover{background-color:#fff!important}\n.laydate_body .laydate_box a, .laydate_body .laydate_box a:hover{color:#333;}\n.laydate_body .laydate_box a:hover{color:#666;}\n.laydate_body .laydate_click{background-color:#eee!important;}\n.laydate_body .laydate_top{border-top:1px solid #C6C6C6;}\n.laydate_body .laydate_ym .laydate_yms{border:1px solid #C6C6C6; background-color:#fff;}\n.laydate_body .laydate_y .laydate_yms a{border-bottom:1px solid #C6C6C6;}\n.laydate_body .laydate_y .laydate_yms .laydate_chdown{border-top:1px solid #C6C6C6; border-bottom:none;}\n.laydate_body .laydate_choose{border-left:1px solid #C6C6C6;}\n.laydate_body .laydate_chprev{border-left:none; border-right:1px solid #C6C6C6;}\n.laydate_body .laydate_choose:hover, \n.laydate_body .laydate_y .laydate_yms a:hover{background-color:#fff;}\n.laydate_body .laydate_chtop cite{border-bottom-color:#666;}\n.laydate_body .laydate_chdown cite, .laydate_body .laydate_ym label{border-top-color:#666;}\n.laydate_body .laydate_chprev cite{border-right-style:solid; border-right-color:#666;}\n.laydate_body .laydate_chnext cite{border-left-style:solid; border-left-color:#666;}\n.laydate_body .laydate_table td{border:none;  height:21px!important; line-height:21px!important; background-color:#fff;}\n.laydate_body .laydate_table .laydate_nothis{color:#999;}\n.laydate_body .laydate_table thead{height:21px!important; line-height:21px!important;}\n.laydate_body .laydate_table thead th{border-bottom:1px solid #ccc;}\n.laydate_body .laydate_bottom{border-bottom:1px solid #C6C6C6;}\n.laydate_body .laydate_bottom #laydate_hms{background-color:#fff;}\n.laydate_body .laydate_time{background-color:#fff;}\n.laydate_body .laydate_bottom .laydate_sj{border-right:1px solid #C6C6C6; background-color:#F6F6F6;}\n.laydate_body .laydate_bottom input{background-color:#fff;}\n.laydate_body .laydate_bottom .laydte_hsmtex{border-bottom:1px solid #C6C6C6;}\n.laydate_body .laydate_bottom .laydate_btn{border-right:1px solid #C6C6C6;}\n.laydate_body .laydate_bottom .laydate_v{color:#999}\n.laydate_body .laydate_bottom .laydate_btn a{border-right:none; background-color:#F6F6F6;}\n.laydate_body .laydate_bottom .laydate_btn a:hover{color:#000; background-color:#fff;}\n\n.laydate_body .laydate_m .laydate_yms span:hover,\n.laydate_body .laydate_y .laydate_yms ul li:hover,\n.laydate_body .laydate_table td:hover,\n.laydate_body .laydate_time .laydate_hmsno span:hover{background-color:#F3F3F3}\n\n\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/layer/laydate-v1.1/laydate/skins/molv/laydate.css",
    "content": "﻿/** \n \n @Name： laydate皮肤：墨绿\n @Author：贤心\n @Site：http://sentsin.com/layui/laydate\n \n**/\n\n.laydate-icon{border:1px solid #ccc; background-image:url(icon.png)}\n\n.laydate_body .laydate_bottom #laydate_hms,\n.laydate_body .laydate_time{border:1px solid #ccc;}\n\n.laydate_body .laydate_box, \n.laydate_body .laydate_ym .laydate_yms,\n.laydate_body .laydate_time{box-shadow: 2px 2px 5px rgba(0,0,0,.1);}\n\n.laydate_body .laydate_box{border-top:none; border-bottom:none; background-color:#fff; color:#00625A;}\n.laydate_body .laydate_box input{background:none!important; color:#fff;}\n.laydate_body .laydate_box .laydate_void{color:#00E8D7!important;}\n.laydate_body .laydate_box a, .laydate_body .laydate_box a:hover{color:#00625A;}\n.laydate_body .laydate_box a:hover{color:#666;}\n.laydate_body .laydate_click{background-color:#009F95!important; color:#fff!important;}\n.laydate_body .laydate_top{border-top:1px solid #009F95; background-color:#009F95}\n.laydate_body .laydate_ym{border:1px solid #009F95; background-color:#009F95;}\n.laydate_body .laydate_ym .laydate_yms{border:1px solid #009F95; background-color:#009F95; color:#fff;}\n.laydate_body .laydate_y .laydate_yms a{border-bottom:1px solid #009F95;}\n.laydate_body .laydate_y .laydate_yms .laydate_chdown{border-top:1px solid #009F95; border-bottom:none;}\n.laydate_body .laydate_choose{border-left:1px solid #009F95;}\n.laydate_body .laydate_chprev{border-left:none; border-right:1px solid #009F95;}\n.laydate_body .laydate_choose:hover, \n.laydate_body .laydate_y .laydate_yms a:hover{background-color:#00C1B3;}\n.laydate_body .laydate_chtop cite{border-bottom-color:#fff;}\n.laydate_body .laydate_chdown cite, .laydate_body .laydate_ym label{border-top-color:#fff;}\n.laydate_body .laydate_chprev cite{border-right-style:solid; border-right-color:#fff;}\n.laydate_body .laydate_chnext cite{border-left-style:solid; border-left-color:#fff;}\n.laydate_body .laydate_table{width: 240px!important; margin: 0!important; border:1px solid #ccc; border-top:none; border-bottom:none;}\n.laydate_body .laydate_table td{border:none;  height:21px!important; line-height:21px!important; background-color:#fff; color:#00625A;}\n.laydate_body .laydate_table .laydate_nothis{color:#999;}\n.laydate_body .laydate_table thead{border-bottom:1px solid #ccc; height:21px!important; line-height:21px!important;}\n.laydate_body .laydate_table thead th{}\n.laydate_body .laydate_bottom{border:1px solid #ccc; border-top:none;}\n.laydate_body .laydate_bottom #laydate_hms{background-color:#fff;}\n.laydate_body .laydate_time{background-color:#fff;}\n.laydate_body .laydate_time1{width: 226px!important; height: 152px!important;}\n.laydate_body .laydate_bottom .laydate_sj{width:31px!important; border-right:1px solid #ccc; background-color:#fff;}\n.laydate_body .laydate_bottom input{background-color:#fff; color:#00625A;}\n.laydate_body .laydate_bottom .laydte_hsmtex{border-bottom:1px solid #ccc;}\n.laydate_body .laydate_bottom .laydate_btn{border-right:1px solid #ccc;}\n.laydate_body .laydate_bottom .laydate_v{color:#999}\n.laydate_body .laydate_bottom .laydate_btn a{border: 1px solid #ccc; border-right:none; background-color:#fff;}\n.laydate_body .laydate_bottom .laydate_btn a:hover{background-color:#F6F6F6; color:#00625A;}\n\n.laydate_body .laydate_m .laydate_yms span:hover,\n.laydate_body .laydate_time .laydate_hmsno span:hover,\n.laydate_body .laydate_y .laydate_yms ul li:hover,\n.laydate_body .laydate_table td:hover{background-color:#00C1B3; color:#fff;}\n\n\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/layer/laydate-v1.1/更新日志.txt",
    "content": "http://sentsin.com/layui/laydate/\n־http://say.sentsin.com/say-922.html\n\n1.1־2014-06-25\n# layer.now(timestamp,format)ֶ֧Ͳtimestampֽ֧ǰ죬ͽĺ죬һЧʱ,򷵻ظʱӦڡʲôû룬򷵻صǰʱڡformatΪڸʽΪʱĬϵġ-ָ\n# ŻĴ롣\n# ֺѡĳ10*6С\n# ޸δжʽ\n# ޸ҳ¼Уlaydateɵִеbug\n# Ƥ[ī]\n\n\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/layer/layim/layim.css",
    "content": "/*\n\n @Name: layim WebIM 1.0.0\n @Author：贤心（子涵修改）\n @Date: 2014-04-25\n @Blog: http://sentsin.com\n\n */\nbody,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,input,button,textarea,p,blockquote,th,td,form{margin:0; padding:0;}\ninput,button,textarea,select,optgroup,option{font-family:inherit; font-size:inherit; font-style:inherit; font-weight:inherit; outline: 0;}\nli{list-style:none;}\n.xxim_icon, .xxim_main i, .layim_chatbox i{position:absolute;}\n.loading{background:url(loading.gif) no-repeat center center;}\n.layim_chatbox a, .layim_chatbox a:hover{color:#343434; text-decoration:none; }\n.layim_zero{position:absolute; width:0; height:0; border-style:dashed; border-color:transparent; overflow:hidden;}\n\n.xxim_main{position:fixed; right:1px; bottom:1px; width:230px; border:1px solid #BEBEBE; background-color:#fff; font-size:12px; box-shadow: 0 0 10px rgba(0,0,0,.2); z-index:99999999}\n.layim_chatbox textarea{resize:none;}\n.xxim_main em, .xxim_main i, .layim_chatbox em, .layim_chatbox i{font-style:normal; font-weight:400;}\n.xxim_main h5{font-size:100%; font-weight:400;}\n\n/* 搜索栏 */\n.xxim_search{position:relative; padding-left:40px; height:40px; border-bottom:1px solid #DCDCDC; background-color:#fff;}\n.xxim_search i{left:10px; top:12px; width:16px; height:16px;font-size: 16px;color:#999;}\n.xxim_search input{border:none; background:none; width: 180px; margin-top:10px; line-height:20px;}\n.xxim_search span{display:none; position:absolute; right:10px; top:10px; height:18px; line-height:18px;width:18px;text-align: center;background-color:#AFAFAF; color:#fff; cursor:pointer; border-radius:2px; font-size:12px; font-weight:900;}\n.xxim_search span:hover{background-color:#FCBE00;}\n\n/* 主面板tab */\n.xxim_tabs{height:45px; border-bottom:1px solid #DBDBDB; background-color:#F4F4F4; font-size:0;}\n.xxim_tabs span{position:relative; display:inline-block; *display:inline; *zoom:1; vertical-align:top; width:76px; height:45px; border-right:1px solid #DBDBDB; cursor:pointer; font-size:12px;}\n.xxim_tabs span i{top:12px; left:50%; width:20px; margin-left:-10px; height:20px;font-size:20px;color:#ccc;}\n.xxim_tabs .xxim_tabnow{height:46px; background-color:#fff;}\n.xxim_tabs .xxim_tabnow i{color:#1ab394;}\n.xxim_tabs .xxim_latechat{border-right:none;}\n.xxim_tabs .xxim_tabfriend i{width:14px; margin-left:-7px;}\n\n/* 主面板列表 */\n.xxim_list{display:none; height:350px; padding:5px 0; overflow:hidden;}\n.xxim_list:hover{ overflow-y:auto;}\n.xxim_list h5{position:relative; padding-left:32px; height:26px; line-height:26px; cursor:pointer; color:#000; font-size:0;}\n.xxim_list h5 span{display:inline-block; *display:inline; *zoom:1; vertical-align:top; max-width:140px; overflow:hidden; text-overflow: ellipsis; white-space:nowrap; font-size:12px;}\n.xxim_list h5 i{left:15px; top:8px; width:10px; height:10px;font-size:10px;color:#666;}\n.xxim_list h5 *{font-size:12px;}\n.xxim_list .xxim_chatlist{display:none;}\n.xxim_list .xxim_liston h5 i{width:8px; height:7px;}\n.xxim_list .xxim_liston .xxim_chatlist{display:block;}\n.xxim_chatlist {}\n.xxim_chatlist li{position:relative; height:40px; line-height:30px; padding:5px 10px; font-size:0; cursor:pointer;}\n.xxim_chatlist li:hover{background-color:#F2F4F8}\n.xxim_chatlist li *{display:inline-block; *display:inline; *zoom:1; vertical-align:top; font-size:12px;}\n.xxim_chatlist li span{padding-left:10px; max-width:120px;  overflow:hidden; text-overflow: ellipsis; white-space:nowrap;}\n.xxim_chatlist li img{width:30px; height:30px;}\n.xxim_chatlist li .xxim_time{position:absolute; right:10px; color:#999;}\n.xxim_list .xxim_errormsg{text-align:center; margin:50px 0; color:#999;}\n.xxim_searchmain{position:absolute; width:230px; height:491px; left:0; top:41px; z-index:10; background-color:#fff;}\n\n/* 主面板底部 */\n.xxim_bottom{height:34px; border-top:1px solid #D0DCF3; background-color:#F2F4F8;}\n.xxim_expend{border-left:1px solid #D0DCF3; border-bottom:1px solid #D0DCF3;}\n.xxim_bottom li{position:relative; width:50px; height:32px; line-height:32px; float:left; border-right:1px solid #D0DCF3;  cursor:pointer;}\n.xxim_bottom li i{ top:9px;}\n.xxim_bottom .xxim_hide{border-right:none;}\n.xxim_bottom .xxim_online{width:72px; padding-left:35px;}\n.xxim_online i{left:13px; width:14px; height:14px;font-size:14px;color:#FFA00A;}\n.xxim_setonline{display:none; position:absolute; left:-79px; bottom:-1px;  border:1px solid #DCDCDC; background-color:#fff;}\n.xxim_setonline span{position:relative; display:block; width:32px;width: 77px; padding:0 10px 0 35px;}\n.xxim_setonline span:hover{background-color:#F2F4F8;}\n.xxim_offline .xxim_nowstate, .xxim_setoffline i{color:#999;}\n.xxim_mymsg i{left:18px; width:14px; height:14px;font-size: 14px;}\n.xxim_mymsg a{position:absolute; left:0; top:0; width:50px; height:32px;}\n.xxim_seter i{left:18px; width:14px; height:14px;font-size: 14px;}\n.xxim_hide i{left:18px; width:14px; height:14px;font-size: 14px;}\n.xxim_show i{}\n.xxim_bottom .xxim_on{position:absolute; left:-17px; top:50%; width:16px;text-align: center;color:#999;line-height: 97px; height:97px; margin-top:-49px;border:solid 1px #BEBEBE;border-right: none; background:#F2F4F8;}\n.xxim_bottom .xxim_off{}\n\n/* 聊天窗口 */\n.layim_chatbox{width:620px; border:1px solid #BEBEBE; background-color:#fff; font-size:12px; box-shadow: 0 0 10px rgba(0,0,0,.2);}\n.layim_chatbox h6{position:relative; height:40px; border-bottom:1px solid #D9D9D9; background-color:#FCFDFA}\n.layim_move{position:absolute; height:40px; width: 620px; z-index:0;}\n.layim_face{position:absolute; bottom:-1px; left:10px; width:64px; height:64px;padding:1px;background: #fff; border:1px solid #ccc;}\n.layim_face img{width:60px; height:60px;}\n.layim_names{position:absolute; left:90px; max-width:300px; line-height:40px; color:#000; overflow:hidden; text-overflow: ellipsis; white-space:nowrap; font-size:14px;}\n.layim_rightbtn{position:absolute; right:15px; top:12px; font-size:20px;}\n.layim_rightbtn i{position:relative; width:16px; height:16px; display:inline-block; *display:inline; *zoom:1; vertical-align:top; cursor:pointer; transition: all .3s;text-align: center;line-height: 16px;}\n.layim_rightbtn .layim_close{background: #FFA00A;color:#fff;}\n.layim_rightbtn .layim_close:hover{-webkit-transform: rotate(180deg); -moz-transform: rotate(180deg);}\n.layim_rightbtn .layer_setmin{margin-right:5px;color:#999;font-size:14px;font-weight: 700;}\n.layim_chat, .layim_chatmore,.layim_groups{height:450px; overflow:hidden;}\n.layim_chatmore{display:none; float:left; width:135px; border-right:1px solid #BEBEBE; background-color:#F2F2F2}\n.layim_chatlist li, .layim_groups li{position:relative; height:30px; line-height:30px; padding:0 10px; overflow:hidden; text-overflow: ellipsis; white-space:nowrap; cursor:pointer;}\n.layim_chatlist li{padding:0 20px 0 10px;}\n.layim_chatlist li:hover{background-color:#E3E3E3;}\n.layim_chatlist li span{display:inline-block; *display:inline; *zoom:1; vertical-align:top; width:90px; overflow:hidden; text-overflow: ellipsis; white-space:nowrap;}\n.layim_chatlist li em{display:none; position:absolute; top:6px; right:10px; height:18px; line-height:18px;width:18px;text-align: center;font-size:14px;font-weight:900; border-radius:3px;}\n.layim_chatlist li em:hover{background-color: #FCBE00; color:#fff;}\n.layim_chatlist .layim_chatnow,.layim_chatlist .layim_chatnow:hover{/*border-top:1px solid #D9D9D9; border-bottom:1px solid #D9D9D9;*/ background-color:#fff;}\n.layim_chat{}\n.layim_chatarea{height:280px;}\n.layim_chatview{display:none; height:280px; overflow:hidden;}\n.layim_chatmore:hover, .layim_groups:hover, .layim_chatview:hover{overflow-y:auto;}\n.layim_chatview li{margin-bottom:10px; clear:both; *zoom:1;}\n.layim_chatview li:after{content:'\\20'; clear:both; *zoom:1; display:block; height:0;}\n\n.layim_chatthis{display:block;}\n.layim_chatuser{float:left; padding:15px; font-size:0;}\n.layim_chatuser *{display:inline-block; *display:inline; *zoom:1; vertical-align:top; line-height:30px; font-size:12px; padding-right:10px;}\n.layim_chatuser img{width:30px; height:30px;padding-right: 0;margin-right: 15px;}\n.layim_chatuser .layim_chatname{max-width:230px; overflow:hidden; text-overflow: ellipsis; white-space:nowrap;}\n.layim_chatuser .layim_chattime{color:#999; padding-left:10px;}\n.layim_chatsay{position:relative; float:left; margin:0 15px; padding:10px; line-height:20px; background-color:#F3F3F3; border-radius:3px; clear:both;}\n.layim_chatsay .layim_zero{left:5px; top:-8px; border-width:8px; border-right-style:solid; border-right-color:#F3F3F3;}\n.layim_chateme .layim_chatuser{float:right;}\n.layim_chateme .layim_chatuser *{padding-right:0; padding-left:10px;}\n.layim_chateme .layim_chatuser img{margin-left:15px;padding-left: 0;}\n.layim_chateme .layim_chatsay .layim_zero{left:auto; right:10px;}\n.layim_chateme .layim_chatuser .layim_chattime{padding-left:0; padding-right:10px;}\n.layim_chateme .layim_chatsay{float:right; background-color:#EBFBE3}\n.layim_chateme .layim_zero{border-right-color:#EBFBE3;}\n.layim_groups{display:none; float:right; width:130px; border-left:1px solid #D9D9D9; background-color:#fff;}\n.layim_groups ul{display:none;}\n.layim_groups ul.layim_groupthis{display:block;}\n.layim_groups li *{display:inline-block; *display:inline; *zoom:1; vertical-align:top; margin-right:10px;}\n.layim_groups li img{width:20px; height:20px; margin-top:5px;}\n.layim_groups li span{max-width:80px; overflow:hidden; text-overflow: ellipsis; white-space:nowrap;}\n.layim_groups li:hover{background-color:#F3F3F3;}\n.layim_groups .layim_errors{text-align:center; color:#999;}\n.layim_tool{position:relative; height:35px; line-height:35px; padding-left:10px; background-color:#F3F3F3;}\n.layim_tool i{position:relative; top:10px; display:inline-block; *display:inline; *zoom:1; vertical-align:top; width:16px; height:16px; margin-right:10px; cursor:pointer;font-size:16px;color:#999;font-weight: 700;}\n.layim_tool i:hover{color:#FFA00A;}\n.layim_tool .layim_seechatlog{position:absolute; right:15px;}\n.layim_tool .layim_seechatlog i{}\n.layim_write{display:block; border:none; width:98%; height:90px; line-height:20px; margin:5px auto 0;}\n.layim_send{position:relative; height:40px; background-color:#F3F3F3;}\n.layim_sendbtn{position:absolute; height:26px; line-height:26px; right:10px; top:8px; padding:0 40px 0 20px; background-color:#FFA00A; color:#fff; border-radius:3px; cursor:pointer;}\n.layim_enter{position:absolute; right:0; border-left:1px solid #FFB94F; width:24px; height:26px;}\n.layim_enter:hover{background-color:#E68A00; border-radius:0 3px 3px 0;}\n.layim_enter .layim_zero{left:7px; top:11px; border-width:5px; border-top-style:solid; border-top-color:#FFE0B3;}\n.layim_sendtype{display:none; position:absolute; right:10px; bottom:37px; border:1px solid #D9D9D9; background-color:#fff; text-align:left;}\n.layim_sendtype span{display:block; line-height:24px; padding:0 10px 0 25px; cursor:pointer;}\n.layim_sendtype span:hover{background-color:#F3F3F3;}\n.layim_sendtype span i{left:5px;}\n\n.layim_min{display:none; position:absolute; left:-190px; bottom:-1px; width:160px; height:32px; line-height:32px; padding:0 10px; overflow:hidden; text-overflow: ellipsis; white-space:nowrap; border:1px solid #ccc; box-shadow: 0 0 5px rgba(0,0,75,.2); background-color:#FCFDFA; cursor:pointer;}\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/layer/layim/layim.js",
    "content": "/*\n\n @Name: layui WebIM 1.0.0\n @Author：贤心\n @Date: 2014-04-25\n @Blog: http://sentsin.com\n\n */\n\n;!function(win, undefined){\n\nvar config = {\n    msgurl: 'mailbox.html?msg=',\n    chatlogurl: 'mailbox.html?user=',\n    aniTime: 200,\n    right: -232,\n    api: {\n        friend: 'js/plugins/layer/layim/data/friend.json', //好友列表接口\n        group: 'js/plugins/layer/layim/data/group.json', //群组列表接口\n        chatlog: 'js/plugins/layer/layim/data/chatlog.json', //聊天记录接口\n        groups: 'js/plugins/layer/layim/data/groups.json', //群组成员接口\n        sendurl: '' //发送消息接口\n    },\n    user: { //当前用户信息\n        name: '游客',\n        face: 'img/a1.jpg'\n    },\n\n    //自动回复内置文案，也可动态读取数据库配置\n    autoReplay: [\n        '您好，我现在有事不在，一会再和您联系。',\n        '你没发错吧？',\n        '洗澡中，请勿打扰，偷窥请购票，个体四十，团体八折，订票电话：一般人我不告诉他！',\n        '你好，我是主人的美女秘书，有什么事就跟我说吧，等他回来我会转告他的。',\n        '我正在拉磨，没法招呼您，因为我们家毛驴去动物保护协会把我告了，说我剥夺它休产假的权利。',\n        '<（@￣︶￣@）>',\n        '你要和我说话？你真的要和我说话？你确定自己想说吗？你一定非说不可吗？那你说吧，这是自动回复。',\n        '主人正在开机自检，键盘鼠标看好机会出去凉快去了，我是他的电冰箱，我打字比较慢，你慢慢说，别急……',\n        '(*^__^*) 嘻嘻，是贤心吗？'\n    ],\n\n\n    chating: {},\n    hosts: (function(){\n        var dk = location.href.match(/\\:\\d+/);\n        dk = dk ? dk[0] : '';\n        return 'http://' + document.domain + dk + '/';\n    })(),\n    json: function(url, data, callback, error){\n        return $.ajax({\n            type: 'POST',\n            url: url,\n            data: data,\n            dataType: 'json',\n            success: callback,\n            error: error\n        });\n    },\n    stopMP: function(e){\n        e ? e.stopPropagation() : e.cancelBubble = true;\n    }\n}, dom = [$(window), $(document), $('html'), $('body')], xxim = {};\n\n//主界面tab\nxxim.tabs = function(index){\n    var node = xxim.node;\n    node.tabs.eq(index).addClass('xxim_tabnow').siblings().removeClass('xxim_tabnow');\n    node.list.eq(index).show().siblings('.xxim_list').hide();\n    if(node.list.eq(index).find('li').length === 0){\n        xxim.getDates(index);\n    }\n};\n\n//节点\nxxim.renode = function(){\n    var node = xxim.node = {\n        tabs: $('#xxim_tabs>span'),\n        list: $('.xxim_list'),\n        online: $('.xxim_online'),\n        setonline: $('.xxim_setonline'),\n        onlinetex: $('#xxim_onlinetex'),\n        xximon: $('#xxim_on'),\n        layimFooter: $('#xxim_bottom'),\n        xximHide: $('#xxim_hide'),\n        xximSearch: $('#xxim_searchkey'),\n        searchMian: $('#xxim_searchmain'),\n        closeSearch: $('#xxim_closesearch'),\n        layimMin: $('#layim_min')\n    };\n};\n\n//主界面缩放\nxxim.expend = function(){\n    var node = xxim.node;\n    if(xxim.layimNode.attr('state') !== '1'){\n        xxim.layimNode.stop().animate({right: config.right}, config.aniTime, function(){\n            node.xximon.addClass('xxim_off');\n            try{\n                localStorage.layimState = 1;\n            }catch(e){}\n            xxim.layimNode.attr({state: 1});\n            node.layimFooter.addClass('xxim_expend').stop().animate({marginLeft: config.right}, config.aniTime/2);\n            node.xximHide.addClass('xxim_show');\n        });\n    } else {\n        xxim.layimNode.stop().animate({right: 1}, config.aniTime, function(){\n            node.xximon.removeClass('xxim_off');\n            try{\n                localStorage.layimState = 2;\n            }catch(e){}\n            xxim.layimNode.removeAttr('state');\n            node.layimFooter.removeClass('xxim_expend');\n            node.xximHide.removeClass('xxim_show');\n        });\n        node.layimFooter.stop().animate({marginLeft: 0}, config.aniTime);\n    }\n};\n\n//初始化窗口格局\nxxim.layinit = function(){\n    var node = xxim.node;\n\n    //主界面\n    try{\n        /*\n        if(!localStorage.layimState){\n            config.aniTime = 0;\n            localStorage.layimState = 1;\n        }\n        */\n        if(localStorage.layimState === '1'){\n            xxim.layimNode.attr({state: 1}).css({right: config.right});\n            node.xximon.addClass('xxim_off');\n            node.layimFooter.addClass('xxim_expend').css({marginLeft: config.right});\n            node.xximHide.addClass('xxim_show');\n        }\n    }catch(e){\n        //layer.msg(e.message, 5, -1);\n    }\n};\n\n//聊天窗口\nxxim.popchat = function(param){\n    var node = xxim.node, log = {};\n\n    log.success = function(layero){\n        layer.setMove();\n\n        xxim.chatbox = layero.find('#layim_chatbox');\n        log.chatlist = xxim.chatbox.find('.layim_chatmore>ul');\n\n        log.chatlist.html('<li data-id=\"'+ param.id +'\" type=\"'+ param.type +'\"  id=\"layim_user'+ param.type + param.id +'\"><span>'+ param.name +'</span><em>×</em></li>')\n        xxim.tabchat(param, xxim.chatbox);\n\n        //最小化聊天窗\n        xxim.chatbox.find('.layer_setmin').on('click', function(){\n            var indexs = layero.attr('times');\n            layero.hide();\n            node.layimMin.text(xxim.nowchat.name).show();\n        });\n\n        //关闭窗口\n        xxim.chatbox.find('.layim_close').on('click', function(){\n            var indexs = layero.attr('times');\n            layer.close(indexs);\n            xxim.chatbox = null;\n            config.chating = {};\n            config.chatings = 0;\n        });\n\n        //关闭某个聊天\n        log.chatlist.on('mouseenter', 'li', function(){\n            $(this).find('em').show();\n        }).on('mouseleave', 'li', function(){\n            $(this).find('em').hide();\n        });\n        log.chatlist.on('click', 'li em', function(e){\n            var parents = $(this).parent(), dataType = parents.attr('type');\n            var dataId = parents.attr('data-id'), index = parents.index();\n            var chatlist = log.chatlist.find('li'), indexs;\n\n            config.stopMP(e);\n\n            delete config.chating[dataType + dataId];\n            config.chatings--;\n\n            parents.remove();\n            $('#layim_area'+ dataType + dataId).remove();\n            if(dataType === 'group'){\n                $('#layim_group'+ dataType + dataId).remove();\n            }\n\n            if(parents.hasClass('layim_chatnow')){\n                if(index === config.chatings){\n                    indexs = index - 1;\n                } else {\n                    indexs = index + 1;\n                }\n                xxim.tabchat(config.chating[chatlist.eq(indexs).attr('type') + chatlist.eq(indexs).attr('data-id')]);\n            }\n\n            if(log.chatlist.find('li').length === 1){\n                log.chatlist.parent().hide();\n            }\n        });\n\n        //聊天选项卡\n        log.chatlist.on('click', 'li', function(){\n            var othis = $(this), dataType = othis.attr('type'), dataId = othis.attr('data-id');\n            xxim.tabchat(config.chating[dataType + dataId]);\n        });\n\n        //发送热键切换\n        log.sendType = $('#layim_sendtype'), log.sendTypes = log.sendType.find('span');\n        $('#layim_enter').on('click', function(e){\n            config.stopMP(e);\n            log.sendType.show();\n        });\n        log.sendTypes.on('click', function(){\n            log.sendTypes.find('i').text('')\n            $(this).find('i').text('√');\n        });\n\n        xxim.transmit();\n    };\n\n    log.html = '<div class=\"layim_chatbox\" id=\"layim_chatbox\">'\n            +'<h6>'\n            +'<span class=\"layim_move\"></span>'\n            +'    <a href=\"'+ param.url +'\" class=\"layim_face\" target=\"_blank\"><img src=\"'+ param.face +'\" ></a>'\n            +'    <a href=\"'+ param.url +'\" class=\"layim_names\" target=\"_blank\">'+ param.name +'</a>'\n            +'    <span class=\"layim_rightbtn\">'\n            +'        <i class=\"layer_setmin\">—</i>'\n            +'        <i class=\"layim_close\">&times;</i>'\n            +'    </span>'\n            +'</h6>'\n            +'<div class=\"layim_chatmore\" id=\"layim_chatmore\">'\n            +'    <ul class=\"layim_chatlist\"></ul>'\n            +'</div>'\n            +'<div class=\"layim_groups\" id=\"layim_groups\"></div>'\n            +'<div class=\"layim_chat\">'\n            +'    <div class=\"layim_chatarea\" id=\"layim_chatarea\">'\n            +'        <ul class=\"layim_chatview layim_chatthis\"  id=\"layim_area'+ param.type + param.id +'\"></ul>'\n            +'    </div>'\n            +'    <div class=\"layim_tool\">'\n            +'        <i class=\"layim_addface fa fa-meh-o\" title=\"发送表情\"></i>'\n            +'        <a href=\"javascript:;\"><i class=\"layim_addimage fa fa-picture-o\" title=\"上传图片\"></i></a>'\n            +'        <a href=\"javascript:;\"><i class=\"layim_addfile fa fa-paperclip\" title=\"上传附件\"></i></a>'\n            +'        <a href=\"\" target=\"_blank\" class=\"layim_seechatlog\"><i class=\"fa fa-comment-o\"></i>聊天记录</a>'\n            +'    </div>'\n            +'    <textarea class=\"layim_write\" id=\"layim_write\"></textarea>'\n            +'    <div class=\"layim_send\">'\n            +'        <div class=\"layim_sendbtn\" id=\"layim_sendbtn\">发送<span class=\"layim_enter\" id=\"layim_enter\"><em class=\"layim_zero\"></em></span></div>'\n            +'        <div class=\"layim_sendtype\" id=\"layim_sendtype\">'\n            +'            <span><i>√</i>按Enter键发送</span>'\n            +'            <span><i></i>按Ctrl+Enter键发送</span>'\n            +'        </div>'\n            +'    </div>'\n            +'</div>'\n            +'</div>';\n\n    if(config.chatings < 1){\n        $.layer({\n            type: 1,\n            border: [0],\n            title: false,\n            shade: [0],\n            area: ['620px', '493px'],\n            move: '.layim_chatbox .layim_move',\n            moveType: 1,\n            closeBtn: false,\n            offset: [(($(window).height() - 493)/2)+'px', ''],\n            page: {\n                html: log.html\n            }, success: function(layero){\n                log.success(layero);\n            }\n        })\n    } else {\n        log.chatmore = xxim.chatbox.find('#layim_chatmore');\n        log.chatarea = xxim.chatbox.find('#layim_chatarea');\n\n        log.chatmore.show();\n\n        log.chatmore.find('ul>li').removeClass('layim_chatnow');\n        log.chatmore.find('ul').append('<li data-id=\"'+ param.id +'\" type=\"'+ param.type +'\" id=\"layim_user'+ param.type + param.id +'\" class=\"layim_chatnow\"><span>'+ param.name +'</span><em>×</em></li>');\n\n        log.chatarea.find('.layim_chatview').removeClass('layim_chatthis');\n        log.chatarea.append('<ul class=\"layim_chatview layim_chatthis\" id=\"layim_area'+ param.type + param.id +'\"></ul>');\n\n        xxim.tabchat(param);\n    }\n\n    //群组\n    log.chatgroup = xxim.chatbox.find('#layim_groups');\n    if(param.type === 'group'){\n        log.chatgroup.find('ul').removeClass('layim_groupthis');\n        log.chatgroup.append('<ul class=\"layim_groupthis\" id=\"layim_group'+ param.type + param.id +'\"></ul>');\n        xxim.getGroups(param);\n    }\n    //点击群员切换聊天窗\n    log.chatgroup.on('click', 'ul>li', function(){\n        xxim.popchatbox($(this));\n    });\n};\n\n//定位到某个聊天队列\nxxim.tabchat = function(param){\n    var node = xxim.node, log = {}, keys = param.type + param.id;\n    xxim.nowchat = param;\n\n    xxim.chatbox.find('#layim_user'+ keys).addClass('layim_chatnow').siblings().removeClass('layim_chatnow');\n    xxim.chatbox.find('#layim_area'+ keys).addClass('layim_chatthis').siblings().removeClass('layim_chatthis');\n    xxim.chatbox.find('#layim_group'+ keys).addClass('layim_groupthis').siblings().removeClass('layim_groupthis');\n\n    xxim.chatbox.find('.layim_face>img').attr('src', param.face);\n    xxim.chatbox.find('.layim_face, .layim_names').attr('href', param.href);\n    xxim.chatbox.find('.layim_names').text(param.name);\n\n    xxim.chatbox.find('.layim_seechatlog').attr('href', config.chatlogurl + param.id);\n\n    log.groups = xxim.chatbox.find('.layim_groups');\n    if(param.type === 'group'){\n        log.groups.show();\n    } else {\n        log.groups.hide();\n    }\n\n    $('#layim_write').focus();\n\n};\n\n//弹出聊天窗\nxxim.popchatbox = function(othis){\n    var node = xxim.node, dataId = othis.attr('data-id'), param = {\n        id: dataId, //用户ID\n        type: othis.attr('type'),\n        name: othis.find('.xxim_onename').text(),  //用户名\n        face: othis.find('.xxim_oneface').attr('src'),  //用户头像\n        href: 'profile.html?user=' + dataId //用户主页\n    }, key = param.type + dataId;\n    if(!config.chating[key]){\n        xxim.popchat(param);\n        config.chatings++;\n    } else {\n        xxim.tabchat(param);\n    }\n    config.chating[key] = param;\n\n    var chatbox = $('#layim_chatbox');\n    if(chatbox[0]){\n        node.layimMin.hide();\n        chatbox.parents('.xubox_layer').show();\n    }\n};\n\n//请求群员\nxxim.getGroups = function(param){\n    var keys = param.type + param.id, str = '',\n    groupss = xxim.chatbox.find('#layim_group'+ keys);\n    groupss.addClass('loading');\n    config.json(config.api.groups, {}, function(datas){\n        if(datas.status === 1){\n            var ii = 0, lens = datas.data.length;\n            if(lens > 0){\n                for(; ii < lens; ii++){\n                    str += '<li data-id=\"'+ datas.data[ii].id +'\" type=\"one\"><img src=\"'+ datas.data[ii].face +'\" class=\"xxim_oneface\"><span class=\"xxim_onename\">'+ datas.data[ii].name +'</span></li>';\n                }\n            } else {\n                str = '<li class=\"layim_errors\">没有群员</li>';\n            }\n\n        } else {\n            str = '<li class=\"layim_errors\">'+ datas.msg +'</li>';\n        }\n        groupss.removeClass('loading');\n        groupss.html(str);\n    }, function(){\n        groupss.removeClass('loading');\n        groupss.html('<li class=\"layim_errors\">请求异常</li>');\n    });\n};\n\n//消息传输\nxxim.transmit = function(){\n    var node = xxim.node, log = {};\n    node.sendbtn = $('#layim_sendbtn');\n    node.imwrite = $('#layim_write');\n\n    //发送\n    log.send = function(){\n        var data = {\n            content: node.imwrite.val(),\n            id: xxim.nowchat.id,\n            sign_key: '', //密匙\n            _: +new Date\n        };\n\n        if(data.content.replace(/\\s/g, '') === ''){\n            layer.tips('说点啥呗！', '#layim_write', 2);\n            node.imwrite.focus();\n        } else {\n            //此处皆为模拟\n            var keys = xxim.nowchat.type + xxim.nowchat.id;\n\n            //聊天模版\n            log.html = function(param, type){\n                return '<li class=\"'+ (type === 'me' ? 'layim_chateme' : '') +'\">'\n                    +'<div class=\"layim_chatuser\">'\n                        + function(){\n                            if(type === 'me'){\n                                return '<span class=\"layim_chattime\">'+ param.time +'</span>'\n                                       +'<span class=\"layim_chatname\">'+ param.name +'</span>'\n                                       +'<img src=\"'+ param.face +'\" >';\n                            } else {\n                                return '<img src=\"'+ param.face +'\" >'\n                                       +'<span class=\"layim_chatname\">'+ param.name +'</span>'\n                                       +'<span class=\"layim_chattime\">'+ param.time +'</span>';\n                            }\n                        }()\n                    +'</div>'\n                    +'<div class=\"layim_chatsay\">'+ param.content +'<em class=\"layim_zero\"></em></div>'\n                +'</li>';\n            };\n\n            log.imarea = xxim.chatbox.find('#layim_area'+ keys);\n\n            log.imarea.append(log.html({\n                time: '2014-04-26 0:37',\n                name: config.user.name,\n                face: config.user.face,\n                content: data.content\n            }, 'me'));\n            node.imwrite.val('').focus();\n            log.imarea.scrollTop(log.imarea[0].scrollHeight);\n\n            setTimeout(function(){\n                log.imarea.append(log.html({\n                    time: '2014-04-26 0:38',\n                    name: xxim.nowchat.name,\n                    face: xxim.nowchat.face,\n                    content: config.autoReplay[(Math.random()*config.autoReplay.length) | 0]\n                }));\n                log.imarea.scrollTop(log.imarea[0].scrollHeight);\n            }, 500);\n\n            /*\n            that.json(config.api.sendurl, data, function(datas){\n\n            });\n            */\n        }\n\n    };\n    node.sendbtn.on('click', log.send);\n\n    node.imwrite.keyup(function(e){\n        if(e.keyCode === 13){\n            log.send();\n        }\n    });\n};\n\n//事件\nxxim.event = function(){\n    var node = xxim.node;\n\n    //主界面tab\n    node.tabs.eq(0).addClass('xxim_tabnow');\n    node.tabs.on('click', function(){\n        var othis = $(this), index = othis.index();\n        xxim.tabs(index);\n    });\n\n    //列表展收\n    node.list.on('click', 'h5', function(){\n        var othis = $(this), chat = othis.siblings('.xxim_chatlist'), parentss = othis.find(\"i\");\n        if(parentss.hasClass('fa-caret-down')){\n            chat.hide();\n            parentss.attr('class','fa fa-caret-right');\n        } else {\n            chat.show();\n            parentss.attr('class','fa fa-caret-down');\n        }\n    });\n\n    //设置在线隐身\n    node.online.on('click', function(e){\n        config.stopMP(e);\n        node.setonline.show();\n    });\n    node.setonline.find('span').on('click', function(e){\n        var index = $(this).index();\n        config.stopMP(e);\n        if(index === 0){\n            node.onlinetex.html('在线');\n            node.online.removeClass('xxim_offline');\n        } else if(index === 1) {\n            node.onlinetex.html('隐身');\n            node.online.addClass('xxim_offline');\n        }\n        node.setonline.hide();\n    });\n\n    node.xximon.on('click', xxim.expend);\n    node.xximHide.on('click', xxim.expend);\n\n    //搜索\n    node.xximSearch.keyup(function(){\n        var val = $(this).val().replace(/\\s/g, '');\n        if(val !== ''){\n            node.searchMian.show();\n            node.closeSearch.show();\n            //此处的搜索ajax参考xxim.getDates\n            node.list.eq(3).html('<li class=\"xxim_errormsg\">没有符合条件的结果</li>');\n        } else {\n            node.searchMian.hide();\n            node.closeSearch.hide();\n        }\n    });\n    node.closeSearch.on('click', function(){\n        $(this).hide();\n        node.searchMian.hide();\n        node.xximSearch.val('').focus();\n    });\n\n    //弹出聊天窗\n    config.chatings = 0;\n    node.list.on('click', '.xxim_childnode', function(){\n        var othis = $(this);\n        xxim.popchatbox(othis);\n    });\n\n    //点击最小化栏\n    node.layimMin.on('click', function(){\n        $(this).hide();\n        $('#layim_chatbox').parents('.xubox_layer').show();\n    });\n\n\n    //document事件\n    dom[1].on('click', function(){\n        node.setonline.hide();\n        $('#layim_sendtype').hide();\n    });\n};\n\n//请求列表数据\nxxim.getDates = function(index){\n    var api = [config.api.friend, config.api.group, config.api.chatlog],\n        node = xxim.node, myf = node.list.eq(index);\n    myf.addClass('loading');\n    config.json(api[index], {}, function(datas){\n        if(datas.status === 1){\n            var i = 0, myflen = datas.data.length, str = '', item;\n            if(myflen > 1){\n                if(index !== 2){\n                    for(; i < myflen; i++){\n                        str += '<li data-id=\"'+ datas.data[i].id +'\" class=\"xxim_parentnode\">'\n                            +'<h5><i class=\"fa fa-caret-right\"></i><span class=\"xxim_parentname\">'+ datas.data[i].name +'</span><em class=\"xxim_nums\">（'+ datas.data[i].nums +'）</em></h5>'\n                            +'<ul class=\"xxim_chatlist\">';\n                        item = datas.data[i].item;\n                        for(var j = 0; j < item.length; j++){\n                            str += '<li data-id=\"'+ item[j].id +'\" class=\"xxim_childnode\" type=\"'+ (index === 0 ? 'one' : 'group') +'\"><img src=\"'+ item[j].face +'\" class=\"xxim_oneface\"><span class=\"xxim_onename\">'+ item[j].name +'</span></li>';\n                        }\n                        str += '</ul></li>';\n                    }\n                } else {\n                    str += '<li class=\"xxim_liston\">'\n                        +'<ul class=\"xxim_chatlist\">';\n                    for(; i < myflen; i++){\n                        str += '<li data-id=\"'+ datas.data[i].id +'\" class=\"xxim_childnode\" type=\"one\"><img src=\"'+ datas.data[i].face +'\"  class=\"xxim_oneface\"><span  class=\"xxim_onename\">'+ datas.data[i].name +'</span><em class=\"xxim_time\">'+ datas.data[i].time +'</em></li>';\n                    }\n                    str += '</ul></li>';\n                }\n                myf.html(str);\n            } else {\n                myf.html('<li class=\"xxim_errormsg\">没有任何数据</li>');\n            }\n            myf.removeClass('loading');\n        } else {\n            myf.html('<li class=\"xxim_errormsg\">'+ datas.msg +'</li>');\n        }\n    }, function(){\n        myf.html('<li class=\"xxim_errormsg\">请求失败</li>');\n        myf.removeClass('loading');\n    });\n};\n\n//渲染骨架\nxxim.view = (function(){\n    var xximNode = xxim.layimNode = $('<div id=\"xximmm\" class=\"xxim_main\">'\n            +'<div class=\"xxim_top\" id=\"xxim_top\">'\n            +'  <div class=\"xxim_search\"><i class=\"fa fa-search\"></i><input id=\"xxim_searchkey\" /><span id=\"xxim_closesearch\">×</span></div>'\n            +'  <div class=\"xxim_tabs\" id=\"xxim_tabs\"><span class=\"xxim_tabfriend\" title=\"好友\"><i class=\"fa fa-user\"></i></span><span class=\"xxim_tabgroup\" title=\"群组\"><i class=\"fa fa-users\"></i></span><span class=\"xxim_latechat\"  title=\"最近聊天\"><i class=\"fa fa-clock-o\"></i></span></div>'\n            +'  <ul class=\"xxim_list\" style=\"display:block\"></ul>'\n            +'  <ul class=\"xxim_list\"></ul>'\n            +'  <ul class=\"xxim_list\"></ul>'\n            +'  <ul class=\"xxim_list xxim_searchmain\" id=\"xxim_searchmain\"></ul>'\n            +'</div>'\n            +'<ul class=\"xxim_bottom\" id=\"xxim_bottom\">'\n            +'<li class=\"xxim_online\" id=\"xxim_online\">'\n                +'<i class=\"xxim_nowstate fa fa-check-circle\"></i><span id=\"xxim_onlinetex\">在线</span>'\n                +'<div class=\"xxim_setonline\">'\n                    +'<span><i class=\"fa fa-check-circle\"></i>在线</span>'\n                    +'<span class=\"xxim_setoffline\"><i class=\"fa fa-check-circle\"></i>隐身</span>'\n                +'</div>'\n            +'</li>'\n            +'<li class=\"xxim_mymsg\" id=\"xxim_mymsg\" title=\"我的私信\"><i class=\"fa fa-comment\"></i><a href=\"'+ config.msgurl +'\" target=\"_blank\"></a></li>'\n            +'<li class=\"xxim_seter\" id=\"xxim_seter\" title=\"设置\">'\n                +'<i class=\"fa fa-gear\"></i>'\n                +'<div>'\n\n                +'</div>'\n            +'</li>'\n            +'<li class=\"xxim_hide\" id=\"xxim_hide\"><i class=\"fa fa-exchange\"></i></li>'\n            +'<li id=\"xxim_on\" class=\"xxim_icon xxim_on fa fa-ellipsis-v\"></li>'\n            +'<div class=\"layim_min\" id=\"layim_min\"></div>'\n        +'</ul>'\n    +'</div>');\n    dom[3].append(xximNode);\n\n    xxim.renode();\n    xxim.getDates(0);\n    xxim.event();\n    xxim.layinit();\n}());\n\n}(window);\n\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/layer/skin/layer.css",
    "content": "/*!\n\n @Name: layer's style\n @Author: 贤心\n @Blog： sentsin.com\n\n */*html{background-image:url(about:blank);background-attachment:fixed}html #layui_layer_skinlayercss{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+\"px\")}.layui-layer{top:150px;left:50%;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;box-shadow:1px 1px 50px rgba(0,0,0,.3);border-radius:2px;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.3);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-moves{position:absolute;border:3px solid #666;border:3px solid rgba(0,0,0,.5);cursor:move;background-color:#fff;background-color:rgba(255,255,255,.3);filter:alpha(opacity=50)}.layui-layer-load{background:url(default/loading-0.gif) center center no-repeat #fff}.layui-layer-ico{background:url(default/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}@-webkit-keyframes bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes 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)}}.layui-anim{-webkit-animation-name:bounceIn;animation-name:bounceIn}@-webkit-keyframes bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.03);transform:scale(1.03)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.03);-ms-transform:scale(1.03);transform:scale(1.03)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layui-anim-close{-webkit-animation-name:bounceOut;animation-name:bounceOut;-webkit-animation-duration:.2s;animation-duration:.2s}@-webkit-keyframes 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 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}}.layui-anim-01{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes 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)}}.layui-anim-02{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes 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 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}}.layui-anim-03{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes 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 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)}}.layui-anim-04{-webkit-animation-name:rollIn;animation-name:rollIn}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-anim-05{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes 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 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)}}.layui-anim-06{-webkit-animation-name:shake;animation-name: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;text-overflow:ellipsis;white-space:nowrap;background-color:#F8F8F8}.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:0 -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:-150px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-181px -31px}.layui-layer-btn{text-align:right;padding:0 10px 12px;pointer-events:auto}.layui-layer-btn a{height:28px;line-height:28px;margin:0 6px;padding:0 15px;border:1px solid #dedede;background-color:#f1f1f1;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.7}.layui-layer-btn .layui-layer-btn0{border-color:#4898d5;background-color:#2e8ded;color:#fff}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;font-size:14px;overflow: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 .layui-layer-content{overflow:hidden}.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(default/loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(default/loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(default/loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:5px 10px;font-size:12px;_float:left;border-radius:3px;box-shadow:1px 1px 3px rgba(0,0,0,.3);background-color:#F90;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:#F90}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:1px;border-bottom-style:solid;border-bottom-color:#F90}.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-lan .layui-layer-btn{padding:10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#BBB5B5;border:none}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/layer/skin/layer.ext.css",
    "content": "/*!\n\n @Name: layer拓展样式\n @Date: 2012.12.13\n @Author: 贤心\n @blog: sentsin.com\n\n */.layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span{text-overflow:ellipsis;white-space:nowrap}.layui-layer-iconext{background:url(default/icon-ext.png) no-repeat}html #layui_layer_skinlayerextcss{display:none;position:absolute;width:1989px}.layui-layer-prompt .layui-layer-input{display:block;width:220px;height:30px;margin:0 auto;line-height:30px;padding:0 5px;border:1px solid #ccc;box-shadow:1px 1px 5px rgba(0,0,0,.1) inset;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;border-bottom:1px solid #ccc;background-color:#eee;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;cursor:default;overflow:hidden}.layui-layer-tab .layui-layer-title span.layui-layer-tabnow{height:43px;border-left:1px solid #ccc;border-right:1px solid #ccc;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.xubox_tab_layer{display:block}.xubox_tabclose{position:absolute;right:10px;top:5px;cursor:pointer}.layui-layer-photos{-webkit-animation-duration:1s;animation-duration:1s;background:url(default/xubox_loading1.gif) center center no-repeat #000}.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}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/layer/skin/moon/style.css",
    "content": "/*\n * layer皮肤\n * 作者：一☆隐☆一\n * QQ:9073194\n * 请保留这里的信息 谢谢！虽然你不保留我也不能把你怎么样！\n */\n\nhtml #layui_layer_skinmoonstylecss {\n\tdisplay: none;\n\tposition: absolute;\n\twidth: 1989px;\n}\nbody .layer-ext-moon[type=\"dialog\"] {\n\tmin-width: 320px;\n}\nbody .layer-ext-moon-msg[type=\"dialog\"]{min-width:200px;}\nbody .layer-ext-moon .layui-layer-title {\n\tbackground: #f6f6f6;\n\tcolor: #212a31;\n\tfont-size: 16px;\n\tfont-weight: bold;\n\theight: 46px;\n\tline-height: 46px;\n}\n\n\n\nbody .layer-ext-moon .layui-layer-content .layui-layer-ico {\n\theight: 32px;\n\twidth: 32px;\n\ttop:18.5px;\n}\nbody .layer-ext-moon .layui-layer-ico0 {\n\tbackground: url(default.png) no-repeat -96px 0;\n\t;\n}\nbody .layer-ext-moon .layui-layer-ico1 {\n\tbackground: url(default.png) no-repeat -224px 0;\n\t;\n}\nbody .layer-ext-moon .layui-layer-ico2 {\n\tbackground: url(default.png) no-repeat -192px 0;\n}\nbody .layer-ext-moon .layui-layer-ico3 {\n\tbackground: url(default.png) no-repeat -160px 0;\n}\nbody .layer-ext-moon .layui-layer-ico4 {\n\tbackground: url(default.png) no-repeat -320px 0;\n}\nbody .layer-ext-moon .layui-layer-ico5 {\n\tbackground: url(default.png) no-repeat -288px 0;\n}\nbody .layer-ext-moon .layui-layer-ico6 {\n\tbackground: url(default.png) -256px 0;\n}\nbody .layer-ext-moon .layui-layer-ico7 {\n\tbackground: url(default.png) no-repeat -128px 0;\n}\nbody .layer-ext-moon .layui-layer-setwin {\n\ttop: 15px;\n\tright: 15px;\n}\nbody .layer-ext-moon .layui-layer-setwin a {\n\twidth: 16px;\n\theight: 16px;\n}\nbody .layer-ext-moon .layui-layer-setwin .layui-layer-min cite:hover {\n\tbackground-color: #56abe4;\n}\nbody .layer-ext-moon .layui-layer-setwin .layui-layer-max {\n\tbackground: url(default.png) no-repeat -80px 0;\n}\nbody .layer-ext-moon .layui-layer-setwin .layui-layer-max:hover {\n\tbackground: url(default.png) no-repeat -64px 0;\n}\nbody .layer-ext-moon .layui-layer-setwin .layui-layer-maxmin {\n\tbackground: url(default.png) no-repeat -32px 0;\n}\nbody .layer-ext-moon .layui-layer-setwin .layui-layer-maxmin:hover {\n\tbackground: url(default.png) no-repeat -16px 0;\n}\nbody .layer-ext-moon .layui-layer-setwin .layui-layer-close1,body .layer-ext-moon .layui-layer-setwin .layui-layer-close2 {\n\tbackground: url(default.png) 0 0;\n}\nbody .layer-ext-moon .layui-layer-setwin .layui-layer-close1:hover,body .layer-ext-moon .layui-layer-setwin .layui-layer-close2:hover {\n\tbackground: url(default.png) -48px 0;\n}\nbody .layer-ext-moon .layui-layer-padding{padding-top: 24px;}\nbody .layer-ext-moon .layui-layer-btn {\n\tpadding: 15px 0;\n\tbackground: #f0f4f7;\n\tborder-top: 1px #c7c7c7 solid;\n}\nbody .layer-ext-moon .layui-layer-btn a {\n\tfont-size: 12px;\n\tfont-weight: normal;\n\tmargin: 0 3px;\n\tmargin-right: 7px;\n\tmargin-left: 7px;\n\tpadding: 6px 20px;\n\tcolor: #fff;\n\tborder: 1px solid #0064b6;\n\tbackground: #0071ce;\n\tborder-radius: 3px;\n\tdisplay: inline-block;\n\theight: 20px;\n\tline-height: 20px;\n\ttext-align: center;\n\tvertical-align: middle;\n\tbackground-repeat: no-repeat;\n\ttext-decoration: none;\n\toutline: none;\n\t-moz-box-sizing: content-box;\n\t-webkit-box-sizing: content-box;\n\tbox-sizing: content-box;\n}\nbody .layer-ext-moon .layui-layer-btn .layui-layer-btn0 {\n\tbackground: #0071ce;\n}\nbody .layer-ext-moon .layui-layer-btn .layui-layer-btn1 {\n\tbackground: #fff;\n\tcolor: #404a58;\n\tborder: 1px solid #c0c4cd;\n\tborder-radius: 3px;\n}\nbody .layer-ext-moon .layui-layer-btn .layui-layer-btn2 {\n\tbackground: #f60;\n\tcolor: #fff;\n\tborder: 1px solid #f60;\n\tborder-radius: 3px;\n}\nbody .layer-ext-moon .layui-layer-btn .layui-layer-btn3 {\n\tbackground: #f00;\n\tcolor: #fff;\n\tborder: 1px solid #f00;\n\tborder-radius: 3px;\n}\n\nbody .layer-ext-moon .layui-layer-title span.layui-layer-tabnow{\n\theight:46px;\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/markdown/bootstrap-markdown.js",
    "content": "/* ===================================================\n * bootstrap-markdown.js v2.7.0\n * http://github.com/toopay/bootstrap-markdown\n * ===================================================\n * Copyright 2013-2014 Taufan Aditya\n *\n * Licensed under the Apache License, Version 2.0 (the \"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://www.apache.org/licenses/LICENSE-2.0\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\n! function ($) {\n\n    \"use strict\"; // jshint ;_;\n\n\n    /* MARKDOWN CLASS DEFINITION\n     * ========================== */\n\n    var Markdown = function (element, options) {\n        // Class Properties\n        this.$ns = 'bootstrap-markdown'\n        this.$element = $(element)\n        this.$editable = {\n            el: null,\n            type: null,\n            attrKeys: [],\n            attrValues: [],\n            content: null\n        }\n        this.$options = $.extend(true, {}, $.fn.markdown.defaults, options, this.$element.data(), this.$element.data('options'))\n        this.$oldContent = null\n        this.$isPreview = false\n        this.$isFullscreen = false\n        this.$editor = null\n        this.$textarea = null\n        this.$handler = []\n        this.$callback = []\n        this.$nextTab = []\n\n        this.showEditor()\n    }\n\n    Markdown.prototype = {\n\n        constructor: Markdown\n\n        ,\n        __alterButtons: function (name, alter) {\n            var handler = this.$handler,\n                isAll = (name == 'all'),\n                that = this\n\n            $.each(handler, function (k, v) {\n                var halt = true\n                if (isAll) {\n                    halt = false\n                } else {\n                    halt = v.indexOf(name) < 0\n                }\n\n                if (halt == false) {\n                    alter(that.$editor.find('button[data-handler=\"' + v + '\"]'))\n                }\n            })\n        }\n\n        ,\n        __buildButtons: function (buttonsArray, container) {\n            var i,\n                ns = this.$ns,\n                handler = this.$handler,\n                callback = this.$callback\n\n            for (i = 0; i < buttonsArray.length; i++) {\n                // Build each group container\n                var y, btnGroups = buttonsArray[i]\n                for (y = 0; y < btnGroups.length; y++) {\n                    // Build each button group\n                    var z,\n                        buttons = btnGroups[y].data,\n                        btnGroupContainer = $('<div/>', {\n                            'class': 'btn-group'\n                        })\n\n                    for (z = 0; z < buttons.length; z++) {\n                        var button = buttons[z],\n                            buttonContainer, buttonIconContainer,\n                            buttonHandler = ns + '-' + button.name,\n                            buttonIcon = this.__getIcon(button.icon),\n                            btnText = button.btnText ? button.btnText : '',\n                            btnClass = button.btnClass ? button.btnClass : 'btn',\n                            tabIndex = button.tabIndex ? button.tabIndex : '-1',\n                            hotkey = typeof button.hotkey !== 'undefined' ? button.hotkey : '',\n                            hotkeyCaption = typeof jQuery.hotkeys !== 'undefined' && hotkey !== '' ? ' (' + hotkey + ')' : ''\n\n                        // Construct the button object\n                        buttonContainer = $('<button></button>');\n                        buttonContainer.text(' ' + this.__localize(btnText)).addClass('btn-white btn-sm').addClass(btnClass);\n                        if (btnClass.match(/btn\\-(primary|success|info|warning|danger|link)/)) {\n                            buttonContainer.removeClass('btn-default');\n                        }\n                        buttonContainer.attr({\n                            'type': 'button',\n                            'title': this.__localize(button.title) + hotkeyCaption,\n                            'tabindex': tabIndex,\n                            'data-provider': ns,\n                            'data-handler': buttonHandler,\n                            'data-hotkey': hotkey\n                        });\n                        if (button.toggle == true) {\n                            buttonContainer.attr('data-toggle', 'button');\n                        }\n                        buttonIconContainer = $('<span/>');\n                        buttonIconContainer.addClass(buttonIcon);\n                        buttonIconContainer.prependTo(buttonContainer);\n\n                        // Attach the button object\n                        btnGroupContainer.append(buttonContainer);\n\n                        // Register handler and callback\n                        handler.push(buttonHandler);\n                        callback.push(button.callback);\n                    }\n\n                    // Attach the button group into container dom\n                    container.append(btnGroupContainer);\n                }\n            }\n\n            return container;\n        },\n        __setListener: function () {\n            // Set size and resizable Properties\n            var hasRows = typeof this.$textarea.attr('rows') != 'undefined',\n                maxRows = this.$textarea.val().split(\"\\n\").length > 5 ? this.$textarea.val().split(\"\\n\").length : '5',\n                rowsVal = hasRows ? this.$textarea.attr('rows') : maxRows\n\n            this.$textarea.attr('rows', rowsVal)\n            if (this.$options.resize) {\n                this.$textarea.css('resize', this.$options.resize)\n            }\n\n            this.$textarea\n                .on('focus', $.proxy(this.focus, this))\n                .on('keypress', $.proxy(this.keypress, this))\n                .on('keyup', $.proxy(this.keyup, this))\n                .on('change', $.proxy(this.change, this))\n\n            if (this.eventSupported('keydown')) {\n                this.$textarea.on('keydown', $.proxy(this.keydown, this))\n            }\n\n            // Re-attach markdown data\n            this.$textarea.data('markdown', this)\n        }\n\n        ,\n        __handle: function (e) {\n            var target = $(e.currentTarget),\n                handler = this.$handler,\n                callback = this.$callback,\n                handlerName = target.attr('data-handler'),\n                callbackIndex = handler.indexOf(handlerName),\n                callbackHandler = callback[callbackIndex]\n\n            // Trigger the focusin\n            $(e.currentTarget).focus()\n\n            callbackHandler(this)\n\n            // Trigger onChange for each button handle\n            this.change(this);\n\n            // Unless it was the save handler,\n            // focusin the textarea\n            if (handlerName.indexOf('cmdSave') < 0) {\n                this.$textarea.focus()\n            }\n\n            e.preventDefault()\n        }\n\n        ,\n        __localize: function (string) {\n            var messages = $.fn.markdown.messages,\n                language = this.$options.language\n            if (\n                typeof messages !== 'undefined' &&\n                typeof messages[language] !== 'undefined' &&\n                typeof messages[language][string] !== 'undefined'\n            ) {\n                return messages[language][string];\n            }\n            return string;\n        }\n\n        ,\n        __getIcon: function (src) {\n            return typeof src == 'object' ? src[this.$options.iconlibrary] : src;\n        }\n\n        ,\n        setFullscreen: function (mode) {\n            var $editor = this.$editor,\n                $textarea = this.$textarea\n\n            if (mode === true) {\n                $editor.addClass('md-fullscreen-mode')\n                $('body').addClass('md-nooverflow')\n                this.$options.onFullscreen(this)\n            } else {\n                $editor.removeClass('md-fullscreen-mode')\n                $('body').removeClass('md-nooverflow')\n            }\n\n            this.$isFullscreen = mode;\n            $textarea.focus()\n        }\n\n        ,\n        showEditor: function () {\n            var instance = this,\n                textarea,\n                ns = this.$ns,\n                container = this.$element,\n                originalHeigth = container.css('height'),\n                originalWidth = container.css('width'),\n                editable = this.$editable,\n                handler = this.$handler,\n                callback = this.$callback,\n                options = this.$options,\n                editor = $('<div/>', {\n                    'class': 'md-editor',\n                    click: function () {\n                        instance.focus()\n                    }\n                })\n\n            // Prepare the editor\n            if (this.$editor == null) {\n                // Create the panel\n                var editorHeader = $('<div/>', {\n                    'class': 'md-header btn-toolbar'\n                })\n\n                // Merge the main & additional button groups together\n                var allBtnGroups = []\n                if (options.buttons.length > 0) allBtnGroups = allBtnGroups.concat(options.buttons[0])\n                if (options.additionalButtons.length > 0) allBtnGroups = allBtnGroups.concat(options.additionalButtons[0])\n\n                // Reduce and/or reorder the button groups\n                if (options.reorderButtonGroups.length > 0) {\n                    allBtnGroups = allBtnGroups\n                        .filter(function (btnGroup) {\n                            return options.reorderButtonGroups.indexOf(btnGroup.name) > -1\n                        })\n                        .sort(function (a, b) {\n                            if (options.reorderButtonGroups.indexOf(a.name) < options.reorderButtonGroups.indexOf(b.name)) return -1\n                            if (options.reorderButtonGroups.indexOf(a.name) > options.reorderButtonGroups.indexOf(b.name)) return 1\n                            return 0\n                        })\n                }\n\n                // Build the buttons\n                if (allBtnGroups.length > 0) {\n                    editorHeader = this.__buildButtons([allBtnGroups], editorHeader)\n                }\n\n                if (options.fullscreen.enable) {\n                    editorHeader.append('<div class=\"md-controls\"><a class=\"md-control md-control-fullscreen\" href=\"#\"><span class=\"' + this.__getIcon(options.fullscreen.icons.fullscreenOn) + '\"></span></a></div>').on('click', '.md-control-fullscreen', function (e) {\n                        e.preventDefault();\n                        instance.setFullscreen(true)\n                    })\n                }\n\n                editor.append(editorHeader)\n\n                // Wrap the textarea\n                if (container.is('textarea')) {\n                    container.before(editor)\n                    textarea = container\n                    textarea.addClass('md-input')\n                    editor.append(textarea)\n                } else {\n                    var rawContent = (typeof toMarkdown == 'function') ? toMarkdown(container.html()) : container.html(),\n                        currentContent = $.trim(rawContent)\n\n                    // This is some arbitrary content that could be edited\n                    textarea = $('<textarea/>', {\n                        'class': 'md-input',\n                        'val': currentContent\n                    })\n\n                    editor.append(textarea)\n\n                    // Save the editable\n                    editable.el = container\n                    editable.type = container.prop('tagName').toLowerCase()\n                    editable.content = container.html()\n\n                    $(container[0].attributes).each(function () {\n                        editable.attrKeys.push(this.nodeName)\n                        editable.attrValues.push(this.nodeValue)\n                    })\n\n                    // Set editor to blocked the original container\n                    container.replaceWith(editor)\n                }\n\n                var editorFooter = $('<div/>', {\n                        'class': 'md-footer'\n                    }),\n                    createFooter = false,\n                    footer = ''\n                    // Create the footer if savable\n                if (options.savable) {\n                    createFooter = true;\n                    var saveHandler = 'cmdSave'\n\n                    // Register handler and callback\n                    handler.push(saveHandler)\n                    callback.push(options.onSave)\n\n                    editorFooter.append('<button class=\"btn btn-success\" data-provider=\"' + ns + '\" data-handler=\"' + saveHandler + '\"><i class=\"icon icon-white icon-ok\"></i> ' + this.__localize('Save') + '</button>')\n\n\n                }\n\n                footer = typeof options.footer === 'function' ? options.footer(this) : options.footer\n\n                if ($.trim(footer) !== '') {\n                    createFooter = true;\n                    editorFooter.append(footer);\n                }\n\n                if (createFooter) editor.append(editorFooter)\n\n                // Set width\n                if (options.width && options.width !== 'inherit') {\n                    if (jQuery.isNumeric(options.width)) {\n                        editor.css('display', 'table')\n                        textarea.css('width', options.width + 'px')\n                    } else {\n                        editor.addClass(options.width)\n                    }\n                }\n\n                // Set height\n                if (options.height && options.height !== 'inherit') {\n                    if (jQuery.isNumeric(options.height)) {\n                        var height = options.height\n                        if (editorHeader) height = Math.max(0, height - editorHeader.outerHeight())\n                        if (editorFooter) height = Math.max(0, height - editorFooter.outerHeight())\n                        textarea.css('height', height + 'px')\n                    } else {\n                        editor.addClass(options.height)\n                    }\n                }\n\n                // Reference\n                this.$editor = editor\n                this.$textarea = textarea\n                this.$editable = editable\n                this.$oldContent = this.getContent()\n\n                this.__setListener()\n\n                // Set editor attributes, data short-hand API and listener\n                this.$editor.attr('id', (new Date).getTime())\n                this.$editor.on('click', '[data-provider=\"bootstrap-markdown\"]', $.proxy(this.__handle, this))\n\n                if (this.$element.is(':disabled') || this.$element.is('[readonly]')) {\n                    this.$editor.addClass('md-editor-disabled');\n                    this.disableButtons('all');\n                }\n\n                if (this.eventSupported('keydown') && typeof jQuery.hotkeys === 'object') {\n                    editorHeader.find('[data-provider=\"bootstrap-markdown\"]').each(function () {\n                        var $button = $(this),\n                            hotkey = $button.attr('data-hotkey')\n                        if (hotkey.toLowerCase() !== '') {\n                            textarea.bind('keydown', hotkey, function () {\n                                $button.trigger('click')\n                                return false;\n                            })\n                        }\n                    })\n                }\n\n                if (options.initialstate === 'preview') {\n                    this.showPreview();\n                } else if (options.initialstate === 'fullscreen' && options.fullscreen.enable) {\n                    this.setFullscreen(true)\n                }\n\n            } else {\n                this.$editor.show()\n            }\n\n            if (options.autofocus) {\n                this.$textarea.focus()\n                this.$editor.addClass('active')\n            }\n\n            if (options.fullscreen.enable && options.fullscreen !== false) {\n                this.$editor.append('\\\n          <div class=\"md-fullscreen-controls\">\\\n            <a href=\"#\" class=\"exit-fullscreen\" title=\"Exit fullscreen\"><span class=\"' + this.__getIcon(options.fullscreen.icons.fullscreenOff) + '\"></span></a>\\\n          </div>')\n\n                this.$editor.on('click', '.exit-fullscreen', function (e) {\n                    e.preventDefault()\n                    instance.setFullscreen(false)\n                })\n            }\n\n            // hide hidden buttons from options\n            this.hideButtons(options.hiddenButtons)\n\n            // disable disabled buttons from options\n            this.disableButtons(options.disabledButtons)\n\n            // Trigger the onShow hook\n            options.onShow(this)\n\n            return this\n        }\n\n        ,\n        parseContent: function () {\n            var content,\n                callbackContent = this.$options.onPreview(this) // Try to get the content from callback\n\n            if (typeof callbackContent == 'string') {\n                // Set the content based by callback content\n                content = callbackContent\n            } else {\n                // Set the content\n                var val = this.$textarea.val();\n                if (typeof markdown == 'object') {\n                    content = markdown.toHTML(val);\n                } else if (typeof marked == 'function') {\n                    content = marked(val);\n                } else {\n                    content = val;\n                }\n            }\n\n            return content;\n        }\n\n        ,\n        showPreview: function () {\n            var options = this.$options,\n                container = this.$textarea,\n                afterContainer = container.next(),\n                replacementContainer = $('<div/>', {\n                    'class': 'md-preview',\n                    'data-provider': 'markdown-preview'\n                }),\n                content\n\n            // Give flag that tell the editor enter preview mode\n            this.$isPreview = true\n            // Disable all buttons\n            this.disableButtons('all').enableButtons('cmdPreview')\n\n            content = this.parseContent()\n\n            // Build preview element\n            replacementContainer.html(content)\n\n            if (afterContainer && afterContainer.attr('class') == 'md-footer') {\n                // If there is footer element, insert the preview container before it\n                replacementContainer.insertBefore(afterContainer)\n            } else {\n                // Otherwise, just append it after textarea\n                container.parent().append(replacementContainer)\n            }\n\n            // Set the preview element dimensions\n            replacementContainer.css({\n                width: container.outerWidth() + 'px',\n                height: container.outerHeight() + 'px'\n            })\n\n            if (this.$options.resize) {\n                replacementContainer.css('resize', this.$options.resize)\n            }\n\n            // Hide the last-active textarea\n            container.hide()\n\n            // Attach the editor instances\n            replacementContainer.data('markdown', this)\n\n            if (this.$element.is(':disabled') || this.$element.is('[readonly]')) {\n                this.$editor.addClass('md-editor-disabled');\n                this.disableButtons('all');\n            }\n\n            return this\n        }\n\n        ,\n        hidePreview: function () {\n            // Give flag that tell the editor quit preview mode\n            this.$isPreview = false\n\n            // Obtain the preview container\n            var container = this.$editor.find('div[data-provider=\"markdown-preview\"]')\n\n            // Remove the preview container\n            container.remove()\n\n            // Enable all buttons\n            this.enableButtons('all')\n            // Disable configured disabled buttons\n            this.disableButtons(this.$options.disabledButtons)\n\n            // Back to the editor\n            this.$textarea.show()\n            this.__setListener()\n\n            return this\n        }\n\n        ,\n        isDirty: function () {\n            return this.$oldContent != this.getContent()\n        }\n\n        ,\n        getContent: function () {\n            return this.$textarea.val()\n        }\n\n        ,\n        setContent: function (content) {\n            this.$textarea.val(content)\n\n            return this\n        }\n\n        ,\n        findSelection: function (chunk) {\n            var content = this.getContent(),\n                startChunkPosition\n\n            if (startChunkPosition = content.indexOf(chunk), startChunkPosition >= 0 && chunk.length > 0) {\n                var oldSelection = this.getSelection(),\n                    selection\n\n                this.setSelection(startChunkPosition, startChunkPosition + chunk.length)\n                selection = this.getSelection()\n\n                this.setSelection(oldSelection.start, oldSelection.end)\n\n                return selection\n            } else {\n                return null\n            }\n        }\n\n        ,\n        getSelection: function () {\n\n            var e = this.$textarea[0]\n\n            return (\n\n                ('selectionStart' in e && function () {\n                    var l = e.selectionEnd - e.selectionStart\n                    return {\n                        start: e.selectionStart,\n                        end: e.selectionEnd,\n                        length: l,\n                        text: e.value.substr(e.selectionStart, l)\n                    }\n                }) ||\n\n                /* browser not supported */\n                function () {\n                    return null\n                }\n\n            )()\n\n        }\n\n        ,\n        setSelection: function (start, end) {\n\n            var e = this.$textarea[0]\n\n            return (\n\n                ('selectionStart' in e && function () {\n                    e.selectionStart = start\n                    e.selectionEnd = end\n                    return\n                }) ||\n\n                /* browser not supported */\n                function () {\n                    return null\n                }\n\n            )()\n\n        }\n\n        ,\n        replaceSelection: function (text) {\n\n            var e = this.$textarea[0]\n\n            return (\n\n                ('selectionStart' in e && function () {\n                    e.value = e.value.substr(0, e.selectionStart) + text + e.value.substr(e.selectionEnd, e.value.length)\n                    // Set cursor to the last replacement end\n                    e.selectionStart = e.value.length\n                    return this\n                }) ||\n\n                /* browser not supported */\n                function () {\n                    e.value += text\n                    return jQuery(e)\n                }\n\n            )()\n\n        }\n\n        ,\n        getNextTab: function () {\n            // Shift the nextTab\n            if (this.$nextTab.length == 0) {\n                return null\n            } else {\n                var nextTab, tab = this.$nextTab.shift()\n\n                if (typeof tab == 'function') {\n                    nextTab = tab()\n                } else if (typeof tab == 'object' && tab.length > 0) {\n                    nextTab = tab\n                }\n\n                return nextTab\n            }\n        }\n\n        ,\n        setNextTab: function (start, end) {\n            // Push new selection into nextTab collections\n            if (typeof start == 'string') {\n                var that = this\n                this.$nextTab.push(function () {\n                    return that.findSelection(start)\n                })\n            } else if (typeof start == 'number' && typeof end == 'number') {\n                var oldSelection = this.getSelection()\n\n                this.setSelection(start, end)\n                this.$nextTab.push(this.getSelection())\n\n                this.setSelection(oldSelection.start, oldSelection.end)\n            }\n\n            return\n        }\n\n        ,\n        __parseButtonNameParam: function (nameParam) {\n            var buttons = []\n\n            if (typeof nameParam == 'string') {\n                buttons.push(nameParam)\n            } else {\n                buttons = nameParam\n            }\n\n            return buttons\n        }\n\n        ,\n        enableButtons: function (name) {\n            var buttons = this.__parseButtonNameParam(name),\n                that = this\n\n            $.each(buttons, function (i, v) {\n                that.__alterButtons(buttons[i], function (el) {\n                    el.removeAttr('disabled')\n                });\n            })\n\n            return this;\n        }\n\n        ,\n        disableButtons: function (name) {\n            var buttons = this.__parseButtonNameParam(name),\n                that = this\n\n            $.each(buttons, function (i, v) {\n                that.__alterButtons(buttons[i], function (el) {\n                    el.attr('disabled', 'disabled')\n                });\n            })\n\n            return this;\n        }\n\n        ,\n        hideButtons: function (name) {\n            var buttons = this.__parseButtonNameParam(name),\n                that = this\n\n            $.each(buttons, function (i, v) {\n                that.__alterButtons(buttons[i], function (el) {\n                    el.addClass('hidden');\n                });\n            })\n\n            return this;\n\n        }\n\n        ,\n        showButtons: function (name) {\n            var buttons = this.__parseButtonNameParam(name),\n                that = this\n\n            $.each(buttons, function (i, v) {\n                that.__alterButtons(buttons[i], function (el) {\n                    el.removeClass('hidden');\n                });\n            })\n\n            return this;\n\n        }\n\n        ,\n        eventSupported: function (eventName) {\n            var isSupported = eventName in this.$element\n            if (!isSupported) {\n                this.$element.setAttribute(eventName, 'return;')\n                isSupported = typeof this.$element[eventName] === 'function'\n            }\n            return isSupported\n        }\n\n        ,\n        keyup: function (e) {\n            var blocked = false\n            switch (e.keyCode) {\n            case 40: // down arrow\n            case 38: // up arrow\n            case 16: // shift\n            case 17: // ctrl\n            case 18: // alt\n                break\n\n            case 9: // tab\n                var nextTab\n                if (nextTab = this.getNextTab(), nextTab != null) {\n                    // Get the nextTab if exists\n                    var that = this\n                    setTimeout(function () {\n                        that.setSelection(nextTab.start, nextTab.end)\n                    }, 500)\n\n                    blocked = true\n                } else {\n                    // The next tab memory contains nothing...\n                    // check the cursor position to determine tab action\n                    var cursor = this.getSelection()\n\n                    if (cursor.start == cursor.end && cursor.end == this.getContent().length) {\n                        // The cursor already reach the end of the content\n                        blocked = false\n\n                    } else {\n                        // Put the cursor to the end\n                        this.setSelection(this.getContent().length, this.getContent().length)\n\n                        blocked = true\n                    }\n                }\n\n                break\n\n            case 13: // enter\n                blocked = false\n                break\n            case 27: // escape\n                if (this.$isFullscreen) this.setFullscreen(false)\n                blocked = false\n                break\n\n            default:\n                blocked = false\n            }\n\n            if (blocked) {\n                e.stopPropagation()\n                e.preventDefault()\n            }\n\n            this.$options.onChange(this)\n        }\n\n        ,\n        change: function (e) {\n            this.$options.onChange(this);\n            return this;\n        }\n\n        ,\n        focus: function (e) {\n            var options = this.$options,\n                isHideable = options.hideable,\n                editor = this.$editor\n\n            editor.addClass('active')\n\n            // Blur other markdown(s)\n            $(document).find('.md-editor').each(function () {\n                if ($(this).attr('id') != editor.attr('id')) {\n                    var attachedMarkdown\n\n                    if (attachedMarkdown = $(this).find('textarea').data('markdown'),\n                        attachedMarkdown == null) {\n                        attachedMarkdown = $(this).find('div[data-provider=\"markdown-preview\"]').data('markdown')\n                    }\n\n                    if (attachedMarkdown) {\n                        attachedMarkdown.blur()\n                    }\n                }\n            })\n\n            // Trigger the onFocus hook\n            options.onFocus(this);\n\n            return this\n        }\n\n        ,\n        blur: function (e) {\n            var options = this.$options,\n                isHideable = options.hideable,\n                editor = this.$editor,\n                editable = this.$editable\n\n            if (editor.hasClass('active') || this.$element.parent().length == 0) {\n                editor.removeClass('active')\n\n                if (isHideable) {\n\n                    // Check for editable elements\n                    if (editable.el != null) {\n                        // Build the original element\n                        var oldElement = $('<' + editable.type + '/>'),\n                            content = this.getContent(),\n                            currentContent = (typeof markdown == 'object') ? markdown.toHTML(content) : content\n\n                        $(editable.attrKeys).each(function (k, v) {\n                            oldElement.attr(editable.attrKeys[k], editable.attrValues[k])\n                        })\n\n                        // Get the editor content\n                        oldElement.html(currentContent)\n\n                        editor.replaceWith(oldElement)\n                    } else {\n                        editor.hide()\n\n                    }\n                }\n\n                // Trigger the onBlur hook\n                options.onBlur(this)\n            }\n\n            return this\n        }\n\n    }\n\n    /* MARKDOWN PLUGIN DEFINITION\n     * ========================== */\n\n    var old = $.fn.markdown\n\n    $.fn.markdown = function (option) {\n        return this.each(function () {\n            var $this = $(this),\n                data = $this.data('markdown'),\n                options = typeof option == 'object' && option\n            if (!data) $this.data('markdown', (data = new Markdown(this, options)))\n        })\n    }\n\n    $.fn.markdown.messages = {}\n\n    $.fn.markdown.defaults = {\n        /* Editor Properties */\n        autofocus: false,\n        hideable: false,\n        savable: false,\n        width: 'inherit',\n        height: 'inherit',\n        resize: 'none',\n        iconlibrary: 'glyph',\n        language: 'zh',\n        initialstate: 'editor',\n\n        /* Buttons Properties */\n        buttons: [\n      [{\n                name: 'groupFont',\n                data: [{\n                    name: 'cmdBold',\n                    hotkey: 'Ctrl+B',\n                    title: 'Bold',\n                    icon: {\n                        glyph: 'glyphicon glyphicon-bold',\n                        fa: 'fa fa-bold',\n                        'fa-3': 'icon-bold'\n                    },\n                    callback: function (e) {\n                        // Give/remove ** surround the selection\n                        var chunk, cursor, selected = e.getSelection(),\n                            content = e.getContent()\n\n                        if (selected.length == 0) {\n                            // Give extra word\n                            chunk = e.__localize('strong text')\n                        } else {\n                            chunk = selected.text\n                        }\n\n                        // transform selection and set the cursor into chunked text\n                        if (content.substr(selected.start - 2, 2) == '**' && content.substr(selected.end, 2) == '**') {\n                            e.setSelection(selected.start - 2, selected.end + 2)\n                            e.replaceSelection(chunk)\n                            cursor = selected.start - 2\n                        } else {\n                            e.replaceSelection('**' + chunk + '**')\n                            cursor = selected.start + 2\n                        }\n\n                        // Set the cursor\n                        e.setSelection(cursor, cursor + chunk.length)\n                    }\n        }, {\n                    name: 'cmdItalic',\n                    title: 'Italic',\n                    hotkey: 'Ctrl+I',\n                    icon: {\n                        glyph: 'glyphicon glyphicon-italic',\n                        fa: 'fa fa-italic',\n                        'fa-3': 'icon-italic'\n                    },\n                    callback: function (e) {\n                        // Give/remove * surround the selection\n                        var chunk, cursor, selected = e.getSelection(),\n                            content = e.getContent()\n\n                        if (selected.length == 0) {\n                            // Give extra word\n                            chunk = e.__localize('emphasized text')\n                        } else {\n                            chunk = selected.text\n                        }\n\n                        // transform selection and set the cursor into chunked text\n                        if (content.substr(selected.start - 1, 1) == '_' && content.substr(selected.end, 1) == '_') {\n                            e.setSelection(selected.start - 1, selected.end + 1)\n                            e.replaceSelection(chunk)\n                            cursor = selected.start - 1\n                        } else {\n                            e.replaceSelection('_' + chunk + '_')\n                            cursor = selected.start + 1\n                        }\n\n                        // Set the cursor\n                        e.setSelection(cursor, cursor + chunk.length)\n                    }\n        }, {\n                    name: 'cmdHeading',\n                    title: 'Heading',\n                    hotkey: 'Ctrl+H',\n                    icon: {\n                        glyph: 'glyphicon glyphicon-header',\n                        fa: 'fa fa-header',\n                        'fa-3': 'icon-font'\n                    },\n                    callback: function (e) {\n                        // Append/remove ### surround the selection\n                        var chunk, cursor, selected = e.getSelection(),\n                            content = e.getContent(),\n                            pointer, prevChar\n\n                        if (selected.length == 0) {\n                            // Give extra word\n                            chunk = e.__localize('heading text')\n                        } else {\n                            chunk = selected.text + '\\n';\n                        }\n\n                        // transform selection and set the cursor into chunked text\n                        if ((pointer = 4, content.substr(selected.start - pointer, pointer) == '### ') || (pointer = 3, content.substr(selected.start - pointer, pointer) == '###')) {\n                            e.setSelection(selected.start - pointer, selected.end)\n                            e.replaceSelection(chunk)\n                            cursor = selected.start - pointer\n                        } else if (selected.start > 0 && (prevChar = content.substr(selected.start - 1, 1), !!prevChar && prevChar != '\\n')) {\n                            e.replaceSelection('\\n\\n### ' + chunk)\n                            cursor = selected.start + 6\n                        } else {\n                            // Empty string before element\n                            e.replaceSelection('### ' + chunk)\n                            cursor = selected.start + 4\n                        }\n\n                        // Set the cursor\n                        e.setSelection(cursor, cursor + chunk.length)\n                    }\n        }]\n      }, {\n                name: 'groupLink',\n                data: [{\n                    name: 'cmdUrl',\n                    title: 'URL/Link',\n                    hotkey: 'Ctrl+L',\n                    icon: {\n                        glyph: 'glyphicon glyphicon-link',\n                        fa: 'fa fa-link',\n                        'fa-3': 'icon-link'\n                    },\n                    callback: function (e) {\n                        // Give [] surround the selection and prepend the link\n                        var chunk, cursor, selected = e.getSelection(),\n                            content = e.getContent(),\n                            link\n\n                        if (selected.length == 0) {\n                            // Give extra word\n                            chunk = e.__localize('enter link description here')\n                        } else {\n                            chunk = selected.text\n                        }\n\n                        link = prompt(e.__localize('Insert Hyperlink'), 'http://')\n\n                        if (link != null && link != '' && link != 'http://' && link.substr(0, 4) == 'http') {\n                            var sanitizedLink = $('<div>' + link + '</div>').text()\n\n                            // transform selection and set the cursor into chunked text\n                            e.replaceSelection('[' + chunk + '](' + sanitizedLink + ')')\n                            cursor = selected.start + 1\n\n                            // Set the cursor\n                            e.setSelection(cursor, cursor + chunk.length)\n                        }\n                    }\n        }, {\n                    name: 'cmdImage',\n                    title: 'Image',\n                    hotkey: 'Ctrl+G',\n                    icon: {\n                        glyph: 'glyphicon glyphicon-picture',\n                        fa: 'fa fa-picture-o',\n                        'fa-3': 'icon-picture'\n                    },\n                    callback: function (e) {\n                        // Give ![] surround the selection and prepend the image link\n                        var chunk, cursor, selected = e.getSelection(),\n                            content = e.getContent(),\n                            link\n\n                        if (selected.length == 0) {\n                            // Give extra word\n                            chunk = e.__localize('enter image description here')\n                        } else {\n                            chunk = selected.text\n                        }\n\n                        link = prompt(e.__localize('Insert Image Hyperlink'), 'http://')\n\n                        if (link != null && link != '' && link != 'http://' && link.substr(0, 4) == 'http') {\n                            var sanitizedLink = $('<div>' + link + '</div>').text()\n\n                            // transform selection and set the cursor into chunked text\n                            e.replaceSelection('![' + chunk + '](' + sanitizedLink + ' \"' + e.__localize('enter image title here') + '\")')\n                            cursor = selected.start + 2\n\n                            // Set the next tab\n                            e.setNextTab(e.__localize('enter image title here'))\n\n                            // Set the cursor\n                            e.setSelection(cursor, cursor + chunk.length)\n                        }\n                    }\n        }]\n      }, {\n                name: 'groupMisc',\n                data: [{\n                        name: 'cmdList',\n                        hotkey: 'Ctrl+U',\n                        title: 'Unordered List',\n                        icon: {\n                            glyph: 'glyphicon glyphicon-list',\n                            fa: 'fa fa-list',\n                            'fa-3': 'icon-list-ul'\n                        },\n                        callback: function (e) {\n                            // Prepend/Give - surround the selection\n                            var chunk, cursor, selected = e.getSelection(),\n                                content = e.getContent()\n\n                            // transform selection and set the cursor into chunked text\n                            if (selected.length == 0) {\n                                // Give extra word\n                                chunk = e.__localize('list text here')\n\n                                e.replaceSelection('- ' + chunk)\n                                // Set the cursor\n                                cursor = selected.start + 2\n\n                            } else {\n                                if (selected.text.indexOf('\\n') < 0) {\n                                    chunk = selected.text\n\n                                    e.replaceSelection('- ' + chunk)\n\n                                    // Set the cursor\n                                    cursor = selected.start + 2\n                                } else {\n                                    var list = []\n\n                                    list = selected.text.split('\\n')\n                                    chunk = list[0]\n\n                                    $.each(list, function (k, v) {\n                                        list[k] = '- ' + v\n                                    })\n\n                                    e.replaceSelection('\\n\\n' + list.join('\\n'))\n\n                                    // Set the cursor\n                                    cursor = selected.start + 4\n                                }\n                            }\n\n                            // Set the cursor\n                            e.setSelection(cursor, cursor + chunk.length)\n                        }\n        },\n                    {\n                        name: 'cmdListO',\n                        hotkey: 'Ctrl+O',\n                        title: 'Ordered List',\n                        icon: {\n                            glyph: 'glyphicon glyphicon-th-list',\n                            fa: 'fa fa-list-ol',\n                            'fa-3': 'icon-list-ol'\n                        },\n                        callback: function (e) {\n\n                            // Prepend/Give - surround the selection\n                            var chunk, cursor, selected = e.getSelection(),\n                                content = e.getContent()\n\n                            // transform selection and set the cursor into chunked text\n                            if (selected.length == 0) {\n                                // Give extra word\n                                chunk = e.__localize('list text here')\n                                e.replaceSelection('1. ' + chunk)\n                                // Set the cursor\n                                cursor = selected.start + 3\n\n                            } else {\n                                if (selected.text.indexOf('\\n') < 0) {\n                                    chunk = selected.text\n\n                                    e.replaceSelection('1. ' + chunk)\n\n                                    // Set the cursor\n                                    cursor = selected.start + 3\n                                } else {\n                                    var list = []\n\n                                    list = selected.text.split('\\n')\n                                    chunk = list[0]\n\n                                    $.each(list, function (k, v) {\n                                        list[k] = '1. ' + v\n                                    })\n\n                                    e.replaceSelection('\\n\\n' + list.join('\\n'))\n\n                                    // Set the cursor\n                                    cursor = selected.start + 5\n                                }\n                            }\n\n                            // Set the cursor\n                            e.setSelection(cursor, cursor + chunk.length)\n                        }\n        },\n                    {\n                        name: 'cmdCode',\n                        hotkey: 'Ctrl+K',\n                        title: 'Code',\n                        icon: {\n                            glyph: 'glyphicon glyphicon-asterisk',\n                            fa: 'fa fa-code',\n                            'fa-3': 'icon-code'\n                        },\n                        callback: function (e) {\n\n                            // Give/remove ** surround the selection\n                            var chunk, cursor, selected = e.getSelection(),\n                                content = e.getContent()\n\n                            if (selected.length == 0) {\n                                // Give extra word\n                                chunk = e.__localize('code text here')\n                            } else {\n                                chunk = selected.text\n                            }\n\n                            // transform selection and set the cursor into chunked text\n                            if (content.substr(selected.start - 1, 1) == '`' && content.substr(selected.end, 1) == '`') {\n                                e.setSelection(selected.start - 1, selected.end + 1)\n                                e.replaceSelection(chunk)\n                                cursor = selected.start - 1\n                            } else {\n                                e.replaceSelection('`' + chunk + '`')\n                                cursor = selected.start + 1\n                            }\n\n                            // Set the cursor\n                            e.setSelection(cursor, cursor + chunk.length)\n                        }\n        },\n                    {\n                        name: 'cmdQuote',\n                        hotkey: 'Ctrl+Q',\n                        title: 'Quote',\n                        icon: {\n                            glyph: 'glyphicon glyphicon-comment',\n                            fa: 'fa fa-quote-left',\n                            'fa-3': 'icon-quote-left'\n                        },\n                        callback: function (e) {\n                            // Prepend/Give - surround the selection\n                            var chunk, cursor, selected = e.getSelection(),\n                                content = e.getContent()\n\n                            // transform selection and set the cursor into chunked text\n                            if (selected.length == 0) {\n                                // Give extra word\n                                chunk = e.__localize('quote here')\n                                e.replaceSelection('> ' + chunk)\n                                // Set the cursor\n                                cursor = selected.start + 2\n\n                            } else {\n                                if (selected.text.indexOf('\\n') < 0) {\n                                    chunk = selected.text\n\n                                    e.replaceSelection('> ' + chunk)\n\n                                    // Set the cursor\n                                    cursor = selected.start + 2\n                                } else {\n                                    var list = []\n\n                                    list = selected.text.split('\\n')\n                                    chunk = list[0]\n\n                                    $.each(list, function (k, v) {\n                                        list[k] = '> ' + v\n                                    })\n\n                                    e.replaceSelection('\\n\\n' + list.join('\\n'))\n\n                                    // Set the cursor\n                                    cursor = selected.start + 4\n                                }\n                            }\n\n                            // Set the cursor\n                            e.setSelection(cursor, cursor + chunk.length)\n                        }\n        }]\n      }, {\n                name: 'groupUtil',\n                data: [{\n                    name: 'cmdPreview',\n                    toggle: true,\n                    hotkey: 'Ctrl+P',\n                    title: 'Preview',\n                    btnText: 'Preview',\n                    btnClass: 'btn btn-sm',\n                    icon: {\n                        glyph: 'glyphicon glyphicon-search',\n                        fa: 'fa fa-search',\n                        'fa-3': 'icon-search'\n                    },\n                    callback: function (e) {\n                        // Check the preview mode and toggle based on this flag\n                        var isPreview = e.$isPreview,\n                            content\n\n                        if (isPreview == false) {\n                            // Give flag that tell the editor enter preview mode\n                            e.showPreview()\n                        } else {\n                            e.hidePreview()\n                        }\n                    }\n        }]\n      }]\n    ],\n        additionalButtons: [], // Place to hook more buttons by code\n        reorderButtonGroups: [],\n        hiddenButtons: [], // Default hidden buttons\n        disabledButtons: [], // Default disabled buttons\n        footer: '',\n        fullscreen: {\n            enable: true,\n            icons: {\n                fullscreenOn: {\n                    fa: 'fa fa-expand',\n                    glyph: 'glyphicon glyphicon-fullscreen',\n                    'fa-3': 'icon-resize-full'\n                },\n                fullscreenOff: {\n                    fa: 'fa fa-compress',\n                    glyph: 'glyphicon glyphicon-fullscreen',\n                    'fa-3': 'icon-resize-small'\n                }\n            }\n        },\n\n        /* Events hook */\n        onShow: function (e) {},\n        onPreview: function (e) {},\n        onSave: function (e) {},\n        onBlur: function (e) {},\n        onFocus: function (e) {},\n        onChange: function (e) {},\n        onFullscreen: function (e) {}\n    }\n\n    $.fn.markdown.Constructor = Markdown\n\n\n    /* MARKDOWN NO CONFLICT\n     * ==================== */\n\n    $.fn.markdown.noConflict = function () {\n        $.fn.markdown = old\n        return this\n    }\n\n    /* MARKDOWN GLOBAL FUNCTION & DATA-API\n     * ==================================== */\n    var initMarkdown = function (el) {\n        var $this = el\n\n        if ($this.data('markdown')) {\n            $this.data('markdown').showEditor()\n            return\n        }\n\n        $this.markdown()\n    }\n\n    var blurNonFocused = function (e) {\n        var $activeElement = $(document.activeElement)\n\n        // Blur event\n        $(document).find('.md-editor').each(function () {\n            var $this = $(this),\n                focused = $activeElement.closest('.md-editor')[0] === this,\n                attachedMarkdown = $this.find('textarea').data('markdown') ||\n                $this.find('div[data-provider=\"markdown-preview\"]').data('markdown')\n\n            if (attachedMarkdown && !focused) {\n                attachedMarkdown.blur()\n            }\n        })\n    }\n\n    $(document)\n        .on('click.markdown.data-api', '[data-provide=\"markdown-editable\"]', function (e) {\n            initMarkdown($(this))\n            e.preventDefault()\n        })\n        .on('click focusin', function (e) {\n            blurNonFocused(e)\n        })\n        .ready(function () {\n            $('textarea[data-provide=\"markdown\"]').each(function () {\n                initMarkdown($(this))\n            })\n        })\n\n}(window.jQuery);\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/markdown/bootstrap-markdown.zh.js",
    "content": "/**\n * Chinese translation for bootstrap-markdown\n * benhaile <denghaier@163.com>\n */\n(function ($) {\n  $.fn.markdown.messages.zh = {\n    'Bold': \"粗体\",\n    'Italic': \"斜体\",\n    'Heading': \"标题\",\n    'URL/Link': \"链接\",\n    'Image': \"图片\",\n    'List': \"列表\",\n    'Unordered List': \"无序列表\",\n    'Ordered List': \"有序列表\",\n    'Code': \"代码\",\n    'Quote': \"引用\",\n    'Preview': \"预览\",\n    'strong text': \"粗体\",\n    'emphasized text': \"强调\",\n    'heading text': \"标题\",\n    'enter link description here': \"输入链接说明\",\n    'Insert Hyperlink': \"URL地址\",\n    'enter image description here': \"输入图片说明\",\n    'Insert Image Hyperlink': \"图片URL地址\",\n    'enter image title here': \"在这里输入图片标题\",\n    'list text here': \"这里是列表文本\",\n    'code text here': \"这里输入代码\",\n    'quote here': \"这里输入引用文本\"\n\n\n  };\n}(jQuery));\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/markdown/markdown.js",
    "content": "// Released under MIT license\n// Copyright (c) 2009-2010 Dominic Baggott\n// Copyright (c) 2009-2010 Ash Berlin\n// Copyright (c) 2011 Christoph Dorn <christoph@christophdorn.com> (http://www.christophdorn.com)\n\n(function( expose ) {\n\n/**\n *  class Markdown\n *\n *  Markdown processing in Javascript done right. We have very particular views\n *  on what constitutes 'right' which include:\n *\n *  - produces well-formed HTML (this means that em and strong nesting is\n *    important)\n *\n *  - has an intermediate representation to allow processing of parsed data (We\n *    in fact have two, both as [JsonML]: a markdown tree and an HTML tree).\n *\n *  - is easily extensible to add new dialects without having to rewrite the\n *    entire parsing mechanics\n *\n *  - has a good test suite\n *\n *  This implementation fulfills all of these (except that the test suite could\n *  do with expanding to automatically run all the fixtures from other Markdown\n *  implementations.)\n *\n *  ##### Intermediate Representation\n *\n *  *TODO* Talk about this :) Its JsonML, but document the node names we use.\n *\n *  [JsonML]: http://jsonml.org/ \"JSON Markup Language\"\n **/\nvar Markdown = expose.Markdown = function Markdown(dialect) {\n  switch (typeof dialect) {\n    case \"undefined\":\n      this.dialect = Markdown.dialects.Gruber;\n      break;\n    case \"object\":\n      this.dialect = dialect;\n      break;\n    default:\n      if (dialect in Markdown.dialects) {\n        this.dialect = Markdown.dialects[dialect];\n      }\n      else {\n        throw new Error(\"Unknown Markdown dialect '\" + String(dialect) + \"'\");\n      }\n      break;\n  }\n  this.em_state = [];\n  this.strong_state = [];\n  this.debug_indent = \"\";\n};\n\n/**\n *  parse( markdown, [dialect] ) -> JsonML\n *  - markdown (String): markdown string to parse\n *  - dialect (String | Dialect): the dialect to use, defaults to gruber\n *\n *  Parse `markdown` and return a markdown document as a Markdown.JsonML tree.\n **/\nexpose.parse = function( source, dialect ) {\n  // dialect will default if undefined\n  var md = new Markdown( dialect );\n  return md.toTree( source );\n};\n\n/**\n *  toHTML( markdown, [dialect]  ) -> String\n *  toHTML( md_tree ) -> String\n *  - markdown (String): markdown string to parse\n *  - md_tree (Markdown.JsonML): parsed markdown tree\n *\n *  Take markdown (either as a string or as a JsonML tree) and run it through\n *  [[toHTMLTree]] then turn it into a well-formated HTML fragment.\n **/\nexpose.toHTML = function toHTML( source , dialect , options ) {\n  var input = expose.toHTMLTree( source , dialect , options );\n\n  return expose.renderJsonML( input );\n};\n\n/**\n *  toHTMLTree( markdown, [dialect] ) -> JsonML\n *  toHTMLTree( md_tree ) -> JsonML\n *  - markdown (String): markdown string to parse\n *  - dialect (String | Dialect): the dialect to use, defaults to gruber\n *  - md_tree (Markdown.JsonML): parsed markdown tree\n *\n *  Turn markdown into HTML, represented as a JsonML tree. If a string is given\n *  to this function, it is first parsed into a markdown tree by calling\n *  [[parse]].\n **/\nexpose.toHTMLTree = function toHTMLTree( input, dialect , options ) {\n  // convert string input to an MD tree\n  if ( typeof input ===\"string\" ) input = this.parse( input, dialect );\n\n  // Now convert the MD tree to an HTML tree\n\n  // remove references from the tree\n  var attrs = extract_attr( input ),\n      refs = {};\n\n  if ( attrs && attrs.references ) {\n    refs = attrs.references;\n  }\n\n  var html = convert_tree_to_html( input, refs , options );\n  merge_text_nodes( html );\n  return html;\n};\n\n// For Spidermonkey based engines\nfunction mk_block_toSource() {\n  return \"Markdown.mk_block( \" +\n          uneval(this.toString()) +\n          \", \" +\n          uneval(this.trailing) +\n          \", \" +\n          uneval(this.lineNumber) +\n          \" )\";\n}\n\n// node\nfunction mk_block_inspect() {\n  var util = require('util');\n  return \"Markdown.mk_block( \" +\n          util.inspect(this.toString()) +\n          \", \" +\n          util.inspect(this.trailing) +\n          \", \" +\n          util.inspect(this.lineNumber) +\n          \" )\";\n\n}\n\nvar mk_block = Markdown.mk_block = function(block, trail, line) {\n  // Be helpful for default case in tests.\n  if ( arguments.length == 1 ) trail = \"\\n\\n\";\n\n  var s = new String(block);\n  s.trailing = trail;\n  // To make it clear its not just a string\n  s.inspect = mk_block_inspect;\n  s.toSource = mk_block_toSource;\n\n  if (line != undefined)\n    s.lineNumber = line;\n\n  return s;\n};\n\nfunction count_lines( str ) {\n  var n = 0, i = -1;\n  while ( ( i = str.indexOf('\\n', i+1) ) !== -1) n++;\n  return n;\n}\n\n// Internal - split source into rough blocks\nMarkdown.prototype.split_blocks = function splitBlocks( input, startLine ) {\n  // [\\s\\S] matches _anything_ (newline or space)\n  var re = /([\\s\\S]+?)($|\\n(?:\\s*\\n|$)+)/g,\n      blocks = [],\n      m;\n\n  var line_no = 1;\n\n  if ( ( m = /^(\\s*\\n)/.exec(input) ) != null ) {\n    // skip (but count) leading blank lines\n    line_no += count_lines( m[0] );\n    re.lastIndex = m[0].length;\n  }\n\n  while ( ( m = re.exec(input) ) !== null ) {\n    blocks.push( mk_block( m[1], m[2], line_no ) );\n    line_no += count_lines( m[0] );\n  }\n\n  return blocks;\n};\n\n/**\n *  Markdown#processBlock( block, next ) -> undefined | [ JsonML, ... ]\n *  - block (String): the block to process\n *  - next (Array): the following blocks\n *\n * Process `block` and return an array of JsonML nodes representing `block`.\n *\n * It does this by asking each block level function in the dialect to process\n * the block until one can. Succesful handling is indicated by returning an\n * array (with zero or more JsonML nodes), failure by a false value.\n *\n * Blocks handlers are responsible for calling [[Markdown#processInline]]\n * themselves as appropriate.\n *\n * If the blocks were split incorrectly or adjacent blocks need collapsing you\n * can adjust `next` in place using shift/splice etc.\n *\n * If any of this default behaviour is not right for the dialect, you can\n * define a `__call__` method on the dialect that will get invoked to handle\n * the block processing.\n */\nMarkdown.prototype.processBlock = function processBlock( block, next ) {\n  var cbs = this.dialect.block,\n      ord = cbs.__order__;\n\n  if ( \"__call__\" in cbs ) {\n    return cbs.__call__.call(this, block, next);\n  }\n\n  for ( var i = 0; i < ord.length; i++ ) {\n    //D:this.debug( \"Testing\", ord[i] );\n    var res = cbs[ ord[i] ].call( this, block, next );\n    if ( res ) {\n      //D:this.debug(\"  matched\");\n      if ( !isArray(res) || ( res.length > 0 && !( isArray(res[0]) ) ) )\n        this.debug(ord[i], \"didn't return a proper array\");\n      //D:this.debug( \"\" );\n      return res;\n    }\n  }\n\n  // Uhoh! no match! Should we throw an error?\n  return [];\n};\n\nMarkdown.prototype.processInline = function processInline( block ) {\n  return this.dialect.inline.__call__.call( this, String( block ) );\n};\n\n/**\n *  Markdown#toTree( source ) -> JsonML\n *  - source (String): markdown source to parse\n *\n *  Parse `source` into a JsonML tree representing the markdown document.\n **/\n// custom_tree means set this.tree to `custom_tree` and restore old value on return\nMarkdown.prototype.toTree = function toTree( source, custom_root ) {\n  var blocks = source instanceof Array ? source : this.split_blocks( source );\n\n  // Make tree a member variable so its easier to mess with in extensions\n  var old_tree = this.tree;\n  try {\n    this.tree = custom_root || this.tree || [ \"markdown\" ];\n\n    blocks:\n    while ( blocks.length ) {\n      var b = this.processBlock( blocks.shift(), blocks );\n\n      // Reference blocks and the like won't return any content\n      if ( !b.length ) continue blocks;\n\n      this.tree.push.apply( this.tree, b );\n    }\n    return this.tree;\n  }\n  finally {\n    if ( custom_root ) {\n      this.tree = old_tree;\n    }\n  }\n};\n\n// Noop by default\nMarkdown.prototype.debug = function () {\n  var args = Array.prototype.slice.call( arguments);\n  args.unshift(this.debug_indent);\n  if (typeof print !== \"undefined\")\n      print.apply( print, args );\n  if (typeof console !== \"undefined\" && typeof console.log !== \"undefined\")\n      console.log.apply( null, args );\n}\n\nMarkdown.prototype.loop_re_over_block = function( re, block, cb ) {\n  // Dont use /g regexps with this\n  var m,\n      b = block.valueOf();\n\n  while ( b.length && (m = re.exec(b) ) != null) {\n    b = b.substr( m[0].length );\n    cb.call(this, m);\n  }\n  return b;\n};\n\n/**\n * Markdown.dialects\n *\n * Namespace of built-in dialects.\n **/\nMarkdown.dialects = {};\n\n/**\n * Markdown.dialects.Gruber\n *\n * The default dialect that follows the rules set out by John Gruber's\n * markdown.pl as closely as possible. Well actually we follow the behaviour of\n * that script which in some places is not exactly what the syntax web page\n * says.\n **/\nMarkdown.dialects.Gruber = {\n  block: {\n    atxHeader: function atxHeader( block, next ) {\n      var m = block.match( /^(#{1,6})\\s*(.*?)\\s*#*\\s*(?:\\n|$)/ );\n\n      if ( !m ) return undefined;\n\n      var header = [ \"header\", { level: m[ 1 ].length } ];\n      Array.prototype.push.apply(header, this.processInline(m[ 2 ]));\n\n      if ( m[0].length < block.length )\n        next.unshift( mk_block( block.substr( m[0].length ), block.trailing, block.lineNumber + 2 ) );\n\n      return [ header ];\n    },\n\n    setextHeader: function setextHeader( block, next ) {\n      var m = block.match( /^(.*)\\n([-=])\\2\\2+(?:\\n|$)/ );\n\n      if ( !m ) return undefined;\n\n      var level = ( m[ 2 ] === \"=\" ) ? 1 : 2;\n      var header = [ \"header\", { level : level }, m[ 1 ] ];\n\n      if ( m[0].length < block.length )\n        next.unshift( mk_block( block.substr( m[0].length ), block.trailing, block.lineNumber + 2 ) );\n\n      return [ header ];\n    },\n\n    code: function code( block, next ) {\n      // |    Foo\n      // |bar\n      // should be a code block followed by a paragraph. Fun\n      //\n      // There might also be adjacent code block to merge.\n\n      var ret = [],\n          re = /^(?: {0,3}\\t| {4})(.*)\\n?/,\n          lines;\n\n      // 4 spaces + content\n      if ( !block.match( re ) ) return undefined;\n\n      block_search:\n      do {\n        // Now pull out the rest of the lines\n        var b = this.loop_re_over_block(\n                  re, block.valueOf(), function( m ) { ret.push( m[1] ); } );\n\n        if (b.length) {\n          // Case alluded to in first comment. push it back on as a new block\n          next.unshift( mk_block(b, block.trailing) );\n          break block_search;\n        }\n        else if (next.length) {\n          // Check the next block - it might be code too\n          if ( !next[0].match( re ) ) break block_search;\n\n          // Pull how how many blanks lines follow - minus two to account for .join\n          ret.push ( block.trailing.replace(/[^\\n]/g, '').substring(2) );\n\n          block = next.shift();\n        }\n        else {\n          break block_search;\n        }\n      } while (true);\n\n      return [ [ \"code_block\", ret.join(\"\\n\") ] ];\n    },\n\n    horizRule: function horizRule( block, next ) {\n      // this needs to find any hr in the block to handle abutting blocks\n      var m = block.match( /^(?:([\\s\\S]*?)\\n)?[ \\t]*([-_*])(?:[ \\t]*\\2){2,}[ \\t]*(?:\\n([\\s\\S]*))?$/ );\n\n      if ( !m ) {\n        return undefined;\n      }\n\n      var jsonml = [ [ \"hr\" ] ];\n\n      // if there's a leading abutting block, process it\n      if ( m[ 1 ] ) {\n        jsonml.unshift.apply( jsonml, this.processBlock( m[ 1 ], [] ) );\n      }\n\n      // if there's a trailing abutting block, stick it into next\n      if ( m[ 3 ] ) {\n        next.unshift( mk_block( m[ 3 ] ) );\n      }\n\n      return jsonml;\n    },\n\n    // There are two types of lists. Tight and loose. Tight lists have no whitespace\n    // between the items (and result in text just in the <li>) and loose lists,\n    // which have an empty line between list items, resulting in (one or more)\n    // paragraphs inside the <li>.\n    //\n    // There are all sorts weird edge cases about the original markdown.pl's\n    // handling of lists:\n    //\n    // * Nested lists are supposed to be indented by four chars per level. But\n    //   if they aren't, you can get a nested list by indenting by less than\n    //   four so long as the indent doesn't match an indent of an existing list\n    //   item in the 'nest stack'.\n    //\n    // * The type of the list (bullet or number) is controlled just by the\n    //    first item at the indent. Subsequent changes are ignored unless they\n    //    are for nested lists\n    //\n    lists: (function( ) {\n      // Use a closure to hide a few variables.\n      var any_list = \"[*+-]|\\\\d+\\\\.\",\n          bullet_list = /[*+-]/,\n          number_list = /\\d+\\./,\n          // Capture leading indent as it matters for determining nested lists.\n          is_list_re = new RegExp( \"^( {0,3})(\" + any_list + \")[ \\t]+\" ),\n          indent_re = \"(?: {0,3}\\\\t| {4})\";\n\n      // TODO: Cache this regexp for certain depths.\n      // Create a regexp suitable for matching an li for a given stack depth\n      function regex_for_depth( depth ) {\n\n        return new RegExp(\n          // m[1] = indent, m[2] = list_type\n          \"(?:^(\" + indent_re + \"{0,\" + depth + \"} {0,3})(\" + any_list + \")\\\\s+)|\" +\n          // m[3] = cont\n          \"(^\" + indent_re + \"{0,\" + (depth-1) + \"}[ ]{0,4})\"\n        );\n      }\n      function expand_tab( input ) {\n        return input.replace( / {0,3}\\t/g, \"    \" );\n      }\n\n      // Add inline content `inline` to `li`. inline comes from processInline\n      // so is an array of content\n      function add(li, loose, inline, nl) {\n        if (loose) {\n          li.push( [ \"para\" ].concat(inline) );\n          return;\n        }\n        // Hmmm, should this be any block level element or just paras?\n        var add_to = li[li.length -1] instanceof Array && li[li.length - 1][0] == \"para\"\n                   ? li[li.length -1]\n                   : li;\n\n        // If there is already some content in this list, add the new line in\n        if (nl && li.length > 1) inline.unshift(nl);\n\n        for (var i=0; i < inline.length; i++) {\n          var what = inline[i],\n              is_str = typeof what == \"string\";\n          if (is_str && add_to.length > 1 && typeof add_to[add_to.length-1] == \"string\" ) {\n            add_to[ add_to.length-1 ] += what;\n          }\n          else {\n            add_to.push( what );\n          }\n        }\n      }\n\n      // contained means have an indent greater than the current one. On\n      // *every* line in the block\n      function get_contained_blocks( depth, blocks ) {\n\n        var re = new RegExp( \"^(\" + indent_re + \"{\" + depth + \"}.*?\\\\n?)*$\" ),\n            replace = new RegExp(\"^\" + indent_re + \"{\" + depth + \"}\", \"gm\"),\n            ret = [];\n\n        while ( blocks.length > 0 ) {\n          if ( re.exec( blocks[0] ) ) {\n            var b = blocks.shift(),\n                // Now remove that indent\n                x = b.replace( replace, \"\");\n\n            ret.push( mk_block( x, b.trailing, b.lineNumber ) );\n          }\n          break;\n        }\n        return ret;\n      }\n\n      // passed to stack.forEach to turn list items up the stack into paras\n      function paragraphify(s, i, stack) {\n        var list = s.list;\n        var last_li = list[list.length-1];\n\n        if (last_li[1] instanceof Array && last_li[1][0] == \"para\") {\n          return;\n        }\n        if (i+1 == stack.length) {\n          // Last stack frame\n          // Keep the same array, but replace the contents\n          last_li.push( [\"para\"].concat( last_li.splice(1) ) );\n        }\n        else {\n          var sublist = last_li.pop();\n          last_li.push( [\"para\"].concat( last_li.splice(1) ), sublist );\n        }\n      }\n\n      // The matcher function\n      return function( block, next ) {\n        var m = block.match( is_list_re );\n        if ( !m ) return undefined;\n\n        function make_list( m ) {\n          var list = bullet_list.exec( m[2] )\n                   ? [\"bulletlist\"]\n                   : [\"numberlist\"];\n\n          stack.push( { list: list, indent: m[1] } );\n          return list;\n        }\n\n\n        var stack = [], // Stack of lists for nesting.\n            list = make_list( m ),\n            last_li,\n            loose = false,\n            ret = [ stack[0].list ],\n            i;\n\n        // Loop to search over block looking for inner block elements and loose lists\n        loose_search:\n        while( true ) {\n          // Split into lines preserving new lines at end of line\n          var lines = block.split( /(?=\\n)/ );\n\n          // We have to grab all lines for a li and call processInline on them\n          // once as there are some inline things that can span lines.\n          var li_accumulate = \"\";\n\n          // Loop over the lines in this block looking for tight lists.\n          tight_search:\n          for (var line_no=0; line_no < lines.length; line_no++) {\n            var nl = \"\",\n                l = lines[line_no].replace(/^\\n/, function(n) { nl = n; return \"\"; });\n\n            // TODO: really should cache this\n            var line_re = regex_for_depth( stack.length );\n\n            m = l.match( line_re );\n            //print( \"line:\", uneval(l), \"\\nline match:\", uneval(m) );\n\n            // We have a list item\n            if ( m[1] !== undefined ) {\n              // Process the previous list item, if any\n              if ( li_accumulate.length ) {\n                add( last_li, loose, this.processInline( li_accumulate ), nl );\n                // Loose mode will have been dealt with. Reset it\n                loose = false;\n                li_accumulate = \"\";\n              }\n\n              m[1] = expand_tab( m[1] );\n              var wanted_depth = Math.floor(m[1].length/4)+1;\n              //print( \"want:\", wanted_depth, \"stack:\", stack.length);\n              if ( wanted_depth > stack.length ) {\n                // Deep enough for a nested list outright\n                //print ( \"new nested list\" );\n                list = make_list( m );\n                last_li.push( list );\n                last_li = list[1] = [ \"listitem\" ];\n              }\n              else {\n                // We aren't deep enough to be strictly a new level. This is\n                // where Md.pl goes nuts. If the indent matches a level in the\n                // stack, put it there, else put it one deeper then the\n                // wanted_depth deserves.\n                var found = false;\n                for (i = 0; i < stack.length; i++) {\n                  if ( stack[ i ].indent != m[1] ) continue;\n                  list = stack[ i ].list;\n                  stack.splice( i+1 );\n                  found = true;\n                  break;\n                }\n\n                if (!found) {\n                  //print(\"not found. l:\", uneval(l));\n                  wanted_depth++;\n                  if (wanted_depth <= stack.length) {\n                    stack.splice(wanted_depth);\n                    //print(\"Desired depth now\", wanted_depth, \"stack:\", stack.length);\n                    list = stack[wanted_depth-1].list;\n                    //print(\"list:\", uneval(list) );\n                  }\n                  else {\n                    //print (\"made new stack for messy indent\");\n                    list = make_list(m);\n                    last_li.push(list);\n                  }\n                }\n\n                //print( uneval(list), \"last\", list === stack[stack.length-1].list );\n                last_li = [ \"listitem\" ];\n                list.push(last_li);\n              } // end depth of shenegains\n              nl = \"\";\n            }\n\n            // Add content\n            if (l.length > m[0].length) {\n              li_accumulate += nl + l.substr( m[0].length );\n            }\n          } // tight_search\n\n          if ( li_accumulate.length ) {\n            add( last_li, loose, this.processInline( li_accumulate ), nl );\n            // Loose mode will have been dealt with. Reset it\n            loose = false;\n            li_accumulate = \"\";\n          }\n\n          // Look at the next block - we might have a loose list. Or an extra\n          // paragraph for the current li\n          var contained = get_contained_blocks( stack.length, next );\n\n          // Deal with code blocks or properly nested lists\n          if (contained.length > 0) {\n            // Make sure all listitems up the stack are paragraphs\n            forEach( stack, paragraphify, this);\n\n            last_li.push.apply( last_li, this.toTree( contained, [] ) );\n          }\n\n          var next_block = next[0] && next[0].valueOf() || \"\";\n\n          if ( next_block.match(is_list_re) || next_block.match( /^ / ) ) {\n            block = next.shift();\n\n            // Check for an HR following a list: features/lists/hr_abutting\n            var hr = this.dialect.block.horizRule( block, next );\n\n            if (hr) {\n              ret.push.apply(ret, hr);\n              break;\n            }\n\n            // Make sure all listitems up the stack are paragraphs\n            forEach( stack, paragraphify, this);\n\n            loose = true;\n            continue loose_search;\n          }\n          break;\n        } // loose_search\n\n        return ret;\n      };\n    })(),\n\n    blockquote: function blockquote( block, next ) {\n      if ( !block.match( /^>/m ) )\n        return undefined;\n\n      var jsonml = [];\n\n      // separate out the leading abutting block, if any\n      if ( block[ 0 ] != \">\" ) {\n        var lines = block.split( /\\n/ ),\n            prev = [];\n\n        // keep shifting lines until you find a crotchet\n        while ( lines.length && lines[ 0 ][ 0 ] != \">\" ) {\n            prev.push( lines.shift() );\n        }\n\n        // reassemble!\n        block = lines.join( \"\\n\" );\n        jsonml.push.apply( jsonml, this.processBlock( prev.join( \"\\n\" ), [] ) );\n      }\n\n      // if the next block is also a blockquote merge it in\n      while ( next.length && next[ 0 ][ 0 ] == \">\" ) {\n        var b = next.shift();\n        block = new String(block + block.trailing + b);\n        block.trailing = b.trailing;\n      }\n\n      // Strip off the leading \"> \" and re-process as a block.\n      var input = block.replace( /^> ?/gm, '' ),\n          old_tree = this.tree;\n      jsonml.push( this.toTree( input, [ \"blockquote\" ] ) );\n\n      return jsonml;\n    },\n\n    referenceDefn: function referenceDefn( block, next) {\n      var re = /^\\s*\\[(.*?)\\]:\\s*(\\S+)(?:\\s+(?:(['\"])(.*?)\\3|\\((.*?)\\)))?\\n?/;\n      // interesting matches are [ , ref_id, url, , title, title ]\n\n      if ( !block.match(re) )\n        return undefined;\n\n      // make an attribute node if it doesn't exist\n      if ( !extract_attr( this.tree ) ) {\n        this.tree.splice( 1, 0, {} );\n      }\n\n      var attrs = extract_attr( this.tree );\n\n      // make a references hash if it doesn't exist\n      if ( attrs.references === undefined ) {\n        attrs.references = {};\n      }\n\n      var b = this.loop_re_over_block(re, block, function( m ) {\n\n        if ( m[2] && m[2][0] == '<' && m[2][m[2].length-1] == '>' )\n          m[2] = m[2].substring( 1, m[2].length - 1 );\n\n        var ref = attrs.references[ m[1].toLowerCase() ] = {\n          href: m[2]\n        };\n\n        if (m[4] !== undefined)\n          ref.title = m[4];\n        else if (m[5] !== undefined)\n          ref.title = m[5];\n\n      } );\n\n      if (b.length)\n        next.unshift( mk_block( b, block.trailing ) );\n\n      return [];\n    },\n\n    para: function para( block, next ) {\n      // everything's a para!\n      return [ [\"para\"].concat( this.processInline( block ) ) ];\n    }\n  }\n};\n\nMarkdown.dialects.Gruber.inline = {\n\n    __oneElement__: function oneElement( text, patterns_or_re, previous_nodes ) {\n      var m,\n          res,\n          lastIndex = 0;\n\n      patterns_or_re = patterns_or_re || this.dialect.inline.__patterns__;\n      var re = new RegExp( \"([\\\\s\\\\S]*?)(\" + (patterns_or_re.source || patterns_or_re) + \")\" );\n\n      m = re.exec( text );\n      if (!m) {\n        // Just boring text\n        return [ text.length, text ];\n      }\n      else if ( m[1] ) {\n        // Some un-interesting text matched. Return that first\n        return [ m[1].length, m[1] ];\n      }\n\n      var res;\n      if ( m[2] in this.dialect.inline ) {\n        res = this.dialect.inline[ m[2] ].call(\n                  this,\n                  text.substr( m.index ), m, previous_nodes || [] );\n      }\n      // Default for now to make dev easier. just slurp special and output it.\n      res = res || [ m[2].length, m[2] ];\n      return res;\n    },\n\n    __call__: function inline( text, patterns ) {\n\n      var out = [],\n          res;\n\n      function add(x) {\n        //D:self.debug(\"  adding output\", uneval(x));\n        if (typeof x == \"string\" && typeof out[out.length-1] == \"string\")\n          out[ out.length-1 ] += x;\n        else\n          out.push(x);\n      }\n\n      while ( text.length > 0 ) {\n        res = this.dialect.inline.__oneElement__.call(this, text, patterns, out );\n        text = text.substr( res.shift() );\n        forEach(res, add )\n      }\n\n      return out;\n    },\n\n    // These characters are intersting elsewhere, so have rules for them so that\n    // chunks of plain text blocks don't include them\n    \"]\": function () {},\n    \"}\": function () {},\n\n    \"\\\\\": function escaped( text ) {\n      // [ length of input processed, node/children to add... ]\n      // Only esacape: \\ ` * _ { } [ ] ( ) # * + - . !\n      if ( text.match( /^\\\\[\\\\`\\*_{}\\[\\]()#\\+.!\\-]/ ) )\n        return [ 2, text[1] ];\n      else\n        // Not an esacpe\n        return [ 1, \"\\\\\" ];\n    },\n\n    \"![\": function image( text ) {\n\n      // Unlike images, alt text is plain text only. no other elements are\n      // allowed in there\n\n      // ![Alt text](/path/to/img.jpg \"Optional title\")\n      //      1          2            3       4         <--- captures\n      var m = text.match( /^!\\[(.*?)\\][ \\t]*\\([ \\t]*(\\S*)(?:[ \\t]+([\"'])(.*?)\\3)?[ \\t]*\\)/ );\n\n      if ( m ) {\n        if ( m[2] && m[2][0] == '<' && m[2][m[2].length-1] == '>' )\n          m[2] = m[2].substring( 1, m[2].length - 1 );\n\n        m[2] = this.dialect.inline.__call__.call( this, m[2], /\\\\/ )[0];\n\n        var attrs = { alt: m[1], href: m[2] || \"\" };\n        if ( m[4] !== undefined)\n          attrs.title = m[4];\n\n        return [ m[0].length, [ \"img\", attrs ] ];\n      }\n\n      // ![Alt text][id]\n      m = text.match( /^!\\[(.*?)\\][ \\t]*\\[(.*?)\\]/ );\n\n      if ( m ) {\n        // We can't check if the reference is known here as it likely wont be\n        // found till after. Check it in md tree->hmtl tree conversion\n        return [ m[0].length, [ \"img_ref\", { alt: m[1], ref: m[2].toLowerCase(), original: m[0] } ] ];\n      }\n\n      // Just consume the '!['\n      return [ 2, \"![\" ];\n    },\n\n    \"[\": function link( text ) {\n\n      var orig = String(text);\n      // Inline content is possible inside `link text`\n      var res = Markdown.DialectHelpers.inline_until_char.call( this, text.substr(1), ']' );\n\n      // No closing ']' found. Just consume the [\n      if ( !res ) return [ 1, '[' ];\n\n      var consumed = 1 + res[ 0 ],\n          children = res[ 1 ],\n          link,\n          attrs;\n\n      // At this point the first [...] has been parsed. See what follows to find\n      // out which kind of link we are (reference or direct url)\n      text = text.substr( consumed );\n\n      // [link text](/path/to/img.jpg \"Optional title\")\n      //                 1            2       3         <--- captures\n      // This will capture up to the last paren in the block. We then pull\n      // back based on if there a matching ones in the url\n      //    ([here](/url/(test))\n      // The parens have to be balanced\n      var m = text.match( /^\\s*\\([ \\t]*(\\S+)(?:[ \\t]+([\"'])(.*?)\\2)?[ \\t]*\\)/ );\n      if ( m ) {\n        var url = m[1];\n        consumed += m[0].length;\n\n        if ( url && url[0] == '<' && url[url.length-1] == '>' )\n          url = url.substring( 1, url.length - 1 );\n\n        // If there is a title we don't have to worry about parens in the url\n        if ( !m[3] ) {\n          var open_parens = 1; // One open that isn't in the capture\n          for (var len = 0; len < url.length; len++) {\n            switch ( url[len] ) {\n            case '(':\n              open_parens++;\n              break;\n            case ')':\n              if ( --open_parens == 0) {\n                consumed -= url.length - len;\n                url = url.substring(0, len);\n              }\n              break;\n            }\n          }\n        }\n\n        // Process escapes only\n        url = this.dialect.inline.__call__.call( this, url, /\\\\/ )[0];\n\n        attrs = { href: url || \"\" };\n        if ( m[3] !== undefined)\n          attrs.title = m[3];\n\n        link = [ \"link\", attrs ].concat( children );\n        return [ consumed, link ];\n      }\n\n      // [Alt text][id]\n      // [Alt text] [id]\n      m = text.match( /^\\s*\\[(.*?)\\]/ );\n\n      if ( m ) {\n\n        consumed += m[ 0 ].length;\n\n        // [links][] uses links as its reference\n        attrs = { ref: ( m[ 1 ] || String(children) ).toLowerCase(),  original: orig.substr( 0, consumed ) };\n\n        link = [ \"link_ref\", attrs ].concat( children );\n\n        // We can't check if the reference is known here as it likely wont be\n        // found till after. Check it in md tree->hmtl tree conversion.\n        // Store the original so that conversion can revert if the ref isn't found.\n        return [ consumed, link ];\n      }\n\n      // [id]\n      // Only if id is plain (no formatting.)\n      if ( children.length == 1 && typeof children[0] == \"string\" ) {\n\n        attrs = { ref: children[0].toLowerCase(),  original: orig.substr( 0, consumed ) };\n        link = [ \"link_ref\", attrs, children[0] ];\n        return [ consumed, link ];\n      }\n\n      // Just consume the '['\n      return [ 1, \"[\" ];\n    },\n\n\n    \"<\": function autoLink( text ) {\n      var m;\n\n      if ( ( m = text.match( /^<(?:((https?|ftp|mailto):[^>]+)|(.*?@.*?\\.[a-zA-Z]+))>/ ) ) != null ) {\n        if ( m[3] ) {\n          return [ m[0].length, [ \"link\", { href: \"mailto:\" + m[3] }, m[3] ] ];\n\n        }\n        else if ( m[2] == \"mailto\" ) {\n          return [ m[0].length, [ \"link\", { href: m[1] }, m[1].substr(\"mailto:\".length ) ] ];\n        }\n        else\n          return [ m[0].length, [ \"link\", { href: m[1] }, m[1] ] ];\n      }\n\n      return [ 1, \"<\" ];\n    },\n\n    \"`\": function inlineCode( text ) {\n      // Inline code block. as many backticks as you like to start it\n      // Always skip over the opening ticks.\n      var m = text.match( /(`+)(([\\s\\S]*?)\\1)/ );\n\n      if ( m && m[2] )\n        return [ m[1].length + m[2].length, [ \"inlinecode\", m[3] ] ];\n      else {\n        // TODO: No matching end code found - warn!\n        return [ 1, \"`\" ];\n      }\n    },\n\n    \"  \\n\": function lineBreak( text ) {\n      return [ 3, [ \"linebreak\" ] ];\n    }\n\n};\n\n// Meta Helper/generator method for em and strong handling\nfunction strong_em( tag, md ) {\n\n  var state_slot = tag + \"_state\",\n      other_slot = tag == \"strong\" ? \"em_state\" : \"strong_state\";\n\n  function CloseTag(len) {\n    this.len_after = len;\n    this.name = \"close_\" + md;\n  }\n\n  return function ( text, orig_match ) {\n\n    if (this[state_slot][0] == md) {\n      // Most recent em is of this type\n      //D:this.debug(\"closing\", md);\n      this[state_slot].shift();\n\n      // \"Consume\" everything to go back to the recrusion in the else-block below\n      return[ text.length, new CloseTag(text.length-md.length) ];\n    }\n    else {\n      // Store a clone of the em/strong states\n      var other = this[other_slot].slice(),\n          state = this[state_slot].slice();\n\n      this[state_slot].unshift(md);\n\n      //D:this.debug_indent += \"  \";\n\n      // Recurse\n      var res = this.processInline( text.substr( md.length ) );\n      //D:this.debug_indent = this.debug_indent.substr(2);\n\n      var last = res[res.length - 1];\n\n      //D:this.debug(\"processInline from\", tag + \": \", uneval( res ) );\n\n      var check = this[state_slot].shift();\n      if (last instanceof CloseTag) {\n        res.pop();\n        // We matched! Huzzah.\n        var consumed = text.length - last.len_after;\n        return [ consumed, [ tag ].concat(res) ];\n      }\n      else {\n        // Restore the state of the other kind. We might have mistakenly closed it.\n        this[other_slot] = other;\n        this[state_slot] = state;\n\n        // We can't reuse the processed result as it could have wrong parsing contexts in it.\n        return [ md.length, md ];\n      }\n    }\n  }; // End returned function\n}\n\nMarkdown.dialects.Gruber.inline[\"**\"] = strong_em(\"strong\", \"**\");\nMarkdown.dialects.Gruber.inline[\"__\"] = strong_em(\"strong\", \"__\");\nMarkdown.dialects.Gruber.inline[\"*\"]  = strong_em(\"em\", \"*\");\nMarkdown.dialects.Gruber.inline[\"_\"]  = strong_em(\"em\", \"_\");\n\n\n// Build default order from insertion order.\nMarkdown.buildBlockOrder = function(d) {\n  var ord = [];\n  for ( var i in d ) {\n    if ( i == \"__order__\" || i == \"__call__\" ) continue;\n    ord.push( i );\n  }\n  d.__order__ = ord;\n};\n\n// Build patterns for inline matcher\nMarkdown.buildInlinePatterns = function(d) {\n  var patterns = [];\n\n  for ( var i in d ) {\n    // __foo__ is reserved and not a pattern\n    if ( i.match( /^__.*__$/) ) continue;\n    var l = i.replace( /([\\\\.*+?|()\\[\\]{}])/g, \"\\\\$1\" )\n             .replace( /\\n/, \"\\\\n\" );\n    patterns.push( i.length == 1 ? l : \"(?:\" + l + \")\" );\n  }\n\n  patterns = patterns.join(\"|\");\n  d.__patterns__ = patterns;\n  //print(\"patterns:\", uneval( patterns ) );\n\n  var fn = d.__call__;\n  d.__call__ = function(text, pattern) {\n    if (pattern != undefined) {\n      return fn.call(this, text, pattern);\n    }\n    else\n    {\n      return fn.call(this, text, patterns);\n    }\n  };\n};\n\nMarkdown.DialectHelpers = {};\nMarkdown.DialectHelpers.inline_until_char = function( text, want ) {\n  var consumed = 0,\n      nodes = [];\n\n  while ( true ) {\n    if ( text[ consumed ] == want ) {\n      // Found the character we were looking for\n      consumed++;\n      return [ consumed, nodes ];\n    }\n\n    if ( consumed >= text.length ) {\n      // No closing char found. Abort.\n      return null;\n    }\n\n    var res = this.dialect.inline.__oneElement__.call(this, text.substr( consumed ) );\n    consumed += res[ 0 ];\n    // Add any returned nodes.\n    nodes.push.apply( nodes, res.slice( 1 ) );\n  }\n}\n\n// Helper function to make sub-classing a dialect easier\nMarkdown.subclassDialect = function( d ) {\n  function Block() {}\n  Block.prototype = d.block;\n  function Inline() {}\n  Inline.prototype = d.inline;\n\n  return { block: new Block(), inline: new Inline() };\n};\n\nMarkdown.buildBlockOrder ( Markdown.dialects.Gruber.block );\nMarkdown.buildInlinePatterns( Markdown.dialects.Gruber.inline );\n\nMarkdown.dialects.Maruku = Markdown.subclassDialect( Markdown.dialects.Gruber );\n\nMarkdown.dialects.Maruku.processMetaHash = function processMetaHash( meta_string ) {\n  var meta = split_meta_hash( meta_string ),\n      attr = {};\n\n  for ( var i = 0; i < meta.length; ++i ) {\n    // id: #foo\n    if ( /^#/.test( meta[ i ] ) ) {\n      attr.id = meta[ i ].substring( 1 );\n    }\n    // class: .foo\n    else if ( /^\\./.test( meta[ i ] ) ) {\n      // if class already exists, append the new one\n      if ( attr['class'] ) {\n        attr['class'] = attr['class'] + meta[ i ].replace( /./, \" \" );\n      }\n      else {\n        attr['class'] = meta[ i ].substring( 1 );\n      }\n    }\n    // attribute: foo=bar\n    else if ( /\\=/.test( meta[ i ] ) ) {\n      var s = meta[ i ].split( /\\=/ );\n      attr[ s[ 0 ] ] = s[ 1 ];\n    }\n  }\n\n  return attr;\n}\n\nfunction split_meta_hash( meta_string ) {\n  var meta = meta_string.split( \"\" ),\n      parts = [ \"\" ],\n      in_quotes = false;\n\n  while ( meta.length ) {\n    var letter = meta.shift();\n    switch ( letter ) {\n      case \" \" :\n        // if we're in a quoted section, keep it\n        if ( in_quotes ) {\n          parts[ parts.length - 1 ] += letter;\n        }\n        // otherwise make a new part\n        else {\n          parts.push( \"\" );\n        }\n        break;\n      case \"'\" :\n      case '\"' :\n        // reverse the quotes and move straight on\n        in_quotes = !in_quotes;\n        break;\n      case \"\\\\\" :\n        // shift off the next letter to be used straight away.\n        // it was escaped so we'll keep it whatever it is\n        letter = meta.shift();\n      default :\n        parts[ parts.length - 1 ] += letter;\n        break;\n    }\n  }\n\n  return parts;\n}\n\nMarkdown.dialects.Maruku.block.document_meta = function document_meta( block, next ) {\n  // we're only interested in the first block\n  if ( block.lineNumber > 1 ) return undefined;\n\n  // document_meta blocks consist of one or more lines of `Key: Value\\n`\n  if ( ! block.match( /^(?:\\w+:.*\\n)*\\w+:.*$/ ) ) return undefined;\n\n  // make an attribute node if it doesn't exist\n  if ( !extract_attr( this.tree ) ) {\n    this.tree.splice( 1, 0, {} );\n  }\n\n  var pairs = block.split( /\\n/ );\n  for ( p in pairs ) {\n    var m = pairs[ p ].match( /(\\w+):\\s*(.*)$/ ),\n        key = m[ 1 ].toLowerCase(),\n        value = m[ 2 ];\n\n    this.tree[ 1 ][ key ] = value;\n  }\n\n  // document_meta produces no content!\n  return [];\n};\n\nMarkdown.dialects.Maruku.block.block_meta = function block_meta( block, next ) {\n  // check if the last line of the block is an meta hash\n  var m = block.match( /(^|\\n) {0,3}\\{:\\s*((?:\\\\\\}|[^\\}])*)\\s*\\}$/ );\n  if ( !m ) return undefined;\n\n  // process the meta hash\n  var attr = this.dialect.processMetaHash( m[ 2 ] );\n\n  var hash;\n\n  // if we matched ^ then we need to apply meta to the previous block\n  if ( m[ 1 ] === \"\" ) {\n    var node = this.tree[ this.tree.length - 1 ];\n    hash = extract_attr( node );\n\n    // if the node is a string (rather than JsonML), bail\n    if ( typeof node === \"string\" ) return undefined;\n\n    // create the attribute hash if it doesn't exist\n    if ( !hash ) {\n      hash = {};\n      node.splice( 1, 0, hash );\n    }\n\n    // add the attributes in\n    for ( a in attr ) {\n      hash[ a ] = attr[ a ];\n    }\n\n    // return nothing so the meta hash is removed\n    return [];\n  }\n\n  // pull the meta hash off the block and process what's left\n  var b = block.replace( /\\n.*$/, \"\" ),\n      result = this.processBlock( b, [] );\n\n  // get or make the attributes hash\n  hash = extract_attr( result[ 0 ] );\n  if ( !hash ) {\n    hash = {};\n    result[ 0 ].splice( 1, 0, hash );\n  }\n\n  // attach the attributes to the block\n  for ( a in attr ) {\n    hash[ a ] = attr[ a ];\n  }\n\n  return result;\n};\n\nMarkdown.dialects.Maruku.block.definition_list = function definition_list( block, next ) {\n  // one or more terms followed by one or more definitions, in a single block\n  var tight = /^((?:[^\\s:].*\\n)+):\\s+([\\s\\S]+)$/,\n      list = [ \"dl\" ],\n      i;\n\n  // see if we're dealing with a tight or loose block\n  if ( ( m = block.match( tight ) ) ) {\n    // pull subsequent tight DL blocks out of `next`\n    var blocks = [ block ];\n    while ( next.length && tight.exec( next[ 0 ] ) ) {\n      blocks.push( next.shift() );\n    }\n\n    for ( var b = 0; b < blocks.length; ++b ) {\n      var m = blocks[ b ].match( tight ),\n          terms = m[ 1 ].replace( /\\n$/, \"\" ).split( /\\n/ ),\n          defns = m[ 2 ].split( /\\n:\\s+/ );\n\n      // print( uneval( m ) );\n\n      for ( i = 0; i < terms.length; ++i ) {\n        list.push( [ \"dt\", terms[ i ] ] );\n      }\n\n      for ( i = 0; i < defns.length; ++i ) {\n        // run inline processing over the definition\n        list.push( [ \"dd\" ].concat( this.processInline( defns[ i ].replace( /(\\n)\\s+/, \"$1\" ) ) ) );\n      }\n    }\n  }\n  else {\n    return undefined;\n  }\n\n  return [ list ];\n};\n\nMarkdown.dialects.Maruku.inline[ \"{:\" ] = function inline_meta( text, matches, out ) {\n  if ( !out.length ) {\n    return [ 2, \"{:\" ];\n  }\n\n  // get the preceeding element\n  var before = out[ out.length - 1 ];\n\n  if ( typeof before === \"string\" ) {\n    return [ 2, \"{:\" ];\n  }\n\n  // match a meta hash\n  var m = text.match( /^\\{:\\s*((?:\\\\\\}|[^\\}])*)\\s*\\}/ );\n\n  // no match, false alarm\n  if ( !m ) {\n    return [ 2, \"{:\" ];\n  }\n\n  // attach the attributes to the preceeding element\n  var meta = this.dialect.processMetaHash( m[ 1 ] ),\n      attr = extract_attr( before );\n\n  if ( !attr ) {\n    attr = {};\n    before.splice( 1, 0, attr );\n  }\n\n  for ( var k in meta ) {\n    attr[ k ] = meta[ k ];\n  }\n\n  // cut out the string and replace it with nothing\n  return [ m[ 0 ].length, \"\" ];\n};\n\nMarkdown.buildBlockOrder ( Markdown.dialects.Maruku.block );\nMarkdown.buildInlinePatterns( Markdown.dialects.Maruku.inline );\n\nvar isArray = Array.isArray || function(obj) {\n  return Object.prototype.toString.call(obj) == '[object Array]';\n};\n\nvar forEach;\n// Don't mess with Array.prototype. Its not friendly\nif ( Array.prototype.forEach ) {\n  forEach = function( arr, cb, thisp ) {\n    return arr.forEach( cb, thisp );\n  };\n}\nelse {\n  forEach = function(arr, cb, thisp) {\n    for (var i = 0; i < arr.length; i++) {\n      cb.call(thisp || arr, arr[i], i, arr);\n    }\n  }\n}\n\nfunction extract_attr( jsonml ) {\n  return isArray(jsonml)\n      && jsonml.length > 1\n      && typeof jsonml[ 1 ] === \"object\"\n      && !( isArray(jsonml[ 1 ]) )\n      ? jsonml[ 1 ]\n      : undefined;\n}\n\n\n\n/**\n *  renderJsonML( jsonml[, options] ) -> String\n *  - jsonml (Array): JsonML array to render to XML\n *  - options (Object): options\n *\n *  Converts the given JsonML into well-formed XML.\n *\n *  The options currently understood are:\n *\n *  - root (Boolean): wether or not the root node should be included in the\n *    output, or just its children. The default `false` is to not include the\n *    root itself.\n */\nexpose.renderJsonML = function( jsonml, options ) {\n  options = options || {};\n  // include the root element in the rendered output?\n  options.root = options.root || false;\n\n  var content = [];\n\n  if ( options.root ) {\n    content.push( render_tree( jsonml ) );\n  }\n  else {\n    jsonml.shift(); // get rid of the tag\n    if ( jsonml.length && typeof jsonml[ 0 ] === \"object\" && !( jsonml[ 0 ] instanceof Array ) ) {\n      jsonml.shift(); // get rid of the attributes\n    }\n\n    while ( jsonml.length ) {\n      content.push( render_tree( jsonml.shift() ) );\n    }\n  }\n\n  return content.join( \"\\n\\n\" );\n};\n\nfunction escapeHTML( text ) {\n  return text.replace( /&/g, \"&amp;\" )\n             .replace( /</g, \"&lt;\" )\n             .replace( />/g, \"&gt;\" )\n             .replace( /\"/g, \"&quot;\" )\n             .replace( /'/g, \"&#39;\" );\n}\n\nfunction render_tree( jsonml ) {\n  // basic case\n  if ( typeof jsonml === \"string\" ) {\n    return escapeHTML( jsonml );\n  }\n\n  var tag = jsonml.shift(),\n      attributes = {},\n      content = [];\n\n  if ( jsonml.length && typeof jsonml[ 0 ] === \"object\" && !( jsonml[ 0 ] instanceof Array ) ) {\n    attributes = jsonml.shift();\n  }\n\n  while ( jsonml.length ) {\n    content.push( arguments.callee( jsonml.shift() ) );\n  }\n\n  var tag_attrs = \"\";\n  for ( var a in attributes ) {\n    tag_attrs += \" \" + a + '=\"' + escapeHTML( attributes[ a ] ) + '\"';\n  }\n\n  // be careful about adding whitespace here for inline elements\n  if ( tag == \"img\" || tag == \"br\" || tag == \"hr\" ) {\n    return \"<\"+ tag + tag_attrs + \"/>\";\n  }\n  else {\n    return \"<\"+ tag + tag_attrs + \">\" + content.join( \"\" ) + \"</\" + tag + \">\";\n  }\n}\n\nfunction convert_tree_to_html( tree, references, options ) {\n  var i;\n  options = options || {};\n\n  // shallow clone\n  var jsonml = tree.slice( 0 );\n\n  if (typeof options.preprocessTreeNode === \"function\") {\n      jsonml = options.preprocessTreeNode(jsonml, references);\n  }\n\n  // Clone attributes if they exist\n  var attrs = extract_attr( jsonml );\n  if ( attrs ) {\n    jsonml[ 1 ] = {};\n    for ( i in attrs ) {\n      jsonml[ 1 ][ i ] = attrs[ i ];\n    }\n    attrs = jsonml[ 1 ];\n  }\n\n  // basic case\n  if ( typeof jsonml === \"string\" ) {\n    return jsonml;\n  }\n\n  // convert this node\n  switch ( jsonml[ 0 ] ) {\n    case \"header\":\n      jsonml[ 0 ] = \"h\" + jsonml[ 1 ].level;\n      delete jsonml[ 1 ].level;\n      break;\n    case \"bulletlist\":\n      jsonml[ 0 ] = \"ul\";\n      break;\n    case \"numberlist\":\n      jsonml[ 0 ] = \"ol\";\n      break;\n    case \"listitem\":\n      jsonml[ 0 ] = \"li\";\n      break;\n    case \"para\":\n      jsonml[ 0 ] = \"p\";\n      break;\n    case \"markdown\":\n      jsonml[ 0 ] = \"html\";\n      if ( attrs ) delete attrs.references;\n      break;\n    case \"code_block\":\n      jsonml[ 0 ] = \"pre\";\n      i = attrs ? 2 : 1;\n      var code = [ \"code\" ];\n      code.push.apply( code, jsonml.splice( i ) );\n      jsonml[ i ] = code;\n      break;\n    case \"inlinecode\":\n      jsonml[ 0 ] = \"code\";\n      break;\n    case \"img\":\n      jsonml[ 1 ].src = jsonml[ 1 ].href;\n      delete jsonml[ 1 ].href;\n      break;\n    case \"linebreak\":\n      jsonml[ 0 ] = \"br\";\n    break;\n    case \"link\":\n      jsonml[ 0 ] = \"a\";\n      break;\n    case \"link_ref\":\n      jsonml[ 0 ] = \"a\";\n\n      // grab this ref and clean up the attribute node\n      var ref = references[ attrs.ref ];\n\n      // if the reference exists, make the link\n      if ( ref ) {\n        delete attrs.ref;\n\n        // add in the href and title, if present\n        attrs.href = ref.href;\n        if ( ref.title ) {\n          attrs.title = ref.title;\n        }\n\n        // get rid of the unneeded original text\n        delete attrs.original;\n      }\n      // the reference doesn't exist, so revert to plain text\n      else {\n        return attrs.original;\n      }\n      break;\n    case \"img_ref\":\n      jsonml[ 0 ] = \"img\";\n\n      // grab this ref and clean up the attribute node\n      var ref = references[ attrs.ref ];\n\n      // if the reference exists, make the link\n      if ( ref ) {\n        delete attrs.ref;\n\n        // add in the href and title, if present\n        attrs.src = ref.href;\n        if ( ref.title ) {\n          attrs.title = ref.title;\n        }\n\n        // get rid of the unneeded original text\n        delete attrs.original;\n      }\n      // the reference doesn't exist, so revert to plain text\n      else {\n        return attrs.original;\n      }\n      break;\n  }\n\n  // convert all the children\n  i = 1;\n\n  // deal with the attribute node, if it exists\n  if ( attrs ) {\n    // if there are keys, skip over it\n    for ( var key in jsonml[ 1 ] ) {\n      i = 2;\n    }\n    // if there aren't, remove it\n    if ( i === 1 ) {\n      jsonml.splice( i, 1 );\n    }\n  }\n\n  for ( ; i < jsonml.length; ++i ) {\n    jsonml[ i ] = arguments.callee( jsonml[ i ], references, options );\n  }\n\n  return jsonml;\n}\n\n\n// merges adjacent text nodes into a single node\nfunction merge_text_nodes( jsonml ) {\n  // skip the tag name and attribute hash\n  var i = extract_attr( jsonml ) ? 2 : 1;\n\n  while ( i < jsonml.length ) {\n    // if it's a string check the next item too\n    if ( typeof jsonml[ i ] === \"string\" ) {\n      if ( i + 1 < jsonml.length && typeof jsonml[ i + 1 ] === \"string\" ) {\n        // merge the second string into the first and remove it\n        jsonml[ i ] += jsonml.splice( i + 1, 1 )[ 0 ];\n      }\n      else {\n        ++i;\n      }\n    }\n    // if it's not a string recurse\n    else {\n      arguments.callee( jsonml[ i ] );\n      ++i;\n    }\n  }\n}\n\n} )( (function() {\n  if ( typeof exports === \"undefined\" ) {\n    window.markdown = {};\n    return window.markdown;\n  }\n  else {\n    return exports;\n  }\n} )() );\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/markdown/to-markdown.js",
    "content": "/*\n * to-markdown - an HTML to Markdown converter\n *\n * Copyright 2011, Dom Christie\n * Licenced under the MIT licence\n *\n */\n\nvar toMarkdown = function(string) {\n\n  var ELEMENTS = [\n    {\n      patterns: 'p',\n      replacement: function(str, attrs, innerHTML) {\n        return innerHTML ? '\\n\\n' + innerHTML + '\\n' : '';\n      }\n    },\n    {\n      patterns: 'br',\n      type: 'void',\n      replacement: '\\n'\n    },\n    {\n      patterns: 'h([1-6])',\n      replacement: function(str, hLevel, attrs, innerHTML) {\n        var hPrefix = '';\n        for(var i = 0; i < hLevel; i++) {\n          hPrefix += '#';\n        }\n        return '\\n\\n' + hPrefix + ' ' + innerHTML + '\\n';\n      }\n    },\n    {\n      patterns: 'hr',\n      type: 'void',\n      replacement: '\\n\\n* * *\\n'\n    },\n    {\n      patterns: 'a',\n      replacement: function(str, attrs, innerHTML) {\n        var href = attrs.match(attrRegExp('href')),\n            title = attrs.match(attrRegExp('title'));\n        return href ? '[' + innerHTML + ']' + '(' + href[1] + (title && title[1] ? ' \"' + title[1] + '\"' : '') + ')' : str;\n      }\n    },\n    {\n      patterns: ['b', 'strong'],\n      replacement: function(str, attrs, innerHTML) {\n        return innerHTML ? '**' + innerHTML + '**' : '';\n      }\n    },\n    {\n      patterns: ['i', 'em'],\n      replacement: function(str, attrs, innerHTML) {\n        return innerHTML ? '_' + innerHTML + '_' : '';\n      }\n    },\n    {\n      patterns: 'code',\n      replacement: function(str, attrs, innerHTML) {\n        return innerHTML ? '`' + innerHTML + '`' : '';\n      }\n    },\n    {\n      patterns: 'img',\n      type: 'void',\n      replacement: function(str, attrs, innerHTML) {\n        var src = attrs.match(attrRegExp('src')),\n            alt = attrs.match(attrRegExp('alt')),\n            title = attrs.match(attrRegExp('title'));\n        return '![' + (alt && alt[1] ? alt[1] : '') + ']' + '(' + src[1] + (title && title[1] ? ' \"' + title[1] + '\"' : '') + ')';\n      }\n    }\n  ];\n\n  for(var i = 0, len = ELEMENTS.length; i < len; i++) {\n    if(typeof ELEMENTS[i].patterns === 'string') {\n      string = replaceEls(string, { tag: ELEMENTS[i].patterns, replacement: ELEMENTS[i].replacement, type:  ELEMENTS[i].type });\n    }\n    else {\n      for(var j = 0, pLen = ELEMENTS[i].patterns.length; j < pLen; j++) {\n        string = replaceEls(string, { tag: ELEMENTS[i].patterns[j], replacement: ELEMENTS[i].replacement, type:  ELEMENTS[i].type });\n      }\n    }\n  }\n\n  function replaceEls(html, elProperties) {\n    var pattern = elProperties.type === 'void' ? '<' + elProperties.tag + '\\\\b([^>]*)\\\\/?>' : '<' + elProperties.tag + '\\\\b([^>]*)>([\\\\s\\\\S]*?)<\\\\/' + elProperties.tag + '>',\n        regex = new RegExp(pattern, 'gi'),\n        markdown = '';\n    if(typeof elProperties.replacement === 'string') {\n      markdown = html.replace(regex, elProperties.replacement);\n    }\n    else {\n      markdown = html.replace(regex, function(str, p1, p2, p3) {\n        return elProperties.replacement.call(this, str, p1, p2, p3);\n      });\n    }\n    return markdown;\n  }\n\n  function attrRegExp(attr) {\n    return new RegExp(attr + '\\\\s*=\\\\s*[\"\\']?([^\"\\']*)[\"\\']?', 'i');\n  }\n\n  // Pre code blocks\n\n  string = string.replace(/<pre\\b[^>]*>`([\\s\\S]*)`<\\/pre>/gi, function(str, innerHTML) {\n    innerHTML = innerHTML.replace(/^\\t+/g, '  '); // convert tabs to spaces (you know it makes sense)\n    innerHTML = innerHTML.replace(/\\n/g, '\\n    ');\n    return '\\n\\n    ' + innerHTML + '\\n';\n  });\n\n  // Lists\n\n  // Escape numbers that could trigger an ol\n  // If there are more than three spaces before the code, it would be in a pre tag\n  // Make sure we are escaping the period not matching any character\n  string = string.replace(/^(\\s{0,3}\\d+)\\. /g, '$1\\\\. ');\n\n  // Converts lists that have no child lists (of same type) first, then works it's way up\n  var noChildrenRegex = /<(ul|ol)\\b[^>]*>(?:(?!<ul|<ol)[\\s\\S])*?<\\/\\1>/gi;\n  while(string.match(noChildrenRegex)) {\n    string = string.replace(noChildrenRegex, function(str) {\n      return replaceLists(str);\n    });\n  }\n\n  function replaceLists(html) {\n\n    html = html.replace(/<(ul|ol)\\b[^>]*>([\\s\\S]*?)<\\/\\1>/gi, function(str, listType, innerHTML) {\n      var lis = innerHTML.split('</li>');\n      lis.splice(lis.length - 1, 1);\n\n      for(i = 0, len = lis.length; i < len; i++) {\n        if(lis[i]) {\n          var prefix = (listType === 'ol') ? (i + 1) + \".  \" : \"*   \";\n          lis[i] = lis[i].replace(/\\s*<li[^>]*>([\\s\\S]*)/i, function(str, innerHTML) {\n\n            innerHTML = innerHTML.replace(/^\\s+/, '');\n            innerHTML = innerHTML.replace(/\\n\\n/g, '\\n\\n    ');\n            // indent nested lists\n            innerHTML = innerHTML.replace(/\\n([ ]*)+(\\*|\\d+\\.) /g, '\\n$1    $2 ');\n            return prefix + innerHTML;\n          });\n        }\n      }\n      return lis.join('\\n');\n    });\n    return '\\n\\n' + html.replace(/[ \\t]+\\n|\\s+$/g, '');\n  }\n\n  // Blockquotes\n  var deepest = /<blockquote\\b[^>]*>((?:(?!<blockquote)[\\s\\S])*?)<\\/blockquote>/gi;\n  while(string.match(deepest)) {\n    string = string.replace(deepest, function(str) {\n      return replaceBlockquotes(str);\n    });\n  }\n\n  function replaceBlockquotes(html) {\n    html = html.replace(/<blockquote\\b[^>]*>([\\s\\S]*?)<\\/blockquote>/gi, function(str, inner) {\n      inner = inner.replace(/^\\s+|\\s+$/g, '');\n      inner = cleanUp(inner);\n      inner = inner.replace(/^/gm, '> ');\n      inner = inner.replace(/^(>([ \\t]{2,}>)+)/gm, '> >');\n      return inner;\n    });\n    return html;\n  }\n\n  function cleanUp(string) {\n    string = string.replace(/^[\\t\\r\\n]+|[\\t\\r\\n]+$/g, ''); // trim leading/trailing whitespace\n    string = string.replace(/\\n\\s+\\n/g, '\\n\\n');\n    string = string.replace(/\\n{3,}/g, '\\n\\n'); // limit consecutive linebreaks to 2\n    return string;\n  }\n\n  return cleanUp(string);\n};\n\nif (typeof exports === 'object') {\n  exports.toMarkdown = toMarkdown;\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/metisMenu/jquery.metisMenu.js",
    "content": "/*\n * metismenu - v1.1.3\n * Easy menu jQuery plugin for Twitter Bootstrap 3\n * https://github.com/onokumus/metisMenu\n *\n * Made by Osman Nuri Okumus\n * Under MIT License\n */\n;(function($, window, document, undefined) {\n\n    var pluginName = \"metisMenu\",\n        defaults = {\n            toggle: true,\n            doubleTapToGo: false\n        };\n\n    function Plugin(element, options) {\n        this.element = $(element);\n        this.settings = $.extend({}, defaults, options);\n        this._defaults = defaults;\n        this._name = pluginName;\n        this.init();\n    }\n\n    Plugin.prototype = {\n        init: function() {\n\n            var $this = this.element,\n                $toggle = this.settings.toggle,\n                obj = this;\n\n            if (this.isIE() <= 9) {\n                $this.find(\"li.active\").has(\"ul\").children(\"ul\").collapse(\"show\");\n                $this.find(\"li\").not(\".active\").has(\"ul\").children(\"ul\").collapse(\"hide\");\n            } else {\n                $this.find(\"li.active\").has(\"ul\").children(\"ul\").addClass(\"collapse in\");\n                $this.find(\"li\").not(\".active\").has(\"ul\").children(\"ul\").addClass(\"collapse\");\n            }\n\n            //add the \"doubleTapToGo\" class to active items if needed\n            if (obj.settings.doubleTapToGo) {\n                $this.find(\"li.active\").has(\"ul\").children(\"a\").addClass(\"doubleTapToGo\");\n            }\n\n            $this.find(\"li\").has(\"ul\").children(\"a\").on(\"click\" + \".\" + pluginName, function(e) {\n                e.preventDefault();\n\n                //Do we need to enable the double tap\n                if (obj.settings.doubleTapToGo) {\n\n                    //if we hit a second time on the link and the href is valid, navigate to that url\n                    if (obj.doubleTapToGo($(this)) && $(this).attr(\"href\") !== \"#\" && $(this).attr(\"href\") !== \"\") {\n                        e.stopPropagation();\n                        document.location = $(this).attr(\"href\");\n                        return;\n                    }\n                }\n\n                $(this).parent(\"li\").toggleClass(\"active\").children(\"ul\").collapse(\"toggle\");\n\n                if ($toggle) {\n                    $(this).parent(\"li\").siblings().removeClass(\"active\").children(\"ul.in\").collapse(\"hide\");\n                }\n\n            });\n        },\n\n        isIE: function() { //https://gist.github.com/padolsey/527683\n            var undef,\n                v = 3,\n                div = document.createElement(\"div\"),\n                all = div.getElementsByTagName(\"i\");\n\n            while (\n                div.innerHTML = \"<!--[if gt IE \" + (++v) + \"]><i></i><![endif]-->\",\n                    all[0]\n                ) {\n                return v > 4 ? v : undef;\n            }\n        },\n\n        //Enable the link on the second click.\n        doubleTapToGo: function(elem) {\n            var $this = this.element;\n\n            //if the class \"doubleTapToGo\" exists, remove it and return\n            if (elem.hasClass(\"doubleTapToGo\")) {\n                elem.removeClass(\"doubleTapToGo\");\n                return true;\n            }\n\n            //does not exists, add a new class and return false\n            if (elem.parent().children(\"ul\").length) {\n                //first remove all other class\n                $this.find(\".doubleTapToGo\").removeClass(\"doubleTapToGo\");\n                //add the class on the current element\n                elem.addClass(\"doubleTapToGo\");\n                return false;\n            }\n        },\n\n        remove: function() {\n            this.element.off(\".\" + pluginName);\n            this.element.removeData(pluginName);\n        }\n\n    };\n\n    $.fn[pluginName] = function(options) {\n        this.each(function () {\n            var el = $(this);\n            if (el.data(pluginName)) {\n                el.data(pluginName).remove();\n            }\n            el.data(pluginName, new Plugin(this, options));\n        });\n        return this;\n    };\n\n})(jQuery, window, document);\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/morris/morris.js",
    "content": "(function() {\n  var $, Morris, minutesSpecHelper, secondsSpecHelper,\n    __slice = [].slice,\n    __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n    __hasProp = {}.hasOwnProperty,\n    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n  Morris = window.Morris = {};\n\n  $ = jQuery;\n\n  Morris.EventEmitter = (function() {\n    function EventEmitter() {}\n\n    EventEmitter.prototype.on = function(name, handler) {\n      if (this.handlers == null) {\n        this.handlers = {};\n      }\n      if (this.handlers[name] == null) {\n        this.handlers[name] = [];\n      }\n      this.handlers[name].push(handler);\n      return this;\n    };\n\n    EventEmitter.prototype.fire = function() {\n      var args, handler, name, _i, _len, _ref, _results;\n      name = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n      if ((this.handlers != null) && (this.handlers[name] != null)) {\n        _ref = this.handlers[name];\n        _results = [];\n        for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n          handler = _ref[_i];\n          _results.push(handler.apply(null, args));\n        }\n        return _results;\n      }\n    };\n\n    return EventEmitter;\n\n  })();\n\n  Morris.commas = function(num) {\n    var absnum, intnum, ret, strabsnum;\n    if (num != null) {\n      ret = num < 0 ? \"-\" : \"\";\n      absnum = Math.abs(num);\n      intnum = Math.floor(absnum).toFixed(0);\n      ret += intnum.replace(/(?=(?:\\d{3})+$)(?!^)/g, ',');\n      strabsnum = absnum.toString();\n      if (strabsnum.length > intnum.length) {\n        ret += strabsnum.slice(intnum.length);\n      }\n      return ret;\n    } else {\n      return '-';\n    }\n  };\n\n  Morris.pad2 = function(number) {\n    return (number < 10 ? '0' : '') + number;\n  };\n\n  Morris.Grid = (function(_super) {\n    __extends(Grid, _super);\n\n    function Grid(options) {\n      this.resizeHandler = __bind(this.resizeHandler, this);\n      var _this = this;\n      if (typeof options.element === 'string') {\n        this.el = $(document.getElementById(options.element));\n      } else {\n        this.el = $(options.element);\n      }\n      if ((this.el == null) || this.el.length === 0) {\n        throw new Error(\"Graph container element not found\");\n      }\n      if (this.el.css('position') === 'static') {\n        this.el.css('position', 'relative');\n      }\n      this.options = $.extend({}, this.gridDefaults, this.defaults || {}, options);\n      if (typeof this.options.units === 'string') {\n        this.options.postUnits = options.units;\n      }\n      this.raphael = new Raphael(this.el[0]);\n      this.elementWidth = null;\n      this.elementHeight = null;\n      this.dirty = false;\n      this.selectFrom = null;\n      if (this.init) {\n        this.init();\n      }\n      this.setData(this.options.data);\n      this.el.bind('mousemove', function(evt) {\n        var left, offset, right, width, x;\n        offset = _this.el.offset();\n        x = evt.pageX - offset.left;\n        if (_this.selectFrom) {\n          left = _this.data[_this.hitTest(Math.min(x, _this.selectFrom))]._x;\n          right = _this.data[_this.hitTest(Math.max(x, _this.selectFrom))]._x;\n          width = right - left;\n          return _this.selectionRect.attr({\n            x: left,\n            width: width\n          });\n        } else {\n          return _this.fire('hovermove', x, evt.pageY - offset.top);\n        }\n      });\n      this.el.bind('mouseleave', function(evt) {\n        if (_this.selectFrom) {\n          _this.selectionRect.hide();\n          _this.selectFrom = null;\n        }\n        return _this.fire('hoverout');\n      });\n      this.el.bind('touchstart touchmove touchend', function(evt) {\n        var offset, touch;\n        touch = evt.originalEvent.touches[0] || evt.originalEvent.changedTouches[0];\n        offset = _this.el.offset();\n        _this.fire('hover', touch.pageX - offset.left, touch.pageY - offset.top);\n        return touch;\n      });\n      this.el.bind('click', function(evt) {\n        var offset;\n        offset = _this.el.offset();\n        return _this.fire('gridclick', evt.pageX - offset.left, evt.pageY - offset.top);\n      });\n      if (this.options.rangeSelect) {\n        this.selectionRect = this.raphael.rect(0, 0, 0, this.el.innerHeight()).attr({\n          fill: this.options.rangeSelectColor,\n          stroke: false\n        }).toBack().hide();\n        this.el.bind('mousedown', function(evt) {\n          var offset;\n          offset = _this.el.offset();\n          return _this.startRange(evt.pageX - offset.left);\n        });\n        this.el.bind('mouseup', function(evt) {\n          var offset;\n          offset = _this.el.offset();\n          _this.endRange(evt.pageX - offset.left);\n          return _this.fire('hovermove', evt.pageX - offset.left, evt.pageY - offset.top);\n        });\n      }\n      if (this.options.resize) {\n        $(window).bind('resize', function(evt) {\n          if (_this.timeoutId != null) {\n            window.clearTimeout(_this.timeoutId);\n          }\n          return _this.timeoutId = window.setTimeout(_this.resizeHandler, 100);\n        });\n      }\n      if (this.postInit) {\n        this.postInit();\n      }\n    }\n\n    Grid.prototype.gridDefaults = {\n      dateFormat: null,\n      axes: true,\n      grid: true,\n      gridLineColor: '#aaa',\n      gridStrokeWidth: 0.5,\n      gridTextColor: '#888',\n      gridTextSize: 12,\n      gridTextFamily: 'sans-serif',\n      gridTextWeight: 'normal',\n      hideHover: false,\n      yLabelFormat: null,\n      xLabelAngle: 0,\n      numLines: 5,\n      padding: 25,\n      parseTime: true,\n      postUnits: '',\n      preUnits: '',\n      ymax: 'auto',\n      ymin: 'auto 0',\n      goals: [],\n      goalStrokeWidth: 1.0,\n      goalLineColors: ['#666633', '#999966', '#cc6666', '#663333'],\n      events: [],\n      eventStrokeWidth: 1.0,\n      eventLineColors: ['#005a04', '#ccffbb', '#3a5f0b', '#005502'],\n      rangeSelect: null,\n      rangeSelectColor: '#eef',\n      resize: false\n    };\n\n    Grid.prototype.setData = function(data, redraw) {\n      var e, idx, index, maxGoal, minGoal, ret, row, step, total, y, ykey, ymax, ymin, yval, _ref;\n      if (redraw == null) {\n        redraw = true;\n      }\n      this.options.data = data;\n      if ((data == null) || data.length === 0) {\n        this.data = [];\n        this.raphael.clear();\n        if (this.hover != null) {\n          this.hover.hide();\n        }\n        return;\n      }\n      ymax = this.cumulative ? 0 : null;\n      ymin = this.cumulative ? 0 : null;\n      if (this.options.goals.length > 0) {\n        minGoal = Math.min.apply(Math, this.options.goals);\n        maxGoal = Math.max.apply(Math, this.options.goals);\n        ymin = ymin != null ? Math.min(ymin, minGoal) : minGoal;\n        ymax = ymax != null ? Math.max(ymax, maxGoal) : maxGoal;\n      }\n      this.data = (function() {\n        var _i, _len, _results;\n        _results = [];\n        for (index = _i = 0, _len = data.length; _i < _len; index = ++_i) {\n          row = data[index];\n          ret = {\n            src: row\n          };\n          ret.label = row[this.options.xkey];\n          if (this.options.parseTime) {\n            ret.x = Morris.parseDate(ret.label);\n            if (this.options.dateFormat) {\n              ret.label = this.options.dateFormat(ret.x);\n            } else if (typeof ret.label === 'number') {\n              ret.label = new Date(ret.label).toString();\n            }\n          } else {\n            ret.x = index;\n            if (this.options.xLabelFormat) {\n              ret.label = this.options.xLabelFormat(ret);\n            }\n          }\n          total = 0;\n          ret.y = (function() {\n            var _j, _len1, _ref, _results1;\n            _ref = this.options.ykeys;\n            _results1 = [];\n            for (idx = _j = 0, _len1 = _ref.length; _j < _len1; idx = ++_j) {\n              ykey = _ref[idx];\n              yval = row[ykey];\n              if (typeof yval === 'string') {\n                yval = parseFloat(yval);\n              }\n              if ((yval != null) && typeof yval !== 'number') {\n                yval = null;\n              }\n              if (yval != null) {\n                if (this.cumulative) {\n                  total += yval;\n                } else {\n                  if (ymax != null) {\n                    ymax = Math.max(yval, ymax);\n                    ymin = Math.min(yval, ymin);\n                  } else {\n                    ymax = ymin = yval;\n                  }\n                }\n              }\n              if (this.cumulative && (total != null)) {\n                ymax = Math.max(total, ymax);\n                ymin = Math.min(total, ymin);\n              }\n              _results1.push(yval);\n            }\n            return _results1;\n          }).call(this);\n          _results.push(ret);\n        }\n        return _results;\n      }).call(this);\n      if (this.options.parseTime) {\n        this.data = this.data.sort(function(a, b) {\n          return (a.x > b.x) - (b.x > a.x);\n        });\n      }\n      this.xmin = this.data[0].x;\n      this.xmax = this.data[this.data.length - 1].x;\n      this.events = [];\n      if (this.options.events.length > 0) {\n        if (this.options.parseTime) {\n          this.events = (function() {\n            var _i, _len, _ref, _results;\n            _ref = this.options.events;\n            _results = [];\n            for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n              e = _ref[_i];\n              _results.push(Morris.parseDate(e));\n            }\n            return _results;\n          }).call(this);\n        } else {\n          this.events = this.options.events;\n        }\n        this.xmax = Math.max(this.xmax, Math.max.apply(Math, this.events));\n        this.xmin = Math.min(this.xmin, Math.min.apply(Math, this.events));\n      }\n      if (this.xmin === this.xmax) {\n        this.xmin -= 1;\n        this.xmax += 1;\n      }\n      this.ymin = this.yboundary('min', ymin);\n      this.ymax = this.yboundary('max', ymax);\n      if (this.ymin === this.ymax) {\n        if (ymin) {\n          this.ymin -= 1;\n        }\n        this.ymax += 1;\n      }\n      if (((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'y') || this.options.grid === true) {\n        if (this.options.ymax === this.gridDefaults.ymax && this.options.ymin === this.gridDefaults.ymin) {\n          this.grid = this.autoGridLines(this.ymin, this.ymax, this.options.numLines);\n          this.ymin = Math.min(this.ymin, this.grid[0]);\n          this.ymax = Math.max(this.ymax, this.grid[this.grid.length - 1]);\n        } else {\n          step = (this.ymax - this.ymin) / (this.options.numLines - 1);\n          this.grid = (function() {\n            var _i, _ref1, _ref2, _results;\n            _results = [];\n            for (y = _i = _ref1 = this.ymin, _ref2 = this.ymax; step > 0 ? _i <= _ref2 : _i >= _ref2; y = _i += step) {\n              _results.push(y);\n            }\n            return _results;\n          }).call(this);\n        }\n      }\n      this.dirty = true;\n      if (redraw) {\n        return this.redraw();\n      }\n    };\n\n    Grid.prototype.yboundary = function(boundaryType, currentValue) {\n      var boundaryOption, suggestedValue;\n      boundaryOption = this.options[\"y\" + boundaryType];\n      if (typeof boundaryOption === 'string') {\n        if (boundaryOption.slice(0, 4) === 'auto') {\n          if (boundaryOption.length > 5) {\n            suggestedValue = parseInt(boundaryOption.slice(5), 10);\n            if (currentValue == null) {\n              return suggestedValue;\n            }\n            return Math[boundaryType](currentValue, suggestedValue);\n          } else {\n            if (currentValue != null) {\n              return currentValue;\n            } else {\n              return 0;\n            }\n          }\n        } else {\n          return parseInt(boundaryOption, 10);\n        }\n      } else {\n        return boundaryOption;\n      }\n    };\n\n    Grid.prototype.autoGridLines = function(ymin, ymax, nlines) {\n      var gmax, gmin, grid, smag, span, step, unit, y, ymag;\n      span = ymax - ymin;\n      ymag = Math.floor(Math.log(span) / Math.log(10));\n      unit = Math.pow(10, ymag);\n      gmin = Math.floor(ymin / unit) * unit;\n      gmax = Math.ceil(ymax / unit) * unit;\n      step = (gmax - gmin) / (nlines - 1);\n      if (unit === 1 && step > 1 && Math.ceil(step) !== step) {\n        step = Math.ceil(step);\n        gmax = gmin + step * (nlines - 1);\n      }\n      if (gmin < 0 && gmax > 0) {\n        gmin = Math.floor(ymin / step) * step;\n        gmax = Math.ceil(ymax / step) * step;\n      }\n      if (step < 1) {\n        smag = Math.floor(Math.log(step) / Math.log(10));\n        grid = (function() {\n          var _i, _results;\n          _results = [];\n          for (y = _i = gmin; step > 0 ? _i <= gmax : _i >= gmax; y = _i += step) {\n            _results.push(parseFloat(y.toFixed(1 - smag)));\n          }\n          return _results;\n        })();\n      } else {\n        grid = (function() {\n          var _i, _results;\n          _results = [];\n          for (y = _i = gmin; step > 0 ? _i <= gmax : _i >= gmax; y = _i += step) {\n            _results.push(y);\n          }\n          return _results;\n        })();\n      }\n      return grid;\n    };\n\n    Grid.prototype._calc = function() {\n      var bottomOffsets, gridLine, h, i, w, yLabelWidths, _ref, _ref1;\n      w = this.el.width();\n      h = this.el.height();\n      if (this.elementWidth !== w || this.elementHeight !== h || this.dirty) {\n        this.elementWidth = w;\n        this.elementHeight = h;\n        this.dirty = false;\n        this.left = this.options.padding;\n        this.right = this.elementWidth - this.options.padding;\n        this.top = this.options.padding;\n        this.bottom = this.elementHeight - this.options.padding;\n        if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'y') {\n          yLabelWidths = (function() {\n            var _i, _len, _ref1, _results;\n            _ref1 = this.grid;\n            _results = [];\n            for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n              gridLine = _ref1[_i];\n              _results.push(this.measureText(this.yAxisFormat(gridLine)).width);\n            }\n            return _results;\n          }).call(this);\n          this.left += Math.max.apply(Math, yLabelWidths);\n        }\n        if ((_ref1 = this.options.axes) === true || _ref1 === 'both' || _ref1 === 'x') {\n          bottomOffsets = (function() {\n            var _i, _ref2, _results;\n            _results = [];\n            for (i = _i = 0, _ref2 = this.data.length; 0 <= _ref2 ? _i < _ref2 : _i > _ref2; i = 0 <= _ref2 ? ++_i : --_i) {\n              _results.push(this.measureText(this.data[i].text, -this.options.xLabelAngle).height);\n            }\n            return _results;\n          }).call(this);\n          this.bottom -= Math.max.apply(Math, bottomOffsets);\n        }\n        this.width = Math.max(1, this.right - this.left);\n        this.height = Math.max(1, this.bottom - this.top);\n        this.dx = this.width / (this.xmax - this.xmin);\n        this.dy = this.height / (this.ymax - this.ymin);\n        if (this.calc) {\n          return this.calc();\n        }\n      }\n    };\n\n    Grid.prototype.transY = function(y) {\n      return this.bottom - (y - this.ymin) * this.dy;\n    };\n\n    Grid.prototype.transX = function(x) {\n      if (this.data.length === 1) {\n        return (this.left + this.right) / 2;\n      } else {\n        return this.left + (x - this.xmin) * this.dx;\n      }\n    };\n\n    Grid.prototype.redraw = function() {\n      this.raphael.clear();\n      this._calc();\n      this.drawGrid();\n      this.drawGoals();\n      this.drawEvents();\n      if (this.draw) {\n        return this.draw();\n      }\n    };\n\n    Grid.prototype.measureText = function(text, angle) {\n      var ret, tt;\n      if (angle == null) {\n        angle = 0;\n      }\n      tt = this.raphael.text(100, 100, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).rotate(angle);\n      ret = tt.getBBox();\n      tt.remove();\n      return ret;\n    };\n\n    Grid.prototype.yAxisFormat = function(label) {\n      return this.yLabelFormat(label);\n    };\n\n    Grid.prototype.yLabelFormat = function(label) {\n      if (typeof this.options.yLabelFormat === 'function') {\n        return this.options.yLabelFormat(label);\n      } else {\n        return \"\" + this.options.preUnits + (Morris.commas(label)) + this.options.postUnits;\n      }\n    };\n\n    Grid.prototype.drawGrid = function() {\n      var lineY, y, _i, _len, _ref, _ref1, _ref2, _results;\n      if (this.options.grid === false && ((_ref = this.options.axes) !== true && _ref !== 'both' && _ref !== 'y')) {\n        return;\n      }\n      _ref1 = this.grid;\n      _results = [];\n      for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n        lineY = _ref1[_i];\n        y = this.transY(lineY);\n        if ((_ref2 = this.options.axes) === true || _ref2 === 'both' || _ref2 === 'y') {\n          this.drawYAxisLabel(this.left - this.options.padding / 2, y, this.yAxisFormat(lineY));\n        }\n        if (this.options.grid) {\n          _results.push(this.drawGridLine(\"M\" + this.left + \",\" + y + \"H\" + (this.left + this.width)));\n        } else {\n          _results.push(void 0);\n        }\n      }\n      return _results;\n    };\n\n    Grid.prototype.drawGoals = function() {\n      var color, goal, i, _i, _len, _ref, _results;\n      _ref = this.options.goals;\n      _results = [];\n      for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {\n        goal = _ref[i];\n        color = this.options.goalLineColors[i % this.options.goalLineColors.length];\n        _results.push(this.drawGoal(goal, color));\n      }\n      return _results;\n    };\n\n    Grid.prototype.drawEvents = function() {\n      var color, event, i, _i, _len, _ref, _results;\n      _ref = this.events;\n      _results = [];\n      for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {\n        event = _ref[i];\n        color = this.options.eventLineColors[i % this.options.eventLineColors.length];\n        _results.push(this.drawEvent(event, color));\n      }\n      return _results;\n    };\n\n    Grid.prototype.drawGoal = function(goal, color) {\n      return this.raphael.path(\"M\" + this.left + \",\" + (this.transY(goal)) + \"H\" + this.right).attr('stroke', color).attr('stroke-width', this.options.goalStrokeWidth);\n    };\n\n    Grid.prototype.drawEvent = function(event, color) {\n      return this.raphael.path(\"M\" + (this.transX(event)) + \",\" + this.bottom + \"V\" + this.top).attr('stroke', color).attr('stroke-width', this.options.eventStrokeWidth);\n    };\n\n    Grid.prototype.drawYAxisLabel = function(xPos, yPos, text) {\n      return this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor).attr('text-anchor', 'end');\n    };\n\n    Grid.prototype.drawGridLine = function(path) {\n      return this.raphael.path(path).attr('stroke', this.options.gridLineColor).attr('stroke-width', this.options.gridStrokeWidth);\n    };\n\n    Grid.prototype.startRange = function(x) {\n      this.hover.hide();\n      this.selectFrom = x;\n      return this.selectionRect.attr({\n        x: x,\n        width: 0\n      }).show();\n    };\n\n    Grid.prototype.endRange = function(x) {\n      var end, start;\n      if (this.selectFrom) {\n        start = Math.min(this.selectFrom, x);\n        end = Math.max(this.selectFrom, x);\n        this.options.rangeSelect.call(this.el, {\n          start: this.data[this.hitTest(start)].x,\n          end: this.data[this.hitTest(end)].x\n        });\n        return this.selectFrom = null;\n      }\n    };\n\n    Grid.prototype.resizeHandler = function() {\n      this.timeoutId = null;\n      this.raphael.setSize(this.el.width(), this.el.height());\n      return this.redraw();\n    };\n\n    return Grid;\n\n  })(Morris.EventEmitter);\n\n  Morris.parseDate = function(date) {\n    var isecs, m, msecs, n, o, offsetmins, p, q, r, ret, secs;\n    if (typeof date === 'number') {\n      return date;\n    }\n    m = date.match(/^(\\d+) Q(\\d)$/);\n    n = date.match(/^(\\d+)-(\\d+)$/);\n    o = date.match(/^(\\d+)-(\\d+)-(\\d+)$/);\n    p = date.match(/^(\\d+) W(\\d+)$/);\n    q = date.match(/^(\\d+)-(\\d+)-(\\d+)[ T](\\d+):(\\d+)(Z|([+-])(\\d\\d):?(\\d\\d))?$/);\n    r = date.match(/^(\\d+)-(\\d+)-(\\d+)[ T](\\d+):(\\d+):(\\d+(\\.\\d+)?)(Z|([+-])(\\d\\d):?(\\d\\d))?$/);\n    if (m) {\n      return new Date(parseInt(m[1], 10), parseInt(m[2], 10) * 3 - 1, 1).getTime();\n    } else if (n) {\n      return new Date(parseInt(n[1], 10), parseInt(n[2], 10) - 1, 1).getTime();\n    } else if (o) {\n      return new Date(parseInt(o[1], 10), parseInt(o[2], 10) - 1, parseInt(o[3], 10)).getTime();\n    } else if (p) {\n      ret = new Date(parseInt(p[1], 10), 0, 1);\n      if (ret.getDay() !== 4) {\n        ret.setMonth(0, 1 + ((4 - ret.getDay()) + 7) % 7);\n      }\n      return ret.getTime() + parseInt(p[2], 10) * 604800000;\n    } else if (q) {\n      if (!q[6]) {\n        return new Date(parseInt(q[1], 10), parseInt(q[2], 10) - 1, parseInt(q[3], 10), parseInt(q[4], 10), parseInt(q[5], 10)).getTime();\n      } else {\n        offsetmins = 0;\n        if (q[6] !== 'Z') {\n          offsetmins = parseInt(q[8], 10) * 60 + parseInt(q[9], 10);\n          if (q[7] === '+') {\n            offsetmins = 0 - offsetmins;\n          }\n        }\n        return Date.UTC(parseInt(q[1], 10), parseInt(q[2], 10) - 1, parseInt(q[3], 10), parseInt(q[4], 10), parseInt(q[5], 10) + offsetmins);\n      }\n    } else if (r) {\n      secs = parseFloat(r[6]);\n      isecs = Math.floor(secs);\n      msecs = Math.round((secs - isecs) * 1000);\n      if (!r[8]) {\n        return new Date(parseInt(r[1], 10), parseInt(r[2], 10) - 1, parseInt(r[3], 10), parseInt(r[4], 10), parseInt(r[5], 10), isecs, msecs).getTime();\n      } else {\n        offsetmins = 0;\n        if (r[8] !== 'Z') {\n          offsetmins = parseInt(r[10], 10) * 60 + parseInt(r[11], 10);\n          if (r[9] === '+') {\n            offsetmins = 0 - offsetmins;\n          }\n        }\n        return Date.UTC(parseInt(r[1], 10), parseInt(r[2], 10) - 1, parseInt(r[3], 10), parseInt(r[4], 10), parseInt(r[5], 10) + offsetmins, isecs, msecs);\n      }\n    } else {\n      return new Date(parseInt(date, 10), 0, 1).getTime();\n    }\n  };\n\n  Morris.Hover = (function() {\n    Hover.defaults = {\n      \"class\": 'morris-hover morris-default-style'\n    };\n\n    function Hover(options) {\n      if (options == null) {\n        options = {};\n      }\n      this.options = $.extend({}, Morris.Hover.defaults, options);\n      this.el = $(\"<div class='\" + this.options[\"class\"] + \"'></div>\");\n      this.el.hide();\n      this.options.parent.append(this.el);\n    }\n\n    Hover.prototype.update = function(html, x, y) {\n      this.html;\n      this.show();\n      return this.moveTo(x, y);\n    };\n\n    Hover.prototype.html = function(content) {\n      return this.el.html(content);\n    };\n\n    Hover.prototype.moveTo = function(x, y) {\n      var hoverHeight, hoverWidth, left, parentHeight, parentWidth, top;\n      parentWidth = this.options.parent.innerWidth();\n      parentHeight = this.options.parent.innerHeight();\n      hoverWidth = this.el.outerWidth();\n      hoverHeight = this.el.outerHeight();\n      left = Math.min(Math.max(0, x - hoverWidth / 2), parentWidth - hoverWidth);\n      if (y != null) {\n        top = y - hoverHeight - 10;\n        if (top < 0) {\n          top = y + 10;\n          if (top + hoverHeight > parentHeight) {\n            top = parentHeight / 2 - hoverHeight / 2;\n          }\n        }\n      } else {\n        top = parentHeight / 2 - hoverHeight / 2;\n      }\n      return this.el.css({\n        left: left + \"px\",\n        top: parseInt(top) + \"px\"\n      });\n    };\n\n    Hover.prototype.show = function() {\n      return this.el.show();\n    };\n\n    Hover.prototype.hide = function() {\n      return this.el.hide();\n    };\n\n    return Hover;\n\n  })();\n\n  Morris.Line = (function(_super) {\n    __extends(Line, _super);\n\n    function Line(options) {\n      this.hilight = __bind(this.hilight, this);\n      this.onHoverOut = __bind(this.onHoverOut, this);\n      this.onHoverMove = __bind(this.onHoverMove, this);\n      this.onGridClick = __bind(this.onGridClick, this);\n      if (!(this instanceof Morris.Line)) {\n        return new Morris.Line(options);\n      }\n      Line.__super__.constructor.call(this, options);\n    }\n\n    Line.prototype.init = function() {\n      if (this.options.hideHover !== 'always') {\n        this.hover = new Morris.Hover({\n          parent: this.el\n        });\n        this.on('hovermove', this.onHoverMove);\n        this.on('hoverout', this.onHoverOut);\n        return this.on('gridclick', this.onGridClick);\n      }\n    };\n\n    Line.prototype.defaults = {\n      lineWidth: 3,\n      pointSize: 4,\n      lineColors: ['#0b62a4', '#7A92A3', '#4da74d', '#afd8f8', '#edc240', '#cb4b4b', '#9440ed'],\n      pointStrokeWidths: [1],\n      pointStrokeColors: ['#ffffff'],\n      pointFillColors: [],\n      smooth: true,\n      xLabels: 'auto',\n      xLabelFormat: null,\n      xLabelMargin: 24,\n      continuousLine: true,\n      hideHover: false\n    };\n\n    Line.prototype.calc = function() {\n      this.calcPoints();\n      return this.generatePaths();\n    };\n\n    Line.prototype.calcPoints = function() {\n      var row, y, _i, _len, _ref, _results;\n      _ref = this.data;\n      _results = [];\n      for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n        row = _ref[_i];\n        row._x = this.transX(row.x);\n        row._y = (function() {\n          var _j, _len1, _ref1, _results1;\n          _ref1 = row.y;\n          _results1 = [];\n          for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {\n            y = _ref1[_j];\n            if (y != null) {\n              _results1.push(this.transY(y));\n            } else {\n              _results1.push(y);\n            }\n          }\n          return _results1;\n        }).call(this);\n        _results.push(row._ymax = Math.min.apply(Math, [this.bottom].concat((function() {\n          var _j, _len1, _ref1, _results1;\n          _ref1 = row._y;\n          _results1 = [];\n          for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {\n            y = _ref1[_j];\n            if (y != null) {\n              _results1.push(y);\n            }\n          }\n          return _results1;\n        })())));\n      }\n      return _results;\n    };\n\n    Line.prototype.hitTest = function(x) {\n      var index, r, _i, _len, _ref;\n      if (this.data.length === 0) {\n        return null;\n      }\n      _ref = this.data.slice(1);\n      for (index = _i = 0, _len = _ref.length; _i < _len; index = ++_i) {\n        r = _ref[index];\n        if (x < (r._x + this.data[index]._x) / 2) {\n          break;\n        }\n      }\n      return index;\n    };\n\n    Line.prototype.onGridClick = function(x, y) {\n      var index;\n      index = this.hitTest(x);\n      return this.fire('click', index, this.data[index].src, x, y);\n    };\n\n    Line.prototype.onHoverMove = function(x, y) {\n      var index;\n      index = this.hitTest(x);\n      return this.displayHoverForRow(index);\n    };\n\n    Line.prototype.onHoverOut = function() {\n      if (this.options.hideHover !== false) {\n        return this.displayHoverForRow(null);\n      }\n    };\n\n    Line.prototype.displayHoverForRow = function(index) {\n      var _ref;\n      if (index != null) {\n        (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(index));\n        return this.hilight(index);\n      } else {\n        this.hover.hide();\n        return this.hilight();\n      }\n    };\n\n    Line.prototype.hoverContentForRow = function(index) {\n      var content, j, row, y, _i, _len, _ref;\n      row = this.data[index];\n      content = \"<div class='morris-hover-row-label'>\" + row.label + \"</div>\";\n      _ref = row.y;\n      for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) {\n        y = _ref[j];\n        content += \"<div class='morris-hover-point' style='color: \" + (this.colorFor(row, j, 'label')) + \"'>\\n  \" + this.options.labels[j] + \":\\n  \" + (this.yLabelFormat(y)) + \"\\n</div>\";\n      }\n      if (typeof this.options.hoverCallback === 'function') {\n        content = this.options.hoverCallback(index, this.options, content, row.src);\n      }\n      return [content, row._x, row._ymax];\n    };\n\n    Line.prototype.generatePaths = function() {\n      var c, coords, i, r, smooth;\n      return this.paths = (function() {\n        var _i, _ref, _ref1, _results;\n        _results = [];\n        for (i = _i = 0, _ref = this.options.ykeys.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {\n          smooth = typeof this.options.smooth === \"boolean\" ? this.options.smooth : (_ref1 = this.options.ykeys[i], __indexOf.call(this.options.smooth, _ref1) >= 0);\n          coords = (function() {\n            var _j, _len, _ref2, _results1;\n            _ref2 = this.data;\n            _results1 = [];\n            for (_j = 0, _len = _ref2.length; _j < _len; _j++) {\n              r = _ref2[_j];\n              if (r._y[i] !== void 0) {\n                _results1.push({\n                  x: r._x,\n                  y: r._y[i]\n                });\n              }\n            }\n            return _results1;\n          }).call(this);\n          if (this.options.continuousLine) {\n            coords = (function() {\n              var _j, _len, _results1;\n              _results1 = [];\n              for (_j = 0, _len = coords.length; _j < _len; _j++) {\n                c = coords[_j];\n                if (c.y !== null) {\n                  _results1.push(c);\n                }\n              }\n              return _results1;\n            })();\n          }\n          if (coords.length > 1) {\n            _results.push(Morris.Line.createPath(coords, smooth, this.bottom));\n          } else {\n            _results.push(null);\n          }\n        }\n        return _results;\n      }).call(this);\n    };\n\n    Line.prototype.draw = function() {\n      var _ref;\n      if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'x') {\n        this.drawXAxis();\n      }\n      this.drawSeries();\n      if (this.options.hideHover === false) {\n        return this.displayHoverForRow(this.data.length - 1);\n      }\n    };\n\n    Line.prototype.drawXAxis = function() {\n      var drawLabel, l, labels, prevAngleMargin, prevLabelMargin, row, ypos, _i, _len, _results,\n        _this = this;\n      ypos = this.bottom + this.options.padding / 2;\n      prevLabelMargin = null;\n      prevAngleMargin = null;\n      drawLabel = function(labelText, xpos) {\n        var label, labelBox, margin, offset, textBox;\n        label = _this.drawXAxisLabel(_this.transX(xpos), ypos, labelText);\n        textBox = label.getBBox();\n        label.transform(\"r\" + (-_this.options.xLabelAngle));\n        labelBox = label.getBBox();\n        label.transform(\"t0,\" + (labelBox.height / 2) + \"...\");\n        if (_this.options.xLabelAngle !== 0) {\n          offset = -0.5 * textBox.width * Math.cos(_this.options.xLabelAngle * Math.PI / 180.0);\n          label.transform(\"t\" + offset + \",0...\");\n        }\n        labelBox = label.getBBox();\n        if (((prevLabelMargin == null) || prevLabelMargin >= labelBox.x + labelBox.width || (prevAngleMargin != null) && prevAngleMargin >= labelBox.x) && labelBox.x >= 0 && (labelBox.x + labelBox.width) < _this.el.width()) {\n          if (_this.options.xLabelAngle !== 0) {\n            margin = 1.25 * _this.options.gridTextSize / Math.sin(_this.options.xLabelAngle * Math.PI / 180.0);\n            prevAngleMargin = labelBox.x - margin;\n          }\n          return prevLabelMargin = labelBox.x - _this.options.xLabelMargin;\n        } else {\n          return label.remove();\n        }\n      };\n      if (this.options.parseTime) {\n        if (this.data.length === 1 && this.options.xLabels === 'auto') {\n          labels = [[this.data[0].label, this.data[0].x]];\n        } else {\n          labels = Morris.labelSeries(this.xmin, this.xmax, this.width, this.options.xLabels, this.options.xLabelFormat);\n        }\n      } else {\n        labels = (function() {\n          var _i, _len, _ref, _results;\n          _ref = this.data;\n          _results = [];\n          for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n            row = _ref[_i];\n            _results.push([row.label, row.x]);\n          }\n          return _results;\n        }).call(this);\n      }\n      labels.reverse();\n      _results = [];\n      for (_i = 0, _len = labels.length; _i < _len; _i++) {\n        l = labels[_i];\n        _results.push(drawLabel(l[0], l[1]));\n      }\n      return _results;\n    };\n\n    Line.prototype.drawSeries = function() {\n      var i, _i, _j, _ref, _ref1, _results;\n      this.seriesPoints = [];\n      for (i = _i = _ref = this.options.ykeys.length - 1; _ref <= 0 ? _i <= 0 : _i >= 0; i = _ref <= 0 ? ++_i : --_i) {\n        this._drawLineFor(i);\n      }\n      _results = [];\n      for (i = _j = _ref1 = this.options.ykeys.length - 1; _ref1 <= 0 ? _j <= 0 : _j >= 0; i = _ref1 <= 0 ? ++_j : --_j) {\n        _results.push(this._drawPointFor(i));\n      }\n      return _results;\n    };\n\n    Line.prototype._drawPointFor = function(index) {\n      var circle, row, _i, _len, _ref, _results;\n      this.seriesPoints[index] = [];\n      _ref = this.data;\n      _results = [];\n      for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n        row = _ref[_i];\n        circle = null;\n        if (row._y[index] != null) {\n          circle = this.drawLinePoint(row._x, row._y[index], this.colorFor(row, index, 'point'), index);\n        }\n        _results.push(this.seriesPoints[index].push(circle));\n      }\n      return _results;\n    };\n\n    Line.prototype._drawLineFor = function(index) {\n      var path;\n      path = this.paths[index];\n      if (path !== null) {\n        return this.drawLinePath(path, this.colorFor(null, index, 'line'), index);\n      }\n    };\n\n    Line.createPath = function(coords, smooth, bottom) {\n      var coord, g, grads, i, ix, lg, path, prevCoord, x1, x2, y1, y2, _i, _len;\n      path = \"\";\n      if (smooth) {\n        grads = Morris.Line.gradients(coords);\n      }\n      prevCoord = {\n        y: null\n      };\n      for (i = _i = 0, _len = coords.length; _i < _len; i = ++_i) {\n        coord = coords[i];\n        if (coord.y != null) {\n          if (prevCoord.y != null) {\n            if (smooth) {\n              g = grads[i];\n              lg = grads[i - 1];\n              ix = (coord.x - prevCoord.x) / 4;\n              x1 = prevCoord.x + ix;\n              y1 = Math.min(bottom, prevCoord.y + ix * lg);\n              x2 = coord.x - ix;\n              y2 = Math.min(bottom, coord.y - ix * g);\n              path += \"C\" + x1 + \",\" + y1 + \",\" + x2 + \",\" + y2 + \",\" + coord.x + \",\" + coord.y;\n            } else {\n              path += \"L\" + coord.x + \",\" + coord.y;\n            }\n          } else {\n            if (!smooth || (grads[i] != null)) {\n              path += \"M\" + coord.x + \",\" + coord.y;\n            }\n          }\n        }\n        prevCoord = coord;\n      }\n      return path;\n    };\n\n    Line.gradients = function(coords) {\n      var coord, grad, i, nextCoord, prevCoord, _i, _len, _results;\n      grad = function(a, b) {\n        return (a.y - b.y) / (a.x - b.x);\n      };\n      _results = [];\n      for (i = _i = 0, _len = coords.length; _i < _len; i = ++_i) {\n        coord = coords[i];\n        if (coord.y != null) {\n          nextCoord = coords[i + 1] || {\n            y: null\n          };\n          prevCoord = coords[i - 1] || {\n            y: null\n          };\n          if ((prevCoord.y != null) && (nextCoord.y != null)) {\n            _results.push(grad(prevCoord, nextCoord));\n          } else if (prevCoord.y != null) {\n            _results.push(grad(prevCoord, coord));\n          } else if (nextCoord.y != null) {\n            _results.push(grad(coord, nextCoord));\n          } else {\n            _results.push(null);\n          }\n        } else {\n          _results.push(null);\n        }\n      }\n      return _results;\n    };\n\n    Line.prototype.hilight = function(index) {\n      var i, _i, _j, _ref, _ref1;\n      if (this.prevHilight !== null && this.prevHilight !== index) {\n        for (i = _i = 0, _ref = this.seriesPoints.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {\n          if (this.seriesPoints[i][this.prevHilight]) {\n            this.seriesPoints[i][this.prevHilight].animate(this.pointShrinkSeries(i));\n          }\n        }\n      }\n      if (index !== null && this.prevHilight !== index) {\n        for (i = _j = 0, _ref1 = this.seriesPoints.length - 1; 0 <= _ref1 ? _j <= _ref1 : _j >= _ref1; i = 0 <= _ref1 ? ++_j : --_j) {\n          if (this.seriesPoints[i][index]) {\n            this.seriesPoints[i][index].animate(this.pointGrowSeries(i));\n          }\n        }\n      }\n      return this.prevHilight = index;\n    };\n\n    Line.prototype.colorFor = function(row, sidx, type) {\n      if (typeof this.options.lineColors === 'function') {\n        return this.options.lineColors.call(this, row, sidx, type);\n      } else if (type === 'point') {\n        return this.options.pointFillColors[sidx % this.options.pointFillColors.length] || this.options.lineColors[sidx % this.options.lineColors.length];\n      } else {\n        return this.options.lineColors[sidx % this.options.lineColors.length];\n      }\n    };\n\n    Line.prototype.drawXAxisLabel = function(xPos, yPos, text) {\n      return this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor);\n    };\n\n    Line.prototype.drawLinePath = function(path, lineColor, lineIndex) {\n      return this.raphael.path(path).attr('stroke', lineColor).attr('stroke-width', this.lineWidthForSeries(lineIndex));\n    };\n\n    Line.prototype.drawLinePoint = function(xPos, yPos, pointColor, lineIndex) {\n      return this.raphael.circle(xPos, yPos, this.pointSizeForSeries(lineIndex)).attr('fill', pointColor).attr('stroke-width', this.pointStrokeWidthForSeries(lineIndex)).attr('stroke', this.pointStrokeColorForSeries(lineIndex));\n    };\n\n    Line.prototype.pointStrokeWidthForSeries = function(index) {\n      return this.options.pointStrokeWidths[index % this.options.pointStrokeWidths.length];\n    };\n\n    Line.prototype.pointStrokeColorForSeries = function(index) {\n      return this.options.pointStrokeColors[index % this.options.pointStrokeColors.length];\n    };\n\n    Line.prototype.lineWidthForSeries = function(index) {\n      if (this.options.lineWidth instanceof Array) {\n        return this.options.lineWidth[index % this.options.lineWidth.length];\n      } else {\n        return this.options.lineWidth;\n      }\n    };\n\n    Line.prototype.pointSizeForSeries = function(index) {\n      if (this.options.pointSize instanceof Array) {\n        return this.options.pointSize[index % this.options.pointSize.length];\n      } else {\n        return this.options.pointSize;\n      }\n    };\n\n    Line.prototype.pointGrowSeries = function(index) {\n      return Raphael.animation({\n        r: this.pointSizeForSeries(index) + 3\n      }, 25, 'linear');\n    };\n\n    Line.prototype.pointShrinkSeries = function(index) {\n      return Raphael.animation({\n        r: this.pointSizeForSeries(index)\n      }, 25, 'linear');\n    };\n\n    return Line;\n\n  })(Morris.Grid);\n\n  Morris.labelSeries = function(dmin, dmax, pxwidth, specName, xLabelFormat) {\n    var d, d0, ddensity, name, ret, s, spec, t, _i, _len, _ref;\n    ddensity = 200 * (dmax - dmin) / pxwidth;\n    d0 = new Date(dmin);\n    spec = Morris.LABEL_SPECS[specName];\n    if (spec === void 0) {\n      _ref = Morris.AUTO_LABEL_ORDER;\n      for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n        name = _ref[_i];\n        s = Morris.LABEL_SPECS[name];\n        if (ddensity >= s.span) {\n          spec = s;\n          break;\n        }\n      }\n    }\n    if (spec === void 0) {\n      spec = Morris.LABEL_SPECS[\"second\"];\n    }\n    if (xLabelFormat) {\n      spec = $.extend({}, spec, {\n        fmt: xLabelFormat\n      });\n    }\n    d = spec.start(d0);\n    ret = [];\n    while ((t = d.getTime()) <= dmax) {\n      if (t >= dmin) {\n        ret.push([spec.fmt(d), t]);\n      }\n      spec.incr(d);\n    }\n    return ret;\n  };\n\n  minutesSpecHelper = function(interval) {\n    return {\n      span: interval * 60 * 1000,\n      start: function(d) {\n        return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours());\n      },\n      fmt: function(d) {\n        return \"\" + (Morris.pad2(d.getHours())) + \":\" + (Morris.pad2(d.getMinutes()));\n      },\n      incr: function(d) {\n        return d.setUTCMinutes(d.getUTCMinutes() + interval);\n      }\n    };\n  };\n\n  secondsSpecHelper = function(interval) {\n    return {\n      span: interval * 1000,\n      start: function(d) {\n        return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes());\n      },\n      fmt: function(d) {\n        return \"\" + (Morris.pad2(d.getHours())) + \":\" + (Morris.pad2(d.getMinutes())) + \":\" + (Morris.pad2(d.getSeconds()));\n      },\n      incr: function(d) {\n        return d.setUTCSeconds(d.getUTCSeconds() + interval);\n      }\n    };\n  };\n\n  Morris.LABEL_SPECS = {\n    \"decade\": {\n      span: 172800000000,\n      start: function(d) {\n        return new Date(d.getFullYear() - d.getFullYear() % 10, 0, 1);\n      },\n      fmt: function(d) {\n        return \"\" + (d.getFullYear());\n      },\n      incr: function(d) {\n        return d.setFullYear(d.getFullYear() + 10);\n      }\n    },\n    \"year\": {\n      span: 17280000000,\n      start: function(d) {\n        return new Date(d.getFullYear(), 0, 1);\n      },\n      fmt: function(d) {\n        return \"\" + (d.getFullYear());\n      },\n      incr: function(d) {\n        return d.setFullYear(d.getFullYear() + 1);\n      }\n    },\n    \"month\": {\n      span: 2419200000,\n      start: function(d) {\n        return new Date(d.getFullYear(), d.getMonth(), 1);\n      },\n      fmt: function(d) {\n        return \"\" + (d.getFullYear()) + \"-\" + (Morris.pad2(d.getMonth() + 1));\n      },\n      incr: function(d) {\n        return d.setMonth(d.getMonth() + 1);\n      }\n    },\n    \"week\": {\n      span: 604800000,\n      start: function(d) {\n        return new Date(d.getFullYear(), d.getMonth(), d.getDate());\n      },\n      fmt: function(d) {\n        return \"\" + (d.getFullYear()) + \"-\" + (Morris.pad2(d.getMonth() + 1)) + \"-\" + (Morris.pad2(d.getDate()));\n      },\n      incr: function(d) {\n        return d.setDate(d.getDate() + 7);\n      }\n    },\n    \"day\": {\n      span: 86400000,\n      start: function(d) {\n        return new Date(d.getFullYear(), d.getMonth(), d.getDate());\n      },\n      fmt: function(d) {\n        return \"\" + (d.getFullYear()) + \"-\" + (Morris.pad2(d.getMonth() + 1)) + \"-\" + (Morris.pad2(d.getDate()));\n      },\n      incr: function(d) {\n        return d.setDate(d.getDate() + 1);\n      }\n    },\n    \"hour\": minutesSpecHelper(60),\n    \"30min\": minutesSpecHelper(30),\n    \"15min\": minutesSpecHelper(15),\n    \"10min\": minutesSpecHelper(10),\n    \"5min\": minutesSpecHelper(5),\n    \"minute\": minutesSpecHelper(1),\n    \"30sec\": secondsSpecHelper(30),\n    \"15sec\": secondsSpecHelper(15),\n    \"10sec\": secondsSpecHelper(10),\n    \"5sec\": secondsSpecHelper(5),\n    \"second\": secondsSpecHelper(1)\n  };\n\n  Morris.AUTO_LABEL_ORDER = [\"decade\", \"year\", \"month\", \"week\", \"day\", \"hour\", \"30min\", \"15min\", \"10min\", \"5min\", \"minute\", \"30sec\", \"15sec\", \"10sec\", \"5sec\", \"second\"];\n\n  Morris.Area = (function(_super) {\n    var areaDefaults;\n\n    __extends(Area, _super);\n\n    areaDefaults = {\n      fillOpacity: 'auto',\n      behaveLikeLine: false\n    };\n\n    function Area(options) {\n      var areaOptions;\n      if (!(this instanceof Morris.Area)) {\n        return new Morris.Area(options);\n      }\n      areaOptions = $.extend({}, areaDefaults, options);\n      this.cumulative = !areaOptions.behaveLikeLine;\n      if (areaOptions.fillOpacity === 'auto') {\n        areaOptions.fillOpacity = areaOptions.behaveLikeLine ? .8 : 1;\n      }\n      Area.__super__.constructor.call(this, areaOptions);\n    }\n\n    Area.prototype.calcPoints = function() {\n      var row, total, y, _i, _len, _ref, _results;\n      _ref = this.data;\n      _results = [];\n      for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n        row = _ref[_i];\n        row._x = this.transX(row.x);\n        total = 0;\n        row._y = (function() {\n          var _j, _len1, _ref1, _results1;\n          _ref1 = row.y;\n          _results1 = [];\n          for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {\n            y = _ref1[_j];\n            if (this.options.behaveLikeLine) {\n              _results1.push(this.transY(y));\n            } else {\n              total += y || 0;\n              _results1.push(this.transY(total));\n            }\n          }\n          return _results1;\n        }).call(this);\n        _results.push(row._ymax = Math.max.apply(Math, row._y));\n      }\n      return _results;\n    };\n\n    Area.prototype.drawSeries = function() {\n      var i, range, _i, _j, _k, _len, _ref, _ref1, _results, _results1, _results2;\n      this.seriesPoints = [];\n      if (this.options.behaveLikeLine) {\n        range = (function() {\n          _results = [];\n          for (var _i = 0, _ref = this.options.ykeys.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; 0 <= _ref ? _i++ : _i--){ _results.push(_i); }\n          return _results;\n        }).apply(this);\n      } else {\n        range = (function() {\n          _results1 = [];\n          for (var _j = _ref1 = this.options.ykeys.length - 1; _ref1 <= 0 ? _j <= 0 : _j >= 0; _ref1 <= 0 ? _j++ : _j--){ _results1.push(_j); }\n          return _results1;\n        }).apply(this);\n      }\n      _results2 = [];\n      for (_k = 0, _len = range.length; _k < _len; _k++) {\n        i = range[_k];\n        this._drawFillFor(i);\n        this._drawLineFor(i);\n        _results2.push(this._drawPointFor(i));\n      }\n      return _results2;\n    };\n\n    Area.prototype._drawFillFor = function(index) {\n      var path;\n      path = this.paths[index];\n      if (path !== null) {\n        path = path + (\"L\" + (this.transX(this.xmax)) + \",\" + this.bottom + \"L\" + (this.transX(this.xmin)) + \",\" + this.bottom + \"Z\");\n        return this.drawFilledPath(path, this.fillForSeries(index));\n      }\n    };\n\n    Area.prototype.fillForSeries = function(i) {\n      var color;\n      color = Raphael.rgb2hsl(this.colorFor(this.data[i], i, 'line'));\n      return Raphael.hsl(color.h, this.options.behaveLikeLine ? color.s * 0.9 : color.s * 0.75, Math.min(0.98, this.options.behaveLikeLine ? color.l * 1.2 : color.l * 1.25));\n    };\n\n    Area.prototype.drawFilledPath = function(path, fill) {\n      return this.raphael.path(path).attr('fill', fill).attr('fill-opacity', this.options.fillOpacity).attr('stroke', 'none');\n    };\n\n    return Area;\n\n  })(Morris.Line);\n\n  Morris.Bar = (function(_super) {\n    __extends(Bar, _super);\n\n    function Bar(options) {\n      this.onHoverOut = __bind(this.onHoverOut, this);\n      this.onHoverMove = __bind(this.onHoverMove, this);\n      this.onGridClick = __bind(this.onGridClick, this);\n      if (!(this instanceof Morris.Bar)) {\n        return new Morris.Bar(options);\n      }\n      Bar.__super__.constructor.call(this, $.extend({}, options, {\n        parseTime: false\n      }));\n    }\n\n    Bar.prototype.init = function() {\n      this.cumulative = this.options.stacked;\n      if (this.options.hideHover !== 'always') {\n        this.hover = new Morris.Hover({\n          parent: this.el\n        });\n        this.on('hovermove', this.onHoverMove);\n        this.on('hoverout', this.onHoverOut);\n        return this.on('gridclick', this.onGridClick);\n      }\n    };\n\n    Bar.prototype.defaults = {\n      barSizeRatio: 0.75,\n      barGap: 3,\n      barColors: ['#0b62a4', '#7a92a3', '#4da74d', '#afd8f8', '#edc240', '#cb4b4b', '#9440ed'],\n      barOpacity: 1.0,\n      barRadius: [0, 0, 0, 0],\n      xLabelMargin: 50\n    };\n\n    Bar.prototype.calc = function() {\n      var _ref;\n      this.calcBars();\n      if (this.options.hideHover === false) {\n        return (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(this.data.length - 1));\n      }\n    };\n\n    Bar.prototype.calcBars = function() {\n      var idx, row, y, _i, _len, _ref, _results;\n      _ref = this.data;\n      _results = [];\n      for (idx = _i = 0, _len = _ref.length; _i < _len; idx = ++_i) {\n        row = _ref[idx];\n        row._x = this.left + this.width * (idx + 0.5) / this.data.length;\n        _results.push(row._y = (function() {\n          var _j, _len1, _ref1, _results1;\n          _ref1 = row.y;\n          _results1 = [];\n          for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {\n            y = _ref1[_j];\n            if (y != null) {\n              _results1.push(this.transY(y));\n            } else {\n              _results1.push(null);\n            }\n          }\n          return _results1;\n        }).call(this));\n      }\n      return _results;\n    };\n\n    Bar.prototype.draw = function() {\n      var _ref;\n      if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'x') {\n        this.drawXAxis();\n      }\n      return this.drawSeries();\n    };\n\n    Bar.prototype.drawXAxis = function() {\n      var i, label, labelBox, margin, offset, prevAngleMargin, prevLabelMargin, row, textBox, ypos, _i, _ref, _results;\n      ypos = this.bottom + (this.options.xAxisLabelTopPadding || this.options.padding / 2);\n      prevLabelMargin = null;\n      prevAngleMargin = null;\n      _results = [];\n      for (i = _i = 0, _ref = this.data.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {\n        row = this.data[this.data.length - 1 - i];\n        label = this.drawXAxisLabel(row._x, ypos, row.label);\n        textBox = label.getBBox();\n        label.transform(\"r\" + (-this.options.xLabelAngle));\n        labelBox = label.getBBox();\n        label.transform(\"t0,\" + (labelBox.height / 2) + \"...\");\n        if (this.options.xLabelAngle !== 0) {\n          offset = -0.5 * textBox.width * Math.cos(this.options.xLabelAngle * Math.PI / 180.0);\n          label.transform(\"t\" + offset + \",0...\");\n        }\n        if (((prevLabelMargin == null) || prevLabelMargin >= labelBox.x + labelBox.width || (prevAngleMargin != null) && prevAngleMargin >= labelBox.x) && labelBox.x >= 0 && (labelBox.x + labelBox.width) < this.el.width()) {\n          if (this.options.xLabelAngle !== 0) {\n            margin = 1.25 * this.options.gridTextSize / Math.sin(this.options.xLabelAngle * Math.PI / 180.0);\n            prevAngleMargin = labelBox.x - margin;\n          }\n          _results.push(prevLabelMargin = labelBox.x - this.options.xLabelMargin);\n        } else {\n          _results.push(label.remove());\n        }\n      }\n      return _results;\n    };\n\n    Bar.prototype.drawSeries = function() {\n      var barWidth, bottom, groupWidth, idx, lastTop, left, leftPadding, numBars, row, sidx, size, top, ypos, zeroPos;\n      groupWidth = this.width / this.options.data.length;\n      numBars = this.options.stacked != null ? 1 : this.options.ykeys.length;\n      barWidth = (groupWidth * this.options.barSizeRatio - this.options.barGap * (numBars - 1)) / numBars;\n      leftPadding = groupWidth * (1 - this.options.barSizeRatio) / 2;\n      zeroPos = this.ymin <= 0 && this.ymax >= 0 ? this.transY(0) : null;\n      return this.bars = (function() {\n        var _i, _len, _ref, _results;\n        _ref = this.data;\n        _results = [];\n        for (idx = _i = 0, _len = _ref.length; _i < _len; idx = ++_i) {\n          row = _ref[idx];\n          lastTop = 0;\n          _results.push((function() {\n            var _j, _len1, _ref1, _results1;\n            _ref1 = row._y;\n            _results1 = [];\n            for (sidx = _j = 0, _len1 = _ref1.length; _j < _len1; sidx = ++_j) {\n              ypos = _ref1[sidx];\n              if (ypos !== null) {\n                if (zeroPos) {\n                  top = Math.min(ypos, zeroPos);\n                  bottom = Math.max(ypos, zeroPos);\n                } else {\n                  top = ypos;\n                  bottom = this.bottom;\n                }\n                left = this.left + idx * groupWidth + leftPadding;\n                if (!this.options.stacked) {\n                  left += sidx * (barWidth + this.options.barGap);\n                }\n                size = bottom - top;\n                if (this.options.stacked) {\n                  top -= lastTop;\n                }\n                this.drawBar(left, top, barWidth, size, this.colorFor(row, sidx, 'bar'), this.options.barOpacity, this.options.barRadius);\n                _results1.push(lastTop += size);\n              } else {\n                _results1.push(null);\n              }\n            }\n            return _results1;\n          }).call(this));\n        }\n        return _results;\n      }).call(this);\n    };\n\n    Bar.prototype.colorFor = function(row, sidx, type) {\n      var r, s;\n      if (typeof this.options.barColors === 'function') {\n        r = {\n          x: row.x,\n          y: row.y[sidx],\n          label: row.label\n        };\n        s = {\n          index: sidx,\n          key: this.options.ykeys[sidx],\n          label: this.options.labels[sidx]\n        };\n        return this.options.barColors.call(this, r, s, type);\n      } else {\n        return this.options.barColors[sidx % this.options.barColors.length];\n      }\n    };\n\n    Bar.prototype.hitTest = function(x) {\n      if (this.data.length === 0) {\n        return null;\n      }\n      x = Math.max(Math.min(x, this.right), this.left);\n      return Math.min(this.data.length - 1, Math.floor((x - this.left) / (this.width / this.data.length)));\n    };\n\n    Bar.prototype.onGridClick = function(x, y) {\n      var index;\n      index = this.hitTest(x);\n      return this.fire('click', index, this.data[index].src, x, y);\n    };\n\n    Bar.prototype.onHoverMove = function(x, y) {\n      var index, _ref;\n      index = this.hitTest(x);\n      return (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(index));\n    };\n\n    Bar.prototype.onHoverOut = function() {\n      if (this.options.hideHover !== false) {\n        return this.hover.hide();\n      }\n    };\n\n    Bar.prototype.hoverContentForRow = function(index) {\n      var content, j, row, x, y, _i, _len, _ref;\n      row = this.data[index];\n      content = \"<div class='morris-hover-row-label'>\" + row.label + \"</div>\";\n      _ref = row.y;\n      for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) {\n        y = _ref[j];\n        content += \"<div class='morris-hover-point' style='color: \" + (this.colorFor(row, j, 'label')) + \"'>\\n  \" + this.options.labels[j] + \":\\n  \" + (this.yLabelFormat(y)) + \"\\n</div>\";\n      }\n      if (typeof this.options.hoverCallback === 'function') {\n        content = this.options.hoverCallback(index, this.options, content, row.src);\n      }\n      x = this.left + (index + 0.5) * this.width / this.data.length;\n      return [content, x];\n    };\n\n    Bar.prototype.drawXAxisLabel = function(xPos, yPos, text) {\n      var label;\n      return label = this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor);\n    };\n\n    Bar.prototype.drawBar = function(xPos, yPos, width, height, barColor, opacity, radiusArray) {\n      var maxRadius, path;\n      maxRadius = Math.max.apply(Math, radiusArray);\n      if (maxRadius === 0 || maxRadius > height) {\n        path = this.raphael.rect(xPos, yPos, width, height);\n      } else {\n        path = this.raphael.path(this.roundedRect(xPos, yPos, width, height, radiusArray));\n      }\n      return path.attr('fill', barColor).attr('fill-opacity', opacity).attr('stroke', 'none');\n    };\n\n    Bar.prototype.roundedRect = function(x, y, w, h, r) {\n      if (r == null) {\n        r = [0, 0, 0, 0];\n      }\n      return [\"M\", x, r[0] + y, \"Q\", x, y, x + r[0], y, \"L\", x + w - r[1], y, \"Q\", x + w, y, x + w, y + r[1], \"L\", x + w, y + h - r[2], \"Q\", x + w, y + h, x + w - r[2], y + h, \"L\", x + r[3], y + h, \"Q\", x, y + h, x, y + h - r[3], \"Z\"];\n    };\n\n    return Bar;\n\n  })(Morris.Grid);\n\n  Morris.Donut = (function(_super) {\n    __extends(Donut, _super);\n\n    Donut.prototype.defaults = {\n      colors: ['#0B62A4', '#3980B5', '#679DC6', '#95BBD7', '#B0CCE1', '#095791', '#095085', '#083E67', '#052C48', '#042135'],\n      backgroundColor: '#FFFFFF',\n      labelColor: '#000000',\n      formatter: Morris.commas,\n      resize: false\n    };\n\n    function Donut(options) {\n      this.resizeHandler = __bind(this.resizeHandler, this);\n      this.select = __bind(this.select, this);\n      this.click = __bind(this.click, this);\n      var _this = this;\n      if (!(this instanceof Morris.Donut)) {\n        return new Morris.Donut(options);\n      }\n      this.options = $.extend({}, this.defaults, options);\n      if (typeof options.element === 'string') {\n        this.el = $(document.getElementById(options.element));\n      } else {\n        this.el = $(options.element);\n      }\n      if (this.el === null || this.el.length === 0) {\n        throw new Error(\"Graph placeholder not found.\");\n      }\n      if (options.data === void 0 || options.data.length === 0) {\n        return;\n      }\n      this.raphael = new Raphael(this.el[0]);\n      if (this.options.resize) {\n        $(window).bind('resize', function(evt) {\n          if (_this.timeoutId != null) {\n            window.clearTimeout(_this.timeoutId);\n          }\n          return _this.timeoutId = window.setTimeout(_this.resizeHandler, 100);\n        });\n      }\n      this.setData(options.data);\n    }\n\n    Donut.prototype.redraw = function() {\n      var C, cx, cy, i, idx, last, max_value, min, next, seg, total, value, w, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _results;\n      this.raphael.clear();\n      cx = this.el.width() / 2;\n      cy = this.el.height() / 2;\n      w = (Math.min(cx, cy) - 10) / 3;\n      total = 0;\n      _ref = this.values;\n      for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n        value = _ref[_i];\n        total += value;\n      }\n      min = 5 / (2 * w);\n      C = 1.9999 * Math.PI - min * this.data.length;\n      last = 0;\n      idx = 0;\n      this.segments = [];\n      _ref1 = this.values;\n      for (i = _j = 0, _len1 = _ref1.length; _j < _len1; i = ++_j) {\n        value = _ref1[i];\n        next = last + min + C * (value / total);\n        seg = new Morris.DonutSegment(cx, cy, w * 2, w, last, next, this.data[i].color || this.options.colors[idx % this.options.colors.length], this.options.backgroundColor, idx, this.raphael);\n        seg.render();\n        this.segments.push(seg);\n        seg.on('hover', this.select);\n        seg.on('click', this.click);\n        last = next;\n        idx += 1;\n      }\n      this.text1 = this.drawEmptyDonutLabel(cx, cy - 10, this.options.labelColor, 15, 800);\n      this.text2 = this.drawEmptyDonutLabel(cx, cy + 10, this.options.labelColor, 14);\n      max_value = Math.max.apply(Math, this.values);\n      idx = 0;\n      _ref2 = this.values;\n      _results = [];\n      for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {\n        value = _ref2[_k];\n        if (value === max_value) {\n          this.select(idx);\n          break;\n        }\n        _results.push(idx += 1);\n      }\n      return _results;\n    };\n\n    Donut.prototype.setData = function(data) {\n      var row;\n      this.data = data;\n      this.values = (function() {\n        var _i, _len, _ref, _results;\n        _ref = this.data;\n        _results = [];\n        for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n          row = _ref[_i];\n          _results.push(parseFloat(row.value));\n        }\n        return _results;\n      }).call(this);\n      return this.redraw();\n    };\n\n    Donut.prototype.click = function(idx) {\n      return this.fire('click', idx, this.data[idx]);\n    };\n\n    Donut.prototype.select = function(idx) {\n      var row, s, segment, _i, _len, _ref;\n      _ref = this.segments;\n      for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n        s = _ref[_i];\n        s.deselect();\n      }\n      segment = this.segments[idx];\n      segment.select();\n      row = this.data[idx];\n      return this.setLabels(row.label, this.options.formatter(row.value, row));\n    };\n\n    Donut.prototype.setLabels = function(label1, label2) {\n      var inner, maxHeightBottom, maxHeightTop, maxWidth, text1bbox, text1scale, text2bbox, text2scale;\n      inner = (Math.min(this.el.width() / 2, this.el.height() / 2) - 10) * 2 / 3;\n      maxWidth = 1.8 * inner;\n      maxHeightTop = inner / 2;\n      maxHeightBottom = inner / 3;\n      this.text1.attr({\n        text: label1,\n        transform: ''\n      });\n      text1bbox = this.text1.getBBox();\n      text1scale = Math.min(maxWidth / text1bbox.width, maxHeightTop / text1bbox.height);\n      this.text1.attr({\n        transform: \"S\" + text1scale + \",\" + text1scale + \",\" + (text1bbox.x + text1bbox.width / 2) + \",\" + (text1bbox.y + text1bbox.height)\n      });\n      this.text2.attr({\n        text: label2,\n        transform: ''\n      });\n      text2bbox = this.text2.getBBox();\n      text2scale = Math.min(maxWidth / text2bbox.width, maxHeightBottom / text2bbox.height);\n      return this.text2.attr({\n        transform: \"S\" + text2scale + \",\" + text2scale + \",\" + (text2bbox.x + text2bbox.width / 2) + \",\" + text2bbox.y\n      });\n    };\n\n    Donut.prototype.drawEmptyDonutLabel = function(xPos, yPos, color, fontSize, fontWeight) {\n      var text;\n      text = this.raphael.text(xPos, yPos, '').attr('font-size', fontSize).attr('fill', color);\n      if (fontWeight != null) {\n        text.attr('font-weight', fontWeight);\n      }\n      return text;\n    };\n\n    Donut.prototype.resizeHandler = function() {\n      this.timeoutId = null;\n      this.raphael.setSize(this.el.width(), this.el.height());\n      return this.redraw();\n    };\n\n    return Donut;\n\n  })(Morris.EventEmitter);\n\n  Morris.DonutSegment = (function(_super) {\n    __extends(DonutSegment, _super);\n\n    function DonutSegment(cx, cy, inner, outer, p0, p1, color, backgroundColor, index, raphael) {\n      this.cx = cx;\n      this.cy = cy;\n      this.inner = inner;\n      this.outer = outer;\n      this.color = color;\n      this.backgroundColor = backgroundColor;\n      this.index = index;\n      this.raphael = raphael;\n      this.deselect = __bind(this.deselect, this);\n      this.select = __bind(this.select, this);\n      this.sin_p0 = Math.sin(p0);\n      this.cos_p0 = Math.cos(p0);\n      this.sin_p1 = Math.sin(p1);\n      this.cos_p1 = Math.cos(p1);\n      this.is_long = (p1 - p0) > Math.PI ? 1 : 0;\n      this.path = this.calcSegment(this.inner + 3, this.inner + this.outer - 5);\n      this.selectedPath = this.calcSegment(this.inner + 3, this.inner + this.outer);\n      this.hilight = this.calcArc(this.inner);\n    }\n\n    DonutSegment.prototype.calcArcPoints = function(r) {\n      return [this.cx + r * this.sin_p0, this.cy + r * this.cos_p0, this.cx + r * this.sin_p1, this.cy + r * this.cos_p1];\n    };\n\n    DonutSegment.prototype.calcSegment = function(r1, r2) {\n      var ix0, ix1, iy0, iy1, ox0, ox1, oy0, oy1, _ref, _ref1;\n      _ref = this.calcArcPoints(r1), ix0 = _ref[0], iy0 = _ref[1], ix1 = _ref[2], iy1 = _ref[3];\n      _ref1 = this.calcArcPoints(r2), ox0 = _ref1[0], oy0 = _ref1[1], ox1 = _ref1[2], oy1 = _ref1[3];\n      return (\"M\" + ix0 + \",\" + iy0) + (\"A\" + r1 + \",\" + r1 + \",0,\" + this.is_long + \",0,\" + ix1 + \",\" + iy1) + (\"L\" + ox1 + \",\" + oy1) + (\"A\" + r2 + \",\" + r2 + \",0,\" + this.is_long + \",1,\" + ox0 + \",\" + oy0) + \"Z\";\n    };\n\n    DonutSegment.prototype.calcArc = function(r) {\n      var ix0, ix1, iy0, iy1, _ref;\n      _ref = this.calcArcPoints(r), ix0 = _ref[0], iy0 = _ref[1], ix1 = _ref[2], iy1 = _ref[3];\n      return (\"M\" + ix0 + \",\" + iy0) + (\"A\" + r + \",\" + r + \",0,\" + this.is_long + \",0,\" + ix1 + \",\" + iy1);\n    };\n\n    DonutSegment.prototype.render = function() {\n      var _this = this;\n      this.arc = this.drawDonutArc(this.hilight, this.color);\n      return this.seg = this.drawDonutSegment(this.path, this.color, this.backgroundColor, function() {\n        return _this.fire('hover', _this.index);\n      }, function() {\n        return _this.fire('click', _this.index);\n      });\n    };\n\n    DonutSegment.prototype.drawDonutArc = function(path, color) {\n      return this.raphael.path(path).attr({\n        stroke: color,\n        'stroke-width': 2,\n        opacity: 0\n      });\n    };\n\n    DonutSegment.prototype.drawDonutSegment = function(path, fillColor, strokeColor, hoverFunction, clickFunction) {\n      return this.raphael.path(path).attr({\n        fill: fillColor,\n        stroke: strokeColor,\n        'stroke-width': 3\n      }).hover(hoverFunction).click(clickFunction);\n    };\n\n    DonutSegment.prototype.select = function() {\n      if (!this.selected) {\n        this.seg.animate({\n          path: this.selectedPath\n        }, 150, '<>');\n        this.arc.animate({\n          opacity: 1\n        }, 150, '<>');\n        return this.selected = true;\n      }\n    };\n\n    DonutSegment.prototype.deselect = function() {\n      if (this.selected) {\n        this.seg.animate({\n          path: this.path\n        }, 150, '<>');\n        this.arc.animate({\n          opacity: 0\n        }, 150, '<>');\n        return this.selected = false;\n      }\n    };\n\n    return DonutSegment;\n\n  })(Morris.EventEmitter);\n\n}).call(this);\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/nestable/jquery.nestable.js",
    "content": "/*!\n * Nestable jQuery Plugin - Copyright (c) 2012 David Bushell - http://dbushell.com/\n * Dual-licensed under the BSD or MIT licenses\n */\n;(function($, window, document, undefined)\n{\n    var hasTouch = 'ontouchstart' in document;\n\n    /**\n     * Detect CSS pointer-events property\n     * events are normally disabled on the dragging element to avoid conflicts\n     * https://github.com/ausi/Feature-detection-technique-for-pointer-events/blob/master/modernizr-pointerevents.js\n     */\n    var hasPointerEvents = (function()\n    {\n        var el    = document.createElement('div'),\n            docEl = document.documentElement;\n        if (!('pointerEvents' in el.style)) {\n            return false;\n        }\n        el.style.pointerEvents = 'auto';\n        el.style.pointerEvents = 'x';\n        docEl.appendChild(el);\n        var supports = window.getComputedStyle && window.getComputedStyle(el, '').pointerEvents === 'auto';\n        docEl.removeChild(el);\n        return !!supports;\n    })();\n\n    var defaults = {\n        listNodeName    : 'ol',\n        itemNodeName    : 'li',\n        rootClass       : 'dd',\n        listClass       : 'dd-list',\n        itemClass       : 'dd-item',\n        dragClass       : 'dd-dragel',\n        handleClass     : 'dd-handle',\n        collapsedClass  : 'dd-collapsed',\n        placeClass      : 'dd-placeholder',\n        noDragClass     : 'dd-nodrag',\n        emptyClass      : 'dd-empty',\n        expandBtnHTML   : '<button data-action=\"expand\" type=\"button\">展开</button>',\n        collapseBtnHTML : '<button data-action=\"collapse\" type=\"button\">关闭</button>',\n        group           : 0,\n        maxDepth        : 5,\n        threshold       : 20\n    };\n\n    function Plugin(element, options)\n    {\n        this.w  = $(document);\n        this.el = $(element);\n        this.options = $.extend({}, defaults, options);\n        this.init();\n    }\n\n    Plugin.prototype = {\n\n        init: function()\n        {\n            var list = this;\n\n            list.reset();\n\n            list.el.data('nestable-group', this.options.group);\n\n            list.placeEl = $('<div class=\"' + list.options.placeClass + '\"/>');\n\n            $.each(this.el.find(list.options.itemNodeName), function(k, el) {\n                list.setParent($(el));\n            });\n\n            list.el.on('click', 'button', function(e) {\n                if (list.dragEl) {\n                    return;\n                }\n                var target = $(e.currentTarget),\n                    action = target.data('action'),\n                    item   = target.parent(list.options.itemNodeName);\n                if (action === 'collapse') {\n                    list.collapseItem(item);\n                }\n                if (action === 'expand') {\n                    list.expandItem(item);\n                }\n            });\n\n            var onStartEvent = function(e)\n            {\n                var handle = $(e.target);\n                if (!handle.hasClass(list.options.handleClass)) {\n                    if (handle.closest('.' + list.options.noDragClass).length) {\n                        return;\n                    }\n                    handle = handle.closest('.' + list.options.handleClass);\n                }\n\n                if (!handle.length || list.dragEl) {\n                    return;\n                }\n\n                list.isTouch = /^touch/.test(e.type);\n                if (list.isTouch && e.touches.length !== 1) {\n                    return;\n                }\n\n                e.preventDefault();\n                list.dragStart(e.touches ? e.touches[0] : e);\n            };\n\n            var onMoveEvent = function(e)\n            {\n                if (list.dragEl) {\n                    e.preventDefault();\n                    list.dragMove(e.touches ? e.touches[0] : e);\n                }\n            };\n\n            var onEndEvent = function(e)\n            {\n                if (list.dragEl) {\n                    e.preventDefault();\n                    list.dragStop(e.touches ? e.touches[0] : e);\n                }\n            };\n\n            if (hasTouch) {\n                list.el[0].addEventListener('touchstart', onStartEvent, false);\n                window.addEventListener('touchmove', onMoveEvent, false);\n                window.addEventListener('touchend', onEndEvent, false);\n                window.addEventListener('touchcancel', onEndEvent, false);\n            }\n\n            list.el.on('mousedown', onStartEvent);\n            list.w.on('mousemove', onMoveEvent);\n            list.w.on('mouseup', onEndEvent);\n\n        },\n\n        serialize: function()\n        {\n            var data,\n                depth = 0,\n                list  = this;\n            step  = function(level, depth)\n            {\n                var array = [ ],\n                    items = level.children(list.options.itemNodeName);\n                items.each(function()\n                {\n                    var li   = $(this),\n                        item = $.extend({}, li.data()),\n                        sub  = li.children(list.options.listNodeName);\n                    if (sub.length) {\n                        item.children = step(sub, depth + 1);\n                    }\n                    array.push(item);\n                });\n                return array;\n            };\n            data = step(list.el.find(list.options.listNodeName).first(), depth);\n            return data;\n        },\n\n        serialise: function()\n        {\n            return this.serialize();\n        },\n\n        reset: function()\n        {\n            this.mouse = {\n                offsetX   : 0,\n                offsetY   : 0,\n                startX    : 0,\n                startY    : 0,\n                lastX     : 0,\n                lastY     : 0,\n                nowX      : 0,\n                nowY      : 0,\n                distX     : 0,\n                distY     : 0,\n                dirAx     : 0,\n                dirX      : 0,\n                dirY      : 0,\n                lastDirX  : 0,\n                lastDirY  : 0,\n                distAxX   : 0,\n                distAxY   : 0\n            };\n            this.isTouch    = false;\n            this.moving     = false;\n            this.dragEl     = null;\n            this.dragRootEl = null;\n            this.dragDepth  = 0;\n            this.hasNewRoot = false;\n            this.pointEl    = null;\n        },\n\n        expandItem: function(li)\n        {\n            li.removeClass(this.options.collapsedClass);\n            li.children('[data-action=\"expand\"]').hide();\n            li.children('[data-action=\"collapse\"]').show();\n            li.children(this.options.listNodeName).show();\n        },\n\n        collapseItem: function(li)\n        {\n            var lists = li.children(this.options.listNodeName);\n            if (lists.length) {\n                li.addClass(this.options.collapsedClass);\n                li.children('[data-action=\"collapse\"]').hide();\n                li.children('[data-action=\"expand\"]').show();\n                li.children(this.options.listNodeName).hide();\n            }\n        },\n\n        expandAll: function()\n        {\n            var list = this;\n            list.el.find(list.options.itemNodeName).each(function() {\n                list.expandItem($(this));\n            });\n        },\n\n        collapseAll: function()\n        {\n            var list = this;\n            list.el.find(list.options.itemNodeName).each(function() {\n                list.collapseItem($(this));\n            });\n        },\n\n        setParent: function(li)\n        {\n            if (li.children(this.options.listNodeName).length) {\n                li.prepend($(this.options.expandBtnHTML));\n                li.prepend($(this.options.collapseBtnHTML));\n            }\n            li.children('[data-action=\"expand\"]').hide();\n        },\n\n        unsetParent: function(li)\n        {\n            li.removeClass(this.options.collapsedClass);\n            li.children('[data-action]').remove();\n            li.children(this.options.listNodeName).remove();\n        },\n\n        dragStart: function(e)\n        {\n            var mouse    = this.mouse,\n                target   = $(e.target),\n                dragItem = target.closest(this.options.itemNodeName);\n\n            this.placeEl.css('height', dragItem.height());\n\n            mouse.offsetX = e.offsetX !== undefined ? e.offsetX : e.pageX - target.offset().left;\n            mouse.offsetY = e.offsetY !== undefined ? e.offsetY : e.pageY - target.offset().top;\n            mouse.startX = mouse.lastX = e.pageX;\n            mouse.startY = mouse.lastY = e.pageY;\n\n            this.dragRootEl = this.el;\n\n            this.dragEl = $(document.createElement(this.options.listNodeName)).addClass(this.options.listClass + ' ' + this.options.dragClass);\n            this.dragEl.css('width', dragItem.width());\n\n            dragItem.after(this.placeEl);\n            dragItem[0].parentNode.removeChild(dragItem[0]);\n            dragItem.appendTo(this.dragEl);\n\n            $(document.body).append(this.dragEl);\n            this.dragEl.css({\n                'left' : e.pageX - mouse.offsetX,\n                'top'  : e.pageY - mouse.offsetY\n            });\n            // total depth of dragging item\n            var i, depth,\n                items = this.dragEl.find(this.options.itemNodeName);\n            for (i = 0; i < items.length; i++) {\n                depth = $(items[i]).parents(this.options.listNodeName).length;\n                if (depth > this.dragDepth) {\n                    this.dragDepth = depth;\n                }\n            }\n        },\n\n        dragStop: function(e)\n        {\n            var el = this.dragEl.children(this.options.itemNodeName).first();\n            el[0].parentNode.removeChild(el[0]);\n            this.placeEl.replaceWith(el);\n\n            this.dragEl.remove();\n            this.el.trigger('change');\n            if (this.hasNewRoot) {\n                this.dragRootEl.trigger('change');\n            }\n            this.reset();\n        },\n\n        dragMove: function(e)\n        {\n            var list, parent, prev, next, depth,\n                opt   = this.options,\n                mouse = this.mouse;\n\n            this.dragEl.css({\n                'left' : e.pageX - mouse.offsetX,\n                'top'  : e.pageY - mouse.offsetY\n            });\n\n            // mouse position last events\n            mouse.lastX = mouse.nowX;\n            mouse.lastY = mouse.nowY;\n            // mouse position this events\n            mouse.nowX  = e.pageX;\n            mouse.nowY  = e.pageY;\n            // distance mouse moved between events\n            mouse.distX = mouse.nowX - mouse.lastX;\n            mouse.distY = mouse.nowY - mouse.lastY;\n            // direction mouse was moving\n            mouse.lastDirX = mouse.dirX;\n            mouse.lastDirY = mouse.dirY;\n            // direction mouse is now moving (on both axis)\n            mouse.dirX = mouse.distX === 0 ? 0 : mouse.distX > 0 ? 1 : -1;\n            mouse.dirY = mouse.distY === 0 ? 0 : mouse.distY > 0 ? 1 : -1;\n            // axis mouse is now moving on\n            var newAx   = Math.abs(mouse.distX) > Math.abs(mouse.distY) ? 1 : 0;\n\n            // do nothing on first move\n            if (!mouse.moving) {\n                mouse.dirAx  = newAx;\n                mouse.moving = true;\n                return;\n            }\n\n            // calc distance moved on this axis (and direction)\n            if (mouse.dirAx !== newAx) {\n                mouse.distAxX = 0;\n                mouse.distAxY = 0;\n            } else {\n                mouse.distAxX += Math.abs(mouse.distX);\n                if (mouse.dirX !== 0 && mouse.dirX !== mouse.lastDirX) {\n                    mouse.distAxX = 0;\n                }\n                mouse.distAxY += Math.abs(mouse.distY);\n                if (mouse.dirY !== 0 && mouse.dirY !== mouse.lastDirY) {\n                    mouse.distAxY = 0;\n                }\n            }\n            mouse.dirAx = newAx;\n\n            /**\n             * move horizontal\n             */\n            if (mouse.dirAx && mouse.distAxX >= opt.threshold) {\n                // reset move distance on x-axis for new phase\n                mouse.distAxX = 0;\n                prev = this.placeEl.prev(opt.itemNodeName);\n                // increase horizontal level if previous sibling exists and is not collapsed\n                if (mouse.distX > 0 && prev.length && !prev.hasClass(opt.collapsedClass)) {\n                    // cannot increase level when item above is collapsed\n                    list = prev.find(opt.listNodeName).last();\n                    // check if depth limit has reached\n                    depth = this.placeEl.parents(opt.listNodeName).length;\n                    if (depth + this.dragDepth <= opt.maxDepth) {\n                        // create new sub-level if one doesn't exist\n                        if (!list.length) {\n                            list = $('<' + opt.listNodeName + '/>').addClass(opt.listClass);\n                            list.append(this.placeEl);\n                            prev.append(list);\n                            this.setParent(prev);\n                        } else {\n                            // else append to next level up\n                            list = prev.children(opt.listNodeName).last();\n                            list.append(this.placeEl);\n                        }\n                    }\n                }\n                // decrease horizontal level\n                if (mouse.distX < 0) {\n                    // we can't decrease a level if an item preceeds the current one\n                    next = this.placeEl.next(opt.itemNodeName);\n                    if (!next.length) {\n                        parent = this.placeEl.parent();\n                        this.placeEl.closest(opt.itemNodeName).after(this.placeEl);\n                        if (!parent.children().length) {\n                            this.unsetParent(parent.parent());\n                        }\n                    }\n                }\n            }\n\n            var isEmpty = false;\n\n            // find list item under cursor\n            if (!hasPointerEvents) {\n                this.dragEl[0].style.visibility = 'hidden';\n            }\n            this.pointEl = $(document.elementFromPoint(e.pageX - document.body.scrollLeft, e.pageY - (window.pageYOffset || document.documentElement.scrollTop)));\n            if (!hasPointerEvents) {\n                this.dragEl[0].style.visibility = 'visible';\n            }\n            if (this.pointEl.hasClass(opt.handleClass)) {\n                this.pointEl = this.pointEl.parent(opt.itemNodeName);\n            }\n            if (this.pointEl.hasClass(opt.emptyClass)) {\n                isEmpty = true;\n            }\n            else if (!this.pointEl.length || !this.pointEl.hasClass(opt.itemClass)) {\n                return;\n            }\n\n            // find parent list of item under cursor\n            var pointElRoot = this.pointEl.closest('.' + opt.rootClass),\n                isNewRoot   = this.dragRootEl.data('nestable-id') !== pointElRoot.data('nestable-id');\n\n            /**\n             * move vertical\n             */\n            if (!mouse.dirAx || isNewRoot || isEmpty) {\n                // check if groups match if dragging over new root\n                if (isNewRoot && opt.group !== pointElRoot.data('nestable-group')) {\n                    return;\n                }\n                // check depth limit\n                depth = this.dragDepth - 1 + this.pointEl.parents(opt.listNodeName).length;\n                if (depth > opt.maxDepth) {\n                    return;\n                }\n                var before = e.pageY < (this.pointEl.offset().top + this.pointEl.height() / 2);\n                parent = this.placeEl.parent();\n                // if empty create new list to replace empty placeholder\n                if (isEmpty) {\n                    list = $(document.createElement(opt.listNodeName)).addClass(opt.listClass);\n                    list.append(this.placeEl);\n                    this.pointEl.replaceWith(list);\n                }\n                else if (before) {\n                    this.pointEl.before(this.placeEl);\n                }\n                else {\n                    this.pointEl.after(this.placeEl);\n                }\n                if (!parent.children().length) {\n                    this.unsetParent(parent.parent());\n                }\n                if (!this.dragRootEl.find(opt.itemNodeName).length) {\n                    this.dragRootEl.append('<div class=\"' + opt.emptyClass + '\"/>');\n                }\n                // parent root list has changed\n                if (isNewRoot) {\n                    this.dragRootEl = pointElRoot;\n                    this.hasNewRoot = this.el[0] !== this.dragRootEl[0];\n                }\n            }\n        }\n\n    };\n\n    $.fn.nestable = function(params)\n    {\n        var lists  = this,\n            retval = this;\n\n        lists.each(function()\n        {\n            var plugin = $(this).data(\"nestable\");\n\n            if (!plugin) {\n                $(this).data(\"nestable\", new Plugin(this, params));\n                $(this).data(\"nestable-id\", new Date().getTime());\n            } else {\n                if (typeof params === 'string' && typeof plugin[params] === 'function') {\n                    retval = plugin[params]();\n                }\n            }\n        });\n\n        return retval || lists;\n    };\n\n})(window.jQuery || window.Zepto, window, document);\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/plyr/plyr.js",
    "content": "// ==========================================================================\n// Plyr\n// plyr.js v1.3.6\n// https://github.com/selz/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n// Credits: http://paypal.github.io/accessible-html5-video-player/\n// ==========================================================================\n\n(function (api) {\n    'use strict';\n    /*global YT*/\n\n    // Globals\n    var fullscreen, config, callbacks = {\n        youtube: []\n    };\n\n    // Default config\n    var defaults = {\n        enabled: true,\n        debug: false,\n        seekTime: 10,\n        volume: 5,\n        click: true,\n        tooltips: true,\n        displayDuration: true,\n        iconPrefix: 'icon',\n        selectors: {\n            container: '.player',\n            controls: '.player-controls',\n            labels: '[data-player] .sr-only, label .sr-only',\n            buttons: {\n                seek: '[data-player=\"seek\"]',\n                play: '[data-player=\"play\"]',\n                pause: '[data-player=\"pause\"]',\n                restart: '[data-player=\"restart\"]',\n                rewind: '[data-player=\"rewind\"]',\n                forward: '[data-player=\"fast-forward\"]',\n                mute: '[data-player=\"mute\"]',\n                volume: '[data-player=\"volume\"]',\n                captions: '[data-player=\"captions\"]',\n                fullscreen: '[data-player=\"fullscreen\"]'\n            },\n            progress: {\n                container: '.player-progress',\n                buffer: '.player-progress-buffer',\n                played: '.player-progress-played'\n            },\n            captions: '.player-captions',\n            currentTime: '.player-current-time',\n            duration: '.player-duration'\n        },\n        classes: {\n            videoWrapper: 'player-video-wrapper',\n            embedWrapper: 'player-video-embed',\n            type: 'player-{0}',\n            stopped: 'stopped',\n            playing: 'playing',\n            muted: 'muted',\n            loading: 'loading',\n            tooltip: 'player-tooltip',\n            hidden: 'sr-only',\n            hover: 'player-hover',\n            captions: {\n                enabled: 'captions-enabled',\n                active: 'captions-active'\n            },\n            fullscreen: {\n                enabled: 'fullscreen-enabled',\n                active: 'fullscreen-active',\n                hideControls: 'fullscreen-hide-controls'\n            }\n        },\n        captions: {\n            defaultActive: false\n        },\n        fullscreen: {\n            enabled: true,\n            fallback: true,\n            hideControls: true\n        },\n        storage: {\n            enabled: true,\n            key: 'plyr_volume'\n        },\n        controls: ['restart', 'rewind', 'play', 'fast-forward', 'current-time', 'duration', 'mute', 'volume', /*'captions',*/ 'fullscreen'],\n        i18n: {\n            restart: '重新播放',\n            rewind: '后退{seektime}秒',\n            play: '播放',\n            pause: '暂停',\n            forward: '快进{seektime}秒',\n            played: '播放中',\n            buffered: '缓冲中',\n            currentTime: '当前时间',\n            duration: '持续时间',\n            volume: '音量',\n            toggleMute: '静音',\n            toggleCaptions: '字幕',\n            toggleFullscreen: '全屏'\n        }\n    };\n\n    // Build the default HTML\n    function _buildControls() {\n        // Open and add the progress and seek elements\n        var html = [\n        '<div class=\"player-controls\">',\n            '<div class=\"player-progress\">',\n                '<label for=\"seek{id}\" class=\"sr-only\">Seek</label>',\n                '<input id=\"seek{id}\" class=\"player-progress-seek\" type=\"range\" min=\"0\" max=\"100\" step=\"0.5\" value=\"0\" data-player=\"seek\">',\n                '<progress class=\"player-progress-played\" max=\"100\" value=\"0\">',\n                    '<span>0</span>% ' + config.i18n.played,\n                '</progress>',\n                '<progress class=\"player-progress-buffer\" max=\"100\" value=\"0\">',\n                    '<span>0</span>% ' + config.i18n.buffered,\n                '</progress>',\n            '</div>',\n            '<span class=\"player-controls-left\">'];\n\n        // Restart button\n        if (_inArray(config.controls, 'restart')) {\n            html.push(\n                '<button type=\"button\" data-player=\"restart\">',\n                '<svg><use xlink:href=\"#' + config.iconPrefix + '-restart\" /></svg>',\n                '<span class=\"sr-only\">' + config.i18n.restart + '</span>',\n                '</button>'\n            );\n        }\n\n        // Rewind button\n        if (_inArray(config.controls, 'rewind')) {\n            html.push(\n                '<button type=\"button\" data-player=\"rewind\">',\n                '<svg><use xlink:href=\"#' + config.iconPrefix + '-rewind\" /></svg>',\n                '<span class=\"sr-only\">' + config.i18n.rewind + '</span>',\n                '</button>'\n            );\n        }\n\n        // Play/pause button\n        if (_inArray(config.controls, 'play')) {\n            html.push(\n                '<button type=\"button\" data-player=\"play\">',\n                '<svg><use xlink:href=\"#' + config.iconPrefix + '-play\" /></svg>',\n                '<span class=\"sr-only\">' + config.i18n.play + '</span>',\n                '</button>',\n                '<button type=\"button\" data-player=\"pause\">',\n                '<svg><use xlink:href=\"#' + config.iconPrefix + '-pause\" /></svg>',\n                '<span class=\"sr-only\">' + config.i18n.pause + '</span>',\n                '</button>'\n            );\n        }\n\n        // Fast forward button\n        if (_inArray(config.controls, 'fast-forward')) {\n            html.push(\n                '<button type=\"button\" data-player=\"fast-forward\">',\n                '<svg><use xlink:href=\"#' + config.iconPrefix + '-fast-forward\" /></svg>',\n                '<span class=\"sr-only\">' + config.i18n.forward + '</span>',\n                '</button>'\n            );\n        }\n\n        // Media current time display\n        if (_inArray(config.controls, 'current-time')) {\n            html.push(\n                '<span class=\"player-time\">',\n                '<span class=\"sr-only\">' + config.i18n.currentTime + '</span>',\n                '<span class=\"player-current-time\">00:00</span>',\n                '</span>'\n            );\n        }\n\n        // Media duration display\n        if (_inArray(config.controls, 'duration')) {\n            html.push(\n                '<span class=\"player-time\">',\n                '<span class=\"sr-only\">' + config.i18n.duration + '</span>',\n                '<span class=\"player-duration\">00:00</span>',\n                '</span>'\n            );\n        }\n\n        // Close left controls\n        html.push(\n            '</span>',\n            '<span class=\"player-controls-right\">'\n        );\n\n        // Toggle mute button\n        if (_inArray(config.controls, 'mute')) {\n            html.push(\n                '<button type=\"button\" data-player=\"mute\">',\n                '<svg class=\"icon-muted\"><use xlink:href=\"#' + config.iconPrefix + '-muted\" /></svg>',\n                '<svg><use xlink:href=\"#' + config.iconPrefix + '-volume\" /></svg>',\n                '<span class=\"sr-only\">' + config.i18n.toggleMute + '</span>',\n                '</button>'\n            );\n        }\n\n        // Volume range control\n        if (_inArray(config.controls, 'volume')) {\n            html.push(\n                '<label for=\"volume{id}\" class=\"sr-only\">' + config.i18n.volume + '</label>',\n                '<input id=\"volume{id}\" class=\"player-volume\" type=\"range\" min=\"0\" max=\"10\" value=\"5\" data-player=\"volume\">'\n            );\n        }\n\n        // Toggle captions button\n        if (_inArray(config.controls, 'captions')) {\n            html.push(\n                '<button type=\"button\" data-player=\"captions\">',\n                '<svg class=\"icon-captions-on\"><use xlink:href=\"#' + config.iconPrefix + '-captions-on\" /></svg>',\n                '<svg><use xlink:href=\"#' + config.iconPrefix + '-captions-off\" /></svg>',\n                '<span class=\"sr-only\">' + config.i18n.toggleCaptions + '</span>',\n                '</button>'\n            );\n        }\n\n        // Toggle fullscreen button\n        if (_inArray(config.controls, 'fullscreen')) {\n            html.push(\n                '<button type=\"button\" data-player=\"fullscreen\">',\n                '<svg class=\"icon-exit-fullscreen\"><use xlink:href=\"#' + config.iconPrefix + '-exit-fullscreen\" /></svg>',\n                '<svg><use xlink:href=\"#' + config.iconPrefix + '-enter-fullscreen\" /></svg>',\n                '<span class=\"sr-only\">' + config.i18n.toggleFullscreen + '</span>',\n                '</button>'\n            );\n        }\n\n        // Close everything\n        html.push(\n            '</span>',\n            '</div>'\n        );\n\n        return html.join('');\n    }\n\n    // Debugging\n    function _log(text, error) {\n        if (config.debug && window.console) {\n            console[(error ? 'error' : 'log')](text);\n        }\n    }\n\n    // Credits: http://paypal.github.io/accessible-html5-video-player/\n    // Unfortunately, due to mixed support, UA sniffing is required\n    function _browserSniff() {\n        var nAgt = navigator.userAgent,\n            name = navigator.appName,\n            fullVersion = '' + parseFloat(navigator.appVersion),\n            majorVersion = parseInt(navigator.appVersion, 10),\n            nameOffset,\n            verOffset,\n            ix;\n\n        // MSIE 11\n        if ((navigator.appVersion.indexOf('Windows NT') !== -1) && (navigator.appVersion.indexOf('rv:11') !== -1)) {\n            name = 'IE';\n            fullVersion = '11;';\n        }\n        // MSIE\n        else if ((verOffset = nAgt.indexOf('MSIE')) !== -1) {\n            name = 'IE';\n            fullVersion = nAgt.substring(verOffset + 5);\n        }\n        // Chrome\n        else if ((verOffset = nAgt.indexOf('Chrome')) !== -1) {\n            name = 'Chrome';\n            fullVersion = nAgt.substring(verOffset + 7);\n        }\n        // Safari\n        else if ((verOffset = nAgt.indexOf('Safari')) !== -1) {\n            name = 'Safari';\n            fullVersion = nAgt.substring(verOffset + 7);\n            if ((verOffset = nAgt.indexOf('Version')) !== -1) {\n                fullVersion = nAgt.substring(verOffset + 8);\n            }\n        }\n        // Firefox\n        else if ((verOffset = nAgt.indexOf('Firefox')) !== -1) {\n            name = 'Firefox';\n            fullVersion = nAgt.substring(verOffset + 8);\n        }\n        // In most other browsers, 'name/version' is at the end of userAgent\n        else if ((nameOffset = nAgt.lastIndexOf(' ') + 1) < (verOffset = nAgt.lastIndexOf('/'))) {\n            name = nAgt.substring(nameOffset, verOffset);\n            fullVersion = nAgt.substring(verOffset + 1);\n\n            if (name.toLowerCase() == name.toUpperCase()) {\n                name = navigator.appName;\n            }\n        }\n        // Trim the fullVersion string at semicolon/space if present\n        if ((ix = fullVersion.indexOf(';')) !== -1) {\n            fullVersion = fullVersion.substring(0, ix);\n        }\n        if ((ix = fullVersion.indexOf(' ')) !== -1) {\n            fullVersion = fullVersion.substring(0, ix);\n        }\n        // Get major version\n        majorVersion = parseInt('' + fullVersion, 10);\n        if (isNaN(majorVersion)) {\n            fullVersion = '' + parseFloat(navigator.appVersion);\n            majorVersion = parseInt(navigator.appVersion, 10);\n        }\n\n        // Return data\n        return {\n            name: name,\n            version: majorVersion,\n            ios: /(iPad|iPhone|iPod)/g.test(navigator.platform)\n        };\n    }\n\n    // Check for mime type support against a player instance\n    // Credits: http://diveintohtml5.info/everything.html\n    // Related: http://www.leanbackplayer.com/test/h5mt.html\n    function _supportMime(player, mimeType) {\n        var media = player.media;\n\n        // Only check video types for video players\n        if (player.type == 'video') {\n            // Check type\n            switch (mimeType) {\n            case 'video/webm':\n                return !!(media.canPlayType && media.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/no/, ''));\n            case 'video/mp4':\n                return !!(media.canPlayType && media.canPlayType('video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"').replace(/no/, ''));\n            case 'video/ogg':\n                return !!(media.canPlayType && media.canPlayType('video/ogg; codecs=\"theora\"').replace(/no/, ''));\n            }\n        }\n\n        // Only check audio types for audio players\n        else if (player.type == 'audio') {\n            // Check type\n            switch (mimeType) {\n            case 'audio/mpeg':\n                return !!(media.canPlayType && media.canPlayType('audio/mpeg;').replace(/no/, ''));\n            case 'audio/ogg':\n                return !!(media.canPlayType && media.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/no/, ''));\n            case 'audio/wav':\n                return !!(media.canPlayType && media.canPlayType('audio/wav; codecs=\"1\"').replace(/no/, ''));\n            }\n        }\n\n        // If we got this far, we're stuffed\n        return false;\n    }\n\n    // Inject a script\n    function _injectScript(source) {\n        if (document.querySelectorAll('script[src=\"' + source + '\"]').length) {\n            return;\n        }\n\n        var tag = document.createElement('script');\n        tag.src = source;\n        var firstScriptTag = document.getElementsByTagName('script')[0];\n        firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n    }\n\n    // Element exists in an array\n    function _inArray(haystack, needle) {\n        return Array.prototype.indexOf && (haystack.indexOf(needle) != -1);\n    }\n\n    // Replace all\n    function _replaceAll(string, find, replace) {\n        return string.replace(new RegExp(find.replace(/([.*+?\\^=!:${}()|\\[\\]\\/\\\\])/g, '\\\\$1'), 'g'), replace);\n    }\n\n    // Wrap an element\n    function _wrap(elements, wrapper) {\n        // Convert `elements` to an array, if necessary.\n        if (!elements.length) {\n            elements = [elements];\n        }\n\n        // Loops backwards to prevent having to clone the wrapper on the\n        // first element (see `child` below).\n        for (var i = elements.length - 1; i >= 0; i--) {\n            var child = (i > 0) ? wrapper.cloneNode(true) : wrapper;\n            var element = elements[i];\n\n            // Cache the current parent and sibling.\n            var parent = element.parentNode;\n            var sibling = element.nextSibling;\n\n            // Wrap the element (is automatically removed from its current\n            // parent).\n            child.appendChild(element);\n\n            // If the element had a sibling, insert the wrapper before\n            // the sibling to maintain the HTML structure; otherwise, just\n            // append it to the parent.\n            if (sibling) {\n                parent.insertBefore(child, sibling);\n            } else {\n                parent.appendChild(child);\n            }\n        }\n    }\n\n    // Unwrap an element\n    // http://plainjs.com/javascript/manipulation/unwrap-a-dom-element-35/\n    function _unwrap(wrapper) {\n        // Get the element's parent node\n        var parent = wrapper.parentNode;\n\n        // Move all children out of the element\n        while (wrapper.firstChild) {\n            parent.insertBefore(wrapper.firstChild, wrapper);\n        }\n\n        // Remove the empty element\n        parent.removeChild(wrapper);\n    }\n\n    // Remove an element\n    function _remove(element) {\n        element.parentNode.removeChild(element);\n    }\n\n    // Prepend child\n    function _prependChild(parent, element) {\n        parent.insertBefore(element, parent.firstChild);\n    }\n\n    // Set attributes\n    function _setAttributes(element, attributes) {\n        for (var key in attributes) {\n            element.setAttribute(key, attributes[key]);\n        }\n    }\n\n    // Toggle class on an element\n    function _toggleClass(element, name, state) {\n        if (element) {\n            if (element.classList) {\n                element.classList[state ? 'add' : 'remove'](name);\n            } else {\n                var className = (' ' + element.className + ' ').replace(/\\s+/g, ' ').replace(' ' + name + ' ', '');\n                element.className = className + (state ? ' ' + name : '');\n            }\n        }\n    }\n\n    // Toggle event\n    function _toggleHandler(element, events, callback, toggle) {\n        var eventList = events.split(' ');\n\n        // If a nodelist is passed, call itself on each node\n        if (element instanceof NodeList) {\n            for (var x = 0; x < element.length; x++) {\n                if (element[x] instanceof Node) {\n                    _toggleHandler(element[x], arguments[1], arguments[2], arguments[3]);\n                }\n            }\n            return;\n        }\n\n        // If a single node is passed, bind the event listener\n        for (var i = 0; i < eventList.length; i++) {\n            element[toggle ? 'addEventListener' : 'removeEventListener'](eventList[i], callback, false);\n        }\n    }\n\n    // Bind event\n    function _on(element, events, callback) {\n        if (element) {\n            _toggleHandler(element, events, callback, true);\n        }\n    }\n\n    // Unbind event\n    function _off(element, events, callback) {\n        if (element) {\n            _toggleHandler(element, events, callback, false);\n        }\n    }\n\n    // Trigger event\n    function _triggerEvent(element, event) {\n        // Create faux event\n        var fauxEvent = document.createEvent('MouseEvents');\n\n        // Set the event type\n        fauxEvent.initEvent(event, true, true);\n\n        // Dispatch the event\n        element.dispatchEvent(fauxEvent);\n    }\n\n    // Toggle aria-pressed state on a toggle button\n    function _toggleState(target, state) {\n        // Get state\n        state = (typeof state === 'boolean' ? state : !target.getAttribute('aria-pressed'));\n\n        // Set the attribute on target\n        target.setAttribute('aria-pressed', state);\n\n        return state;\n    }\n\n    // Get percentage\n    function _getPercentage(current, max) {\n        if (current === 0 || max === 0 || isNaN(current) || isNaN(max)) {\n            return 0;\n        }\n        return ((current / max) * 100).toFixed(2);\n    }\n\n    // Deep extend/merge two Objects\n    // http://andrewdupont.net/2009/08/28/deep-extending-objects-in-javascript/\n    // Removed call to arguments.callee (used explicit function name instead)\n    function _extend(destination, source) {\n        for (var property in source) {\n            if (source[property] && source[property].constructor && source[property].constructor === Object) {\n                destination[property] = destination[property] || {};\n                _extend(destination[property], source[property]);\n            } else {\n                destination[property] = source[property];\n            }\n        }\n        return destination;\n    }\n\n    // Fullscreen API\n    function _fullscreen() {\n        var fullscreen = {\n                supportsFullScreen: false,\n                isFullScreen: function () {\n                    return false;\n                },\n                requestFullScreen: function () {},\n                cancelFullScreen: function () {},\n                fullScreenEventName: '',\n                element: null,\n                prefix: ''\n            },\n            browserPrefixes = 'webkit moz o ms khtml'.split(' ');\n\n        // Check for native support\n        if (typeof document.cancelFullScreen !== 'undefined') {\n            fullscreen.supportsFullScreen = true;\n        } else {\n            // Check for fullscreen support by vendor prefix\n            for (var i = 0, il = browserPrefixes.length; i < il; i++) {\n                fullscreen.prefix = browserPrefixes[i];\n\n                if (typeof document[fullscreen.prefix + 'CancelFullScreen'] !== 'undefined') {\n                    fullscreen.supportsFullScreen = true;\n                    break;\n                }\n                // Special case for MS (when isn't it?)\n                else if (typeof document.msExitFullscreen !== 'undefined' && document.msFullscreenEnabled) {\n                    fullscreen.prefix = 'ms';\n                    fullscreen.supportsFullScreen = true;\n                    break;\n                }\n            }\n        }\n\n        // Update methods to do something useful\n        if (fullscreen.supportsFullScreen) {\n            // Yet again Microsoft awesomeness,\n            // Sometimes the prefix is 'ms', sometimes 'MS' to keep you on your toes\n            fullscreen.fullScreenEventName = (fullscreen.prefix == 'ms' ? 'MSFullscreenChange' : fullscreen.prefix + 'fullscreenchange');\n\n            fullscreen.isFullScreen = function (element) {\n                if (typeof element === 'undefined') {\n                    element = document.body;\n                }\n                switch (this.prefix) {\n                case '':\n                    return document.fullscreenElement == element;\n                case 'moz':\n                    return document.mozFullScreenElement == element;\n                default:\n                    return document[this.prefix + 'FullscreenElement'] == element;\n                }\n            };\n            fullscreen.requestFullScreen = function (element) {\n                if (typeof element === 'undefined') {\n                    element = document.body;\n                }\n                return (this.prefix === '') ? element.requestFullScreen() : element[this.prefix + (this.prefix == 'ms' ? 'RequestFullscreen' : 'RequestFullScreen')]();\n            };\n            fullscreen.cancelFullScreen = function () {\n                return (this.prefix === '') ? document.cancelFullScreen() : document[this.prefix + (this.prefix == 'ms' ? 'ExitFullscreen' : 'CancelFullScreen')]();\n            };\n            fullscreen.element = function () {\n                return (this.prefix === '') ? document.fullscreenElement : document[this.prefix + 'FullscreenElement'];\n            };\n        }\n\n        return fullscreen;\n    }\n\n    // Local storage\n    function _storage() {\n        var storage = {\n            supported: (function () {\n                try {\n                    return 'localStorage' in window && window.localStorage !== null;\n                } catch (e) {\n                    return false;\n                }\n            })()\n        };\n        return storage;\n    }\n\n    // Player instance\n    function Plyr(container) {\n        var player = this;\n        player.container = container;\n\n        // Captions functions\n        // Seek the manual caption time and update UI\n        function _seekManualCaptions(time) {\n            // If it's not video, or we're using textTracks, bail.\n            if (player.usingTextTracks || player.type !== 'video' || !player.supported.full) {\n                return;\n            }\n\n            // Reset subcount\n            player.subcount = 0;\n\n            // Check time is a number, if not use currentTime\n            // IE has a bug where currentTime doesn't go to 0\n            // https://twitter.com/Sam_Potts/status/573715746506731521\n            time = typeof time === 'number' ? time : player.media.currentTime;\n\n            while (_timecodeMax(player.captions[player.subcount][0]) < time.toFixed(1)) {\n                player.subcount++;\n                if (player.subcount > player.captions.length - 1) {\n                    player.subcount = player.captions.length - 1;\n                    break;\n                }\n            }\n\n            // Check if the next caption is in the current time range\n            if (player.media.currentTime.toFixed(1) >= _timecodeMin(player.captions[player.subcount][0]) &&\n                player.media.currentTime.toFixed(1) <= _timecodeMax(player.captions[player.subcount][0])) {\n                player.currentCaption = player.captions[player.subcount][1];\n\n                // Trim caption text\n                var content = player.currentCaption.trim();\n\n                // Render the caption (only if changed)\n                if (player.captionsContainer.innerHTML != content) {\n                    // Empty caption\n                    // Otherwise NVDA reads it twice\n                    player.captionsContainer.innerHTML = '';\n\n                    // Set new caption text\n                    player.captionsContainer.innerHTML = content;\n                }\n            } else {\n                player.captionsContainer.innerHTML = '';\n            }\n        }\n\n        // Display captions container and button (for initialization)\n        function _showCaptions() {\n            // If there's no caption toggle, bail\n            if (!player.buttons.captions) {\n                return;\n            }\n\n            _toggleClass(player.container, config.classes.captions.enabled, true);\n\n            if (config.captions.defaultActive) {\n                _toggleClass(player.container, config.classes.captions.active, true);\n                _toggleState(player.buttons.captions, true);\n            }\n        }\n\n        // Utilities for caption time codes\n        function _timecodeMin(tc) {\n            var tcpair = [];\n            tcpair = tc.split(' --> ');\n            return _subTcSecs(tcpair[0]);\n        }\n\n        function _timecodeMax(tc) {\n            var tcpair = [];\n            tcpair = tc.split(' --> ');\n            return _subTcSecs(tcpair[1]);\n        }\n\n        function _subTcSecs(tc) {\n            if (tc === null || tc === undefined) {\n                return 0;\n            } else {\n                var tc1 = [],\n                    tc2 = [],\n                    seconds;\n                tc1 = tc.split(',');\n                tc2 = tc1[0].split(':');\n                seconds = Math.floor(tc2[0] * 60 * 60) + Math.floor(tc2[1] * 60) + Math.floor(tc2[2]);\n                return seconds;\n            }\n        }\n\n        // Find all elements\n        function _getElements(selector) {\n            return player.container.querySelectorAll(selector);\n        }\n\n        // Find a single element\n        function _getElement(selector) {\n            return _getElements(selector)[0];\n        }\n\n        // Determine if we're in an iframe\n        function _inFrame() {\n            try {\n                return window.self !== window.top;\n            } catch (e) {\n                return true;\n            }\n        }\n\n        // Insert controls\n        function _injectControls() {\n            // Make a copy of the html\n            var html = config.html;\n\n            // Insert custom video controls\n            _log('Injecting custom controls.');\n\n            // If no controls are specified, create default\n            if (!html) {\n                html = _buildControls();\n            }\n\n            // Replace seek time instances\n            html = _replaceAll(html, '{seektime}', config.seekTime);\n\n            // Replace all id references with random numbers\n            html = _replaceAll(html, '{id}', Math.floor(Math.random() * (10000)));\n\n            // Inject into the container\n            player.container.insertAdjacentHTML('beforeend', html);\n\n            // Setup tooltips\n            if (config.tooltips) {\n                var labels = _getElements(config.selectors.labels);\n\n                for (var i = labels.length - 1; i >= 0; i--) {\n                    var label = labels[i];\n\n                    _toggleClass(label, config.classes.hidden, false);\n                    _toggleClass(label, config.classes.tooltip, true);\n                }\n            }\n        }\n\n        // Find the UI controls and store references\n        function _findElements() {\n            try {\n                player.controls = _getElement(config.selectors.controls);\n\n                // Buttons\n                player.buttons = {};\n                player.buttons.seek = _getElement(config.selectors.buttons.seek);\n                player.buttons.play = _getElement(config.selectors.buttons.play);\n                player.buttons.pause = _getElement(config.selectors.buttons.pause);\n                player.buttons.restart = _getElement(config.selectors.buttons.restart);\n                player.buttons.rewind = _getElement(config.selectors.buttons.rewind);\n                player.buttons.forward = _getElement(config.selectors.buttons.forward);\n                player.buttons.fullscreen = _getElement(config.selectors.buttons.fullscreen);\n\n                // Inputs\n                player.buttons.mute = _getElement(config.selectors.buttons.mute);\n                player.buttons.captions = _getElement(config.selectors.buttons.captions);\n                player.checkboxes = _getElements('[type=\"checkbox\"]');\n\n                // Progress\n                player.progress = {};\n                player.progress.container = _getElement(config.selectors.progress.container);\n\n                // Progress - Buffering\n                player.progress.buffer = {};\n                player.progress.buffer.bar = _getElement(config.selectors.progress.buffer);\n                player.progress.buffer.text = player.progress.buffer.bar && player.progress.buffer.bar.getElementsByTagName('span')[0];\n\n                // Progress - Played\n                player.progress.played = {};\n                player.progress.played.bar = _getElement(config.selectors.progress.played);\n                player.progress.played.text = player.progress.played.bar && player.progress.played.bar.getElementsByTagName('span')[0];\n\n                // Volume\n                player.volume = _getElement(config.selectors.buttons.volume);\n\n                // Timing\n                player.duration = _getElement(config.selectors.duration);\n                player.currentTime = _getElement(config.selectors.currentTime);\n                player.seekTime = _getElements(config.selectors.seekTime);\n\n                return true;\n            } catch (e) {\n                _log('It looks like there\\'s a problem with your controls html. Bailing.', true);\n\n                // Restore native video controls\n                player.media.setAttribute('controls', '');\n\n                return false;\n            }\n        }\n\n        // Setup aria attribute for play\n        function _setupPlayAria() {\n            // If there's no play button, bail\n            if (!player.buttons.play) {\n                return;\n            }\n\n            // Find the current text\n            var label = player.buttons.play.innerText || config.i18n.play;\n\n            // If there's a media title set, use that for the label\n            if (typeof (config.title) !== 'undefined' && config.title.length) {\n                label += ', ' + config.title;\n            }\n\n            player.buttons.play.setAttribute('aria-label', label);\n        }\n\n        // Setup media\n        function _setupMedia() {\n            // If there's no media, bail\n            if (!player.media) {\n                _log('No audio or video element found!', true);\n                return false;\n            }\n\n            if (player.supported.full) {\n                // Remove native video controls\n                player.media.removeAttribute('controls');\n\n                // Add type class\n                _toggleClass(player.container, config.classes.type.replace('{0}', player.type), true);\n\n                // If there's no autoplay attribute, assume the video is stopped and add state class\n                _toggleClass(player.container, config.classes.stopped, (player.media.getAttribute('autoplay') === null));\n\n                // Add iOS class\n                if (player.browser.ios) {\n                    _toggleClass(player.container, 'ios', true);\n                }\n\n                // Inject the player wrapper\n                if (player.type === 'video') {\n                    // Create the wrapper div\n                    var wrapper = document.createElement('div');\n                    wrapper.setAttribute('class', config.classes.videoWrapper);\n\n                    // Wrap the video in a container\n                    _wrap(player.media, wrapper);\n\n                    // Cache the container\n                    player.videoContainer = wrapper;\n                }\n            }\n\n            // YouTube\n            if (player.type == 'youtube') {\n                _setupYouTube(player.media.getAttribute('data-video-id'));\n            }\n\n            // Autoplay\n            if (player.media.getAttribute('autoplay') !== null) {\n                _play();\n            }\n        }\n\n        // Setup YouTube\n        function _setupYouTube(id) {\n            // Remove old containers\n            var containers = _getElements('[id^=\"youtube\"]');\n            for (var i = containers.length - 1; i >= 0; i--) {\n                _remove(containers[i]);\n            }\n\n            // Create the YouTube container\n            var container = document.createElement('div');\n            container.setAttribute('id', 'youtube-' + Math.floor(Math.random() * (10000)));\n            player.media.appendChild(container);\n\n            // Add embed class for responsive\n            _toggleClass(player.media, config.classes.videoWrapper, true);\n            _toggleClass(player.media, config.classes.embedWrapper, true);\n\n            if (typeof YT === 'object') {\n                _YTReady(id, container);\n            } else {\n                // Load the API\n                _injectScript('https://www.youtube.com/iframe_api');\n\n                // Add callback to queue\n                callbacks.youtube.push(function () {\n                    _YTReady(id, container);\n                });\n\n                // Setup callback for the API\n                window.onYouTubeIframeAPIReady = function () {\n                    for (var i = callbacks.youtube.length - 1; i >= 0; i--) {\n                        // Fire callback\n                        callbacks.youtube[i]();\n\n                        // Remove from queue\n                        callbacks.youtube.splice(i, 1);\n                    }\n                };\n            }\n        }\n\n        // Handle API ready\n        function _YTReady(id, container) {\n            _log('YouTube API Ready');\n\n            // Setup timers object\n            // We have to poll YouTube for updates\n            if (!('timer' in player)) {\n                player.timer = {};\n            }\n\n            // Setup instance\n            // https://developers.google.com/youtube/iframe_api_reference\n            player.embed = new YT.Player(container.id, {\n                videoId: id,\n                playerVars: {\n                    autoplay: 0,\n                    controls: (player.supported.full ? 0 : 1),\n                    rel: 0,\n                    showinfo: 0,\n                    iv_load_policy: 3,\n                    cc_load_policy: (config.captions.defaultActive ? 1 : 0),\n                    cc_lang_pref: 'en',\n                    wmode: 'transparent',\n                    modestbranding: 1,\n                    disablekb: 1\n                },\n                events: {\n                    'onReady': function (event) {\n                        // Get the instance\n                        var instance = event.target;\n\n                        // Create a faux HTML5 API using the YouTube API\n                        player.media.play = function () {\n                            instance.playVideo();\n                        };\n                        player.media.pause = function () {\n                            instance.pauseVideo();\n                        };\n                        player.media.stop = function () {\n                            instance.stopVideo();\n                        };\n                        player.media.duration = instance.getDuration();\n                        player.media.paused = true;\n                        player.media.currentTime = instance.getCurrentTime();\n                        player.media.muted = instance.isMuted();\n\n                        // Trigger timeupdate\n                        _triggerEvent(player.media, 'timeupdate');\n\n                        // Reset timer\n                        window.clearInterval(player.timer.buffering);\n\n                        // Setup buffering\n                        player.timer.buffering = window.setInterval(function () {\n                            // Get loaded % from YouTube\n                            player.media.buffered = instance.getVideoLoadedFraction();\n\n                            // Trigger progress\n                            _triggerEvent(player.media, 'progress');\n\n                            // Bail if we're at 100%\n                            if (player.media.buffered === 1) {\n                                window.clearInterval(player.timer.buffering);\n                            }\n                        }, 200);\n\n                        if (player.supported.full) {\n                            // Only setup controls once\n                            if (!player.container.querySelectorAll(config.selectors.controls).length) {\n                                _setupInterface();\n                            }\n\n                            // Display duration if available\n                            if (config.displayDuration) {\n                                _displayDuration();\n                            }\n                        }\n                    },\n                    'onStateChange': function (event) {\n                        // Get the instance\n                        var instance = event.target;\n\n                        // Reset timer\n                        window.clearInterval(player.timer.playing);\n\n                        // Handle events\n                        // -1   Unstarted\n                        // 0    Ended\n                        // 1    Playing\n                        // 2    Paused\n                        // 3    Buffering\n                        // 5    Video cued\n                        switch (event.data) {\n                        case 0:\n                            player.media.paused = true;\n                            _triggerEvent(player.media, 'ended');\n                            break;\n\n                        case 1:\n                            player.media.paused = false;\n                            _triggerEvent(player.media, 'play');\n\n                            // Poll to get playback progress\n                            player.timer.playing = window.setInterval(function () {\n                                // Set the current time\n                                player.media.currentTime = instance.getCurrentTime();\n\n                                // Trigger timeupdate\n                                _triggerEvent(player.media, 'timeupdate');\n                            }, 200);\n\n                            break;\n\n                        case 2:\n                            player.media.paused = true;\n                            _triggerEvent(player.media, 'pause');\n                        }\n                    }\n                }\n            });\n        }\n\n        // Setup captions\n        function _setupCaptions() {\n            if (player.type === 'video') {\n                // Inject the container\n                player.videoContainer.insertAdjacentHTML('afterbegin', '<div class=\"' + config.selectors.captions.replace('.', '') + '\"><span></span></div>');\n\n                // Cache selector\n                player.captionsContainer = _getElement(config.selectors.captions).querySelector('span');\n\n                // Determine if HTML5 textTracks is supported\n                player.usingTextTracks = false;\n                if (player.media.textTracks) {\n                    player.usingTextTracks = true;\n                }\n\n                // Get URL of caption file if exists\n                var captionSrc = '',\n                    kind,\n                    children = player.media.childNodes;\n\n                for (var i = 0; i < children.length; i++) {\n                    if (children[i].nodeName.toLowerCase() === 'track') {\n                        kind = children[i].kind;\n                        if (kind === 'captions' || kind === 'subtitles') {\n                            captionSrc = children[i].getAttribute('src');\n                        }\n                    }\n                }\n\n                // Record if caption file exists or not\n                player.captionExists = true;\n                if (captionSrc === '') {\n                    player.captionExists = false;\n                    _log('No caption track found.');\n                } else {\n                    _log('Caption track found; URI: ' + captionSrc);\n                }\n\n                // If no caption file exists, hide container for caption text\n                if (!player.captionExists) {\n                    _toggleClass(player.container, config.classes.captions.enabled);\n                }\n                // If caption file exists, process captions\n                else {\n                    // Turn off native caption rendering to avoid double captions\n                    // This doesn't seem to work in Safari 7+, so the <track> elements are removed from the dom below\n                    var tracks = player.media.textTracks;\n                    for (var x = 0; x < tracks.length; x++) {\n                        tracks[x].mode = 'hidden';\n                    }\n\n                    // Enable UI\n                    _showCaptions(player);\n\n                    // Disable unsupported browsers than report false positive\n                    if ((player.browser.name === 'IE' && player.browser.version >= 10) ||\n                        (player.browser.name === 'Firefox' && player.browser.version >= 31) ||\n                        (player.browser.name === 'Chrome' && player.browser.version >= 43) ||\n                        (player.browser.name === 'Safari' && player.browser.version >= 7)) {\n                        // Debugging\n                        _log('Detected unsupported browser for HTML5 captions. Using fallback.');\n\n                        // Set to false so skips to 'manual' captioning\n                        player.usingTextTracks = false;\n                    }\n\n                    // Rendering caption tracks\n                    // Native support required - http://caniuse.com/webvtt\n                    if (player.usingTextTracks) {\n                        _log('TextTracks supported.');\n\n                        for (var y = 0; y < tracks.length; y++) {\n                            var track = tracks[y];\n\n                            if (track.kind === 'captions' || track.kind === 'subtitles') {\n                                _on(track, 'cuechange', function () {\n                                    // Clear container\n                                    player.captionsContainer.innerHTML = '';\n\n                                    // Display a cue, if there is one\n                                    if (this.activeCues[0] && this.activeCues[0].hasOwnProperty('text')) {\n                                        player.captionsContainer.appendChild(this.activeCues[0].getCueAsHTML().trim());\n                                    }\n                                });\n                            }\n                        }\n                    }\n                    // Caption tracks not natively supported\n                    else {\n                        _log('TextTracks not supported so rendering captions manually.');\n\n                        // Render captions from array at appropriate time\n                        player.currentCaption = '';\n                        player.captions = [];\n\n                        if (captionSrc !== '') {\n                            // Create XMLHttpRequest Object\n                            var xhr = new XMLHttpRequest();\n\n                            xhr.onreadystatechange = function () {\n                                if (xhr.readyState === 4) {\n                                    if (xhr.status === 200) {\n                                        var records = [],\n                                            record,\n                                            req = xhr.responseText;\n\n                                        records = req.split('\\n\\n');\n\n                                        for (var r = 0; r < records.length; r++) {\n                                            record = records[r];\n                                            player.captions[r] = [];\n                                            player.captions[r] = record.split('\\n');\n                                        }\n\n                                        // Remove first element ('VTT')\n                                        player.captions.shift();\n\n                                        _log('Successfully loaded the caption file via AJAX.');\n                                    } else {\n                                        _log('There was a problem loading the caption file via AJAX.', true);\n                                    }\n                                }\n                            };\n\n                            xhr.open('get', captionSrc, true);\n\n                            xhr.send();\n                        }\n                    }\n\n                    // If Safari 7+, removing track from DOM [see 'turn off native caption rendering' above]\n                    if (player.browser.name === 'Safari' && player.browser.version >= 7) {\n                        _log('Safari 7+ detected; removing track from DOM.');\n\n                        // Find all <track> elements\n                        tracks = player.media.getElementsByTagName('track');\n\n                        // Loop through and remove one by one\n                        for (var t = 0; t < tracks.length; t++) {\n                            player.media.removeChild(tracks[t]);\n                        }\n                    }\n                }\n            }\n        }\n\n        // Setup fullscreen\n        function _setupFullscreen() {\n            if (player.type != 'audio' && config.fullscreen.enabled) {\n                // Check for native support\n                var nativeSupport = fullscreen.supportsFullScreen;\n\n                if (nativeSupport || (config.fullscreen.fallback && !_inFrame())) {\n                    _log((nativeSupport ? 'Native' : 'Fallback') + ' fullscreen enabled.');\n\n                    // Add styling hook\n                    _toggleClass(player.container, config.classes.fullscreen.enabled, true);\n                } else {\n                    _log('Fullscreen not supported and fallback disabled.');\n                }\n\n                // Toggle state\n                _toggleState(player.buttons.fullscreen, false);\n\n                // Set control hide class hook\n                if (config.fullscreen.hideControls) {\n                    _toggleClass(player.container, config.classes.fullscreen.hideControls, true);\n                }\n            }\n        }\n\n        // Play media\n        function _play() {\n            player.media.play();\n        }\n\n        // Pause media\n        function _pause() {\n            player.media.pause();\n        }\n\n        // Toggle playback\n        function _togglePlay(toggle) {\n            // Play\n            if (toggle === true) {\n                _play();\n            }\n            // Pause\n            else if (toggle === false) {\n                _pause();\n            }\n            // True toggle\n            else {\n                player.media[player.media.paused ? 'play' : 'pause']();\n            }\n        }\n\n        // Rewind\n        function _rewind(seekTime) {\n            // Use default if needed\n            if (typeof seekTime !== 'number') {\n                seekTime = config.seekTime;\n            }\n            _seek(player.media.currentTime - seekTime);\n        }\n\n        // Fast forward\n        function _forward(seekTime) {\n            // Use default if needed\n            if (typeof seekTime !== 'number') {\n                seekTime = config.seekTime;\n            }\n            _seek(player.media.currentTime + seekTime);\n        }\n\n        // Seek to time\n        // The input parameter can be an event or a number\n        function _seek(input) {\n            var targetTime = 0,\n                paused = player.media.paused;\n\n            // Explicit position\n            if (typeof input === 'number') {\n                targetTime = input;\n            }\n            // Event\n            else if (typeof input === 'object' && (input.type === 'input' || input.type === 'change')) {\n                // It's the seek slider\n                // Seek to the selected time\n                targetTime = ((input.target.value / input.target.max) * player.media.duration);\n            }\n\n            // Normalise targetTime\n            if (targetTime < 0) {\n                targetTime = 0;\n            } else if (targetTime > player.media.duration) {\n                targetTime = player.media.duration;\n            }\n\n            // Set the current time\n            // Try/catch incase the media isn't set and we're calling seek() from source() and IE moans\n            try {\n                player.media.currentTime = targetTime.toFixed(1);\n            } catch (e) {}\n\n            // YouTube\n            if (player.type == 'youtube') {\n                player.embed.seekTo(targetTime);\n\n                if (paused) {\n                    _pause();\n                }\n\n                // Trigger timeupdate\n                _triggerEvent(player.media, 'timeupdate');\n            }\n\n            // Logging\n            _log('Seeking to ' + player.media.currentTime + ' seconds');\n\n            // Special handling for 'manual' captions\n            _seekManualCaptions(targetTime);\n        }\n\n        // Check playing state\n        function _checkPlaying() {\n            _toggleClass(player.container, config.classes.playing, !player.media.paused);\n            _toggleClass(player.container, config.classes.stopped, player.media.paused);\n        }\n\n        // Toggle fullscreen\n        function _toggleFullscreen(event) {\n            // Check for native support\n            var nativeSupport = fullscreen.supportsFullScreen;\n\n            // If it's a fullscreen change event, it's probably a native close\n            if (event && event.type === fullscreen.fullScreenEventName) {\n                player.isFullscreen = fullscreen.isFullScreen(player.container);\n            }\n            // If there's native support, use it\n            else if (nativeSupport) {\n                // Request fullscreen\n                if (!fullscreen.isFullScreen(player.container)) {\n                    fullscreen.requestFullScreen(player.container);\n                }\n                // Bail from fullscreen\n                else {\n                    fullscreen.cancelFullScreen();\n                }\n\n                // Check if we're actually full screen (it could fail)\n                player.isFullscreen = fullscreen.isFullScreen(player.container);\n            } else {\n                // Otherwise, it's a simple toggle\n                player.isFullscreen = !player.isFullscreen;\n\n                // Bind/unbind escape key\n                if (player.isFullscreen) {\n                    _on(document, 'keyup', _handleEscapeFullscreen);\n                    document.body.style.overflow = 'hidden';\n                } else {\n                    _off(document, 'keyup', _handleEscapeFullscreen);\n                    document.body.style.overflow = '';\n                }\n            }\n\n            // Set class hook\n            _toggleClass(player.container, config.classes.fullscreen.active, player.isFullscreen);\n\n            // Set button state\n            _toggleState(player.buttons.fullscreen, player.isFullscreen);\n\n            // Toggle controls visibility based on mouse movement and location\n            var hoverTimer, isMouseOver = false;\n\n            // Show the player controls\n            function _showControls() {\n                // Set shown class\n                _toggleClass(player.container, config.classes.hover, true);\n\n                // Clear timer every movement\n                window.clearTimeout(hoverTimer);\n\n                // If the mouse is not over the controls, set a timeout to hide them\n                if (!isMouseOver) {\n                    hoverTimer = window.setTimeout(function () {\n                        _toggleClass(player.container, config.classes.hover, false);\n                    }, 2000);\n                }\n            }\n\n            // Check mouse is over the controls\n            function _setMouseOver(event) {\n                isMouseOver = (event.type === 'mouseenter');\n            }\n\n            if (config.fullscreen.hideControls) {\n                // Hide on entering full screen\n                _toggleClass(player.controls, config.classes.hover, false);\n\n                // Keep an eye on the mouse location in relation to controls\n                _toggleHandler(player.controls, 'mouseenter mouseleave', _setMouseOver, player.isFullscreen);\n\n                // Show the controls on mouse move\n                _toggleHandler(player.container, 'mousemove', _showControls, player.isFullscreen);\n            }\n        }\n\n        // Bail from faux-fullscreen\n        function _handleEscapeFullscreen(event) {\n            // If it's a keypress and not escape, bail\n            if ((event.which || event.charCode || event.keyCode) === 27 && player.isFullscreen) {\n                _toggleFullscreen();\n            }\n        }\n\n        // Set volume\n        function _setVolume(volume) {\n            // Use default if no value specified\n            if (typeof volume === 'undefined') {\n                if (config.storage.enabled && _storage().supported) {\n                    volume = window.localStorage[config.storage.key] || config.volume;\n                } else {\n                    volume = config.volume;\n                }\n            }\n\n            // Maximum is 10\n            if (volume > 10) {\n                volume = 10;\n            }\n            // Minimum is 0\n            if (volume < 0) {\n                volume = 0;\n            }\n\n            // Set the player volume\n            player.media.volume = parseFloat(volume / 10);\n\n            // YouTube\n            if (player.type == 'youtube') {\n                player.embed.setVolume(player.media.volume * 100);\n\n                // Trigger timeupdate\n                _triggerEvent(player.media, 'volumechange');\n            }\n\n            // Toggle muted state\n            if (player.media.muted && volume > 0) {\n                _toggleMute();\n            }\n        }\n\n        // Mute\n        function _toggleMute(muted) {\n            // If the method is called without parameter, toggle based on current value\n            if (typeof muted !== 'boolean') {\n                muted = !player.media.muted;\n            }\n\n            // Set button state\n            _toggleState(player.buttons.mute, muted);\n\n            // Set mute on the player\n            player.media.muted = muted;\n\n            // YouTube\n            if (player.type === 'youtube') {\n                player.embed[player.media.muted ? 'mute' : 'unMute']();\n\n                // Trigger timeupdate\n                _triggerEvent(player.media, 'volumechange');\n            }\n        }\n\n        // Update volume UI and storage\n        function _updateVolume() {\n            // Get the current volume\n            var volume = player.media.muted ? 0 : (player.media.volume * 10);\n\n            // Update the <input type=\"range\"> if present\n            if (player.supported.full && player.volume) {\n                player.volume.value = volume;\n            }\n\n            // Store the volume in storage\n            if (config.storage.enabled && _storage().supported) {\n                window.localStorage.setItem(config.storage.key, volume);\n            }\n\n            // Toggle class if muted\n            _toggleClass(player.container, config.classes.muted, (volume === 0));\n\n            // Update checkbox for mute state\n            if (player.supported.full && player.buttons.mute) {\n                _toggleState(player.buttons.mute, (volume === 0));\n            }\n        }\n\n        // Toggle captions\n        function _toggleCaptions(show) {\n            // If there's no full support, or there's no caption toggle\n            if (!player.supported.full || !player.buttons.captions) {\n                return;\n            }\n\n            // If the method is called without parameter, toggle based on current value\n            if (typeof show !== 'boolean') {\n                show = (player.container.className.indexOf(config.classes.captions.active) === -1);\n            }\n\n            // Toggle state\n            _toggleState(player.buttons.captions, show);\n\n            // Add class hook\n            _toggleClass(player.container, config.classes.captions.active, show);\n        }\n\n        // Check if media is loading\n        function _checkLoading(event) {\n            var loading = (event.type === 'waiting');\n\n            // Clear timer\n            clearTimeout(player.loadingTimer);\n\n            // Timer to prevent flicker when seeking\n            player.loadingTimer = setTimeout(function () {\n                _toggleClass(player.container, config.classes.loading, loading);\n            }, (loading ? 250 : 0));\n        }\n\n        // Update <progress> elements\n        function _updateProgress(event) {\n            var progress = player.progress.played.bar,\n                text = player.progress.played.text,\n                value = 0;\n\n            if (event) {\n                switch (event.type) {\n                    // Video playing\n                case 'timeupdate':\n                case 'seeking':\n                    value = _getPercentage(player.media.currentTime, player.media.duration);\n\n                    // Set seek range value only if it's a 'natural' time event\n                    if (event.type == 'timeupdate' && player.buttons.seek) {\n                        player.buttons.seek.value = value;\n                    }\n\n                    break;\n\n                    // Events from seek range\n                case 'change':\n                case 'input':\n                    value = event.target.value;\n                    break;\n\n\n                    // Check buffer status\n                case 'playing':\n                case 'progress':\n                    progress = player.progress.buffer.bar;\n                    text = player.progress.buffer.text;\n                    value = (function () {\n                        var buffered = player.media.buffered;\n\n                        // HTML5\n                        if (buffered && buffered.length) {\n                            return _getPercentage(buffered.end(0), player.media.duration);\n                        }\n                        // YouTube returns between 0 and 1\n                        else if (typeof buffered === 'number') {\n                            return (buffered * 100);\n                        }\n\n                        return 0;\n                    })();\n                }\n            }\n\n            // Set values\n            if (progress) {\n                progress.value = value;\n            }\n            if (text) {\n                text.innerHTML = value;\n            }\n        }\n\n        // Update the displayed time\n        function _updateTimeDisplay(time, element) {\n            // Bail if there's no duration display\n            if (!element) {\n                return;\n            }\n\n            player.secs = parseInt(time % 60);\n            player.mins = parseInt((time / 60) % 60);\n            player.hours = parseInt(((time / 60) / 60) % 60);\n\n            // Do we need to display hours?\n            var displayHours = (parseInt(((player.media.duration / 60) / 60) % 60) > 0);\n\n            // Ensure it's two digits. For example, 03 rather than 3.\n            player.secs = ('0' + player.secs).slice(-2);\n            player.mins = ('0' + player.mins).slice(-2);\n\n            // Render\n            element.innerHTML = (displayHours ? player.hours + ':' : '') + player.mins + ':' + player.secs;\n        }\n\n        // Show the duration on metadataloaded\n        function _displayDuration() {\n            var duration = player.media.duration || 0;\n\n            // If there's only one time display, display duration there\n            if (!player.duration && config.displayDuration && player.media.paused) {\n                _updateTimeDisplay(duration, player.currentTime);\n            }\n\n            // If there's a duration element, update content\n            if (player.duration) {\n                _updateTimeDisplay(duration, player.duration);\n            }\n        }\n\n        // Handle time change event\n        function _timeUpdate(event) {\n            // Duration\n            _updateTimeDisplay(player.media.currentTime, player.currentTime);\n\n            // Playing progress\n            _updateProgress(event);\n        }\n\n        // Remove <source> children and src attribute\n        function _removeSources() {\n            // Find child <source> elements\n            var sources = player.media.querySelectorAll('source');\n\n            // Remove each\n            for (var i = sources.length - 1; i >= 0; i--) {\n                _remove(sources[i]);\n            }\n\n            // Remove src attribute\n            player.media.removeAttribute('src');\n        }\n\n        // Inject a source\n        function _addSource(attributes) {\n            if (attributes.src) {\n                // Create a new <source>\n                var element = document.createElement('source');\n\n                // Set all passed attributes\n                _setAttributes(element, attributes);\n\n                // Inject the new source\n                _prependChild(player.media, element);\n            }\n        }\n\n        // Update source\n        // Sources are not checked for support so be careful\n        function _parseSource(sources) {\n            // YouTube\n            if (player.type === 'youtube' && typeof sources === 'string') {\n                // Destroy YouTube instance\n                player.embed.destroy();\n\n                // Re-setup YouTube\n                // We don't use loadVideoBy[x] here since it has issues\n                _setupYouTube(sources);\n\n                // Update times\n                _timeUpdate();\n\n                // Bail\n                return;\n            }\n\n            // Pause playback (webkit freaks out)\n            _pause();\n\n            // Restart\n            _seek();\n\n            // Remove current sources\n            _removeSources();\n\n            // If a single source is passed\n            // .source('path/to/video.mp4')\n            if (typeof sources === 'string') {\n                _addSource({\n                    src: sources\n                });\n            }\n\n            // An array of source objects\n            // Check if a source exists, use that or set the 'src' attribute?\n            // .source([{ src: 'path/to/video.mp4', type: 'video/mp4' },{ src: 'path/to/video.webm', type: 'video/webm' }])\n            else if (sources.constructor === Array) {\n                for (var index in sources) {\n                    _addSource(sources[index]);\n                }\n            }\n\n            if (player.supported.full) {\n                // Reset time display\n                _timeUpdate();\n\n                // Update the UI\n                _checkPlaying();\n            }\n\n            // Re-load sources\n            player.media.load();\n\n            // Play if autoplay attribute is present\n            if (player.media.getAttribute('autoplay') !== null) {\n                _play();\n            }\n        }\n\n        // Update poster\n        function _updatePoster(source) {\n            if (player.type === 'video') {\n                player.media.setAttribute('poster', source);\n            }\n        }\n\n        // Listen for events\n        function _listeners() {\n            // IE doesn't support input event, so we fallback to change\n            var inputEvent = (player.browser.name == 'IE' ? 'change' : 'input');\n\n            // Detect tab focus\n            function checkFocus() {\n                var focused = document.activeElement;\n                if (!focused || focused == document.body) {\n                    focused = null;\n                } else if (document.querySelector) {\n                    focused = document.querySelector(':focus');\n                }\n                for (var button in player.buttons) {\n                    var element = player.buttons[button];\n\n                    _toggleClass(element, 'tab-focus', (element === focused));\n                }\n            }\n            _on(window, 'keyup', function (event) {\n                var code = (event.keyCode ? event.keyCode : event.which);\n\n                if (code == 9) {\n                    checkFocus();\n                }\n            });\n            for (var button in player.buttons) {\n                var element = player.buttons[button];\n\n                _on(element, 'blur', function () {\n                    _toggleClass(element, 'tab-focus', false);\n                });\n            }\n\n            // Play\n            _on(player.buttons.play, 'click', function () {\n                _play();\n                setTimeout(function () {\n                    player.buttons.pause.focus();\n                }, 100);\n            });\n\n            // Pause\n            _on(player.buttons.pause, 'click', function () {\n                _pause();\n                setTimeout(function () {\n                    player.buttons.play.focus();\n                }, 100);\n            });\n\n            // Restart\n            _on(player.buttons.restart, 'click', _seek);\n\n            // Rewind\n            _on(player.buttons.rewind, 'click', _rewind);\n\n            // Fast forward\n            _on(player.buttons.forward, 'click', _forward);\n\n            // Seek\n            _on(player.buttons.seek, inputEvent, _seek);\n\n            // Set volume\n            _on(player.volume, inputEvent, function () {\n                _setVolume(this.value);\n            });\n\n            // Mute\n            _on(player.buttons.mute, 'click', _toggleMute);\n\n            // Fullscreen\n            _on(player.buttons.fullscreen, 'click', _toggleFullscreen);\n\n            // Handle user exiting fullscreen by escaping etc\n            if (fullscreen.supportsFullScreen) {\n                _on(document, fullscreen.fullScreenEventName, _toggleFullscreen);\n            }\n\n            // Time change on media\n            _on(player.media, 'timeupdate seeking', _timeUpdate);\n\n            // Update manual captions\n            _on(player.media, 'timeupdate', _seekManualCaptions);\n\n            // Display duration\n            _on(player.media, 'loadedmetadata', _displayDuration);\n\n            // Captions\n            _on(player.buttons.captions, 'click', _toggleCaptions);\n\n            // Handle the media finishing\n            _on(player.media, 'ended', function () {\n                // Clear\n                if (player.type === 'video') {\n                    player.captionsContainer.innerHTML = '';\n                }\n\n                // Reset UI\n                _checkPlaying();\n            });\n\n            // Check for buffer progress\n            _on(player.media, 'progress playing', _updateProgress);\n\n            // Handle native mute\n            _on(player.media, 'volumechange', _updateVolume);\n\n            // Handle native play/pause\n            _on(player.media, 'play pause', _checkPlaying);\n\n            // Loading\n            _on(player.media, 'waiting canplay seeked', _checkLoading);\n\n            // Click video\n            if (player.type === 'video' && config.click) {\n                _on(player.videoContainer, 'click', function () {\n                    if (player.media.paused) {\n                        _triggerEvent(player.buttons.play, 'click');\n                    } else if (player.media.ended) {\n                        _seek();\n                        _triggerEvent(player.buttons.play, 'click');\n                    } else {\n                        _triggerEvent(player.buttons.pause, 'click');\n                    }\n                });\n            }\n        }\n\n        // Destroy an instance\n        // Event listeners are removed when elements are removed\n        // http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n        function _destroy() {\n            // Bail if the element is not initialized\n            if (!player.init) {\n                return null;\n            }\n\n            // Reset container classname\n            player.container.setAttribute('class', config.selectors.container.replace('.', ''));\n\n            // Remove init flag\n            player.init = false;\n\n            // Remove controls\n            _remove(_getElement(config.selectors.controls));\n\n            // YouTube\n            if (player.type === 'youtube') {\n                player.embed.destroy();\n                return;\n            }\n\n            // If video, we need to remove some more\n            if (player.type === 'video') {\n                // Remove captions\n                _remove(_getElement(config.selectors.captions));\n\n                // Remove video wrapper\n                _unwrap(player.videoContainer);\n            }\n\n            // Restore native video controls\n            player.media.setAttribute('controls', '');\n\n            // Clone the media element to remove listeners\n            // http://stackoverflow.com/questions/19469881/javascript-remove-all-event-listeners-of-specific-type\n            var clone = player.media.cloneNode(true);\n            player.media.parentNode.replaceChild(clone, player.media);\n        }\n\n        // Setup a player\n        function _init() {\n            // Bail if the element is initialized\n            if (player.init) {\n                return null;\n            }\n\n            // Setup the fullscreen api\n            fullscreen = _fullscreen();\n\n            // Sniff out the browser\n            player.browser = _browserSniff();\n\n            // Get the media element\n            player.media = player.container.querySelectorAll('audio, video, div')[0];\n\n            // Set media type\n            var tagName = player.media.tagName.toLowerCase();\n            if (tagName === 'div') {\n                player.type = player.media.getAttribute('data-type');\n            } else {\n                player.type = tagName;\n            }\n\n            // Check for full support\n            player.supported = api.supported(player.type);\n\n            // If no native support, bail\n            if (!player.supported.basic) {\n                return false;\n            }\n\n            // Debug info\n            _log(player.browser.name + ' ' + player.browser.version);\n\n            // Setup media\n            _setupMedia();\n\n            // Setup interface\n            if (player.type == 'video' || player.type == 'audio') {\n                // Bail if no support\n                if (!player.supported.full) {\n                    // Successful setup\n                    player.init = true;\n\n                    // Don't inject controls if no full support\n                    return;\n                }\n\n                // Setup UI\n                _setupInterface();\n\n                // Display duration if available\n                if (config.displayDuration) {\n                    _displayDuration();\n                }\n\n                // Set up aria-label for Play button with the title option\n                _setupPlayAria();\n            }\n\n            // Successful setup\n            player.init = true;\n        }\n\n        function _setupInterface() {\n            // Inject custom controls\n            _injectControls();\n\n            // Find the elements\n            if (!_findElements()) {\n                return false;\n            }\n\n            // Captions\n            _setupCaptions();\n\n            // Set volume\n            _setVolume();\n            _updateVolume();\n\n            // Setup fullscreen\n            _setupFullscreen();\n\n            // Listeners\n            _listeners();\n        }\n\n        // Initialize instance\n        _init();\n\n        // If init failed, return an empty object\n        if (!player.init) {\n            return {};\n        }\n\n        return {\n            media: player.media,\n            play: _play,\n            pause: _pause,\n            restart: _seek,\n            rewind: _rewind,\n            forward: _forward,\n            seek: _seek,\n            source: _parseSource,\n            poster: _updatePoster,\n            setVolume: _setVolume,\n            togglePlay: _togglePlay,\n            toggleMute: _toggleMute,\n            toggleCaptions: _toggleCaptions,\n            toggleFullscreen: _toggleFullscreen,\n            isFullscreen: function () {\n                return player.isFullscreen || false;\n            },\n            support: function (mimeType) {\n                return _supportMime(player, mimeType);\n            },\n            destroy: _destroy,\n            restore: _init\n        };\n    }\n\n    // Check for support\n    api.supported = function (type) {\n        var browser = _browserSniff(),\n            oldIE = (browser.name === 'IE' && browser.version <= 9),\n            iPhone = /iPhone|iPod/i.test(navigator.userAgent),\n            audio = !!document.createElement('audio').canPlayType,\n            video = !!document.createElement('video').canPlayType,\n            basic, full;\n\n        switch (type) {\n        case 'video':\n            basic = video;\n            full = (basic && (!oldIE && !iPhone));\n            break;\n\n        case 'audio':\n            basic = audio;\n            full = (basic && !oldIE);\n            break;\n\n        case 'youtube':\n            basic = true;\n            full = (!oldIE && !iPhone);\n            break;\n\n        default:\n            basic = (audio && video);\n            full = (basic && !oldIE);\n        }\n\n        return {\n            basic: basic,\n            full: full\n        };\n    };\n\n    // Expose setup function\n    api.setup = function (options) {\n        // Extend the default options with user specified\n        config = _extend(defaults, options);\n\n        // Bail if disabled or no basic support\n        // You may want to disable certain UAs etc\n        if (!config.enabled || !api.supported().basic) {\n            return false;\n        }\n\n        // Get the players\n        var elements = document.querySelectorAll(config.selectors.container),\n            players = [];\n\n        // Create a player instance for each element\n        for (var i = elements.length - 1; i >= 0; i--) {\n            // Get the current element\n            var element = elements[i];\n\n            // Setup a player instance and add to the element\n            if (typeof element.plyr === 'undefined') {\n                // Create new instance\n                var instance = new Plyr(element);\n\n                // Set plyr to false if setup failed\n                element.plyr = (Object.keys(instance).length ? instance : false);\n\n                // Callback\n                if (typeof config.onSetup === 'function') {\n                    config.onSetup.apply(element.plyr);\n                }\n            }\n\n            // Add to return array even if it's already setup\n            players.push(element.plyr);\n        }\n\n        return players;\n    };\n\n}(this.plyr = this.plyr || {}));\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/prettyfile/bootstrap-prettyfile.js",
    "content": "/*\n * jQuery and Bootsrap3 Plugin prettyFile\n *\n * version 2.0, Jan 20th, 2014\n * by episage, sujin2f\n * Git repository : https://github.com/episage/bootstrap-3-pretty-file-upload\n */\n( function( $ ) {\n\t$.fn.extend({\n\t\tprettyFile: function( options ) {\n\t\t\tvar defaults = {\n\t\t\t\ttext : \"选择文件\"\n\t\t\t};\n\n\t\t\tvar options =  $.extend(defaults, options);\n\t\t\tvar plugin = this;\n\n\t\t\tfunction make_form( $el, text ) {\n\t\t\t\t$el.wrap('<div></div>');\n\n\t\t\t\t$el.hide();\n\t\t\t\t$el.after( '\\\n\t\t\t\t<div class=\"input-append input-group\"\">\\\n\t\t\t\t\t<span class=\"input-group-btn\">\\\n\t\t\t\t\t\t<button class=\"btn btn-white\" type=\"button\">' + text + '</button>\\\n\t\t\t\t\t</span>\\\n\t\t\t\t\t<input class=\"input-large form-control\" type=\"text\">\\\n\t\t\t\t</div>\\\n\t\t\t\t' );\n\n\t\t\t\treturn $el.parent();\n\t\t\t};\n\n\t\t\tfunction bind_change( $wrap, multiple ) {\n\t\t\t\t$wrap.find( 'input[type=\"file\"]' ).change(function () {\n\t\t\t\t\t// When original file input changes, get its value, show it in the fake input\n\t\t\t\t\tvar files = $( this )[0].files,\n\t\t\t\t\tinfo = '';\n\n\t\t\t\t\tif ( files.length == 0 )\n\t\t\t\t\t\treturn false;\n\n\t\t\t\t\tif ( !multiple || files.length == 1 ) {\n\t\t\t\t\t\tvar path = $( this ).val().split('\\\\');\n\t\t\t\t\t\tinfo = path[path.length - 1];\n\t\t\t\t\t} else if ( files.length > 1 ) {\n\t\t\t\t\t\t// Display number of selected files instead of filenames\n\t\t\t\t\t\tinfo = \"已选择了\" + files.length + ' 个文件';\n\t\t\t\t\t}\n\n\t\t\t\t\t$wrap.find('.input-append input').val( info );\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tfunction bind_button( $wrap, multiple ) {\n\t\t\t\t$wrap.find( '.input-append' ).click( function( e ) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\t$wrap.find( 'input[type=\"file\"]' ).click();\n\t\t\t\t});\n\t\t\t};\n\n\t\t\treturn plugin.each( function() {\n\t\t\t\t$this = $( this );\n\n\t\t\t\tif ( $this ) {\n\t\t\t\t\tvar multiple = $this.attr( 'multiple' );\n\n\t\t\t\t\t$wrap = make_form( $this, options.text );\n\t\t\t\t\tbind_change( $wrap, multiple );\n\t\t\t\t\tbind_button( $wrap );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n}( jQuery ));\n\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/rickshaw/vendor/d3.v3.js",
    "content": "d3=function(){function n(n){return null!=n&&!isNaN(n)}function t(n){return n.length}function e(n){for(var t=1;n*t%1;)t*=10;return t}function r(n,t){try{for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}catch(r){n.prototype=t}}function u(){}function i(){}function o(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function a(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.substring(1);for(var e=0,r=Do.length;r>e;++e){var u=Do[e]+t;if(u in n)return u}}function c(){}function l(){}function s(n){function t(){for(var t,r=e,u=-1,i=r.length;++u<i;)(t=r[u].on)&&t.apply(this,arguments);return n}var e=[],r=new u;return t.on=function(t,u){var i,o=r.get(t);return arguments.length<2?o&&o.on:(o&&(o.on=null,e=e.slice(0,i=e.indexOf(o)).concat(e.slice(i+1)),r.remove(t)),u&&e.push(r.set(t,{on:u})),n)},t}function f(){mo.event.preventDefault()}function h(){for(var n,t=mo.event;n=t.sourceEvent;)t=n;return t}function g(n){for(var t=new l,e=0,r=arguments.length;++e<r;)t[arguments[e]]=s(t);return t.of=function(e,r){return function(u){try{var i=u.sourceEvent=mo.event;u.target=n,mo.event=u,t[u.type].apply(e,r)}finally{mo.event=i}}},t}function p(n){return Lo(n,Ro),n}function d(n){return\"function\"==typeof n?n:function(){return Ho(n,this)}}function v(n){return\"function\"==typeof n?n:function(){return Fo(n,this)}}function m(n,t){function e(){this.removeAttribute(n)}function r(){this.removeAttributeNS(n.space,n.local)}function u(){this.setAttribute(n,t)}function i(){this.setAttributeNS(n.space,n.local,t)}function o(){var e=t.apply(this,arguments);null==e?this.removeAttribute(n):this.setAttribute(n,e)}function a(){var e=t.apply(this,arguments);null==e?this.removeAttributeNS(n.space,n.local):this.setAttributeNS(n.space,n.local,e)}return n=mo.ns.qualify(n),null==t?n.local?r:e:\"function\"==typeof t?n.local?a:o:n.local?i:u}function y(n){return n.trim().replace(/\\s+/g,\" \")}function M(n){return new RegExp(\"(?:^|\\\\s+)\"+mo.requote(n)+\"(?:\\\\s+|$)\",\"g\")}function x(n,t){function e(){for(var e=-1;++e<u;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e<u;)n[e](this,r)}n=n.trim().split(/\\s+/).map(b);var u=n.length;return\"function\"==typeof t?r:e}function b(n){var t=M(n);return function(e,r){if(u=e.classList)return r?u.add(n):u.remove(n);var u=e.getAttribute(\"class\")||\"\";r?(t.lastIndex=0,t.test(u)||e.setAttribute(\"class\",y(u+\" \"+n))):e.setAttribute(\"class\",y(u.replace(t,\" \")))}}function _(n,t,e){function r(){this.style.removeProperty(n)}function u(){this.style.setProperty(n,t,e)}function i(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(n):this.style.setProperty(n,r,e)}return null==t?r:\"function\"==typeof t?i:u}function w(n,t){function e(){delete this[n]}function r(){this[n]=t}function u(){var e=t.apply(this,arguments);null==e?delete this[n]:this[n]=e}return null==t?e:\"function\"==typeof t?u:r}function S(n){return\"function\"==typeof n?n:(n=mo.ns.qualify(n)).local?function(){return xo.createElementNS(n.space,n.local)}:function(){return xo.createElementNS(this.namespaceURI,n)}}function E(n){return{__data__:n}}function k(n){return function(){return Oo(this,n)}}function A(n){return arguments.length||(n=mo.ascending),function(t,e){return t&&e?n(t.__data__,e.__data__):!t-!e}}function N(n,t){for(var e=0,r=n.length;r>e;e++)for(var u,i=n[e],o=0,a=i.length;a>o;o++)(u=i[o])&&t(u,o,e);return n}function T(n){return Lo(n,Io),n}function q(n){var t,e;return function(r,u,i){var o,a=n[i].update,c=a.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(o=a[t])&&++t<c;);return o}}function z(){var n=this.__transition__;n&&++n.active}function C(n,t,e){function r(){var t=this[o];t&&(this.removeEventListener(n,t,t.$),delete this[o])}function u(){var u=l(t,Mo(arguments));r.call(this),this.addEventListener(n,this[o]=u,u.$=e),u._=t}function i(){var t,e=new RegExp(\"^__on([^.]+)\"+mo.requote(n)+\"$\");for(var r in this)if(t=r.match(e)){var u=this[r];this.removeEventListener(t[1],u,u.$),delete this[r]}}var o=\"__on\"+n,a=n.indexOf(\".\"),l=D;a>0&&(n=n.substring(0,a));var s=Zo.get(n);return s&&(n=s,l=j),a?t?u:r:t?c:i}function D(n,t){return function(e){var r=mo.event;mo.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{mo.event=r}}}function j(n,t){var e=D(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function L(){var n=\".dragsuppress-\"+ ++Xo,t=\"touchmove\"+n,e=\"selectstart\"+n,r=\"dragstart\"+n,u=\"click\"+n,i=mo.select(_o).on(t,f).on(e,f).on(r,f),o=bo.style,a=o[Vo];return o[Vo]=\"none\",function(t){function e(){i.on(u,null)}i.on(n,null),o[Vo]=a,t&&(i.on(u,function(){f(),e()},!0),setTimeout(e,0))}}function H(n,t){t.changedTouches&&(t=t.changedTouches[0]);var e=n.ownerSVGElement||n;if(e.createSVGPoint){var r=e.createSVGPoint();if(0>$o&&(_o.scrollX||_o.scrollY)){e=mo.select(\"body\").append(\"svg\").style({position:\"absolute\",top:0,left:0,margin:0,padding:0,border:\"none\"},\"important\");var u=e[0][0].getScreenCTM();$o=!(u.f||u.e),e.remove()}return $o?(r.x=t.pageX,r.y=t.pageY):(r.x=t.clientX,r.y=t.clientY),r=r.matrixTransform(n.getScreenCTM().inverse()),[r.x,r.y]}var i=n.getBoundingClientRect();return[t.clientX-i.left-n.clientLeft,t.clientY-i.top-n.clientTop]}function F(n){return n>0?1:0>n?-1:0}function P(n){return n>1?0:-1>n?Bo:Math.acos(n)}function O(n){return n>1?Jo:-1>n?-Jo:Math.asin(n)}function R(n){return((n=Math.exp(n))-1/n)/2}function Y(n){return((n=Math.exp(n))+1/n)/2}function I(n){return((n=Math.exp(2*n))-1)/(n+1)}function U(n){return(n=Math.sin(n/2))*n}function Z(){}function V(n,t,e){return new X(n,t,e)}function X(n,t,e){this.h=n,this.s=t,this.l=e}function $(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(o-i)*n/60:180>n?o:240>n?i+(o-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,i=2*e-o,ot(u(n+120),u(n),u(n-120))}function B(n,t,e){return new W(n,t,e)}function W(n,t,e){this.h=n,this.c=t,this.l=e}function J(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),G(e,Math.cos(n*=Qo)*t,Math.sin(n)*t)}function G(n,t,e){return new K(n,t,e)}function K(n,t,e){this.l=n,this.a=t,this.b=e}function Q(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=tt(u)*sa,r=tt(r)*fa,i=tt(i)*ha,ot(rt(3.2404542*u-1.5371385*r-.4985314*i),rt(-.969266*u+1.8760108*r+.041556*i),rt(.0556434*u-.2040259*r+1.0572252*i))}function nt(n,t,e){return n>0?B(Math.atan2(e,t)*na,Math.sqrt(t*t+e*e),n):B(0/0,0/0,n)}function tt(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function et(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function rt(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function ut(n){return ot(n>>16,255&n>>8,255&n)}function it(n){return ut(n)+\"\"}function ot(n,t,e){return new at(n,t,e)}function at(n,t,e){this.r=n,this.g=t,this.b=e}function ct(n){return 16>n?\"0\"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function lt(n,t,e){var r,u,i,o=0,a=0,c=0;if(r=/([a-z]+)\\((.*)\\)/i.exec(n))switch(u=r[2].split(\",\"),r[1]){case\"hsl\":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case\"rgb\":return t(gt(u[0]),gt(u[1]),gt(u[2]))}return(i=da.get(n))?t(i.r,i.g,i.b):(null!=n&&\"#\"===n.charAt(0)&&(4===n.length?(o=n.charAt(1),o+=o,a=n.charAt(2),a+=a,c=n.charAt(3),c+=c):7===n.length&&(o=n.substring(1,3),a=n.substring(3,5),c=n.substring(5,7)),o=parseInt(o,16),a=parseInt(a,16),c=parseInt(c,16)),t(o,a,c))}function st(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-i,c=(o+i)/2;return a?(u=.5>c?a/(o+i):a/(2-o-i),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=0/0,u=c>0&&1>c?0:r),V(r,u,c)}function ft(n,t,e){n=ht(n),t=ht(t),e=ht(e);var r=et((.4124564*n+.3575761*t+.1804375*e)/sa),u=et((.2126729*n+.7151522*t+.072175*e)/fa),i=et((.0193339*n+.119192*t+.9503041*e)/ha);return G(116*u-16,500*(r-u),200*(u-i))}function ht(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function gt(n){var t=parseFloat(n);return\"%\"===n.charAt(n.length-1)?Math.round(2.55*t):t}function pt(n){return\"function\"==typeof n?n:function(){return n}}function dt(n){return n}function vt(n){return function(t,e,r){return 2===arguments.length&&\"function\"==typeof e&&(r=e,e=null),mt(t,e,n,r)}}function mt(n,t,e,r){function u(){var n,t=c.status;if(!t&&c.responseText||t>=200&&300>t||304===t){try{n=e.call(i,c)}catch(r){return o.error.call(i,r),void 0}o.load.call(i,n)}else o.error.call(i,c)}var i={},o=mo.dispatch(\"beforesend\",\"progress\",\"load\",\"error\"),a={},c=new XMLHttpRequest,l=null;return!_o.XDomainRequest||\"withCredentials\"in c||!/^(http(s)?:)?\\/\\//.test(n)||(c=new XDomainRequest),\"onload\"in c?c.onload=c.onerror=u:c.onreadystatechange=function(){c.readyState>3&&u()},c.onprogress=function(n){var t=mo.event;mo.event=n;try{o.progress.call(i,c)}finally{mo.event=t}},i.header=function(n,t){return n=(n+\"\").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+\"\",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+\"\",i):t},i.responseType=function(n){return arguments.length?(l=n,i):l},i.response=function(n){return e=n,i},[\"get\",\"post\"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(Mo(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&\"function\"==typeof r&&(u=r,r=null),c.open(e,n,!0),null==t||\"accept\"in a||(a.accept=t+\",*/*\"),c.setRequestHeader)for(var s in a)c.setRequestHeader(s,a[s]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=l&&(c.responseType=l),null!=u&&i.on(\"error\",u).on(\"load\",function(n){u(null,n)}),o.beforesend.call(i,c),c.send(null==r?null:r),i},i.abort=function(){return c.abort(),i},mo.rebind(i,o,\"on\"),null==r?i:i.get(yt(r))}function yt(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Mt(){var n=bt(),t=_t()-n;t>24?(isFinite(t)&&(clearTimeout(Ma),Ma=setTimeout(Mt,t)),ya=0):(ya=1,ba(Mt))}function xt(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now()),xa.callback=n,xa.time=e+t}function bt(){var n=Date.now();for(xa=va;xa;)n>=xa.time&&(xa.flush=xa.callback(n-xa.time)),xa=xa.next;return n}function _t(){for(var n,t=va,e=1/0;t;)t.flush?t=n?n.next=t.next:va=t.next:(t.time<e&&(e=t.time),t=(n=t).next);return ma=n,e}function wt(n,t){var e=Math.pow(10,3*Math.abs(8-t));return{scale:t>8?function(n){return n/e}:function(n){return n*e},symbol:n}}function St(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function Et(n){return n+\"\"}function kt(){}function At(n,t,e){var r=e.s=n+t,u=r-n,i=r-u;e.t=n-i+(t-u)}function Nt(n,t){n&&Da.hasOwnProperty(n.type)&&Da[n.type](n,t)}function Tt(n,t,e){var r,u=-1,i=n.length-e;for(t.lineStart();++u<i;)r=n[u],t.point(r[0],r[1],r[2]);t.lineEnd()}function qt(n,t){var e=-1,r=n.length;for(t.polygonStart();++e<r;)Tt(n[e],t,1);t.polygonEnd()}function zt(){function n(n,t){n*=Qo,t=t*Qo/2+Bo/4;var e=n-r,o=Math.cos(t),a=Math.sin(t),c=i*a,l=u*o+c*Math.cos(e),s=c*Math.sin(e);La.add(Math.atan2(s,l)),r=n,u=o,i=a}var t,e,r,u,i;Ha.point=function(o,a){Ha.point=n,r=(t=o)*Qo,u=Math.cos(a=(e=a)*Qo/2+Bo/4),i=Math.sin(a)},Ha.lineEnd=function(){n(t,e)}}function Ct(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function Dt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function jt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function Lt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function Ht(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function Ft(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function Pt(n){return[Math.atan2(n[1],n[0]),O(n[2])]}function Ot(n,t){return Math.abs(n[0]-t[0])<Go&&Math.abs(n[1]-t[1])<Go}function Rt(n,t){n*=Qo;var e=Math.cos(t*=Qo);Yt(e*Math.cos(n),e*Math.sin(n),Math.sin(t))}function Yt(n,t,e){++Fa,Oa+=(n-Oa)/Fa,Ra+=(t-Ra)/Fa,Ya+=(e-Ya)/Fa}function It(){function n(n,u){n*=Qo;var i=Math.cos(u*=Qo),o=i*Math.cos(n),a=i*Math.sin(n),c=Math.sin(u),l=Math.atan2(Math.sqrt((l=e*c-r*a)*l+(l=r*o-t*c)*l+(l=t*a-e*o)*l),t*o+e*a+r*c);Pa+=l,Ia+=l*(t+(t=o)),Ua+=l*(e+(e=a)),Za+=l*(r+(r=c)),Yt(t,e,r)}var t,e,r;Ba.point=function(u,i){u*=Qo;var o=Math.cos(i*=Qo);t=o*Math.cos(u),e=o*Math.sin(u),r=Math.sin(i),Ba.point=n,Yt(t,e,r)}}function Ut(){Ba.point=Rt}function Zt(){function n(n,t){n*=Qo;var e=Math.cos(t*=Qo),o=e*Math.cos(n),a=e*Math.sin(n),c=Math.sin(t),l=u*c-i*a,s=i*o-r*c,f=r*a-u*o,h=Math.sqrt(l*l+s*s+f*f),g=r*o+u*a+i*c,p=h&&-P(g)/h,d=Math.atan2(h,g);Va+=p*l,Xa+=p*s,$a+=p*f,Pa+=d,Ia+=d*(r+(r=o)),Ua+=d*(u+(u=a)),Za+=d*(i+(i=c)),Yt(r,u,i)}var t,e,r,u,i;Ba.point=function(o,a){t=o,e=a,Ba.point=n,o*=Qo;var c=Math.cos(a*=Qo);r=c*Math.cos(o),u=c*Math.sin(o),i=Math.sin(a),Yt(r,u,i)},Ba.lineEnd=function(){n(t,e),Ba.lineEnd=Ut,Ba.point=Rt}}function Vt(){return!0}function Xt(n,t,e,r,u){var i=[],o=[];if(n.forEach(function(n){if(!((t=n.length-1)<=0)){var t,e=n[0],r=n[t];if(Ot(e,r)){u.lineStart();for(var a=0;t>a;++a)u.point((e=n[a])[0],e[1]);return u.lineEnd(),void 0}var c={point:e,points:n,other:null,visited:!1,entry:!0,subject:!0},l={point:e,points:[e],other:c,visited:!1,entry:!1,subject:!1};c.other=l,i.push(c),o.push(l),c={point:r,points:[r],other:null,visited:!1,entry:!1,subject:!0},l={point:r,points:[r],other:c,visited:!1,entry:!0,subject:!1},c.other=l,i.push(c),o.push(l)}}),o.sort(t),$t(i),$t(o),i.length){for(var a=0,c=e,l=o.length;l>a;++a)o[a].entry=c=!c;for(var s,f,h,g=i[0];;){for(s=g;s.visited;)if((s=s.next)===g)return;f=s.points,u.lineStart();do{if(s.visited=s.other.visited=!0,s.entry){if(s.subject)for(var a=0;a<f.length;a++)u.point((h=f[a])[0],h[1]);else r(s.point,s.next.point,1,u);s=s.next}else{if(s.subject){f=s.prev.points;for(var a=f.length;--a>=0;)u.point((h=f[a])[0],h[1])}else r(s.point,s.prev.point,-1,u);s=s.prev}s=s.other,f=s.points}while(!s.visited);u.lineEnd()}}}function $t(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r<t;)u.next=e=n[r],e.prev=u,u=e;u.next=e=n[0],e.prev=u}}function Bt(n,t,e,r){return function(u,i){function o(t,e){var r=u(t,e);n(t=r[0],e=r[1])&&i.point(t,e)}function a(n,t){var e=u(n,t);v.point(e[0],e[1])}function c(){y.point=a,v.lineStart()}function l(){y.point=o,v.lineEnd()}function s(n,t){d.push([n,t]);var e=u(n,t);x.point(e[0],e[1])}function f(){x.lineStart(),d=[]}function h(){s(d[0][0],d[0][1]),x.lineEnd();var n,t=x.clean(),e=M.buffer(),r=e.length;if(d.pop(),p.push(d),d=null,r){if(1&t){n=e[0];var u,r=n.length-1,o=-1;for(i.lineStart();++o<r;)i.point((u=n[o])[0],u[1]);return i.lineEnd(),void 0}r>1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Wt))}}var g,p,d,v=t(i),m=u.invert(r[0],r[1]),y={point:o,lineStart:c,lineEnd:l,polygonStart:function(){y.point=s,y.lineStart=f,y.lineEnd=h,g=[],p=[],i.polygonStart()},polygonEnd:function(){y.point=o,y.lineStart=c,y.lineEnd=l,g=mo.merge(g);var n=Kt(m,p);g.length?Xt(g,Gt,n,e,i):n&&(i.lineStart(),e(null,null,1,i),i.lineEnd()),i.polygonEnd(),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},M=Jt(),x=t(M);return y}}function Wt(n){return n.length>1}function Jt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:c,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Gt(n,t){return((n=n.point)[0]<0?n[1]-Jo-Go:Jo-n[1])-((t=t.point)[0]<0?t[1]-Jo-Go:Jo-t[1])}function Kt(n,t){var e=n[0],r=n[1],u=[Math.sin(e),-Math.cos(e),0],i=0,o=0;La.reset();for(var a=0,c=t.length;c>a;++a){var l=t[a],s=l.length;if(s)for(var f=l[0],h=f[0],g=f[1]/2+Bo/4,p=Math.sin(g),d=Math.cos(g),v=1;;){v===s&&(v=0),n=l[v];var m=n[0],y=n[1]/2+Bo/4,M=Math.sin(y),x=Math.cos(y),b=m-h,_=Math.abs(b)>Bo,w=p*M;if(La.add(Math.atan2(w*Math.sin(b),d*x+w*Math.cos(b))),i+=_?b+(b>=0?2:-2)*Bo:b,_^h>=e^m>=e){var S=jt(Ct(f),Ct(n));Ft(S);var E=jt(u,S);Ft(E);var k=(_^b>=0?-1:1)*O(E[2]);(r>k||r===k&&(S[0]||S[1]))&&(o+=_^b>=0?1:-1)}if(!v++)break;h=m,p=M,d=x,f=n}}return(-Go>i||Go>i&&0>La)^1&o}function Qt(n){var t,e=0/0,r=0/0,u=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(i,o){var a=i>0?Bo:-Bo,c=Math.abs(i-e);Math.abs(c-Bo)<Go?(n.point(e,r=(r+o)/2>0?Jo:-Jo),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(i,r),t=0):u!==a&&c>=Bo&&(Math.abs(e-u)<Go&&(e-=u*Go),Math.abs(i-a)<Go&&(i-=a*Go),r=ne(e,r,i,o),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),t=0),n.point(e=i,r=o),u=a},lineEnd:function(){n.lineEnd(),e=r=0/0},clean:function(){return 2-t}}}function ne(n,t,e,r){var u,i,o=Math.sin(n-e);return Math.abs(o)>Go?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*o)):(t+r)/2}function te(n,t,e,r){var u;if(null==n)u=e*Jo,r.point(-Bo,u),r.point(0,u),r.point(Bo,u),r.point(Bo,0),r.point(Bo,-u),r.point(0,-u),r.point(-Bo,-u),r.point(-Bo,0),r.point(-Bo,u);else if(Math.abs(n[0]-t[0])>Go){var i=(n[0]<t[0]?1:-1)*Bo;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(t[0],t[1])}function ee(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,c,l,s;return{lineStart:function(){l=c=!1,s=1},point:function(f,h){var g,p=[f,h],d=t(f,h),v=o?d?0:u(f,h):d?u(f+(0>f?Bo:-Bo),h):0;if(!e&&(l=c=d)&&n.lineStart(),d!==c&&(g=r(e,p),(Ot(e,g)||Ot(p,g))&&(p[0]+=Go,p[1]+=Go,d=t(p[0],p[1]))),d!==c)s=0,d?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(a&&e&&o^d){var m;v&i||!(m=r(p,e,!0))||(s=0,o?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!d||e&&Ot(e,p)||n.point(p[0],p[1]),e=p,c=d,i=v},lineEnd:function(){c&&n.lineEnd(),e=null},clean:function(){return s|(l&&c)<<1}}}function r(n,t,e){var r=Ct(n),u=Ct(t),o=[1,0,0],a=jt(r,u),c=Dt(a,a),l=a[0],s=c-l*l;if(!s)return!e&&n;var f=i*c/s,h=-i*l/s,g=jt(o,a),p=Ht(o,f),d=Ht(a,h);Lt(p,d);var v=g,m=Dt(p,v),y=Dt(v,v),M=m*m-y*(Dt(p,p)-1);if(!(0>M)){var x=Math.sqrt(M),b=Ht(v,(-m-x)/y);if(Lt(b,p),b=Pt(b),!e)return b;var _,w=n[0],S=t[0],E=n[1],k=t[1];w>S&&(_=w,w=S,S=_);var A=S-w,N=Math.abs(A-Bo)<Go,T=N||Go>A;if(!N&&E>k&&(_=E,E=k,k=_),T?N?E+k>0^b[1]<(Math.abs(b[0]-w)<Go?E:k):E<=b[1]&&b[1]<=k:A>Bo^(w<=b[0]&&b[0]<=S)){var q=Ht(v,(-m+x)/y);return Lt(q,p),[b,Pt(q)]}}}function u(t,e){var r=o?n:Bo-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),o=i>0,a=Math.abs(i)>Go,c=Te(n,6*Qo);return Bt(t,e,c,o?[0,-n]:[-Bo,n-Bo])}function re(n,t,e,r){function u(r,u){return Math.abs(r[0]-n)<Go?u>0?0:3:Math.abs(r[0]-e)<Go?u>0?2:1:Math.abs(r[1]-t)<Go?u>0?1:0:u>0?3:2}function i(n,t){return o(n.point,t.point)}function o(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}function a(u,i){var o=i[0]-u[0],a=i[1]-u[1],c=[0,1];return Math.abs(o)<Go&&Math.abs(a)<Go?n<=u[0]&&u[0]<=e&&t<=u[1]&&u[1]<=r:ue(n-u[0],o,c)&&ue(u[0]-e,-o,c)&&ue(t-u[1],a,c)&&ue(u[1]-r,-a,c)?(c[1]<1&&(i[0]=u[0]+c[1]*o,i[1]=u[1]+c[1]*a),c[0]>0&&(u[0]+=c[0]*o,u[1]+=c[0]*a),!0):!1}return function(c){function l(n){for(var t=0,e=y.length,r=n[1],u=0;e>u;++u)for(var i,o=1,a=y[u],c=a.length,l=a[0];c>o;++o)i=a[o],l[1]<=r?i[1]>r&&s(l,i,n)>0&&++t:i[1]<=r&&s(l,i,n)<0&&--t,l=i;return 0!==t}function s(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(e[0]-n[0])*(t[1]-n[1])}function f(i,a,c,l){var s=0,f=0;if(null==i||(s=u(i,c))!==(f=u(a,c))||o(i,a)<0^c>0){do l.point(0===s||3===s?n:e,s>1?r:t);while((s=(s+c+4)%4)!==f)}else l.point(a[0],a[1])}function h(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function g(n,t){h(n,t)&&c.point(n,t)}function p(){q.point=v,y&&y.push(M=[]),k=!0,E=!1,w=S=0/0}function d(){m&&(v(x,b),_&&E&&T.rejoin(),m.push(T.buffer())),q.point=g,E&&c.lineEnd()}function v(n,t){n=Math.max(-Ja,Math.min(Ja,n)),t=Math.max(-Ja,Math.min(Ja,t));var e=h(n,t);if(y&&M.push([n,t]),k)x=n,b=t,_=e,k=!1,e&&(c.lineStart(),c.point(n,t));else if(e&&E)c.point(n,t);else{var r=[w,S],u=[n,t];a(r,u)?(E||(c.lineStart(),c.point(r[0],r[1])),c.point(u[0],u[1]),e||c.lineEnd(),A=!1):e&&(c.lineStart(),c.point(n,t),A=!1)}w=n,S=t,E=e}var m,y,M,x,b,_,w,S,E,k,A,N=c,T=Jt(),q={point:g,lineStart:p,lineEnd:d,polygonStart:function(){c=T,m=[],y=[],A=!0},polygonEnd:function(){c=N,m=mo.merge(m);var t=l([n,r]),e=A&&t,u=m.length;(e||u)&&(c.polygonStart(),e&&(c.lineStart(),f(null,null,1,c),c.lineEnd()),u&&Xt(m,i,t,f,c),c.polygonEnd()),m=y=M=null}};return q}}function ue(n,t,e){if(Math.abs(t)<Go)return 0>=n;var r=n/t;if(t>0){if(r>e[1])return!1;r>e[0]&&(e[0]=r)}else{if(r<e[0])return!1;r<e[1]&&(e[1]=r)}return!0}function ie(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function oe(n){var t=0,e=Bo/3,r=be(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*Bo/180,e=n[1]*Bo/180):[180*(t/Bo),180*(e/Bo)]},u}function ae(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),o-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),o=Math.sqrt(i)/u;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/u,O((i-(n*n+e*e)*u*u)/(2*u))]},e}function ce(){function n(n,t){Ka+=u*n-r*t,r=n,u=t}var t,e,r,u;rc.point=function(i,o){rc.point=n,t=r=i,e=u=o},rc.lineEnd=function(){n(t,e)}}function le(n,t){Qa>n&&(Qa=n),n>tc&&(tc=n),nc>t&&(nc=t),t>ec&&(ec=t)}function se(){function n(n,t){o.push(\"M\",n,\",\",t,i)}function t(n,t){o.push(\"M\",n,\",\",t),a.point=e}function e(n,t){o.push(\"L\",n,\",\",t)}function r(){a.point=n}function u(){o.push(\"Z\")}var i=fe(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return i=fe(n),a},result:function(){if(o.length){var n=o.join(\"\");return o=[],n}}};return a}function fe(n){return\"m0,\"+n+\"a\"+n+\",\"+n+\" 0 1,1 0,\"+-2*n+\"a\"+n+\",\"+n+\" 0 1,1 0,\"+2*n+\"z\"}function he(n,t){Oa+=n,Ra+=t,++Ya}function ge(){function n(n,r){var u=n-t,i=r-e,o=Math.sqrt(u*u+i*i);Ia+=o*(t+n)/2,Ua+=o*(e+r)/2,Za+=o,he(t=n,e=r)}var t,e;ic.point=function(r,u){ic.point=n,he(t=r,e=u)}}function pe(){ic.point=he}function de(){function n(n,t){var e=n-r,i=t-u,o=Math.sqrt(e*e+i*i);Ia+=o*(r+n)/2,Ua+=o*(u+t)/2,Za+=o,o=u*n-r*t,Va+=o*(r+n),Xa+=o*(u+t),$a+=3*o,he(r=n,u=t)}var t,e,r,u;ic.point=function(i,o){ic.point=n,he(t=r=i,e=u=o)},ic.lineEnd=function(){n(t,e)}}function ve(n){function t(t,e){n.moveTo(t,e),n.arc(t,e,o,0,Wo)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function u(){a.point=t}function i(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:u,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=u,a.point=t},pointRadius:function(n){return o=n,a},result:c};return a}function me(n){function t(t){function r(e,r){e=n(e,r),t.point(e[0],e[1])}function u(){M=0/0,S.point=o,t.lineStart()}function o(r,u){var o=Ct([r,u]),a=n(r,u);e(M,x,y,b,_,w,M=a[0],x=a[1],y=r,b=o[0],_=o[1],w=o[2],i,t),t.point(M,x)}function a(){S.point=r,t.lineEnd()}function c(){u(),S.point=l,S.lineEnd=s}function l(n,t){o(f=n,h=t),g=M,p=x,d=b,v=_,m=w,S.point=o}function s(){e(M,x,y,b,_,w,g,p,f,d,v,m,i,t),S.lineEnd=a,a()}var f,h,g,p,d,v,m,y,M,x,b,_,w,S={point:r,lineStart:u,lineEnd:a,polygonStart:function(){t.polygonStart(),S.lineStart=c},polygonEnd:function(){t.polygonEnd(),S.lineStart=u}};return S}function e(t,i,o,a,c,l,s,f,h,g,p,d,v,m){var y=s-t,M=f-i,x=y*y+M*M;if(x>4*r&&v--){var b=a+g,_=c+p,w=l+d,S=Math.sqrt(b*b+_*_+w*w),E=Math.asin(w/=S),k=Math.abs(Math.abs(w)-1)<Go?(o+h)/2:Math.atan2(_,b),A=n(k,E),N=A[0],T=A[1],q=N-t,z=T-i,C=M*q-y*z;(C*C/x>r||Math.abs((y*q+M*z)/x-.5)>.3||u>a*g+c*p+l*d)&&(e(t,i,o,a,c,l,N,T,k,b/=S,_/=S,w,v,m),m.point(N,T),e(N,T,k,b,_,w,s,f,h,g,p,d,v,m))}}var r=.5,u=Math.cos(30*Qo),i=16;return t.precision=function(n){return arguments.length?(i=(r=n*n)>0&&16,t):Math.sqrt(r)},t}function ye(n){this.stream=n}function Me(n){var t=me(function(t,e){return n([t*na,e*na])});return function(n){var e=new ye(n=t(n));return e.point=function(t,e){n.point(t*Qo,e*Qo)},e}}function xe(n){return be(function(){return n})()}function be(n){function t(n){return n=a(n[0]*Qo,n[1]*Qo),[n[0]*h+c,l-n[1]*h]}function e(n){return n=a.invert((n[0]-c)/h,(l-n[1])/h),n&&[n[0]*na,n[1]*na]}function r(){a=ie(o=Ee(m,y,M),i);var n=i(d,v);return c=g-n[0]*h,l=p+n[1]*h,u()}function u(){return s&&(s.valid=!1,s=null),t}var i,o,a,c,l,s,f=me(function(n,t){return n=i(n,t),[n[0]*h+c,l-n[1]*h]}),h=150,g=480,p=250,d=0,v=0,m=0,y=0,M=0,x=Wa,b=dt,_=null,w=null;return t.stream=function(n){return s&&(s.valid=!1),s=_e(x(o,f(b(n)))),s.valid=!0,s},t.clipAngle=function(n){return arguments.length?(x=null==n?(_=n,Wa):ee((_=+n)*Qo),u()):_},t.clipExtent=function(n){return arguments.length?(w=n,b=n?re(n[0][0],n[0][1],n[1][0],n[1][1]):dt,u()):w},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(d=n[0]%360*Qo,v=n[1]%360*Qo,r()):[d*na,v*na]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Qo,y=n[1]%360*Qo,M=n.length>2?n[2]%360*Qo:0,r()):[m*na,y*na,M*na]},mo.rebind(t,f,\"precision\"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function _e(n){var t=new ye(n);return t.point=function(t,e){n.point(t*Qo,e*Qo)},t}function we(n,t){return[n,t]}function Se(n,t){return[n>Bo?n-Wo:-Bo>n?n+Wo:n,t]}function Ee(n,t,e){return n?t||e?ie(Ae(n),Ne(t,e)):Ae(n):t||e?Ne(t,e):Se}function ke(n){return function(t,e){return t+=n,[t>Bo?t-Wo:-Bo>t?t+Wo:t,e]}}function Ae(n){var t=ke(n);return t.invert=ke(-n),t}function Ne(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*r+a*u;return[Math.atan2(c*i-s*o,a*r-l*u),O(s*i+c*o)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*i-c*o;return[Math.atan2(c*i+l*o,a*r+s*u),O(s*r-a*u)]},e}function Te(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,o,a){var c=o*t;null!=u?(u=qe(e,u),i=qe(e,i),(o>0?i>u:u>i)&&(u+=o*Wo)):(u=n+o*Wo,i=n-.5*c);for(var l,s=u;o>0?s>i:i>s;s-=c)a.point((l=Pt([e,-r*Math.cos(s),-r*Math.sin(s)]))[0],l[1])}}function qe(n,t){var e=Ct(t);e[0]-=n,Ft(e);var r=P(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Go)%(2*Math.PI)}function ze(n,t,e){var r=mo.range(n,t-Go,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function Ce(n,t,e){var r=mo.range(n,t-Go,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function De(n){return n.source}function je(n){return n.target}function Le(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),o=Math.cos(r),a=Math.sin(r),c=u*Math.cos(n),l=u*Math.sin(n),s=o*Math.cos(e),f=o*Math.sin(e),h=2*Math.asin(Math.sqrt(U(r-t)+u*o*U(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*s,u=e*l+t*f,o=e*i+t*a;return[Math.atan2(u,r)*na,Math.atan2(o,Math.sqrt(r*r+u*u))*na]}:function(){return[n*na,t*na]};return p.distance=h,p}function He(){function n(n,u){var i=Math.sin(u*=Qo),o=Math.cos(u),a=Math.abs((n*=Qo)-t),c=Math.cos(a);oc+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*i-e*o*c)*a),e*i+r*o*c),t=n,e=i,r=o}var t,e,r;ac.point=function(u,i){t=u*Qo,e=Math.sin(i*=Qo),r=Math.cos(i),ac.point=n},ac.lineEnd=function(){ac.point=ac.lineEnd=c}}function Fe(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),o=Math.cos(u);return[Math.atan2(n*i,r*o),Math.asin(r&&e*i/r)]},e}function Pe(n,t){function e(n,t){var e=Math.abs(Math.abs(t)-Jo)<Go?0:o/Math.pow(u(t),i);return[e*Math.sin(i*n),o-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(Bo/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),o=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=o-t,r=F(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(o/r,1/i))-Jo]},e):Re}function Oe(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return Math.abs(u)<Go?we:(e.invert=function(n,t){var e=i-t;return[Math.atan2(n,e)/u,i-F(u)*Math.sqrt(n*n+e*e)]},e)}function Re(n,t){return[n,Math.log(Math.tan(Bo/4+t/2))]}function Ye(n){var t,e=xe(n),r=e.scale,u=e.translate,i=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.translate=function(){var n=u.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.clipExtent=function(n){var o=i.apply(e,arguments);if(o===e){if(t=null==n){var a=Bo*r(),c=u();i([[c[0]-a,c[1]-a],[c[0]+a,c[1]+a]])}}else t&&(o=null);return o},e.clipExtent(null)}function Ie(n,t){var e=Math.cos(t)*Math.sin(n);return[Math.log((1+e)/(1-e))/2,Math.atan2(Math.tan(t),Math.cos(n))]}function Ue(n){function t(t){function o(){l.push(\"M\",i(n(s),a))}for(var c,l=[],s=[],f=-1,h=t.length,g=pt(e),p=pt(r);++f<h;)u.call(this,c=t[f],f)?s.push([+g.call(this,c,f),+p.call(this,c,f)]):s.length&&(o(),s=[]);return s.length&&o(),l.length?l.join(\"\"):null}var e=Ze,r=Ve,u=Vt,i=Xe,o=i.key,a=.7;return t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.defined=function(n){return arguments.length?(u=n,t):u},t.interpolate=function(n){return arguments.length?(o=\"function\"==typeof n?i=n:(i=gc.get(n)||Xe).key,t):o},t.tension=function(n){return arguments.length?(a=n,t):a},t}function Ze(n){return n[0]}function Ve(n){return n[1]}function Xe(n){return n.join(\"L\")}function $e(n){return Xe(n)+\"Z\"}function Be(n){for(var t=0,e=n.length,r=n[0],u=[r[0],\",\",r[1]];++t<e;)u.push(\"H\",(r[0]+(r=n[t])[0])/2,\"V\",r[1]);return e>1&&u.push(\"H\",r[0]),u.join(\"\")}function We(n){for(var t=0,e=n.length,r=n[0],u=[r[0],\",\",r[1]];++t<e;)u.push(\"V\",(r=n[t])[1],\"H\",r[0]);return u.join(\"\")}function Je(n){for(var t=0,e=n.length,r=n[0],u=[r[0],\",\",r[1]];++t<e;)u.push(\"H\",(r=n[t])[0],\"V\",r[1]);return u.join(\"\")}function Ge(n,t){return n.length<4?Xe(n):n[1]+nr(n.slice(1,n.length-1),tr(n,t))}function Ke(n,t){return n.length<3?Xe(n):n[0]+nr((n.push(n[0]),n),tr([n[n.length-2]].concat(n,[n[1]]),t))}function Qe(n,t){return n.length<3?Xe(n):n[0]+nr(n,tr(n,t))}function nr(n,t){if(t.length<1||n.length!=t.length&&n.length!=t.length+2)return Xe(n);var e=n.length!=t.length,r=\"\",u=n[0],i=n[1],o=t[0],a=o,c=1;if(e&&(r+=\"Q\"+(i[0]-2*o[0]/3)+\",\"+(i[1]-2*o[1]/3)+\",\"+i[0]+\",\"+i[1],u=n[1],c=2),t.length>1){a=t[1],i=n[c],c++,r+=\"C\"+(u[0]+o[0])+\",\"+(u[1]+o[1])+\",\"+(i[0]-a[0])+\",\"+(i[1]-a[1])+\",\"+i[0]+\",\"+i[1];for(var l=2;l<t.length;l++,c++)i=n[c],a=t[l],r+=\"S\"+(i[0]-a[0])+\",\"+(i[1]-a[1])+\",\"+i[0]+\",\"+i[1]}if(e){var s=n[c];r+=\"Q\"+(i[0]+2*a[0]/3)+\",\"+(i[1]+2*a[1]/3)+\",\"+s[0]+\",\"+s[1]}return r}function tr(n,t){for(var e,r=[],u=(1-t)/2,i=n[0],o=n[1],a=1,c=n.length;++a<c;)e=i,i=o,o=n[a],r.push([u*(o[0]-e[0]),u*(o[1]-e[1])]);return r}function er(n){if(n.length<3)return Xe(n);var t=1,e=n.length,r=n[0],u=r[0],i=r[1],o=[u,u,u,(r=n[1])[0]],a=[i,i,i,r[1]],c=[u,\",\",i,\"L\",or(vc,o),\",\",or(vc,a)];for(n.push(n[e-1]);++t<=e;)r=n[t],o.shift(),o.push(r[0]),a.shift(),a.push(r[1]),ar(c,o,a);return n.pop(),c.push(\"L\",r),c.join(\"\")}function rr(n){if(n.length<4)return Xe(n);for(var t,e=[],r=-1,u=n.length,i=[0],o=[0];++r<3;)t=n[r],i.push(t[0]),o.push(t[1]);for(e.push(or(vc,i)+\",\"+or(vc,o)),--r;++r<u;)t=n[r],i.shift(),i.push(t[0]),o.shift(),o.push(t[1]),ar(e,i,o);return e.join(\"\")}function ur(n){for(var t,e,r=-1,u=n.length,i=u+4,o=[],a=[];++r<4;)e=n[r%u],o.push(e[0]),a.push(e[1]);for(t=[or(vc,o),\",\",or(vc,a)],--r;++r<i;)e=n[r%u],o.shift(),o.push(e[0]),a.shift(),a.push(e[1]),ar(t,o,a);return t.join(\"\")}function ir(n,t){var e=n.length-1;if(e)for(var r,u,i=n[0][0],o=n[0][1],a=n[e][0]-i,c=n[e][1]-o,l=-1;++l<=e;)r=n[l],u=l/e,r[0]=t*r[0]+(1-t)*(i+u*a),r[1]=t*r[1]+(1-t)*(o+u*c);return er(n)}function or(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function ar(n,t,e){n.push(\"C\",or(pc,t),\",\",or(pc,e),\",\",or(dc,t),\",\",or(dc,e),\",\",or(vc,t),\",\",or(vc,e))}function cr(n,t){return(t[1]-n[1])/(t[0]-n[0])}function lr(n){for(var t=0,e=n.length-1,r=[],u=n[0],i=n[1],o=r[0]=cr(u,i);++t<e;)r[t]=(o+(o=cr(u=i,i=n[t+1])))/2;return r[t]=o,r\n}function sr(n){for(var t,e,r,u,i=[],o=lr(n),a=-1,c=n.length-1;++a<c;)t=cr(n[a],n[a+1]),Math.abs(t)<Go?o[a]=o[a+1]=0:(e=o[a]/t,r=o[a+1]/t,u=e*e+r*r,u>9&&(u=3*t/Math.sqrt(u),o[a]=u*e,o[a+1]=u*r));for(a=-1;++a<=c;)u=(n[Math.min(c,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),i.push([u||0,o[a]*u||0]);return i}function fr(n){return n.length<3?Xe(n):n[0]+nr(n,sr(n))}function hr(n,t,e,r){var u,i,o,a,c,l,s;return u=r[n],i=u[0],o=u[1],u=r[t],a=u[0],c=u[1],u=r[e],l=u[0],s=u[1],(s-o)*(a-i)-(c-o)*(l-i)>0}function gr(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function pr(n,t,e,r){var u=n[0],i=e[0],o=t[0]-u,a=r[0]-i,c=n[1],l=e[1],s=t[1]-c,f=r[1]-l,h=(a*(c-l)-f*(u-i))/(f*o-a*s);return[u+h*o,c+h*s]}function dr(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function vr(n,t){var e={list:n.map(function(n,t){return{index:t,x:n[0],y:n[1]}}).sort(function(n,t){return n.y<t.y?-1:n.y>t.y?1:n.x<t.x?-1:n.x>t.x?1:0}),bottomSite:null},r={list:[],leftEnd:null,rightEnd:null,init:function(){r.leftEnd=r.createHalfEdge(null,\"l\"),r.rightEnd=r.createHalfEdge(null,\"l\"),r.leftEnd.r=r.rightEnd,r.rightEnd.l=r.leftEnd,r.list.unshift(r.leftEnd,r.rightEnd)},createHalfEdge:function(n,t){return{edge:n,side:t,vertex:null,l:null,r:null}},insert:function(n,t){t.l=n,t.r=n.r,n.r.l=t,n.r=t},leftBound:function(n){var t=r.leftEnd;do t=t.r;while(t!=r.rightEnd&&u.rightOf(t,n));return t=t.l},del:function(n){n.l.r=n.r,n.r.l=n.l,n.edge=null},right:function(n){return n.r},left:function(n){return n.l},leftRegion:function(n){return null==n.edge?e.bottomSite:n.edge.region[n.side]},rightRegion:function(n){return null==n.edge?e.bottomSite:n.edge.region[yc[n.side]]}},u={bisect:function(n,t){var e={region:{l:n,r:t},ep:{l:null,r:null}},r=t.x-n.x,u=t.y-n.y,i=r>0?r:-r,o=u>0?u:-u;return e.c=n.x*r+n.y*u+.5*(r*r+u*u),i>o?(e.a=1,e.b=u/r,e.c/=r):(e.b=1,e.a=r/u,e.c/=u),e},intersect:function(n,t){var e=n.edge,r=t.edge;if(!e||!r||e.region.r==r.region.r)return null;var u=e.a*r.b-e.b*r.a;if(Math.abs(u)<1e-10)return null;var i,o,a=(e.c*r.b-r.c*e.b)/u,c=(r.c*e.a-e.c*r.a)/u,l=e.region.r,s=r.region.r;l.y<s.y||l.y==s.y&&l.x<s.x?(i=n,o=e):(i=t,o=r);var f=a>=o.region.r.x;return f&&\"l\"===i.side||!f&&\"r\"===i.side?null:{x:a,y:c}},rightOf:function(n,t){var e=n.edge,r=e.region.r,u=t.x>r.x;if(u&&\"l\"===n.side)return 1;if(!u&&\"r\"===n.side)return 0;if(1===e.a){var i=t.y-r.y,o=t.x-r.x,a=0,c=0;if(!u&&e.b<0||u&&e.b>=0?c=a=i>=e.b*o:(c=t.x+t.y*e.b>e.c,e.b<0&&(c=!c),c||(a=1)),!a){var l=r.x-e.region.l.x;c=e.b*(o*o-i*i)<l*i*(1+2*o/l+e.b*e.b),e.b<0&&(c=!c)}}else{var s=e.c-e.a*t.x,f=t.y-s,h=t.x-r.x,g=s-r.y;c=f*f>h*h+g*g}return\"l\"===n.side?c:!c},endPoint:function(n,e,r){n.ep[e]=r,n.ep[yc[e]]&&t(n)},distance:function(n,t){var e=n.x-t.x,r=n.y-t.y;return Math.sqrt(e*e+r*r)}},i={list:[],insert:function(n,t,e){n.vertex=t,n.ystar=t.y+e;for(var r=0,u=i.list,o=u.length;o>r;r++){var a=u[r];if(!(n.ystar>a.ystar||n.ystar==a.ystar&&t.x>a.vertex.x))break}u.splice(r,0,n)},del:function(n){for(var t=0,e=i.list,r=e.length;r>t&&e[t]!=n;++t);e.splice(t,1)},empty:function(){return 0===i.list.length},nextEvent:function(n){for(var t=0,e=i.list,r=e.length;r>t;++t)if(e[t]==n)return e[t+1];return null},min:function(){var n=i.list[0];return{x:n.vertex.x,y:n.ystar}},extractMin:function(){return i.list.shift()}};r.init(),e.bottomSite=e.list.shift();for(var o,a,c,l,s,f,h,g,p,d,v,m,y,M=e.list.shift();;)if(i.empty()||(o=i.min()),M&&(i.empty()||M.y<o.y||M.y==o.y&&M.x<o.x))a=r.leftBound(M),c=r.right(a),h=r.rightRegion(a),m=u.bisect(h,M),f=r.createHalfEdge(m,\"l\"),r.insert(a,f),d=u.intersect(a,f),d&&(i.del(a),i.insert(a,d,u.distance(d,M))),a=f,f=r.createHalfEdge(m,\"r\"),r.insert(a,f),d=u.intersect(f,c),d&&i.insert(f,d,u.distance(d,M)),M=e.list.shift();else{if(i.empty())break;a=i.extractMin(),l=r.left(a),c=r.right(a),s=r.right(c),h=r.leftRegion(a),g=r.rightRegion(c),v=a.vertex,u.endPoint(a.edge,a.side,v),u.endPoint(c.edge,c.side,v),r.del(a),i.del(c),r.del(c),y=\"l\",h.y>g.y&&(p=h,h=g,g=p,y=\"r\"),m=u.bisect(h,g),f=r.createHalfEdge(m,y),r.insert(l,f),u.endPoint(m,yc[y],v),d=u.intersect(l,f),d&&(i.del(l),i.insert(l,d,u.distance(d,h))),d=u.intersect(f,s),d&&i.insert(f,d,u.distance(d,h))}for(a=r.right(r.leftEnd);a!=r.rightEnd;a=r.right(a))t(a.edge)}function mr(n){return n.x}function yr(n){return n.y}function Mr(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function xr(n,t,e,r,u,i){if(!n(t,e,r,u,i)){var o=.5*(e+u),a=.5*(r+i),c=t.nodes;c[0]&&xr(n,c[0],e,r,o,a),c[1]&&xr(n,c[1],o,r,u,a),c[2]&&xr(n,c[2],e,a,o,i),c[3]&&xr(n,c[3],o,a,u,i)}}function br(n,t){n=mo.rgb(n),t=mo.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,o=t.g-r,a=t.b-u;return function(n){return\"#\"+ct(Math.round(e+i*n))+ct(Math.round(r+o*n))+ct(Math.round(u+a*n))}}function _r(n,t){var e,r={},u={};for(e in n)e in t?r[e]=Er(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function wr(n,t){return t-=n=+n,function(e){return n+t*e}}function Sr(n,t){var e,r,u,i,o,a=0,c=0,l=[],s=[];for(n+=\"\",t+=\"\",Mc.lastIndex=0,r=0;e=Mc.exec(t);++r)e.index&&l.push(t.substring(a,c=e.index)),s.push({i:l.length,x:e[0]}),l.push(null),a=Mc.lastIndex;for(a<t.length&&l.push(t.substring(a)),r=0,i=s.length;(e=Mc.exec(n))&&i>r;++r)if(o=s[r],o.x==e[0]){if(o.i)if(null==l[o.i+1])for(l[o.i-1]+=o.x,l.splice(o.i,1),u=r+1;i>u;++u)s[u].i--;else for(l[o.i-1]+=o.x+l[o.i+1],l.splice(o.i,2),u=r+1;i>u;++u)s[u].i-=2;else if(null==l[o.i+1])l[o.i]=o.x;else for(l[o.i]=o.x+l[o.i+1],l.splice(o.i+1,1),u=r+1;i>u;++u)s[u].i--;s.splice(r,1),i--,r--}else o.x=wr(parseFloat(e[0]),parseFloat(o.x));for(;i>r;)o=s.pop(),null==l[o.i+1]?l[o.i]=o.x:(l[o.i]=o.x+l[o.i+1],l.splice(o.i+1,1)),i--;return 1===l.length?null==l[0]?(o=s[0].x,function(n){return o(n)+\"\"}):function(){return t}:function(n){for(r=0;i>r;++r)l[(o=s[r]).i]=o.x(n);return l.join(\"\")}}function Er(n,t){for(var e,r=mo.interpolators.length;--r>=0&&!(e=mo.interpolators[r](n,t)););return e}function kr(n,t){var e,r=[],u=[],i=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(Er(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;o>e;++e)u[e]=t[e];return function(n){for(e=0;a>e;++e)u[e]=r[e](n);return u}}function Ar(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function Nr(n){return function(t){return 1-n(1-t)}}function Tr(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function qr(n){return n*n}function zr(n){return n*n*n}function Cr(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function Dr(n){return function(t){return Math.pow(t,n)}}function jr(n){return 1-Math.cos(n*Jo)}function Lr(n){return Math.pow(2,10*(n-1))}function Hr(n){return 1-Math.sqrt(1-n*n)}function Fr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/Wo*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Wo/t)}}function Pr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Or(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Rr(n,t){n=mo.hcl(n),t=mo.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,o=t.c-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return J(e+i*n,r+o*n,u+a*n)+\"\"}}function Yr(n,t){n=mo.hsl(n),t=mo.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,o=t.s-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return $(e+i*n,r+o*n,u+a*n)+\"\"}}function Ir(n,t){n=mo.lab(n),t=mo.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,o=t.a-r,a=t.b-u;return function(n){return Q(e+i*n,r+o*n,u+a*n)+\"\"}}function Ur(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Zr(n){var t=[n.a,n.b],e=[n.c,n.d],r=Xr(t),u=Vr(t,e),i=Xr($r(e,t,-u))||0;t[0]*e[1]<e[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,u*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-e[0],e[1]))*na,this.translate=[n.e,n.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*na:0}function Vr(n,t){return n[0]*t[0]+n[1]*t[1]}function Xr(n){var t=Math.sqrt(Vr(n,n));return t&&(n[0]/=t,n[1]/=t),t}function $r(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function Br(n,t){var e,r=[],u=[],i=mo.transform(n),o=mo.transform(t),a=i.translate,c=o.translate,l=i.rotate,s=o.rotate,f=i.skew,h=o.skew,g=i.scale,p=o.scale;return a[0]!=c[0]||a[1]!=c[1]?(r.push(\"translate(\",null,\",\",null,\")\"),u.push({i:1,x:wr(a[0],c[0])},{i:3,x:wr(a[1],c[1])})):c[0]||c[1]?r.push(\"translate(\"+c+\")\"):r.push(\"\"),l!=s?(l-s>180?s+=360:s-l>180&&(l+=360),u.push({i:r.push(r.pop()+\"rotate(\",null,\")\")-2,x:wr(l,s)})):s&&r.push(r.pop()+\"rotate(\"+s+\")\"),f!=h?u.push({i:r.push(r.pop()+\"skewX(\",null,\")\")-2,x:wr(f,h)}):h&&r.push(r.pop()+\"skewX(\"+h+\")\"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+\"scale(\",null,\",\",null,\")\"),u.push({i:e-4,x:wr(g[0],p[0])},{i:e-2,x:wr(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+\"scale(\"+p+\")\"),e=u.length,function(n){for(var t,i=-1;++i<e;)r[(t=u[i]).i]=t.x(n);return r.join(\"\")}}function Wr(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return(e-n)*t}}function Jr(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return Math.max(0,Math.min(1,(e-n)*t))}}function Gr(n){for(var t=n.source,e=n.target,r=Qr(t,e),u=[t];t!==r;)t=t.parent,u.push(t);for(var i=u.length;e!==r;)u.splice(i,0,e),e=e.parent;return u}function Kr(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function Qr(n,t){if(n===t)return n;for(var e=Kr(n),r=Kr(t),u=e.pop(),i=r.pop(),o=null;u===i;)o=u,u=e.pop(),i=r.pop();return o}function nu(n){n.fixed|=2}function tu(n){n.fixed&=-7}function eu(n){n.fixed|=4,n.px=n.x,n.py=n.y}function ru(n){n.fixed&=-5}function uu(n,t,e){var r=0,u=0;if(n.charge=0,!n.leaf)for(var i,o=n.nodes,a=o.length,c=-1;++c<a;)i=o[c],null!=i&&(uu(i,t,e),n.charge+=i.charge,r+=i.charge*i.cx,u+=i.charge*i.cy);if(n.point){n.leaf||(n.point.x+=Math.random()-.5,n.point.y+=Math.random()-.5);var l=t*e[n.point.index];n.charge+=n.pointCharge=l,r+=l*n.point.x,u+=l*n.point.y}n.cx=r/n.charge,n.cy=u/n.charge}function iu(n,t){return mo.rebind(n,t,\"sort\",\"children\",\"value\"),n.nodes=n,n.links=lu,n}function ou(n){return n.children}function au(n){return n.value}function cu(n,t){return t.value-n.value}function lu(n){return mo.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function su(n){return n.x}function fu(n){return n.y}function hu(n,t,e){n.y0=t,n.y=e}function gu(n){return mo.range(n.length)}function pu(n){for(var t=-1,e=n[0].length,r=[];++t<e;)r[t]=0;return r}function du(n){for(var t,e=1,r=0,u=n[0][1],i=n.length;i>e;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function vu(n){return n.reduce(mu,0)}function mu(n,t){return n+t[1]}function yu(n,t){return Mu(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function Mu(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function xu(n){return[mo.min(n),mo.max(n)]}function bu(n,t){return n.parent==t.parent?1:2}function _u(n){var t=n.children;return t&&t.length?t[0]:n._tree.thread}function wu(n){var t,e=n.children;return e&&(t=e.length)?e[t-1]:n._tree.thread}function Su(n,t){var e=n.children;if(e&&(u=e.length))for(var r,u,i=-1;++i<u;)t(r=Su(e[i],t),n)>0&&(n=r);return n}function Eu(n,t){return n.x-t.x}function ku(n,t){return t.x-n.x}function Au(n,t){return n.depth-t.depth}function Nu(n,t){function e(n,r){var u=n.children;if(u&&(o=u.length))for(var i,o,a=null,c=-1;++c<o;)i=u[c],e(i,a),a=i;t(n,r)}e(n,null)}function Tu(n){for(var t,e=0,r=0,u=n.children,i=u.length;--i>=0;)t=u[i]._tree,t.prelim+=e,t.mod+=e,e+=t.shift+(r+=t.change)}function qu(n,t,e){n=n._tree,t=t._tree;var r=e/(t.number-n.number);n.change+=r,t.change-=r,t.shift+=e,t.prelim+=e,t.mod+=e}function zu(n,t,e){return n._tree.ancestor.parent==t.parent?n._tree.ancestor:e}function Cu(n,t){return n.value-t.value}function Du(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function ju(n,t){n._pack_next=t,t._pack_prev=n}function Lu(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function Hu(n){function t(n){s=Math.min(n.x-n.r,s),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(l=e.length)){var e,r,u,i,o,a,c,l,s=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(Fu),r=e[0],r.x=-r.r,r.y=0,t(r),l>1&&(u=e[1],u.x=u.r,u.y=0,t(u),l>2))for(i=e[2],Ru(r,u,i),t(i),Du(r,i),r._pack_prev=i,Du(i,u),u=r._pack_next,o=3;l>o;o++){Ru(r,u,i=e[o]);var p=0,d=1,v=1;for(a=u._pack_next;a!==u;a=a._pack_next,d++)if(Lu(a,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==a._pack_prev&&!Lu(c,i);c=c._pack_prev,v++);p?(v>d||d==v&&u.r<r.r?ju(r,u=a):ju(r=c,u),o--):(Du(r,i),u=i,t(i))}var m=(s+f)/2,y=(h+g)/2,M=0;for(o=0;l>o;o++)i=e[o],i.x-=m,i.y-=y,M=Math.max(M,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=M,e.forEach(Pu)}}function Fu(n){n._pack_next=n._pack_prev=n}function Pu(n){delete n._pack_next,delete n._pack_prev}function Ou(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,o=u.length;++i<o;)Ou(u[i],t,e,r)}function Ru(n,t,e){var r=n.r+e.r,u=t.x-n.x,i=t.y-n.y;if(r&&(u||i)){var o=t.r+e.r,a=u*u+i*i;o*=o,r*=r;var c=.5+(r-o)/(2*a),l=Math.sqrt(Math.max(0,2*o*(r+a)-(r-=a)*r-o*o))/(2*a);e.x=n.x+c*u+l*i,e.y=n.y+c*i-l*u}else e.x=n.x+r,e.y=n.y}function Yu(n){return 1+mo.max(n,function(n){return n.y})}function Iu(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Uu(n){var t=n.children;return t&&t.length?Uu(t[0]):n}function Zu(n){var t,e=n.children;return e&&(t=e.length)?Zu(e[t-1]):n}function Vu(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Xu(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function $u(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Bu(n){return n.rangeExtent?n.rangeExtent():$u(n.range())}function Wu(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Ju(n,t){var e,r=0,u=n.length-1,i=n[r],o=n[u];return i>o&&(e=r,r=u,u=e,e=i,i=o,o=e),n[r]=t.floor(i),n[u]=t.ceil(o),n}function Gu(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:Tc}function Ku(n,t,e,r){var u=[],i=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]<n[0]&&(n=n.slice().reverse(),t=t.slice().reverse());++o<=a;)u.push(e(n[o-1],n[o])),i.push(r(t[o-1],t[o]));return function(t){var e=mo.bisect(n,t,1,a)-1;return i[e](u[e](t))}}function Qu(n,t,e,r){function u(){var u=Math.min(n.length,t.length)>2?Ku:Wu,c=r?Jr:Wr;return o=u(n,t,c,e),a=u(t,n,c,Er),i}function i(n){return o(n)}var o,a;return i.invert=function(n){return a(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(Ur)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return ri(n,t)},i.tickFormat=function(t,e){return ui(n,t,e)},i.nice=function(t){return ti(n,t),u()},i.copy=function(){return Qu(n,t,e,r)},u()}function ni(n,t){return mo.rebind(n,t,\"range\",\"rangeRound\",\"interpolate\",\"clamp\")}function ti(n,t){return Ju(n,Gu(ei(n,t)[2]))}function ei(n,t){null==t&&(t=10);var e=$u(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function ri(n,t){return mo.range.apply(mo,ei(n,t))}function ui(n,t,e){var r=-Math.floor(Math.log(ei(n,t)[2])/Math.LN10+.01);return mo.format(e?e.replace(Aa,function(n,t,e,u,i,o,a,c,l,s){return[t,e,u,i,o,a,c,l||\".\"+(r-2*(\"%\"===s)),s].join(\"\")}):\",.\"+r+\"f\")}function ii(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(u(t))}return o.invert=function(t){return i(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),o):t},o.nice=function(){var t=Ju(r.map(u),e?Math:zc);return n.domain(t),r=t.map(i),o},o.ticks=function(){var n=$u(r),o=[],a=n[0],c=n[1],l=Math.floor(u(a)),s=Math.ceil(u(c)),f=t%1?2:t;if(isFinite(s-l)){if(e){for(;s>l;l++)for(var h=1;f>h;h++)o.push(i(l)*h);o.push(i(l))}else for(o.push(i(l));l++<s;)for(var h=f-1;h>0;h--)o.push(i(l)*h);for(l=0;o[l]<a;l++);for(s=o.length;o[s-1]>c;s--);o=o.slice(l,s)}return o},o.tickFormat=function(n,t){if(!arguments.length)return qc;arguments.length<2?t=qc:\"function\"!=typeof t&&(t=mo.format(t));var r,a=Math.max(.1,n/o.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(c(u(n)+r))<=a?t(n):\"\"}},o.copy=function(){return ii(n.copy(),t,e,r)},ni(o,n)}function oi(n,t,e){function r(t){return n(u(t))}var u=ai(t),i=ai(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return ri(e,n)},r.tickFormat=function(n,t){return ui(e,n,t)},r.nice=function(n){return r.domain(ti(e,n))},r.exponent=function(o){return arguments.length?(u=ai(t=o),i=ai(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return oi(n.copy(),t,e)},ni(r,n)}function ai(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function ci(n,t){function e(e){return o[((i.get(e)||\"range\"===t.t&&i.set(e,n.push(e)))-1)%o.length]}function r(t,e){return mo.range(n.length).map(function(n){return t+e*n})}var i,o,a;return e.domain=function(r){if(!arguments.length)return n;n=[],i=new u;for(var o,a=-1,c=r.length;++a<c;)i.has(o=r[a])||i.set(o,n.push(o));return e[t.t].apply(e,t.a)},e.range=function(n){return arguments.length?(o=n,a=0,t={t:\"range\",a:arguments},e):o},e.rangePoints=function(u,i){arguments.length<2&&(i=0);var c=u[0],l=u[1],s=(l-c)/(Math.max(1,n.length-1)+i);return o=r(n.length<2?(c+l)/2:c+s*i/2,s),a=0,t={t:\"rangePoints\",a:arguments},e},e.rangeBands=function(u,i,c){arguments.length<2&&(i=0),arguments.length<3&&(c=i);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=(f-s)/(n.length-i+2*c);return o=r(s+h*c,h),l&&o.reverse(),a=h*(1-i),t={t:\"rangeBands\",a:arguments},e},e.rangeRoundBands=function(u,i,c){arguments.length<2&&(i=0),arguments.length<3&&(c=i);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=Math.floor((f-s)/(n.length-i+2*c)),g=f-s-(n.length-i)*h;return o=r(s+Math.round(g/2),h),l&&o.reverse(),a=Math.round(h*(1-i)),t={t:\"rangeRoundBands\",a:arguments},e},e.rangeBand=function(){return a},e.rangeExtent=function(){return $u(t.a[0])},e.copy=function(){return ci(n,t)},e.domain(n)}function li(n,t){function e(){var e=0,i=t.length;for(u=[];++e<i;)u[e-1]=mo.quantile(n,e/i);return r}function r(n){return isNaN(n=+n)?void 0:t[mo.bisect(u,n)]}var u;return r.domain=function(t){return arguments.length?(n=t.filter(function(n){return!isNaN(n)}).sort(mo.ascending),e()):n},r.range=function(n){return arguments.length?(t=n,e()):t},r.quantiles=function(){return u},r.invertExtent=function(e){return e=t.indexOf(e),0>e?[0/0,0/0]:[e>0?u[e-1]:n[0],e<u.length?u[e]:n[n.length-1]]},r.copy=function(){return li(n,t)},e()}function si(n,t,e){function r(t){return e[Math.max(0,Math.min(o,Math.floor(i*(t-n))))]}function u(){return i=e.length/(t-n),o=e.length-1,r}var i,o;return r.domain=function(e){return arguments.length?(n=+e[0],t=+e[e.length-1],u()):[n,t]},r.range=function(n){return arguments.length?(e=n,u()):e},r.invertExtent=function(t){return t=e.indexOf(t),t=0>t?0/0:t/i+n,[t,t+1/i]},r.copy=function(){return si(n,t,e)},u()}function fi(n,t){function e(e){return e>=e?t[mo.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return fi(n,t)},e}function hi(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return ri(n,t)},t.tickFormat=function(t,e){return ui(n,t,e)},t.copy=function(){return hi(n)},t}function gi(n){return n.innerRadius}function pi(n){return n.outerRadius}function di(n){return n.startAngle}function vi(n){return n.endAngle}function mi(n){for(var t,e,r,u=-1,i=n.length;++u<i;)t=n[u],e=t[0],r=t[1]+Hc,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function yi(n){function t(t){function c(){d.push(\"M\",a(n(m),f),s,l(n(v.reverse()),f),\"Z\")}for(var h,g,p,d=[],v=[],m=[],y=-1,M=t.length,x=pt(e),b=pt(u),_=e===r?function(){return g}:pt(r),w=u===i?function(){return p}:pt(i);++y<M;)o.call(this,h=t[y],y)?(v.push([g=+x.call(this,h,y),p=+b.call(this,h,y)]),m.push([+_.call(this,h,y),+w.call(this,h,y)])):v.length&&(c(),v=[],m=[]);return v.length&&c(),d.length?d.join(\"\"):null}var e=Ze,r=Ze,u=0,i=Ve,o=Vt,a=Xe,c=a.key,l=a,s=\"L\",f=.7;return t.x=function(n){return arguments.length?(e=r=n,t):r},t.x0=function(n){return arguments.length?(e=n,t):e},t.x1=function(n){return arguments.length?(r=n,t):r},t.y=function(n){return arguments.length?(u=i=n,t):i},t.y0=function(n){return arguments.length?(u=n,t):u},t.y1=function(n){return arguments.length?(i=n,t):i},t.defined=function(n){return arguments.length?(o=n,t):o},t.interpolate=function(n){return arguments.length?(c=\"function\"==typeof n?a=n:(a=gc.get(n)||Xe).key,l=a.reverse||a,s=a.closed?\"M\":\"L\",t):c},t.tension=function(n){return arguments.length?(f=n,t):f},t}function Mi(n){return n.radius}function xi(n){return[n.x,n.y]}function bi(n){return function(){var t=n.apply(this,arguments),e=t[0],r=t[1]+Hc;return[e*Math.cos(r),e*Math.sin(r)]}}function _i(){return 64}function wi(){return\"circle\"}function Si(n){var t=Math.sqrt(n/Bo);return\"M0,\"+t+\"A\"+t+\",\"+t+\" 0 1,1 0,\"+-t+\"A\"+t+\",\"+t+\" 0 1,1 0,\"+t+\"Z\"}function Ei(n,t){return Lo(n,Uc),n.id=t,n}function ki(n,t,e,r){var u=n.id;return N(n,\"function\"==typeof e?function(n,i,o){n.__transition__[u].tween.set(t,r(e.call(n,n.__data__,i,o)))}:(e=r(e),function(n){n.__transition__[u].tween.set(t,e)}))}function Ai(n){return null==n&&(n=\"\"),function(){this.textContent=n}}function Ni(n,t,e,r){var i=n.__transition__||(n.__transition__={active:0,count:0}),o=i[e];if(!o){var a=r.time;o=i[e]={tween:new u,time:a,ease:r.ease,delay:r.delay,duration:r.duration},++i.count,mo.timer(function(r){function u(r){return i.active>e?l():(i.active=e,o.event&&o.event.start.call(n,s,t),o.tween.forEach(function(e,r){(r=r.call(n,s,t))&&p.push(r)}),c(r||1)?1:(xt(c,h,a),void 0))}function c(r){if(i.active!==e)return l();for(var u=r/g,a=f(u),c=p.length;c>0;)p[--c].call(n,a);return u>=1?(o.event&&o.event.end.call(n,s,t),l()):void 0}function l(){return--i.count?delete i[e]:delete n.__transition__,1}var s=n.__data__,f=o.ease,h=o.delay,g=o.duration,p=[];return r>=h?u(r-h):(xt(u,h,a),void 0)},0,a)}}function Ti(n,t){n.attr(\"transform\",function(n){return\"translate(\"+t(n)+\",0)\"})}function qi(n,t){n.attr(\"transform\",function(n){return\"translate(0,\"+t(n)+\")\"})}function zi(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Ci(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new Jc(e-1)),1),e}function i(n,e){return t(n=new Jc(+n),e),n}function o(n,r,i){var o=u(n),a=[];if(i>1)for(;r>o;)e(o)%i||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{Jc=zi;var r=new zi;return r._=n,o(r,t,e)}finally{Jc=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=o;var c=n.utc=Di(n);return c.floor=c,c.round=Di(r),c.ceil=Di(u),c.offset=Di(i),c.range=a,n}function Di(n){return function(t,e){try{Jc=zi;var r=new zi;return r._=t,n(r,e)._}finally{Jc=Date}}}function ji(n){function t(t){for(var r,u,i,o=[],a=-1,c=0;++a<e;)37===n.charCodeAt(a)&&(o.push(n.substring(c,a)),null!=(u=dl[r=n.charAt(++a)])&&(r=n.charAt(++a)),(i=vl[r])&&(r=i(t,null==u?\"e\"===r?\" \":\"0\":u)),o.push(r),c=a+1);return o.push(n.substring(c,a)),o.join(\"\")}var e=n.length;return t.parse=function(t){var e={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},r=Li(e,n,t,0);if(r!=t.length)return null;\"p\"in e&&(e.H=e.H%12+12*e.p);var u=null!=e.Z&&Jc!==zi,i=new(u?zi:Jc);return\"j\"in e?i.setFullYear(e.y,0,e.j):\"w\"in e&&(\"W\"in e||\"U\"in e)?(i.setFullYear(e.y,0,1),i.setFullYear(e.y,0,\"W\"in e?(e.w+6)%7+7*e.W-(i.getDay()+5)%7:e.w+7*e.U-(i.getDay()+6)%7)):i.setFullYear(e.y,e.m,e.d),i.setHours(e.H+Math.floor(e.Z/100),e.M+e.Z%100,e.S,e.L),u?i._:i},t.toString=function(){return n},t}function Li(n,t,e,r){for(var u,i,o,a=0,c=t.length,l=e.length;c>a;){if(r>=l)return-1;if(u=t.charCodeAt(a++),37===u){if(o=t.charAt(a++),i=ml[o in dl?t.charAt(a++):o],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function Hi(n){return new RegExp(\"^(?:\"+n.map(mo.requote).join(\"|\")+\")\",\"i\")}function Fi(n){for(var t=new u,e=-1,r=n.length;++e<r;)t.set(n[e].toLowerCase(),e);return t}function Pi(n,t,e){var r=0>n?\"-\":\"\",u=(r?-n:n)+\"\",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function Oi(n,t,e){cl.lastIndex=0;var r=cl.exec(t.substring(e));return r?(n.w=ll.get(r[0].toLowerCase()),e+r[0].length):-1}function Ri(n,t,e){ol.lastIndex=0;var r=ol.exec(t.substring(e));return r?(n.w=al.get(r[0].toLowerCase()),e+r[0].length):-1}function Yi(n,t,e){yl.lastIndex=0;var r=yl.exec(t.substring(e,e+1));return r?(n.w=+r[0],e+r[0].length):-1}function Ii(n,t,e){yl.lastIndex=0;var r=yl.exec(t.substring(e));return r?(n.U=+r[0],e+r[0].length):-1}function Ui(n,t,e){yl.lastIndex=0;var r=yl.exec(t.substring(e));return r?(n.W=+r[0],e+r[0].length):-1}function Zi(n,t,e){hl.lastIndex=0;var r=hl.exec(t.substring(e));return r?(n.m=gl.get(r[0].toLowerCase()),e+r[0].length):-1}function Vi(n,t,e){sl.lastIndex=0;var r=sl.exec(t.substring(e));return r?(n.m=fl.get(r[0].toLowerCase()),e+r[0].length):-1}function Xi(n,t,e){return Li(n,vl.c.toString(),t,e)}function $i(n,t,e){return Li(n,vl.x.toString(),t,e)}function Bi(n,t,e){return Li(n,vl.X.toString(),t,e)}function Wi(n,t,e){yl.lastIndex=0;var r=yl.exec(t.substring(e,e+4));return r?(n.y=+r[0],e+r[0].length):-1}function Ji(n,t,e){yl.lastIndex=0;var r=yl.exec(t.substring(e,e+2));return r?(n.y=Ki(+r[0]),e+r[0].length):-1}function Gi(n,t,e){return/^[+-]\\d{4}$/.test(t=t.substring(e,e+5))?(n.Z=+t,e+5):-1}function Ki(n){return n+(n>68?1900:2e3)}function Qi(n,t,e){yl.lastIndex=0;var r=yl.exec(t.substring(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function no(n,t,e){yl.lastIndex=0;var r=yl.exec(t.substring(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function to(n,t,e){yl.lastIndex=0;var r=yl.exec(t.substring(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function eo(n,t,e){yl.lastIndex=0;var r=yl.exec(t.substring(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function ro(n,t,e){yl.lastIndex=0;var r=yl.exec(t.substring(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function uo(n,t,e){yl.lastIndex=0;var r=yl.exec(t.substring(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function io(n,t,e){yl.lastIndex=0;var r=yl.exec(t.substring(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function oo(n,t,e){var r=Ml.get(t.substring(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}function ao(n){var t=n.getTimezoneOffset(),e=t>0?\"-\":\"+\",r=~~(Math.abs(t)/60),u=Math.abs(t)%60;return e+Pi(r,\"0\",2)+Pi(u,\"0\",2)}function co(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e,e+1));return r?e+r[0].length:-1}function lo(n){function t(n){try{Jc=zi;var t=new Jc;return t._=n,e(t)}finally{Jc=Date}}var e=ji(n);return t.parse=function(n){try{Jc=zi;var t=e.parse(n);return t&&t._}finally{Jc=Date}},t.toString=e.toString,t}function so(n){return n.toISOString()}function fo(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=mo.bisect(bl,u);return i==bl.length?[t.year,ei(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/bl[i-1]<bl[i]/u?i-1:i]:[El,ei(n,e)[2]]}return r.invert=function(t){return ho(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(ho)},r.nice=function(n,t){function e(e){return!isNaN(e)&&!n.range(e,ho(+e+1),t).length}var i=r.domain(),o=$u(i),a=null==n?u(o,10):\"number\"==typeof n&&u(o,n);return a&&(n=a[0],t=a[1]),r.domain(Ju(i,t>1?{floor:function(t){for(;e(t=n.floor(t));)t=ho(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=ho(+t+1);return t}}:n))},r.ticks=function(n,t){var e=$u(r.domain()),i=null==n?u(e,10):\"number\"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],ho(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return fo(n.copy(),t,e)},ni(r,n)}function ho(n){return new Date(n)}function go(n){return function(t){for(var e=n.length-1,r=n[e];!r[1](t);)r=n[--e];return r[0](t)}}function po(n){return JSON.parse(n.responseText)}function vo(n){var t=xo.createRange();return t.selectNode(xo.body),t.createContextualFragment(n.responseText)}var mo={version:\"3.3.6\"};Date.now||(Date.now=function(){return+new Date});var yo=[].slice,Mo=function(n){return yo.call(n)},xo=document,bo=xo.documentElement,_o=window;try{Mo(bo.childNodes)[0].nodeType}catch(wo){Mo=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}try{xo.createElement(\"div\").style.setProperty(\"opacity\",0,\"\")}catch(So){var Eo=_o.Element.prototype,ko=Eo.setAttribute,Ao=Eo.setAttributeNS,No=_o.CSSStyleDeclaration.prototype,To=No.setProperty;Eo.setAttribute=function(n,t){ko.call(this,n,t+\"\")},Eo.setAttributeNS=function(n,t,e){Ao.call(this,n,t,e+\"\")},No.setProperty=function(n,t,e){To.call(this,n,t+\"\",e)}}mo.ascending=function(n,t){return t>n?-1:n>t?1:n>=t?0:0/0},mo.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:0/0},mo.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i&&!(null!=(e=n[u])&&e>=e);)e=void 0;for(;++u<i;)null!=(r=n[u])&&e>r&&(e=r)}else{for(;++u<i&&!(null!=(e=t.call(n,n[u],u))&&e>=e);)e=void 0;for(;++u<i;)null!=(r=t.call(n,n[u],u))&&e>r&&(e=r)}return e},mo.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i&&!(null!=(e=n[u])&&e>=e);)e=void 0;for(;++u<i;)null!=(r=n[u])&&r>e&&(e=r)}else{for(;++u<i&&!(null!=(e=t.call(n,n[u],u))&&e>=e);)e=void 0;for(;++u<i;)null!=(r=t.call(n,n[u],u))&&r>e&&(e=r)}return e},mo.extent=function(n,t){var e,r,u,i=-1,o=n.length;if(1===arguments.length){for(;++i<o&&!(null!=(e=u=n[i])&&e>=e);)e=u=void 0;for(;++i<o;)null!=(r=n[i])&&(e>r&&(e=r),r>u&&(u=r))}else{for(;++i<o&&!(null!=(e=u=t.call(n,n[i],i))&&e>=e);)e=void 0;for(;++i<o;)null!=(r=t.call(n,n[i],i))&&(e>r&&(e=r),r>u&&(u=r))}return[e,u]},mo.sum=function(n,t){var e,r=0,u=n.length,i=-1;if(1===arguments.length)for(;++i<u;)isNaN(e=+n[i])||(r+=e);else for(;++i<u;)isNaN(e=+t.call(n,n[i],i))||(r+=e);return r},mo.mean=function(t,e){var r,u=t.length,i=0,o=-1,a=0;if(1===arguments.length)for(;++o<u;)n(r=t[o])&&(i+=(r-i)/++a);else for(;++o<u;)n(r=e.call(t,t[o],o))&&(i+=(r-i)/++a);return a?i:void 0},mo.quantile=function(n,t){var e=(n.length-1)*t+1,r=Math.floor(e),u=+n[r-1],i=e-r;return i?u+i*(n[r]-u):u},mo.median=function(t,e){return arguments.length>1&&(t=t.map(e)),t=t.filter(n),t.length?mo.quantile(t.sort(mo.ascending),.5):void 0},mo.bisector=function(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n.call(t,t[i],i)<e?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;e<n.call(t,t[i],i)?u=i:r=i+1}return r}}};var qo=mo.bisector(function(n){return n});mo.bisectLeft=qo.left,mo.bisect=mo.bisectRight=qo.right,mo.shuffle=function(n){for(var t,e,r=n.length;r;)e=0|Math.random()*r--,t=n[r],n[r]=n[e],n[e]=t;return n},mo.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},mo.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0>r?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},mo.zip=function(){if(!(u=arguments.length))return[];for(var n=-1,e=mo.min(arguments,t),r=new Array(e);++n<e;)for(var u,i=-1,o=r[n]=new Array(u);++i<u;)o[i]=arguments[i][n];return r},mo.transpose=function(n){return mo.zip.apply(mo,n)},mo.keys=function(n){var t=[];for(var e in n)t.push(e);return t},mo.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},mo.entries=function(n){var t=[];\n    for(var e in n)t.push({key:e,value:n[e]});return t},mo.merge=function(n){return Array.prototype.concat.apply([],n)},mo.range=function(n,t,r){if(arguments.length<3&&(r=1,arguments.length<2&&(t=n,n=0)),1/0===(t-n)/r)throw new Error(\"infinite range\");var u,i=[],o=e(Math.abs(r)),a=-1;if(n*=o,t*=o,r*=o,0>r)for(;(u=n+r*++a)>t;)i.push(u/o);else for(;(u=n+r*++a)<t;)i.push(u/o);return i},mo.map=function(n){var t=new u;if(n instanceof u)n.forEach(function(n,e){t.set(n,e)});else for(var e in n)t.set(e,n[e]);return t},r(u,{has:function(n){return zo+n in this},get:function(n){return this[zo+n]},set:function(n,t){return this[zo+n]=t},remove:function(n){return n=zo+n,n in this&&delete this[n]},keys:function(){var n=[];return this.forEach(function(t){n.push(t)}),n},values:function(){var n=[];return this.forEach(function(t,e){n.push(e)}),n},entries:function(){var n=[];return this.forEach(function(t,e){n.push({key:t,value:e})}),n},forEach:function(n){for(var t in this)t.charCodeAt(0)===Co&&n.call(this,t.substring(1),this[t])}});var zo=\"\\x00\",Co=zo.charCodeAt(0);mo.nest=function(){function n(t,a,c){if(c>=o.length)return r?r.call(i,a):e?a.sort(e):a;for(var l,s,f,h,g=-1,p=a.length,d=o[c++],v=new u;++g<p;)(h=v.get(l=d(s=a[g])))?h.push(s):v.set(l,[s]);return t?(s=t(),f=function(e,r){s.set(e,n(t,r,c))}):(s={},f=function(e,r){s[e]=n(t,r,c)}),v.forEach(f),s}function t(n,e){if(e>=o.length)return n;var r=[],u=a[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,i={},o=[],a=[];return i.map=function(t,e){return n(e,t,0)},i.entries=function(e){return t(n(mo.map,e,0),0)},i.key=function(n){return o.push(n),i},i.sortKeys=function(n){return a[o.length-1]=n,i},i.sortValues=function(n){return e=n,i},i.rollup=function(n){return r=n,i},i},mo.set=function(n){var t=new i;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},r(i,{has:function(n){return zo+n in this},add:function(n){return this[zo+n]=!0,n},remove:function(n){return n=zo+n,n in this&&delete this[n]},values:function(){var n=[];return this.forEach(function(t){n.push(t)}),n},forEach:function(n){for(var t in this)t.charCodeAt(0)===Co&&n.call(this,t.substring(1))}}),mo.behavior={},mo.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r<u;)n[e=arguments[r]]=o(n,t,t[e]);return n};var Do=[\"webkit\",\"ms\",\"moz\",\"Moz\",\"o\",\"O\"];mo.dispatch=function(){for(var n=new l,t=-1,e=arguments.length;++t<e;)n[arguments[t]]=s(n);return n},l.prototype.on=function(n,t){var e=n.indexOf(\".\"),r=\"\";if(e>=0&&(r=n.substring(e+1),n=n.substring(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},mo.event=null,mo.requote=function(n){return n.replace(jo,\"\\\\$&\")};var jo=/[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g,Lo={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},Ho=function(n,t){return t.querySelector(n)},Fo=function(n,t){return t.querySelectorAll(n)},Po=bo[a(bo,\"matchesSelector\")],Oo=function(n,t){return Po.call(n,t)};\"function\"==typeof Sizzle&&(Ho=function(n,t){return Sizzle(n,t)[0]||null},Fo=function(n,t){return Sizzle.uniqueSort(Sizzle(n,t))},Oo=Sizzle.matchesSelector),mo.selection=function(){return Uo};var Ro=mo.selection.prototype=[];Ro.select=function(n){var t,e,r,u,i=[];n=d(n);for(var o=-1,a=this.length;++o<a;){i.push(t=[]),t.parentNode=(r=this[o]).parentNode;for(var c=-1,l=r.length;++c<l;)(u=r[c])?(t.push(e=n.call(u,u.__data__,c,o)),e&&\"__data__\"in u&&(e.__data__=u.__data__)):t.push(null)}return p(i)},Ro.selectAll=function(n){var t,e,r=[];n=v(n);for(var u=-1,i=this.length;++u<i;)for(var o=this[u],a=-1,c=o.length;++a<c;)(e=o[a])&&(r.push(t=Mo(n.call(e,e.__data__,a,u))),t.parentNode=e);return p(r)};var Yo={svg:\"http://www.w3.org/2000/svg\",xhtml:\"http://www.w3.org/1999/xhtml\",xlink:\"http://www.w3.org/1999/xlink\",xml:\"http://www.w3.org/XML/1998/namespace\",xmlns:\"http://www.w3.org/2000/xmlns/\"};mo.ns={prefix:Yo,qualify:function(n){var t=n.indexOf(\":\"),e=n;return t>=0&&(e=n.substring(0,t),n=n.substring(t+1)),Yo.hasOwnProperty(e)?{space:Yo[e],local:n}:n}},Ro.attr=function(n,t){if(arguments.length<2){if(\"string\"==typeof n){var e=this.node();return n=mo.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(m(t,n[t]));return this}return this.each(m(n,t))},Ro.classed=function(n,t){if(arguments.length<2){if(\"string\"==typeof n){var e=this.node(),r=(n=n.trim().split(/^|\\s+/g)).length,u=-1;if(t=e.classList){for(;++u<r;)if(!t.contains(n[u]))return!1}else for(t=e.getAttribute(\"class\");++u<r;)if(!M(n[u]).test(t))return!1;return!0}for(t in n)this.each(x(t,n[t]));return this}return this.each(x(n,t))},Ro.style=function(n,t,e){var r=arguments.length;if(3>r){if(\"string\"!=typeof n){2>r&&(t=\"\");for(e in n)this.each(_(e,n[e],t));return this}if(2>r)return _o.getComputedStyle(this.node(),null).getPropertyValue(n);e=\"\"}return this.each(_(n,t,e))},Ro.property=function(n,t){if(arguments.length<2){if(\"string\"==typeof n)return this.node()[n];for(t in n)this.each(w(t,n[t]));return this}return this.each(w(n,t))},Ro.text=function(n){return arguments.length?this.each(\"function\"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?\"\":t}:null==n?function(){this.textContent=\"\"}:function(){this.textContent=n}):this.node().textContent},Ro.html=function(n){return arguments.length?this.each(\"function\"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?\"\":t}:null==n?function(){this.innerHTML=\"\"}:function(){this.innerHTML=n}):this.node().innerHTML},Ro.append=function(n){return n=S(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},Ro.insert=function(n,t){return n=S(n),t=d(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments))})},Ro.remove=function(){return this.each(function(){var n=this.parentNode;n&&n.removeChild(this)})},Ro.data=function(n,t){function e(n,e){var r,i,o,a=n.length,f=e.length,h=Math.min(a,f),g=new Array(f),p=new Array(f),d=new Array(a);if(t){var v,m=new u,y=new u,M=[];for(r=-1;++r<a;)v=t.call(i=n[r],i.__data__,r),m.has(v)?d[r]=i:m.set(v,i),M.push(v);for(r=-1;++r<f;)v=t.call(e,o=e[r],r),(i=m.get(v))?(g[r]=i,i.__data__=o):y.has(v)||(p[r]=E(o)),y.set(v,o),m.remove(v);for(r=-1;++r<a;)m.has(M[r])&&(d[r]=n[r])}else{for(r=-1;++r<h;)i=n[r],o=e[r],i?(i.__data__=o,g[r]=i):p[r]=E(o);for(;f>r;++r)p[r]=E(e[r]);for(;a>r;++r)d[r]=n[r]}p.update=g,p.parentNode=g.parentNode=d.parentNode=n.parentNode,c.push(p),l.push(g),s.push(d)}var r,i,o=-1,a=this.length;if(!arguments.length){for(n=new Array(a=(r=this[0]).length);++o<a;)(i=r[o])&&(n[o]=i.__data__);return n}var c=T([]),l=p([]),s=p([]);if(\"function\"==typeof n)for(;++o<a;)e(r=this[o],n.call(r,r.parentNode.__data__,o));else for(;++o<a;)e(r=this[o],n);return l.enter=function(){return c},l.exit=function(){return s},l},Ro.datum=function(n){return arguments.length?this.property(\"__data__\",n):this.property(\"__data__\")},Ro.filter=function(n){var t,e,r,u=[];\"function\"!=typeof n&&(n=k(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a)&&t.push(r)}return p(u)},Ro.order=function(){for(var n=-1,t=this.length;++n<t;)for(var e,r=this[n],u=r.length-1,i=r[u];--u>=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},Ro.sort=function(n){n=A.apply(this,arguments);for(var t=-1,e=this.length;++t<e;)this[t].sort(n);return this.order()},Ro.each=function(n){return N(this,function(t,e,r){n.call(t,t.__data__,e,r)})},Ro.call=function(n){var t=Mo(arguments);return n.apply(t[0]=this,t),this},Ro.empty=function(){return!this.node()},Ro.node=function(){for(var n=0,t=this.length;t>n;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},Ro.size=function(){var n=0;return this.each(function(){++n}),n};var Io=[];mo.selection.enter=T,mo.selection.enter.prototype=Io,Io.append=Ro.append,Io.empty=Ro.empty,Io.node=Ro.node,Io.call=Ro.call,Io.size=Ro.size,Io.select=function(n){for(var t,e,r,u,i,o=[],a=-1,c=this.length;++a<c;){r=(u=this[a]).update,o.push(t=[]),t.parentNode=u.parentNode;for(var l=-1,s=u.length;++l<s;)(i=u[l])?(t.push(r[l]=e=n.call(u.parentNode,i.__data__,l,a)),e.__data__=i.__data__):t.push(null)}return p(o)},Io.insert=function(n,t){return arguments.length<2&&(t=q(this)),Ro.insert.call(this,n,t)},Ro.transition=function(){for(var n,t,e=Oc||++Zc,r=[],u=Rc||{time:Date.now(),ease:Cr,delay:0,duration:250},i=-1,o=this.length;++i<o;){r.push(n=[]);for(var a=this[i],c=-1,l=a.length;++c<l;)(t=a[c])&&Ni(t,c,e,u),n.push(t)}return Ei(r,e)},Ro.interrupt=function(){return this.each(z)},mo.select=function(n){var t=[\"string\"==typeof n?Ho(n,xo):n];return t.parentNode=bo,p([t])},mo.selectAll=function(n){var t=Mo(\"string\"==typeof n?Fo(n,xo):n);return t.parentNode=bo,p([t])};var Uo=mo.select(bo);Ro.on=function(n,t,e){var r=arguments.length;if(3>r){if(\"string\"!=typeof n){2>r&&(t=!1);for(e in n)this.each(C(e,n[e],t));return this}if(2>r)return(r=this.node()[\"__on\"+n])&&r._;e=!1}return this.each(C(n,t,e))};var Zo=mo.map({mouseenter:\"mouseover\",mouseleave:\"mouseout\"});Zo.forEach(function(n){\"on\"+n in xo&&Zo.remove(n)});var Vo=a(bo.style,\"userSelect\"),Xo=0;mo.mouse=function(n){return H(n,h())};var $o=/WebKit/.test(_o.navigator.userAgent)?-1:0;mo.touches=function(n,t){return arguments.length<2&&(t=h().touches),t?Mo(t).map(function(t){var e=H(n,t);return e.identifier=t.identifier,e}):[]},mo.behavior.drag=function(){function n(){this.on(\"mousedown.drag\",o).on(\"touchstart.drag\",a)}function t(){return mo.event.changedTouches[0].identifier}function e(n,t){return mo.touches(n).filter(function(n){return n.identifier===t})[0]}function r(n,t,e,r){return function(){function o(){var n=t(s,g),e=n[0]-d[0],r=n[1]-d[1];v|=e|r,d=n,f({type:\"drag\",x:n[0]+c[0],y:n[1]+c[1],dx:e,dy:r})}function a(){m.on(e+\".\"+p,null).on(r+\".\"+p,null),y(v&&mo.event.target===h),f({type:\"dragend\"})}var c,l=this,s=l.parentNode,f=u.of(l,arguments),h=mo.event.target,g=n(),p=null==g?\"drag\":\"drag-\"+g,d=t(s,g),v=0,m=mo.select(_o).on(e+\".\"+p,o).on(r+\".\"+p,a),y=L();i?(c=i.apply(l,arguments),c=[c.x-d[0],c.y-d[1]]):c=[0,0],f({type:\"dragstart\"})}}var u=g(n,\"drag\",\"dragstart\",\"dragend\"),i=null,o=r(c,mo.mouse,\"mousemove\",\"mouseup\"),a=r(t,e,\"touchmove\",\"touchend\");return n.origin=function(t){return arguments.length?(i=t,n):i},mo.rebind(n,u,\"on\")};var Bo=Math.PI,Wo=2*Bo,Jo=Bo/2,Go=1e-6,Ko=Go*Go,Qo=Bo/180,na=180/Bo,ta=Math.SQRT2,ea=2,ra=4;mo.interpolateZoom=function(n,t){function e(n){var t=n*y;if(m){var e=Y(d),o=i/(ea*h)*(e*I(ta*t+d)-R(d));return[r+o*l,u+o*s,i*e/Y(ta*t+d)]}return[r+n*l,u+n*s,i*Math.exp(ta*t)]}var r=n[0],u=n[1],i=n[2],o=t[0],a=t[1],c=t[2],l=o-r,s=a-u,f=l*l+s*s,h=Math.sqrt(f),g=(c*c-i*i+ra*f)/(2*i*ea*h),p=(c*c-i*i-ra*f)/(2*c*ea*h),d=Math.log(Math.sqrt(g*g+1)-g),v=Math.log(Math.sqrt(p*p+1)-p),m=v-d,y=(m||Math.log(c/i))/ta;return e.duration=1e3*y,e},mo.behavior.zoom=function(){function n(n){n.on(A,l).on(oa+\".zoom\",h).on(N,p).on(\"dblclick.zoom\",d).on(q,s)}function t(n){return[(n[0]-S.x)/S.k,(n[1]-S.y)/S.k]}function e(n){return[n[0]*S.k+S.x,n[1]*S.k+S.y]}function r(n){S.k=Math.max(k[0],Math.min(k[1],n))}function u(n,t){t=e(t),S.x+=n[0]-t[0],S.y+=n[1]-t[1]}function i(){b&&b.domain(x.range().map(function(n){return(n-S.x)/S.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-S.y)/S.k}).map(_.invert))}function o(n){n({type:\"zoomstart\"})}function a(n){i(),n({type:\"zoom\",scale:S.k,translate:[S.x,S.y]})}function c(n){n({type:\"zoomend\"})}function l(){function n(){s=1,u(mo.mouse(r),h),a(i)}function e(){f.on(N,_o===r?p:null).on(T,null),g(s&&mo.event.target===l),c(i)}var r=this,i=C.of(r,arguments),l=mo.event.target,s=0,f=mo.select(_o).on(N,n).on(T,e),h=t(mo.mouse(r)),g=L();z.call(r),o(i)}function s(){function n(){var n=mo.touches(p);return g=S.k,n.forEach(function(n){n.identifier in v&&(v[n.identifier]=t(n))}),n}function e(){for(var t=mo.event.changedTouches,e=0,i=t.length;i>e;++e)v[t[e].identifier]=null;var o=n(),c=Date.now();if(1===o.length){if(500>c-M){var l=o[0],s=v[l.identifier];r(2*S.k),u(l,s),f(),a(d)}M=c}else if(o.length>1){var l=o[0],h=o[1],g=l[0]-h[0],p=l[1]-h[1];m=g*g+p*p}}function i(){for(var n,t,e,i,o=mo.touches(p),c=0,l=o.length;l>c;++c,i=null)if(e=o[c],i=v[e.identifier]){if(t)break;n=e,t=i}if(i){var s=(s=e[0]-n[0])*s+(s=e[1]-n[1])*s,f=m&&Math.sqrt(s/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+i[0])/2,(t[1]+i[1])/2],r(f*g)}M=null,u(n,t),a(d)}function h(){if(mo.event.touches.length){for(var t=mo.event.changedTouches,e=0,r=t.length;r>e;++e)delete v[t[e].identifier];for(var u in v)return void n()}_.on(x,null).on(b,null),w.on(A,l).on(q,s),E(),c(d)}var g,p=this,d=C.of(p,arguments),v={},m=0,y=mo.event.changedTouches[0].identifier,x=\"touchmove.zoom-\"+y,b=\"touchend.zoom-\"+y,_=mo.select(_o).on(x,i).on(b,h),w=mo.select(p).on(A,null).on(q,e),E=L();z.call(p),e(),o(d)}function h(){var n=C.of(this,arguments);y?clearTimeout(y):(z.call(this),o(n)),y=setTimeout(function(){y=null,c(n)},50),f();var e=m||mo.mouse(this);v||(v=t(e)),r(Math.pow(2,.002*ua())*S.k),u(e,v),a(n)}function p(){v=null}function d(){var n=C.of(this,arguments),e=mo.mouse(this),i=t(e),l=Math.log(S.k)/Math.LN2;o(n),r(Math.pow(2,mo.event.shiftKey?Math.ceil(l)-1:Math.floor(l)+1)),u(e,i),a(n),c(n)}var v,m,y,M,x,b,_,w,S={x:0,y:0,k:1},E=[960,500],k=ia,A=\"mousedown.zoom\",N=\"mousemove.zoom\",T=\"mouseup.zoom\",q=\"touchstart.zoom\",C=g(n,\"zoomstart\",\"zoom\",\"zoomend\");return n.event=function(n){n.each(function(){var n=C.of(this,arguments),t=S;Oc?mo.select(this).transition().each(\"start.zoom\",function(){S=this.__chart__||{x:0,y:0,k:1},o(n)}).tween(\"zoom:zoom\",function(){var e=E[0],r=E[1],u=e/2,i=r/2,o=mo.interpolateZoom([(u-S.x)/S.k,(i-S.y)/S.k,e/S.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=o(t),c=e/r[2];this.__chart__=S={x:u-r[0]*c,y:i-r[1]*c,k:c},a(n)}}).each(\"end.zoom\",function(){c(n)}):(this.__chart__=S,o(n),a(n),c(n))})},n.translate=function(t){return arguments.length?(S={x:+t[0],y:+t[1],k:S.k},i(),n):[S.x,S.y]},n.scale=function(t){return arguments.length?(S={x:S.x,y:S.y,k:+t},i(),n):S.k},n.scaleExtent=function(t){return arguments.length?(k=null==t?ia:[+t[0],+t[1]],n):k},n.center=function(t){return arguments.length?(m=t&&[+t[0],+t[1]],n):m},n.size=function(t){return arguments.length?(E=t&&[+t[0],+t[1]],n):E},n.x=function(t){return arguments.length?(b=t,x=t.copy(),S={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),S={x:0,y:0,k:1},n):w},mo.rebind(n,C,\"on\")};var ua,ia=[0,1/0],oa=\"onwheel\"in xo?(ua=function(){return-mo.event.deltaY*(mo.event.deltaMode?120:1)},\"wheel\"):\"onmousewheel\"in xo?(ua=function(){return mo.event.wheelDelta},\"mousewheel\"):(ua=function(){return-mo.event.detail},\"MozMousePixelScroll\");Z.prototype.toString=function(){return this.rgb()+\"\"},mo.hsl=function(n,t,e){return 1===arguments.length?n instanceof X?V(n.h,n.s,n.l):lt(\"\"+n,st,V):V(+n,+t,+e)};var aa=X.prototype=new Z;aa.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),V(this.h,this.s,this.l/n)},aa.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),V(this.h,this.s,n*this.l)},aa.rgb=function(){return $(this.h,this.s,this.l)},mo.hcl=function(n,t,e){return 1===arguments.length?n instanceof W?B(n.h,n.c,n.l):n instanceof K?nt(n.l,n.a,n.b):nt((n=ft((n=mo.rgb(n)).r,n.g,n.b)).l,n.a,n.b):B(+n,+t,+e)};var ca=W.prototype=new Z;ca.brighter=function(n){return B(this.h,this.c,Math.min(100,this.l+la*(arguments.length?n:1)))},ca.darker=function(n){return B(this.h,this.c,Math.max(0,this.l-la*(arguments.length?n:1)))},ca.rgb=function(){return J(this.h,this.c,this.l).rgb()},mo.lab=function(n,t,e){return 1===arguments.length?n instanceof K?G(n.l,n.a,n.b):n instanceof W?J(n.l,n.c,n.h):ft((n=mo.rgb(n)).r,n.g,n.b):G(+n,+t,+e)};var la=18,sa=.95047,fa=1,ha=1.08883,ga=K.prototype=new Z;ga.brighter=function(n){return G(Math.min(100,this.l+la*(arguments.length?n:1)),this.a,this.b)},ga.darker=function(n){return G(Math.max(0,this.l-la*(arguments.length?n:1)),this.a,this.b)},ga.rgb=function(){return Q(this.l,this.a,this.b)},mo.rgb=function(n,t,e){return 1===arguments.length?n instanceof at?ot(n.r,n.g,n.b):lt(\"\"+n,ot,$):ot(~~n,~~t,~~e)};var pa=at.prototype=new Z;pa.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),ot(Math.min(255,~~(t/n)),Math.min(255,~~(e/n)),Math.min(255,~~(r/n)))):ot(u,u,u)},pa.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),ot(~~(n*this.r),~~(n*this.g),~~(n*this.b))},pa.hsl=function(){return st(this.r,this.g,this.b)},pa.toString=function(){return\"#\"+ct(this.r)+ct(this.g)+ct(this.b)};var da=mo.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});da.forEach(function(n,t){da.set(n,ut(t))}),mo.functor=pt,mo.xhr=vt(dt),mo.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var o=mo.xhr(n,t,i);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:u(n)):e},o.row(e)}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function o(t){return t.map(a).join(n)}function a(n){return c.test(n)?'\"'+n.replace(/\\\"/g,'\"\"')+'\"':n}var c=new RegExp('[\"'+n+\"\\n]\"),l=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function(\"d\",\"return {\"+n.map(function(n,t){return JSON.stringify(n)+\": d[\"+t+\"]\"}).join(\",\")+\"}\");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(s>=c)return o;if(u)return u=!1,i;var t=s;if(34===n.charCodeAt(t)){for(var e=t;e++<c;)if(34===n.charCodeAt(e)){if(34!==n.charCodeAt(e+1))break;++e}s=e+2;var r=n.charCodeAt(e+1);return 13===r?(u=!0,10===n.charCodeAt(e+2)&&++s):10===r&&(u=!0),n.substring(t+1,e).replace(/\"\"/g,'\"')}for(;c>s;){var r=n.charCodeAt(s++),a=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(s)&&(++s,++a);else if(r!==l)continue;return n.substring(t,s-a)}return n.substring(t)}for(var r,u,i={},o={},a=[],c=n.length,s=0,f=0;(r=e())!==o;){for(var h=[];r!==i&&r!==o;)h.push(r),r=e();(!t||(h=t(h,f++)))&&a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new i,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(a).join(n)].concat(t.map(function(t){return u.map(function(n){return a(t[n])}).join(n)})).join(\"\\n\")},e.formatRows=function(n){return n.map(o).join(\"\\n\")},e},mo.csv=mo.dsv(\",\",\"text/csv\"),mo.tsv=mo.dsv(\"\t\",\"text/tab-separated-values\");var va,ma,ya,Ma,xa,ba=_o[a(_o,\"requestAnimationFrame\")]||function(n){setTimeout(n,17)};mo.timer=function(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={callback:n,time:u,next:null};ma?ma.next=i:va=i,ma=i,ya||(Ma=clearTimeout(Ma),ya=1,ba(Mt))},mo.timer.flush=function(){bt(),_t()};var _a=\".\",wa=\",\",Sa=[3,3],Ea=\"$\",ka=[\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"\\xb5\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"].map(wt);mo.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=mo.round(n,St(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((0>=e?e+1:e-1)/3)))),ka[8+e/3]},mo.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)},mo.format=function(n){var t=Aa.exec(n),e=t[1]||\" \",r=t[2]||\">\",u=t[3]||\"\",i=t[4]||\"\",o=t[5],a=+t[6],c=t[7],l=t[8],s=t[9],f=1,h=\"\",g=!1;switch(l&&(l=+l.substring(1)),(o||\"0\"===e&&\"=\"===r)&&(o=e=\"0\",r=\"=\",c&&(a-=Math.floor((a-1)/4))),s){case\"n\":c=!0,s=\"g\";break;case\"%\":f=100,h=\"%\",s=\"f\";break;case\"p\":f=100,h=\"%\",s=\"r\";break;case\"b\":case\"o\":case\"x\":case\"X\":\"#\"===i&&(i=\"0\"+s.toLowerCase());case\"c\":case\"d\":g=!0,l=0;break;case\"s\":f=-1,s=\"r\"}\"#\"===i?i=\"\":\"$\"===i&&(i=Ea),\"r\"!=s||l||(s=\"g\"),null!=l&&(\"g\"==s?l=Math.max(1,Math.min(21,l)):(\"e\"==s||\"f\"==s)&&(l=Math.max(0,Math.min(20,l)))),s=Na.get(s)||Et;var p=o&&c;return function(n){if(g&&n%1)return\"\";var t=0>n||0===n&&0>1/n?(n=-n,\"-\"):u;if(0>f){var d=mo.formatPrefix(n,l);n=d.scale(n),h=d.symbol}else n*=f;n=s(n,l);var v=n.lastIndexOf(\".\"),m=0>v?n:n.substring(0,v),y=0>v?\"\":_a+n.substring(v+1);!o&&c&&(m=Ta(m));var M=i.length+m.length+y.length+(p?0:t.length),x=a>M?new Array(M=a-M+1).join(e):\"\";return p&&(m=Ta(x+m)),t+=i,n=m+y,(\"<\"===r?t+n+x:\">\"===r?x+t+n:\"^\"===r?x.substring(0,M>>=1)+t+n+x.substring(M):t+(p?n:x+n))+h}};var Aa=/(?:([^{])?([<>=^]))?([+\\- ])?([$#])?(0)?(\\d+)?(,)?(\\.-?\\d+)?([a-z%])?/i,Na=mo.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=mo.round(n,St(n,t))).toFixed(Math.max(0,Math.min(20,St(n*(1+1e-15),t))))}}),Ta=dt;if(Sa){var qa=Sa.length;Ta=function(n){for(var t=n.length,e=[],r=0,u=Sa[0];t>0&&u>0;)e.push(n.substring(t-=u,t+u)),u=Sa[r=(r+1)%qa];return e.reverse().join(wa)}}mo.geo={},kt.prototype={s:0,t:0,add:function(n){At(n,this.t,za),At(za.s,this.s,this),this.s?this.t+=za.t:this.s=za.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var za=new kt;mo.geo.stream=function(n,t){n&&Ca.hasOwnProperty(n.type)?Ca[n.type](n,t):Nt(n,t)};var Ca={Feature:function(n,t){Nt(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++r<u;)Nt(e[r].geometry,t)}},Da={Sphere:function(n,t){t.sphere()},Point:function(n,t){n=n.coordinates,t.point(n[0],n[1],n[2])},MultiPoint:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)n=e[r],t.point(n[0],n[1],n[2])},LineString:function(n,t){Tt(n.coordinates,t,0)},MultiLineString:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)Tt(e[r],t,0)},Polygon:function(n,t){qt(n.coordinates,t)},MultiPolygon:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)qt(e[r],t)},GeometryCollection:function(n,t){for(var e=n.geometries,r=-1,u=e.length;++r<u;)Nt(e[r],t)}};mo.geo.area=function(n){return ja=0,mo.geo.stream(n,Ha),ja};var ja,La=new kt,Ha={sphere:function(){ja+=4*Bo},point:c,lineStart:c,lineEnd:c,polygonStart:function(){La.reset(),Ha.lineStart=zt},polygonEnd:function(){var n=2*La;ja+=0>n?4*Bo+n:n,Ha.lineStart=Ha.lineEnd=Ha.point=c}};mo.geo.bounds=function(){function n(n,t){M.push(x=[s=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=Ct([t*Qo,e*Qo]);if(m){var u=jt(m,r),i=[u[1],-u[0],0],o=jt(i,u);Ft(o),o=Pt(o);var c=t-p,l=c>0?1:-1,d=o[0]*na*l,v=Math.abs(c)>180;if(v^(d>l*p&&l*t>d)){var y=o[1]*na;y>g&&(g=y)}else if(d=(d+360)%360-180,v^(d>l*p&&l*t>d)){var y=-o[1]*na;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);v?p>t?a(s,t)>a(s,h)&&(h=t):a(t,h)>a(s,h)&&(s=t):h>=s?(s>t&&(s=t),t>h&&(h=t)):t>p?a(s,t)>a(s,h)&&(h=t):a(t,h)>a(s,h)&&(s=t)}else n(t,e);m=r,p=t}function e(){b.point=t}function r(){x[0]=s,x[1]=h,b.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=Math.abs(r)>180?r+(r>0?360:-360):r}else d=n,v=e;Ha.point(n,e),t(n,e)}function i(){Ha.lineStart()}function o(){u(d,v),Ha.lineEnd(),Math.abs(y)>Go&&(s=-(h=180)),x[0]=s,x[1]=h,m=null}function a(n,t){return(t-=n)<0?t+360:t}function c(n,t){return n[0]-t[0]}function l(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:n<t[0]||t[1]<n}var s,f,h,g,p,d,v,m,y,M,x,b={point:n,lineStart:e,lineEnd:r,polygonStart:function(){b.point=u,b.lineStart=i,b.lineEnd=o,y=0,Ha.polygonStart()},polygonEnd:function(){Ha.polygonEnd(),b.point=n,b.lineStart=e,b.lineEnd=r,0>La?(s=-(h=180),f=-(g=90)):y>Go?g=90:-Go>y&&(f=-90),x[0]=s,x[1]=h}};return function(n){g=h=-(s=f=1/0),M=[],mo.geo.stream(n,b);var t=M.length;if(t){M.sort(c);for(var e,r=1,u=M[0],i=[u];t>r;++r)e=M[r],l(e[0],u)||l(e[1],u)?(a(u[0],e[1])>a(u[0],u[1])&&(u[1]=e[1]),a(e[0],u[1])>a(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var o,e,p=-1/0,t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(o=a(u[1],e[0]))>p&&(p=o,s=e[0],h=u[1])}return M=x=null,1/0===s||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[s,f],[h,g]]}}(),mo.geo.centroid=function(n){Fa=Pa=Oa=Ra=Ya=Ia=Ua=Za=Va=Xa=$a=0,mo.geo.stream(n,Ba);var t=Va,e=Xa,r=$a,u=t*t+e*e+r*r;return Ko>u&&(t=Ia,e=Ua,r=Za,Go>Pa&&(t=Oa,e=Ra,r=Ya),u=t*t+e*e+r*r,Ko>u)?[0/0,0/0]:[Math.atan2(e,t)*na,O(r/Math.sqrt(u))*na]};var Fa,Pa,Oa,Ra,Ya,Ia,Ua,Za,Va,Xa,$a,Ba={sphere:c,point:Rt,lineStart:It,lineEnd:Ut,polygonStart:function(){Ba.lineStart=Zt},polygonEnd:function(){Ba.lineStart=It}},Wa=Bt(Vt,Qt,te,[-Bo,-Bo/2]),Ja=1e9;mo.geo.clipExtent=function(){var n,t,e,r,u,i,o={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(a){return arguments.length?(i=re(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),u&&(u.valid=!1,u=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(mo.geo.conicEqualArea=function(){return oe(ae)}).raw=ae,mo.geo.albers=function(){return mo.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},mo.geo.albersUsa=function(){function n(n){var i=n[0],o=n[1];return t=null,e(i,o),t||(r(i,o),t)||u(i,o),t}var t,e,r,u,i=mo.geo.albers(),o=mo.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=mo.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?o:u>=.166&&.234>u&&r>=-.214&&-.115>r?a:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),o.precision(t),a.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),o.scale(.35*t),a.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var l=i.scale(),s=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[s-.455*l,f-.238*l],[s+.455*l,f+.238*l]]).stream(c).point,r=o.translate([s-.307*l,f+.201*l]).clipExtent([[s-.425*l+Go,f+.12*l+Go],[s-.214*l-Go,f+.234*l-Go]]).stream(c).point,u=a.translate([s-.205*l,f+.212*l]).clipExtent([[s-.214*l+Go,f+.166*l+Go],[s-.115*l-Go,f+.234*l-Go]]).stream(c).point,n},n.scale(1070)};var Ga,Ka,Qa,nc,tc,ec,rc={point:c,lineStart:c,lineEnd:c,polygonStart:function(){Ka=0,rc.lineStart=ce},polygonEnd:function(){rc.lineStart=rc.lineEnd=rc.point=c,Ga+=Math.abs(Ka/2)}},uc={point:le,lineStart:c,lineEnd:c,polygonStart:c,polygonEnd:c},ic={point:he,lineStart:ge,lineEnd:pe,polygonStart:function(){ic.lineStart=de},polygonEnd:function(){ic.point=he,ic.lineStart=ge,ic.lineEnd=pe}};mo.geo.transform=function(n){return{stream:function(t){var e=new ye(t);for(var r in n)e[r]=n[r];return e}}},ye.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},mo.geo.path=function(){function n(n){return n&&(\"function\"==typeof a&&i.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=u(i)),mo.geo.stream(n,o)),i.result()}function t(){return o=null,n}var e,r,u,i,o,a=4.5;return n.area=function(n){return Ga=0,mo.geo.stream(n,u(rc)),Ga},n.centroid=function(n){return Oa=Ra=Ya=Ia=Ua=Za=Va=Xa=$a=0,mo.geo.stream(n,u(ic)),$a?[Va/$a,Xa/$a]:Za?[Ia/Za,Ua/Za]:Ya?[Oa/Ya,Ra/Ya]:[0/0,0/0]},n.bounds=function(n){return tc=ec=-(Qa=nc=1/0),mo.geo.stream(n,u(uc)),[[Qa,nc],[tc,ec]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||Me(n):dt,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new se:new ve(n),\"function\"!=typeof a&&i.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a=\"function\"==typeof t?t:(i.pointRadius(+t),+t),n):a},n.projection(mo.geo.albersUsa()).context(null)},mo.geo.projection=xe,mo.geo.projectionMutator=be,(mo.geo.equirectangular=function(){return xe(we)}).raw=we.invert=we,mo.geo.rotation=function(n){function t(t){return t=n(t[0]*Qo,t[1]*Qo),t[0]*=na,t[1]*=na,t}return n=Ee(n[0]%360*Qo,n[1]*Qo,n.length>2?n[2]*Qo:0),t.invert=function(t){return t=n.invert(t[0]*Qo,t[1]*Qo),t[0]*=na,t[1]*=na,t},t},Se.invert=we,mo.geo.circle=function(){function n(){var n=\"function\"==typeof r?r.apply(this,arguments):r,t=Ee(-n[0]*Qo,-n[1]*Qo,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=na,n[1]*=na}}),{type:\"Polygon\",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=Te((t=+r)*Qo,u*Qo),n):t},n.precision=function(r){return arguments.length?(e=Te(t*Qo,(u=+r)*Qo),n):u},n.angle(90)},mo.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Qo,u=n[1]*Qo,i=t[1]*Qo,o=Math.sin(r),a=Math.cos(r),c=Math.sin(u),l=Math.cos(u),s=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*o)*e+(e=l*s-c*f*a)*e),c*s+l*f*a)},mo.geo.graticule=function(){function n(){return{type:\"MultiLineString\",coordinates:t()}}function t(){return mo.range(Math.ceil(i/v)*v,u,v).map(h).concat(mo.range(Math.ceil(l/m)*m,c,m).map(g)).concat(mo.range(Math.ceil(r/p)*p,e,p).filter(function(n){return Math.abs(n%v)>Go\n}).map(s)).concat(mo.range(Math.ceil(a/d)*d,o,d).filter(function(n){return Math.abs(n%m)>Go}).map(f))}var e,r,u,i,o,a,c,l,s,f,h,g,p=10,d=p,v=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:\"LineString\",coordinates:n}})},n.outline=function(){return{type:\"Polygon\",coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(l).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],l=+t[0][1],c=+t[1][1],i>u&&(t=i,i=u,u=t),l>c&&(t=l,l=c,c=t),n.precision(y)):[[i,l],[u,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(y)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(v=+t[0],m=+t[1],n):[v,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],d=+t[1],n):[p,d]},n.precision=function(t){return arguments.length?(y=+t,s=ze(a,o,90),f=Ce(r,e,y),h=ze(l,c,90),g=Ce(i,u,y),n):y},n.majorExtent([[-180,-90+Go],[180,90-Go]]).minorExtent([[-180,-80-Go],[180,80+Go]])},mo.geo.greatArc=function(){function n(){return{type:\"LineString\",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=De,u=je;return n.distance=function(){return mo.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t=\"function\"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e=\"function\"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},mo.geo.interpolate=function(n,t){return Le(n[0]*Qo,n[1]*Qo,t[0]*Qo,t[1]*Qo)},mo.geo.length=function(n){return oc=0,mo.geo.stream(n,ac),oc};var oc,ac={sphere:c,point:c,lineStart:He,lineEnd:c,polygonStart:c,polygonEnd:c},cc=Fe(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(mo.geo.azimuthalEqualArea=function(){return xe(cc)}).raw=cc;var lc=Fe(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},dt);(mo.geo.azimuthalEquidistant=function(){return xe(lc)}).raw=lc,(mo.geo.conicConformal=function(){return oe(Pe)}).raw=Pe,(mo.geo.conicEquidistant=function(){return oe(Oe)}).raw=Oe;var sc=Fe(function(n){return 1/n},Math.atan);(mo.geo.gnomonic=function(){return xe(sc)}).raw=sc,Re.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Jo]},(mo.geo.mercator=function(){return Ye(Re)}).raw=Re;var fc=Fe(function(){return 1},Math.asin);(mo.geo.orthographic=function(){return xe(fc)}).raw=fc;var hc=Fe(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(mo.geo.stereographic=function(){return xe(hc)}).raw=hc,Ie.invert=function(n,t){return[Math.atan2(R(n),Math.cos(t)),O(Math.sin(t)/Y(n))]},(mo.geo.transverseMercator=function(){return Ye(Ie)}).raw=Ie,mo.geom={},mo.svg={},mo.svg.line=function(){return Ue(dt)};var gc=mo.map({linear:Xe,\"linear-closed\":$e,step:Be,\"step-before\":We,\"step-after\":Je,basis:er,\"basis-open\":rr,\"basis-closed\":ur,bundle:ir,cardinal:Qe,\"cardinal-open\":Ge,\"cardinal-closed\":Ke,monotone:fr});gc.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var pc=[0,2/3,1/3,0],dc=[0,1/3,2/3,0],vc=[0,1/6,2/3,1/6];mo.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u,i,o,a,c,l,s,f,h,g,p,d=pt(e),v=pt(r),m=n.length,y=m-1,M=[],x=[],b=0;if(d===Ze&&r===Ve)t=n;else for(i=0,t=[];m>i;++i)t.push([+d.call(this,u=n[i],i),+v.call(this,u,i)]);for(i=1;m>i;++i)(t[i][1]<t[b][1]||t[i][1]==t[b][1]&&t[i][0]<t[b][0])&&(b=i);for(i=0;m>i;++i)i!==b&&(c=t[i][1]-t[b][1],a=t[i][0]-t[b][0],M.push({angle:Math.atan2(c,a),index:i}));for(M.sort(function(n,t){return n.angle-t.angle}),g=M[0].angle,h=M[0].index,f=0,i=1;y>i;++i){if(o=M[i].index,g==M[i].angle){if(a=t[h][0]-t[b][0],c=t[h][1]-t[b][1],l=t[o][0]-t[b][0],s=t[o][1]-t[b][1],a*a+c*c>=l*l+s*s){M[i].index=-1;continue}M[f].index=-1}g=M[i].angle,f=i,h=o}for(x.push(b),i=0,o=0;2>i;++o)M[o].index>-1&&(x.push(M[o].index),i++);for(p=x.length;y>o;++o)if(!(M[o].index<0)){for(;!hr(x[p-2],x[p-1],M[o].index,t);)--p;x[p++]=M[o].index}var _=[];for(i=p-1;i>=0;--i)_.push(n[x[i]]);return _}var e=Ze,r=Ve;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t)},mo.geom.polygon=function(n){return Lo(n,mc),n};var mc=mo.geom.polygon.prototype=[];mc.area=function(){for(var n,t=-1,e=this.length,r=this[e-1],u=0;++t<e;)n=r,r=this[t],u+=n[1]*r[0]-n[0]*r[1];return.5*u},mc.centroid=function(n){var t,e,r=-1,u=this.length,i=0,o=0,a=this[u-1];for(arguments.length||(n=-1/(6*this.area()));++r<u;)t=a,a=this[r],e=t[0]*a[1]-a[0]*t[1],i+=(t[0]+a[0])*e,o+=(t[1]+a[1])*e;return[i*n,o*n]},mc.clip=function(n){for(var t,e,r,u,i,o,a=dr(n),c=-1,l=this.length-dr(this),s=this[l-1];++c<l;){for(t=n.slice(),n.length=0,u=this[c],i=t[(r=t.length-a)-1],e=-1;++e<r;)o=t[e],gr(o,s,u)?(gr(i,s,u)||n.push(pr(i,o,s,u)),n.push(o)):gr(i,s,u)&&n.push(pr(i,o,s,u)),i=o;a&&n.push(n[0]),s=u}return n},mo.geom.delaunay=function(n){var t=n.map(function(){return[]}),e=[];return vr(n,function(e){t[e.region.l.index].push(n[e.region.r.index])}),t.forEach(function(t,r){var u=n[r],i=u[0],o=u[1];t.forEach(function(n){n.angle=Math.atan2(n[0]-i,n[1]-o)}),t.sort(function(n,t){return n.angle-t.angle});for(var a=0,c=t.length-1;c>a;a++)e.push([u,t[a],t[a+1]])}),e},mo.geom.voronoi=function(n){function t(n){var t,i,o,a=n.map(function(){return[]}),c=pt(e),l=pt(r),s=n.length,f=1e6;if(c===Ze&&l===Ve)t=n;else for(t=new Array(s),o=0;s>o;++o)t[o]=[+c.call(this,i=n[o],o),+l.call(this,i,o)];if(vr(t,function(n){var t,e,r,u,i,o;1===n.a&&n.b>=0?(t=n.ep.r,e=n.ep.l):(t=n.ep.l,e=n.ep.r),1===n.a?(i=t?t.y:-f,r=n.c-n.b*i,o=e?e.y:f,u=n.c-n.b*o):(r=t?t.x:-f,i=n.c-n.a*r,u=e?e.x:f,o=n.c-n.a*u);var c=[r,i],l=[u,o];a[n.region.l.index].push(c,l),a[n.region.r.index].push(c,l)}),a=a.map(function(n,e){var r=t[e][0],u=t[e][1],i=n.map(function(n){return Math.atan2(n[0]-r,n[1]-u)}),o=mo.range(n.length).sort(function(n,t){return i[n]-i[t]});return o.filter(function(n,t){return!t||i[n]-i[o[t-1]]>Go}).map(function(t){return n[t]})}),a.forEach(function(n,e){var r=n.length;if(!r)return n.push([-f,-f],[-f,f],[f,f],[f,-f]);if(!(r>2)){var u=t[e],i=n[0],o=n[1],a=u[0],c=u[1],l=i[0],s=i[1],h=o[0],g=o[1],p=Math.abs(h-l),d=g-s;if(Math.abs(d)<Go){var v=s>c?-f:f;n.push([-f,v],[f,v])}else if(Go>p){var m=l>a?-f:f;n.push([m,-f],[m,f])}else{var v=(l-a)*(g-s)>(h-l)*(s-c)?f:-f,y=Math.abs(d)-p;Math.abs(y)<Go?n.push([0>d?v:-v,v]):(y>0&&(v*=-1),n.push([-f,v],[f,v]))}}}),u)for(o=0;s>o;++o)u.clip(a[o]);for(o=0;s>o;++o)a[o].point=n[o];return a}var e=Ze,r=Ve,u=null;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.clipExtent=function(n){if(!arguments.length)return u&&[u[0],u[2]];if(null==n)u=null;else{var e=+n[0][0],r=+n[0][1],i=+n[1][0],o=+n[1][1];u=mo.geom.polygon([[e,r],[e,o],[i,o],[i,r]])}return t},t.size=function(n){return arguments.length?t.clipExtent(n&&[[0,0],n]):u&&u[2]},t.links=function(n){var t,u,i,o=n.map(function(){return[]}),a=[],c=pt(e),l=pt(r),s=n.length;if(c===Ze&&l===Ve)t=n;else for(t=new Array(s),i=0;s>i;++i)t[i]=[+c.call(this,u=n[i],i),+l.call(this,u,i)];return vr(t,function(t){var e=t.region.l.index,r=t.region.r.index;o[e][r]||(o[e][r]=o[r][e]=!0,a.push({source:n[e],target:n[r]}))}),a},t.triangles=function(n){if(e===Ze&&r===Ve)return mo.geom.delaunay(n);for(var t,u=new Array(c),i=pt(e),o=pt(r),a=-1,c=n.length;++a<c;)(u[a]=[+i.call(this,t=n[a],a),+o.call(this,t,a)]).data=t;return mo.geom.delaunay(u).map(function(n){return n.map(function(n){return n.data})})},t)};var yc={l:\"r\",r:\"l\"};mo.geom.quadtree=function(n,t,e,r,u){function i(n){function i(n,t,e,r,u,i,o,a){if(!isNaN(e)&&!isNaN(r))if(n.leaf){var c=n.x,s=n.y;if(null!=c)if(Math.abs(c-e)+Math.abs(s-r)<.01)l(n,t,e,r,u,i,o,a);else{var f=n.point;n.x=n.y=n.point=null,l(n,f,c,s,u,i,o,a),l(n,t,e,r,u,i,o,a)}else n.x=e,n.y=r,n.point=t}else l(n,t,e,r,u,i,o,a)}function l(n,t,e,r,u,o,a,c){var l=.5*(u+a),s=.5*(o+c),f=e>=l,h=r>=s,g=(h<<1)+f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=Mr()),f?u=l:a=l,h?o=s:c=s,i(n,t,e,r,u,o,a,c)}var s,f,h,g,p,d,v,m,y,M=pt(a),x=pt(c);if(null!=t)d=t,v=e,m=r,y=u;else if(m=y=-(d=v=1/0),f=[],h=[],p=n.length,o)for(g=0;p>g;++g)s=n[g],s.x<d&&(d=s.x),s.y<v&&(v=s.y),s.x>m&&(m=s.x),s.y>y&&(y=s.y),f.push(s.x),h.push(s.y);else for(g=0;p>g;++g){var b=+M(s=n[g],g),_=+x(s,g);d>b&&(d=b),v>_&&(v=_),b>m&&(m=b),_>y&&(y=_),f.push(b),h.push(_)}var w=m-d,S=y-v;w>S?y=v+w:m=d+S;var E=Mr();if(E.add=function(n){i(E,n,+M(n,++g),+x(n,g),d,v,m,y)},E.visit=function(n){xr(n,E,d,v,m,y)},g=-1,null==t){for(;++g<p;)i(E,n[g],f[g],h[g],d,v,m,y);--g}else n.forEach(E.add);return f=h=n=s=null,E}var o,a=Ze,c=Ve;return(o=arguments.length)?(a=mr,c=yr,3===o&&(u=e,r=t,e=t=0),i(n)):(i.x=function(n){return arguments.length?(a=n,i):a},i.y=function(n){return arguments.length?(c=n,i):c},i.extent=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=+n[0][0],e=+n[0][1],r=+n[1][0],u=+n[1][1]),i):null==t?null:[[t,e],[r,u]]},i.size=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=e=0,r=+n[0],u=+n[1]),i):null==t?null:[r-t,u-e]},i)},mo.interpolateRgb=br,mo.interpolateObject=_r,mo.interpolateNumber=wr,mo.interpolateString=Sr;var Mc=/[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g;mo.interpolate=Er,mo.interpolators=[function(n,t){var e=typeof t;return(\"string\"===e?da.has(t)||/^(#|rgb\\(|hsl\\()/.test(t)?br:Sr:t instanceof Z?br:\"object\"===e?Array.isArray(t)?kr:_r:wr)(n,t)}],mo.interpolateArray=kr;var xc=function(){return dt},bc=mo.map({linear:xc,poly:Dr,quad:function(){return qr},cubic:function(){return zr},sin:function(){return jr},exp:function(){return Lr},circle:function(){return Hr},elastic:Fr,back:Pr,bounce:function(){return Or}}),_c=mo.map({\"in\":dt,out:Nr,\"in-out\":Tr,\"out-in\":function(n){return Tr(Nr(n))}});mo.ease=function(n){var t=n.indexOf(\"-\"),e=t>=0?n.substring(0,t):n,r=t>=0?n.substring(t+1):\"in\";return e=bc.get(e)||xc,r=_c.get(r)||dt,Ar(r(e.apply(null,Array.prototype.slice.call(arguments,1))))},mo.interpolateHcl=Rr,mo.interpolateHsl=Yr,mo.interpolateLab=Ir,mo.interpolateRound=Ur,mo.transform=function(n){var t=xo.createElementNS(mo.ns.prefix.svg,\"g\");return(mo.transform=function(n){if(null!=n){t.setAttribute(\"transform\",n);var e=t.transform.baseVal.consolidate()}return new Zr(e?e.matrix:wc)})(n)},Zr.prototype.toString=function(){return\"translate(\"+this.translate+\")rotate(\"+this.rotate+\")skewX(\"+this.skew+\")scale(\"+this.scale+\")\"};var wc={a:1,b:0,c:0,d:1,e:0,f:0};mo.interpolateTransform=Br,mo.layout={},mo.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e<r;)t.push(Gr(n[e]));return t}},mo.layout.chord=function(){function n(){var n,l,f,h,g,p={},d=[],v=mo.range(i),m=[];for(e=[],r=[],n=0,h=-1;++h<i;){for(l=0,g=-1;++g<i;)l+=u[h][g];d.push(l),m.push(mo.range(i)),n+=l}for(o&&v.sort(function(n,t){return o(d[n],d[t])}),a&&m.forEach(function(n,t){n.sort(function(n,e){return a(u[t][n],u[t][e])})}),n=(Wo-s*i)/n,l=0,h=-1;++h<i;){for(f=l,g=-1;++g<i;){var y=v[h],M=m[y][g],x=u[y][M],b=l,_=l+=x*n;p[y+\"-\"+M]={index:y,subindex:M,startAngle:b,endAngle:_,value:x}}r[y]={index:y,startAngle:f,endAngle:l,value:(l-f)/n},l+=s}for(h=-1;++h<i;)for(g=h-1;++g<i;){var w=p[h+\"-\"+g],S=p[g+\"-\"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}c&&t()}function t(){e.sort(function(n,t){return c((n.source.value+n.target.value)/2,(t.source.value+t.target.value)/2)})}var e,r,u,i,o,a,c,l={},s=0;return l.matrix=function(n){return arguments.length?(i=(u=n)&&u.length,e=r=null,l):u},l.padding=function(n){return arguments.length?(s=n,e=r=null,l):s},l.sortGroups=function(n){return arguments.length?(o=n,e=r=null,l):o},l.sortSubgroups=function(n){return arguments.length?(a=n,e=null,l):a},l.sortChords=function(n){return arguments.length?(c=n,e&&t(),l):c},l.chords=function(){return e||n(),e},l.groups=function(){return r||n(),r},l},mo.layout.force=function(){function n(n){return function(t,e,r,u){if(t.point!==n){var i=t.cx-n.x,o=t.cy-n.y,a=1/Math.sqrt(i*i+o*o);if(d>(u-e)*a){var c=t.charge*a*a;return n.px-=i*c,n.py-=o*c,!0}if(t.point&&isFinite(a)){var c=t.pointCharge*a*a;n.px-=i*c,n.py-=o*c}}return!t.charge}}function t(n){n.px=mo.event.x,n.py=mo.event.y,a.resume()}var e,r,u,i,o,a={},c=mo.dispatch(\"start\",\"tick\",\"end\"),l=[1,1],s=.9,f=Sc,h=Ec,g=-30,p=.1,d=.8,v=[],m=[];return a.tick=function(){if((r*=.99)<.005)return c.end({type:\"end\",alpha:r=0}),!0;var t,e,a,f,h,d,y,M,x,b=v.length,_=m.length;for(e=0;_>e;++e)a=m[e],f=a.source,h=a.target,M=h.x-f.x,x=h.y-f.y,(d=M*M+x*x)&&(d=r*i[e]*((d=Math.sqrt(d))-u[e])/d,M*=d,x*=d,h.x-=M*(y=f.weight/(h.weight+f.weight)),h.y-=x*y,f.x+=M*(y=1-y),f.y+=x*y);if((y=r*p)&&(M=l[0]/2,x=l[1]/2,e=-1,y))for(;++e<b;)a=v[e],a.x+=(M-a.x)*y,a.y+=(x-a.y)*y;if(g)for(uu(t=mo.geom.quadtree(v),r,o),e=-1;++e<b;)(a=v[e]).fixed||t.visit(n(a));for(e=-1;++e<b;)a=v[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*s,a.y-=(a.py-(a.py=a.y))*s);c.tick({type:\"tick\",alpha:r})},a.nodes=function(n){return arguments.length?(v=n,a):v},a.links=function(n){return arguments.length?(m=n,a):m},a.size=function(n){return arguments.length?(l=n,a):l},a.linkDistance=function(n){return arguments.length?(f=\"function\"==typeof n?n:+n,a):f},a.distance=a.linkDistance,a.linkStrength=function(n){return arguments.length?(h=\"function\"==typeof n?n:+n,a):h},a.friction=function(n){return arguments.length?(s=+n,a):s},a.charge=function(n){return arguments.length?(g=\"function\"==typeof n?n:+n,a):g},a.gravity=function(n){return arguments.length?(p=+n,a):p},a.theta=function(n){return arguments.length?(d=+n,a):d},a.alpha=function(n){return arguments.length?(n=+n,r?r=n>0?n:0:n>0&&(c.start({type:\"start\",alpha:r=n}),mo.timer(a.tick)),a):r},a.start=function(){function n(n,r){for(var u,i=t(e),o=-1,a=i.length;++o<a;)if(!isNaN(u=i[o][n]))return u;return Math.random()*r}function t(){if(!c){for(c=[],r=0;p>r;++r)c[r]=[];for(r=0;d>r;++r){var n=m[r];c[n.source.index].push(n.target),c[n.target.index].push(n.source)}}return c[e]}var e,r,c,s,p=v.length,d=m.length,y=l[0],M=l[1];for(e=0;p>e;++e)(s=v[e]).index=e,s.weight=0;for(e=0;d>e;++e)s=m[e],\"number\"==typeof s.source&&(s.source=v[s.source]),\"number\"==typeof s.target&&(s.target=v[s.target]),++s.source.weight,++s.target.weight;for(e=0;p>e;++e)s=v[e],isNaN(s.x)&&(s.x=n(\"x\",y)),isNaN(s.y)&&(s.y=n(\"y\",M)),isNaN(s.px)&&(s.px=s.x),isNaN(s.py)&&(s.py=s.y);if(u=[],\"function\"==typeof f)for(e=0;d>e;++e)u[e]=+f.call(this,m[e],e);else for(e=0;d>e;++e)u[e]=f;if(i=[],\"function\"==typeof h)for(e=0;d>e;++e)i[e]=+h.call(this,m[e],e);else for(e=0;d>e;++e)i[e]=h;if(o=[],\"function\"==typeof g)for(e=0;p>e;++e)o[e]=+g.call(this,v[e],e);else for(e=0;p>e;++e)o[e]=g;return a.resume()},a.resume=function(){return a.alpha(.1)},a.stop=function(){return a.alpha(0)},a.drag=function(){return e||(e=mo.behavior.drag().origin(dt).on(\"dragstart.force\",nu).on(\"drag.force\",t).on(\"dragend.force\",tu)),arguments.length?(this.on(\"mouseover.force\",eu).on(\"mouseout.force\",ru).call(e),void 0):e},mo.rebind(a,c,\"on\")};var Sc=20,Ec=1;mo.layout.hierarchy=function(){function n(t,o,a){var c=u.call(e,t,o);if(t.depth=o,a.push(t),c&&(l=c.length)){for(var l,s,f=-1,h=t.children=[],g=0,p=o+1;++f<l;)s=n(c[f],p,a),s.parent=t,h.push(s),g+=s.value;r&&h.sort(r),i&&(t.value=g)}else i&&(t.value=+i.call(e,t,o)||0);return t}function t(n,r){var u=n.children,o=0;if(u&&(a=u.length))for(var a,c=-1,l=r+1;++c<a;)o+=t(u[c],l);else i&&(o=+i.call(e,n,r)||0);return i&&(n.value=o),o}function e(t){var e=[];return n(t,0,e),e}var r=cu,u=ou,i=au;return e.sort=function(n){return arguments.length?(r=n,e):r},e.children=function(n){return arguments.length?(u=n,e):u},e.value=function(n){return arguments.length?(i=n,e):i},e.revalue=function(n){return t(n,0),n},e},mo.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&&(o=i.length)){var o,a,c,l=-1;for(r=t.value?r/t.value:0;++l<o;)n(a=i[l],e,c=a.value*r,u),e+=c}}function t(n){var e=n.children,r=0;if(e&&(u=e.length))for(var u,i=-1;++i<u;)r=Math.max(r,t(e[i]));return 1+r}function e(e,i){var o=r.call(this,e,i);return n(o[0],0,u[0],u[1]/t(o[0])),o}var r=mo.layout.hierarchy(),u=[1,1];return e.size=function(n){return arguments.length?(u=n,e):u},iu(e,r)},mo.layout.pie=function(){function n(i){var o=i.map(function(e,r){return+t.call(n,e,r)}),a=+(\"function\"==typeof r?r.apply(this,arguments):r),c=((\"function\"==typeof u?u.apply(this,arguments):u)-a)/mo.sum(o),l=mo.range(i.length);null!=e&&l.sort(e===kc?function(n,t){return o[t]-o[n]}:function(n,t){return e(i[n],i[t])});var s=[];return l.forEach(function(n){var t;s[n]={data:i[n],value:t=o[n],startAngle:a,endAngle:a+=t*c}}),s}var t=Number,e=kc,r=0,u=Wo;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n};var kc={};mo.layout.stack=function(){function n(a,c){var l=a.map(function(e,r){return t.call(n,e,r)}),s=l.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),o.call(n,t,e)]})}),f=e.call(n,s,c);l=mo.permute(l,f),s=mo.permute(s,f);var h,g,p,d=r.call(n,s,c),v=l.length,m=l[0].length;for(g=0;m>g;++g)for(u.call(n,l[0][g],p=d[g],s[0][g][1]),h=1;v>h;++h)u.call(n,l[h][g],p+=s[h-1][g][1],s[h][g][1]);return a}var t=dt,e=gu,r=pu,u=hu,i=su,o=fu;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e=\"function\"==typeof t?t:Ac.get(t)||gu,n):e},n.offset=function(t){return arguments.length?(r=\"function\"==typeof t?t:Nc.get(t)||pu,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(u=t,n):u},n};var Ac=mo.map({\"inside-out\":function(n){var t,e,r=n.length,u=n.map(du),i=n.map(vu),o=mo.range(r).sort(function(n,t){return u[n]-u[t]}),a=0,c=0,l=[],s=[];for(t=0;r>t;++t)e=o[t],c>a?(a+=i[e],l.push(e)):(c+=i[e],s.push(e));return s.reverse().concat(l)},reverse:function(n){return mo.range(n.length).reverse()},\"default\":gu}),Nc=mo.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,o=[],a=0,c=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;i>e;++e)c[e]=(a-o[e])/2;return c},wiggle:function(n){var t,e,r,u,i,o,a,c,l,s=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=l=0,e=1;h>e;++e){for(t=0,u=0;s>t;++t)u+=n[t][e][1];for(t=0,i=0,a=f[e][0]-f[e-1][0];s>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;i+=o*n[t][e][1]}g[e]=c-=u?i/u*a:0,l>c&&(l=c)}for(e=0;h>e;++e)g[e]-=l;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,o=1/u,a=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=o}for(e=0;i>e;++e)a[e]=0;return a},zero:pu});mo.layout.histogram=function(){function n(n,i){for(var o,a,c=[],l=n.map(e,this),s=r.call(this,l,i),f=u.call(this,s,l,i),i=-1,h=l.length,g=f.length-1,p=t?1:1/h;++i<g;)o=c[i]=[],o.dx=f[i+1]-(o.x=f[i]),o.y=0;if(g>0)for(i=-1;++i<h;)a=l[i],a>=s[0]&&a<=s[1]&&(o=c[mo.bisect(f,a,1,g)-1],o.y+=p,o.push(n[i]));return c}var t=!0,e=Number,r=xu,u=yu;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=pt(t),n):r},n.bins=function(t){return arguments.length?(u=\"number\"==typeof t?function(n){return Mu(n,t)}:pt(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},mo.layout.tree=function(){function n(n,i){function o(n,t){var r=n.children,u=n._tree;if(r&&(i=r.length)){for(var i,a,l,s=r[0],f=s,h=-1;++h<i;)l=r[h],o(l,a),f=c(l,a,f),a=l;Tu(n);var g=.5*(s._tree.prelim+l._tree.prelim);t?(u.prelim=t._tree.prelim+e(n,t),u.mod=u.prelim-g):u.prelim=g}else t&&(u.prelim=t._tree.prelim+e(n,t))}function a(n,t){n.x=n._tree.prelim+t;var e=n.children;if(e&&(r=e.length)){var r,u=-1;for(t+=n._tree.mod;++u<r;)a(e[u],t)}}function c(n,t,r){if(t){for(var u,i=n,o=n,a=t,c=n.parent.children[0],l=i._tree.mod,s=o._tree.mod,f=a._tree.mod,h=c._tree.mod;a=wu(a),i=_u(i),a&&i;)c=_u(c),o=wu(o),o._tree.ancestor=n,u=a._tree.prelim+f-i._tree.prelim-l+e(a,i),u>0&&(qu(zu(a,n,r),n,u),l+=u,s+=u),f+=a._tree.mod,l+=i._tree.mod,h+=c._tree.mod,s+=o._tree.mod;a&&!wu(o)&&(o._tree.thread=a,o._tree.mod+=f-s),i&&!_u(c)&&(c._tree.thread=i,c._tree.mod+=l-h,r=n)}return r}var l=t.call(this,n,i),s=l[0];Nu(s,function(n,t){n._tree={ancestor:n,prelim:0,mod:0,change:0,shift:0,number:t?t._tree.number+1:0}}),o(s),a(s,-s._tree.prelim);var f=Su(s,ku),h=Su(s,Eu),g=Su(s,Au),p=f.x-e(f,h)/2,d=h.x+e(h,f)/2,v=g.depth||1;return Nu(s,u?function(n){n.x*=r[0],n.y=n.depth*r[1],delete n._tree}:function(n){n.x=(n.x-p)/(d-p)*r[0],n.y=n.depth/v*r[1],delete n._tree}),l}var t=mo.layout.hierarchy().sort(null).value(null),e=bu,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},iu(n,t)},mo.layout.pack=function(){function n(n,i){var o=e.call(this,n,i),a=o[0],c=u[0],l=u[1],s=null==t?Math.sqrt:\"function\"==typeof t?t:function(){return t};if(a.x=a.y=0,Nu(a,function(n){n.r=+s(n.value)}),Nu(a,Hu),r){var f=r*(t?1:Math.max(2*a.r/c,2*a.r/l))/2;Nu(a,function(n){n.r+=f}),Nu(a,Hu),Nu(a,function(n){n.r-=f})}return Ou(a,c/2,l/2,t?1:1/Math.max(2*a.r/c,2*a.r/l)),o}var t,e=mo.layout.hierarchy().sort(Cu),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||\"function\"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},iu(n,e)},mo.layout.cluster=function(){function n(n,i){var o,a=t.call(this,n,i),c=a[0],l=0;Nu(c,function(n){var t=n.children;t&&t.length?(n.x=Iu(t),n.y=Yu(t)):(n.x=o?l+=e(n,o):0,n.y=0,o=n)});var s=Uu(c),f=Zu(c),h=s.x-e(s,f)/2,g=f.x+e(f,s)/2;return Nu(c,u?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),a}var t=mo.layout.hierarchy().sort(null).value(null),e=bu,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},iu(n,t)},mo.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++u<i;)r=(e=n[u]).value*(0>t?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var o,a,c,l=f(e),s=[],h=i.slice(),p=1/0,d=\"slice\"===g?l.dx:\"dice\"===g?l.dy:\"slice-dice\"===g?1&e.depth?l.dy:l.dx:Math.min(l.dx,l.dy);for(n(h,l.dx*l.dy/e.value),s.area=0;(c=h.length)>0;)s.push(o=h[c-1]),s.area+=o.area,\"squarify\"!==g||(a=r(s,d))<=p?(h.pop(),p=a):(s.area-=s.pop().area,u(s,d,l,!1),d=Math.min(l.dx,l.dy),s.length=s.area=0,p=1/0);s.length&&(u(s,d,l,!0),s.length=s.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,o=f(t),a=r.slice(),c=[];for(n(a,o.dx*o.dy/t.value),c.area=0;i=a.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?o.dx:o.dy,o,!a.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,o=-1,a=n.length;++o<a;)(e=n[o].area)&&(i>e&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,o=n.length,a=e.x,l=e.y,s=t?c(n.area/t):0;if(t==e.dx){for((r||s>e.dy)&&(s=e.dy);++i<o;)u=n[i],u.x=a,u.y=l,u.dy=s,a+=u.dx=Math.min(e.x+e.dx-a,s?c(u.area/s):0);u.z=!0,u.dx+=e.x+e.dx-a,e.y+=s,e.dy-=s}else{for((r||s>e.dx)&&(s=e.dx);++i<o;)u=n[i],u.x=a,u.y=l,u.dx=s,l+=u.dy=Math.min(e.y+e.dy-l,s?c(u.area/s):0);u.z=!1,u.dy+=e.y+e.dy-l,e.x+=s,e.dx-=s}}function i(r){var u=o||a(r),i=u[0];return i.x=0,i.y=0,i.dx=l[0],i.dy=l[1],o&&a.revalue(i),n([i],i.dx*i.dy/i.value),(o?e:t)(i),h&&(o=u),u}var o,a=mo.layout.hierarchy(),c=Math.round,l=[1,1],s=null,f=Vu,h=!1,g=\"squarify\",p=.5*(1+Math.sqrt(5));return i.size=function(n){return arguments.length?(l=n,i):l},i.padding=function(n){function t(t){var e=n.call(i,t,t.depth);return null==e?Vu(t):Xu(t,\"number\"==typeof e?[e,e,e,e]:e)}function e(t){return Xu(t,n)}if(!arguments.length)return s;var r;return f=null==(s=n)?Vu:\"function\"==(r=typeof n)?t:\"number\"===r?(n=[n,n,n,n],e):e,i},i.round=function(n){return arguments.length?(c=n?Math.round:Number,i):c!=Number},i.sticky=function(n){return arguments.length?(h=n,o=null,i):h},i.ratio=function(n){return arguments.length?(p=n,i):p},i.mode=function(n){return arguments.length?(g=n+\"\",i):g},iu(i,a)},mo.random={normal:function(n,t){var e=arguments.length;return 2>e&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=mo.random.normal.apply(mo,arguments);return function(){return Math.exp(n())}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t/n}}},mo.scale={};var Tc={floor:dt,ceil:dt};mo.scale.linear=function(){return Qu([0,1],[0,1],Er,!1)},mo.scale.log=function(){return ii(mo.scale.linear().domain([0,1]),10,!0,[1,10])};var qc=mo.format(\".0e\"),zc={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};mo.scale.pow=function(){return oi(mo.scale.linear(),1,[0,1])},mo.scale.sqrt=function(){return mo.scale.pow().exponent(.5)},mo.scale.ordinal=function(){return ci([],{t:\"range\",a:[[]]})},mo.scale.category10=function(){return mo.scale.ordinal().range(Cc)},mo.scale.category20=function(){return mo.scale.ordinal().range(Dc)},mo.scale.category20b=function(){return mo.scale.ordinal().range(jc)},mo.scale.category20c=function(){return mo.scale.ordinal().range(Lc)};var Cc=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(it),Dc=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(it),jc=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(it),Lc=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(it);mo.scale.quantile=function(){return li([],[])},mo.scale.quantize=function(){return si(0,1,[0,1])},mo.scale.threshold=function(){return fi([.5],[0,1])},mo.scale.identity=function(){return hi([0,1])},mo.svg.arc=function(){function n(){var n=t.apply(this,arguments),i=e.apply(this,arguments),o=r.apply(this,arguments)+Hc,a=u.apply(this,arguments)+Hc,c=(o>a&&(c=o,o=a,a=c),a-o),l=Bo>c?\"0\":\"1\",s=Math.cos(o),f=Math.sin(o),h=Math.cos(a),g=Math.sin(a);return c>=Fc?n?\"M0,\"+i+\"A\"+i+\",\"+i+\" 0 1,1 0,\"+-i+\"A\"+i+\",\"+i+\" 0 1,1 0,\"+i+\"M0,\"+n+\"A\"+n+\",\"+n+\" 0 1,0 0,\"+-n+\"A\"+n+\",\"+n+\" 0 1,0 0,\"+n+\"Z\":\"M0,\"+i+\"A\"+i+\",\"+i+\" 0 1,1 0,\"+-i+\"A\"+i+\",\"+i+\" 0 1,1 0,\"+i+\"Z\":n?\"M\"+i*s+\",\"+i*f+\"A\"+i+\",\"+i+\" 0 \"+l+\",1 \"+i*h+\",\"+i*g+\"L\"+n*h+\",\"+n*g+\"A\"+n+\",\"+n+\" 0 \"+l+\",0 \"+n*s+\",\"+n*f+\"Z\":\"M\"+i*s+\",\"+i*f+\"A\"+i+\",\"+i+\" 0 \"+l+\",1 \"+i*h+\",\"+i*g+\"L0,0\"+\"Z\"}var t=gi,e=pi,r=di,u=vi;return n.innerRadius=function(e){return arguments.length?(t=pt(e),n):t},n.outerRadius=function(t){return arguments.length?(e=pt(t),n):e},n.startAngle=function(t){return arguments.length?(r=pt(t),n):r},n.endAngle=function(t){return arguments.length?(u=pt(t),n):u},n.centroid=function(){var n=(t.apply(this,arguments)+e.apply(this,arguments))/2,i=(r.apply(this,arguments)+u.apply(this,arguments))/2+Hc;return[Math.cos(i)*n,Math.sin(i)*n]},n};var Hc=-Jo,Fc=Wo-Go;mo.svg.line.radial=function(){var n=Ue(mi);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},We.reverse=Je,Je.reverse=We,mo.svg.area=function(){return yi(dt)},mo.svg.area.radial=function(){var n=yi(mi);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},mo.svg.chord=function(){function n(n,a){var c=t(this,i,n,a),l=t(this,o,n,a);return\"M\"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,l)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,l.r,l.p0)+r(l.r,l.p1,l.a1-l.a0)+u(l.r,l.p1,c.r,c.p0))+\"Z\"}function t(n,t,e,r){var u=t.call(n,e,r),i=a.call(n,u,r),o=c.call(n,u,r)+Hc,s=l.call(n,u,r)+Hc;return{r:i,a0:o,a1:s,p0:[i*Math.cos(o),i*Math.sin(o)],p1:[i*Math.cos(s),i*Math.sin(s)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return\"A\"+n+\",\"+n+\" 0 \"+ +(e>Bo)+\",1 \"+t}function u(n,t,e,r){return\"Q 0,0 \"+r}var i=De,o=je,a=Mi,c=di,l=vi;return n.radius=function(t){return arguments.length?(a=pt(t),n):a},n.source=function(t){return arguments.length?(i=pt(t),n):i},n.target=function(t){return arguments.length?(o=pt(t),n):o},n.startAngle=function(t){return arguments.length?(c=pt(t),n):c},n.endAngle=function(t){return arguments.length?(l=pt(t),n):l},n},mo.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),o=e.call(this,n,u),a=(i.y+o.y)/2,c=[i,{x:i.x,y:a},{x:o.x,y:a},o];return c=c.map(r),\"M\"+c[0]+\"C\"+c[1]+\" \"+c[2]+\" \"+c[3]}var t=De,e=je,r=xi;return n.source=function(e){return arguments.length?(t=pt(e),n):t},n.target=function(t){return arguments.length?(e=pt(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},mo.svg.diagonal.radial=function(){var n=mo.svg.diagonal(),t=xi,e=n.projection;return n.projection=function(n){return arguments.length?e(bi(t=n)):t},n},mo.svg.symbol=function(){function n(n,r){return(Pc.get(t.call(this,n,r))||Si)(e.call(this,n,r))}var t=wi,e=_i;return n.type=function(e){return arguments.length?(t=pt(e),n):t},n.size=function(t){return arguments.length?(e=pt(t),n):e},n};var Pc=mo.map({circle:Si,cross:function(n){var t=Math.sqrt(n/5)/2;return\"M\"+-3*t+\",\"+-t+\"H\"+-t+\"V\"+-3*t+\"H\"+t+\"V\"+-t+\"H\"+3*t+\"V\"+t+\"H\"+t+\"V\"+3*t+\"H\"+-t+\"V\"+t+\"H\"+-3*t+\"Z\"},diamond:function(n){var t=Math.sqrt(n/(2*Ic)),e=t*Ic;return\"M0,\"+-t+\"L\"+e+\",0\"+\" 0,\"+t+\" \"+-e+\",0\"+\"Z\"},square:function(n){var t=Math.sqrt(n)/2;return\"M\"+-t+\",\"+-t+\"L\"+t+\",\"+-t+\" \"+t+\",\"+t+\" \"+-t+\",\"+t+\"Z\"},\"triangle-down\":function(n){var t=Math.sqrt(n/Yc),e=t*Yc/2;return\"M0,\"+e+\"L\"+t+\",\"+-e+\" \"+-t+\",\"+-e+\"Z\"},\"triangle-up\":function(n){var t=Math.sqrt(n/Yc),e=t*Yc/2;return\"M0,\"+-e+\"L\"+t+\",\"+e+\" \"+-t+\",\"+e+\"Z\"}});mo.svg.symbolTypes=Pc.keys();var Oc,Rc,Yc=Math.sqrt(3),Ic=Math.tan(30*Qo),Uc=[],Zc=0;Uc.call=Ro.call,Uc.empty=Ro.empty,Uc.node=Ro.node,Uc.size=Ro.size,mo.transition=function(n){return arguments.length?Oc?n.transition():n:Uo.transition()},mo.transition.prototype=Uc,Uc.select=function(n){var t,e,r,u=this.id,i=[];n=d(n);for(var o=-1,a=this.length;++o<a;){i.push(t=[]);for(var c=this[o],l=-1,s=c.length;++l<s;)(r=c[l])&&(e=n.call(r,r.__data__,l,o))?(\"__data__\"in r&&(e.__data__=r.__data__),Ni(e,l,u,r.__transition__[u]),t.push(e)):t.push(null)}return Ei(i,u)},Uc.selectAll=function(n){var t,e,r,u,i,o=this.id,a=[];n=v(n);for(var c=-1,l=this.length;++c<l;)for(var s=this[c],f=-1,h=s.length;++f<h;)if(r=s[f]){i=r.__transition__[o],e=n.call(r,r.__data__,f,c),a.push(t=[]);for(var g=-1,p=e.length;++g<p;)(u=e[g])&&Ni(u,g,o,i),t.push(u)}return Ei(a,o)},Uc.filter=function(n){var t,e,r,u=[];\"function\"!=typeof n&&(n=k(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]);for(var e=this[i],a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a)&&t.push(r)}return Ei(u,this.id)},Uc.tween=function(n,t){var e=this.id;return arguments.length<2?this.node().__transition__[e].tween.get(n):N(this,null==t?function(t){t.__transition__[e].tween.remove(n)}:function(r){r.__transition__[e].tween.set(n,t)})},Uc.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function u(n){return null==n?e:(n+=\"\",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function i(n){return null==n?r:(n+=\"\",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))\n})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o=\"transform\"==n?Br:Er,a=mo.ns.qualify(n);return ki(this,\"attr.\"+n,t,a.local?i:u)},Uc.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=mo.ns.qualify(n);return this.tween(\"attr.\"+n,u.local?r:e)},Uc.style=function(n,t,e){function r(){this.style.removeProperty(n)}function u(t){return null==t?r:(t+=\"\",function(){var r,u=_o.getComputedStyle(this,null).getPropertyValue(n);return u!==t&&(r=Er(u,t),function(t){this.style.setProperty(n,r(t),e)})})}var i=arguments.length;if(3>i){if(\"string\"!=typeof n){2>i&&(t=\"\");for(e in n)this.style(e,n[e],t);return this}e=\"\"}return ki(this,\"style.\"+n,t,u)},Uc.styleTween=function(n,t,e){function r(r,u){var i=t.call(this,r,u,_o.getComputedStyle(this,null).getPropertyValue(n));return i&&function(t){this.style.setProperty(n,i(t),e)}}return arguments.length<3&&(e=\"\"),this.tween(\"style.\"+n,r)},Uc.text=function(n){return ki(this,\"text\",n,Ai)},Uc.remove=function(){return this.each(\"end.transition\",function(){var n;this.__transition__.count<2&&(n=this.parentNode)&&n.removeChild(this)})},Uc.ease=function(n){var t=this.id;return arguments.length<1?this.node().__transition__[t].ease:(\"function\"!=typeof n&&(n=mo.ease.apply(mo,arguments)),N(this,function(e){e.__transition__[t].ease=n}))},Uc.delay=function(n){var t=this.id;return N(this,\"function\"==typeof n?function(e,r,u){e.__transition__[t].delay=+n.call(e,e.__data__,r,u)}:(n=+n,function(e){e.__transition__[t].delay=n}))},Uc.duration=function(n){var t=this.id;return N(this,\"function\"==typeof n?function(e,r,u){e.__transition__[t].duration=Math.max(1,n.call(e,e.__data__,r,u))}:(n=Math.max(1,n),function(e){e.__transition__[t].duration=n}))},Uc.each=function(n,t){var e=this.id;if(arguments.length<2){var r=Rc,u=Oc;Oc=e,N(this,function(t,r,u){Rc=t.__transition__[e],n.call(t,t.__data__,r,u)}),Rc=r,Oc=u}else N(this,function(r){var u=r.__transition__[e];(u.event||(u.event=mo.dispatch(\"start\",\"end\"))).on(n,t)});return this},Uc.transition=function(){for(var n,t,e,r,u=this.id,i=++Zc,o=[],a=0,c=this.length;c>a;a++){o.push(n=[]);for(var t=this[a],l=0,s=t.length;s>l;l++)(e=t[l])&&(r=Object.create(e.__transition__[u]),r.delay+=r.duration,Ni(e,l,i,r)),n.push(e)}return Ei(o,i)},mo.svg.axis=function(){function n(n){n.each(function(){var n,l=mo.select(this),s=this.__chart__||e,f=this.__chart__=e.copy(),h=null==c?f.ticks?f.ticks.apply(f,a):f.domain():c,g=null==t?f.tickFormat?f.tickFormat.apply(f,a):dt:t,p=l.selectAll(\".tick\").data(h,f),d=p.enter().insert(\"g\",\".domain\").attr(\"class\",\"tick\").style(\"opacity\",Go),v=mo.transition(p.exit()).style(\"opacity\",Go).remove(),m=mo.transition(p).style(\"opacity\",1),y=Bu(f),M=l.selectAll(\".domain\").data([0]),x=(M.enter().append(\"path\").attr(\"class\",\"domain\"),mo.transition(M));d.append(\"line\"),d.append(\"text\");var b=d.select(\"line\"),_=m.select(\"line\"),w=p.select(\"text\").text(g),S=d.select(\"text\"),E=m.select(\"text\");switch(r){case\"bottom\":n=Ti,b.attr(\"y2\",u),S.attr(\"y\",Math.max(u,0)+o),_.attr(\"x2\",0).attr(\"y2\",u),E.attr(\"x\",0).attr(\"y\",Math.max(u,0)+o),w.attr(\"dy\",\".71em\").style(\"text-anchor\",\"middle\"),x.attr(\"d\",\"M\"+y[0]+\",\"+i+\"V0H\"+y[1]+\"V\"+i);break;case\"top\":n=Ti,b.attr(\"y2\",-u),S.attr(\"y\",-(Math.max(u,0)+o)),_.attr(\"x2\",0).attr(\"y2\",-u),E.attr(\"x\",0).attr(\"y\",-(Math.max(u,0)+o)),w.attr(\"dy\",\"0em\").style(\"text-anchor\",\"middle\"),x.attr(\"d\",\"M\"+y[0]+\",\"+-i+\"V0H\"+y[1]+\"V\"+-i);break;case\"left\":n=qi,b.attr(\"x2\",-u),S.attr(\"x\",-(Math.max(u,0)+o)),_.attr(\"x2\",-u).attr(\"y2\",0),E.attr(\"x\",-(Math.max(u,0)+o)).attr(\"y\",0),w.attr(\"dy\",\".32em\").style(\"text-anchor\",\"end\"),x.attr(\"d\",\"M\"+-i+\",\"+y[0]+\"H0V\"+y[1]+\"H\"+-i);break;case\"right\":n=qi,b.attr(\"x2\",u),S.attr(\"x\",Math.max(u,0)+o),_.attr(\"x2\",u).attr(\"y2\",0),E.attr(\"x\",Math.max(u,0)+o).attr(\"y\",0),w.attr(\"dy\",\".32em\").style(\"text-anchor\",\"start\"),x.attr(\"d\",\"M\"+i+\",\"+y[0]+\"H0V\"+y[1]+\"H\"+i)}if(f.rangeBand){var k=f.rangeBand()/2,A=function(n){return f(n)+k};d.call(n,A),m.call(n,A)}else d.call(n,s),m.call(n,f),v.call(n,f)})}var t,e=mo.scale.linear(),r=Vc,u=6,i=6,o=3,a=[10],c=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Xc?t+\"\":Vc,n):r},n.ticks=function(){return arguments.length?(a=arguments,n):a},n.tickValues=function(t){return arguments.length?(c=t,n):c},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var Vc=\"bottom\",Xc={top:1,right:1,bottom:1,left:1};mo.svg.brush=function(){function n(i){i.each(function(){var i=mo.select(this).style(\"pointer-events\",\"all\").style(\"-webkit-tap-highlight-color\",\"rgba(0,0,0,0)\").on(\"mousedown.brush\",u).on(\"touchstart.brush\",u),o=i.selectAll(\".background\").data([0]);o.enter().append(\"rect\").attr(\"class\",\"background\").style(\"visibility\",\"hidden\").style(\"cursor\",\"crosshair\"),i.selectAll(\".extent\").data([0]).enter().append(\"rect\").attr(\"class\",\"extent\").style(\"cursor\",\"move\");var a=i.selectAll(\".resize\").data(v,dt);a.exit().remove(),a.enter().append(\"g\").attr(\"class\",function(n){return\"resize \"+n}).style(\"cursor\",function(n){return $c[n]}).append(\"rect\").attr(\"x\",function(n){return/[ew]$/.test(n)?-3:null}).attr(\"y\",function(n){return/^[ns]/.test(n)?-3:null}).attr(\"width\",6).attr(\"height\",6).style(\"visibility\",\"hidden\"),a.style(\"display\",n.empty()?\"none\":null);var s,f=mo.transition(i),h=mo.transition(o);c&&(s=Bu(c),h.attr(\"x\",s[0]).attr(\"width\",s[1]-s[0]),e(f)),l&&(s=Bu(l),h.attr(\"y\",s[0]).attr(\"height\",s[1]-s[0]),r(f)),t(f)})}function t(n){n.selectAll(\".resize\").attr(\"transform\",function(n){return\"translate(\"+s[+/e$/.test(n)]+\",\"+h[+/^s/.test(n)]+\")\"})}function e(n){n.select(\".extent\").attr(\"x\",s[0]),n.selectAll(\".extent,.n>rect,.s>rect\").attr(\"width\",s[1]-s[0])}function r(n){n.select(\".extent\").attr(\"y\",h[0]),n.selectAll(\".extent,.e>rect,.w>rect\").attr(\"height\",h[1]-h[0])}function u(){function u(){32==mo.event.keyCode&&(N||(M=null,q[0]-=s[1],q[1]-=h[1],N=2),f())}function g(){32==mo.event.keyCode&&2==N&&(q[0]+=s[1],q[1]+=h[1],N=0,f())}function v(){var n=mo.mouse(b),u=!1;x&&(n[0]+=x[0],n[1]+=x[1]),N||(mo.event.altKey?(M||(M=[(s[0]+s[1])/2,(h[0]+h[1])/2]),q[0]=s[+(n[0]<M[0])],q[1]=h[+(n[1]<M[1])]):M=null),k&&m(n,c,0)&&(e(S),u=!0),A&&m(n,l,1)&&(r(S),u=!0),u&&(t(S),w({type:\"brush\",mode:N?\"move\":\"resize\"}))}function m(n,t,e){var r,u,a=Bu(t),c=a[0],l=a[1],f=q[e],g=e?h:s,v=g[1]-g[0];return N&&(c-=f,l-=v+f),r=(e?d:p)?Math.max(c,Math.min(l,n[e])):n[e],N?u=(r+=f)+v:(M&&(f=Math.max(c,Math.min(l,2*M[e]-r))),r>f?(u=r,r=f):u=f),g[0]!=r||g[1]!=u?(e?o=null:i=null,g[0]=r,g[1]=u,!0):void 0}function y(){v(),S.style(\"pointer-events\",\"all\").selectAll(\".resize\").style(\"display\",n.empty()?\"none\":null),mo.select(\"body\").style(\"cursor\",null),z.on(\"mousemove.brush\",null).on(\"mouseup.brush\",null).on(\"touchmove.brush\",null).on(\"touchend.brush\",null).on(\"keydown.brush\",null).on(\"keyup.brush\",null),T(),w({type:\"brushend\"})}var M,x,b=this,_=mo.select(mo.event.target),w=a.of(b,arguments),S=mo.select(b),E=_.datum(),k=!/^(n|s)$/.test(E)&&c,A=!/^(e|w)$/.test(E)&&l,N=_.classed(\"extent\"),T=L(),q=mo.mouse(b),z=mo.select(_o).on(\"keydown.brush\",u).on(\"keyup.brush\",g);if(mo.event.changedTouches?z.on(\"touchmove.brush\",v).on(\"touchend.brush\",y):z.on(\"mousemove.brush\",v).on(\"mouseup.brush\",y),S.interrupt().selectAll(\"*\").interrupt(),N)q[0]=s[0]-q[0],q[1]=h[0]-q[1];else if(E){var C=+/w$/.test(E),D=+/^n/.test(E);x=[s[1-C]-q[0],h[1-D]-q[1]],q[0]=s[C],q[1]=h[D]}else mo.event.altKey&&(M=q.slice());S.style(\"pointer-events\",\"none\").selectAll(\".resize\").style(\"display\",null),mo.select(\"body\").style(\"cursor\",_.style(\"cursor\")),w({type:\"brushstart\"}),v()}var i,o,a=g(n,\"brushstart\",\"brush\",\"brushend\"),c=null,l=null,s=[0,0],h=[0,0],p=!0,d=!0,v=Bc[0];return n.event=function(n){n.each(function(){var n=a.of(this,arguments),t={x:s,y:h,i:i,j:o},e=this.__chart__||t;this.__chart__=t,Oc?mo.select(this).transition().each(\"start.brush\",function(){i=e.i,o=e.j,s=e.x,h=e.y,n({type:\"brushstart\"})}).tween(\"brush:brush\",function(){var e=kr(s,t.x),r=kr(h,t.y);return i=o=null,function(u){s=t.x=e(u),h=t.y=r(u),n({type:\"brush\",mode:\"resize\"})}}).each(\"end.brush\",function(){i=t.i,o=t.j,n({type:\"brush\",mode:\"resize\"}),n({type:\"brushend\"})}):(n({type:\"brushstart\"}),n({type:\"brush\",mode:\"resize\"}),n({type:\"brushend\"}))})},n.x=function(t){return arguments.length?(c=t,v=Bc[!c<<1|!l],n):c},n.y=function(t){return arguments.length?(l=t,v=Bc[!c<<1|!l],n):l},n.clamp=function(t){return arguments.length?(c&&l?(p=!!t[0],d=!!t[1]):c?p=!!t:l&&(d=!!t),n):c&&l?[p,d]:c?p:l?d:null},n.extent=function(t){var e,r,u,a,f;return arguments.length?(c&&(e=t[0],r=t[1],l&&(e=e[0],r=r[0]),i=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(f=e,e=r,r=f),(e!=s[0]||r!=s[1])&&(s=[e,r])),l&&(u=t[0],a=t[1],c&&(u=u[1],a=a[1]),o=[u,a],l.invert&&(u=l(u),a=l(a)),u>a&&(f=u,u=a,a=f),(u!=h[0]||a!=h[1])&&(h=[u,a])),n):(c&&(i?(e=i[0],r=i[1]):(e=s[0],r=s[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(f=e,e=r,r=f))),l&&(o?(u=o[0],a=o[1]):(u=h[0],a=h[1],l.invert&&(u=l.invert(u),a=l.invert(a)),u>a&&(f=u,u=a,a=f))),c&&l?[[e,u],[r,a]]:c?[e,r]:l&&[u,a])},n.clear=function(){return n.empty()||(s=[0,0],h=[0,0],i=o=null),n},n.empty=function(){return!!c&&s[0]==s[1]||!!l&&h[0]==h[1]},mo.rebind(n,a,\"on\")};var $c={n:\"ns-resize\",e:\"ew-resize\",s:\"ns-resize\",w:\"ew-resize\",nw:\"nwse-resize\",ne:\"nesw-resize\",se:\"nwse-resize\",sw:\"nesw-resize\"},Bc=[[\"n\",\"e\",\"s\",\"w\",\"nw\",\"ne\",\"se\",\"sw\"],[\"e\",\"w\"],[\"n\",\"s\"],[]],Wc=mo.time={},Jc=Date,Gc=[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"];zi.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){Kc.setUTCDate.apply(this._,arguments)},setDay:function(){Kc.setUTCDay.apply(this._,arguments)},setFullYear:function(){Kc.setUTCFullYear.apply(this._,arguments)},setHours:function(){Kc.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){Kc.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){Kc.setUTCMinutes.apply(this._,arguments)},setMonth:function(){Kc.setUTCMonth.apply(this._,arguments)},setSeconds:function(){Kc.setUTCSeconds.apply(this._,arguments)},setTime:function(){Kc.setTime.apply(this._,arguments)}};var Kc=Date.prototype,Qc=\"%a %b %e %X %Y\",nl=\"%m/%d/%Y\",tl=\"%H:%M:%S\",el=[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],rl=[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],ul=[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],il=[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"];Wc.year=Ci(function(n){return n=Wc.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),Wc.years=Wc.year.range,Wc.years.utc=Wc.year.utc.range,Wc.day=Ci(function(n){var t=new Jc(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),Wc.days=Wc.day.range,Wc.days.utc=Wc.day.utc.range,Wc.dayOfYear=function(n){var t=Wc.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},Gc.forEach(function(n,t){n=n.toLowerCase(),t=7-t;var e=Wc[n]=Ci(function(n){return(n=Wc.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=Wc.year(n).getDay();return Math.floor((Wc.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});Wc[n+\"s\"]=e.range,Wc[n+\"s\"].utc=e.utc.range,Wc[n+\"OfYear\"]=function(n){var e=Wc.year(n).getDay();return Math.floor((Wc.dayOfYear(n)+(e+t)%7)/7)}}),Wc.week=Wc.sunday,Wc.weeks=Wc.sunday.range,Wc.weeks.utc=Wc.sunday.utc.range,Wc.weekOfYear=Wc.sundayOfYear,Wc.format=ji;var ol=Hi(el),al=Fi(el),cl=Hi(rl),ll=Fi(rl),sl=Hi(ul),fl=Fi(ul),hl=Hi(il),gl=Fi(il),pl=/^%/,dl={\"-\":\"\",_:\" \",0:\"0\"},vl={a:function(n){return rl[n.getDay()]},A:function(n){return el[n.getDay()]},b:function(n){return il[n.getMonth()]},B:function(n){return ul[n.getMonth()]},c:ji(Qc),d:function(n,t){return Pi(n.getDate(),t,2)},e:function(n,t){return Pi(n.getDate(),t,2)},H:function(n,t){return Pi(n.getHours(),t,2)},I:function(n,t){return Pi(n.getHours()%12||12,t,2)},j:function(n,t){return Pi(1+Wc.dayOfYear(n),t,3)},L:function(n,t){return Pi(n.getMilliseconds(),t,3)},m:function(n,t){return Pi(n.getMonth()+1,t,2)},M:function(n,t){return Pi(n.getMinutes(),t,2)},p:function(n){return n.getHours()>=12?\"PM\":\"AM\"},S:function(n,t){return Pi(n.getSeconds(),t,2)},U:function(n,t){return Pi(Wc.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Pi(Wc.mondayOfYear(n),t,2)},x:ji(nl),X:ji(tl),y:function(n,t){return Pi(n.getFullYear()%100,t,2)},Y:function(n,t){return Pi(n.getFullYear()%1e4,t,4)},Z:ao,\"%\":function(){return\"%\"}},ml={a:Oi,A:Ri,b:Zi,B:Vi,c:Xi,d:no,e:no,H:eo,I:eo,j:to,L:io,m:Qi,M:ro,p:oo,S:uo,U:Ii,w:Yi,W:Ui,x:$i,X:Bi,y:Ji,Y:Wi,Z:Gi,\"%\":co},yl=/^\\s*\\d+/,Ml=mo.map({am:0,pm:1});ji.utc=lo;var xl=lo(\"%Y-%m-%dT%H:%M:%S.%LZ\");ji.iso=Date.prototype.toISOString&&+new Date(\"2000-01-01T00:00:00.000Z\")?so:xl,so.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},so.toString=xl.toString,Wc.second=Ci(function(n){return new Jc(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),Wc.seconds=Wc.second.range,Wc.seconds.utc=Wc.second.utc.range,Wc.minute=Ci(function(n){return new Jc(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),Wc.minutes=Wc.minute.range,Wc.minutes.utc=Wc.minute.utc.range,Wc.hour=Ci(function(n){var t=n.getTimezoneOffset()/60;return new Jc(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),Wc.hours=Wc.hour.range,Wc.hours.utc=Wc.hour.utc.range,Wc.month=Ci(function(n){return n=Wc.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),Wc.months=Wc.month.range,Wc.months.utc=Wc.month.utc.range;var bl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],_l=[[Wc.second,1],[Wc.second,5],[Wc.second,15],[Wc.second,30],[Wc.minute,1],[Wc.minute,5],[Wc.minute,15],[Wc.minute,30],[Wc.hour,1],[Wc.hour,3],[Wc.hour,6],[Wc.hour,12],[Wc.day,1],[Wc.day,2],[Wc.week,1],[Wc.month,1],[Wc.month,3],[Wc.year,1]],wl=[[ji(\"%Y\"),Vt],[ji(\"%B\"),function(n){return n.getMonth()}],[ji(\"%b %d\"),function(n){return 1!=n.getDate()}],[ji(\"%a %d\"),function(n){return n.getDay()&&1!=n.getDate()}],[ji(\"%I %p\"),function(n){return n.getHours()}],[ji(\"%I:%M\"),function(n){return n.getMinutes()}],[ji(\":%S\"),function(n){return n.getSeconds()}],[ji(\".%L\"),function(n){return n.getMilliseconds()}]],Sl=go(wl);_l.year=Wc.year,Wc.scale=function(){return fo(mo.scale.linear(),_l,Sl)};var El={range:function(n,t,e){return mo.range(+n,+t,e).map(ho)}},kl=_l.map(function(n){return[n[0].utc,n[1]]}),Al=[[lo(\"%Y\"),Vt],[lo(\"%B\"),function(n){return n.getUTCMonth()}],[lo(\"%b %d\"),function(n){return 1!=n.getUTCDate()}],[lo(\"%a %d\"),function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],[lo(\"%I %p\"),function(n){return n.getUTCHours()}],[lo(\"%I:%M\"),function(n){return n.getUTCMinutes()}],[lo(\":%S\"),function(n){return n.getUTCSeconds()}],[lo(\".%L\"),function(n){return n.getUTCMilliseconds()}]],Nl=go(Al);return kl.year=Wc.year.utc,Wc.scale.utc=function(){return fo(mo.scale.linear(),kl,Nl)},mo.text=vt(function(n){return n.responseText}),mo.json=function(n,t){return mt(n,\"application/json\",po,t)},mo.html=function(n,t){return mt(n,\"text/html\",vo,t)},mo.xml=vt(function(n){return n.responseXML}),mo}();\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/simditor/hotkeys.js",
    "content": "(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module.\n    define('simple-hotkeys', [\"jquery\",\n      \"simple-module\"], function ($, SimpleModule) {\n      return (root.returnExportsGlobal = factory($, SimpleModule));\n    });\n  } else if (typeof exports === 'object') {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like enviroments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"),\n      require(\"simple-module\"));\n  } else {\n    root.simple = root.simple || {};\n    root.simple['hotkeys'] = factory(jQuery,\n      SimpleModule);\n  }\n}(this, function ($, SimpleModule) {\n\nvar Hotkeys, hotkeys,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nHotkeys = (function(_super) {\n  __extends(Hotkeys, _super);\n\n  function Hotkeys() {\n    return Hotkeys.__super__.constructor.apply(this, arguments);\n  }\n\n  Hotkeys.count = 0;\n\n  Hotkeys.keyNameMap = {\n    8: \"Backspace\",\n    9: \"Tab\",\n    13: \"Enter\",\n    16: \"Shift\",\n    17: \"Control\",\n    18: \"Alt\",\n    19: \"Pause\",\n    20: \"CapsLock\",\n    27: \"Esc\",\n    32: \"Spacebar\",\n    33: \"PageUp\",\n    34: \"PageDown\",\n    35: \"End\",\n    36: \"Home\",\n    37: \"Left\",\n    38: \"Up\",\n    39: \"Right\",\n    40: \"Down\",\n    45: \"Insert\",\n    46: \"Del\",\n    91: \"Meta\",\n    93: \"Meta\",\n    48: \"0\",\n    49: \"1\",\n    50: \"2\",\n    51: \"3\",\n    52: \"4\",\n    53: \"5\",\n    54: \"6\",\n    55: \"7\",\n    56: \"8\",\n    57: \"9\",\n    65: \"A\",\n    66: \"B\",\n    67: \"C\",\n    68: \"D\",\n    69: \"E\",\n    70: \"F\",\n    71: \"G\",\n    72: \"H\",\n    73: \"I\",\n    74: \"J\",\n    75: \"K\",\n    76: \"L\",\n    77: \"M\",\n    78: \"N\",\n    79: \"O\",\n    80: \"P\",\n    81: \"Q\",\n    82: \"R\",\n    83: \"S\",\n    84: \"T\",\n    85: \"U\",\n    86: \"V\",\n    87: \"W\",\n    88: \"X\",\n    89: \"Y\",\n    90: \"Z\",\n    96: \"0\",\n    97: \"1\",\n    98: \"2\",\n    99: \"3\",\n    100: \"4\",\n    101: \"5\",\n    102: \"6\",\n    103: \"7\",\n    104: \"8\",\n    105: \"9\",\n    106: \"Multiply\",\n    107: \"Add\",\n    109: \"Subtract\",\n    110: \"Decimal\",\n    111: \"Divide\",\n    112: \"F1\",\n    113: \"F2\",\n    114: \"F3\",\n    115: \"F4\",\n    116: \"F5\",\n    117: \"F6\",\n    118: \"F7\",\n    119: \"F8\",\n    120: \"F9\",\n    121: \"F10\",\n    122: \"F11\",\n    123: \"F12\",\n    124: \"F13\",\n    125: \"F14\",\n    126: \"F15\",\n    127: \"F16\",\n    128: \"F17\",\n    129: \"F18\",\n    130: \"F19\",\n    131: \"F20\",\n    132: \"F21\",\n    133: \"F22\",\n    134: \"F23\",\n    135: \"F24\",\n    59: \";\",\n    61: \"=\",\n    186: \";\",\n    187: \"=\",\n    188: \",\",\n    190: \".\",\n    191: \"/\",\n    192: \"`\",\n    219: \"[\",\n    220: \"\\\\\",\n    221: \"]\",\n    222: \"'\"\n  };\n\n  Hotkeys.aliases = {\n    \"escape\": \"esc\",\n    \"delete\": \"del\",\n    \"return\": \"enter\",\n    \"ctrl\": \"control\",\n    \"space\": \"spacebar\",\n    \"ins\": \"insert\",\n    \"cmd\": \"meta\",\n    \"command\": \"meta\",\n    \"wins\": \"meta\",\n    \"windows\": \"meta\"\n  };\n\n  Hotkeys.normalize = function(shortcut) {\n    var i, key, keyname, keys, _i, _len;\n    keys = shortcut.toLowerCase().replace(/\\s+/gi, \"\").split(\"+\");\n    for (i = _i = 0, _len = keys.length; _i < _len; i = ++_i) {\n      key = keys[i];\n      keys[i] = this.aliases[key] || key;\n    }\n    keyname = keys.pop();\n    keys.sort().push(keyname);\n    return keys.join(\"_\");\n  };\n\n  Hotkeys.prototype.opts = {\n    el: document\n  };\n\n  Hotkeys.prototype._init = function() {\n    this.id = ++this.constructor.count;\n    this._map = {};\n    this._delegate = typeof this.opts.el === \"string\" ? document : this.opts.el;\n    return $(this._delegate).on(\"keydown.simple-hotkeys-\" + this.id, this.opts.el, (function(_this) {\n      return function(e) {\n        var _ref;\n        return (_ref = _this._getHander(e)) != null ? _ref.call(_this, e) : void 0;\n      };\n    })(this));\n  };\n\n  Hotkeys.prototype._getHander = function(e) {\n    var keyname, shortcut;\n    if (!(keyname = this.constructor.keyNameMap[e.which])) {\n      return;\n    }\n    shortcut = \"\";\n    if (e.altKey) {\n      shortcut += \"alt_\";\n    }\n    if (e.ctrlKey) {\n      shortcut += \"control_\";\n    }\n    if (e.metaKey) {\n      shortcut += \"meta_\";\n    }\n    if (e.shiftKey) {\n      shortcut += \"shift_\";\n    }\n    shortcut += keyname.toLowerCase();\n    return this._map[shortcut];\n  };\n\n  Hotkeys.prototype.respondTo = function(subject) {\n    if (typeof subject === 'string') {\n      return this._map[this.constructor.normalize(subject)] != null;\n    } else {\n      return this._getHander(subject) != null;\n    }\n  };\n\n  Hotkeys.prototype.add = function(shortcut, handler) {\n    this._map[this.constructor.normalize(shortcut)] = handler;\n    return this;\n  };\n\n  Hotkeys.prototype.remove = function(shortcut) {\n    delete this._map[this.constructor.normalize(shortcut)];\n    return this;\n  };\n\n  Hotkeys.prototype.destroy = function() {\n    $(this._delegate).off(\".simple-hotkeys-\" + this.id);\n    this._map = {};\n    return this;\n  };\n\n  return Hotkeys;\n\n})(SimpleModule);\n\nhotkeys = function(opts) {\n  return new Hotkeys(opts);\n};\n\n\nreturn hotkeys;\n\n\n}));\n\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/simditor/module.js",
    "content": "(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module.\n    define('simple-module', [\"jquery\"], function ($) {\n      return (root.returnExportsGlobal = factory($));\n    });\n  } else if (typeof exports === 'object') {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like enviroments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    root['SimpleModule'] = factory(jQuery);\n  }\n}(this, function ($) {\n\nvar Module,\n  __slice = [].slice;\n\nModule = (function() {\n  Module.extend = function(obj) {\n    var key, val, _ref;\n    if (!((obj != null) && typeof obj === 'object')) {\n      return;\n    }\n    for (key in obj) {\n      val = obj[key];\n      if (key !== 'included' && key !== 'extended') {\n        this[key] = val;\n      }\n    }\n    return (_ref = obj.extended) != null ? _ref.call(this) : void 0;\n  };\n\n  Module.include = function(obj) {\n    var key, val, _ref;\n    if (!((obj != null) && typeof obj === 'object')) {\n      return;\n    }\n    for (key in obj) {\n      val = obj[key];\n      if (key !== 'included' && key !== 'extended') {\n        this.prototype[key] = val;\n      }\n    }\n    return (_ref = obj.included) != null ? _ref.call(this) : void 0;\n  };\n\n  Module.connect = function(cls) {\n    if (typeof cls !== 'function') {\n      return;\n    }\n    if (!cls.pluginName) {\n      throw new Error('Module.connect: cannot connect plugin without pluginName');\n      return;\n    }\n    cls.prototype._connected = true;\n    if (!this._connectedClasses) {\n      this._connectedClasses = [];\n    }\n    this._connectedClasses.push(cls);\n    if (cls.pluginName) {\n      return this[cls.pluginName] = cls;\n    }\n  };\n\n  Module.prototype.opts = {};\n\n  function Module(opts) {\n    var cls, instance, instances, name, _base, _i, _len;\n    this.opts = $.extend({}, this.opts, opts);\n    (_base = this.constructor)._connectedClasses || (_base._connectedClasses = []);\n    instances = (function() {\n      var _i, _len, _ref, _results;\n      _ref = this.constructor._connectedClasses;\n      _results = [];\n      for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n        cls = _ref[_i];\n        name = cls.pluginName.charAt(0).toLowerCase() + cls.pluginName.slice(1);\n        if (cls.prototype._connected) {\n          cls.prototype._module = this;\n        }\n        _results.push(this[name] = new cls());\n      }\n      return _results;\n    }).call(this);\n    if (this._connected) {\n      this.opts = $.extend({}, this.opts, this._module.opts);\n    } else {\n      this._init();\n      for (_i = 0, _len = instances.length; _i < _len; _i++) {\n        instance = instances[_i];\n        if (typeof instance._init === \"function\") {\n          instance._init();\n        }\n      }\n    }\n    this.trigger('initialized');\n  }\n\n  Module.prototype._init = function() {};\n\n  Module.prototype.on = function() {\n    var args, _ref;\n    args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n    (_ref = $(this)).on.apply(_ref, args);\n    return this;\n  };\n\n  Module.prototype.one = function() {\n    var args, _ref;\n    args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n    (_ref = $(this)).one.apply(_ref, args);\n    return this;\n  };\n\n  Module.prototype.off = function() {\n    var args, _ref;\n    args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n    (_ref = $(this)).off.apply(_ref, args);\n    return this;\n  };\n\n  Module.prototype.trigger = function() {\n    var args, _ref;\n    args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n    (_ref = $(this)).trigger.apply(_ref, args);\n    return this;\n  };\n\n  Module.prototype.triggerHandler = function() {\n    var args, _ref;\n    args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n    return (_ref = $(this)).triggerHandler.apply(_ref, args);\n  };\n\n  Module.prototype._t = function() {\n    var args, _ref;\n    args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n    return (_ref = this.constructor)._t.apply(_ref, args);\n  };\n\n  Module._t = function() {\n    var args, key, result, _ref;\n    key = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n    result = ((_ref = this.i18n[this.locale]) != null ? _ref[key] : void 0) || '';\n    if (!(args.length > 0)) {\n      return result;\n    }\n    result = result.replace(/([^%]|^)%(?:(\\d+)\\$)?s/g, function(p0, p, position) {\n      if (position) {\n        return p + args[parseInt(position) - 1];\n      } else {\n        return p + args.shift();\n      }\n    });\n    return result.replace(/%%s/g, '%s');\n  };\n\n  Module.i18n = {\n    'zh-CN': {}\n  };\n\n  Module.locale = 'zh-CN';\n\n  return Module;\n\n})();\n\n\nreturn Module;\n\n\n}));\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/simditor/simditor.js",
    "content": "(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module.\n    define('simditor', [\"jquery\",\n      \"simple-module\",\n      \"simple-hotkeys\",\n      \"simple-uploader\"], function ($, SimpleModule, simpleHotkeys, simpleUploader) {\n      return (root.returnExportsGlobal = factory($, SimpleModule, simpleHotkeys, simpleUploader));\n    });\n  } else if (typeof exports === 'object') {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like enviroments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"),\n      require(\"simple-module\"),\n      require(\"simple-hotkeys\"),\n      require(\"simple-uploader\"));\n  } else {\n    root['Simditor'] = factory(jQuery,\n      SimpleModule,\n      simple.hotkeys,\n      simple.uploader);\n  }\n}(this, function ($, SimpleModule, simpleHotkeys, simpleUploader) {\n\nvar Selection,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nSelection = (function(_super) {\n  __extends(Selection, _super);\n\n  function Selection() {\n    return Selection.__super__.constructor.apply(this, arguments);\n  }\n\n  Selection.pluginName = 'Selection';\n\n  Selection.prototype._init = function() {\n    this.editor = this._module;\n    return this.sel = document.getSelection();\n  };\n\n  Selection.prototype.clear = function() {\n    var e;\n    try {\n      return this.sel.removeAllRanges();\n    } catch (_error) {\n      e = _error;\n    }\n  };\n\n  Selection.prototype.getRange = function() {\n    if (!this.editor.inputManager.focused || !this.sel.rangeCount) {\n      return null;\n    }\n    return this.sel.getRangeAt(0);\n  };\n\n  Selection.prototype.selectRange = function(range) {\n    this.clear();\n    this.sel.addRange(range);\n    if (!this.editor.inputManager.focused && (this.editor.util.browser.firefox || this.editor.util.browser.msie)) {\n      this.editor.body.focus();\n    }\n    return range;\n  };\n\n  Selection.prototype.rangeAtEndOf = function(node, range) {\n    var endNode, endNodeLength, result;\n    if (range == null) {\n      range = this.getRange();\n    }\n    if (!((range != null) && range.collapsed)) {\n      return;\n    }\n    node = $(node)[0];\n    endNode = range.endContainer;\n    endNodeLength = this.editor.util.getNodeLength(endNode);\n    if (!(range.endOffset === endNodeLength - 1 && $(endNode).contents().last().is('br')) && range.endOffset !== endNodeLength) {\n      return false;\n    }\n    if (node === endNode) {\n      return true;\n    } else if (!$.contains(node, endNode)) {\n      return false;\n    }\n    result = true;\n    $(endNode).parentsUntil(node).addBack().each((function(_this) {\n      return function(i, n) {\n        var $lastChild, nodes;\n        nodes = $(n).parent().contents().filter(function() {\n          return !(this !== n && this.nodeType === 3 && !this.nodeValue);\n        });\n        $lastChild = nodes.last();\n        if (!($lastChild.get(0) === n || ($lastChild.is('br') && $lastChild.prev().get(0) === n))) {\n          result = false;\n          return false;\n        }\n      };\n    })(this));\n    return result;\n  };\n\n  Selection.prototype.rangeAtStartOf = function(node, range) {\n    var result, startNode;\n    if (range == null) {\n      range = this.getRange();\n    }\n    if (!((range != null) && range.collapsed)) {\n      return;\n    }\n    node = $(node)[0];\n    startNode = range.startContainer;\n    if (range.startOffset !== 0) {\n      return false;\n    }\n    if (node === startNode) {\n      return true;\n    } else if (!$.contains(node, startNode)) {\n      return false;\n    }\n    result = true;\n    $(startNode).parentsUntil(node).addBack().each((function(_this) {\n      return function(i, n) {\n        var nodes;\n        nodes = $(n).parent().contents().filter(function() {\n          return !(this !== n && this.nodeType === 3 && !this.nodeValue);\n        });\n        if (nodes.first().get(0) !== n) {\n          return result = false;\n        }\n      };\n    })(this));\n    return result;\n  };\n\n  Selection.prototype.insertNode = function(node, range) {\n    if (range == null) {\n      range = this.getRange();\n    }\n    if (range == null) {\n      return;\n    }\n    node = $(node)[0];\n    range.insertNode(node);\n    return this.setRangeAfter(node, range);\n  };\n\n  Selection.prototype.setRangeAfter = function(node, range) {\n    if (range == null) {\n      range = this.getRange();\n    }\n    if (range == null) {\n      return;\n    }\n    node = $(node)[0];\n    range.setEndAfter(node);\n    range.collapse(false);\n    return this.selectRange(range);\n  };\n\n  Selection.prototype.setRangeBefore = function(node, range) {\n    if (range == null) {\n      range = this.getRange();\n    }\n    if (range == null) {\n      return;\n    }\n    node = $(node)[0];\n    range.setEndBefore(node);\n    range.collapse(false);\n    return this.selectRange(range);\n  };\n\n  Selection.prototype.setRangeAtStartOf = function(node, range) {\n    if (range == null) {\n      range = this.getRange();\n    }\n    node = $(node).get(0);\n    range.setEnd(node, 0);\n    range.collapse(false);\n    return this.selectRange(range);\n  };\n\n  Selection.prototype.setRangeAtEndOf = function(node, range) {\n    var $lastNode, $node, contents, lastChild, lastText, nodeLength;\n    if (range == null) {\n      range = this.getRange();\n    }\n    $node = $(node);\n    node = $node.get(0);\n    if ($node.is('pre')) {\n      contents = $node.contents();\n      if (contents.length > 0) {\n        lastChild = contents.last();\n        lastText = lastChild.text();\n        if (lastText.charAt(lastText.length - 1) === '\\n') {\n          range.setEnd(lastChild[0], this.editor.util.getNodeLength(lastChild[0]) - 1);\n        } else {\n          range.setEnd(lastChild[0], this.editor.util.getNodeLength(lastChild[0]));\n        }\n      } else {\n        range.setEnd(node, 0);\n      }\n    } else {\n      nodeLength = this.editor.util.getNodeLength(node);\n      if (node.nodeType !== 3 && nodeLength > 0) {\n        $lastNode = $(node).contents().last();\n        if ($lastNode.is('br')) {\n          nodeLength -= 1;\n        } else if ($lastNode[0].nodeType !== 3 && this.editor.util.isEmptyNode($lastNode)) {\n          $lastNode.append(this.editor.util.phBr);\n          node = $lastNode[0];\n          nodeLength = 0;\n        }\n      }\n      range.setEnd(node, nodeLength);\n    }\n    range.collapse(false);\n    return this.selectRange(range);\n  };\n\n  Selection.prototype.deleteRangeContents = function(range) {\n    var endRange, startRange;\n    if (range == null) {\n      range = this.getRange();\n    }\n    startRange = range.cloneRange();\n    endRange = range.cloneRange();\n    startRange.collapse(true);\n    endRange.collapse(false);\n    if (!range.collapsed && this.rangeAtStartOf(this.editor.body, startRange) && this.rangeAtEndOf(this.editor.body, endRange)) {\n      this.editor.body.empty();\n      range.setStart(this.editor.body[0], 0);\n      range.collapse(true);\n      this.selectRange(range);\n    } else {\n      range.deleteContents();\n    }\n    return range;\n  };\n\n  Selection.prototype.breakBlockEl = function(el, range) {\n    var $el;\n    if (range == null) {\n      range = this.getRange();\n    }\n    $el = $(el);\n    if (!range.collapsed) {\n      return $el;\n    }\n    range.setStartBefore($el.get(0));\n    if (range.collapsed) {\n      return $el;\n    }\n    return $el.before(range.extractContents());\n  };\n\n  Selection.prototype.save = function(range) {\n    var endCaret, endRange, startCaret;\n    if (range == null) {\n      range = this.getRange();\n    }\n    if (this._selectionSaved) {\n      return;\n    }\n    endRange = range.cloneRange();\n    endRange.collapse(false);\n    startCaret = $('<span/>').addClass('simditor-caret-start');\n    endCaret = $('<span/>').addClass('simditor-caret-end');\n    endRange.insertNode(endCaret[0]);\n    range.insertNode(startCaret[0]);\n    this.clear();\n    return this._selectionSaved = true;\n  };\n\n  Selection.prototype.restore = function() {\n    var endCaret, endContainer, endOffset, range, startCaret, startContainer, startOffset;\n    if (!this._selectionSaved) {\n      return false;\n    }\n    startCaret = this.editor.body.find('.simditor-caret-start');\n    endCaret = this.editor.body.find('.simditor-caret-end');\n    if (startCaret.length && endCaret.length) {\n      startContainer = startCaret.parent();\n      startOffset = startContainer.contents().index(startCaret);\n      endContainer = endCaret.parent();\n      endOffset = endContainer.contents().index(endCaret);\n      if (startContainer[0] === endContainer[0]) {\n        endOffset -= 1;\n      }\n      range = document.createRange();\n      range.setStart(startContainer.get(0), startOffset);\n      range.setEnd(endContainer.get(0), endOffset);\n      startCaret.remove();\n      endCaret.remove();\n      this.selectRange(range);\n    } else {\n      startCaret.remove();\n      endCaret.remove();\n    }\n    this._selectionSaved = false;\n    return range;\n  };\n\n  return Selection;\n\n})(SimpleModule);\n\nvar Formatter,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\nFormatter = (function(_super) {\n  __extends(Formatter, _super);\n\n  function Formatter() {\n    return Formatter.__super__.constructor.apply(this, arguments);\n  }\n\n  Formatter.pluginName = 'Formatter';\n\n  Formatter.prototype._init = function() {\n    this.editor = this._module;\n    this._allowedTags = ['br', 'a', 'img', 'b', 'strong', 'i', 'u', 'font', 'p', 'ul', 'ol', 'li', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'hr'];\n    this._allowedAttributes = {\n      img: ['src', 'alt', 'width', 'height', 'data-image-src', 'data-image-size', 'data-image-name', 'data-non-image'],\n      a: ['href', 'target'],\n      font: ['color'],\n      pre: ['data-lang', 'class'],\n      p: ['data-indent'],\n      h1: ['data-indent'],\n      h2: ['data-indent'],\n      h3: ['data-indent'],\n      h4: ['data-indent']\n    };\n    return this.editor.body.on('click', 'a', (function(_this) {\n      return function(e) {\n        return false;\n      };\n    })(this));\n  };\n\n  Formatter.prototype.decorate = function($el) {\n    if ($el == null) {\n      $el = this.editor.body;\n    }\n    return this.editor.trigger('decorate', [$el]);\n  };\n\n  Formatter.prototype.undecorate = function($el) {\n    if ($el == null) {\n      $el = this.editor.body.clone();\n    }\n    this.editor.trigger('undecorate', [$el]);\n    return $.trim($el.html());\n  };\n\n  Formatter.prototype.autolink = function($el) {\n    var $node, findLinkNode, lastIndex, linkNodes, match, re, replaceEls, text, uri, _i, _len;\n    if ($el == null) {\n      $el = this.editor.body;\n    }\n    linkNodes = [];\n    findLinkNode = function($parentNode) {\n      return $parentNode.contents().each(function(i, node) {\n        var $node, text;\n        $node = $(node);\n        if ($node.is('a') || $node.closest('a, pre', $el).length) {\n          return;\n        }\n        if ($node.contents().length) {\n          return findLinkNode($node);\n        } else if ((text = $node.text()) && /https?:\\/\\/|www\\./ig.test(text)) {\n          return linkNodes.push($node);\n        }\n      });\n    };\n    findLinkNode($el);\n    re = /(https?:\\/\\/|www\\.)[\\w\\-\\.\\?&=\\/#%:,@\\!\\+]+/ig;\n    for (_i = 0, _len = linkNodes.length; _i < _len; _i++) {\n      $node = linkNodes[_i];\n      text = $node.text();\n      replaceEls = [];\n      match = null;\n      lastIndex = 0;\n      while ((match = re.exec(text)) !== null) {\n        replaceEls.push(document.createTextNode(text.substring(lastIndex, match.index)));\n        lastIndex = re.lastIndex;\n        uri = /^(http(s)?:\\/\\/|\\/)/.test(match[0]) ? match[0] : 'http://' + match[0];\n        replaceEls.push($('<a href=\"' + uri + '\" rel=\"nofollow\"></a>').text(match[0])[0]);\n      }\n      replaceEls.push(document.createTextNode(text.substring(lastIndex)));\n      $node.replaceWith($(replaceEls));\n    }\n    return $el;\n  };\n\n  Formatter.prototype.format = function($el) {\n    var $node, blockNode, n, node, _i, _j, _len, _len1, _ref, _ref1;\n    if ($el == null) {\n      $el = this.editor.body;\n    }\n    if ($el.is(':empty')) {\n      $el.append('<p>' + this.editor.util.phBr + '</p>');\n      return $el;\n    }\n    _ref = $el.contents();\n    for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n      n = _ref[_i];\n      this.cleanNode(n, true);\n    }\n    _ref1 = $el.contents();\n    for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {\n      node = _ref1[_j];\n      $node = $(node);\n      if ($node.is('br')) {\n        if (typeof blockNode !== \"undefined\" && blockNode !== null) {\n          blockNode = null;\n        }\n        $node.remove();\n      } else if (this.editor.util.isBlockNode(node)) {\n        if ($node.is('li')) {\n          if (blockNode && blockNode.is('ul, ol')) {\n            blockNode.append(node);\n          } else {\n            blockNode = $('<ul/>').insertBefore(node);\n            blockNode.append(node);\n          }\n        } else {\n          blockNode = null;\n        }\n      } else {\n        if (!blockNode || blockNode.is('ul, ol')) {\n          blockNode = $('<p/>').insertBefore(node);\n        }\n        blockNode.append(node);\n      }\n    }\n    return $el;\n  };\n\n  Formatter.prototype.cleanNode = function(node, recursive) {\n    var $childImg, $node, $p, $td, allowedAttributes, attr, contents, isDecoration, n, text, textNode, _i, _j, _len, _len1, _ref, _ref1;\n    $node = $(node);\n    if (!($node.length > 0)) {\n      return;\n    }\n    if ($node[0].nodeType === 3) {\n      text = $node.text().replace(/(\\r\\n|\\n|\\r)/gm, '');\n      if (text) {\n        textNode = document.createTextNode(text);\n        $node.replaceWith(textNode);\n      } else {\n        $node.remove();\n      }\n      return;\n    }\n    contents = $node.contents();\n    isDecoration = $node.is('[class^=\"simditor-\"]');\n    if ($node.is(this._allowedTags.join(',')) || isDecoration) {\n      if ($node.is('a') && ($childImg = $node.find('img')).length > 0) {\n        $node.replaceWith($childImg);\n        $node = $childImg;\n        contents = null;\n      }\n      if ($node.is('img') && $node.hasClass('uploading')) {\n        $node.remove();\n      }\n      if (!isDecoration) {\n        allowedAttributes = this._allowedAttributes[$node[0].tagName.toLowerCase()];\n        _ref = $.makeArray($node[0].attributes);\n        for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n          attr = _ref[_i];\n          if (!((allowedAttributes != null) && (_ref1 = attr.name, __indexOf.call(allowedAttributes, _ref1) >= 0))) {\n            $node.removeAttr(attr.name);\n          }\n        }\n      }\n    } else if ($node[0].nodeType === 1 && !$node.is(':empty')) {\n      if ($node.is('div, article, dl, header, footer, tr')) {\n        $node.append('<br/>');\n        contents.first().unwrap();\n      } else if ($node.is('table')) {\n        $p = $('<p/>');\n        $node.find('tr').each((function(_this) {\n          return function(i, tr) {\n            return $p.append($(tr).text() + '<br/>');\n          };\n        })(this));\n        $node.replaceWith($p);\n        contents = null;\n      } else if ($node.is('thead, tfoot')) {\n        $node.remove();\n        contents = null;\n      } else if ($node.is('th')) {\n        $td = $('<td/>').append($node.contents());\n        $node.replaceWith($td);\n      } else {\n        contents.first().unwrap();\n      }\n    } else {\n      $node.remove();\n      contents = null;\n    }\n    if (recursive && (contents != null) && !$node.is('pre')) {\n      for (_j = 0, _len1 = contents.length; _j < _len1; _j++) {\n        n = contents[_j];\n        this.cleanNode(n, true);\n      }\n    }\n    return null;\n  };\n\n  Formatter.prototype.clearHtml = function(html, lineBreak) {\n    var container, contents, result;\n    if (lineBreak == null) {\n      lineBreak = true;\n    }\n    container = $('<div/>').append(html);\n    contents = container.contents();\n    result = '';\n    contents.each((function(_this) {\n      return function(i, node) {\n        var $node, children;\n        if (node.nodeType === 3) {\n          return result += node.nodeValue;\n        } else if (node.nodeType === 1) {\n          $node = $(node);\n          children = $node.contents();\n          if (children.length > 0) {\n            result += _this.clearHtml(children);\n          }\n          if (lineBreak && i < contents.length - 1 && $node.is('br, p, div, li, tr, pre, address, artticle, aside, dl, figcaption, footer, h1, h2, h3, h4, header')) {\n            return result += '\\n';\n          }\n        }\n      };\n    })(this));\n    return result;\n  };\n\n  Formatter.prototype.beautify = function($contents) {\n    var uselessP;\n    uselessP = function($el) {\n      return !!($el.is('p') && !$el.text() && $el.children(':not(br)').length < 1);\n    };\n    return $contents.each((function(_this) {\n      return function(i, el) {\n        var $el;\n        $el = $(el);\n        if ($el.is(':not(img, br, col, td, hr, [class^=\"simditor-\"]):empty')) {\n          $el.remove();\n        }\n        if (uselessP($el)) {\n          $el.remove();\n        }\n        return $el.find(':not(img, br, col, td, hr, [class^=\"simditor-\"]):empty').remove();\n      };\n    })(this));\n  };\n\n  return Formatter;\n\n})(SimpleModule);\n\nvar InputManager,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\nInputManager = (function(_super) {\n  __extends(InputManager, _super);\n\n  function InputManager() {\n    return InputManager.__super__.constructor.apply(this, arguments);\n  }\n\n  InputManager.pluginName = 'InputManager';\n\n  InputManager.prototype.opts = {\n    pasteImage: false\n  };\n\n  InputManager.prototype._modifierKeys = [16, 17, 18, 91, 93, 224];\n\n  InputManager.prototype._arrowKeys = [37, 38, 39, 40];\n\n  InputManager.prototype._init = function() {\n    var submitKey;\n    this.editor = this._module;\n    if (this.opts.pasteImage && typeof this.opts.pasteImage !== 'string') {\n      this.opts.pasteImage = 'inline';\n    }\n    this._keystrokeHandlers = {};\n    this.hotkeys = simpleHotkeys({\n      el: this.editor.body\n    });\n    this._pasteArea = $('<div/>').css({\n      width: '1px',\n      height: '1px',\n      overflow: 'hidden',\n      position: 'fixed',\n      right: '0',\n      bottom: '100px'\n    }).attr({\n      tabIndex: '-1',\n      contentEditable: true\n    }).addClass('simditor-paste-area').appendTo(this.editor.el);\n    this._cleanPasteArea = $('<textarea/>').css({\n      width: '1px',\n      height: '1px',\n      overflow: 'hidden',\n      position: 'fixed',\n      right: '0',\n      bottom: '101px'\n    }).attr({\n      tabIndex: '-1'\n    }).addClass('simditor-clean-paste-area').appendTo(this.editor.el);\n    $(document).on('selectionchange.simditor' + this.editor.id, (function(_this) {\n      return function(e) {\n        if (!_this.focused) {\n          return;\n        }\n        if (_this._selectionTimer) {\n          clearTimeout(_this._selectionTimer);\n          _this._selectionTimer = null;\n        }\n        return _this._selectionTimer = setTimeout(function() {\n          return _this.editor.trigger('selectionchanged');\n        }, 20);\n      };\n    })(this));\n    this.editor.on('valuechanged', (function(_this) {\n      return function() {\n        if (!_this.editor.util.closestBlockEl() && _this.focused) {\n          _this.editor.selection.save();\n          _this.editor.formatter.format();\n          _this.editor.selection.restore();\n        }\n        _this.editor.body.find('hr, pre, .simditor-table').each(function(i, el) {\n          var $el, formatted;\n          $el = $(el);\n          if ($el.parent().is('blockquote') || $el.parent()[0] === _this.editor.body[0]) {\n            formatted = false;\n            if ($el.next().length === 0) {\n              $('<p/>').append(_this.editor.util.phBr).insertAfter($el);\n              formatted = true;\n            }\n            if ($el.prev().length === 0) {\n              $('<p/>').append(_this.editor.util.phBr).insertBefore($el);\n              formatted = true;\n            }\n            if (formatted) {\n              return setTimeout(function() {\n                return _this.editor.trigger('valuechanged');\n              }, 10);\n            }\n          }\n        });\n        _this.editor.body.find('pre:empty').append(_this.editor.util.phBr);\n        if (!_this.editor.util.supportSelectionChange && _this.focused) {\n          return _this.editor.trigger('selectionchanged');\n        }\n      };\n    })(this));\n    this.editor.on('selectionchanged', (function(_this) {\n      return function(e) {\n        return _this.editor.undoManager.update();\n      };\n    })(this));\n    this.editor.body.on('keydown', $.proxy(this._onKeyDown, this)).on('keypress', $.proxy(this._onKeyPress, this)).on('keyup', $.proxy(this._onKeyUp, this)).on('mouseup', $.proxy(this._onMouseUp, this)).on('focus', $.proxy(this._onFocus, this)).on('blur', $.proxy(this._onBlur, this)).on('paste', $.proxy(this._onPaste, this)).on('drop', $.proxy(this._onDrop, this));\n    if (this.editor.util.browser.firefox) {\n      this.addShortcut('cmd+left', (function(_this) {\n        return function(e) {\n          e.preventDefault();\n          _this.editor.selection.sel.modify('move', 'backward', 'lineboundary');\n          return false;\n        };\n      })(this));\n      this.addShortcut('cmd+right', (function(_this) {\n        return function(e) {\n          e.preventDefault();\n          _this.editor.selection.sel.modify('move', 'forward', 'lineboundary');\n          return false;\n        };\n      })(this));\n      this.addShortcut('cmd+a', (function(_this) {\n        return function(e) {\n          var $children, firstBlock, lastBlock, range;\n          $children = _this.editor.body.children();\n          if (!($children.length > 0)) {\n            return;\n          }\n          firstBlock = $children.first().get(0);\n          lastBlock = $children.last().get(0);\n          range = document.createRange();\n          range.setStart(firstBlock, 0);\n          range.setEnd(lastBlock, _this.editor.util.getNodeLength(lastBlock));\n          _this.editor.selection.selectRange(range);\n          return false;\n        };\n      })(this));\n    }\n    submitKey = this.editor.util.os.mac ? 'cmd+enter' : 'ctrl+enter';\n    this.addShortcut(submitKey, (function(_this) {\n      return function(e) {\n        _this.editor.el.closest('form').find('button:submit').click();\n        return false;\n      };\n    })(this));\n    if (this.editor.textarea.attr('autofocus')) {\n      return setTimeout((function(_this) {\n        return function() {\n          return _this.editor.focus();\n        };\n      })(this), 0);\n    }\n  };\n\n  InputManager.prototype._onFocus = function(e) {\n    this.editor.el.addClass('focus').removeClass('error');\n    this.focused = true;\n    this.lastCaretPosition = null;\n    return setTimeout((function(_this) {\n      return function() {\n        _this.editor.triggerHandler('focus');\n        return _this.editor.trigger('selectionchanged');\n      };\n    })(this), 0);\n  };\n\n  InputManager.prototype._onBlur = function(e) {\n    var _ref;\n    this.editor.el.removeClass('focus');\n    this.editor.sync();\n    this.focused = false;\n    this.lastCaretPosition = (_ref = this.editor.undoManager.currentState()) != null ? _ref.caret : void 0;\n    return this.editor.triggerHandler('blur');\n  };\n\n  InputManager.prototype._onMouseUp = function(e) {\n    if (!this.editor.util.supportSelectionChange) {\n      return setTimeout((function(_this) {\n        return function() {\n          return _this.editor.trigger('selectionchanged');\n        };\n      })(this), 0);\n    }\n  };\n\n  InputManager.prototype._onKeyDown = function(e) {\n    var $blockEl, metaKey, result, _base, _ref, _ref1;\n    if (this.editor.triggerHandler(e) === false) {\n      return false;\n    }\n    if (this.hotkeys.respondTo(e)) {\n      return;\n    }\n    if (e.which in this._keystrokeHandlers) {\n      result = typeof (_base = this._keystrokeHandlers[e.which])['*'] === \"function\" ? _base['*'](e) : void 0;\n      if (result) {\n        this.editor.trigger('valuechanged');\n        return false;\n      }\n      this.editor.util.traverseUp((function(_this) {\n        return function(node) {\n          var handler, _ref;\n          if (node.nodeType !== 1) {\n            return;\n          }\n          handler = (_ref = _this._keystrokeHandlers[e.which]) != null ? _ref[node.tagName.toLowerCase()] : void 0;\n          result = typeof handler === \"function\" ? handler(e, $(node)) : void 0;\n          if (result === true || result === false) {\n            return false;\n          }\n        };\n      })(this));\n      if (result) {\n        this.editor.trigger('valuechanged');\n        return false;\n      }\n    }\n    if ((_ref = e.which, __indexOf.call(this._modifierKeys, _ref) >= 0) || (_ref1 = e.which, __indexOf.call(this._arrowKeys, _ref1) >= 0)) {\n      return;\n    }\n    metaKey = this.editor.util.metaKey(e);\n    $blockEl = this.editor.util.closestBlockEl();\n    if (metaKey && e.which === 86) {\n      return;\n    }\n    if (this.editor.util.browser.webkit && e.which === 8 && this.editor.selection.rangeAtStartOf($blockEl)) {\n      setTimeout((function(_this) {\n        return function() {\n          var $newBlockEl;\n          if (!_this.focused) {\n            return;\n          }\n          $newBlockEl = _this.editor.util.closestBlockEl();\n          _this.editor.selection.save();\n          _this.editor.formatter.cleanNode($newBlockEl, true);\n          _this.editor.selection.restore();\n          return _this.editor.trigger('valuechanged');\n        };\n      })(this), 10);\n      this.typing = true;\n    } else if (this._typing) {\n      if (this._typing !== true) {\n        clearTimeout(this._typing);\n      }\n      this._typing = setTimeout((function(_this) {\n        return function() {\n          _this.editor.trigger('valuechanged');\n          return _this._typing = false;\n        };\n      })(this), 200);\n    } else {\n      setTimeout((function(_this) {\n        return function() {\n          return _this.editor.trigger('valuechanged');\n        };\n      })(this), 10);\n      this._typing = true;\n    }\n    return null;\n  };\n\n  InputManager.prototype._onKeyPress = function(e) {\n    if (this.editor.triggerHandler(e) === false) {\n      return false;\n    }\n  };\n\n  InputManager.prototype._onKeyUp = function(e) {\n    var p, _ref;\n    if (this.editor.triggerHandler(e) === false) {\n      return false;\n    }\n    if (!this.editor.util.supportSelectionChange && (_ref = e.which, __indexOf.call(this._arrowKeys, _ref) >= 0)) {\n      this.editor.trigger('selectionchanged');\n      return;\n    }\n    if ((e.which === 8 || e.which === 46) && this.editor.util.isEmptyNode(this.editor.body)) {\n      this.editor.body.empty();\n      p = $('<p/>').append(this.editor.util.phBr).appendTo(this.editor.body);\n      this.editor.selection.setRangeAtStartOf(p);\n    }\n  };\n\n  InputManager.prototype._onPaste = function(e) {\n    var $blockEl, cleanPaste, imageFile, pasteItem, range, uploadOpt, _ref;\n    if (this.editor.triggerHandler(e) === false) {\n      return false;\n    }\n    range = this.editor.selection.deleteRangeContents();\n    if (!range.collapsed) {\n      range.collapse(true);\n    }\n    $blockEl = this.editor.util.closestBlockEl();\n    cleanPaste = $blockEl.is('pre, table');\n    if (e.originalEvent.clipboardData && e.originalEvent.clipboardData.items && e.originalEvent.clipboardData.items.length > 0) {\n      pasteItem = e.originalEvent.clipboardData.items[0];\n      if (/^image\\//.test(pasteItem.type) && !cleanPaste) {\n        imageFile = pasteItem.getAsFile();\n        if (!((imageFile != null) && this.opts.pasteImage)) {\n          return;\n        }\n        if (!imageFile.name) {\n          imageFile.name = \"Clipboard Image.png\";\n        }\n        uploadOpt = {};\n        uploadOpt[this.opts.pasteImage] = true;\n        if ((_ref = this.editor.uploader) != null) {\n          _ref.upload(imageFile, uploadOpt);\n        }\n        return false;\n      }\n    }\n    this.editor.selection.save(range);\n    if (cleanPaste) {\n      this._cleanPasteArea.focus();\n      if (this.editor.util.browser.firefox) {\n        e.preventDefault();\n        this._cleanPasteArea.val(e.originalEvent.clipboardData.getData('text/plain'));\n      } else if (this.editor.util.browser.msie && this.editor.util.browser.version === 10) {\n        e.preventDefault();\n        this._cleanPasteArea.val(window.clipboardData.getData('Text'));\n      }\n    } else {\n      this._pasteArea.focus();\n      if (this.editor.util.browser.msie && this.editor.util.browser.version === 10) {\n        e.preventDefault();\n        this._pasteArea.html(window.clipboardData.getData('Text'));\n      }\n    }\n    return setTimeout((function(_this) {\n      return function() {\n        var $img, blob, children, insertPosition, lastLine, line, lines, node, pasteContent, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _ref1, _ref2, _ref3;\n        if (_this._pasteArea.is(':empty') && !_this._cleanPasteArea.val()) {\n          pasteContent = null;\n        } else if (cleanPaste) {\n          pasteContent = _this._cleanPasteArea.val();\n        } else {\n          pasteContent = $('<div/>').append(_this._pasteArea.contents());\n          pasteContent.find('table colgroup').remove();\n          _this.editor.formatter.format(pasteContent);\n          _this.editor.formatter.decorate(pasteContent);\n          _this.editor.formatter.beautify(pasteContent.children());\n          pasteContent = pasteContent.contents();\n        }\n        _this._pasteArea.empty();\n        _this._cleanPasteArea.val('');\n        range = _this.editor.selection.restore();\n        if (_this.editor.triggerHandler('pasting', [pasteContent]) === false) {\n          return;\n        }\n        if (!pasteContent) {\n          return;\n        } else if (cleanPaste) {\n          if ($blockEl.is('table')) {\n            lines = pasteContent.split('\\n');\n            lastLine = lines.pop();\n            for (_i = 0, _len = lines.length; _i < _len; _i++) {\n              line = lines[_i];\n              _this.editor.selection.insertNode(document.createTextNode(line));\n              _this.editor.selection.insertNode($('<br/>'));\n            }\n            _this.editor.selection.insertNode(document.createTextNode(lastLine));\n          } else {\n            pasteContent = $('<div/>').text(pasteContent);\n            _ref1 = pasteContent.contents();\n            for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {\n              node = _ref1[_j];\n              _this.editor.selection.insertNode($(node)[0], range);\n            }\n          }\n        } else if ($blockEl.is(_this.editor.body)) {\n          for (_k = 0, _len2 = pasteContent.length; _k < _len2; _k++) {\n            node = pasteContent[_k];\n            _this.editor.selection.insertNode(node, range);\n          }\n        } else if (pasteContent.length < 1) {\n          return;\n        } else if (pasteContent.length === 1) {\n          if (pasteContent.is('p')) {\n            children = pasteContent.contents();\n            if (children.length === 1 && children.is('img')) {\n              $img = children;\n              if (/^data:image/.test($img.attr('src'))) {\n                if (!_this.opts.pasteImage) {\n                  return;\n                }\n                blob = _this.editor.util.dataURLtoBlob($img.attr(\"src\"));\n                blob.name = \"Clipboard Image.png\";\n                uploadOpt = {};\n                uploadOpt[_this.opts.pasteImage] = true;\n                if ((_ref2 = _this.editor.uploader) != null) {\n                  _ref2.upload(blob, uploadOpt);\n                }\n                return;\n              } else if ($img.is('img[src^=\"webkit-fake-url://\"]')) {\n                return;\n              }\n            }\n            for (_l = 0, _len3 = children.length; _l < _len3; _l++) {\n              node = children[_l];\n              _this.editor.selection.insertNode(node, range);\n            }\n          } else if ($blockEl.is('p') && _this.editor.util.isEmptyNode($blockEl)) {\n            $blockEl.replaceWith(pasteContent);\n            _this.editor.selection.setRangeAtEndOf(pasteContent, range);\n          } else if (pasteContent.is('ul, ol')) {\n            if (pasteContent.find('li').length === 1) {\n              pasteContent = $('<div/>').text(pasteContent.text());\n              _ref3 = pasteContent.contents();\n              for (_m = 0, _len4 = _ref3.length; _m < _len4; _m++) {\n                node = _ref3[_m];\n                _this.editor.selection.insertNode($(node)[0], range);\n              }\n            } else if ($blockEl.is('li')) {\n              $blockEl.parent().after(pasteContent);\n              _this.editor.selection.setRangeAtEndOf(pasteContent, range);\n            } else {\n              $blockEl.after(pasteContent);\n              _this.editor.selection.setRangeAtEndOf(pasteContent, range);\n            }\n          } else {\n            $blockEl.after(pasteContent);\n            _this.editor.selection.setRangeAtEndOf(pasteContent, range);\n          }\n        } else {\n          if ($blockEl.is('li')) {\n            $blockEl = $blockEl.parent();\n          }\n          if (_this.editor.selection.rangeAtStartOf($blockEl, range)) {\n            insertPosition = 'before';\n          } else if (_this.editor.selection.rangeAtEndOf($blockEl, range)) {\n            insertPosition = 'after';\n          } else {\n            _this.editor.selection.breakBlockEl($blockEl, range);\n            insertPosition = 'before';\n          }\n          $blockEl[insertPosition](pasteContent);\n          _this.editor.selection.setRangeAtEndOf(pasteContent.last(), range);\n        }\n        return _this.editor.trigger('valuechanged');\n      };\n    })(this), 10);\n  };\n\n  InputManager.prototype._onDrop = function(e) {\n    if (this.editor.triggerHandler(e) === false) {\n      return false;\n    }\n    return setTimeout((function(_this) {\n      return function() {\n        return _this.editor.trigger('valuechanged');\n      };\n    })(this), 0);\n  };\n\n  InputManager.prototype.addKeystrokeHandler = function(key, node, handler) {\n    if (!this._keystrokeHandlers[key]) {\n      this._keystrokeHandlers[key] = {};\n    }\n    return this._keystrokeHandlers[key][node] = handler;\n  };\n\n  InputManager.prototype.addShortcut = function(keys, handler) {\n    return this.hotkeys.add(keys, $.proxy(handler, this));\n  };\n\n  return InputManager;\n\n})(SimpleModule);\n\nvar Keystroke,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nKeystroke = (function(_super) {\n  __extends(Keystroke, _super);\n\n  function Keystroke() {\n    return Keystroke.__super__.constructor.apply(this, arguments);\n  }\n\n  Keystroke.pluginName = 'Keystroke';\n\n  Keystroke.prototype._init = function() {\n    var titleEnterHandler;\n    this.editor = this._module;\n    if (this.editor.util.browser.safari) {\n      this.editor.inputManager.addKeystrokeHandler('13', '*', (function(_this) {\n        return function(e) {\n          var $blockEl, $br;\n          if (!e.shiftKey) {\n            return;\n          }\n          $blockEl = _this.editor.util.closestBlockEl();\n          if ($blockEl.is('pre')) {\n            return;\n          }\n          $br = $('<br/>');\n          if (_this.editor.selection.rangeAtEndOf($blockEl)) {\n            _this.editor.selection.insertNode($br);\n            _this.editor.selection.insertNode($('<br/>'));\n            _this.editor.selection.setRangeBefore($br);\n          } else {\n            _this.editor.selection.insertNode($br);\n          }\n          return true;\n        };\n      })(this));\n    }\n    if (this.editor.util.browser.webkit || this.editor.util.browser.msie) {\n      titleEnterHandler = (function(_this) {\n        return function(e, $node) {\n          var $p;\n          if (!_this.editor.selection.rangeAtEndOf($node)) {\n            return;\n          }\n          $p = $('<p/>').append(_this.editor.util.phBr).insertAfter($node);\n          _this.editor.selection.setRangeAtStartOf($p);\n          return true;\n        };\n      })(this);\n      this.editor.inputManager.addKeystrokeHandler('13', 'h1', titleEnterHandler);\n      this.editor.inputManager.addKeystrokeHandler('13', 'h2', titleEnterHandler);\n      this.editor.inputManager.addKeystrokeHandler('13', 'h3', titleEnterHandler);\n      this.editor.inputManager.addKeystrokeHandler('13', 'h4', titleEnterHandler);\n      this.editor.inputManager.addKeystrokeHandler('13', 'h5', titleEnterHandler);\n      this.editor.inputManager.addKeystrokeHandler('13', 'h6', titleEnterHandler);\n    }\n    this.editor.inputManager.addKeystrokeHandler('8', '*', (function(_this) {\n      return function(e) {\n        var $prevBlockEl, $rootBlock;\n        $rootBlock = _this.editor.util.furthestBlockEl();\n        $prevBlockEl = $rootBlock.prev();\n        if ($prevBlockEl.is('hr') && _this.editor.selection.rangeAtStartOf($rootBlock)) {\n          _this.editor.selection.save();\n          $prevBlockEl.remove();\n          _this.editor.selection.restore();\n          return true;\n        }\n      };\n    })(this));\n    this.editor.inputManager.addKeystrokeHandler('9', '*', (function(_this) {\n      return function(e) {\n        var codeButton;\n        codeButton = _this.editor.toolbar.findButton('code');\n        if (!(_this.editor.opts.tabIndent || (codeButton && codeButton.active))) {\n          return;\n        }\n        if (e.shiftKey) {\n          _this.editor.util.outdent();\n        } else {\n          _this.editor.util.indent();\n        }\n        return true;\n      };\n    })(this));\n    this.editor.inputManager.addKeystrokeHandler('13', 'li', (function(_this) {\n      return function(e, $node) {\n        var $cloneNode, listEl, newBlockEl, newListEl;\n        $cloneNode = $node.clone();\n        $cloneNode.find('ul, ol').remove();\n        if (!(_this.editor.util.isEmptyNode($cloneNode) && $node.is(_this.editor.util.closestBlockEl()))) {\n          return;\n        }\n        listEl = $node.parent();\n        if ($node.next('li').length > 0) {\n          if (!_this.editor.util.isEmptyNode($node)) {\n            return;\n          }\n          if (listEl.parent('li').length > 0) {\n            newBlockEl = $('<li/>').append(_this.editor.util.phBr).insertAfter(listEl.parent('li'));\n            newListEl = $('<' + listEl[0].tagName + '/>').append($node.nextAll('li'));\n            newBlockEl.append(newListEl);\n          } else {\n            newBlockEl = $('<p/>').append(_this.editor.util.phBr).insertAfter(listEl);\n            newListEl = $('<' + listEl[0].tagName + '/>').append($node.nextAll('li'));\n            newBlockEl.after(newListEl);\n          }\n        } else {\n          if (listEl.parent('li').length > 0) {\n            newBlockEl = $('<li/>').insertAfter(listEl.parent('li'));\n            if ($node.contents().length > 0) {\n              newBlockEl.append($node.contents());\n            } else {\n              newBlockEl.append(_this.editor.util.phBr);\n            }\n          } else {\n            newBlockEl = $('<p/>').append(_this.editor.util.phBr).insertAfter(listEl);\n            if ($node.children('ul, ol').length > 0) {\n              newBlockEl.after($node.children('ul, ol'));\n            }\n          }\n        }\n        if ($node.prev('li').length) {\n          $node.remove();\n        } else {\n          listEl.remove();\n        }\n        _this.editor.selection.setRangeAtStartOf(newBlockEl);\n        return true;\n      };\n    })(this));\n    this.editor.inputManager.addKeystrokeHandler('13', 'pre', (function(_this) {\n      return function(e, $node) {\n        var $p, breakNode, range;\n        e.preventDefault();\n        if (e.shiftKey) {\n          $p = $('<p/>').append(_this.editor.util.phBr).insertAfter($node);\n          _this.editor.selection.setRangeAtStartOf($p);\n          return true;\n        }\n        range = _this.editor.selection.getRange();\n        breakNode = null;\n        range.deleteContents();\n        if (!_this.editor.util.browser.msie && _this.editor.selection.rangeAtEndOf($node)) {\n          breakNode = document.createTextNode('\\n\\n');\n          range.insertNode(breakNode);\n          range.setEnd(breakNode, 1);\n        } else {\n          breakNode = document.createTextNode('\\n');\n          range.insertNode(breakNode);\n          range.setStartAfter(breakNode);\n        }\n        range.collapse(false);\n        _this.editor.selection.selectRange(range);\n        return true;\n      };\n    })(this));\n    this.editor.inputManager.addKeystrokeHandler('13', 'blockquote', (function(_this) {\n      return function(e, $node) {\n        var $closestBlock, range;\n        $closestBlock = _this.editor.util.closestBlockEl();\n        if (!($closestBlock.is('p') && !$closestBlock.next().length && _this.editor.util.isEmptyNode($closestBlock))) {\n          return;\n        }\n        $node.after($closestBlock);\n        range = document.createRange();\n        _this.editor.selection.setRangeAtStartOf($closestBlock, range);\n        return true;\n      };\n    })(this));\n    this.editor.inputManager.addKeystrokeHandler('8', 'li', (function(_this) {\n      return function(e, $node) {\n        var $br, $childList, $newLi, $prevChildList, $prevNode, $textNode, range, text;\n        $childList = $node.children('ul, ol');\n        $prevNode = $node.prev('li');\n        if (!($childList.length > 0 && $prevNode.length > 0)) {\n          return false;\n        }\n        text = '';\n        $textNode = null;\n        $node.contents().each(function(i, n) {\n          if (n.nodeType === 1 && /UL|OL/.test(n.nodeName)) {\n            return false;\n          }\n          if (n.nodeType === 1 && /BR/.test(n.nodeName)) {\n            return;\n          }\n          if (n.nodeType === 3 && n.nodeValue) {\n            text += n.nodeValue;\n          } else if (n.nodeType === 1) {\n            text += $(n).text();\n          }\n          return $textNode = $(n);\n        });\n        if ($textNode && text.length === 1 && _this.editor.util.browser.firefox && !$textNode.next('br').length) {\n          $br = $(_this.editor.util.phBr).insertAfter($textNode);\n          $textNode.remove();\n          _this.editor.selection.setRangeBefore($br);\n          return true;\n        } else if (text.length > 0) {\n          return false;\n        }\n        range = document.createRange();\n        $prevChildList = $prevNode.children('ul, ol');\n        if ($prevChildList.length > 0) {\n          $newLi = $('<li/>').append(_this.editor.util.phBr).appendTo($prevChildList);\n          $prevChildList.append($childList.children('li'));\n          $node.remove();\n          _this.editor.selection.setRangeAtEndOf($newLi, range);\n        } else {\n          _this.editor.selection.setRangeAtEndOf($prevNode, range);\n          $prevNode.append($childList);\n          $node.remove();\n          _this.editor.selection.selectRange(range);\n        }\n        return true;\n      };\n    })(this));\n    this.editor.inputManager.addKeystrokeHandler('8', 'pre', (function(_this) {\n      return function(e, $node) {\n        var $newNode, codeStr, range;\n        if (!_this.editor.selection.rangeAtStartOf($node)) {\n          return;\n        }\n        codeStr = $node.html().replace('\\n', '<br/>');\n        $newNode = $('<p/>').append(codeStr || _this.editor.util.phBr).insertAfter($node);\n        $node.remove();\n        range = document.createRange();\n        _this.editor.selection.setRangeAtStartOf($newNode, range);\n        return true;\n      };\n    })(this));\n    return this.editor.inputManager.addKeystrokeHandler('8', 'blockquote', (function(_this) {\n      return function(e, $node) {\n        var $firstChild, range;\n        if (!_this.editor.selection.rangeAtStartOf($node)) {\n          return;\n        }\n        $firstChild = $node.children().first().unwrap();\n        range = document.createRange();\n        _this.editor.selection.setRangeAtStartOf($firstChild, range);\n        return true;\n      };\n    })(this));\n  };\n\n  return Keystroke;\n\n})(SimpleModule);\n\nvar UndoManager,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nUndoManager = (function(_super) {\n  __extends(UndoManager, _super);\n\n  function UndoManager() {\n    return UndoManager.__super__.constructor.apply(this, arguments);\n  }\n\n  UndoManager.pluginName = 'UndoManager';\n\n  UndoManager.prototype._index = -1;\n\n  UndoManager.prototype._capacity = 50;\n\n  UndoManager.prototype._timer = null;\n\n  UndoManager.prototype._init = function() {\n    var redoShortcut, undoShortcut;\n    this.editor = this._module;\n    this._stack = [];\n    if (this.editor.util.os.mac) {\n      undoShortcut = 'cmd+z';\n      redoShortcut = 'shift+cmd+z';\n    } else if (this.editor.util.os.win) {\n      undoShortcut = 'ctrl+z';\n      redoShortcut = 'ctrl+y';\n    } else {\n      undoShortcut = 'ctrl+z';\n      redoShortcut = 'shift+ctrl+z';\n    }\n    this.editor.inputManager.addShortcut(undoShortcut, (function(_this) {\n      return function(e) {\n        e.preventDefault();\n        _this.undo();\n        return false;\n      };\n    })(this));\n    this.editor.inputManager.addShortcut(redoShortcut, (function(_this) {\n      return function(e) {\n        e.preventDefault();\n        _this.redo();\n        return false;\n      };\n    })(this));\n    return this.editor.on('valuechanged', (function(_this) {\n      return function(e, src) {\n        if (src === 'undo') {\n          return;\n        }\n        if (_this._timer) {\n          clearTimeout(_this._timer);\n          _this._timer = null;\n        }\n        return _this._timer = setTimeout(function() {\n          _this._pushUndoState();\n          return _this._timer = null;\n        }, 200);\n      };\n    })(this));\n  };\n\n  UndoManager.prototype._pushUndoState = function() {\n    var currentState, html;\n    if (this.editor.triggerHandler('pushundostate') === false) {\n      return;\n    }\n    currentState = this.currentState();\n    html = this.editor.body.html();\n    if (currentState && currentState.html === html) {\n      return;\n    }\n    this._index += 1;\n    this._stack.length = this._index;\n    this._stack.push({\n      html: html,\n      caret: this.caretPosition()\n    });\n    if (this._stack.length > this._capacity) {\n      this._stack.shift();\n      return this._index -= 1;\n    }\n  };\n\n  UndoManager.prototype.currentState = function() {\n    if (this._stack.length && this._index > -1) {\n      return this._stack[this._index];\n    } else {\n      return null;\n    }\n  };\n\n  UndoManager.prototype.undo = function() {\n    var state;\n    if (this._index < 1 || this._stack.length < 2) {\n      return;\n    }\n    this.editor.hidePopover();\n    this._index -= 1;\n    state = this._stack[this._index];\n    this.editor.body.html(state.html);\n    this.caretPosition(state.caret);\n    this.editor.body.find('.selected').removeClass('selected');\n    this.editor.sync();\n    return this.editor.trigger('valuechanged', ['undo']);\n  };\n\n  UndoManager.prototype.redo = function() {\n    var state;\n    if (this._index < 0 || this._stack.length < this._index + 2) {\n      return;\n    }\n    this.editor.hidePopover();\n    this._index += 1;\n    state = this._stack[this._index];\n    this.editor.body.html(state.html);\n    this.caretPosition(state.caret);\n    this.editor.body.find('.selected').removeClass('selected');\n    this.editor.sync();\n    return this.editor.trigger('valuechanged', ['undo']);\n  };\n\n  UndoManager.prototype.update = function() {\n    var currentState, html;\n    if (this._timer) {\n      return;\n    }\n    currentState = this.currentState();\n    if (!currentState) {\n      return;\n    }\n    html = this.editor.body.html();\n    currentState.html = html;\n    return currentState.caret = this.caretPosition();\n  };\n\n  UndoManager.prototype._getNodeOffset = function(node, index) {\n    var $parent, merging, offset;\n    if (index) {\n      $parent = $(node);\n    } else {\n      $parent = $(node).parent();\n    }\n    offset = 0;\n    merging = false;\n    $parent.contents().each((function(_this) {\n      return function(i, child) {\n        if (index === i || node === child) {\n          return false;\n        }\n        if (child.nodeType === 3) {\n          if (!merging) {\n            offset += 1;\n            merging = true;\n          }\n        } else {\n          offset += 1;\n          merging = false;\n        }\n        return null;\n      };\n    })(this));\n    return offset;\n  };\n\n  UndoManager.prototype._getNodePosition = function(node, offset) {\n    var position, prevNode;\n    if (node.nodeType === 3) {\n      prevNode = node.previousSibling;\n      while (prevNode && prevNode.nodeType === 3) {\n        node = prevNode;\n        offset += this.editor.util.getNodeLength(prevNode);\n        prevNode = prevNode.previousSibling;\n      }\n    } else {\n      offset = this._getNodeOffset(node, offset);\n    }\n    position = [];\n    position.unshift(offset);\n    this.editor.util.traverseUp((function(_this) {\n      return function(n) {\n        return position.unshift(_this._getNodeOffset(n));\n      };\n    })(this), node);\n    return position;\n  };\n\n  UndoManager.prototype._getNodeByPosition = function(position) {\n    var child, childNodes, i, node, offset, _i, _len, _ref;\n    node = this.editor.body[0];\n    _ref = position.slice(0, position.length - 1);\n    for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {\n      offset = _ref[i];\n      childNodes = node.childNodes;\n      if (offset > childNodes.length - 1) {\n        if (i === position.length - 2 && $(node).is('pre')) {\n          child = document.createTextNode('');\n          node.appendChild(child);\n          childNodes = node.childNodes;\n        } else {\n          node = null;\n          break;\n        }\n      }\n      node = childNodes[offset];\n    }\n    return node;\n  };\n\n  UndoManager.prototype.caretPosition = function(caret) {\n    var endContainer, endOffset, range, startContainer, startOffset;\n    if (!caret) {\n      range = this.editor.selection.getRange();\n      if (!(this.editor.inputManager.focused && (range != null))) {\n        return {};\n      }\n      caret = {\n        start: [],\n        end: null,\n        collapsed: true\n      };\n      caret.start = this._getNodePosition(range.startContainer, range.startOffset);\n      if (!range.collapsed) {\n        caret.end = this._getNodePosition(range.endContainer, range.endOffset);\n        caret.collapsed = false;\n      }\n      return caret;\n    } else {\n      if (!this.editor.inputManager.focused) {\n        this.editor.body.focus();\n      }\n      if (!caret.start) {\n        this.editor.body.blur();\n        return;\n      }\n      startContainer = this._getNodeByPosition(caret.start);\n      startOffset = caret.start[caret.start.length - 1];\n      if (caret.collapsed) {\n        endContainer = startContainer;\n        endOffset = startOffset;\n      } else {\n        endContainer = this._getNodeByPosition(caret.end);\n        endOffset = caret.start[caret.start.length - 1];\n      }\n      if (!startContainer || !endContainer) {\n        throw new Error('simditor: invalid caret state');\n        return;\n      }\n      range = document.createRange();\n      range.setStart(startContainer, startOffset);\n      range.setEnd(endContainer, endOffset);\n      return this.editor.selection.selectRange(range);\n    }\n  };\n\n  return UndoManager;\n\n})(SimpleModule);\n\nvar Util,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nUtil = (function(_super) {\n  __extends(Util, _super);\n\n  function Util() {\n    return Util.__super__.constructor.apply(this, arguments);\n  }\n\n  Util.pluginName = 'Util';\n\n  Util.prototype._init = function() {\n    this.editor = this._module;\n    if (this.browser.msie && this.browser.version < 11) {\n      return this.phBr = '';\n    }\n  };\n\n  Util.prototype.phBr = '<br/>';\n\n  Util.prototype.os = (function() {\n    var os;\n    os = {};\n    if (/Mac/.test(navigator.appVersion)) {\n      os.mac = true;\n    } else if (/Linux/.test(navigator.appVersion)) {\n      os.linux = true;\n    } else if (/Win/.test(navigator.appVersion)) {\n      os.win = true;\n    } else if (/X11/.test(navigator.appVersion)) {\n      os.unix = true;\n    }\n    if (/Mobi/.test(navigator.appVersion)) {\n      os.mobile = true;\n    }\n    return os;\n  })();\n\n  Util.prototype.browser = (function() {\n    var chrome, firefox, ie, safari, ua, _ref, _ref1, _ref2, _ref3;\n    ua = navigator.userAgent;\n    ie = /(msie|trident)/i.test(ua);\n    chrome = /chrome|crios/i.test(ua);\n    safari = /safari/i.test(ua) && !chrome;\n    firefox = /firefox/i.test(ua);\n    if (ie) {\n      return {\n        msie: true,\n        version: ((_ref = ua.match(/(msie |rv:)(\\d+(\\.\\d+)?)/i)) != null ? _ref[2] : void 0) * 1\n      };\n    } else if (chrome) {\n      return {\n        webkit: true,\n        chrome: true,\n        version: ((_ref1 = ua.match(/(?:chrome|crios)\\/(\\d+(\\.\\d+)?)/i)) != null ? _ref1[1] : void 0) * 1\n      };\n    } else if (safari) {\n      return {\n        webkit: true,\n        safari: true,\n        version: ((_ref2 = ua.match(/version\\/(\\d+(\\.\\d+)?)/i)) != null ? _ref2[1] : void 0) * 1\n      };\n    } else if (firefox) {\n      return {\n        mozilla: true,\n        firefox: true,\n        version: ((_ref3 = ua.match(/firefox\\/(\\d+(\\.\\d+)?)/i)) != null ? _ref3[1] : void 0) * 1\n      };\n    } else {\n      return {};\n    }\n  })();\n\n  Util.prototype.supportSelectionChange = (function() {\n    var e, onselectionchange;\n    onselectionchange = document.onselectionchange;\n    if (onselectionchange !== void 0) {\n      try {\n        document.onselectionchange = 0;\n        return document.onselectionchange === null;\n      } catch (_error) {\n        e = _error;\n      } finally {\n        document.onselectionchange = onselectionchange;\n      }\n    }\n    return false;\n  })();\n\n  Util.prototype.reflow = function(el) {\n    if (el == null) {\n      el = document;\n    }\n    return $(el)[0].offsetHeight;\n  };\n\n  Util.prototype.metaKey = function(e) {\n    var isMac;\n    isMac = /Mac/.test(navigator.userAgent);\n    if (isMac) {\n      return e.metaKey;\n    } else {\n      return e.ctrlKey;\n    }\n  };\n\n  Util.prototype.isEmptyNode = function(node) {\n    var $node;\n    $node = $(node);\n    return $node.is(':empty') || (!$node.text() && !$node.find(':not(br, span, div)').length);\n  };\n\n  Util.prototype.isBlockNode = function(node) {\n    node = $(node)[0];\n    if (!node || node.nodeType === 3) {\n      return false;\n    }\n    return /^(div|p|ul|ol|li|blockquote|hr|pre|h1|h2|h3|h4|table)$/.test(node.nodeName.toLowerCase());\n  };\n\n  Util.prototype.closestBlockEl = function(node) {\n    var $node, blockEl, range;\n    if (node == null) {\n      range = this.editor.selection.getRange();\n      node = range != null ? range.commonAncestorContainer : void 0;\n    }\n    $node = $(node);\n    if (!$node.length) {\n      return null;\n    }\n    blockEl = $node.parentsUntil(this.editor.body).addBack();\n    blockEl = blockEl.filter((function(_this) {\n      return function(i) {\n        return _this.isBlockNode(blockEl.eq(i));\n      };\n    })(this));\n    if (blockEl.length) {\n      return blockEl.last();\n    } else {\n      return null;\n    }\n  };\n\n  Util.prototype.furthestNode = function(node, filter) {\n    var $node, blockEl, range;\n    if (node == null) {\n      range = this.editor.selection.getRange();\n      node = range != null ? range.commonAncestorContainer : void 0;\n    }\n    $node = $(node);\n    if (!$node.length) {\n      return null;\n    }\n    blockEl = $node.parentsUntil(this.editor.body).addBack();\n    blockEl = blockEl.filter((function(_this) {\n      return function(i) {\n        var $n;\n        $n = blockEl.eq(i);\n        if ($.isFunction(filter)) {\n          return filter($n);\n        } else {\n          return $n.is(filter);\n        }\n      };\n    })(this));\n    if (blockEl.length) {\n      return blockEl.first();\n    } else {\n      return null;\n    }\n  };\n\n  Util.prototype.furthestBlockEl = function(node) {\n    return this.furthestNode(node, this.isBlockNode);\n  };\n\n  Util.prototype.getNodeLength = function(node) {\n    switch (node.nodeType) {\n      case 7:\n      case 10:\n        return 0;\n      case 3:\n      case 8:\n        return node.length;\n      default:\n        return node.childNodes.length;\n    }\n  };\n\n  Util.prototype.traverseUp = function(callback, node) {\n    var n, nodes, range, result, _i, _len, _results;\n    if (node == null) {\n      range = this.editor.selection.getRange();\n      node = range != null ? range.commonAncestorContainer : void 0;\n    }\n    if ((node == null) || !$.contains(this.editor.body[0], node)) {\n      return false;\n    }\n    nodes = $(node).parentsUntil(this.editor.body).get();\n    nodes.unshift(node);\n    _results = [];\n    for (_i = 0, _len = nodes.length; _i < _len; _i++) {\n      n = nodes[_i];\n      result = callback(n);\n      if (result === false) {\n        break;\n      } else {\n        _results.push(void 0);\n      }\n    }\n    return _results;\n  };\n\n  Util.prototype.indent = function() {\n    var $blockEl, $childList, $nextTd, $parentLi, $td, indentLevel, range, spaceNode, tagName, _ref;\n    $blockEl = this.editor.util.closestBlockEl();\n    if (!($blockEl && $blockEl.length > 0)) {\n      return false;\n    }\n    if ($blockEl.is('pre')) {\n      spaceNode = document.createTextNode('\\u00A0\\u00A0');\n      this.editor.selection.insertNode(spaceNode);\n    } else if ($blockEl.is('li')) {\n      $parentLi = $blockEl.prev('li');\n      if ($parentLi.length < 1) {\n        return false;\n      }\n      this.editor.selection.save();\n      tagName = $blockEl.parent()[0].tagName;\n      $childList = $parentLi.children('ul, ol');\n      if ($childList.length > 0) {\n        $childList.append($blockEl);\n      } else {\n        $('<' + tagName + '/>').append($blockEl).appendTo($parentLi);\n      }\n      this.editor.selection.restore();\n    } else if ($blockEl.is('p, h1, h2, h3, h4')) {\n      indentLevel = (_ref = $blockEl.attr('data-indent')) != null ? _ref : 0;\n      indentLevel = indentLevel * 1 + 1;\n      if (indentLevel > 10) {\n        indentLevel = 10;\n      }\n      $blockEl.attr('data-indent', indentLevel);\n    } else if ($blockEl.is('table')) {\n      range = this.editor.selection.getRange();\n      $td = $(range.commonAncestorContainer).closest('td');\n      $nextTd = $td.next('td');\n      if (!($nextTd.length > 0)) {\n        $nextTd = $td.parent('tr').next('tr').find('td:first');\n      }\n      if (!($td.length > 0 && $nextTd.length > 0)) {\n        return false;\n      }\n      this.editor.selection.setRangeAtEndOf($nextTd);\n    } else {\n      spaceNode = document.createTextNode('\\u00A0\\u00A0\\u00A0\\u00A0');\n      this.editor.selection.insertNode(spaceNode);\n    }\n    this.editor.trigger('valuechanged');\n    return true;\n  };\n\n  Util.prototype.outdent = function() {\n    var $blockEl, $parent, $parentLi, $prevTd, $td, button, indentLevel, range, _ref;\n    $blockEl = this.editor.util.closestBlockEl();\n    if (!($blockEl && $blockEl.length > 0)) {\n      return false;\n    }\n    if ($blockEl.is('pre')) {\n      return false;\n    } else if ($blockEl.is('li')) {\n      $parent = $blockEl.parent();\n      $parentLi = $parent.parent('li');\n      if ($parentLi.length < 1) {\n        button = this.editor.toolbar.findButton($parent[0].tagName.toLowerCase());\n        if (button != null) {\n          button.command();\n        }\n        return false;\n      }\n      this.editor.selection.save();\n      if ($blockEl.next('li').length > 0) {\n        $('<' + $parent[0].tagName + '/>').append($blockEl.nextAll('li')).appendTo($blockEl);\n      }\n      $blockEl.insertAfter($parentLi);\n      if ($parent.children('li').length < 1) {\n        $parent.remove();\n      }\n      this.editor.selection.restore();\n    } else if ($blockEl.is('p, h1, h2, h3, h4')) {\n      indentLevel = (_ref = $blockEl.attr('data-indent')) != null ? _ref : 0;\n      indentLevel = indentLevel * 1 - 1;\n      if (indentLevel < 0) {\n        indentLevel = 0;\n      }\n      $blockEl.attr('data-indent', indentLevel);\n    } else if ($blockEl.is('table')) {\n      range = this.editor.selection.getRange();\n      $td = $(range.commonAncestorContainer).closest('td');\n      $prevTd = $td.prev('td');\n      if (!($prevTd.length > 0)) {\n        $prevTd = $td.parent('tr').prev('tr').find('td:last');\n      }\n      if (!($td.length > 0 && $prevTd.length > 0)) {\n        return false;\n      }\n      this.editor.selection.setRangeAtEndOf($prevTd);\n    } else {\n      return false;\n    }\n    this.editor.trigger('valuechanged');\n    return true;\n  };\n\n  Util.prototype.dataURLtoBlob = function(dataURL) {\n    var BlobBuilder, arrayBuffer, bb, byteString, hasArrayBufferViewSupport, hasBlobConstructor, i, intArray, mimeString, _i, _ref;\n    hasBlobConstructor = window.Blob && (function() {\n      var e;\n      try {\n        return Boolean(new Blob());\n      } catch (_error) {\n        e = _error;\n        return false;\n      }\n    })();\n    hasArrayBufferViewSupport = hasBlobConstructor && window.Uint8Array && (function() {\n      var e;\n      try {\n        return new Blob([new Uint8Array(100)]).size === 100;\n      } catch (_error) {\n        e = _error;\n        return false;\n      }\n    })();\n    BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;\n    if (!((hasBlobConstructor || BlobBuilder) && window.atob && window.ArrayBuffer && window.Uint8Array)) {\n      return false;\n    }\n    if (dataURL.split(',')[0].indexOf('base64') >= 0) {\n      byteString = atob(dataURL.split(',')[1]);\n    } else {\n      byteString = decodeURIComponent(dataURL.split(',')[1]);\n    }\n    arrayBuffer = new ArrayBuffer(byteString.length);\n    intArray = new Uint8Array(arrayBuffer);\n    for (i = _i = 0, _ref = byteString.length; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {\n      intArray[i] = byteString.charCodeAt(i);\n    }\n    mimeString = dataURL.split(',')[0].split(':')[1].split(';')[0];\n    if (hasBlobConstructor) {\n      return new Blob([hasArrayBufferViewSupport ? intArray : arrayBuffer], {\n        type: mimeString\n      });\n    }\n    bb = new BlobBuilder();\n    bb.append(arrayBuffer);\n    return bb.getBlob(mimeString);\n  };\n\n  return Util;\n\n})(SimpleModule);\n\nvar Toolbar,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nToolbar = (function(_super) {\n  __extends(Toolbar, _super);\n\n  function Toolbar() {\n    return Toolbar.__super__.constructor.apply(this, arguments);\n  }\n\n  Toolbar.pluginName = 'Toolbar';\n\n  Toolbar.prototype.opts = {\n    toolbar: true,\n    toolbarFloat: true,\n    toolbarHidden: false,\n    toolbarFloatOffset: 0\n  };\n\n  Toolbar.prototype._tpl = {\n    wrapper: '<div class=\"simditor-toolbar\"><ul></ul></div>',\n    separator: '<li><span class=\"separator\"></span></li>'\n  };\n\n  Toolbar.prototype._init = function() {\n    var toolbarHeight;\n    this.editor = this._module;\n    if (!this.opts.toolbar) {\n      return;\n    }\n    if (!$.isArray(this.opts.toolbar)) {\n      this.opts.toolbar = ['bold', 'italic', 'underline', 'strikethrough', '|', 'ol', 'ul', 'blockquote', 'code', '|', 'link', 'image', '|', 'indent', 'outdent'];\n    }\n    this._render();\n    this.list.on('click', (function(_this) {\n      return function(e) {\n        return false;\n      };\n    })(this));\n    this.wrapper.on('mousedown', (function(_this) {\n      return function(e) {\n        return _this.list.find('.menu-on').removeClass('.menu-on');\n      };\n    })(this));\n    $(document).on('mousedown.simditor' + this.editor.id, (function(_this) {\n      return function(e) {\n        return _this.list.find('.menu-on').removeClass('.menu-on');\n      };\n    })(this));\n    if (!this.opts.toolbarHidden && this.opts.toolbarFloat) {\n      this.wrapper.width(this.wrapper.outerWidth());\n      this.wrapper.css('top', this.opts.toolbarFloatOffset);\n      toolbarHeight = this.wrapper.outerHeight();\n      if (!this.editor.util.os.mobile) {\n        $(window).on('resize.simditor-' + this.editor.id, (function(_this) {\n          return function(e) {\n            _this.wrapper.css('position', 'static');\n            _this.editor.util.reflow(_this.wrapper);\n            _this.wrapper.css('left', _this.wrapper.offset().left);\n            return _this.wrapper.css('position', '');\n          };\n        })(this)).resize();\n      }\n      $(window).on('scroll.simditor-' + this.editor.id, (function(_this) {\n        return function(e) {\n          var bottomEdge, scrollTop, topEdge;\n          topEdge = _this.editor.wrapper.offset().top;\n          bottomEdge = topEdge + _this.editor.wrapper.outerHeight() - 80;\n          scrollTop = $(document).scrollTop() + _this.opts.toolbarFloatOffset;\n          if (scrollTop <= topEdge || scrollTop >= bottomEdge) {\n            _this.editor.wrapper.removeClass('toolbar-floating').css('padding-top', '');\n            if (_this.editor.util.os.mobile) {\n              return _this.wrapper.css('top', _this.opts.toolbarFloatOffset);\n            }\n          } else {\n            _this.editor.wrapper.addClass('toolbar-floating').css('padding-top', toolbarHeight);\n            if (_this.editor.util.os.mobile) {\n              return _this.wrapper.css('top', scrollTop - topEdge + _this.opts.toolbarFloatOffset);\n            }\n          }\n        };\n      })(this));\n    }\n    this.editor.on('selectionchanged', (function(_this) {\n      return function() {\n        return _this.toolbarStatus();\n      };\n    })(this));\n    this.editor.on('destroy', (function(_this) {\n      return function() {\n        return _this.buttons.length = 0;\n      };\n    })(this));\n    return $(document).on('mousedown.simditor-' + this.editor.id, (function(_this) {\n      return function(e) {\n        return _this.list.find('li.menu-on').removeClass('menu-on');\n      };\n    })(this));\n  };\n\n  Toolbar.prototype._render = function() {\n    var name, _i, _len, _ref;\n    this.buttons = [];\n    this.wrapper = $(this._tpl.wrapper).prependTo(this.editor.wrapper);\n    this.list = this.wrapper.find('ul');\n    _ref = this.opts.toolbar;\n    for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n      name = _ref[_i];\n      if (name === '|') {\n        $(this._tpl.separator).appendTo(this.list);\n        continue;\n      }\n      if (!this.constructor.buttons[name]) {\n        throw new Error('simditor: invalid toolbar button \"' + name + '\"');\n        continue;\n      }\n      this.buttons.push(new this.constructor.buttons[name]({\n        editor: this.editor\n      }));\n    }\n    if (this.opts.toolbarHidden) {\n      return this.wrapper.hide();\n    } else {\n      return this.editor.placeholderEl.css('top', this.wrapper.outerHeight());\n    }\n  };\n\n  Toolbar.prototype.toolbarStatus = function(name) {\n    var buttons;\n    if (!this.editor.inputManager.focused) {\n      return;\n    }\n    buttons = this.buttons.slice(0);\n    return this.editor.util.traverseUp((function(_this) {\n      return function(node) {\n        var button, i, removeButtons, _i, _j, _len, _len1;\n        removeButtons = [];\n        for (i = _i = 0, _len = buttons.length; _i < _len; i = ++_i) {\n          button = buttons[i];\n          if ((name != null) && button.name !== name) {\n            continue;\n          }\n          if (!button.status || button.status($(node)) === true) {\n            removeButtons.push(button);\n          }\n        }\n        for (_j = 0, _len1 = removeButtons.length; _j < _len1; _j++) {\n          button = removeButtons[_j];\n          i = $.inArray(button, buttons);\n          buttons.splice(i, 1);\n        }\n        if (buttons.length === 0) {\n          return false;\n        }\n      };\n    })(this));\n  };\n\n  Toolbar.prototype.findButton = function(name) {\n    var button;\n    button = this.list.find('.toolbar-item-' + name).data('button');\n    return button != null ? button : null;\n  };\n\n  Toolbar.addButton = function(btn) {\n    return this.buttons[btn.prototype.name] = btn;\n  };\n\n  Toolbar.buttons = {};\n\n  return Toolbar;\n\n})(SimpleModule);\n\nvar Simditor,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nSimditor = (function(_super) {\n  __extends(Simditor, _super);\n\n  function Simditor() {\n    return Simditor.__super__.constructor.apply(this, arguments);\n  }\n\n  Simditor.connect(Util);\n\n  Simditor.connect(InputManager);\n\n  Simditor.connect(UndoManager);\n\n  Simditor.connect(Keystroke);\n\n  Simditor.connect(Formatter);\n\n  Simditor.connect(Selection);\n\n  Simditor.connect(Toolbar);\n\n  Simditor.count = 0;\n\n  Simditor.prototype.opts = {\n    textarea: null,\n    placeholder: '',\n    defaultImage: 'images/image.png',\n    params: {},\n    upload: false,\n    tabIndent: true\n  };\n\n  Simditor.prototype._init = function() {\n    var e, editor, form, uploadOpts;\n    this.textarea = $(this.opts.textarea);\n    this.opts.placeholder = this.opts.placeholder || this.textarea.attr('placeholder');\n    if (!this.textarea.length) {\n      throw new Error('simditor: param textarea is required.');\n      return;\n    }\n    editor = this.textarea.data('simditor');\n    if (editor != null) {\n      editor.destroy();\n    }\n    this.id = ++Simditor.count;\n    this._render();\n    if (this.opts.upload && simpleUploader) {\n      uploadOpts = typeof this.opts.upload === 'object' ? this.opts.upload : {};\n      this.uploader = simpleUploader(uploadOpts);\n    }\n    form = this.textarea.closest('form');\n    if (form.length) {\n      form.on('submit.simditor-' + this.id, (function(_this) {\n        return function() {\n          return _this.sync();\n        };\n      })(this));\n      form.on('reset.simditor-' + this.id, (function(_this) {\n        return function() {\n          return _this.setValue('');\n        };\n      })(this));\n    }\n    this.on('initialized', (function(_this) {\n      return function() {\n        if (_this.opts.placeholder) {\n          _this.on('valuechanged', function() {\n            return _this._placeholder();\n          });\n        }\n        return _this.setValue(_this.textarea.val().trim() || '');\n      };\n    })(this));\n    if (this.util.browser.mozilla) {\n      this.util.reflow();\n      try {\n        document.execCommand(\"enableObjectResizing\", false, false);\n        return document.execCommand(\"enableInlineTableEditing\", false, false);\n      } catch (_error) {\n        e = _error;\n      }\n    }\n  };\n\n  Simditor.prototype._tpl = \"<div class=\\\"simditor\\\">\\n  <div class=\\\"simditor-wrapper\\\">\\n    <div class=\\\"simditor-placeholder\\\"></div>\\n    <div class=\\\"simditor-body\\\" contenteditable=\\\"true\\\">\\n    </div>\\n  </div>\\n</div>\";\n\n  Simditor.prototype._render = function() {\n    var key, val, _ref, _results;\n    this.el = $(this._tpl).insertBefore(this.textarea);\n    this.wrapper = this.el.find('.simditor-wrapper');\n    this.body = this.wrapper.find('.simditor-body');\n    this.placeholderEl = this.wrapper.find('.simditor-placeholder').append(this.opts.placeholder);\n    this.el.append(this.textarea).data('simditor', this);\n    this.textarea.data('simditor', this).hide().blur();\n    this.body.attr('tabindex', this.textarea.attr('tabindex'));\n    if (this.util.os.mac) {\n      this.el.addClass('simditor-mac');\n    } else if (this.util.os.linux) {\n      this.el.addClass('simditor-linux');\n    }\n    if (this.util.os.mobile) {\n      this.el.addClass('simditor-mobile');\n    }\n    if (this.opts.params) {\n      _ref = this.opts.params;\n      _results = [];\n      for (key in _ref) {\n        val = _ref[key];\n        _results.push($('<input/>', {\n          type: 'hidden',\n          name: key,\n          value: val\n        }).insertAfter(this.textarea));\n      }\n      return _results;\n    }\n  };\n\n  Simditor.prototype._placeholder = function() {\n    var children, _ref;\n    children = this.body.children();\n    if (children.length === 0 || (children.length === 1 && this.util.isEmptyNode(children) && ((_ref = children.data('indent')) != null ? _ref : 0) < 1)) {\n      return this.placeholderEl.show();\n    } else {\n      return this.placeholderEl.hide();\n    }\n  };\n\n  Simditor.prototype.setValue = function(val) {\n    this.hidePopover();\n    this.textarea.val(val);\n    this.body.html(val);\n    this.formatter.format();\n    this.formatter.decorate();\n    this.util.reflow(this.body);\n    this.inputManager.lastCaretPosition = null;\n    return this.trigger('valuechanged');\n  };\n\n  Simditor.prototype.getValue = function() {\n    return this.sync();\n  };\n\n  Simditor.prototype.sync = function() {\n    var children, cloneBody, emptyP, firstP, lastP, val;\n    cloneBody = this.body.clone();\n    this.formatter.undecorate(cloneBody);\n    this.formatter.format(cloneBody);\n    this.formatter.autolink(cloneBody);\n    children = cloneBody.children();\n    lastP = children.last('p');\n    firstP = children.first('p');\n    while (lastP.is('p') && this.util.isEmptyNode(lastP)) {\n      emptyP = lastP;\n      lastP = lastP.prev('p');\n      emptyP.remove();\n    }\n    while (firstP.is('p') && this.util.isEmptyNode(firstP)) {\n      emptyP = firstP;\n      firstP = lastP.next('p');\n      emptyP.remove();\n    }\n    cloneBody.find('img.uploading').remove();\n    val = $.trim(cloneBody.html());\n    this.textarea.val(val);\n    return val;\n  };\n\n  Simditor.prototype.focus = function() {\n    var $blockEl, range;\n    if (this.inputManager.lastCaretPosition) {\n      return this.undoManager.caretPosition(this.inputManager.lastCaretPosition);\n    } else {\n      $blockEl = this.body.find('p, li, pre, h1, h2, h3, h4, td').first();\n      if (!($blockEl.length > 0)) {\n        return;\n      }\n      range = document.createRange();\n      this.selection.setRangeAtStartOf($blockEl, range);\n      return this.body.focus();\n    }\n  };\n\n  Simditor.prototype.blur = function() {\n    return this.body.blur();\n  };\n\n  Simditor.prototype.hidePopover = function() {\n    return this.el.find('.simditor-popover').each((function(_this) {\n      return function(i, popover) {\n        popover = $(popover).data('popover');\n        if (popover.active) {\n          return popover.hide();\n        }\n      };\n    })(this));\n  };\n\n  Simditor.prototype.destroy = function() {\n    this.triggerHandler('destroy');\n    this.textarea.closest('form').off('.simditor .simditor-' + this.id);\n    this.selection.clear();\n    this.inputManager.focused = false;\n    this.textarea.insertBefore(this.el).hide().val('').removeData('simditor');\n    this.el.remove();\n    $(document).off('.simditor-' + this.id);\n    $(window).off('.simditor-' + this.id);\n    return this.off();\n  };\n\n  return Simditor;\n\n})(SimpleModule);\n\nSimditor.i18n = {\n  'zh-CN': {\n    'blockquote': '引用',\n    'bold': '加粗文字',\n    'code': '插入代码',\n    'color': '文字颜色',\n    'hr': '分隔线',\n    'image': '插入图片',\n    'localImage': '本地图片',\n    'externalImage': '外链图片',\n    'uploadImage': '上传图片',\n    'uploadFailed': '上传失败了',\n    'uploadError': '上传出错了',\n    'imageUrl': '图片地址',\n    'imageSize': '图片尺寸',\n    'restoreImageSize': '还原图片尺寸',\n    'uploading': '正在上传',\n    'indent': '向右缩进',\n    'outdent': '向左缩进',\n    'italic': '斜体文字',\n    'link': '插入链接',\n    'text': '文本',\n    'linkText': '链接文字',\n    'linkUrl': '地址',\n    'removeLink': '移除链接',\n    'ol': '有序列表',\n    'ul': '无序列表',\n    'strikethrough': '删除线文字',\n    'table': '表格',\n    'deleteRow': '删除行',\n    'insertRowAbove': '在上面插入行',\n    'insertRowBelow': '在下面插入行',\n    'deleteColumn': '删除列',\n    'insertColumnLeft': '在左边插入列',\n    'insertColumnRight': '在右边插入列',\n    'deleteTable': '删除表格',\n    'title': '标题',\n    'normalText': '普通文本',\n    'underline': '下划线文字'\n  }\n};\n\nvar Button,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  __slice = [].slice;\n\nButton = (function(_super) {\n  __extends(Button, _super);\n\n  Button.prototype._tpl = {\n    item: '<li><a tabindex=\"-1\" unselectable=\"on\" class=\"toolbar-item\" href=\"javascript:;\"><span></span></a></li>',\n    menuWrapper: '<div class=\"toolbar-menu\"></div>',\n    menuItem: '<li><a tabindex=\"-1\" unselectable=\"on\" class=\"menu-item\" href=\"javascript:;\"><span></span></a></li>',\n    separator: '<li><span class=\"separator\"></span></li>'\n  };\n\n  Button.prototype.name = '';\n\n  Button.prototype.icon = '';\n\n  Button.prototype.title = '';\n\n  Button.prototype.text = '';\n\n  Button.prototype.htmlTag = '';\n\n  Button.prototype.disableTag = '';\n\n  Button.prototype.menu = false;\n\n  Button.prototype.active = false;\n\n  Button.prototype.disabled = false;\n\n  Button.prototype.needFocus = true;\n\n  Button.prototype.shortcut = null;\n\n  function Button(opts) {\n    this.editor = opts.editor;\n    this.title = this._t(this.name);\n    Button.__super__.constructor.call(this, opts);\n  }\n\n  Button.prototype._init = function() {\n    var tag, _i, _len, _ref, _results;\n    this.render();\n    this.el.on('mousedown', (function(_this) {\n      return function(e) {\n        var exceed, param;\n        e.preventDefault();\n        if (_this.el.hasClass('disabled') || (_this.needFocus && !_this.editor.inputManager.focused)) {\n          return false;\n        }\n        if (_this.menu) {\n          _this.wrapper.toggleClass('menu-on').siblings('li').removeClass('menu-on');\n          if (_this.wrapper.is('.menu-on')) {\n            exceed = _this.menuWrapper.offset().left + _this.menuWrapper.outerWidth() + 5 - _this.editor.wrapper.offset().left - _this.editor.wrapper.outerWidth();\n            if (exceed > 0) {\n              _this.menuWrapper.css({\n                'left': 'auto',\n                'right': 0\n              });\n            }\n            _this.trigger('menuexpand');\n          }\n          return false;\n        }\n        param = _this.el.data('param');\n        _this.command(param);\n        return false;\n      };\n    })(this));\n    this.wrapper.on('click', 'a.menu-item', (function(_this) {\n      return function(e) {\n        var btn, param;\n        e.preventDefault();\n        btn = $(e.currentTarget);\n        _this.wrapper.removeClass('menu-on');\n        if (btn.hasClass('disabled') || (_this.needFocus && !_this.editor.inputManager.focused)) {\n          return false;\n        }\n        _this.editor.toolbar.wrapper.removeClass('menu-on');\n        param = btn.data('param');\n        _this.command(param);\n        return false;\n      };\n    })(this));\n    this.wrapper.on('mousedown', 'a.menu-item', (function(_this) {\n      return function(e) {\n        return false;\n      };\n    })(this));\n    this.editor.on('blur', (function(_this) {\n      return function() {\n        _this.setActive(false);\n        return _this.setDisabled(false);\n      };\n    })(this));\n    if (this.shortcut != null) {\n      this.editor.inputManager.addShortcut(this.shortcut, (function(_this) {\n        return function(e) {\n          _this.el.mousedown();\n          return false;\n        };\n      })(this));\n    }\n    _ref = this.htmlTag.split(',');\n    _results = [];\n    for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n      tag = _ref[_i];\n      tag = $.trim(tag);\n      if (tag && $.inArray(tag, this.editor.formatter._allowedTags) < 0) {\n        _results.push(this.editor.formatter._allowedTags.push(tag));\n      } else {\n        _results.push(void 0);\n      }\n    }\n    return _results;\n  };\n\n  Button.prototype.render = function() {\n    this.wrapper = $(this._tpl.item).appendTo(this.editor.toolbar.list);\n    this.el = this.wrapper.find('a.toolbar-item');\n    this.el.attr('title', this.title).addClass('toolbar-item-' + this.name).data('button', this);\n    this.el.find('span').addClass(this.icon ? 'fa fa-' + this.icon : '').text(this.text);\n    if (!this.menu) {\n      return;\n    }\n    this.menuWrapper = $(this._tpl.menuWrapper).appendTo(this.wrapper);\n    this.menuWrapper.addClass('toolbar-menu-' + this.name);\n    return this.renderMenu();\n  };\n\n  Button.prototype.renderMenu = function() {\n    var $menuBtntnEl, $menuItemEl, menuItem, _i, _len, _ref, _ref1, _results;\n    if (!$.isArray(this.menu)) {\n      return;\n    }\n    this.menuEl = $('<ul/>').appendTo(this.menuWrapper);\n    _ref = this.menu;\n    _results = [];\n    for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n      menuItem = _ref[_i];\n      if (menuItem === '|') {\n        $(this._tpl.separator).appendTo(this.menuEl);\n        continue;\n      }\n      $menuItemEl = $(this._tpl.menuItem).appendTo(this.menuEl);\n      _results.push($menuBtntnEl = $menuItemEl.find('a.menu-item').attr({\n        'title': (_ref1 = menuItem.title) != null ? _ref1 : menuItem.text,\n        'data-param': menuItem.param\n      }).addClass('menu-item-' + menuItem.name).find('span').text(menuItem.text));\n    }\n    return _results;\n  };\n\n  Button.prototype.setActive = function(active) {\n    if (active === this.active) {\n      return;\n    }\n    this.active = active;\n    this.el.toggleClass('active', this.active);\n    return this.editor.toolbar.trigger('buttonstatus', [this]);\n  };\n\n  Button.prototype.setDisabled = function(disabled) {\n    if (disabled === this.disabled) {\n      return;\n    }\n    this.disabled = disabled;\n    this.el.toggleClass('disabled', this.disabled);\n    return this.editor.toolbar.trigger('buttonstatus', [this]);\n  };\n\n  Button.prototype.status = function($node) {\n    if ($node != null) {\n      this.setDisabled($node.is(this.disableTag));\n    }\n    if (this.disabled) {\n      return true;\n    }\n    if ($node != null) {\n      this.setActive($node.is(this.htmlTag));\n    }\n    return this.active;\n  };\n\n  Button.prototype.command = function(param) {};\n\n  Button.prototype._t = function() {\n    var args, result, _ref;\n    args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n    result = Button.__super__._t.apply(this, args);\n    if (!result) {\n      result = (_ref = this.editor)._t.apply(_ref, args);\n    }\n    return result;\n  };\n\n  return Button;\n\n})(SimpleModule);\n\nSimditor.Button = Button;\n\nvar Popover,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nPopover = (function(_super) {\n  __extends(Popover, _super);\n\n  Popover.prototype.offset = {\n    top: 4,\n    left: 0\n  };\n\n  Popover.prototype.target = null;\n\n  Popover.prototype.active = false;\n\n  function Popover(opts) {\n    this.button = opts.button;\n    this.editor = opts.button.editor;\n    Popover.__super__.constructor.call(this, opts);\n  }\n\n  Popover.prototype._init = function() {\n    this.el = $('<div class=\"simditor-popover\"></div>').appendTo(this.editor.el).data('popover', this);\n    this.render();\n    this.el.on('mouseenter', (function(_this) {\n      return function(e) {\n        return _this.el.addClass('hover');\n      };\n    })(this));\n    return this.el.on('mouseleave', (function(_this) {\n      return function(e) {\n        return _this.el.removeClass('hover');\n      };\n    })(this));\n  };\n\n  Popover.prototype.render = function() {};\n\n  Popover.prototype.show = function($target, position) {\n    if (position == null) {\n      position = 'bottom';\n    }\n    if ($target == null) {\n      return;\n    }\n    this.el.siblings('.simditor-popover').each((function(_this) {\n      return function(i, popover) {\n        popover = $(popover).data('popover');\n        if (popover.active) {\n          return popover.hide();\n        }\n      };\n    })(this));\n    this.target = $target.addClass('selected');\n    if (this.active) {\n      this.refresh(position);\n      return this.trigger('popovershow');\n    } else {\n      this.active = true;\n      this.el.css({\n        left: -9999\n      }).show();\n      return setTimeout((function(_this) {\n        return function() {\n          _this.refresh(position);\n          return _this.trigger('popovershow');\n        };\n      })(this), 0);\n    }\n  };\n\n  Popover.prototype.hide = function() {\n    if (!this.active) {\n      return;\n    }\n    if (this.target) {\n      this.target.removeClass('selected');\n    }\n    this.target = null;\n    this.active = false;\n    this.el.hide();\n    return this.trigger('popoverhide');\n  };\n\n  Popover.prototype.refresh = function(position) {\n    var editorOffset, left, targetH, targetOffset, top;\n    if (position == null) {\n      position = 'bottom';\n    }\n    if (!this.active) {\n      return;\n    }\n    editorOffset = this.editor.el.offset();\n    targetOffset = this.target.offset();\n    targetH = this.target.outerHeight();\n    if (position === 'bottom') {\n      top = targetOffset.top - editorOffset.top + targetH;\n    } else if (position === 'top') {\n      top = targetOffset.top - editorOffset.top - this.el.height();\n    }\n    left = Math.min(targetOffset.left - editorOffset.left, this.editor.wrapper.width() - this.el.outerWidth() - 10);\n    return this.el.css({\n      top: top + this.offset.top,\n      left: left + this.offset.left\n    });\n  };\n\n  Popover.prototype.destroy = function() {\n    this.target = null;\n    this.active = false;\n    this.editor.off('.linkpopover');\n    return this.el.remove();\n  };\n\n  return Popover;\n\n})(SimpleModule);\n\nSimditor.Popover = Popover;\n\nvar TitleButton,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nTitleButton = (function(_super) {\n  __extends(TitleButton, _super);\n\n  function TitleButton() {\n    return TitleButton.__super__.constructor.apply(this, arguments);\n  }\n\n  TitleButton.prototype.name = 'title';\n\n  TitleButton.prototype.htmlTag = 'h1, h2, h3, h4';\n\n  TitleButton.prototype.disableTag = 'pre, table';\n\n  TitleButton.prototype._init = function() {\n    this.menu = [\n      {\n        name: 'normal',\n        text: this._t('normalText'),\n        param: 'p'\n      }, '|', {\n        name: 'h1',\n        text: this._t('title') + ' 1',\n        param: 'h1'\n      }, {\n        name: 'h2',\n        text: this._t('title') + ' 2',\n        param: 'h2'\n      }, {\n        name: 'h3',\n        text: this._t('title') + ' 3',\n        param: 'h3'\n      }, {\n        name: 'h4',\n        text: this._t('title') + ' 4',\n        param: 'h4'\n      }, {\n        name: 'h5',\n        text: this._t('title') + ' 5',\n        param: 'h5'\n      }\n    ];\n    return TitleButton.__super__._init.call(this);\n  };\n\n  TitleButton.prototype.setActive = function(active, param) {\n    TitleButton.__super__.setActive.call(this, active);\n    this.el.removeClass('active-p active-h1 active-h2 active-h3');\n    if (active) {\n      return this.el.addClass('active active-' + param);\n    }\n  };\n\n  TitleButton.prototype.status = function($node) {\n    var param, _ref;\n    if ($node != null) {\n      this.setDisabled($node.is(this.disableTag));\n    }\n    if (this.disabled) {\n      return true;\n    }\n    if ($node != null) {\n      param = (_ref = $node[0].tagName) != null ? _ref.toLowerCase() : void 0;\n      this.setActive($node.is(this.htmlTag), param);\n    }\n    return this.active;\n  };\n\n  TitleButton.prototype.command = function(param) {\n    var $contents, $endBlock, $startBlock, endNode, node, range, results, startNode, _i, _len, _ref;\n    range = this.editor.selection.getRange();\n    startNode = range.startContainer;\n    endNode = range.endContainer;\n    $startBlock = this.editor.util.closestBlockEl(startNode);\n    $endBlock = this.editor.util.closestBlockEl(endNode);\n    this.editor.selection.save();\n    range.setStartBefore($startBlock[0]);\n    range.setEndAfter($endBlock[0]);\n    $contents = $(range.extractContents());\n    results = [];\n    $contents.children().each((function(_this) {\n      return function(i, el) {\n        var c, converted, _i, _len, _results;\n        converted = _this._convertEl(el, param);\n        _results = [];\n        for (_i = 0, _len = converted.length; _i < _len; _i++) {\n          c = converted[_i];\n          _results.push(results.push(c));\n        }\n        return _results;\n      };\n    })(this));\n    _ref = results.reverse();\n    for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n      node = _ref[_i];\n      range.insertNode(node[0]);\n    }\n    this.editor.selection.restore();\n    return this.editor.trigger('valuechanged');\n  };\n\n  TitleButton.prototype._convertEl = function(el, param) {\n    var $block, $el, results;\n    $el = $(el);\n    results = [];\n    if ($el.is(param)) {\n      results.push($el);\n    } else {\n      $block = $('<' + param + '/>').append($el.contents());\n      results.push($block);\n    }\n    return results;\n  };\n\n  return TitleButton;\n\n})(Button);\n\nSimditor.Toolbar.addButton(TitleButton);\n\nvar BoldButton,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nBoldButton = (function(_super) {\n  __extends(BoldButton, _super);\n\n  function BoldButton() {\n    return BoldButton.__super__.constructor.apply(this, arguments);\n  }\n\n  BoldButton.prototype.name = 'bold';\n\n  BoldButton.prototype.icon = 'bold';\n\n  BoldButton.prototype.htmlTag = 'b, strong';\n\n  BoldButton.prototype.disableTag = 'pre';\n\n  BoldButton.prototype.shortcut = 'cmd+b';\n\n  BoldButton.prototype._init = function() {\n    if (this.editor.util.os.mac) {\n      this.title = this.title + ' ( Cmd + b )';\n    } else {\n      this.title = this.title + ' ( Ctrl + b )';\n      this.shortcut = 'ctrl+b';\n    }\n    return BoldButton.__super__._init.call(this);\n  };\n\n  BoldButton.prototype.status = function($node) {\n    var active;\n    if ($node != null) {\n      this.setDisabled($node.is(this.disableTag));\n    }\n    if (this.disabled) {\n      return true;\n    }\n    active = document.queryCommandState('bold') === true;\n    this.setActive(active);\n    return active;\n  };\n\n  BoldButton.prototype.command = function() {\n    document.execCommand('bold');\n    this.editor.trigger('valuechanged');\n    return $(document).trigger('selectionchange');\n  };\n\n  return BoldButton;\n\n})(Button);\n\nSimditor.Toolbar.addButton(BoldButton);\n\nvar ItalicButton,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nItalicButton = (function(_super) {\n  __extends(ItalicButton, _super);\n\n  function ItalicButton() {\n    return ItalicButton.__super__.constructor.apply(this, arguments);\n  }\n\n  ItalicButton.prototype.name = 'italic';\n\n  ItalicButton.prototype.icon = 'italic';\n\n  ItalicButton.prototype.htmlTag = 'i';\n\n  ItalicButton.prototype.disableTag = 'pre';\n\n  ItalicButton.prototype.shortcut = 'cmd+i';\n\n  ItalicButton.prototype._init = function() {\n    if (this.editor.util.os.mac) {\n      this.title = this.title + ' ( Cmd + i )';\n    } else {\n      this.title = this.title + ' ( Ctrl + i )';\n      this.shortcut = 'ctrl+i';\n    }\n    return ItalicButton.__super__._init.call(this);\n  };\n\n  ItalicButton.prototype.status = function($node) {\n    var active;\n    if ($node != null) {\n      this.setDisabled($node.is(this.disableTag));\n    }\n    if (this.disabled) {\n      return this.disabled;\n    }\n    active = document.queryCommandState('italic') === true;\n    this.setActive(active);\n    return active;\n  };\n\n  ItalicButton.prototype.command = function() {\n    document.execCommand('italic');\n    this.editor.trigger('valuechanged');\n    return $(document).trigger('selectionchange');\n  };\n\n  return ItalicButton;\n\n})(Button);\n\nSimditor.Toolbar.addButton(ItalicButton);\n\nvar UnderlineButton,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nUnderlineButton = (function(_super) {\n  __extends(UnderlineButton, _super);\n\n  function UnderlineButton() {\n    return UnderlineButton.__super__.constructor.apply(this, arguments);\n  }\n\n  UnderlineButton.prototype.name = 'underline';\n\n  UnderlineButton.prototype.icon = 'underline';\n\n  UnderlineButton.prototype.htmlTag = 'u';\n\n  UnderlineButton.prototype.disableTag = 'pre';\n\n  UnderlineButton.prototype.shortcut = 'cmd+u';\n\n  UnderlineButton.prototype.render = function() {\n    if (this.editor.util.os.mac) {\n      this.title = this.title + ' ( Cmd + u )';\n    } else {\n      this.title = this.title + ' ( Ctrl + u )';\n      this.shortcut = 'ctrl+u';\n    }\n    return UnderlineButton.__super__.render.call(this);\n  };\n\n  UnderlineButton.prototype.status = function($node) {\n    var active;\n    if ($node != null) {\n      this.setDisabled($node.is(this.disableTag));\n    }\n    if (this.disabled) {\n      return this.disabled;\n    }\n    active = document.queryCommandState('underline') === true;\n    this.setActive(active);\n    return active;\n  };\n\n  UnderlineButton.prototype.command = function() {\n    document.execCommand('underline');\n    this.editor.trigger('valuechanged');\n    return $(document).trigger('selectionchange');\n  };\n\n  return UnderlineButton;\n\n})(Button);\n\nSimditor.Toolbar.addButton(UnderlineButton);\n\nvar ColorButton,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  __slice = [].slice;\n\nColorButton = (function(_super) {\n  __extends(ColorButton, _super);\n\n  function ColorButton() {\n    return ColorButton.__super__.constructor.apply(this, arguments);\n  }\n\n  ColorButton.prototype.name = 'color';\n\n  ColorButton.prototype.icon = 'font';\n\n  ColorButton.prototype.disableTag = 'pre';\n\n  ColorButton.prototype.menu = true;\n\n  ColorButton.prototype.render = function() {\n    var args;\n    args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n    return ColorButton.__super__.render.apply(this, args);\n  };\n\n  ColorButton.prototype.renderMenu = function() {\n    $('<ul class=\"color-list\">\\n  <li><a href=\"javascript:;\" class=\"font-color font-color-1\" data-color=\"\"></a></li>\\n  <li><a href=\"javascript:;\" class=\"font-color font-color-2\" data-color=\"\"></a></li>\\n  <li><a href=\"javascript:;\" class=\"font-color font-color-3\" data-color=\"\"></a></li>\\n  <li><a href=\"javascript:;\" class=\"font-color font-color-4\" data-color=\"\"></a></li>\\n  <li><a href=\"javascript:;\" class=\"font-color font-color-5\" data-color=\"\"></a></li>\\n  <li><a href=\"javascript:;\" class=\"font-color font-color-6\" data-color=\"\"></a></li>\\n  <li><a href=\"javascript:;\" class=\"font-color font-color-7\" data-color=\"\"></a></li>\\n  <li><a href=\"javascript:;\" class=\"font-color font-color-default\" data-color=\"\"></a></li>\\n</ul>').appendTo(this.menuWrapper);\n    this.menuWrapper.on('mousedown', '.color-list', function(e) {\n      return false;\n    });\n    return this.menuWrapper.on('click', '.font-color', (function(_this) {\n      return function(e) {\n        var $link, $p, hex, rgb;\n        _this.wrapper.removeClass('menu-on');\n        $link = $(e.currentTarget);\n        if ($link.hasClass('font-color-default')) {\n          $p = _this.editor.body.find('p, li');\n          if (!($p.length > 0)) {\n            return;\n          }\n          rgb = window.getComputedStyle($p[0], null).getPropertyValue('color');\n          hex = _this._convertRgbToHex(rgb);\n        } else {\n          rgb = window.getComputedStyle($link[0], null).getPropertyValue('background-color');\n          hex = _this._convertRgbToHex(rgb);\n        }\n        if (!hex) {\n          return;\n        }\n        document.execCommand('foreColor', false, hex);\n        return _this.editor.trigger('valuechanged');\n      };\n    })(this));\n  };\n\n  ColorButton.prototype._convertRgbToHex = function(rgb) {\n    var match, re, rgbToHex;\n    re = /rgb\\((\\d+),\\s?(\\d+),\\s?(\\d+)\\)/g;\n    match = re.exec(rgb);\n    if (!match) {\n      return '';\n    }\n    rgbToHex = function(r, g, b) {\n      var componentToHex;\n      componentToHex = function(c) {\n        var hex;\n        hex = c.toString(16);\n        if (hex.length === 1) {\n          return '0' + hex;\n        } else {\n          return hex;\n        }\n      };\n      return \"#\" + componentToHex(r) + componentToHex(g) + componentToHex(b);\n    };\n    return rgbToHex(match[1] * 1, match[2] * 1, match[3] * 1);\n  };\n\n  return ColorButton;\n\n})(Button);\n\nSimditor.Toolbar.addButton(ColorButton);\n\nvar ListButton, OrderListButton, UnorderListButton,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nListButton = (function(_super) {\n  __extends(ListButton, _super);\n\n  function ListButton() {\n    return ListButton.__super__.constructor.apply(this, arguments);\n  }\n\n  ListButton.prototype.type = '';\n\n  ListButton.prototype.disableTag = 'pre, table';\n\n  ListButton.prototype.status = function($node) {\n    var anotherType;\n    if ($node != null) {\n      this.setDisabled($node.is(this.disableTag));\n    }\n    if (this.disabled) {\n      return true;\n    }\n    if ($node == null) {\n      return this.active;\n    }\n    anotherType = this.type === 'ul' ? 'ol' : 'ul';\n    if ($node.is(anotherType)) {\n      this.setActive(false);\n      return true;\n    } else {\n      this.setActive($node.is(this.htmlTag));\n      return this.active;\n    }\n  };\n\n  ListButton.prototype.command = function(param) {\n    var $contents, $endBlock, $furthestEnd, $furthestStart, $parent, $startBlock, endLevel, endNode, getListLevel, node, range, results, startLevel, startNode, _i, _len, _ref;\n    range = this.editor.selection.getRange();\n    startNode = range.startContainer;\n    endNode = range.endContainer;\n    $startBlock = this.editor.util.closestBlockEl(startNode);\n    $endBlock = this.editor.util.closestBlockEl(endNode);\n    this.editor.selection.save();\n    range.setStartBefore($startBlock[0]);\n    range.setEndAfter($endBlock[0]);\n    if ($startBlock.is('li') && $endBlock.is('li')) {\n      $furthestStart = this.editor.util.furthestNode($startBlock, 'ul, ol');\n      $furthestEnd = this.editor.util.furthestNode($endBlock, 'ul, ol');\n      if ($furthestStart.is($furthestEnd)) {\n        getListLevel = function($li) {\n          var lvl;\n          lvl = 1;\n          while (!$li.parent().is($furthestStart)) {\n            lvl += 1;\n            $li = $li.parent();\n          }\n          return lvl;\n        };\n        startLevel = getListLevel($startBlock);\n        endLevel = getListLevel($endBlock);\n        if (startLevel > endLevel) {\n          $parent = $endBlock.parent();\n        } else {\n          $parent = $startBlock.parent();\n        }\n        range.setStartBefore($parent[0]);\n        range.setEndAfter($parent[0]);\n      } else {\n        range.setStartBefore($furthestStart[0]);\n        range.setEndAfter($furthestEnd[0]);\n      }\n    }\n    $contents = $(range.extractContents());\n    results = [];\n    $contents.children().each((function(_this) {\n      return function(i, el) {\n        var c, converted, _i, _len, _results;\n        converted = _this._convertEl(el);\n        _results = [];\n        for (_i = 0, _len = converted.length; _i < _len; _i++) {\n          c = converted[_i];\n          if (results.length && results[results.length - 1].is(_this.type) && c.is(_this.type)) {\n            _results.push(results[results.length - 1].append(c.children()));\n          } else {\n            _results.push(results.push(c));\n          }\n        }\n        return _results;\n      };\n    })(this));\n    _ref = results.reverse();\n    for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n      node = _ref[_i];\n      range.insertNode(node[0]);\n    }\n    this.editor.selection.restore();\n    return this.editor.trigger('valuechanged');\n  };\n\n  ListButton.prototype._convertEl = function(el) {\n    var $el, anotherType, block, child, children, results, _i, _len, _ref;\n    $el = $(el);\n    results = [];\n    anotherType = this.type === 'ul' ? 'ol' : 'ul';\n    if ($el.is(this.type)) {\n      $el.children('li').each((function(_this) {\n        return function(i, li) {\n          var $childList, $li, block;\n          $li = $(li);\n          $childList = $li.children('ul, ol').remove();\n          block = $('<p/>').append($(li).html() || _this.editor.util.phBr);\n          results.push(block);\n          if ($childList.length > 0) {\n            return results.push($childList);\n          }\n        };\n      })(this));\n    } else if ($el.is(anotherType)) {\n      block = $('<' + this.type + '/>').append($el.html());\n      results.push(block);\n    } else if ($el.is('blockquote')) {\n      _ref = $el.children().get();\n      for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n        child = _ref[_i];\n        children = this._convertEl(child);\n      }\n      $.merge(results, children);\n    } else if ($el.is('table')) {\n\n    } else {\n      block = $('<' + this.type + '><li></li></' + this.type + '>');\n      block.find('li').append($el.html() || this.editor.util.phBr);\n      results.push(block);\n    }\n    return results;\n  };\n\n  return ListButton;\n\n})(Button);\n\nOrderListButton = (function(_super) {\n  __extends(OrderListButton, _super);\n\n  function OrderListButton() {\n    return OrderListButton.__super__.constructor.apply(this, arguments);\n  }\n\n  OrderListButton.prototype.type = 'ol';\n\n  OrderListButton.prototype.name = 'ol';\n\n  OrderListButton.prototype.icon = 'list-ol';\n\n  OrderListButton.prototype.htmlTag = 'ol';\n\n  OrderListButton.prototype.shortcut = 'cmd+/';\n\n  OrderListButton.prototype._init = function() {\n    if (this.editor.util.os.mac) {\n      this.title = this.title + ' ( Cmd + / )';\n    } else {\n      this.title = this.title + ' ( ctrl + / )';\n      this.shortcut = 'ctrl+/';\n    }\n    return OrderListButton.__super__._init.call(this);\n  };\n\n  return OrderListButton;\n\n})(ListButton);\n\nUnorderListButton = (function(_super) {\n  __extends(UnorderListButton, _super);\n\n  function UnorderListButton() {\n    return UnorderListButton.__super__.constructor.apply(this, arguments);\n  }\n\n  UnorderListButton.prototype.type = 'ul';\n\n  UnorderListButton.prototype.name = 'ul';\n\n  UnorderListButton.prototype.icon = 'list-ul';\n\n  UnorderListButton.prototype.htmlTag = 'ul';\n\n  UnorderListButton.prototype.shortcut = 'cmd+.';\n\n  UnorderListButton.prototype._init = function() {\n    if (this.editor.util.os.mac) {\n      this.title = this.title + ' ( Cmd + . )';\n    } else {\n      this.title = this.title + ' ( Ctrl + . )';\n      this.shortcut = 'ctrl+.';\n    }\n    return UnorderListButton.__super__._init.call(this);\n  };\n\n  return UnorderListButton;\n\n})(ListButton);\n\nSimditor.Toolbar.addButton(OrderListButton);\n\nSimditor.Toolbar.addButton(UnorderListButton);\n\nvar BlockquoteButton,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nBlockquoteButton = (function(_super) {\n  __extends(BlockquoteButton, _super);\n\n  function BlockquoteButton() {\n    return BlockquoteButton.__super__.constructor.apply(this, arguments);\n  }\n\n  BlockquoteButton.prototype.name = 'blockquote';\n\n  BlockquoteButton.prototype.icon = 'quote-left';\n\n  BlockquoteButton.prototype.htmlTag = 'blockquote';\n\n  BlockquoteButton.prototype.disableTag = 'pre, table';\n\n  BlockquoteButton.prototype.command = function() {\n    var $contents, $endBlock, $startBlock, endNode, node, range, results, startNode, _i, _len, _ref;\n    range = this.editor.selection.getRange();\n    startNode = range.startContainer;\n    endNode = range.endContainer;\n    $startBlock = this.editor.util.furthestBlockEl(startNode);\n    $endBlock = this.editor.util.furthestBlockEl(endNode);\n    this.editor.selection.save();\n    range.setStartBefore($startBlock[0]);\n    range.setEndAfter($endBlock[0]);\n    $contents = $(range.extractContents());\n    results = [];\n    $contents.children().each((function(_this) {\n      return function(i, el) {\n        var c, converted, _i, _len, _results;\n        converted = _this._convertEl(el);\n        _results = [];\n        for (_i = 0, _len = converted.length; _i < _len; _i++) {\n          c = converted[_i];\n          if (results.length && results[results.length - 1].is(_this.htmlTag) && c.is(_this.htmlTag)) {\n            _results.push(results[results.length - 1].append(c.children()));\n          } else {\n            _results.push(results.push(c));\n          }\n        }\n        return _results;\n      };\n    })(this));\n    _ref = results.reverse();\n    for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n      node = _ref[_i];\n      range.insertNode(node[0]);\n    }\n    this.editor.selection.restore();\n    return this.editor.trigger('valuechanged');\n  };\n\n  BlockquoteButton.prototype._convertEl = function(el) {\n    var $el, block, results;\n    $el = $(el);\n    results = [];\n    if ($el.is(this.htmlTag)) {\n      $el.children().each((function(_this) {\n        return function(i, node) {\n          return results.push($(node));\n        };\n      })(this));\n    } else {\n      block = $('<' + this.htmlTag + '/>').append($el);\n      results.push(block);\n    }\n    return results;\n  };\n\n  return BlockquoteButton;\n\n})(Button);\n\nSimditor.Toolbar.addButton(BlockquoteButton);\n\nvar CodeButton, CodePopover,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  __slice = [].slice;\n\nCodeButton = (function(_super) {\n  __extends(CodeButton, _super);\n\n  function CodeButton() {\n    return CodeButton.__super__.constructor.apply(this, arguments);\n  }\n\n  CodeButton.prototype.name = 'code';\n\n  CodeButton.prototype.icon = 'code';\n\n  CodeButton.prototype.htmlTag = 'pre';\n\n  CodeButton.prototype.disableTag = 'li, table';\n\n  CodeButton.prototype._init = function() {\n    CodeButton.__super__._init.call(this);\n    this.editor.on('decorate', (function(_this) {\n      return function(e, $el) {\n        return $el.find('pre').each(function(i, pre) {\n          return _this.decorate($(pre));\n        });\n      };\n    })(this));\n    return this.editor.on('undecorate', (function(_this) {\n      return function(e, $el) {\n        return $el.find('pre').each(function(i, pre) {\n          return _this.undecorate($(pre));\n        });\n      };\n    })(this));\n  };\n\n  CodeButton.prototype.render = function() {\n    var args;\n    args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n    CodeButton.__super__.render.apply(this, args);\n    return this.popover = new CodePopover({\n      button: this\n    });\n  };\n\n  CodeButton.prototype.status = function($node) {\n    var result;\n    result = CodeButton.__super__.status.call(this, $node);\n    if (this.active) {\n      this.popover.show($node);\n    } else if (this.editor.util.isBlockNode($node)) {\n      this.popover.hide();\n    }\n    return result;\n  };\n\n  CodeButton.prototype.decorate = function($pre) {\n    var lang;\n    lang = $pre.attr('data-lang');\n    $pre.removeClass();\n    if (lang && lang !== -1) {\n      return $pre.addClass('lang-' + lang);\n    }\n  };\n\n  CodeButton.prototype.undecorate = function($pre) {\n    var lang;\n    lang = $pre.attr('data-lang');\n    $pre.removeClass();\n    if (lang && lang !== -1) {\n      return $pre.addClass('lang-' + lang);\n    }\n  };\n\n  CodeButton.prototype.command = function() {\n    var $contents, $endBlock, $startBlock, endNode, node, range, results, startNode, _i, _len, _ref;\n    range = this.editor.selection.getRange();\n    startNode = range.startContainer;\n    endNode = range.endContainer;\n    $startBlock = this.editor.util.closestBlockEl(startNode);\n    $endBlock = this.editor.util.closestBlockEl(endNode);\n    range.setStartBefore($startBlock[0]);\n    range.setEndAfter($endBlock[0]);\n    $contents = $(range.extractContents());\n    results = [];\n    $contents.children().each((function(_this) {\n      return function(i, el) {\n        var c, converted, _i, _len, _results;\n        converted = _this._convertEl(el);\n        _results = [];\n        for (_i = 0, _len = converted.length; _i < _len; _i++) {\n          c = converted[_i];\n          if (results.length && results[results.length - 1].is(_this.htmlTag) && c.is(_this.htmlTag)) {\n            _results.push(results[results.length - 1].append(c.contents()));\n          } else {\n            _results.push(results.push(c));\n          }\n        }\n        return _results;\n      };\n    })(this));\n    _ref = results.reverse();\n    for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n      node = _ref[_i];\n      range.insertNode(node[0]);\n    }\n    this.editor.selection.setRangeAtEndOf(results[0]);\n    return this.editor.trigger('valuechanged');\n  };\n\n  CodeButton.prototype._convertEl = function(el) {\n    var $el, block, codeStr, results;\n    $el = $(el);\n    results = [];\n    if ($el.is(this.htmlTag)) {\n      block = $('<p/>').append($el.html().replace('\\n', '<br/>'));\n      results.push(block);\n    } else {\n      if (!$el.text() && $el.children().length === 1 && $el.children().is('br')) {\n        codeStr = '\\n';\n      } else {\n        codeStr = this.editor.formatter.clearHtml($el);\n      }\n      block = $('<' + this.htmlTag + '/>').text(codeStr);\n      results.push(block);\n    }\n    return results;\n  };\n\n  return CodeButton;\n\n})(Button);\n\nCodePopover = (function(_super) {\n  __extends(CodePopover, _super);\n\n  function CodePopover() {\n    return CodePopover.__super__.constructor.apply(this, arguments);\n  }\n\n  CodePopover.prototype._tpl = \"<div class=\\\"code-settings\\\">\\n  <div class=\\\"settings-field\\\">\\n    <select class=\\\"select-lang\\\">\\n      <option value=\\\"-1\\\">选择程序语言</option>\\n      <option value=\\\"bash\\\">Bash</option>\\n      <option value=\\\"c++\\\">C++</option>\\n      <option value=\\\"cs\\\">C#</option>\\n      <option value=\\\"css\\\">CSS</option>\\n      <option value=\\\"erlang\\\">Erlang</option>\\n      <option value=\\\"less\\\">Less</option>\\n      <option value=\\\"scss\\\">Sass</option>\\n      <option value=\\\"diff\\\">Diff</option>\\n      <option value=\\\"coffeeScript\\\">CoffeeScript</option>\\n      <option value=\\\"html\\\">Html,XML</option>\\n      <option value=\\\"json\\\">JSON</option>\\n      <option value=\\\"java\\\">Java</option>\\n      <option value=\\\"js\\\">JavaScript</option>\\n      <option value=\\\"markdown\\\">Markdown</option>\\n      <option value=\\\"oc\\\">Objective C</option>\\n      <option value=\\\"php\\\">PHP</option>\\n      <option value=\\\"perl\\\">Perl</option>\\n      <option value=\\\"python\\\">Python</option>\\n      <option value=\\\"ruby\\\">Ruby</option>\\n      <option value=\\\"sql\\\">SQL</option>\\n    </select>\\n  </div>\\n</div>\";\n\n  CodePopover.prototype.render = function() {\n    this.el.addClass('code-popover').append(this._tpl);\n    this.selectEl = this.el.find('.select-lang');\n    return this.selectEl.on('change', (function(_this) {\n      return function(e) {\n        var selected;\n        _this.lang = _this.selectEl.val();\n        selected = _this.target.hasClass('selected');\n        _this.target.removeClass().removeAttr('data-lang');\n        if (_this.lang !== -1) {\n          _this.target.addClass('lang-' + _this.lang);\n          _this.target.attr('data-lang', _this.lang);\n        }\n        if (selected) {\n          return _this.target.addClass('selected');\n        }\n      };\n    })(this));\n  };\n\n  CodePopover.prototype.show = function() {\n    var args;\n    args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n    CodePopover.__super__.show.apply(this, args);\n    this.lang = this.target.attr('data-lang');\n    if (this.lang != null) {\n      return this.selectEl.val(this.lang);\n    } else {\n      return this.selectEl.val(-1);\n    }\n  };\n\n  return CodePopover;\n\n})(Popover);\n\nSimditor.Toolbar.addButton(CodeButton);\n\nvar LinkButton, LinkPopover,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  __slice = [].slice;\n\nLinkButton = (function(_super) {\n  __extends(LinkButton, _super);\n\n  function LinkButton() {\n    return LinkButton.__super__.constructor.apply(this, arguments);\n  }\n\n  LinkButton.prototype.name = 'link';\n\n  LinkButton.prototype.icon = 'link';\n\n  LinkButton.prototype.htmlTag = 'a';\n\n  LinkButton.prototype.disableTag = 'pre';\n\n  LinkButton.prototype.render = function() {\n    var args;\n    args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n    LinkButton.__super__.render.apply(this, args);\n    return this.popover = new LinkPopover({\n      button: this\n    });\n  };\n\n  LinkButton.prototype.status = function($node) {\n    var showPopover;\n    if ($node != null) {\n      this.setDisabled($node.is(this.disableTag));\n    }\n    if (this.disabled) {\n      return true;\n    }\n    if ($node == null) {\n      return this.active;\n    }\n    showPopover = true;\n    if (!$node.is(this.htmlTag) || $node.is('[class^=\"simditor-\"]')) {\n      this.setActive(false);\n      showPopover = false;\n    } else if (this.editor.selection.rangeAtEndOf($node)) {\n      this.setActive(true);\n      showPopover = false;\n    } else {\n      this.setActive(true);\n    }\n    if (showPopover) {\n      this.popover.show($node);\n    } else if (this.editor.util.isBlockNode($node)) {\n      this.popover.hide();\n    }\n    return this.active;\n  };\n\n  LinkButton.prototype.command = function() {\n    var $contents, $endBlock, $link, $newBlock, $startBlock, endNode, linkText, range, startNode, txtNode;\n    range = this.editor.selection.getRange();\n    if (this.active) {\n      $link = $(range.commonAncestorContainer).closest('a');\n      txtNode = document.createTextNode($link.text());\n      $link.replaceWith(txtNode);\n      range.selectNode(txtNode);\n    } else {\n      startNode = range.startContainer;\n      endNode = range.endContainer;\n      $startBlock = this.editor.util.closestBlockEl(startNode);\n      $endBlock = this.editor.util.closestBlockEl(endNode);\n      $contents = $(range.extractContents());\n      linkText = this.editor.formatter.clearHtml($contents.contents(), false);\n      $link = $('<a/>', {\n        href: 'http://www.example.com',\n        target: '_blank',\n        text: linkText || this._t('linkText')\n      });\n      if ($startBlock[0] === $endBlock[0]) {\n        range.insertNode($link[0]);\n      } else {\n        $newBlock = $('<p/>').append($link);\n        range.insertNode($newBlock[0]);\n      }\n      range.selectNodeContents($link[0]);\n      this.popover.one('popovershow', (function(_this) {\n        return function() {\n          if (linkText) {\n            _this.popover.urlEl.focus();\n            return _this.popover.urlEl[0].select();\n          } else {\n            _this.popover.textEl.focus();\n            return _this.popover.textEl[0].select();\n          }\n        };\n      })(this));\n    }\n    this.editor.selection.selectRange(range);\n    return this.editor.trigger('valuechanged');\n  };\n\n  return LinkButton;\n\n})(Button);\n\nLinkPopover = (function(_super) {\n  __extends(LinkPopover, _super);\n\n  function LinkPopover() {\n    return LinkPopover.__super__.constructor.apply(this, arguments);\n  }\n\n  LinkPopover.prototype.render = function() {\n    var tpl;\n    tpl = \"<div class=\\\"link-settings\\\">\\n  <div class=\\\"settings-field\\\">\\n    <label>\" + (this._t('text')) + \"</label>\\n    <input class=\\\"link-text\\\" type=\\\"text\\\"/>\\n    <a class=\\\"btn-unlink\\\" href=\\\"javascript:;\\\" title=\\\"\" + (this._t('removeLink')) + \"\\\" tabindex=\\\"-1\\\"><span class=\\\"fa fa-unlink\\\"></span></a>\\n  </div>\\n  <div class=\\\"settings-field\\\">\\n    <label>\" + (this._t('linkUrl')) + \"</label>\\n    <input class=\\\"link-url\\\" type=\\\"text\\\"/>\\n  </div>\\n</div>\";\n    this.el.addClass('link-popover').append(tpl);\n    this.textEl = this.el.find('.link-text');\n    this.urlEl = this.el.find('.link-url');\n    this.unlinkEl = this.el.find('.btn-unlink');\n    this.textEl.on('keyup', (function(_this) {\n      return function(e) {\n        if (e.which === 13) {\n          return;\n        }\n        return _this.target.text(_this.textEl.val());\n      };\n    })(this));\n    this.urlEl.on('keyup', (function(_this) {\n      return function(e) {\n        var val;\n        if (e.which === 13) {\n          return;\n        }\n        val = _this.urlEl.val();\n        if (!(/https?:\\/\\/|^\\//ig.test(val) || !val)) {\n          val = 'http://' + val;\n        }\n        return _this.target.attr('href', val);\n      };\n    })(this));\n    $([this.urlEl[0], this.textEl[0]]).on('keydown', (function(_this) {\n      return function(e) {\n        if (e.which === 13 || e.which === 27 || (!e.shiftKey && e.which === 9 && $(e.target).hasClass('link-url'))) {\n          e.preventDefault();\n          return setTimeout(function() {\n            var range;\n            range = document.createRange();\n            _this.editor.selection.setRangeAfter(_this.target, range);\n            _this.hide();\n            return _this.editor.trigger('valuechanged');\n          }, 0);\n        }\n      };\n    })(this));\n    return this.unlinkEl.on('click', (function(_this) {\n      return function(e) {\n        var range, txtNode;\n        txtNode = document.createTextNode(_this.target.text());\n        _this.target.replaceWith(txtNode);\n        _this.hide();\n        range = document.createRange();\n        _this.editor.selection.setRangeAfter(txtNode, range);\n        return _this.editor.trigger('valuechanged');\n      };\n    })(this));\n  };\n\n  LinkPopover.prototype.show = function() {\n    var args;\n    args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n    LinkPopover.__super__.show.apply(this, args);\n    this.textEl.val(this.target.text());\n    return this.urlEl.val(this.target.attr('href'));\n  };\n\n  return LinkPopover;\n\n})(Popover);\n\nSimditor.Toolbar.addButton(LinkButton);\n\nvar ImageButton, ImagePopover,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  __slice = [].slice;\n\nImageButton = (function(_super) {\n  __extends(ImageButton, _super);\n\n  function ImageButton() {\n    return ImageButton.__super__.constructor.apply(this, arguments);\n  }\n\n  ImageButton.prototype.name = 'image';\n\n  ImageButton.prototype.icon = 'picture-o';\n\n  ImageButton.prototype.htmlTag = 'img';\n\n  ImageButton.prototype.disableTag = 'pre, table';\n\n  ImageButton.prototype.defaultImage = '';\n\n  ImageButton.prototype.needFocus = false;\n\n  ImageButton.prototype._init = function() {\n    if (this.editor.uploader != null) {\n      this.menu = [\n        {\n          name: 'upload-image',\n          text: this._t('localImage')\n        }, {\n          name: 'external-image',\n          text: this._t('externalImage')\n        }\n      ];\n    } else {\n      this.menu = false;\n    }\n    this.defaultImage = this.editor.opts.defaultImage;\n    this.editor.body.on('click', 'img:not([data-non-image])', (function(_this) {\n      return function(e) {\n        var $img, range;\n        $img = $(e.currentTarget);\n        range = document.createRange();\n        range.selectNode($img[0]);\n        _this.editor.selection.selectRange(range);\n        if (!_this.editor.util.supportSelectionChange) {\n          _this.editor.trigger('selectionchanged');\n        }\n        return false;\n      };\n    })(this));\n    this.editor.body.on('mouseup', 'img:not([data-non-image])', (function(_this) {\n      return function(e) {\n        return false;\n      };\n    })(this));\n    this.editor.on('selectionchanged.image', (function(_this) {\n      return function() {\n        var $contents, $img, range;\n        range = _this.editor.selection.getRange();\n        if (range == null) {\n          return;\n        }\n        $contents = $(range.cloneContents()).contents();\n        if ($contents.length === 1 && $contents.is('img:not([data-non-image])')) {\n          $img = $(range.startContainer).contents().eq(range.startOffset);\n          return _this.popover.show($img);\n        } else {\n          return _this.popover.hide();\n        }\n      };\n    })(this));\n    this.editor.on('valuechanged.image', (function(_this) {\n      return function() {\n        var $masks;\n        $masks = _this.editor.wrapper.find('.simditor-image-loading');\n        if (!($masks.length > 0)) {\n          return;\n        }\n        return $masks.each(function(i, mask) {\n          var $img, $mask, file;\n          $mask = $(mask);\n          $img = $mask.data('img');\n          if (!($img && $img.parent().length > 0)) {\n            $mask.remove();\n            if ($img) {\n              file = $img.data('file');\n              if (file) {\n                _this.editor.uploader.cancel(file);\n                if (_this.editor.body.find('img.uploading').length < 1) {\n                  return _this.editor.uploader.trigger('uploadready', [file]);\n                }\n              }\n            }\n          }\n        });\n      };\n    })(this));\n    return ImageButton.__super__._init.call(this);\n  };\n\n  ImageButton.prototype.render = function() {\n    var args;\n    args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n    ImageButton.__super__.render.apply(this, args);\n    return this.popover = new ImagePopover({\n      button: this\n    });\n  };\n\n  ImageButton.prototype.renderMenu = function() {\n    var $input, $uploadItem, createInput;\n    ImageButton.__super__.renderMenu.call(this);\n    $uploadItem = this.menuEl.find('.menu-item-upload-image');\n    $input = null;\n    createInput = (function(_this) {\n      return function() {\n        if ($input) {\n          $input.remove();\n        }\n        return $input = $('<input type=\"file\" title=\"' + _this._t('uploadImage') + '\" accept=\"image/*\">').appendTo($uploadItem);\n      };\n    })(this);\n    createInput();\n    $uploadItem.on('click mousedown', 'input[type=file]', (function(_this) {\n      return function(e) {\n        return e.stopPropagation();\n      };\n    })(this));\n    $uploadItem.on('change', 'input[type=file]', (function(_this) {\n      return function(e) {\n        if (_this.editor.inputManager.focused) {\n          _this.editor.uploader.upload($input, {\n            inline: true\n          });\n          createInput();\n        } else {\n          _this.editor.one('focus', function(e) {\n            _this.editor.uploader.upload($input, {\n              inline: true\n            });\n            return createInput();\n          });\n          _this.editor.focus();\n        }\n        return _this.wrapper.removeClass('menu-on');\n      };\n    })(this));\n    return this._initUploader();\n  };\n\n  ImageButton.prototype._initUploader = function() {\n    if (this.editor.uploader == null) {\n      this.el.find('.btn-upload').remove();\n      return;\n    }\n    this.editor.uploader.on('beforeupload', (function(_this) {\n      return function(e, file) {\n        var $img;\n        if (!file.inline) {\n          return;\n        }\n        if (file.img) {\n          $img = $(file.img);\n        } else {\n          $img = _this.createImage(file.name);\n          file.img = $img;\n        }\n        $img.addClass('uploading');\n        $img.data('file', file);\n        return _this.editor.uploader.readImageFile(file.obj, function(img) {\n          var src;\n          if (!$img.hasClass('uploading')) {\n            return;\n          }\n          src = img ? img.src : _this.defaultImage;\n          return _this.loadImage($img, src, function() {\n            if (_this.popover.active) {\n              _this.popover.refresh();\n              return _this.popover.srcEl.val(_this._t('uploading')).prop('disabled', true);\n            }\n          });\n        });\n      };\n    })(this));\n    this.editor.uploader.on('uploadprogress', (function(_this) {\n      return function(e, file, loaded, total) {\n        var $img, $mask, $txt, percent;\n        if (!file.inline) {\n          return;\n        }\n        percent = loaded / total;\n        percent = (percent * 100).toFixed(0);\n        if (percent > 99) {\n          percent = 99;\n        }\n        $mask = file.img.data('mask');\n        if ($mask) {\n          $img = $mask.data('img');\n          $txt = $mask.find('span');\n          if ($img && $img.parent().length > 0 && percent !== $txt.text()) {\n            return $txt.text(percent);\n          } else {\n            return $mask.remove();\n          }\n        }\n      };\n    })(this));\n    this.editor.uploader.on('uploadsuccess', (function(_this) {\n      return function(e, file, result) {\n        var $img, $mask, msg;\n        if (!file.inline) {\n          return;\n        }\n        $img = file.img;\n        $img.removeData('file');\n        $img.removeClass('uploading');\n        $mask = $img.data('mask');\n        if ($mask) {\n          $mask.remove();\n        }\n        $img.removeData('mask');\n        if (result.success === false) {\n          msg = result.msg || _this._t('uploadFailed');\n          alert(msg);\n          $img.attr('src', _this.defaultImage);\n        } else {\n          $img.attr('src', result.file_path);\n        }\n        if (_this.popover.active) {\n          _this.popover.srcEl.prop('disabled', false);\n          _this.popover.srcEl.val(result.file_path);\n        }\n        _this.editor.trigger('valuechanged');\n        if (_this.editor.body.find('img.uploading').length < 1) {\n          return _this.editor.uploader.trigger('uploadready', [file, result]);\n        }\n      };\n    })(this));\n    return this.editor.uploader.on('uploaderror', (function(_this) {\n      return function(e, file, xhr) {\n        var $img, $mask, msg, result;\n        if (!file.inline) {\n          return;\n        }\n        if (xhr.statusText === 'abort') {\n          return;\n        }\n        if (xhr.responseText) {\n          try {\n            result = $.parseJSON(xhr.responseText);\n            msg = result.msg;\n          } catch (_error) {\n            e = _error;\n            msg = _this._t('uploadError');\n          }\n          alert(msg);\n        }\n        $img = file.img;\n        $img.removeData('file');\n        $img.removeClass('uploading');\n        $mask = $img.data('mask');\n        if ($mask) {\n          $mask.remove();\n        }\n        $img.removeData('mask');\n        $img.attr('src', _this.defaultImage);\n        if (_this.popover.active) {\n          _this.popover.srcEl.prop('disabled', false);\n          _this.popover.srcEl.val(_this.defaultImage);\n        }\n        _this.editor.trigger('valuechanged');\n        if (_this.editor.body.find('img.uploading').length < 1) {\n          return _this.editor.uploader.trigger('uploadready', [file, result]);\n        }\n      };\n    })(this));\n  };\n\n  ImageButton.prototype.status = function($node) {\n    if ($node != null) {\n      this.setDisabled($node.is(this.disableTag));\n    }\n    if (this.disabled) {\n      return true;\n    }\n  };\n\n  ImageButton.prototype.loadImage = function($img, src, callback) {\n    var $mask, img;\n    $mask = $img.data('mask');\n    if (!$mask) {\n      $mask = $('<div class=\"simditor-image-loading\"><span></span></div>').hide().appendTo(this.editor.wrapper);\n      if ($img.hasClass('uploading')) {\n        $mask.addClass('uploading');\n      }\n      $img.data('mask', $mask);\n      $mask.data('img', $img);\n    }\n    img = new Image();\n    img.onload = (function(_this) {\n      return function() {\n        var height, imgOffset, width, wrapperOffset;\n        if ($mask.hasClass('uploading') && !$img.hasClass('uploading')) {\n          return;\n        }\n        width = img.width;\n        height = img.height;\n        $img.attr({\n          src: src,\n          'data-image-size': width + ',' + height\n        });\n        if ($img.hasClass('uploading')) {\n          _this.editor.util.reflow(_this.editor.body);\n          wrapperOffset = _this.editor.wrapper.offset();\n          imgOffset = $img.offset();\n          $mask.css({\n            top: imgOffset.top - wrapperOffset.top,\n            left: imgOffset.left - wrapperOffset.left,\n            width: $img.width(),\n            height: $img.height()\n          }).show();\n        } else {\n          $mask.remove();\n          $img.removeData('mask');\n        }\n        return callback(img);\n      };\n    })(this);\n    img.onerror = (function(_this) {\n      return function() {\n        callback(false);\n        $mask.remove();\n        return $img.removeData('mask');\n      };\n    })(this);\n    return img.src = src;\n  };\n\n  ImageButton.prototype.createImage = function(name) {\n    var $block, $img, $nextBlock, range;\n    if (name == null) {\n      name = 'Image';\n    }\n    if (!this.editor.inputManager.focused) {\n      this.editor.focus();\n    }\n    range = this.editor.selection.getRange();\n    range.deleteContents();\n    $block = this.editor.util.closestBlockEl();\n    if ($block.is('p') && !this.editor.util.isEmptyNode($block)) {\n      $block = $('<p/>').append(this.editor.util.phBr).insertAfter($block);\n      this.editor.selection.setRangeAtStartOf($block, range);\n    }\n    $img = $('<img/>').attr('alt', name);\n    range.insertNode($img[0]);\n    $nextBlock = $block.next('p');\n    if (!($nextBlock.length > 0)) {\n      $nextBlock = $('<p/>').append(this.editor.util.phBr).insertAfter($block);\n    }\n    this.editor.selection.setRangeAtStartOf($nextBlock);\n    return $img;\n  };\n\n  ImageButton.prototype.command = function(src) {\n    var $img;\n    $img = this.createImage();\n    return this.loadImage($img, src || this.defaultImage, (function(_this) {\n      return function() {\n        _this.editor.trigger('valuechanged');\n        _this.editor.util.reflow($img);\n        $img.click();\n        return _this.popover.one('popovershow', function() {\n          _this.popover.srcEl.focus();\n          return _this.popover.srcEl[0].select();\n        });\n      };\n    })(this));\n  };\n\n  return ImageButton;\n\n})(Button);\n\nImagePopover = (function(_super) {\n  __extends(ImagePopover, _super);\n\n  function ImagePopover() {\n    return ImagePopover.__super__.constructor.apply(this, arguments);\n  }\n\n  ImagePopover.prototype.offset = {\n    top: 6,\n    left: -4\n  };\n\n  ImagePopover.prototype.render = function() {\n    var tpl;\n    tpl = \"<div class=\\\"link-settings\\\">\\n  <div class=\\\"settings-field\\\">\\n    <label>\" + (this._t('imageUrl')) + \"</label>\\n    <input class=\\\"image-src\\\" type=\\\"text\\\" tabindex=\\\"1\\\" />\\n    <a class=\\\"btn-upload\\\" href=\\\"javascript:;\\\" title=\\\"\" + (this._t('uploadImage')) + \"\\\" tabindex=\\\"-1\\\">\\n      <span class=\\\"fa fa-upload\\\"></span>\\n    </a>\\n  </div>\\n  <div class=\\\"settings-field\\\">\\n    <label>\" + (this._t('imageSize')) + \"</label>\\n    <input class=\\\"image-size\\\" id=\\\"image-width\\\" type=\\\"text\\\" tabindex=\\\"2\\\" />\\n    <span class=\\\"times\\\">×</span>\\n    <input class=\\\"image-size\\\" id=\\\"image-height\\\" type=\\\"text\\\" tabindex=\\\"3\\\" />\\n    <a class=\\\"btn-restore\\\" href=\\\"javascript:;\\\" title=\\\"\" + (this._t('restoreImageSize')) + \"\\\" tabindex=\\\"-1\\\">\\n      <span class=\\\"fa fa-reply\\\"></span>\\n    </a>\\n  </div>\\n</div>\";\n    this.el.addClass('image-popover').append(tpl);\n    this.srcEl = this.el.find('.image-src');\n    this.srcEl.on('keydown', (function(_this) {\n      return function(e) {\n        var hideAndFocus, src;\n        if (!(e.which === 13 || e.which === 27)) {\n          return;\n        }\n        e.preventDefault();\n        hideAndFocus = function() {\n          _this.button.editor.body.focus();\n          _this.button.editor.selection.setRangeAfter(_this.target);\n          return _this.hide();\n        };\n        if (e.which === 13 && !_this.target.hasClass('uploading')) {\n          src = _this.srcEl.val();\n          if (/^data:image/.test(src) && !_this.editor.uploader) {\n            hideAndFocus();\n            return;\n          }\n          return _this.button.loadImage(_this.target, src, function(success) {\n            var blob;\n            if (!success) {\n              return;\n            }\n            if (/^data:image/.test(src)) {\n              blob = _this.editor.util.dataURLtoBlob(src);\n              blob.name = \"Base64 Image.png\";\n              return _this.editor.uploader.upload(blob, {\n                inline: true,\n                img: _this.target\n              });\n            } else {\n              hideAndFocus();\n              return _this.editor.trigger('valuechanged');\n            }\n          });\n        } else {\n          return hideAndFocus();\n        }\n      };\n    })(this));\n    this.widthEl = this.el.find('#image-width');\n    this.heightEl = this.el.find('#image-height');\n    this.el.find('.image-size').on('blur', (function(_this) {\n      return function(e) {\n        _this._resizeImg($(e.currentTarget));\n        return _this.el.data('popover').refresh();\n      };\n    })(this));\n    this.el.find('.image-size').on('keyup', (function(_this) {\n      return function(e) {\n        var inputEl;\n        inputEl = $(e.currentTarget);\n        if (!(e.which === 13 || e.which === 27 || e.which === 9)) {\n          return _this._resizeImg(inputEl, true);\n        }\n      };\n    })(this));\n    this.el.find('.image-size').on('keydown', (function(_this) {\n      return function(e) {\n        var inputEl;\n        inputEl = $(e.currentTarget);\n        if (e.which === 13 || e.which === 27) {\n          e.preventDefault();\n          if (e.which === 13) {\n            _this._resizeImg(inputEl);\n          } else {\n            _this._restoreImg();\n          }\n          _this.button.editor.body.focus();\n          _this.button.editor.selection.setRangeAfter(_this.target);\n          return _this.hide();\n        } else if (e.which === 9) {\n          return _this.el.data('popover').refresh();\n        }\n      };\n    })(this));\n    this.el.find('.btn-restore').on('click', (function(_this) {\n      return function(e) {\n        _this._restoreImg();\n        return _this.el.data('popover').refresh();\n      };\n    })(this));\n    this.editor.on('valuechanged', (function(_this) {\n      return function(e) {\n        if (_this.active) {\n          return _this.refresh();\n        }\n      };\n    })(this));\n    return this._initUploader();\n  };\n\n  ImagePopover.prototype._initUploader = function() {\n    var $uploadBtn, createInput;\n    $uploadBtn = this.el.find('.btn-upload');\n    if (this.editor.uploader == null) {\n      $uploadBtn.remove();\n      return;\n    }\n    createInput = (function(_this) {\n      return function() {\n        if (_this.input) {\n          _this.input.remove();\n        }\n        return _this.input = $('<input type=\"file\" title=\"' + _this._t('uploadImage') + '\" accept=\"image/*\">').appendTo($uploadBtn);\n      };\n    })(this);\n    createInput();\n    this.el.on('click mousedown', 'input[type=file]', (function(_this) {\n      return function(e) {\n        return e.stopPropagation();\n      };\n    })(this));\n    return this.el.on('change', 'input[type=file]', (function(_this) {\n      return function(e) {\n        _this.editor.uploader.upload(_this.input, {\n          inline: true,\n          img: _this.target\n        });\n        return createInput();\n      };\n    })(this));\n  };\n\n  ImagePopover.prototype._resizeImg = function(inputEl, onlySetVal) {\n    var height, value, width;\n    if (onlySetVal == null) {\n      onlySetVal = false;\n    }\n    value = inputEl.val() * 1;\n    if (!($.isNumeric(value) || value < 0)) {\n      return;\n    }\n    if (inputEl.is(this.widthEl)) {\n      height = this.height * value / this.width;\n      this.heightEl.val(height);\n    } else {\n      width = this.width * value / this.height;\n      this.widthEl.val(width);\n    }\n    if (!onlySetVal) {\n      return this.target.attr({\n        width: width || value,\n        height: height || value\n      });\n    }\n  };\n\n  ImagePopover.prototype._restoreImg = function() {\n    var size, _ref;\n    size = ((_ref = this.target.data('image-size')) != null ? _ref.split(\",\") : void 0) || [this.width, this.height];\n    this.target.attr({\n      width: size[0] * 1,\n      height: size[1] * 1\n    });\n    this.widthEl.val(size[0]);\n    return this.heightEl.val(size[1]);\n  };\n\n  ImagePopover.prototype.show = function() {\n    var $img, args;\n    args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n    ImagePopover.__super__.show.apply(this, args);\n    $img = this.target;\n    this.width = $img.width();\n    this.height = $img.height();\n    if ($img.hasClass('uploading')) {\n      return this.srcEl.val(this._t('uploading')).prop('disabled', true);\n    } else {\n      this.srcEl.val($img.attr('src')).prop('disabled', false);\n      this.widthEl.val(this.width);\n      return this.heightEl.val(this.height);\n    }\n  };\n\n  return ImagePopover;\n\n})(Popover);\n\nSimditor.Toolbar.addButton(ImageButton);\n\nvar IndentButton,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nIndentButton = (function(_super) {\n  __extends(IndentButton, _super);\n\n  function IndentButton() {\n    return IndentButton.__super__.constructor.apply(this, arguments);\n  }\n\n  IndentButton.prototype.name = 'indent';\n\n  IndentButton.prototype.icon = 'indent';\n\n  IndentButton.prototype._init = function() {\n    this.title = this._t(this.name) + ' (Tab)';\n    return IndentButton.__super__._init.call(this);\n  };\n\n  IndentButton.prototype.status = function($node) {\n    return true;\n  };\n\n  IndentButton.prototype.command = function() {\n    return this.editor.util.indent();\n  };\n\n  return IndentButton;\n\n})(Button);\n\nSimditor.Toolbar.addButton(IndentButton);\n\nvar OutdentButton,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nOutdentButton = (function(_super) {\n  __extends(OutdentButton, _super);\n\n  function OutdentButton() {\n    return OutdentButton.__super__.constructor.apply(this, arguments);\n  }\n\n  OutdentButton.prototype.name = 'outdent';\n\n  OutdentButton.prototype.icon = 'outdent';\n\n  OutdentButton.prototype._init = function() {\n    this.title = this._t(this.name) + ' (Shift + Tab)';\n    return OutdentButton.__super__._init.call(this);\n  };\n\n  OutdentButton.prototype.status = function($node) {\n    return true;\n  };\n\n  OutdentButton.prototype.command = function() {\n    return this.editor.util.outdent();\n  };\n\n  return OutdentButton;\n\n})(Button);\n\nSimditor.Toolbar.addButton(OutdentButton);\n\nvar HrButton,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nHrButton = (function(_super) {\n  __extends(HrButton, _super);\n\n  function HrButton() {\n    return HrButton.__super__.constructor.apply(this, arguments);\n  }\n\n  HrButton.prototype.name = 'hr';\n\n  HrButton.prototype.icon = 'minus';\n\n  HrButton.prototype.htmlTag = 'hr';\n\n  HrButton.prototype.status = function($node) {\n    return true;\n  };\n\n  HrButton.prototype.command = function() {\n    var $hr, $newBlock, $nextBlock, $rootBlock;\n    $rootBlock = this.editor.util.furthestBlockEl();\n    $nextBlock = $rootBlock.next();\n    if ($nextBlock.length > 0) {\n      this.editor.selection.save();\n    } else {\n      $newBlock = $('<p/>').append(this.editor.util.phBr);\n    }\n    $hr = $('<hr/>').insertAfter($rootBlock);\n    if ($newBlock) {\n      $newBlock.insertAfter($hr);\n      this.editor.selection.setRangeAtStartOf($newBlock);\n    } else {\n      this.editor.selection.restore();\n    }\n    return this.editor.trigger('valuechanged');\n  };\n\n  return HrButton;\n\n})(Button);\n\nSimditor.Toolbar.addButton(HrButton);\n\nvar TableButton,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nTableButton = (function(_super) {\n  __extends(TableButton, _super);\n\n  function TableButton() {\n    return TableButton.__super__.constructor.apply(this, arguments);\n  }\n\n  TableButton.prototype.name = 'table';\n\n  TableButton.prototype.icon = 'table';\n\n  TableButton.prototype.htmlTag = 'table';\n\n  TableButton.prototype.disableTag = 'pre, li, blockquote';\n\n  TableButton.prototype.menu = true;\n\n  TableButton.prototype._init = function() {\n    TableButton.__super__._init.call(this);\n    $.merge(this.editor.formatter._allowedTags, ['tbody', 'tr', 'td', 'colgroup', 'col']);\n    $.extend(this.editor.formatter._allowedAttributes, {\n      td: ['rowspan', 'colspan'],\n      col: ['width']\n    });\n    this._initShortcuts();\n    this.editor.on('decorate', (function(_this) {\n      return function(e, $el) {\n        return $el.find('table').each(function(i, table) {\n          return _this.decorate($(table));\n        });\n      };\n    })(this));\n    this.editor.on('undecorate', (function(_this) {\n      return function(e, $el) {\n        return $el.find('table').each(function(i, table) {\n          return _this.undecorate($(table));\n        });\n      };\n    })(this));\n    this.editor.on('selectionchanged.table', (function(_this) {\n      return function(e) {\n        var $container, range;\n        _this.editor.body.find('.simditor-table td').removeClass('active');\n        range = _this.editor.selection.getRange();\n        if (range == null) {\n          return;\n        }\n        $container = $(range.commonAncestorContainer);\n        if (range.collapsed && $container.is('.simditor-table')) {\n          if (_this.editor.selection.rangeAtStartOf($container)) {\n            $container = $container.find('td:first');\n          } else {\n            $container = $container.find('td:last');\n          }\n          _this.editor.selection.setRangeAtEndOf($container);\n        }\n        return $container.closest('td', _this.editor.body).addClass('active');\n      };\n    })(this));\n    this.editor.on('blur.table', (function(_this) {\n      return function(e) {\n        return _this.editor.body.find('.simditor-table td').removeClass('active');\n      };\n    })(this));\n    this.editor.inputManager.addKeystrokeHandler('38', 'td', (function(_this) {\n      return function(e, $node) {\n        var $prevTr, $tr, index;\n        $tr = $node.parent('tr');\n        $prevTr = $tr.prev('tr');\n        if (!($prevTr.length > 0)) {\n          return true;\n        }\n        index = $tr.find('td').index($node);\n        _this.editor.selection.setRangeAtEndOf($prevTr.find('td').eq(index));\n        return true;\n      };\n    })(this));\n    return this.editor.inputManager.addKeystrokeHandler('40', 'td', (function(_this) {\n      return function(e, $node) {\n        var $nextTr, $tr, index;\n        $tr = $node.parent('tr');\n        $nextTr = $tr.next('tr');\n        if (!($nextTr.length > 0)) {\n          return true;\n        }\n        index = $tr.find('td').index($node);\n        _this.editor.selection.setRangeAtEndOf($nextTr.find('td').eq(index));\n        return true;\n      };\n    })(this));\n  };\n\n  TableButton.prototype.initResize = function($table) {\n    var $colgroup, $resizeHandle, $wrapper;\n    $wrapper = $table.parent('.simditor-table');\n    $colgroup = $table.find('colgroup');\n    if ($colgroup.length < 1) {\n      $colgroup = $('<colgroup/>').prependTo($table);\n      $table.find('tr:first td').each((function(_this) {\n        return function(i, td) {\n          var $col;\n          return $col = $('<col/>').appendTo($colgroup);\n        };\n      })(this));\n      this.refreshTableWidth($table);\n    }\n    $resizeHandle = $('<div class=\"simditor-resize-handle\" contenteditable=\"false\"></div>').appendTo($wrapper);\n    $wrapper.on('mousemove', 'td', (function(_this) {\n      return function(e) {\n        var $col, $td, index, x, _ref, _ref1;\n        if ($wrapper.hasClass('resizing')) {\n          return;\n        }\n        $td = $(e.currentTarget);\n        x = e.pageX - $(e.currentTarget).offset().left;\n        if (x < 5 && $td.prev().length > 0) {\n          $td = $td.prev();\n        }\n        if ($td.next('td').length < 1) {\n          $resizeHandle.hide();\n          return;\n        }\n        if ((_ref = $resizeHandle.data('td')) != null ? _ref.is($td) : void 0) {\n          $resizeHandle.show();\n          return;\n        }\n        index = $td.parent().find('td').index($td);\n        $col = $colgroup.find('col').eq(index);\n        if ((_ref1 = $resizeHandle.data('col')) != null ? _ref1.is($col) : void 0) {\n          $resizeHandle.show();\n          return;\n        }\n        return $resizeHandle.css('left', $td.position().left + $td.outerWidth() - 5).data('td', $td).data('col', $col).show();\n      };\n    })(this));\n    $wrapper.on('mouseleave', (function(_this) {\n      return function(e) {\n        return $resizeHandle.hide();\n      };\n    })(this));\n    return $wrapper.on('mousedown', '.simditor-resize-handle', (function(_this) {\n      return function(e) {\n        var $handle, $leftCol, $leftTd, $rightCol, $rightTd, minWidth, startHandleLeft, startLeftWidth, startRightWidth, startX, tableWidth;\n        $handle = $(e.currentTarget);\n        $leftTd = $handle.data('td');\n        $leftCol = $handle.data('col');\n        $rightTd = $leftTd.next('td');\n        $rightCol = $leftCol.next('col');\n        startX = e.pageX;\n        startLeftWidth = $leftTd.outerWidth() * 1;\n        startRightWidth = $rightTd.outerWidth() * 1;\n        startHandleLeft = parseFloat($handle.css('left'));\n        tableWidth = $leftTd.closest('table').width();\n        minWidth = 50;\n        $(document).on('mousemove.simditor-resize-table', function(e) {\n          var deltaX, leftWidth, rightWidth;\n          deltaX = e.pageX - startX;\n          leftWidth = startLeftWidth + deltaX;\n          rightWidth = startRightWidth - deltaX;\n          if (leftWidth < minWidth) {\n            leftWidth = minWidth;\n            deltaX = minWidth - startLeftWidth;\n            rightWidth = startRightWidth - deltaX;\n          } else if (rightWidth < minWidth) {\n            rightWidth = minWidth;\n            deltaX = startRightWidth - minWidth;\n            leftWidth = startLeftWidth + deltaX;\n          }\n          $leftCol.attr('width', (leftWidth / tableWidth * 100) + '%');\n          $rightCol.attr('width', (rightWidth / tableWidth * 100) + '%');\n          return $handle.css('left', startHandleLeft + deltaX);\n        });\n        $(document).one('mouseup.simditor-resize-table', function(e) {\n          $(document).off('.simditor-resize-table');\n          return $wrapper.removeClass('resizing');\n        });\n        $wrapper.addClass('resizing');\n        return false;\n      };\n    })(this));\n  };\n\n  TableButton.prototype._initShortcuts = function() {\n    this.editor.inputManager.addShortcut('ctrl+alt+up', (function(_this) {\n      return function(e) {\n        _this.editMenu.find('.menu-item[data-param=insertRowAbove]').click();\n        return false;\n      };\n    })(this));\n    this.editor.inputManager.addShortcut('ctrl+alt+down', (function(_this) {\n      return function(e) {\n        _this.editMenu.find('.menu-item[data-param=insertRowBelow]').click();\n        return false;\n      };\n    })(this));\n    this.editor.inputManager.addShortcut('ctrl+alt+left', (function(_this) {\n      return function(e) {\n        _this.editMenu.find('.menu-item[data-param=insertColLeft]').click();\n        return false;\n      };\n    })(this));\n    return this.editor.inputManager.addShortcut('ctrl+alt+right', (function(_this) {\n      return function(e) {\n        _this.editMenu.find('.menu-item[data-param=insertColRight]').click();\n        return false;\n      };\n    })(this));\n  };\n\n  TableButton.prototype.decorate = function($table) {\n    if ($table.parent('.simditor-table').length > 0) {\n      this.undecorate($table);\n    }\n    $table.wrap('<div class=\"simditor-table\"></div>');\n    this.initResize($table);\n    return $table.parent();\n  };\n\n  TableButton.prototype.undecorate = function($table) {\n    if (!($table.parent('.simditor-table').length > 0)) {\n      return;\n    }\n    return $table.parent().replaceWith($table);\n  };\n\n  TableButton.prototype.renderMenu = function() {\n    $(\"<div class=\\\"menu-create-table\\\">\\n</div>\\n<div class=\\\"menu-edit-table\\\">\\n  <ul>\\n    <li><a tabindex=\\\"-1\\\" unselectable=\\\"on\\\" class=\\\"menu-item\\\" href=\\\"javascript:;\\\" data-param=\\\"deleteRow\\\"><span>\" + (this._t('deleteRow')) + \" ( Ctrl + Alt + → )</span></a></li>\\n    <li><a tabindex=\\\"-1\\\" unselectable=\\\"on\\\" class=\\\"menu-item\\\" href=\\\"javascript:;\\\" data-param=\\\"insertRowAbove\\\"><span>\" + (this._t('insertRowAbove')) + \" ( Ctrl + Alt + ↑ )</span></a></li>\\n    <li><a tabindex=\\\"-1\\\" unselectable=\\\"on\\\" class=\\\"menu-item\\\" href=\\\"javascript:;\\\" data-param=\\\"insertRowBelow\\\"><span>\" + (this._t('insertRowBelow')) + \" ( Ctrl + Alt + ↓ )</span></a></li>\\n    <li><span class=\\\"separator\\\"></span></li>\\n    <li><a tabindex=\\\"-1\\\" unselectable=\\\"on\\\" class=\\\"menu-item\\\" href=\\\"javascript:;\\\" data-param=\\\"deleteCol\\\"><span>\" + (this._t('deleteColumn')) + \"</span></a></li>\\n    <li><a tabindex=\\\"-1\\\" unselectable=\\\"on\\\" class=\\\"menu-item\\\" href=\\\"javascript:;\\\" data-param=\\\"insertColLeft\\\"><span>\" + (this._t('insertColumnLeft')) + \" ( Ctrl + Alt + ← )</span></a></li>\\n    <li><a tabindex=\\\"-1\\\" unselectable=\\\"on\\\" class=\\\"menu-item\\\" href=\\\"javascript:;\\\" data-param=\\\"insertColRight\\\"><span>\" + (this._t('insertColumnRight')) + \" ( Ctrl + Alt + → )</span></a></li>\\n    <li><span class=\\\"separator\\\"></span></li>\\n    <li><a tabindex=\\\"-1\\\" unselectable=\\\"on\\\" class=\\\"menu-item\\\" href=\\\"javascript:;\\\" data-param=\\\"deleteTable\\\"><span>\" + (this._t('deleteTable')) + \"</span></a></li>\\n  </ul>\\n</div>\").appendTo(this.menuWrapper);\n    this.createMenu = this.menuWrapper.find('.menu-create-table');\n    this.editMenu = this.menuWrapper.find('.menu-edit-table');\n    this.createTable(6, 6).appendTo(this.createMenu);\n    this.createMenu.on('mouseenter', 'td', (function(_this) {\n      return function(e) {\n        var $td, $tr, num;\n        _this.createMenu.find('td').removeClass('selected');\n        $td = $(e.currentTarget);\n        $tr = $td.parent();\n        num = $tr.find('td').index($td) + 1;\n        return $tr.prevAll('tr').addBack().find('td:lt(' + num + ')').addClass('selected');\n      };\n    })(this));\n    this.createMenu.on('mouseleave', (function(_this) {\n      return function(e) {\n        return $(e.currentTarget).find('td').removeClass('selected');\n      };\n    })(this));\n    return this.createMenu.on('mousedown', 'td', (function(_this) {\n      return function(e) {\n        var $closestBlock, $table, $td, $tr, colNum, rowNum;\n        _this.wrapper.removeClass('menu-on');\n        if (!_this.editor.inputManager.focused) {\n          return;\n        }\n        $td = $(e.currentTarget);\n        $tr = $td.parent();\n        colNum = $tr.find('td').index($td) + 1;\n        rowNum = $tr.prevAll('tr').length + 1;\n        $table = _this.createTable(rowNum, colNum, true);\n        $closestBlock = _this.editor.util.closestBlockEl();\n        if (_this.editor.util.isEmptyNode($closestBlock)) {\n          $closestBlock.replaceWith($table);\n        } else {\n          $closestBlock.after($table);\n        }\n        _this.decorate($table);\n        _this.editor.selection.setRangeAtStartOf($table.find('td:first'));\n        _this.editor.trigger('valuechanged');\n        return false;\n      };\n    })(this));\n  };\n\n  TableButton.prototype.createTable = function(row, col, phBr) {\n    var $table, $tbody, $td, $tr, c, r, _i, _j;\n    $table = $('<table/>');\n    $tbody = $('<tbody/>').appendTo($table);\n    for (r = _i = 0; 0 <= row ? _i < row : _i > row; r = 0 <= row ? ++_i : --_i) {\n      $tr = $('<tr/>').appendTo($tbody);\n      for (c = _j = 0; 0 <= col ? _j < col : _j > col; c = 0 <= col ? ++_j : --_j) {\n        $td = $('<td/>').appendTo($tr);\n        if (phBr) {\n          $td.append(this.editor.util.phBr);\n        }\n      }\n    }\n    return $table;\n  };\n\n  TableButton.prototype.refreshTableWidth = function($table) {\n    var cols, tableWidth;\n    tableWidth = $table.width();\n    cols = $table.find('col');\n    return $table.find('tr:first td').each((function(_this) {\n      return function(i, td) {\n        var $col;\n        $col = cols.eq(i);\n        return $col.attr('width', ($(td).outerWidth() / tableWidth * 100) + '%');\n      };\n    })(this));\n  };\n\n  TableButton.prototype.setActive = function(active) {\n    TableButton.__super__.setActive.call(this, active);\n    if (active) {\n      this.createMenu.hide();\n      return this.editMenu.show();\n    } else {\n      this.createMenu.show();\n      return this.editMenu.hide();\n    }\n  };\n\n  TableButton.prototype.deleteRow = function($td) {\n    var $newTr, $tr, index;\n    $tr = $td.parent('tr');\n    if ($tr.siblings('tr').length < 1) {\n      return this.deleteTable($td);\n    } else {\n      $newTr = $tr.next('tr');\n      if (!($newTr.length > 0)) {\n        $newTr = $tr.prev('tr');\n      }\n      index = $tr.find('td').index($td);\n      $tr.remove();\n      return this.editor.selection.setRangeAtEndOf($newTr.find('td').eq(index));\n    }\n  };\n\n  TableButton.prototype.insertRow = function($td, direction) {\n    var $newTr, $table, $tr, colNum, i, index, _i;\n    if (direction == null) {\n      direction = 'after';\n    }\n    $tr = $td.parent('tr');\n    $table = $tr.closest('table');\n    colNum = 0;\n    $table.find('tr').each((function(_this) {\n      return function(i, tr) {\n        return colNum = Math.max(colNum, $(tr).find('td').length);\n      };\n    })(this));\n    $newTr = $('<tr/>');\n    for (i = _i = 1; 1 <= colNum ? _i <= colNum : _i >= colNum; i = 1 <= colNum ? ++_i : --_i) {\n      $('<td/>').append(this.editor.util.phBr).appendTo($newTr);\n    }\n    $tr[direction]($newTr);\n    index = $tr.find('td').index($td);\n    return this.editor.selection.setRangeAtStartOf($newTr.find('td').eq(index));\n  };\n\n  TableButton.prototype.deleteCol = function($td) {\n    var $newTd, $table, $tr, index;\n    $tr = $td.parent('tr');\n    if ($tr.siblings('tr').length < 1 && $td.siblings('td').length < 1) {\n      return this.deleteTable($td);\n    } else {\n      index = $tr.find('td').index($td);\n      $newTd = $td.next('td');\n      if (!($newTd.length > 0)) {\n        $newTd = $tr.prev('td');\n      }\n      $table = $tr.closest('table');\n      $table.find('col').eq(index).remove();\n      $table.find('tr').each((function(_this) {\n        return function(i, tr) {\n          return $(tr).find('td').eq(index).remove();\n        };\n      })(this));\n      this.refreshTableWidth($table);\n      return this.editor.selection.setRangeAtEndOf($newTd);\n    }\n  };\n\n  TableButton.prototype.insertCol = function($td, direction) {\n    var $col, $newCol, $newTd, $table, $tr, index, tableWidth, width;\n    if (direction == null) {\n      direction = 'after';\n    }\n    $tr = $td.parent('tr');\n    index = $tr.find('td').index($td);\n    $table = $td.closest('table');\n    $col = $table.find('col').eq(index);\n    $table.find('tr').each((function(_this) {\n      return function(i, tr) {\n        var $newTd;\n        $newTd = $('<td/>').append(_this.editor.util.phBr);\n        return $(tr).find('td').eq(index)[direction]($newTd);\n      };\n    })(this));\n    $newCol = $('<col/>');\n    $col[direction]($newCol);\n    tableWidth = $table.width();\n    width = Math.max(parseFloat($col.attr('width')) / 2, 50 / tableWidth * 100);\n    $col.attr('width', width + '%');\n    $newCol.attr('width', width + '%');\n    this.refreshTableWidth($table);\n    $newTd = direction === 'after' ? $td.next('td') : $td.prev('td');\n    return this.editor.selection.setRangeAtStartOf($newTd);\n  };\n\n  TableButton.prototype.deleteTable = function($td) {\n    var $block, $table;\n    $table = $td.closest('.simditor-table');\n    $block = $table.next('p');\n    $table.remove();\n    if ($block.length > 0) {\n      return this.editor.selection.setRangeAtStartOf($block);\n    }\n  };\n\n  TableButton.prototype.command = function(param) {\n    var $td, range;\n    range = this.editor.selection.getRange();\n    $td = $(range.commonAncestorContainer).closest('td');\n    if (!($td.length > 0)) {\n      return;\n    }\n    if (param === 'deleteRow') {\n      this.deleteRow($td);\n    } else if (param === 'insertRowAbove') {\n      this.insertRow($td, 'before');\n    } else if (param === 'insertRowBelow') {\n      this.insertRow($td);\n    } else if (param === 'deleteCol') {\n      this.deleteCol($td);\n    } else if (param === 'insertColLeft') {\n      this.insertCol($td, 'before');\n    } else if (param === 'insertColRight') {\n      this.insertCol($td);\n    } else if (param === 'deleteTable') {\n      this.deleteTable($td);\n    } else {\n      return;\n    }\n    return this.editor.trigger('valuechanged');\n  };\n\n  return TableButton;\n\n})(Button);\n\nSimditor.Toolbar.addButton(TableButton);\n\nvar StrikethroughButton,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nStrikethroughButton = (function(_super) {\n  __extends(StrikethroughButton, _super);\n\n  function StrikethroughButton() {\n    return StrikethroughButton.__super__.constructor.apply(this, arguments);\n  }\n\n  StrikethroughButton.prototype.name = 'strikethrough';\n\n  StrikethroughButton.prototype.icon = 'strikethrough';\n\n  StrikethroughButton.prototype.htmlTag = 'strike';\n\n  StrikethroughButton.prototype.disableTag = 'pre';\n\n  StrikethroughButton.prototype.status = function($node) {\n    var active;\n    if ($node != null) {\n      this.setDisabled($node.is(this.disableTag));\n    }\n    if (this.disabled) {\n      return true;\n    }\n    active = document.queryCommandState('strikethrough') === true;\n    this.setActive(active);\n    return active;\n  };\n\n  StrikethroughButton.prototype.command = function() {\n    document.execCommand('strikethrough');\n    this.editor.trigger('valuechanged');\n    return $(document).trigger('selectionchange');\n  };\n\n  return StrikethroughButton;\n\n})(Button);\n\nSimditor.Toolbar.addButton(StrikethroughButton);\n\nreturn Simditor;\n\n}));\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/simditor/uploader.js",
    "content": "(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module.\n    define('simple-uploader', [\"jquery\",\n      \"simple-module\"], function ($, SimpleModule) {\n      return (root.returnExportsGlobal = factory($, SimpleModule));\n    });\n  } else if (typeof exports === 'object') {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like enviroments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"),\n      require(\"simple-module\"));\n  } else {\n    root.simple = root.simple || {};\n    root.simple['uploader'] = factory(jQuery,\n      SimpleModule);\n  }\n}(this, function ($, SimpleModule) {\n\nvar Uploader, uploader,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nUploader = (function(_super) {\n  __extends(Uploader, _super);\n\n  function Uploader() {\n    return Uploader.__super__.constructor.apply(this, arguments);\n  }\n\n  Uploader.count = 0;\n\n  Uploader.prototype.opts = {\n    url: '',\n    params: null,\n    fileKey: 'upload_file',\n    connectionCount: 3\n  };\n\n  Uploader.prototype._init = function() {\n    this.files = [];\n    this.queue = [];\n    this.id = ++Uploader.count;\n    this.on('uploadcomplete', (function(_this) {\n      return function(e, file) {\n        _this.files.splice($.inArray(file, _this.files), 1);\n        if (_this.queue.length > 0 && _this.files.length < _this.opts.connectionCount) {\n          return _this.upload(_this.queue.shift());\n        } else {\n          return _this.uploading = false;\n        }\n      };\n    })(this));\n    return $(window).on('beforeunload.uploader-' + this.id, (function(_this) {\n      return function(e) {\n        if (!_this.uploading) {\n          return;\n        }\n        e.originalEvent.returnValue = _this._t('leaveConfirm');\n        return _this._t('leaveConfirm');\n      };\n    })(this));\n  };\n\n  Uploader.prototype.generateId = (function() {\n    var id;\n    id = 0;\n    return function() {\n      return id += 1;\n    };\n  })();\n\n  Uploader.prototype.upload = function(file, opts) {\n    var f, key, _i, _len;\n    if (opts == null) {\n      opts = {};\n    }\n    if (file == null) {\n      return;\n    }\n    if ($.isArray(file)) {\n      for (_i = 0, _len = file.length; _i < _len; _i++) {\n        f = file[_i];\n        this.upload(f, opts);\n      }\n    } else if ($(file).is('input:file')) {\n      key = $(file).attr('name');\n      if (key) {\n        opts.fileKey = key;\n      }\n      this.upload($.makeArray($(file)[0].files), opts);\n    } else if (!file.id || !file.obj) {\n      file = this.getFile(file);\n    }\n    if (!(file && file.obj)) {\n      return;\n    }\n    $.extend(file, opts);\n    if (this.files.length >= this.opts.connectionCount) {\n      this.queue.push(file);\n      return;\n    }\n    if (this.triggerHandler('beforeupload', [file]) === false) {\n      return;\n    }\n    this.files.push(file);\n    this._xhrUpload(file);\n    return this.uploading = true;\n  };\n\n  Uploader.prototype.getFile = function(fileObj) {\n    var name, _ref, _ref1;\n    if (fileObj instanceof window.File || fileObj instanceof window.Blob) {\n      name = (_ref = fileObj.fileName) != null ? _ref : fileObj.name;\n    } else {\n      return null;\n    }\n    return {\n      id: this.generateId(),\n      url: this.opts.url,\n      params: this.opts.params,\n      fileKey: this.opts.fileKey,\n      name: name,\n      size: (_ref1 = fileObj.fileSize) != null ? _ref1 : fileObj.size,\n      ext: name ? name.split('.').pop().toLowerCase() : '',\n      obj: fileObj\n    };\n  };\n\n  Uploader.prototype._xhrUpload = function(file) {\n    var formData, k, v, _ref;\n    formData = new FormData();\n    formData.append(file.fileKey, file.obj);\n    formData.append(\"original_filename\", file.name);\n    if (file.params) {\n      _ref = file.params;\n      for (k in _ref) {\n        v = _ref[k];\n        formData.append(k, v);\n      }\n    }\n    return file.xhr = $.ajax({\n      url: file.url,\n      data: formData,\n      dataType: 'json',\n      processData: false,\n      contentType: false,\n      type: 'POST',\n      headers: {\n        'X-File-Name': encodeURIComponent(file.name)\n      },\n      xhr: function() {\n        var req;\n        req = $.ajaxSettings.xhr();\n        if (req) {\n          req.upload.onprogress = (function(_this) {\n            return function(e) {\n              return _this.progress(e);\n            };\n          })(this);\n        }\n        return req;\n      },\n      progress: (function(_this) {\n        return function(e) {\n          if (!e.lengthComputable) {\n            return;\n          }\n          return _this.trigger('uploadprogress', [file, e.loaded, e.total]);\n        };\n      })(this),\n      error: (function(_this) {\n        return function(xhr, status, err) {\n          return _this.trigger('uploaderror', [file, xhr, status]);\n        };\n      })(this),\n      success: (function(_this) {\n        return function(result) {\n          _this.trigger('uploadprogress', [file, file.size, file.size]);\n          return _this.trigger('uploadsuccess', [file, result]);\n        };\n      })(this),\n      complete: (function(_this) {\n        return function(xhr, status) {\n          return _this.trigger('uploadcomplete', [file, xhr.responseText]);\n        };\n      })(this)\n    });\n  };\n\n  Uploader.prototype.cancel = function(file) {\n    var f, _i, _len, _ref;\n    if (!file.id) {\n      _ref = this.files;\n      for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n        f = _ref[_i];\n        if (f.id === file * 1) {\n          file = f;\n          break;\n        }\n      }\n    }\n    this.trigger('uploadcancel', [file]);\n    if (file.xhr) {\n      file.xhr.abort();\n    }\n    return file.xhr = null;\n  };\n\n  Uploader.prototype.readImageFile = function(fileObj, callback) {\n    var fileReader, img;\n    if (!$.isFunction(callback)) {\n      return;\n    }\n    img = new Image();\n    img.onload = function() {\n      return callback(img);\n    };\n    img.onerror = function() {\n      return callback();\n    };\n    if (window.FileReader && FileReader.prototype.readAsDataURL && /^image/.test(fileObj.type)) {\n      fileReader = new FileReader();\n      fileReader.onload = function(e) {\n        return img.src = e.target.result;\n      };\n      return fileReader.readAsDataURL(fileObj);\n    } else {\n      return callback();\n    }\n  };\n\n  Uploader.prototype.destroy = function() {\n    var file, _i, _len, _ref;\n    this.queue.length = 0;\n    _ref = this.files;\n    for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n      file = _ref[_i];\n      this.cancel(file);\n    }\n    $(window).off('.uploader-' + this.id);\n    return $(document).off('.uploader-' + this.id);\n  };\n\n  Uploader.i18n = {\n    'zh-CN': {\n      leaveConfirm: '正在上传文件，如果离开上传会自动取消'\n    }\n  };\n\n  Uploader.locale = 'zh-CN';\n\n  return Uploader;\n\n})(SimpleModule);\n\nuploader = function(opts) {\n  return new Uploader(opts);\n};\n\n\nreturn uploader;\n\n\n}));\n\n\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/summernote/summernote-zh-CN.js",
    "content": "(function ($) {\n  $.extend($.summernote.lang, {\n    'zh-CN': {\n      font: {\n        bold: '粗体',\n        italic: '斜体',\n        underline: '下划线',\n        strikethrough: '删除线',\n        clear: '清除格式',\n        height: '行高',\n        name: '字体',\n        size: '字号'\n      },\n      image: {\n        image: '图片',\n        insert: '插入图片',\n        resizeFull: '调整至 100%',\n        resizeHalf: '调整至 50%',\n        resizeQuarter: '调整至 25%',\n        floatLeft: '左浮动',\n        floatRight: '右浮动',\n        floatNone: '不浮动',\n        dragImageHere: '将图片拖至此处',\n        selectFromFiles: '从本地上传',\n        url: '图片地址'\n      },\n      link: {\n        link: '链接',\n        insert: '插入链接',\n        unlink: '去除链接',\n        edit: '编辑链接',\n        textToDisplay: '显示文本',\n        url: '链接地址',\n        openInNewWindow: '在新窗口打开'\n      },\n      video: {\n        video: '视频',\n        videoLink: '视频链接',\n        insert: '插入视频',\n        url: '视频地址',\n        providers: '(优酷, Instagram, DailyMotion, Youtube等)'\n      },\n      table: {\n        table: '表格'\n      },\n      hr: {\n        insert: '水平线'\n      },\n      style: {\n        style: '样式',\n        normal: '普通',\n        blockquote: '引用',\n        pre: '代码',\n        h1: '标题 1',\n        h2: '标题 2',\n        h3: '标题 3',\n        h4: '标题 4',\n        h5: '标题 5',\n        h6: '标题 6'\n      },\n      lists: {\n        unordered: '无序列表',\n        ordered: '有序列表'\n      },\n      options: {\n        help: '帮助',\n        fullscreen: '全屏',\n        codeview: '源代码'\n      },\n      paragraph: {\n        paragraph: '段落',\n        outdent: '减少缩进',\n        indent: '增加缩进',\n        left: '左对齐',\n        center: '居中对齐',\n        right: '右对齐',\n        justify: '两端对齐'\n      },\n      color: {\n        recent: '最近使用',\n        more: '更多',\n        background: '背景',\n        foreground: '前景',\n        transparent: '透明',\n        setTransparent: '透明',\n        reset: '重置',\n        resetToDefault: '默认'\n      },\n      shortcut: {\n        shortcuts: '快捷键',\n        close: '关闭',\n        textFormatting: '文本格式',\n        action: '动作',\n        paragraphFormatting: '段落格式',\n        documentStyle: '文档样式'\n      },\n      history: {\n        undo: '撤销',\n        redo: '重做'\n      }\n    }\n  });\n})(jQuery);\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/switchery/switchery.js",
    "content": "(function(){function require(path,parent,orig){var resolved=require.resolve(path);if(null==resolved){orig=orig||path;parent=parent||\"root\";var err=new Error('Failed to require \"'+orig+'\" from \"'+parent+'\"');err.path=orig;err.parent=parent;err.require=true;throw err}var module=require.modules[resolved];if(!module._resolving&&!module.exports){var mod={};mod.exports={};mod.client=mod.component=true;module._resolving=true;module.call(this,mod.exports,require.relative(resolved),mod);delete module._resolving;module.exports=mod.exports}return module.exports}require.modules={};require.aliases={};require.resolve=function(path){if(path.charAt(0)===\"/\")path=path.slice(1);var paths=[path,path+\".js\",path+\".json\",path+\"/index.js\",path+\"/index.json\"];for(var i=0;i<paths.length;i++){var path=paths[i];if(require.modules.hasOwnProperty(path))return path;if(require.aliases.hasOwnProperty(path))return require.aliases[path]}};require.normalize=function(curr,path){var segs=[];if(\".\"!=path.charAt(0))return path;curr=curr.split(\"/\");path=path.split(\"/\");for(var i=0;i<path.length;++i){if(\"..\"==path[i]){curr.pop()}else if(\".\"!=path[i]&&\"\"!=path[i]){segs.push(path[i])}}return curr.concat(segs).join(\"/\")};require.register=function(path,definition){require.modules[path]=definition};require.alias=function(from,to){if(!require.modules.hasOwnProperty(from)){throw new Error('Failed to alias \"'+from+'\", it does not exist')}require.aliases[to]=from};require.relative=function(parent){var p=require.normalize(parent,\"..\");function lastIndexOf(arr,obj){var i=arr.length;while(i--){if(arr[i]===obj)return i}return-1}function localRequire(path){var resolved=localRequire.resolve(path);return require(resolved,parent,path)}localRequire.resolve=function(path){var c=path.charAt(0);if(\"/\"==c)return path.slice(1);if(\".\"==c)return require.normalize(p,path);var segs=parent.split(\"/\");var i=lastIndexOf(segs,\"deps\")+1;if(!i)i=0;path=segs.slice(0,i+1).join(\"/\")+\"/deps/\"+path;return path};localRequire.exists=function(path){return require.modules.hasOwnProperty(localRequire.resolve(path))};return localRequire};require.register(\"abpetkov-transitionize/transitionize.js\",function(exports,require,module){module.exports=Transitionize;function Transitionize(element,props){if(!(this instanceof Transitionize))return new Transitionize(element,props);this.element=element;this.props=props||{};this.init()}Transitionize.prototype.isSafari=function(){return/Safari/.test(navigator.userAgent)&&/Apple Computer/.test(navigator.vendor)};Transitionize.prototype.init=function(){var transitions=[];for(var key in this.props){transitions.push(key+\" \"+this.props[key])}this.element.style.transition=transitions.join(\", \");if(this.isSafari())this.element.style.webkitTransition=transitions.join(\", \")}});require.register(\"ftlabs-fastclick/lib/fastclick.js\",function(exports,require,module){function FastClick(layer){\"use strict\";var oldOnClick,self=this;this.trackingClick=false;this.trackingClickStart=0;this.targetElement=null;this.touchStartX=0;this.touchStartY=0;this.lastTouchIdentifier=0;this.touchBoundary=10;this.layer=layer;if(!layer||!layer.nodeType){throw new TypeError(\"Layer must be a document node\")}this.onClick=function(){return FastClick.prototype.onClick.apply(self,arguments)};this.onMouse=function(){return FastClick.prototype.onMouse.apply(self,arguments)};this.onTouchStart=function(){return FastClick.prototype.onTouchStart.apply(self,arguments)};this.onTouchMove=function(){return FastClick.prototype.onTouchMove.apply(self,arguments)};this.onTouchEnd=function(){return FastClick.prototype.onTouchEnd.apply(self,arguments)};this.onTouchCancel=function(){return FastClick.prototype.onTouchCancel.apply(self,arguments)};if(FastClick.notNeeded(layer)){return}if(this.deviceIsAndroid){layer.addEventListener(\"mouseover\",this.onMouse,true);layer.addEventListener(\"mousedown\",this.onMouse,true);layer.addEventListener(\"mouseup\",this.onMouse,true)}layer.addEventListener(\"click\",this.onClick,true);layer.addEventListener(\"touchstart\",this.onTouchStart,false);layer.addEventListener(\"touchmove\",this.onTouchMove,false);layer.addEventListener(\"touchend\",this.onTouchEnd,false);layer.addEventListener(\"touchcancel\",this.onTouchCancel,false);if(!Event.prototype.stopImmediatePropagation){layer.removeEventListener=function(type,callback,capture){var rmv=Node.prototype.removeEventListener;if(type===\"click\"){rmv.call(layer,type,callback.hijacked||callback,capture)}else{rmv.call(layer,type,callback,capture)}};layer.addEventListener=function(type,callback,capture){var adv=Node.prototype.addEventListener;if(type===\"click\"){adv.call(layer,type,callback.hijacked||(callback.hijacked=function(event){if(!event.propagationStopped){callback(event)}}),capture)}else{adv.call(layer,type,callback,capture)}}}if(typeof layer.onclick===\"function\"){oldOnClick=layer.onclick;layer.addEventListener(\"click\",function(event){oldOnClick(event)},false);layer.onclick=null}}FastClick.prototype.deviceIsAndroid=navigator.userAgent.indexOf(\"Android\")>0;FastClick.prototype.deviceIsIOS=/iP(ad|hone|od)/.test(navigator.userAgent);FastClick.prototype.deviceIsIOS4=FastClick.prototype.deviceIsIOS&&/OS 4_\\d(_\\d)?/.test(navigator.userAgent);FastClick.prototype.deviceIsIOSWithBadTarget=FastClick.prototype.deviceIsIOS&&/OS ([6-9]|\\d{2})_\\d/.test(navigator.userAgent);FastClick.prototype.needsClick=function(target){\"use strict\";switch(target.nodeName.toLowerCase()){case\"button\":case\"select\":case\"textarea\":if(target.disabled){return true}break;case\"input\":if(this.deviceIsIOS&&target.type===\"file\"||target.disabled){return true}break;case\"label\":case\"video\":return true}return/\\bneedsclick\\b/.test(target.className)};FastClick.prototype.needsFocus=function(target){\"use strict\";switch(target.nodeName.toLowerCase()){case\"textarea\":return true;case\"select\":return!this.deviceIsAndroid;case\"input\":switch(target.type){case\"button\":case\"checkbox\":case\"file\":case\"image\":case\"radio\":case\"submit\":return false}return!target.disabled&&!target.readOnly;default:return/\\bneedsfocus\\b/.test(target.className)}};FastClick.prototype.sendClick=function(targetElement,event){\"use strict\";var clickEvent,touch;if(document.activeElement&&document.activeElement!==targetElement){document.activeElement.blur()}touch=event.changedTouches[0];clickEvent=document.createEvent(\"MouseEvents\");clickEvent.initMouseEvent(this.determineEventType(targetElement),true,true,window,1,touch.screenX,touch.screenY,touch.clientX,touch.clientY,false,false,false,false,0,null);clickEvent.forwardedTouchEvent=true;targetElement.dispatchEvent(clickEvent)};FastClick.prototype.determineEventType=function(targetElement){\"use strict\";if(this.deviceIsAndroid&&targetElement.tagName.toLowerCase()===\"select\"){return\"mousedown\"}return\"click\"};FastClick.prototype.focus=function(targetElement){\"use strict\";var length;if(this.deviceIsIOS&&targetElement.setSelectionRange&&targetElement.type.indexOf(\"date\")!==0&&targetElement.type!==\"time\"){length=targetElement.value.length;targetElement.setSelectionRange(length,length)}else{targetElement.focus()}};FastClick.prototype.updateScrollParent=function(targetElement){\"use strict\";var scrollParent,parentElement;scrollParent=targetElement.fastClickScrollParent;if(!scrollParent||!scrollParent.contains(targetElement)){parentElement=targetElement;do{if(parentElement.scrollHeight>parentElement.offsetHeight){scrollParent=parentElement;targetElement.fastClickScrollParent=parentElement;break}parentElement=parentElement.parentElement}while(parentElement)}if(scrollParent){scrollParent.fastClickLastScrollTop=scrollParent.scrollTop}};FastClick.prototype.getTargetElementFromEventTarget=function(eventTarget){\"use strict\";if(eventTarget.nodeType===Node.TEXT_NODE){return eventTarget.parentNode}return eventTarget};FastClick.prototype.onTouchStart=function(event){\"use strict\";var targetElement,touch,selection;if(event.targetTouches.length>1){return true}targetElement=this.getTargetElementFromEventTarget(event.target);touch=event.targetTouches[0];if(this.deviceIsIOS){selection=window.getSelection();if(selection.rangeCount&&!selection.isCollapsed){return true}if(!this.deviceIsIOS4){if(touch.identifier===this.lastTouchIdentifier){event.preventDefault();return false}this.lastTouchIdentifier=touch.identifier;this.updateScrollParent(targetElement)}}this.trackingClick=true;this.trackingClickStart=event.timeStamp;this.targetElement=targetElement;this.touchStartX=touch.pageX;this.touchStartY=touch.pageY;if(event.timeStamp-this.lastClickTime<200){event.preventDefault()}return true};FastClick.prototype.touchHasMoved=function(event){\"use strict\";var touch=event.changedTouches[0],boundary=this.touchBoundary;if(Math.abs(touch.pageX-this.touchStartX)>boundary||Math.abs(touch.pageY-this.touchStartY)>boundary){return true}return false};FastClick.prototype.onTouchMove=function(event){\"use strict\";if(!this.trackingClick){return true}if(this.targetElement!==this.getTargetElementFromEventTarget(event.target)||this.touchHasMoved(event)){this.trackingClick=false;this.targetElement=null}return true};FastClick.prototype.findControl=function(labelElement){\"use strict\";if(labelElement.control!==undefined){return labelElement.control}if(labelElement.htmlFor){return document.getElementById(labelElement.htmlFor)}return labelElement.querySelector(\"button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea\")};FastClick.prototype.onTouchEnd=function(event){\"use strict\";var forElement,trackingClickStart,targetTagName,scrollParent,touch,targetElement=this.targetElement;if(!this.trackingClick){return true}if(event.timeStamp-this.lastClickTime<200){this.cancelNextClick=true;return true}this.cancelNextClick=false;this.lastClickTime=event.timeStamp;trackingClickStart=this.trackingClickStart;this.trackingClick=false;this.trackingClickStart=0;if(this.deviceIsIOSWithBadTarget){touch=event.changedTouches[0];targetElement=document.elementFromPoint(touch.pageX-window.pageXOffset,touch.pageY-window.pageYOffset)||targetElement;targetElement.fastClickScrollParent=this.targetElement.fastClickScrollParent}targetTagName=targetElement.tagName.toLowerCase();if(targetTagName===\"label\"){forElement=this.findControl(targetElement);if(forElement){this.focus(targetElement);if(this.deviceIsAndroid){return false}targetElement=forElement}}else if(this.needsFocus(targetElement)){if(event.timeStamp-trackingClickStart>100||this.deviceIsIOS&&window.top!==window&&targetTagName===\"input\"){this.targetElement=null;return false}this.focus(targetElement);if(!this.deviceIsIOS4||targetTagName!==\"select\"){this.targetElement=null;event.preventDefault()}return false}if(this.deviceIsIOS&&!this.deviceIsIOS4){scrollParent=targetElement.fastClickScrollParent;if(scrollParent&&scrollParent.fastClickLastScrollTop!==scrollParent.scrollTop){return true}}if(!this.needsClick(targetElement)){event.preventDefault();this.sendClick(targetElement,event)}return false};FastClick.prototype.onTouchCancel=function(){\"use strict\";this.trackingClick=false;this.targetElement=null};FastClick.prototype.onMouse=function(event){\"use strict\";if(!this.targetElement){return true}if(event.forwardedTouchEvent){return true}if(!event.cancelable){return true}if(!this.needsClick(this.targetElement)||this.cancelNextClick){if(event.stopImmediatePropagation){event.stopImmediatePropagation()}else{event.propagationStopped=true}event.stopPropagation();event.preventDefault();return false}return true};FastClick.prototype.onClick=function(event){\"use strict\";var permitted;if(this.trackingClick){this.targetElement=null;this.trackingClick=false;return true}if(event.target.type===\"submit\"&&event.detail===0){return true}permitted=this.onMouse(event);if(!permitted){this.targetElement=null}return permitted};FastClick.prototype.destroy=function(){\"use strict\";var layer=this.layer;if(this.deviceIsAndroid){layer.removeEventListener(\"mouseover\",this.onMouse,true);layer.removeEventListener(\"mousedown\",this.onMouse,true);layer.removeEventListener(\"mouseup\",this.onMouse,true)}layer.removeEventListener(\"click\",this.onClick,true);layer.removeEventListener(\"touchstart\",this.onTouchStart,false);layer.removeEventListener(\"touchmove\",this.onTouchMove,false);layer.removeEventListener(\"touchend\",this.onTouchEnd,false);layer.removeEventListener(\"touchcancel\",this.onTouchCancel,false)};FastClick.notNeeded=function(layer){\"use strict\";var metaViewport;var chromeVersion;if(typeof window.ontouchstart===\"undefined\"){return true}chromeVersion=+(/Chrome\\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1];if(chromeVersion){if(FastClick.prototype.deviceIsAndroid){metaViewport=document.querySelector(\"meta[name=viewport]\");if(metaViewport){if(metaViewport.content.indexOf(\"user-scalable=no\")!==-1){return true}if(chromeVersion>31&&window.innerWidth<=window.screen.width){return true}}}else{return true}}if(layer.style.msTouchAction===\"none\"){return true}return false};FastClick.attach=function(layer){\"use strict\";return new FastClick(layer)};if(typeof define!==\"undefined\"&&define.amd){define(function(){\"use strict\";return FastClick})}else if(typeof module!==\"undefined\"&&module.exports){module.exports=FastClick.attach;module.exports.FastClick=FastClick}else{window.FastClick=FastClick}});require.register(\"switchery/switchery.js\",function(exports,require,module){var transitionize=require(\"transitionize\"),fastclick=require(\"fastclick\");module.exports=Switchery;var defaults={color:\"#64bd63\",secondaryColor:\"#dfdfdf\",className:\"switchery\",disabled:false,disabledOpacity:.5,speed:\"0.4s\"};function Switchery(element,options){if(!(this instanceof Switchery))return new Switchery(element,options);this.element=element;this.options=options||{};for(var i in defaults){if(this.options[i]==null){this.options[i]=defaults[i]}}if(this.element!=null&&this.element.type==\"checkbox\")this.init()}Switchery.prototype.hide=function(){this.element.style.display=\"none\"};Switchery.prototype.show=function(){var switcher=this.create();this.insertAfter(this.element,switcher)};Switchery.prototype.create=function(){this.switcher=document.createElement(\"span\");this.jack=document.createElement(\"small\");this.switcher.appendChild(this.jack);this.switcher.className=this.options.className;return this.switcher};Switchery.prototype.insertAfter=function(reference,target){reference.parentNode.insertBefore(target,reference.nextSibling)};Switchery.prototype.isChecked=function(){return this.element.checked};Switchery.prototype.isDisabled=function(){return this.options.disabled||this.element.disabled};Switchery.prototype.setPosition=function(clicked){var checked=this.isChecked(),switcher=this.switcher,jack=this.jack;if(clicked&&checked)checked=false;else if(clicked&&!checked)checked=true;if(checked===true){this.element.checked=true;if(window.getComputedStyle)jack.style.left=parseInt(window.getComputedStyle(switcher).width)-parseInt(window.getComputedStyle(jack).width)+\"px\";else jack.style.left=parseInt(switcher.currentStyle[\"width\"])-parseInt(jack.currentStyle[\"width\"])+\"px\";if(this.options.color)this.colorize();this.setSpeed()}else{jack.style.left=0;this.element.checked=false;this.switcher.style.boxShadow=\"inset 0 0 0 0 \"+this.options.secondaryColor;this.switcher.style.borderColor=this.options.secondaryColor;this.switcher.style.backgroundColor=\"\";this.setSpeed()}};Switchery.prototype.setSpeed=function(){var switcherProp={},jackProp={left:this.options.speed.replace(/[a-z]/,\"\")/2+\"s\"};if(this.isChecked()){switcherProp={border:this.options.speed,\"box-shadow\":this.options.speed,\"background-color\":this.options.speed.replace(/[a-z]/,\"\")*3+\"s\"}}else{switcherProp={border:this.options.speed,\"box-shadow\":this.options.speed}}transitionize(this.switcher,switcherProp);transitionize(this.jack,jackProp)};Switchery.prototype.setAttributes=function(){var id=this.element.getAttribute(\"id\"),name=this.element.getAttribute(\"name\");if(id)this.switcher.setAttribute(\"id\",id);if(name)this.switcher.setAttribute(\"name\",name)};Switchery.prototype.colorize=function(){this.switcher.style.backgroundColor=this.options.color;this.switcher.style.borderColor=this.options.color;this.switcher.style.boxShadow=\"inset 0 0 0 16px \"+this.options.color};Switchery.prototype.handleOnchange=function(state){if(typeof Event===\"function\"||!document.fireEvent){var event=document.createEvent(\"HTMLEvents\");event.initEvent(\"change\",true,true);this.element.dispatchEvent(event)}else{this.element.fireEvent(\"onchange\")}};Switchery.prototype.handleChange=function(){var self=this,el=this.element;if(el.addEventListener){el.addEventListener(\"change\",function(){self.setPosition()})}else{el.attachEvent(\"onchange\",function(){self.setPosition()})}};Switchery.prototype.handleClick=function(){var self=this,switcher=this.switcher;if(this.isDisabled()===false){fastclick(switcher);if(switcher.addEventListener){switcher.addEventListener(\"click\",function(){self.setPosition(true);self.handleOnchange(self.element.checked)})}else{switcher.attachEvent(\"onclick\",function(){self.setPosition(true);self.handleOnchange(self.element.checked)})}}else{this.element.disabled=true;this.switcher.style.opacity=this.options.disabledOpacity}};Switchery.prototype.disableLabel=function(){var parent=this.element.parentNode,labels=document.getElementsByTagName(\"label\"),attached=null;for(var i=0;i<labels.length;i++){if(labels[i].getAttribute(\"for\")===this.element.id){attached=true}}if(attached===true||parent.tagName.toLowerCase()===\"label\"){if(parent.addEventListener){parent.addEventListener(\"click\",function(e){e.preventDefault()})}else{parent.attachEvent(\"onclick\",function(e){e.returnValue=false})}}};Switchery.prototype.markAsSwitched=function(){this.element.setAttribute(\"data-switchery\",true)};Switchery.prototype.markedAsSwitched=function(){return this.element.getAttribute(\"data-switchery\")};Switchery.prototype.init=function(){this.hide();this.show();this.setPosition();this.setAttributes();this.markAsSwitched();this.disableLabel();this.handleChange();this.handleClick()}});require.alias(\"abpetkov-transitionize/transitionize.js\",\"switchery/deps/transitionize/transitionize.js\");require.alias(\"abpetkov-transitionize/transitionize.js\",\"switchery/deps/transitionize/index.js\");require.alias(\"abpetkov-transitionize/transitionize.js\",\"transitionize/index.js\");require.alias(\"abpetkov-transitionize/transitionize.js\",\"abpetkov-transitionize/index.js\");require.alias(\"ftlabs-fastclick/lib/fastclick.js\",\"switchery/deps/fastclick/lib/fastclick.js\");require.alias(\"ftlabs-fastclick/lib/fastclick.js\",\"switchery/deps/fastclick/index.js\");require.alias(\"ftlabs-fastclick/lib/fastclick.js\",\"fastclick/index.js\");require.alias(\"ftlabs-fastclick/lib/fastclick.js\",\"ftlabs-fastclick/index.js\");require.alias(\"switchery/switchery.js\",\"switchery/index.js\");if(typeof exports==\"object\"){module.exports=require(\"switchery\")}else if(typeof define==\"function\"&&define.amd){define(function(){return require(\"switchery\")})}else{this[\"Switchery\"]=require(\"switchery\")}})();\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/treeview/bootstrap-treeview.js",
    "content": "/* =========================================================\n * bootstrap-treeview.js v1.0.0\n * =========================================================\n * Copyright 2013 Jonathan Miles\n * Project URL : http://www.jondmiles.com/bootstrap-treeview\n *\n * Licensed under the Apache License, Version 2.0 (the \"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://www.apache.org/licenses/LICENSE-2.0\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\n;(function($, window, document, undefined) {\n\n\t/*global jQuery, console*/\n\n\t'use strict';\n\n\tvar pluginName = 'treeview';\n\n\tvar Tree = function(element, options) {\n\n\t\tthis.$element = $(element);\n\t\tthis._element = element;\n\t\tthis._elementId = this._element.id;\n\t\tthis._styleId = this._elementId + '-style';\n\n\t\tthis.tree = [];\n\t\tthis.nodes = [];\n\t\tthis.selectedNode = {};\n\n\t\tthis._init(options);\n\t};\n\n\tTree.defaults = {\n\n\t\tinjectStyle: true,\n\n\t\tlevels: 2,\n\n\t\texpandIcon: 'glyphicon glyphicon-plus',\n\t\tcollapseIcon: 'glyphicon glyphicon-minus',\n\t\tnodeIcon: 'glyphicon glyphicon-stop',\n\n\t\tcolor: undefined, // '#000000',\n\t\tbackColor: undefined, // '#FFFFFF',\n\t\tborderColor: undefined, // '#dddddd',\n\t\tonhoverColor: '#F5F5F5',\n\t\tselectedColor: '#FFFFFF',\n\t\tselectedBackColor: '#428bca',\n\n\t\tenableLinks: false,\n\t\thighlightSelected: true,\n\t\tshowBorder: true,\n\t\tshowTags: false,\n\n\t\t// Event handler for when a node is selected\n\t\tonNodeSelected: undefined\n\t};\n\n\tTree.prototype = {\n\n\t\tremove: function() {\n\n\t\t\tthis._destroy();\n\t\t\t$.removeData(this, 'plugin_' + pluginName);\n\t\t\t$('#' + this._styleId).remove();\n\t\t},\n\n\t\t_destroy: function() {\n\n\t\t\tif (this.initialized) {\n\t\t\t\tthis.$wrapper.remove();\n\t\t\t\tthis.$wrapper = null;\n\n\t\t\t\t// Switch off events\n\t\t\t\tthis._unsubscribeEvents();\n\t\t\t}\n\n\t\t\t// Reset initialized flag\n\t\t\tthis.initialized = false;\n\t\t},\n\n\t\t_init: function(options) {\n\n\t\t\tif (options.data) {\n\t\t\t\tif (typeof options.data === 'string') {\n\t\t\t\t\toptions.data = $.parseJSON(options.data);\n\t\t\t\t}\n\t\t\t\tthis.tree = $.extend(true, [], options.data);\n\t\t\t\tdelete options.data;\n\t\t\t}\n\n\t\t\tthis.options = $.extend({}, Tree.defaults, options);\n\n\t\t\tthis._setInitialLevels(this.tree, 0);\n\n\t\t\tthis._destroy();\n\t\t\tthis._subscribeEvents();\n\t\t\tthis._render();\n\t\t},\n\n\t\t_unsubscribeEvents: function() {\n\n\t\t\tthis.$element.off('click');\n\t\t},\n\n\t\t_subscribeEvents: function() {\n\n\t\t\tthis._unsubscribeEvents();\n\n\t\t\tthis.$element.on('click', $.proxy(this._clickHandler, this));\n\n\t\t\tif (typeof (this.options.onNodeSelected) === 'function') {\n\t\t\t\tthis.$element.on('nodeSelected', this.options.onNodeSelected);\n\t\t\t}\n\t\t},\n\n\t\t_clickHandler: function(event) {\n\n\t\t\tif (!this.options.enableLinks) { event.preventDefault(); }\n\n\t\t\tvar target = $(event.target),\n\t\t\t\tclassList = target.attr('class') ? target.attr('class').split(' ') : [],\n\t\t\t\tnode = this._findNode(target);\n\n\t\t\tif ((classList.indexOf('click-expand') != -1) ||\n\t\t\t\t\t(classList.indexOf('click-collapse') != -1)) {\n\t\t\t\t// Expand or collapse node by toggling child node visibility\n\t\t\t\tthis._toggleNodes(node);\n\t\t\t\tthis._render();\n\t\t\t}\n\t\t\telse if (node) {\n\t\t\t\tthis._setSelectedNode(node);\n\t\t\t}\n\t\t},\n\n\t\t// Looks up the DOM for the closest parent list item to retrieve the\n\t\t// data attribute nodeid, which is used to lookup the node in the flattened structure.\n\t\t_findNode: function(target) {\n\n\t\t\tvar nodeId = target.closest('li.list-group-item').attr('data-nodeid'),\n\t\t\t\tnode = this.nodes[nodeId];\n\n\t\t\tif (!node) {\n\t\t\t\tconsole.log('Error: node does not exist');\n\t\t\t}\n\t\t\treturn node;\n\t\t},\n\n\t\t// Actually triggers the nodeSelected event\n\t\t_triggerNodeSelectedEvent: function(node) {\n\n\t\t\tthis.$element.trigger('nodeSelected', [$.extend(true, {}, node)]);\n\t\t},\n\n\t\t// Handles selecting and unselecting of nodes,\n\t\t// as well as determining whether or not to trigger the nodeSelected event\n\t\t_setSelectedNode: function(node) {\n\n\t\t\tif (!node) { return; }\n\n\t\t\tif (node === this.selectedNode) {\n\t\t\t\tthis.selectedNode = {};\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._triggerNodeSelectedEvent(this.selectedNode = node);\n\t\t\t}\n\n\t\t\tthis._render();\n\t\t},\n\n\t\t// On initialization recurses the entire tree structure\n\t\t// setting expanded / collapsed states based on initial levels\n\t\t_setInitialLevels: function(nodes, level) {\n\n\t\t\tif (!nodes) { return; }\n\t\t\tlevel += 1;\n\n\t\t\tvar self = this;\n\t\t\t$.each(nodes, function addNodes(id, node) {\n\n\t\t\t\tif (level >= self.options.levels) {\n\t\t\t\t\tself._toggleNodes(node);\n\t\t\t\t}\n\n\t\t\t\t// Need to traverse both nodes and _nodes to ensure\n\t\t\t\t// all levels collapsed beyond levels\n\t\t\t\tvar nodes = node.nodes ? node.nodes : node._nodes ? node._nodes : undefined;\n\t\t\t\tif (nodes) {\n\t\t\t\t\treturn self._setInitialLevels(nodes, level);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\t// Toggle renaming nodes -> _nodes, _nodes -> nodes\n\t\t// to simulate expanding or collapsing a node.\n\t\t_toggleNodes: function(node) {\n\n\t\t\tif (!node.nodes && !node._nodes) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (node.nodes) {\n\t\t\t\tnode._nodes = node.nodes;\n\t\t\t\tdelete node.nodes;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tnode.nodes = node._nodes;\n\t\t\t\tdelete node._nodes;\n\t\t\t}\n\t\t},\n\n\t\t_render: function() {\n\n\t\t\tvar self = this;\n\n\t\t\tif (!self.initialized) {\n\n\t\t\t\t// Setup first time only components\n\t\t\t\tself.$element.addClass(pluginName);\n\t\t\t\tself.$wrapper = $(self._template.list);\n\n\t\t\t\tself._injectStyle();\n\n\t\t\t\tself.initialized = true;\n\t\t\t}\n\n\t\t\tself.$element.empty().append(self.$wrapper.empty());\n\n\t\t\t// Build tree\n\t\t\tself.nodes = [];\n\t\t\tself._buildTree(self.tree, 0);\n\t\t},\n\n\t\t// Starting from the root node, and recursing down the\n\t\t// structure we build the tree one node at a time\n\t\t_buildTree: function(nodes, level) {\n\n\t\t\tif (!nodes) { return; }\n\t\t\tlevel += 1;\n\n\t\t\tvar self = this;\n\t\t\t$.each(nodes, function addNodes(id, node) {\n\n\t\t\t\tnode.nodeId = self.nodes.length;\n\t\t\t\tself.nodes.push(node);\n\n\t\t\t\tvar treeItem = $(self._template.item)\n\t\t\t\t\t.addClass('node-' + self._elementId)\n\t\t\t\t\t.addClass((node === self.selectedNode) ? 'node-selected' : '')\n\t\t\t\t\t.attr('data-nodeid', node.nodeId)\n\t\t\t\t\t.attr('style', self._buildStyleOverride(node));\n\n\t\t\t\t// Add indent/spacer to mimic tree structure\n\t\t\t\tfor (var i = 0; i < (level - 1); i++) {\n\t\t\t\t\ttreeItem.append(self._template.indent);\n\t\t\t\t}\n\n\t\t\t\t// Add expand, collapse or empty spacer icons\n\t\t\t\t// to facilitate tree structure navigation\n\t\t\t\tif (node._nodes) {\n\t\t\t\t\ttreeItem\n\t\t\t\t\t\t.append($(self._template.iconWrapper)\n\t\t\t\t\t\t\t.append($(self._template.icon)\n\t\t\t\t\t\t\t\t.addClass('click-expand')\n\t\t\t\t\t\t\t\t.addClass(self.options.expandIcon))\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\telse if (node.nodes) {\n\t\t\t\t\ttreeItem\n\t\t\t\t\t\t.append($(self._template.iconWrapper)\n\t\t\t\t\t\t\t.append($(self._template.icon)\n\t\t\t\t\t\t\t\t.addClass('click-collapse')\n\t\t\t\t\t\t\t\t.addClass(self.options.collapseIcon))\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttreeItem\n\t\t\t\t\t\t.append($(self._template.iconWrapper)\n\t\t\t\t\t\t\t.append($(self._template.icon)\n\t\t\t\t\t\t\t\t.addClass('glyphicon'))\n\t\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Add node icon\n\t\t\t\ttreeItem\n\t\t\t\t\t.append($(self._template.iconWrapper)\n\t\t\t\t\t\t.append($(self._template.icon)\n\t\t\t\t\t\t\t.addClass(node.icon ? node.icon : self.options.nodeIcon))\n\t\t\t\t\t);\n\n\t\t\t\t// Add text\n\t\t\t\tif (self.options.enableLinks) {\n\t\t\t\t\t// Add hyperlink\n\t\t\t\t\ttreeItem\n\t\t\t\t\t\t.append($(self._template.link)\n\t\t\t\t\t\t\t.attr('href', node.href)\n\t\t\t\t\t\t\t.append(node.text)\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// otherwise just text\n\t\t\t\t\ttreeItem\n\t\t\t\t\t\t.append(node.text);\n\t\t\t\t}\n\n\t\t\t\t// Add tags as badges\n\t\t\t\tif (self.options.showTags && node.tags) {\n\t\t\t\t\t$.each(node.tags, function addTag(id, tag) {\n\t\t\t\t\t\ttreeItem\n\t\t\t\t\t\t\t.append($(self._template.badge)\n\t\t\t\t\t\t\t\t.append(tag)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Add item to the tree\n\t\t\t\tself.$wrapper.append(treeItem);\n\n\t\t\t\t// Recursively add child ndoes\n\t\t\t\tif (node.nodes) {\n\t\t\t\t\treturn self._buildTree(node.nodes, level);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\t// Define any node level style override for\n\t\t// 1. selectedNode\n\t\t// 2. node|data assigned color overrides\n\t\t_buildStyleOverride: function(node) {\n\n\t\t\tvar style = '';\n\t\t\tif (this.options.highlightSelected && (node === this.selectedNode)) {\n\t\t\t\tstyle += 'color:' + this.options.selectedColor + ';';\n\t\t\t}\n\t\t\telse if (node.color) {\n\t\t\t\tstyle += 'color:' + node.color + ';';\n\t\t\t}\n\n\t\t\tif (this.options.highlightSelected && (node === this.selectedNode)) {\n\t\t\t\tstyle += 'background-color:' + this.options.selectedBackColor + ';';\n\t\t\t}\n\t\t\telse if (node.backColor) {\n\t\t\t\tstyle += 'background-color:' + node.backColor + ';';\n\t\t\t}\n\n\t\t\treturn style;\n\t\t},\n\n\t\t// Add inline style into head\n\t\t_injectStyle: function() {\n\n\t\t\tif (this.options.injectStyle && !document.getElementById(this._styleId)) {\n\t\t\t\t$('<style type=\"text/css\" id=\"' + this._styleId + '\"> ' + this._buildStyle() + ' </style>').appendTo('head');\n\t\t\t}\n\t\t},\n\n\t\t// Construct trees style based on user options\n\t\t_buildStyle: function() {\n\n\t\t\tvar style = '.node-' + this._elementId + '{';\n\t\t\tif (this.options.color) {\n\t\t\t\tstyle += 'color:' + this.options.color + ';';\n\t\t\t}\n\t\t\tif (this.options.backColor) {\n\t\t\t\tstyle += 'background-color:' + this.options.backColor + ';';\n\t\t\t}\n\t\t\tif (!this.options.showBorder) {\n\t\t\t\tstyle += 'border:none;';\n\t\t\t}\n\t\t\telse if (this.options.borderColor) {\n\t\t\t\tstyle += 'border:1px solid ' + this.options.borderColor + ';';\n\t\t\t}\n\t\t\tstyle += '}';\n\n\t\t\tif (this.options.onhoverColor) {\n\t\t\t\tstyle += '.node-' + this._elementId + ':hover{' +\n\t\t\t\t'background-color:' + this.options.onhoverColor + ';' +\n\t\t\t\t'}';\n\t\t\t}\n\n\t\t\treturn this._css + style;\n\t\t},\n\n\t\t_template: {\n\t\t\tlist: '<ul class=\"list-group\"></ul>',\n\t\t\titem: '<li class=\"list-group-item\"></li>',\n\t\t\tindent: '<span class=\"indent\"></span>',\n\t\t\ticonWrapper: '<span class=\"icon\"></span>',\n\t\t\ticon: '<i></i>',\n\t\t\tlink: '<a href=\"#\" style=\"color:inherit;\"></a>',\n\t\t\tbadge: '<span class=\"badge\"></span>'\n\t\t},\n\n\t\t_css: '.list-group-item{cursor:pointer;}span.indent{margin-left:10px;margin-right:10px}span.icon{margin-right:5px}'\n\t\t// _css: '.list-group-item{cursor:pointer;}.list-group-item:hover{background-color:#f5f5f5;}span.indent{margin-left:10px;margin-right:10px}span.icon{margin-right:5px}'\n\n\t};\n\n\tvar logError = function(message) {\n        if(window.console) {\n            window.console.error(message);\n        }\n    };\n\n\t// Prevent against multiple instantiations,\n\t// handle updates and method calls\n\t$.fn[pluginName] = function(options, args) {\n\t\treturn this.each(function() {\n\t\t\tvar self = $.data(this, 'plugin_' + pluginName);\n\t\t\tif (typeof options === 'string') {\n\t\t\t\tif (!self) {\n\t\t\t\t\tlogError('Not initialized, can not call method : ' + options);\n\t\t\t\t}\n\t\t\t\telse if (!$.isFunction(self[options]) || options.charAt(0) === '_') {\n\t\t\t\t\tlogError('No such method : ' + options);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (typeof args === 'string') {\n\t\t\t\t\t\targs = [args];\n\t\t\t\t\t}\n\t\t\t\t\tself[options].apply(self, args);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (!self) {\n\t\t\t\t\t$.data(this, 'plugin_' + pluginName, new Tree(this, $.extend(true, {}, options)));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tself._init(options);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n})(jQuery, window, document);\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/js/plugins/webuploader/index.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html><head>\n<title>403 Forbidden</title>\n</head><body>\n<h1>Forbidden</h1>\n<p>You don't have permission to access /theme/hplus/js/plugins/webuploader/\non this server.</p>\n<hr>\n<address>Apache Server at www.zi-han.net Port 80</address>\n</body></html>\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/plugins/fullavatareditor/scripts/fullAvatarEditor.js",
    "content": "function fullAvatarEditor() {\n\tvar id\t\t\t\t= 'fullAvatarEditor'\t\t\t//flash文件的ID\n\tvar file\t\t\t= 'plugins/fullavatareditor/fullAvatarEditor.swf';\t\t//flash文件的路径\n\tvar\tversion\t\t\t= \"10.1.0\";\t\t\t\t\t\t//播放该flash所需的最低版本\n\tvar\texpressInstall\t= 'expressInstall.swf';\t\t\t//expressInstall.swf的路径\n\tvar\twidth\t\t\t= 600;\t\t\t\t\t\t\t//flash文件的宽度\n\tvar\theight\t\t\t= 430;\t\t\t\t\t\t\t//flash文件的高度\n\tvar container\t\t= id;\t\t\t\t\t\t\t//装载flash文件的容器(如div)的id\n\tvar flashvars\t\t= {};\n\tvar callback\t\t= function(){};\n\tvar heightChanged\t= false;\n\t//智能获取参数，字符类型为装载flash文件的容器(如div)的id，第一个数字类型的为高度，第二个为宽度，第一个object类型的为参数对象，如此4个参数的顺序可随意。\n\tfor(var i = 0; i < arguments.length; i++)\n\t{\n\t\tif(typeof arguments[i] == 'string')\n\t\t{\n\t\t\tcontainer = arguments[i];\n\t\t}\n\t\telse if(typeof arguments[i] == 'number')\n\t\t{\n\t\t\tif(heightChanged)\n\t\t\t{\n\t\t\t\twidth = arguments[i];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\theight = arguments[i];\n\t\t\t\theightChanged = true;\n\t\t\t}\n\t\t}\n\t\telse if(typeof arguments[i] == 'function')\n\t\t{\n\t\t\tcallback = arguments[i];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tflashvars = arguments[i];\n\t\t}\n\t}\n\tvar vars = {\n\t\tid : id\n\t};\n\t//合并参数\n\tfor (var name in flashvars)\n\t{\n\t\tif(flashvars[name] != null)\n\t\t{\n\t\t\tif(name == 'upload_url' || name == 'src_url')\n\t\t\t{\n\t\t\t\tvars[name] = encodeURIComponent(flashvars[name]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvars[name] = flashvars[name];\n\t\t\t}\n\t\t}\n\t}\n\tvar params = {\n\t\tmenu\t\t\t\t: 'true',\n\t\tscale\t\t\t\t: 'noScale',\n\t\tallowFullscreen\t\t: 'true',\n\t\tallowScriptAccess\t: 'always',\n\t\twmode\t\t\t\t: 'transparent'\n\t};\n\tvar attributes = {\n\t\tid\t: vars.id,\n\t\tname: vars.id\n\t};\n\tvar swf = null;\n\tvar\tcallbackFn = function (e) {\n\t\tswf = e.ref;\n\t\tswf.eventHandler = function(json){\n\t\t\tcallback.call(swf, json);\n\t\t};\n\t};\n\tswfobject.embedSWF(\n\t\tfile,\n\t\tcontainer,\n\t\twidth,\n\t\theight,\n\t\tversion,\n\t\texpressInstall,\n\t\tvars,\n\t\tparams,\n\t\tattributes,\n\t\tcallbackFn\n\t);\n\treturn swf;\n}\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/plugins/fullavatareditor/scripts/jQuery.Cookie.js",
    "content": "/**\n * Cookie plugin\n *\n * Copyright (c) 2006 Klaus Hartl (stilbuero.de)\n * Dual licensed under the MIT and GPL licenses:\n * http://www.opensource.org/licenses/mit-license.php\n * http://www.gnu.org/licenses/gpl.html\n *\n */\n\n/**\n * Create a Cookie with the given name and value and other optional parameters.\n *\n * @example $.Cookie('the_cookie', 'the_value');\n * @desc Set the value of a Cookie.\n * @example $.Cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true });\n * @desc Create a Cookie with all available options.\n * @example $.Cookie('the_cookie', 'the_value');\n * @desc Create a session Cookie.\n * @example $.Cookie('the_cookie', null);\n * @desc Delete a Cookie by passing null as value. Keep in mind that you have to use the same path and domain\n *       used when the Cookie was set.\n *\n * @param String name The name of the Cookie.\n * @param String value The value of the Cookie.\n * @param Object options An object literal containing key/value pairs to provide optional Cookie attributes.\n * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.\n *                             If a negative value is specified (e.g. a date in the past), the Cookie will be deleted.\n *                             If set to null or omitted, the Cookie will be a session Cookie and will not be retained\n *                             when the the browser exits.\n * @option String path The value of the path atribute of the Cookie (default: path of page that created the Cookie).\n * @option String domain The value of the domain attribute of the Cookie (default: domain of page that created the Cookie).\n * @option Boolean secure If true, the secure attribute of the Cookie will be set and the Cookie transmission will\n *                        require a secure protocol (like HTTPS).\n * @type undefined\n *\n * @name $.Cookie\n * @cat Plugins/Cookie\n * @author Klaus Hartl/klaus.hartl@stilbuero.de\n */\n\n/**\n * Get the value of a Cookie with the given name.\n *\n * @example $.Cookie('the_cookie');\n * @desc Get the value of a Cookie.\n *\n * @param String name The name of the Cookie.\n * @return The value of the Cookie.\n * @type String\n *\n * @name $.Cookie\n * @cat Plugins/Cookie\n * @author Klaus Hartl/klaus.hartl@stilbuero.de\n */\n$.Cookie = function(name, value, options) {\n    if (typeof value != 'undefined') { // name and value given, set Cookie\n        options = options || {};\n        if (value === null) {\n            value = '';\n            options.expires = -1;\n        }\n        var expires = '';\n        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {\n            var date;\n            if (typeof options.expires == 'number') {\n                date = new Date();\n                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));\n            } else {\n                date = options.expires;\n            }\n            expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE\n        }\n        // CAUTION: Needed to parenthesize options.path and options.domain\n        // in the following expressions, otherwise they evaluate to undefined\n        // in the packed version for some reason...\n        var path = options.path ? '; path=' + (options.path) : '';\n        var domain = options.domain ? '; domain=' + (options.domain) : '';\n        var secure = options.secure ? '; secure' : '';\n        document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');\n    } else { // only name given, get Cookie\n        var cookieValue = null;\n        if (document.cookie && document.cookie != '') {\n            var cookies = document.cookie.split(';');\n            for (var i = 0; i < cookies.length; i++) {\n                var cookie = jQuery.trim(cookies[i]);\n                // Does this cookie string begin with the name we want?\n                if (cookie.substring(0, name.length + 1) == (name + '=')) {\n                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));\n                    break;\n                }\n            }\n        }\n        return cookieValue;\n    }\n};\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/plugins/fullavatareditor/scripts/swfobject.js",
    "content": "/*\tSWFObject v2.2 <http://code.google.com/p/swfobject/>\n\tis released under the MIT License <http://www.opensource.org/licenses/mit-license.php>\n*/\nvar swfobject=function(){var D=\"undefined\",r=\"object\",S=\"Shockwave Flash\",W=\"ShockwaveFlash.ShockwaveFlash\",q=\"application/x-shockwave-flash\",R=\"SWFObjectExprInst\",x=\"onreadystatechange\",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\\/(\\d+(\\.\\d+)?).*$/,\"$1\")):false,X=!+\"\\v1\",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\\s+(\\S+\\s+\\S+$)/,\"$1\");ag[0]=parseInt(ab.replace(/^(.*)\\..*$/,\"$1\"),10);ag[1]=parseInt(ab.replace(/^.*\\.(.*)\\s.*$/,\"$1\"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,\"$1\"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable(\"$version\");if(ab){X=true;ab=ab.split(\" \")[1].split(\",\");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState==\"complete\")||(typeof j.readyState==D&&(j.getElementsByTagName(\"body\")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener(\"DOMContentLoaded\",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState==\"complete\"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll(\"left\")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName(\"body\")[0].appendChild(C(\"span\"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener(\"load\",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener(\"load\",Y,false)}else{if(typeof O.attachEvent!=D){i(O,\"onload\",Y)}else{if(typeof O.onload==\"function\"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName(\"body\")[0];var aa=C(r);aa.setAttribute(\"type\",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable(\"$version\");if(ab){ab=ab.split(\" \")[1].split(\",\");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute(\"width\")||\"0\";ai.height=ae.getAttribute(\"height\")||\"0\";if(ae.getAttribute(\"class\")){ai.styleclass=ae.getAttribute(\"class\")}if(ae.getAttribute(\"align\")){ai.align=ae.getAttribute(\"align\")}var ah={};var X=ae.getElementsByTagName(\"param\");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute(\"name\").toLowerCase()!=\"movie\"){ah[X[ad].getAttribute(\"name\")]=X[ad].getAttribute(\"value\")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName==\"OBJECT\"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F(\"6.0.65\")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName==\"OBJECT\"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width=\"310\"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height=\"137\"}j.title=j.title.slice(0,47)+\" - Flash Player Installation\";var ad=M.ie&&M.win?\"ActiveX\":\"PlugIn\",ac=\"MMredirectURL=\"+O.location.toString().replace(/&/g,\"%26\")+\"&MMplayerType=\"+ad+\"&MMdoctitle=\"+j.title;if(typeof ab.flashvars!=D){ab.flashvars+=\"&\"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C(\"div\");X+=\"SWFObjectNew\";Y.setAttribute(\"id\",X);ae.parentNode.insertBefore(Y,ae);ae.style.display=\"none\";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C(\"div\");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display=\"none\";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C(\"div\");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName==\"PARAM\")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah=\"\";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()==\"data\"){ag.movie=ai[ae]}else{if(ae.toLowerCase()==\"styleclass\"){ah+=' class=\"'+ai[ae]+'\"'}else{if(ae.toLowerCase()!=\"classid\"){ah+=\" \"+ae+'=\"'+ai[ae]+'\"'}}}}}var af=\"\";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name=\"'+ad+'\" value=\"'+ag[ad]+'\" />'}}aa.outerHTML='<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"'+ah+\">\"+af+\"</object>\";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute(\"type\",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()==\"styleclass\"){Z.setAttribute(\"class\",ai[ac])}else{if(ac.toLowerCase()!=\"classid\"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!=\"movie\"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C(\"param\");aa.setAttribute(\"name\",X);aa.setAttribute(\"value\",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName==\"OBJECT\"){if(M.ie&&M.win){X.style.display=\"none\";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]==\"function\"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(\".\");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName(\"head\")[0];if(!aa){return}var X=(ad&&typeof ad==\"string\")?ad:\"screen\";if(ab){n=null;G=null}if(!n||G!=X){var Z=C(\"style\");Z.setAttribute(\"type\",\"text/css\");Z.setAttribute(\"media\",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+\" {\"+Y+\"}\"))}}}function w(Z,X){if(!m){return}var Y=X?\"visible\":\"hidden\";if(J&&c(Z)){c(Z).style.visibility=Y}else{v(\"#\"+Z,\"visibility:\"+Y)}}function L(Y){var Z=/[\\\\\\\"<>\\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent(\"onunload\",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+=\"\";ag+=\"\";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+=\"&\"+ai+\"=\"+Z[ai]}else{am.flashvars=ai+\"=\"+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\\?/.test(Z)){Z=Z.split(\"?\")[1]}if(aa==null){return L(Z)}var Y=Z.split(\"&\");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf(\"=\"))==aa){return L(Y[X].substring((Y[X].indexOf(\"=\")+1)))}}}return\"\"},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display=\"block\"}}if(E){E(B)}}a=false}}}}();\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/plugins/fullavatareditor/scripts/test.js",
    "content": "swfobject.addDomLoadEvent(function () {\n    //------------------------------------------------------------------------------示例一\n    var webcamAvailable = false;\n    var currentTab = 'upload';\n\tvar sourcePic1Url = $.Cookie('swf1');\n\tvar sourcePic2Url = $.Cookie('swf2');\n\tif(sourcePic2Url == null)\n\t{\n\t\tsourcePic2Url = \"http://www.baidu.com/img/bdlogo.png\";\n\t}\n    var callback = function (json) {\n\t\tvar id = this.id;\n        switch (json.code) {\n            case 2:\n                //如果加载原图成功，说明进入了编辑面板，显示保存和取消按钮，隐藏拍照按钮\n                if (json.type == 0) {\n\t\t\t\t\tif(id == \"swf1\")\n\t\t\t\t\t{\n\t\t\t\t\t\t$('#webcamPanelButton').hide();\n\t\t\t\t\t\t$('#editorPanelButtons').show();\n\t\t\t\t\t}\n                }\n                //否则会转到上传面板\n                else {\n                    //隐藏所有按钮\n                    if(id == \"swf1\")$('#editorPanelButtons,#webcamPanelButton').hide();\n                }\n                break;\n            case 3:\n                //如果摄像头已准备就绪且用户已允许使用，显示拍照按钮。\n                if (json.type == 0) {\n                    if(id == \"swf1\")\n\t\t\t\t\t{\n\t\t\t\t\t\t$('.button_shutter').removeClass('Disabled');\n\t\t\t\t\t\t$('#webcamPanelButton').show();\n\t\t\t\t\t\twebcamAvailable = true;\n\t\t\t\t\t}\n                }\n                else {\n\t\t\t\t\tif(id == \"swf1\")\n\t\t\t\t\t{\n\t\t\t\t\t\twebcamAvailable = false;\n\t\t\t\t\t\t$('#webcamPanelButton').hide();\n\t\t\t\t\t}\n                    //如果摄像头已准备就绪但用户已拒绝使用。\n                    if (json.type == 1) {\n                        alert('用户拒绝使用摄像头!');\n                    }\n                    //如果摄像头已准备就绪但摄像头被占用。\n                    else {\n                        alert('摄像头被占用!');\n                    }\n                }\n                break;\n            case 4:\n                alert(\"您选择的原图片文件大小（\" + json.content + \"）超出了指定的值(2MB)。\");\n                break;\n            case 5:\n                //如果上传成功\n                if (json.type == 0) {\n\t\t\t\t\tvar e = this;\n\t\t\t\t\tvar html = $('<div class=\"imgList\"/>');\n\t\t\t\t\tfor(var i = 0; i < json.content.avatarUrls.length; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\thtml.append('<dl><dt>头像图片'+(i+1)+'</dt><dd><img src=\"' + json.content.avatarUrls[i] + '\" /></dd></dl>');\n\t\t\t\t\t}\n\t\t\t\t\tvar button = [];\n\t\t\t\t\t//如果上传了原图，给个修改按钮，感受视图初始化带来的用户体验度提升\n\t\t\t\t\tif(json.content.sourceUrl)\n\t\t\t\t\t{\n\t\t\t\t\t\tbutton.push({text : '修改头像', callback:function(){\n\t\t\t\t\t\t\tthis.close();\n\t\t\t\t\t\t\t$.Cookie(id, json.content.sourceUrl);\n\t\t\t\t\t\t\tlocation.reload();\n\t\t\t\t\t\t\t//e.call('loadPic', json.content.sourceUrl);\n\t\t\t\t\t\t}});\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$.Cookie(id, null);\n\t\t\t\t\t}\n\t\t\t\t\tbutton.push({text : '关闭窗口'});\n\t\t\t\t\t$.dialog({\n\t\t\t\t\t\ttitle:'图片已成功保存至服务器',\n\t\t\t\t\t\tcontent:html,\n\t\t\t\t\t\tbutton:button,\n\t\t\t\t\t\tmask:true,\n\t\t\t\t\t\tdraggable:false\n\t\t\t\t\t});\n                }\n                else {\n                    alert(json.type);\n                }\n                break;\n        }\n    };\n    var swf1 = new fullAvatarEditor('swf1', 335, {\n\t\tid : 'swf1',\n        upload_url : 'upload.php',\n\t\tsrc_url : sourcePic1Url,\t\t\t//默认加载的原图片的url\n        tab_visible : false,\t\t\t\t//不显示选项卡，外部自定义\n        button_visible : false,\t\t\t\t//不显示按钮，外部自定义\n        src_upload : 2,\t\t\t\t\t\t//是否上传原图片的选项：2-显示复选框由用户选择，0-不上传，1-上传\n        checkbox_visible : false,\t\t\t//不显示复选框，外部自定义\n        browse_box_align : 38,\t\t\t\t//图片选择框的水平对齐方式。left：左对齐；center：居中对齐；right：右对齐；数值：相对于舞台的x坐标\n\t\twebcam_box_align : 38,\t\t\t\t//摄像头拍照框的水平对齐方式，如上。\n\t\tavatar_sizes : '258*200',\t\t\t//定义单个头像\n\t\tavatar_sizes_desc :'258*200像素',\t   //头像尺寸的提示文本。\n        browse_box_align:'left',            //头像选择框对齐方式\n        webcam_box_align:'left',            //头像拍照框对齐方式\n\t\t//头像简介\n\t\tavatar_intro : '     最终会生成下面这个尺寸的头像',\n\t\tavatar_tools_visible:true\t\t\t//是否显示颜色调整工具\n    }, callback);\n    //选项卡点击事件\n    $('#avatar-tab li').click(function () {\n        if (currentTab != this.id) {\n            currentTab = this.id;\n            $(this).addClass('active');\n            $(this).siblings().removeClass('active');\n            //如果是点击“相册选取”\n            if (this.id === 'albums') {\n                //隐藏flash\n                hideSWF();\n                showAlbums();\n            }\n            else {\n                hideAlbums();\n                showSWF();\n                if (this.id === 'webcam') {\n                    $('#editorPanelButtons').hide();\n                    if (webcamAvailable) {\n                        $('.button_shutter').removeClass('Disabled');\n                        $('#webcamPanelButton').show();\n                    }\n                }\n                else {\n                    //隐藏所有按钮\n                    $('#editorPanelButtons,#webcamPanelButton').hide();\n                }\n            }\n            swf1.call('changepanel', this.id);\n        }\n    });\n    //复选框事件\n    $('#src_upload').change(function () {\n        swf1.call('srcUpload', this.checked);\n    });\n    //点击上传按钮的事件\n    $('.button_upload').click(function () {\n        swf1.call('upload');\n    });\n    //点击取消按钮的事件\n    $('.button_cancel').click(function () {\n        var activedTab = $('#avatar-tab li.active')[0].id;\n        if (activedTab === 'albums') {\n            hideSWF();\n            showAlbums();\n        }\n        else {\n            swf1.call('changepanel', activedTab);\n            if (activedTab === 'webcam') {\n                $('#editorPanelButtons').hide();\n                if (webcamAvailable) {\n                    $('.button_shutter').removeClass('Disabled');\n                    $('#webcamPanelButton').show();\n                }\n            }\n            else {\n                //隐藏所有按钮\n                $('#editorPanelButtons,#webcamPanelButton').hide();\n            }\n        }\n    });\n    //点击拍照按钮的事件\n    $('.button_shutter').click(function () {\n        if (!$(this).hasClass('Disabled')) {\n            $(this).addClass('Disabled');\n            swf1.call('pressShutter');\n        }\n    });\n    //从相册中选取\n    $('#userAlbums a').click(function () {\n        var sourcePic = this.href;\n        swf1.call('loadPic', sourcePic);\n        //隐藏相册\n        hideAlbums();\n        //显示flash\n        showSWF();\n        return false;\n    });\n    //隐藏flash的函数\n    function hideSWF() {\n        //将宽高设置为0的方式来隐藏flash，而不能使用将其display样式设置为none的方式来隐藏，否则flash将不会被加载，隐藏时储存其宽高，以便后期恢复\n        $('#flash1').data({\n            w: $('#flash1').width(),\n            h: $('#flash1').height()\n        })\n\t\t.css({\n\t\t    width: '0px',\n\t\t    height: '0px',\n\t\t    overflow: 'hidden'\n\t\t});\n        //隐藏所有按钮\n        $('#editorPanelButtons,#webcamPanelButton').hide();\n    }\n    function showSWF() {\n        $('#flash1').css({\n            width: $('#flash1').data('w'),\n            height: $('#flash1').data('h')\n        });\n    }\n    //显示相册的函数\n    function showAlbums() {\n        $('#userAlbums').show();\n    }\n    //隐藏相册的函数\n    function hideAlbums() {\n        $('#userAlbums').hide();\n    }\n    //------------------------------------------------------------------------------示例二\n    var swf2 = new fullAvatarEditor('swf2', {\n        id: 'swf2',\n        upload_url: 'upload.php',\t//上传图片的接口地址\n        src_url: sourcePic2Url,\t\t//默认加载的原图片的url\n        src_upload: 2,\t\t\t\t//是否上传原图片的选项：2-显示复选框由用户选择，0-不上传，1-上传\n\t\tavatar_scale:2,\t\t\t\t//头像保存时的缩放系数\n\t\tavatar_intro:'最终头像的尺寸为以下尺寸 * 2(设置的缩放系数)',\t//头像尺寸的提示文本。其间用\"|\"号分隔，\n\t\tavatar_sizes_desc:'100*100像素，缩放系数为2，保存后的大小为200*200像素。|50*50像素，缩放系数为2，保存后的大小为100*100像素。|32*32像素，缩放系数为2，保存后的大小为64*64像素。'\n    }, callback);\n});\n"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/static/test/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <title>Title</title>\n  <link href=\"../css/bootstrap.min.css\" rel=\"stylesheet\">\n  <link href=\"../css/font-awesome.min93e3.css?v=4.4.0\" rel=\"stylesheet\">\n  <link href=\"../css/animate.min.css\" rel=\"stylesheet\">\n  <link href=\"../css/plugins/toastr/toastr.min.css\" rel=\"stylesheet\">\n  <link href=\"../css/style.min.css\" rel=\"stylesheet\">\n  <link href=\"../css/login.min.css\" rel=\"stylesheet\">\n</head>\n<body>\n\n\n<script src=\"../js/jquery.min.js?v=2.1.4\"></script>\n<script src=\"../js/bootstrap.min.js?v=3.3.6\"></script>\n\n<script src=\"../js/plugins/toastr/toastr.min.js\"></script>\n<script src=\"../js/plugins/layer/layer.min.js\"></script>\n\n<script >\n  $(function() {\n    parent.layer.alert('请联系管理员', {\n      skin: 'layui-layer-molv'\n    });\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    /*if (\"11\") {\n      var msg = \"<h3>发生错误.</h3>\";\n      toastr.options = {\n        \"closeButton\": true,\n        \"debug\": false,\n        \"progressBar\": true,\n        \"positionClass\": \"toast-top-right\",\n        \"onclick\": null,\n        \"showDuration\": \"400\",\n        \"hideDuration\": \"400\",\n        \"timeOut\": \"7000\",\n        \"extendedTimeOut\": \"1000\",\n        \"showEasing\": \"swing\",\n        \"hideEasing\": \"linear\",\n        \"showMethod\": \"fadeIn\",\n        \"hideMethod\": \"fadeOut\"\n      }\n      toastr[\"error\"](msg);\n    }*/\n  });\n</script>\n</body>\n</html>"
  },
  {
    "path": "weixin-web-manage/src/main/webapp/test.jsp",
    "content": "<html>\n<body>\n<h2>Hello World!--test</h2>\n</body>\n</html>\n"
  },
  {
    "path": "weixin-web-mobile/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n  <parent>\n    <artifactId>Weixin-Dubbo</artifactId>\n    <groupId>com.cheng</groupId>\n    <version>1.0-SNAPSHOT</version>\n  </parent>\n  <modelVersion>4.0.0</modelVersion>\n  <artifactId>weixin-web-mobile</artifactId>\n  <packaging>war</packaging>\n  <name>weixin-web-mobile</name>\n  <url>http://maven.apache.org</url>\n  <dependencies>\n    <dependency>\n      <groupId>${parent.groupId}</groupId>\n      <artifactId>weixin-common</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${parent.groupId}</groupId>\n      <artifactId>weixin-common-config</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${parent.groupId}</groupId>\n      <artifactId>weixin-rpc-wxtools</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${parent.groupId}</groupId>\n      <artifactId>weixin-rpc-redis</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${parent.groupId}</groupId>\n      <artifactId>weixin-rpc-cart</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${parent.groupId}</groupId>\n      <artifactId>weixin-rpc-item</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${parent.groupId}</groupId>\n      <artifactId>weixin-rpc-system</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${parent.groupId}</groupId>\n      <artifactId>weixin-rpc-rabbitmq</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${parent.groupId}</groupId>\n      <artifactId>weixin-rpc-message</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${parent.groupId}</groupId>\n      <artifactId>weixin-rpc-user</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${parent.groupId}</groupId>\n      <artifactId>weixin-rabbitmq-model</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${parent.groupId}</groupId>\n      <artifactId>weixin-rpc-order</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${parent.groupId}</groupId>\n      <artifactId>weixin-rpc-comment</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>${parent.groupId}</groupId>\n      <artifactId>weixin-rpc-promotion</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>log4j</groupId>\n      <artifactId>log4j</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.slf4j</groupId>\n      <artifactId>slf4j-log4j12</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>commons-logging</groupId>\n      <artifactId>commons-logging</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.fasterxml.jackson.core</groupId>\n      <artifactId>jackson-core</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.fasterxml.jackson.core</groupId>\n      <artifactId>jackson-databind</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.fasterxml.jackson.core</groupId>\n      <artifactId>jackson-annotations</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>javax.servlet</groupId>\n      <artifactId>javax.servlet-api</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>fastjson</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.github.pagehelper</groupId>\n      <artifactId>pagehelper</artifactId>\n    </dependency>\n    <!-- Dubbo Start -->\n    <dependency>\n      <groupId>com.alibaba</groupId>\n      <artifactId>dubbo</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.101tec</groupId>\n      <artifactId>zkclient</artifactId>\n    </dependency>\n    <!-- Dubbo End -->\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-webmvc</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-web</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-test</artifactId>\n    </dependency>\n    <!-- Aspectj -->\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjrt</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.aspectj</groupId>\n      <artifactId>aspectjweaver</artifactId>\n    </dependency>\n  </dependencies>\n  <build>\n    <finalName>moblie</finalName>\n    <plugins>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-compiler-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-source-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.zeroturnaround</groupId>\n        <artifactId>jrebel-maven-plugin</artifactId>\n      </plugin>\n      <plugin>\n        <groupId>org.mortbay.jetty</groupId>\n        <artifactId>jetty-maven-plugin</artifactId>\n        <configuration>\n          <scanIntervalSeconds>0</scanIntervalSeconds>\n          <webApp>\n            <contextPath>/${project.build.finalName}</contextPath>\n          </webApp>\n        </configuration>\n      </plugin>\n    </plugins>\n  </build>\n</project>\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/ControllerExceptionHandle.java",
    "content": "package com.cheng.weixin.web.mobile;\n\n//import com.cheng.weixin.commom.exception.MassageException;\n//import org.slf4j.Logger;\n//import org.slf4j.LoggerFactory;\n//import org.springframework.web.bind.annotation.ControllerAdvice;\n//import org.springframework.web.bind.annotation.ExceptionHandler;\n//\n//import javax.servlet.http.HttpServletRequest;\n//import javax.servlet.http.HttpServletResponse;\n//import java.io.IOException;\n\n//import java.io.IOException;\n\n//@ControllerAdvice\npublic class ControllerExceptionHandle {\n\t//private static final Logger log = LoggerFactory.getLogger(ControllerExceptionHandle.class);\n\t//\n\t///**\n\t// * 处理消息异常\n\t// * @param response\n\t// * @param exception\n\t// * @throws IOException\n\t// */\n\t//@ExceptionHandler(MassageException.class)\n\t//public void handleMassageException(HttpServletRequest request, HttpServletResponse response, Exception exception) throws IOException {\n\t//\tMassageException msgException = (MassageException) exception;\n\t//\tlog.error(\"请求处理异常，错误代码：{}，错误消息：{}\",msgException.getCode(), msgException.getErrorMsg());\n\t//\n\t//\tresponse.getWriter().write(\"success\");\n\t//\n\t//\t/* 这块代码有问题\n\t//\tMap<String, String> msgMap = new HashMap<>();\n\t//\tString content = \"请求处理异常，请稍后再试！\";\n\t//\ttry {\n\t//\t\tString msg = IOUtils.toString(request.getInputStream(),\"UTF-8\");\n\t//\t\tlog.debug(\"\\n接收到的XML为（还未处理）：\\n{}\", msg);\n\t//\t\tDocument document = DocumentHelper.parseText(msg);\n\t//\t\tElement root = document.getRootElement();\n\t//\t\tList<Element> elements = root.elements();\n\t//\t\tfor(Element element:elements) {\n\t//\t\t\tmsgMap.put(element.getName(), element.getText());\n\t//\t\t}\n\t//\t\tTextMessage textMsg = new TextMessage();\n\t//\t\ttextMsg.setToUserName(msgMap.get(\"FromUserName\"));\n\t//\t\ttextMsg.setFromUserName(msgMap.get(\"ToUserName\"));\n\t//\t\ttextMsg.setCreateTime(new Date().getTime());\n\t//\t\ttextMsg.setMsgType(MsgType.text);\n\t//\t\ttextMsg.setContent(content);\n\t//\t\tresponse.getWriter().write(XMLUtils.msg2XML(textMsg));\n\t//\t} catch (IOException | DocumentException e) {\n\t//\t\tresponse.getWriter().write(\"success\");\n\t//\t\tlog.error(\"异常处理时发生错误，错误消息：{}\", e.getMessage());\n\t//\t}*/\n\t//\n\t//}\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/WeixinController.java",
    "content": "package com.cheng.weixin.web.mobile;\n\n//import com.cheng.weixin.commom.utils.StringUtils;\n//import com.cheng.weixin.commom.constant.weixin.WeixinFinalValue;\n//import com.cheng.weixin.rpc.wxtools.content.WeixinContent;\n//import com.cheng.weixin.rpc.wxtools.service.RpcMessageHandleService;\n//import org.apache.commons.codec.digest.DigestUtils;\n//import org.slf4j.Logger;\n//import org.slf4j.LoggerFactory;\n//import org.springframework.stereotype.Controller;\n//import org.springframework.web.bind.annotation.RequestMapping;\n//import org.springframework.web.bind.annotation.RequestMethod;\n//\n//import javax.annotation.Resource;\n//import javax.servlet.http.HttpServletRequest;\n//import javax.servlet.http.HttpServletResponse;\n//import java.io.IOException;\n//import java.util.Arrays;\n//import java.util.Map;\n//\n//@Controller\npublic class WeixinController {\n//\tprivate static final Logger log = LoggerFactory.getLogger(WeixinController.class);\n//\n//\t@Resource\n//\tprivate WeixinFinalValue weixinFinalValue;\n//\t@Resource\n//\tprivate RpcMessageHandleService messageHandle;\n//\n//\t@RequestMapping(value=\"getWxMsg\",method=RequestMethod.GET)\n//\tpublic void initWx(String signature, String timestamp, String nonce, String echostr, HttpServletResponse response) throws IOException {\n//\t\tif(StringUtils.isNoneBlank(signature, timestamp, nonce, echostr)) {\n//\t\t\tString[] arrs = {weixinFinalValue.WX_TOKEN, timestamp, nonce};\n//\t\t\tArrays.sort(arrs);\n//\t\t\tStringBuffer sb = new StringBuffer();\n//\t\t\tfor(String wx:arrs) {\n//\t\t\t\tsb.append(wx);\n//\t\t\t}\n//\t\t\tString sha1 = DigestUtils.sha1Hex(sb.toString());\n//\t\t\tif(signature.equals(sha1)) {\n//\t\t\t\tresponse.getWriter().write(echostr);\n//\t\t\t}\n//\t\t}else {\n//\t\t\tlog.error(\"参数为空，或缺少参数！\");\n//\t\t}\n//\t}\n//\n//\t@RequestMapping(value=\"getWxMsg\",method=RequestMethod.POST)\n//\tpublic void getWxMsg(HttpServletRequest request, HttpServletResponse response) throws IOException {\n//\t\tresponse.setContentType(\"application/xml;charset=utf-8\");\n//\t\tresponse.setCharacterEncoding(\"UTF-8\");\n//\n//\t\tMap<String, String> msgMap = messageHandle.reqMsg2Map(request);\n//\t\tString respMsg = messageHandle.handleResp(msgMap);\n//\n//\t\tlog.debug(\"\\n回复的XML为：\\n{}\", respMsg);\n//\n//\t\tresponse.getWriter().write(respMsg);\n//\n////\t\tif(null!=respMsg) {\n////\t\t\tresponse.getWriter().write(respMsg);\n////\t\t}else {\n////\t\t\tresponse.getWriter().write(\"success\");\n////\t\t}\n//\t}\n//\n//\t@RequestMapping(value=\"getat\",method=RequestMethod.GET)\n//\tpublic void getAccessToken(HttpServletResponse response) throws IOException {\n//\t\tresponse.getWriter().write(WeixinContent.getInstance().getAccessToken());\n//\t}\n//\n//\t@RequestMapping(\"index\")\n//\tpublic String index() {\n//\t    return \"index\";\n//\t}\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/controller/BaseController.java",
    "content": "package com.cheng.weixin.web.mobile.controller;\n\nimport com.cheng.weixin.common.utils.StringUtils;\nimport com.cheng.weixin.web.mobile.exception.BaseException;\nimport com.cheng.weixin.web.mobile.exception.IllegalParameterException;\nimport com.cheng.weixin.web.mobile.exception.message.StatusCode;\nimport com.cheng.weixin.web.mobile.json.CustomObjectMapper;\nimport com.cheng.weixin.web.mobile.model.Meta;\nimport com.cheng.weixin.web.mobile.model.Response;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.net.URLDecoder;\nimport java.util.List;\n\n/**\n * Desc: 基础Controller\n * Author: cheng\n * Date: 2016/6/21\n */\npublic abstract class BaseController {\n    protected final Logger logger = LoggerFactory.getLogger(getClass());\n\n    @Autowired\n    private CustomObjectMapper objectMapper;\n\n    // 封装参数方法\n    protected Object getDto(HttpServletRequest request, Class clazz) {\n        try {\n            String param = request.getParameter(\"param\");\n            param = URLDecoder.decode(param, \"UTF-8\");\n            if (StringUtils.startsWith(param, \"[\") && StringUtils.endsWith(param, \"]\")) {\n                return objectMapper.readValue(param, objectMapper.getTypeFactory().constructCollectionType(List.class, clazz));\n            }\n            return objectMapper.fromJsonString(param, clazz);\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n        return null;\n    }\n\n\n    /** 设置成功响应代码 */\n    protected ResponseEntity<Response> success() {\n        return setResponse(StatusCode.OK, true, StatusCode.OK.msg(), null);\n    }\n    /** 设置成功响应代码 */\n    protected ResponseEntity<Response> success(Object data) {\n        return setResponse(StatusCode.OK, true, StatusCode.OK.msg(), data);\n    }\n\n    /** 设置失败响应代码 */\n    protected ResponseEntity<Response> failure() {\n        return setResponse(StatusCode.BAD_REQUEST, false, StatusCode.BAD_REQUEST.msg(), null);\n    }\n    /** 设置失败响应代码 */\n    protected ResponseEntity<Response> failure(StatusCode code) {\n        return setResponse(code, false, code.msg(), null);\n    }\n\n\n\n    /** 设置成功响应代码 */\n    @Deprecated\n    protected ResponseEntity<Response> success(String message, Object data) {\n        return setResponse(StatusCode.OK, true, message, null);\n    }\n\n    /** 设置失败响应代码 */\n    @Deprecated\n    protected ResponseEntity<Response> failure(String message) {\n        return setResponse(StatusCode.BAD_REQUEST, false, message, null);\n    }\n    /** 设置失败响应代码 */\n    @Deprecated\n    protected ResponseEntity<Response> failure(StatusCode code, String message) {\n        return setResponse(code, false, message, null);\n    }\n\n\n    /**\n     * 响应报文\n     * @param code 状态码\n     * @param success 是否成功\n     * @param message 消息\n     * @param data 数据\n     * @return 响应实体\n     */\n    protected ResponseEntity<Response> setResponse(StatusCode code, boolean success, String message, Object data) {\n        return setResponse(code.value(), success, message, data);\n    }\n    protected ResponseEntity<Response> setResponse(int code, boolean success, String message, Object data) {\n        return ResponseEntity.ok(new Response(code, success, message, data));\n    }\n\n    @ExceptionHandler(Exception.class)\n    public ResponseEntity<Response> exceptionHandler(HttpServletRequest request, HttpServletResponse response, Exception ex) throws IOException {\n        Meta meta = new Meta();\n        if (ex instanceof BaseException) {\n            ((BaseException) ex).handler(meta);\n        } else if (ex instanceof IllegalArgumentException) {\n            new IllegalParameterException(ex.getMessage()).handler(meta);\n        } else {\n            meta.setSuccess(false);\n            meta.setCode(StatusCode.INTERNAL_SERVER_ERROR.value());\n            meta.setMsg(StatusCode.INTERNAL_SERVER_ERROR.msg());\n        }\n        logger.error(\"发生异常==> {}\", meta.getMsg(), ex);\n        return ResponseEntity.ok(new Response(meta.getCode(), meta.isSuccess(), meta.getMsg(), null));\n    }\n\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/controller/CartController.java",
    "content": "package com.cheng.weixin.web.mobile.controller;\n\nimport com.cheng.weixin.web.mobile.model.Response;\nimport com.cheng.weixin.web.mobile.param.AddressDto;\nimport com.cheng.weixin.web.mobile.param.ProductDto;\nimport com.cheng.weixin.web.mobile.result.cart.ProductCartInfo;\nimport com.cheng.weixin.web.mobile.result.cart.ShoppingCartInfo;\nimport com.cheng.weixin.web.mobile.service.SysCartService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.servlet.http.HttpServletRequest;\n\n/**\n * Desc: 购物车\n * Author: cheng\n * Date: 2016/08/27\n */\n@RestController\n@RequestMapping(\"cart\")\npublic class CartController extends BaseController {\n    @Autowired\n    private SysCartService sysCartService;\n\n    /** 购物车信息 **/\n    @RequestMapping(value = \"v1/info\")\n    public ResponseEntity<Response> info(HttpServletRequest request) {\n        AddressDto address = (AddressDto) getDto(request, AddressDto.class);\n        ShoppingCartInfo shoppingCartInfo = sysCartService.getShoppingCart(address);\n        return success(shoppingCartInfo);\n    }\n    /** 增加购物车的商品 **/\n    @RequestMapping(value = \"v1/add\")\n    public ResponseEntity<Response> add(HttpServletRequest request) {\n        ProductDto product = (ProductDto) getDto(request, ProductDto.class);\n        ProductCartInfo productCart = sysCartService.addProduct(product.getProductId());\n        return success(productCart);\n    }\n\n    /** 减少购物车的商品 **/\n    @RequestMapping(value = \"v1/sub\")\n    public ResponseEntity<Response> sub(HttpServletRequest request) {\n        ProductDto product = (ProductDto) getDto(request, ProductDto.class);\n        ProductCartInfo productCart = sysCartService.subProduct(product.getProductId());\n        return success(productCart);\n    }\n\n    /** 删除购物车的商品 **/\n    @RequestMapping(value = \"v1/delete\")\n    public ResponseEntity<Response> delete(HttpServletRequest request) {\n        ProductDto product = (ProductDto) getDto(request, ProductDto.class);\n        ProductCartInfo productCart = sysCartService.deleteProduct(product.getProductId());\n        return success(productCart);\n    }\n\n    /** 改变选择状态 **/\n    @RequestMapping(value = \"v1/change\")\n    public ResponseEntity<Response> changeStatus(HttpServletRequest request) {\n        ProductDto product = (ProductDto) getDto(request, ProductDto.class);\n        ProductCartInfo productCart = sysCartService.changeStatus(product.getProductId());\n        return success(productCart);\n    }\n\n    /** 选择所有 **/\n    @RequestMapping(value = \"v1/chooseAll\")\n    public ResponseEntity<Response> allChoose() {\n        ProductCartInfo productCart = sysCartService.chooseAllProduct();\n        return success(productCart);\n    }\n\n    /** 取消选择所有 **/\n    @RequestMapping(value = \"v1/unChoose\")\n    public ResponseEntity<Response> unChoose() {\n        ProductCartInfo productCart = sysCartService.unChooseAllProduct();\n        return success(productCart);\n    }\n\n    /** 总价格 **/\n    @RequestMapping(value = \"v1/price/total\")\n    public ResponseEntity<Response> totalPrice() {\n        String totalPrice = sysCartService.getTotalPrice();\n        return success(totalPrice);\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/controller/CommentController.java",
    "content": "package com.cheng.weixin.web.mobile.controller;\n\nimport com.cheng.weixin.common.model.Page;\nimport com.cheng.weixin.web.mobile.model.Response;\nimport com.cheng.weixin.web.mobile.param.PageDto;\nimport com.cheng.weixin.web.mobile.result.comment.ProductComment;\nimport com.cheng.weixin.web.mobile.security.IgnoreSecurity;\nimport com.cheng.weixin.web.mobile.service.SysCommentService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.servlet.http.HttpServletRequest;\n\n/**\n * Desc: 首页\n * Author: cheng\n * Date: 2016/6/21\n */\n@RestController\n@RequestMapping(\"comment\")\npublic class CommentController extends BaseController {\n    @Autowired\n    private SysCommentService commentService;\n\n    @IgnoreSecurity\n    @RequestMapping(value = \"v1/item/all\")\n    public ResponseEntity<Response> itemComment(HttpServletRequest request) {\n        PageDto productDto = (PageDto) getDto(request, PageDto.class);\n        Page<ProductComment> comment = commentService.getCommentByProductId(productDto.getPageNum(), productDto.getPageSize(), productDto.getId());\n        return success(comment);\n    }\n\n\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/controller/IndexController.java",
    "content": "package com.cheng.weixin.web.mobile.controller;\n\nimport com.cheng.weixin.web.mobile.exception.ProductException;\nimport com.cheng.weixin.web.mobile.exception.message.StatusCode;\nimport com.cheng.weixin.web.mobile.model.Response;\nimport com.cheng.weixin.web.mobile.param.ProductDto;\nimport com.cheng.weixin.web.mobile.result.index.Index;\nimport com.cheng.weixin.web.mobile.security.IgnoreSecurity;\nimport com.cheng.weixin.web.mobile.service.SysIndexService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.servlet.http.HttpServletRequest;\n\n/**\n * Desc: 首页\n * Author: cheng\n * Date: 2016/6/21\n */\n@RestController\npublic class IndexController extends BaseController {\n    @Autowired\n    private SysIndexService sysIndexService;\n\n    @RequestMapping(value = \"v1/index1\")\n    public ResponseEntity<Response> index1() {\n\n        throw new ProductException(StatusCode.COUPON_EXCEPTION);\n\n        //return success();\n    }\n\n    @IgnoreSecurity\n    @RequestMapping(value = \"v1/index\")\n    public ResponseEntity<Response> index(HttpServletRequest request) {\n        Index index = sysIndexService.getIndexInfo();\n        return success(index);\n    }\n\n    //@IgnoreSecurity\n    @RequestMapping(value = \"v1/add\")\n    public ResponseEntity<Response> add(HttpServletRequest request) {\n        ProductDto productDto = (ProductDto) getDto(request, ProductDto.class);\n        long counts = sysIndexService.addProduct(productDto.getProductId());\n        return success(counts);\n    }\n\n    //@IgnoreSecurity\n    @RequestMapping(value = \"v1/sub\")\n    public ResponseEntity<Response> sub(HttpServletRequest request) {\n        ProductDto productDto = (ProductDto) getDto(request, ProductDto.class);\n        long counts = sysIndexService.subProduct(productDto.getProductId());\n        return success(counts);\n    }\n\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/controller/LoginController.java",
    "content": "package com.cheng.weixin.web.mobile.controller;\n\nimport com.cheng.weixin.web.mobile.model.Response;\nimport com.cheng.weixin.web.mobile.param.LoginDto;\nimport com.cheng.weixin.web.mobile.param.RegDto;\nimport com.cheng.weixin.web.mobile.security.IgnoreSecurity;\nimport com.cheng.weixin.web.mobile.security.LocalUser;\nimport com.cheng.weixin.web.mobile.security.TokenManager;\nimport com.cheng.weixin.web.mobile.security.User;\nimport com.cheng.weixin.web.mobile.service.SysLoginService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.servlet.http.HttpServletRequest;\n\n/**\n * Desc: 登录\n * Author: cheng\n * Date: 2016/7/8\n */\n@RestController\npublic class LoginController extends BaseController {\n    @Autowired\n    private SysLoginService sysLoginService;\n    @Autowired\n    private TokenManager tokenManager;\n    /** 发送验证码 **/\n    @IgnoreSecurity\n    @RequestMapping(value = \"v1/sendMsgCode\")\n    public ResponseEntity<Response> sendMsgCode(HttpServletRequest request) {\n        RegDto userDto = (RegDto) getDto(request, RegDto.class);\n        sysLoginService.sendRegMsgCode(userDto.getPhone());\n        return success();\n    }\n\n    /** 验证验证码 **/\n    @IgnoreSecurity\n    @RequestMapping(value = \"v1/checkCode\")\n    public ResponseEntity<Response> checkCode(HttpServletRequest request) {\n        RegDto reg = (RegDto) getDto(request, RegDto.class);\n        return success(sysLoginService.checkCode(reg.getPhone(), reg.getValidate()));\n    }\n\n    /** 保存注册信息 **/\n    @IgnoreSecurity\n    @RequestMapping(value = \"v1/register\")\n    public ResponseEntity<Response> register(HttpServletRequest request) {\n        RegDto reg = (RegDto) getDto(request, RegDto.class);\n        return success(sysLoginService.saveAccess(reg));\n    }\n\n    /** 登陆 **/\n    @IgnoreSecurity\n    @RequestMapping(value = \"v1/login\")\n    public ResponseEntity<Response> login(HttpServletRequest request) {\n        LoginDto loginDto = (LoginDto) getDto(request, LoginDto.class);\n        String token = sysLoginService.login(loginDto);\n        return success(token);\n    }\n    /** 检查Token是否超时 **/\n    @IgnoreSecurity\n    @RequestMapping(value = \"v1/token\")\n    public ResponseEntity<Response> checkToken(HttpServletRequest request) {\n        String token = request.getParameter(\"token\");\n        return success(tokenManager.checkToken(token));\n    }\n\n    @IgnoreSecurity\n    @RequestMapping(value = \"v1/setToken\")\n    public ResponseEntity<Response> setToken() {\n        String token = tokenManager.createToken(\"18600536683\");\n        return success(token);\n    }\n\n\n    @RequestMapping(value = \"v1/user\")\n    public ResponseEntity<Response> getUserInfoByToken() {\n        User user = LocalUser.getUser();\n        return success(user);\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/controller/MallController.java",
    "content": "package com.cheng.weixin.web.mobile.controller;\n\nimport com.cheng.weixin.web.mobile.model.Response;\nimport com.cheng.weixin.web.mobile.param.ProductDto;\nimport com.cheng.weixin.web.mobile.result.mall.ProductCategory;\nimport com.cheng.weixin.web.mobile.result.mall.Products;\nimport com.cheng.weixin.web.mobile.security.IgnoreSecurity;\nimport com.cheng.weixin.web.mobile.service.SysMallService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.List;\n\n/**\n * Desc: 商城\n * Author: hp\n * Date: 2016/9/9\n */\n@RestController\n@RequestMapping(\"mall\")\npublic class MallController extends BaseController {\n    @Autowired\n    private SysMallService mallService;\n\n    /** 商品类型 **/\n    @IgnoreSecurity\n    @RequestMapping(value = \"v1/category\")\n    public ResponseEntity<Response> productCategory() {\n        List<ProductCategory> categories = mallService.getProductCategory();\n        return success(categories);\n    }\n    /** 商品 **/\n    @IgnoreSecurity\n    @RequestMapping(value = \"v1/products\")\n    public ResponseEntity<Response> product(HttpServletRequest request) {\n        ProductCategory category = (ProductCategory) getDto(request, ProductCategory.class);\n        List<Products> products = mallService.getMallProduct(category.getId());\n        return success(products);\n    }\n\n    //@IgnoreSecurity\n    @RequestMapping(value = \"v1/add\")\n    public ResponseEntity<Response> add(HttpServletRequest request) {\n        ProductDto productDto = (ProductDto) getDto(request, ProductDto.class);\n        long counts = mallService.addProduct(productDto.getProductId());\n        return success(counts);\n    }\n\n    //@IgnoreSecurity\n    @RequestMapping(value = \"v1/sub\")\n    public ResponseEntity<Response> sub(HttpServletRequest request) {\n        ProductDto productDto = (ProductDto) getDto(request, ProductDto.class);\n        long counts = mallService.subProduct(productDto.getProductId());\n        return success(counts);\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/controller/OrderController.java",
    "content": "package com.cheng.weixin.web.mobile.controller;\n\nimport com.cheng.weixin.common.model.Page;\nimport com.cheng.weixin.web.mobile.model.Response;\nimport com.cheng.weixin.web.mobile.param.AddressDto;\nimport com.cheng.weixin.web.mobile.param.PageDto;\nimport com.cheng.weixin.web.mobile.param.PaymentDto;\nimport com.cheng.weixin.web.mobile.result.order.*;\nimport com.cheng.weixin.web.mobile.security.IgnoreSecurity;\nimport com.cheng.weixin.web.mobile.service.SysOrderService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.lang.reflect.InvocationTargetException;\nimport java.util.List;\n\n/**\n * Desc: 订单\n * Author: hp\n * Date: 2016/9/9\n */\n@RestController\n@RequestMapping(\"order\")\npublic class OrderController extends BaseController {\n\n    @Autowired\n    private SysOrderService orderService;\n\n    /** 购买 **/\n    @RequestMapping(value = \"v1/payment\")\n    public ResponseEntity<Response> payment(HttpServletRequest request) {\n        PaymentDto payment = (PaymentDto) getDto(request, PaymentDto.class);\n        SubmitOrderInfo orderInfo = orderService.payment(payment);\n        return success(orderInfo);\n    }\n\n    /** 购买商品列表 **/\n    @RequestMapping(value = \"v1/product/list\")\n    public ResponseEntity<Response> productList() {\n        List<ProductList> list = orderService.getProductList();\n        return success(list);\n    }\n\n    /** 提交订单 **/\n    @RequestMapping(value = \"v1/buy\")\n    public ResponseEntity<Response> submitBuy(HttpServletRequest request) {\n        PaymentDto payment = (PaymentDto) getDto(request, PaymentDto.class);\n        BuyInfo buyInfo = orderService.buy(payment, request);\n        return success(buyInfo);\n    }\n\n\n    ///** 订单列表 **/\n    //@IgnoreSecurity\n    //@RequestMapping(value = \"v1/orders1\")\n    //public ResponseEntity<Response> orders1(HttpServletRequest request) throws InvocationTargetException, IllegalAccessException {\n    //    int pageNum = Integer.parseInt(request.getParameter(\"pageNum\"));\n    //    int pageSize = Integer.parseInt(request.getParameter(\"pageSize\"));\n    //    Page<OrderList> orders = orderService.getOrders(pageNum, pageSize);\n    //    return success(orders);\n    //}\n\n    /** 订单列表 **/\n    @RequestMapping(value = \"v1/orders\")\n    public ResponseEntity<Response> orders(HttpServletRequest request) throws InvocationTargetException, IllegalAccessException {\n        PageDto page = (PageDto) getDto(request, PageDto.class);\n        Page<OrderList> orders = orderService.getOrders(page.getPageNum(), page.getPageSize());\n        return success(orders);\n    }\n\n\n    /** 订单详情 **/\n    @RequestMapping(value = \"v1/detail\")\n    public ResponseEntity<Response> orderDetail() {\n        Detail order = orderService.getOrderDetail();\n        return success(order);\n    }\n\n    /** 自提地点-镇 **/\n    @IgnoreSecurity\n    @RequestMapping(value = \"v1/ara/town\")\n    public ResponseEntity<Response> arayacakTownAddr() {\n        List<ArayacakTownAddr> addrs = orderService.getAllTownArayacakAddr(\"1\"); //TODO 默认成武\n        return success(addrs);\n    }\n    /** 自提地点-村庄 **/\n    @IgnoreSecurity\n    @RequestMapping(value = \"v1/ara/village\")\n    public ResponseEntity<Response> arayacakVillageAddr(HttpServletRequest request) {\n        AddressDto address = (AddressDto) getDto(request, AddressDto.class);\n        List<ArayacakVillageAddr> addrs = orderService.getAllVillageArayacakAddr(address.getId());\n        return success(addrs);\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/controller/ProductController.java",
    "content": "package com.cheng.weixin.web.mobile.controller;\n\nimport com.cheng.weixin.web.mobile.model.Response;\nimport com.cheng.weixin.web.mobile.param.ProductDto;\nimport com.cheng.weixin.web.mobile.result.product.ProductDetail;\nimport com.cheng.weixin.web.mobile.security.IgnoreSecurity;\nimport com.cheng.weixin.web.mobile.service.SysProductService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.io.UnsupportedEncodingException;\nimport java.util.List;\n\n/**\n * Desc: 商品\n * Author: cheng\n * Date: 2016/10/8\n */\n@RestController\n@RequestMapping(\"product\")\npublic class ProductController extends BaseController {\n    @Autowired\n    private SysProductService productService;\n\n    /** 获取商品详情 **/\n    @IgnoreSecurity\n    @RequestMapping(value = \"v1/detail\")\n    public ResponseEntity<Response> sendMsgCode(HttpServletRequest request) {\n        ProductDto product = (ProductDto) getDto(request, ProductDto.class);\n        ProductDetail detail = productService.getDetail(product.getProductId());\n        return success(detail);\n    }\n\n    /** 购买商品 **/\n    @RequestMapping(value = \"v1/buy\")\n    public ResponseEntity<Response> buyProduct(HttpServletRequest request) {\n        ProductDto product = (ProductDto) getDto(request, ProductDto.class);\n        productService.buyProduct(product.getProductId(), product.getCount());\n        return success();\n    }\n\n    /** 收藏/取消收藏 商品 **/\n    @RequestMapping(value = \"v1/focus\")\n    public ResponseEntity<Response> addProductFocus(HttpServletRequest request) {\n        ProductDto product = (ProductDto) getDto(request, ProductDto.class);\n        return success(productService.focus(product.getProductId()));\n    }\n\n    /** 检查库存 **/\n    @Deprecated\n    @IgnoreSecurity\n    @RequestMapping(value = \"v1/stock\")\n    public ResponseEntity<Response> checkStock(HttpServletRequest request) {\n        ProductDto product = (ProductDto) getDto(request, ProductDto.class);\n        productService.chackStock(product.getProductId());\n        return success();\n    }\n\n    /** 批量购买商品 **/\n    @Deprecated\n    @RequestMapping(value = \"v1/batch/add\")\n    public ResponseEntity<Response> batchAdd(HttpServletRequest request) throws UnsupportedEncodingException {\n        List<ProductDto> products = (List<ProductDto>) getDto(request, ProductDto.class);\n        productService.batchAdd(products);\n        return success();\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/controller/PromotionController.java",
    "content": "package com.cheng.weixin.web.mobile.controller;\n\nimport com.cheng.weixin.web.mobile.model.Response;\nimport com.cheng.weixin.web.mobile.result.Promotion.CouponDto;\nimport com.cheng.weixin.web.mobile.service.SysPromotionService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.util.List;\n\n/**\n * Desc:\n * Author: cheng\n * Date: 2016/6/21\n */\n@RestController\n@RequestMapping(\"promotion\")\npublic class PromotionController extends BaseController {\n    @Autowired\n    private SysPromotionService promotionService;\n\n    @RequestMapping(value = \"v1/coupons\")\n    public ResponseEntity<Response> coupons() {\n        List<CouponDto> coupons = promotionService.getCouponByUser();\n        return success(coupons);\n    }\n\n    @RequestMapping(value = \"v1/usable\")\n    public ResponseEntity<Response> usableCoupon() {\n        List<CouponDto> coupons = promotionService.getUsableCouponAtOrderByUser();\n        return success(coupons);\n    }\n\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/controller/UserController.java",
    "content": "package com.cheng.weixin.web.mobile.controller;\n\nimport com.cheng.weixin.web.mobile.model.Response;\nimport com.cheng.weixin.web.mobile.result.user.DeliveryAddr;\nimport com.cheng.weixin.web.mobile.result.user.UserDetail;\nimport com.cheng.weixin.web.mobile.service.SysUserService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.util.List;\n\n/**\n * Desc:\n * Author: hp\n * Date: 2016/9/30\n */\n@RestController\n@RequestMapping(\"user\")\npublic class UserController extends BaseController {\n    @Autowired\n    private SysUserService userService;\n\n    /** 个人详细信息 **/\n    @RequestMapping(value = \"v1/detail\")\n    public ResponseEntity<Response> detail() {\n        UserDetail detail = userService.getUserDetail();\n        return success(detail);\n    }\n\n    /** 个人全部收货地址 **/\n    @RequestMapping(value = \"v1/all/addr\")\n    public ResponseEntity<Response> addr() {\n        List<DeliveryAddr> addrs = userService.getDeliveryAddrs();\n        return success(addrs);\n    }\n\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/exception/BaseException.java",
    "content": "/**\n * \n */\npackage com.cheng.weixin.web.mobile.exception;\n\nimport com.cheng.weixin.web.mobile.exception.message.StatusCode;\nimport com.cheng.weixin.web.mobile.model.Meta;\nimport org.apache.commons.lang3.StringUtils;\n\n/**\n * Desc: 异常\n * Author: cheng\n * Date: 2016/6/21\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseException extends RuntimeException {\n\n\tprotected StatusCode statusCode;\n\n\tpublic BaseException() {\n\t}\n\n\tpublic BaseException(Throwable ex) {\n\t\tsuper(ex);\n\t}\n\n\tpublic BaseException(String message) {\n\t\tsuper(message);\n\t}\n\tpublic BaseException(StatusCode statusCode) {\n\t\tthis.statusCode = statusCode;\n\t}\n\tpublic BaseException(StatusCode statusCode, String message) {\n\t\tsuper(message);\n\t\tthis.statusCode = statusCode;\n\t}\n\n\tpublic BaseException(String message, Throwable ex) {\n\t\tsuper(message, ex);\n\t}\n\n\tpublic void handler(Meta meta) {\n\t\tmeta.setSuccess(false);\n\t\tmeta.setCode(getStatusCode().value());\n\t\tif (StringUtils.isNotBlank(getMessage())) {\n\t\t\tmeta.setMsg(getMessage()); // 取系统的错误消息\n\t\t}else {\n\t\t\tmeta.setMsg(getStatusCode().msg());\n\t\t}\n\t}\n\n\tprotected abstract StatusCode getStatusCode();\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/exception/BusinessException.java",
    "content": "package com.cheng.weixin.web.mobile.exception;\n\n\nimport com.cheng.weixin.web.mobile.exception.message.StatusCode;\n\n/**\n * 业务异常\n */\npublic class BusinessException extends BaseException {\n\tpublic BusinessException() {\n\t}\n\n\tpublic BusinessException(Throwable ex) {\n\t\tsuper(ex);\n\t}\n\n\tpublic BusinessException(String message) {\n\t\tsuper(message);\n\t}\n\n\tpublic BusinessException(StatusCode statusCode) {\n\t\tsuper(statusCode);\n\t}\n\tpublic BusinessException(StatusCode statusCode, String message) {\n\t\tsuper(statusCode, message);\n\t}\n\n\tpublic BusinessException(String message, Throwable ex) {\n\t\tsuper(message, ex);\n\t}\n\n\tprotected StatusCode getStatusCode() {\n\t\treturn super.statusCode != null ? super.statusCode : StatusCode.CONFLICT;\n\t}\n}"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/exception/IllegalParameterException.java",
    "content": "/**\n * \n */\npackage com.cheng.weixin.web.mobile.exception;\n\n\nimport com.cheng.weixin.web.mobile.exception.message.StatusCode;\n\n/**\n * Desc: 异常 - 参数异常\n * Author: cheng\n * Date: 2016/6/21\n */\n@SuppressWarnings(\"serial\")\npublic class IllegalParameterException extends BaseException {\n\tpublic IllegalParameterException() {\n\t}\n\n\tpublic IllegalParameterException(Throwable ex) {\n\t\tsuper(ex);\n\t}\n\n\tpublic IllegalParameterException(String message) {\n\t\tsuper(message);\n\t}\n\n\tpublic IllegalParameterException(StatusCode statusCode) {\n\t\tsuper(statusCode);\n\t}\n\tpublic IllegalParameterException(StatusCode statusCode, String message) {\n\t\tsuper(statusCode, message);\n\t}\n\tpublic IllegalParameterException(String message, Throwable ex) {\n\t\tsuper(message, ex);\n\t}\n\n\t@Override\n\tprotected StatusCode getStatusCode() {\n\t\treturn super.statusCode != null ? super.statusCode : StatusCode.BAD_REQUEST;\n\t}\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/exception/LoginException.java",
    "content": "package com.cheng.weixin.web.mobile.exception;\n\n\nimport com.cheng.weixin.web.mobile.exception.message.StatusCode;\n\n@SuppressWarnings(\"serial\")\npublic class LoginException extends BaseException {\n\tpublic LoginException() {\n\t}\n\n\tpublic LoginException(String message) {\n\t\tsuper(message);\n\t}\n\n\n\tpublic LoginException(StatusCode statusCode) {\n\t\tsuper(statusCode);\n\t}\n\tpublic LoginException(StatusCode statusCode, String message) {\n\t\tsuper(statusCode, message);\n\t}\n\n\tpublic LoginException(String message, Exception e) {\n\t\tsuper(message, e);\n\t}\n\n\n\tprotected StatusCode getStatusCode() {\n\t\treturn super.statusCode != null ? super.statusCode : StatusCode.LOGIN_FAIL;\n\t}\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/exception/OrderException.java",
    "content": "package com.cheng.weixin.web.mobile.exception;\n\nimport com.cheng.weixin.web.mobile.exception.message.StatusCode;\n\n/**\n * Desc:\n * Author: hp\n * Date: 2016/11/10\n */\npublic class OrderException extends BusinessException{\n    public OrderException() {\n    }\n\n    public OrderException(String message) {\n        super(message);\n    }\n\n\n    public OrderException(StatusCode statusCode) {\n        super(statusCode);\n    }\n    public OrderException(StatusCode statusCode, String message) {\n        super(statusCode, message);\n    }\n\n    public OrderException(String message, Exception e) {\n        super(message, e);\n    }\n\n\n    @Override\n    protected StatusCode getStatusCode() {\n        return super.statusCode != null ? super.statusCode : StatusCode.COUPON_EXCEPTION;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/exception/ProductException.java",
    "content": "package com.cheng.weixin.web.mobile.exception;\n\nimport com.cheng.weixin.web.mobile.exception.message.StatusCode;\n\n/**\n * Desc: 商品\n * Author: hp\n * Date: 2016/10/26\n */\npublic class ProductException extends BaseException {\n\n    public ProductException() {\n    }\n\n    public ProductException(String message) {\n        super(message);\n    }\n\n\n    public ProductException(StatusCode statusCode) {\n        super(statusCode);\n    }\n    public ProductException(StatusCode statusCode, String message) {\n        super(statusCode, message);\n    }\n\n    public ProductException(String message, Exception e) {\n        super(message, e);\n    }\n\n\n    @Override\n    protected StatusCode getStatusCode() {\n        return super.statusCode != null ? super.statusCode : StatusCode.PRODUCT_EXCEPTION;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/exception/TokenException.java",
    "content": "package com.cheng.weixin.web.mobile.exception;\n\nimport com.cheng.weixin.web.mobile.exception.message.StatusCode;\n\n/**\n * Desc:\n * Author: cheng\n * Date: 2016/6/24\n */\npublic class TokenException extends BaseException {\n    public TokenException() {\n        super();\n    }\n\n    public TokenException(String message) {\n        super(message);\n    }\n\n    public TokenException(StatusCode statusCode) {\n        super(statusCode);\n    }\n    public TokenException(StatusCode statusCode, String message) {\n        super(statusCode, message);\n    }\n    public TokenException(String message, Throwable ex) {\n        super(message, ex);\n    }\n\n    @Override\n    protected StatusCode getStatusCode() {\n        return super.statusCode != null ? super.statusCode : StatusCode.UNAUTHORIZED;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/exception/UserException.java",
    "content": "package com.cheng.weixin.web.mobile.exception;\n\nimport com.cheng.weixin.web.mobile.exception.message.StatusCode;\n\n/**\n * Desc:\n * Author: 光灿\n * Date: 2016/11/14\n */\npublic class UserException extends BaseException {\n\n    public UserException() {\n    }\n\n    public UserException(String message) {\n        super(message);\n    }\n\n\n    public UserException(StatusCode statusCode) {\n        super(statusCode);\n    }\n    public UserException(StatusCode statusCode, String message) {\n        super(statusCode, message);\n    }\n\n    public UserException(String message, Exception e) {\n        super(message, e);\n    }\n\n    protected StatusCode getStatusCode() {\n        return super.statusCode != null ? super.statusCode : StatusCode.USER_EXCEPTION;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/exception/message/StatusCode.java",
    "content": "package com.cheng.weixin.web.mobile.exception.message;\n\nimport com.cheng.weixin.web.mobile.i18n.Resources;\n\n/**\n * Desc: Ajax 请求时的自定义查询状态码，主要参考Http状态码，但并不完全对应\n * Author: cheng\n * Date: 2016/6/21\n */\npublic enum StatusCode {\n    /** 200请求成功 */\n    OK(200),\n    /** 207频繁操作 */\n    MULTI_STATUS(207),\n    /** 303登录失败 */\n    LOGIN_FAIL(303),\n    /** 400请求参数出错 */\n    BAD_REQUEST(400),\n    /** 401没有登录 */\n    UNAUTHORIZED(401),\n    /** 403没有权限 */\n    FORBIDDEN(403),\n    /** 404找不到页面 */\n    NOT_FOUND(404),\n    /** 408请求超时 */\n    REQUEST_TIMEOUT(408),\n    /** 409发生冲突 */\n    CONFLICT(409),\n    /** 410已被删除 */\n    GONE(410),\n    /** 423已被锁定 */\n    LOCKED(423),\n    /** 500服务器出错 */\n    INTERNAL_SERVER_ERROR(500),\n\n    /** 用户异常 **/\n    USER_EXCEPTION(9100),\n    /** 用户不存在 **/\n    USER_NOT_EXIST(9101),\n    /** 用户存在 **/\n    USER_EXIST(9102),\n    /** 验证码错误 **/\n    USER_VALIDATE_ERROR(9103),\n    /** 手机号不存在 **/\n    PHONE_NOT_EXIST(9104),\n\n    /** 操作商品发生异常 **/\n    PRODUCT_EXCEPTION(9500),\n    /** 库存不足 **/\n    PRODUCT_STOCK_SHORTAGE(9501),\n\n    /** 订单 **/\n    ORDER_EXCEPTION(9600),\n\n    /** 优惠券异常 **/\n    COUPON_EXCEPTION(9700),\n    /** 优惠券不存在 **/\n    COUPON_NOT_EXIST(9701);\n\n    private final Integer value;\n\n    StatusCode(Integer value) {\n        this.value = value;\n    }\n    /**\n     * Return the integer value of this status code.\n     */\n    public Integer value() {\n        return this.value;\n    }\n    public String msg() {\n        return Resources.getMessage(\"STATUSCODE_\" + this.value);\n    }\n\n    public String toString() {\n        return this.value.toString();\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/i18n/Resources.java",
    "content": "package com.cheng.weixin.web.mobile.i18n;\n\nimport org.springframework.context.annotation.PropertySource;\nimport org.springframework.context.i18n.LocaleContextHolder;\n\nimport java.util.HashMap;\nimport java.util.Locale;\nimport java.util.Map;\nimport java.util.ResourceBundle;\n\n/**\n * 加载配置\n * \n * @author ShenHuaJie\n * @version 2016年5月20日 下午3:19:19\n */\n@PropertySource(value = { \"classpath:i18n/messages*.properties\" })\npublic final class Resources {\n\t/** 国际化信息 */\n\tprivate static final Map<String, ResourceBundle> MESSAGES = new HashMap<String, ResourceBundle>();\n\n\t/** 国际化信息 */\n\tpublic static String getMessage(String key, Object... params) {\n\t\tLocale locale = LocaleContextHolder.getLocale();\n\t\tResourceBundle message = MESSAGES.get(locale.getLanguage());\n\t\tif (message == null) {\n\t\t\tsynchronized (MESSAGES) {\n\t\t\t\tmessage = MESSAGES.get(locale.getLanguage());\n\t\t\t\tif (message == null) {\n\t\t\t\t\tmessage = ResourceBundle.getBundle(\"i18n/messages\", locale);\n\t\t\t\t\tMESSAGES.put(locale.getLanguage(), message);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (params != null) {\n\t\t\treturn String.format(message.getString(key), params);\n\t\t}\n\t\treturn message.getString(key);\n\t}\n\n\t/** 清除国际化信息 */\n\tpublic static void flushMessage() {\n\t\tMESSAGES.clear();\n\t}\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/interceptor/LogInterceptor.java",
    "content": "package com.cheng.weixin.web.mobile.interceptor;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.web.servlet.HandlerInterceptor;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\n\n/**\n * Desc: 前台日志拦截器\n * Author: cheng\n * Date: 2016/6/22\n */\npublic class LogInterceptor implements HandlerInterceptor {\n\n    private Logger logger = LoggerFactory.getLogger(LogInterceptor.class);\n\n    @Override\n    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {\n\n        //logger.info(\"=============preHandle=============\");\n\n        return true;\n    }\n\n    @Override\n    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {\n        //logger.info(\"=============postHandle=============\");\n    }\n\n    @Override\n    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {\n        //logger.info(\"=============afterCompletion=============\");\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/interceptor/MaliciousRequestInterceptor.java",
    "content": "package com.cheng.weixin.web.mobile.interceptor;\n\nimport com.cheng.weixin.common.security.Digests;\nimport com.cheng.weixin.common.utils.StringUtils;\nimport com.cheng.weixin.rpc.redis.service.RpcRedisService;\nimport com.cheng.weixin.web.mobile.exception.IllegalParameterException;\nimport com.cheng.weixin.web.mobile.exception.message.StatusCode;\nimport com.cheng.weixin.web.mobile.properties.Properties;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.servlet.handler.HandlerInterceptorAdapter;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\n\n/**\n * Desc: 恶意请求拦截器\n * Author: cheng\n * Date: 2016/6/24\n */\npublic class MaliciousRequestInterceptor extends HandlerInterceptorAdapter {\n\n    protected final Logger logger = LoggerFactory.getLogger(getClass());\n\n    @Autowired\n    private RpcRedisService redisService;\n\n    private static final String DEFAULT_TOKEN_NAME = \"X-Token\";\n    private static final String DEFAULT_APP_KEY_NAME = \"X-AppKey\";\n    private static final String DEFAULT_TIME_STAMP_NAME = \"timestamp\";\n    private static final String DEFAULT_SIGN_NAME = \"sign\";\n    private static final String DEFAULT_PARAM_NAME = \"param\";\n    private static final Long DEFAULT_REQUEST_TIME_INTERVAL = 5 * 60 * 1000L;\n\n    private String tokenName;\n    private String appKeyName;\n    private String timestampName;\n    private String signName;\n    private String paramName;\n    private Long minRequestIntervalTime; // 允许的最小请求间隔\n\n    @Override\n    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {\n        //String appKey = request.getHeader(appKeyName);\n        String appKey = request.getParameter(appKeyName);\n        String timestamp = request.getParameter(timestampName);\n        if(StringUtils.isAnyBlank(timestamp, appKey)) {\n            throw new IllegalParameterException(StatusCode.BAD_REQUEST);\n        }\n\n        // 请求时间超过5分钟\n        if (StringUtils.isNotBlank(timestamp)) {\n            long differ = System.currentTimeMillis() - Long.parseLong(timestamp);\n            if (differ > minRequestIntervalTime) {\n                response.setStatus(StatusCode.MULTI_STATUS.value());\n                logger.warn(\"To intercept a malicious request : {}\", request.getServletPath());\n                return false;\n            }\n        }\n\n\n        // 是否是已授权的APP请求\n        Properties properties = Properties.getInstance();\n        String appSecret = properties.getValue(appKey);\n        if(StringUtils.isBlank(appSecret)) {\n            response.setStatus(StatusCode.FORBIDDEN.value());\n            return false;\n        }\n        // 验证签名\n        StringBuilder sb = new StringBuilder();\n        sb.append(appKey);\n        sb.append(timestamp);\n        //String token = request.getHeader(tokenName);\n        String token = request.getParameter(tokenName);\n        if (StringUtils.isNotBlank(token)) sb.append(token);\n        String parameter = request.getParameter(paramName);//接受参数\n        if (StringUtils.isNotBlank(parameter)) sb.append(parameter);\n\n        String signParam = request.getParameter(signName);//接受签名\n\n        String sign = Digests.md5(sb.toString());\n        if (sign.equals(signParam)) {\n            // 去redis查看是否有sign这个值；如果有则返回fase；否则没有返回true 并存储到redis里\n            boolean isExist = redisService.exists(sign);\n            //boolean isExist = true;\n            if (isExist) {\n                response.setStatus(StatusCode.FORBIDDEN.value());\n                return false;\n            }else {\n                redisService.set(sign, signName, 300L);\n            }\n        }else {\n            response.setStatus(StatusCode.FORBIDDEN.value());\n            return false;\n        }\n        return true;\n    }\n\n    public void setTokenName(String tokenName) {\n        if (StringUtils.isEmpty(tokenName)) {\n            tokenName = DEFAULT_TOKEN_NAME;\n        }\n        this.tokenName = tokenName;\n    }\n    public void setAppKeyName(String appKeyName) {\n        if (StringUtils.isEmpty(appKeyName)) {\n            appKeyName = DEFAULT_APP_KEY_NAME;\n        }\n        this.appKeyName = appKeyName;\n    }\n    public void setTimestampName(String timestampName) {\n        if (StringUtils.isEmpty(timestampName)) {\n            timestampName = DEFAULT_TIME_STAMP_NAME;\n        }\n        this.timestampName = timestampName;\n    }\n\n    public void setSignName(String signName) {\n        if (StringUtils.isEmpty(signName)) {\n            signName = DEFAULT_SIGN_NAME;\n        }\n        this.signName = signName;\n    }\n\n    public void setParamName(String paramName) {\n        if (StringUtils.isEmpty(paramName)) {\n            paramName = DEFAULT_PARAM_NAME;\n        }\n        this.paramName = paramName;\n    }\n\n    public void setMinRequestIntervalTime(Long minRequestIntervalTime) {\n        if (minRequestIntervalTime != null) {\n            minRequestIntervalTime = DEFAULT_REQUEST_TIME_INTERVAL;\n        }\n        this.minRequestIntervalTime = minRequestIntervalTime;\n    }\n\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/json/CustomObjectMapper.java",
    "content": "package com.cheng.weixin.web.mobile.json;\n\nimport com.cheng.weixin.common.utils.StringUtils;\nimport com.fasterxml.jackson.annotation.JsonInclude;\nimport com.fasterxml.jackson.core.JsonGenerator;\nimport com.fasterxml.jackson.databind.JsonSerializer;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.databind.PropertyNamingStrategy;\nimport com.fasterxml.jackson.databind.SerializerProvider;\nimport com.fasterxml.jackson.databind.module.SimpleModule;\nimport com.fasterxml.jackson.databind.util.JSONPObject;\nimport org.apache.commons.lang3.StringEscapeUtils;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport java.io.IOException;\nimport java.text.DateFormat;\nimport java.text.SimpleDateFormat;\nimport java.util.TimeZone;\n\n/**\n * 定制 Jackson 的 ObjectMapper\n *\n * @author huangyong\n * @since 1.0.0\n */\npublic class CustomObjectMapper extends ObjectMapper {\n\n    private static Logger logger = LoggerFactory.getLogger(CustomObjectMapper.class);\n\n    private boolean camelCaseToLowerCaseWithUnderscores = false;\n    private String dateFormatPattern;\n\n    public void setCamelCaseToLowerCaseWithUnderscores(boolean camelCaseToLowerCaseWithUnderscores) {\n        this.camelCaseToLowerCaseWithUnderscores = camelCaseToLowerCaseWithUnderscores;\n    }\n\n    public void setDateFormatPattern(String dateFormatPattern) {\n        this.dateFormatPattern = dateFormatPattern;\n    }\n\n    public void init() {\n        // 排除值为空属性\n        setSerializationInclusion(JsonInclude.Include.ALWAYS);\n        // 将驼峰转为下划线\n        if (camelCaseToLowerCaseWithUnderscores) {\n            setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);\n        }\n\n        // 设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性\n        //this.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);\n\n        // 进行日期格式化\n        if (StringUtils.isNotEmpty(dateFormatPattern)) {\n            DateFormat dateFormat = new SimpleDateFormat(dateFormatPattern);\n            setDateFormat(dateFormat);\n        }\n\n        // 空值处理为空串\n        this.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {\n            @Override\n            public void serialize(Object value, JsonGenerator jg, SerializerProvider sp) throws IOException {\n                jg.writeString(\"\");\n            }\n        });\n        // 进行HTML解码。\n        this.registerModule(new SimpleModule().addSerializer(String.class, new JsonSerializer<String>(){\n            @Override\n            public void serialize(String value, JsonGenerator jgen, SerializerProvider provider) throws IOException {\n                jgen.writeString(StringEscapeUtils.unescapeHtml4(value));\n            }\n        }));\n        // 设置时区\n        this.setTimeZone(TimeZone.getDefault());//getTimeZone(\"GMT+8:00\")\n    }\n\n    /**\n     * Object可以是POJO，也可以是Collection或数组。\n     * 如果对象为Null, 返回\"null\".\n     * 如果集合为空集合, 返回\"[]\".\n     */\n    public String toJson(Object object) {\n        try {\n            return this.writeValueAsString(object);\n        } catch (IOException e) {\n            logger.warn(\"write to json string error:\" + object, e);\n            return null;\n        }\n    }\n\n    /**\n     * 对象转换为JSON字符串\n     * @param object\n     * @return\n     */\n    public String toJsonString(Object object){\n        return toJson(object);\n    }\n\n    /**\n     * JSON字符串转换为对象\n     * @param jsonString\n     * @param clazz\n     * @return\n     */\n    public Object fromJsonString(String jsonString, Class<?> clazz) throws IOException {\n        return readValue(jsonString, clazz);\n    }\n    /**\n     * 輸出JSONP格式數據.\n     */\n    public String toJsonP(String functionName, Object object) {\n        return toJson(new JSONPObject(functionName, object));\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/json/JsonpHttpMessageConverter.java",
    "content": "package com.cheng.weixin.web.mobile.json;\n\nimport com.cheng.weixin.common.utils.StringUtils;\nimport com.fasterxml.jackson.core.JsonEncoding;\nimport com.fasterxml.jackson.databind.util.JSONPObject;\nimport org.apache.commons.io.IOUtils;\nimport org.springframework.http.HttpOutputMessage;\nimport org.springframework.http.converter.HttpMessageNotWritableException;\nimport org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;\nimport org.springframework.web.context.request.RequestContextHolder;\nimport org.springframework.web.context.request.ServletRequestAttributes;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.io.IOException;\nimport java.lang.reflect.Type;\n\n/**\n * Desc:支持 JSONP\n * Author: Cheng\n * Date: 2016/3/10 0010\n */\n\n/**\n  $.ajax({\n     type: <your type>,\n     url: <your url>,\n     dataType: 'jsonp',\n     jsonpCallback: 'JsonpCallback', //这个值要与第一步的ConfigContainer.JSONP_CALLBACK同名\n     contentType: 'application/jsonp;charset=UTF-8',\n     }).done(function (result) {\n     //TODO\n     }).fail(function (result, textStatus, info) {\n     //TODO\n     });\n  }\n */\npublic class JsonpHttpMessageConverter extends MappingJackson2HttpMessageConverter {\n    private String callbackName;\n    @Override\n    protected void writeInternal(Object object, Type type, HttpOutputMessage outputMessage) throws IOException {\n        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();\n        String callbackParam = request.getParameter(callbackName);\n        if(StringUtils.isEmpty(callbackParam)) {\n            super.writeInternal(object, type, outputMessage);\n        }else {\n            JsonEncoding encoding = getJsonEncoding(outputMessage.getHeaders().getContentType());\n            try {\n                //String result = callbackParam + \"(\" + super.getObjectMapper().writeValueAsString(object) +\")\";\n                String result = getObjectMapper().writeValueAsString(new JSONPObject(callbackParam, object));\n                IOUtils.write(result, outputMessage.getBody(), encoding.getJavaName());\n            } catch (IOException e) {\n                e.printStackTrace();\n                throw new HttpMessageNotWritableException(\"Could not write JSON:\" + e.getMessage(), e);\n            }\n        }\n    }\n\n    public void setCallbackName(String callbackName) {\n        this.callbackName = callbackName;\n    }\n\n\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/model/Book.java",
    "content": "package com.cheng.weixin.web.mobile.model;\n\n/**\n * Desc:\n * Author: cheng\n * Date: 2016/6/22\n */\npublic class Book {\n    private String name;\n    private Integer pageNum;\n\n    private int hasPage;\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public Integer getPageNum() {\n        return pageNum;\n    }\n\n    public void setPageNum(Integer pageNum) {\n        this.pageNum = pageNum;\n    }\n\n    public int getHasPage() {\n        return hasPage;\n    }\n\n    public void setHasPage(int hasPage) {\n        this.hasPage = hasPage;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/model/Meta.java",
    "content": "package com.cheng.weixin.web.mobile.model;\n\n/**\n * Desc: 消息头\n * Author: cheng\n * Date: 2016/6/24\n */\npublic class Meta {\n    // 状态码\n    private int code;\n    // 成功 || 失败\n    private boolean success;\n    // 消息\n    private String msg;\n\n    public Meta() {}\n\n    public Meta(boolean success) {\n        this.success = success;\n    }\n    public Meta(Integer code, boolean success) {\n        this.code = code;\n        this.success = success;\n    }\n    public Meta(boolean success, String msg) {\n        this.success = success;\n        this.msg = msg;\n    }\n    public Meta(int code, boolean success, String msg) {\n        this.code = code;\n        this.success = success;\n        this.msg = msg;\n    }\n    public Meta(Integer code, String msg) {\n        this.code = code;\n        this.msg = msg;\n    }\n\n    public int getCode() {\n        return code;\n    }\n\n    public void setCode(int code) {\n        this.code = code;\n    }\n\n    public boolean isSuccess() {\n        return success;\n    }\n\n    public void setSuccess(boolean success) {\n        this.success = success;\n    }\n\n    public String getMsg() {\n        return msg;\n    }\n\n    public void setMsg(String msg) {\n        this.msg = msg;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/model/Response.java",
    "content": "package com.cheng.weixin.web.mobile.model;\n\n/**\n * Desc: 返回封装的实体\n * Author: cheng\n * Date: 2016/6/21\n */\npublic class Response {\n\n    private Meta meta;\n    private Object data;\n\n    public Response() {}\n\n    // 成功||失败-状态码-成|败-消息-数据\n    public Response(int code, boolean success, String message, Object data) {\n        this.meta = new Meta(code, success, message);\n        this.data = data;\n    }\n\n    public Meta getMeta() {\n        return meta;\n    }\n\n    public void setMeta(Meta meta) {\n        this.meta = meta;\n    }\n\n    public Object getData() {\n        return data;\n    }\n\n    public void setData(Object data) {\n        this.data = data;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/model/User.java",
    "content": "package com.cheng.weixin.web.mobile.model;\n\nimport java.math.BigDecimal;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * Desc:\n * Author: cheng\n * Date: 2016/6/22\n */\npublic class User {\n    private int age;\n    private String name;\n    private String nickName;\n    private BigDecimal haveAmount;\n    private boolean sex;\n    private Date birthday;\n\n\n    private List<Book> books;\n\n    public int getAge() {\n        return age;\n    }\n\n    public void setAge(int age) {\n        this.age = age;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getNickName() {\n        return nickName;\n    }\n\n    public void setNickName(String nickName) {\n        this.nickName = nickName;\n    }\n\n    public BigDecimal getHaveAmount() {\n        return haveAmount;\n    }\n\n    public void setHaveAmount(BigDecimal haveAmount) {\n        this.haveAmount = haveAmount;\n    }\n\n    public boolean isSex() {\n        return sex;\n    }\n\n    public void setSex(boolean sex) {\n        this.sex = sex;\n    }\n\n    public List<Book> getBooks() {\n        return books;\n    }\n\n    public void setBooks(List<Book> books) {\n        this.books = books;\n    }\n\n    public Date getBirthday() {\n        return birthday;\n    }\n\n    public void setBirthday(Date birthday) {\n        this.birthday = birthday;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/param/AddressDto.java",
    "content": "package com.cheng.weixin.web.mobile.param;\n\nimport org.apache.commons.lang3.builder.ToStringBuilder;\n\n/**\n * Desc:\n * Author: hp\n * Date: 2016/11/3\n */\npublic class AddressDto {\n    private String id;\n    private Boolean isSince;\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public Boolean getSince() {\n        return isSince;\n    }\n\n    public void setSince(Boolean since) {\n        isSince = since;\n    }\n\n    @Override\n    public String toString() {\n        return new ToStringBuilder(this)\n                .append(\"id\", id)\n                .append(\"isSince\", isSince)\n                .toString();\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/param/LoginDto.java",
    "content": "package com.cheng.weixin.web.mobile.param;\n\n/**\n * Desc: 登陆参数封装\n * Author: 光灿\n * Date: 2016/8/17\n */\npublic class LoginDto {\n    private String username;\n    private String password;\n\n    public String getUsername() {\n        return username;\n    }\n\n    public void setUsername(String username) {\n        this.username = username;\n    }\n\n    public String getPassword() {\n        return password;\n    }\n\n    public void setPassword(String password) {\n        this.password = password;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/param/PageDto.java",
    "content": "package com.cheng.weixin.web.mobile.param;\n\n/**\n * Desc: 分页\n * Author: cheng\n * Date: 2016/7/4\n */\npublic class PageDto {\n    private String id;\n    private int pageNum;\n    private int pageSize;\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public int getPageNum() {\n        return pageNum;\n    }\n\n    public void setPageNum(int pageNum) {\n        this.pageNum = pageNum;\n    }\n\n    public int getPageSize() {\n        return pageSize;\n    }\n\n    public void setPageSize(int pageSize) {\n        this.pageSize = pageSize;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/param/PaymentDto.java",
    "content": "package com.cheng.weixin.web.mobile.param;\n\nimport org.apache.commons.lang3.builder.ToStringBuilder;\n\n/**\n * Desc: 付款页面\n * Author: hp\n * Date: 2016/11/2\n */\npublic class PaymentDto {\n\n    private String addrId;\n    private String timeId;\n    private String amount;\n    private String payId;\n    private Boolean balance; // 是否使用了余额\n    private String remark;\n    private Boolean since; // 是否是自提\n    private String ticketId; // 优惠券\n\n\n    //private String addrId;\n    //private String amount;\n    //private Boolean balance;\n    //private String payId;\n    //private String remark;\n    //private String since;\n    //private String ticketId;\n    //private String timeId;\n\n    public String getAddrId() {\n        return addrId;\n    }\n\n    public void setAddrId(String addrId) {\n        this.addrId = addrId;\n    }\n\n    public String getTimeId() {\n        return timeId;\n    }\n\n    public void setTimeId(String timeId) {\n        this.timeId = timeId;\n    }\n\n    public String getPayId() {\n        return payId;\n    }\n\n    public void setPayId(String payId) {\n        this.payId = payId;\n    }\n\n    public Boolean getBalance() {\n        return balance;\n    }\n\n    public void setBalance(Boolean balance) {\n        this.balance = balance;\n    }\n\n    public String getRemark() {\n        return remark;\n    }\n\n    public void setRemark(String remark) {\n        this.remark = remark;\n    }\n\n    public Boolean getSince() {\n        return since;\n    }\n\n    public void setSince(Boolean since) {\n        this.since = since;\n    }\n\n    public String getTicketId() {\n        return ticketId;\n    }\n\n    public void setTicketId(String ticketId) {\n        this.ticketId = ticketId;\n    }\n\n    public String getAmount() {\n        return amount;\n    }\n\n    public void setAmount(String amount) {\n        this.amount = amount;\n    }\n\n    @Override\n    public String toString() {\n        return new ToStringBuilder(this)\n                .append(\"addrId\", addrId)\n                .append(\"timeId\", timeId)\n                .append(\"payId\", payId)\n                .append(\"balance\", balance)\n                .append(\"remark\", remark)\n                .append(\"since\", since)\n                .append(\"ticketId\", ticketId)\n                .append(\"amount\", amount)\n                .toString();\n    }\n}\n\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/param/ProductCategoryDto.java",
    "content": "package com.cheng.weixin.web.mobile.param;\n\n/**\n * Desc: 商品类别\n * Author: hp\n * Date: 2016/9/9\n */\npublic class ProductCategoryDto {\n    private String id;\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/param/ProductDto.java",
    "content": "package com.cheng.weixin.web.mobile.param;\n\nimport com.alibaba.fastjson.JSON;\n\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLEncoder;\nimport java.util.Arrays;\n\n/**\n * Desc: 商品\n * Author: cheng\n * Date: 2016/7/4\n */\npublic class ProductDto {\n    private String productId;\n    private Long count;\n\n    private String[] productIds;\n\n    public String[] getProductIds() {\n        return productIds;\n    }\n\n    public void setProductIds(String[] productIds) {\n        this.productIds = productIds;\n    }\n\n    public Long getCount() {\n        return count;\n    }\n\n    public void setCount(Long count) {\n        this.count = count;\n    }\n\n    public String getProductId() {\n        return productId;\n    }\n\n    public void setProductId(String productId) {\n        this.productId = productId;\n    }\n\n    public static void main(String[] args) throws UnsupportedEncodingException {\n\n        String[] productIds = {\"1\", \"2\"};\n        ProductDto p = new ProductDto();\n        p.setProductIds(productIds);\n        String data = JSON.toJSONString(productIds);\n        String ecode = URLEncoder.encode(data, \"UTF-8\");\n        System.out.println(data + \" == \"+ecode);\n    }\n\n    @Override\n    public String toString() {\n        final StringBuffer sb = new StringBuffer(\"ProductDto{\");\n        sb.append(\"productId='\").append(productId).append('\\'');\n        sb.append(\", count=\").append(count);\n        sb.append(\", productIds=\").append(productIds == null ? \"null\" : Arrays.asList(productIds).toString());\n        sb.append('}');\n        return sb.toString();\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/param/ProductListDto.java",
    "content": "package com.cheng.weixin.web.mobile.param;\n\nimport java.util.List;\n\n/**\n * Desc:\n * Author: 光灿\n * Date: 2016/11/25\n */\npublic class ProductListDto {\n    private List<ProductDto> products;\n\n    public List<ProductDto> getProducts() {\n        return products;\n    }\n\n    public void setProducts(List<ProductDto> products) {\n        this.products = products;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/param/RegDto.java",
    "content": "package com.cheng.weixin.web.mobile.param;\n\n/**\n * Desc: 用户\n * Author: cheng\n * Date: 2016/7/4\n */\npublic class RegDto {\n    private String phone;\n    private String validate;\n    private String nickname;\n    private String password;\n\n    public String getValidate() {\n        return validate;\n    }\n\n    public void setValidate(String validate) {\n        this.validate = validate;\n    }\n\n    public String getPhone() {\n        return phone;\n    }\n\n    public void setPhone(String phone) {\n        this.phone = phone;\n    }\n\n    public String getNickname() {\n        return nickname;\n    }\n\n    public void setNickname(String nickname) {\n        this.nickname = nickname;\n    }\n\n    public String getPassword() {\n        return password;\n    }\n\n    public void setPassword(String password) {\n        this.password = password;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/param/package-info.java",
    "content": "/**\n * Desc: 用于接受参数的封装\n * Author: cheng\n * Date: 2016/6/22\n */\npackage com.cheng.weixin.web.mobile.param;"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/properties/Configuration.java",
    "content": "package com.cheng.weixin.web.mobile.properties;\n\nimport org.apache.log4j.Logger;\n\nimport javax.naming.ConfigurationException;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.Properties;\n\n/**\n * 加载，并对配置文件进行基本操作\n * @author liuxm\n */\npublic class Configuration {\n\tstatic Logger log = Logger.getLogger(Configuration.class);\n\t\n\tprivate Properties config = new Properties();//配置\n\tprivate String fn = \"/globalconf.properties\";//配置文件名,有默认值\n\tpublic Configuration() {}\n\t/**\n\t * 根据指定的文件名构造一个配置\n\t * @param fileName\n\t * @throws ConfigurationException\n\t */\n\tpublic Configuration(String fileName) throws ConfigurationException {\n\t\ttry {\n\t\t\tInputStream in = getClass().getResourceAsStream(fileName);\n\t\t\tconfig.load(in); //载入文件\n//\t\t\tlog.debug(\"file path=\" + System.class.getResourceAsStream(fileName));\n\t\t\tin.close();\n\t\t} catch (IOException ex) {\n\t\t\tlog.error(\"Can't read files:\" + fileName);\n\t\t\tthrow new ConfigurationException(\"Can't read files:\" + fileName);\n\t\t}\n\t\tfn = fileName;\n\t}\n\t/**\n\t * 指定配置项名称，返回配置值\n\t * @param itemName String 配置项名称\n\t * @return String 配置值\n\t */\n\tpublic String getValue(String itemName) {\n\t\treturn config.getProperty(itemName);\n\t}\n\n\t/**\n\t * 指定配置项名称和默认值，返回配置值\n\t * @param itemName String 配置项名称\n\t * @param defaultValue String 默认配置值\n\t * @return String 配置值\n\t */\n\tpublic String getValue(String itemName, String defaultValue) {\n\t\tString result = config.getProperty(itemName, defaultValue);\n\t\treturn result;\n\t}\n\n\t/**\n\t * 设置配置项名称及其值\n\t * @param itemName String,配置项名\n\t * @param value String,配置值\n\t */\n\tpublic void setValue(String itemName, String value) {\n\t\tconfig.setProperty(itemName, value);\n\t\treturn;\n\t}\n\n\t/**\n\t * 保存配置文件，指定文件名和抬头描述\n\t * @param fileName String,保存配置的文件名\n\t * @param description String,抬头描述\n\t * @throws ConfigurationException 文件无法保存\n\t */\n\tpublic void saveFile(String fileName, String description)\n\t\t\tthrows ConfigurationException {\n\t\ttry {\n\t\t\tFileOutputStream fout = new FileOutputStream(fileName);\n\t\t\tconfig.store(fout, description);//保存文件\n\t\t\tfout.close();\n\t\t} catch (IOException ex) {\n\t\t\tlog.error(\"Can't not save files:\" + fileName);\n\t\t\tthrow new ConfigurationException(\"Can't not save files:\" + fileName);\n\t\t}\n\t}\n\t/**\n\t * 保存配置文件，指定文件名\n\t * @param fileName String,保存配置的文件名\n\t * @throws ConfigurationException 文件无法保存\n\t */\n\tpublic void saveFile(String fileName) throws ConfigurationException {\n\t\tsaveFile(fileName, \"\");\n\t}\n\t/**\n\t *保存配置文件，采用原文件名。当读取文件时，类会记录文件读取的来源。\n\t * @throws ConfigurationException 必须指定一个文件保存\n\t */\n\tpublic void saveFile() throws ConfigurationException {\n\t\tif (fn.length() == 0){\n\t\t\tlog.error(\"Must spification a file to save\");\n\t\t\tthrow new ConfigurationException(\"Must spification a file to save\");\n\t\t}\n\t\tsaveFile(fn);\n\t}\n}"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/properties/Global.java",
    "content": "package com.cheng.weixin.web.mobile.properties;\n\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * 存放文件配置信息或者全局变量配置信息\n */\npublic class Global {\n\tprivate static final Logger logger = LoggerFactory.getLogger(Global.class);\n\t//版本号  Versions\n\tpublic static String APPSECRET;\n\n\tstatic{\n\t\tProperties properties = Properties.getInstance();\n\t\tAPPSECRET = properties.getValue(\"wxclient\");\n\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tlogger.info(\"sadsadaaaaaaaaaa\");\n    \tSystem.out.println(Global.APPSECRET);\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/properties/Properties.java",
    "content": "package com.cheng.weixin.web.mobile.properties;\n\n\nimport org.apache.log4j.Logger;\n\nimport javax.naming.ConfigurationException;\n\n/**\n * 读取Properties配置文件\n * @author liuxm\n */\npublic class Properties {\n\tstatic Logger log = Logger.getLogger(Properties.class);\n\t\n\tpublic static String GLOBAL_CONF_FILE_NAME=\"/globalconf.properties\";\n\tprivate static Properties properties = null;\n\tprivate Configuration config = null;\n\tprivate String classesPath=null;\n\n\tprivate Properties() {\n\t}\n\t/**\n\t * Properties静态工厂\n\t * @return GlobalConf\n\t * @throws ConfigurationException 无法创建Properties\n\t */\n\tpublic static Properties getInstance(){\n\t\tif (properties == null) {\n\t\t\tproperties = new Properties();\n\t\t\ttry {\n\t\t\t\tproperties.config = new Configuration(GLOBAL_CONF_FILE_NAME);\n\t\t\t} catch (ConfigurationException e) {\n\t\t\t\tlog.error(\"\", e);\n\t\t\t}\n\t\t}\n\t\treturn properties;\n\t}\n\n\tpublic String getValue(String key,String defalutValue) {\n\t\treturn config.getValue(key,defalutValue);\n\t}\n\t\n\tpublic String getValue(String key) {\n\t\treturn config.getValue(key);\n\t}\n\t\n\tpublic int getIntValue(String key,int defaultValue) {\n\t\tint value = 0;\n\t\tvalue = Integer.parseInt(getValue(key,\"\"+defaultValue));\n\t\treturn value;\n\t}\n\n\tpublic int getIntValue(String key) {\n\t\tint value = 0;\n\t\tvalue = Integer.parseInt(getValue(key));\n\t\treturn value;\n\t}\n\t\n\tpublic long getLongValue(String key,long defaultValue) {\n\t\tlong value = 0;\n\t\tvalue = Long.parseLong(getValue(key,\"\"+defaultValue));\n\t\treturn value;\n\t}\n\t\n\tpublic boolean getBooleanValue(String key,boolean defaultValue) {\n\t\tboolean value = true;\n\t\tvalue = Boolean.parseBoolean(getValue(key,\"\" + defaultValue));\n\t\treturn value;\n\t}\n\t\n\tpublic boolean getBooleanValue(String key) {\n\t\tboolean value = true;\n\t\tvalue = Boolean.parseBoolean(getValue(key));\n\t\treturn value;\n\t}\n\t\n\tpublic void setValue(String key, String value) throws ConfigurationException {\n\t\tconfig.setValue(key, value);\n\t\tconfig.saveFile();\n\t}\n\t\n\t/**\n     * @return Returns the classesPath.\n     */\n    public String getClassesPath() {\n        return classesPath;\n    }\n    /**\n     * @param classesPath The classesPath to set.\n     */\n    public void setClassesPath(String classesPath) {\n        this.classesPath = classesPath;\n    }\n}"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/Promotion/CouponDto.java",
    "content": "package com.cheng.weixin.web.mobile.result.Promotion;\n\n/**\n * Desc:\n * Author: hp\n * Date: 2016/11/7\n */\npublic class CouponDto {\n    private String couponId;\n    private String title;\n    private String faceValue;\n    private String enoughMoney;\n    private String beginTime;\n    private String endTime;\n    private boolean usable;\n\n    public CouponDto() {\n    }\n\n    public CouponDto(String title, String faceValue, String enoughMoney, String beginTime, String endTime) {\n        this.title = title;\n        this.faceValue = faceValue;\n        this.enoughMoney = enoughMoney;\n        this.beginTime = beginTime;\n        this.endTime = endTime;\n    }\n\n    public String getCouponId() {\n        return couponId;\n    }\n\n    public void setCouponId(String couponId) {\n        this.couponId = couponId;\n    }\n\n    public String getTitle() {\n        return title;\n    }\n\n    public void setTitle(String title) {\n        this.title = title;\n    }\n\n    public String getFaceValue() {\n        return faceValue;\n    }\n\n    public void setFaceValue(String faceValue) {\n        this.faceValue = faceValue;\n    }\n\n    public String getEnoughMoney() {\n        return enoughMoney;\n    }\n\n    public void setEnoughMoney(String enoughMoney) {\n        this.enoughMoney = enoughMoney;\n    }\n\n    public String getBeginTime() {\n        return beginTime;\n    }\n\n    public void setBeginTime(String beginTime) {\n        this.beginTime = beginTime;\n    }\n\n    public String getEndTime() {\n        return endTime;\n    }\n\n    public void setEndTime(String endTime) {\n        this.endTime = endTime;\n    }\n\n    public boolean isUsable() {\n        return usable;\n    }\n\n    public void setUsable(boolean usable) {\n        this.usable = usable;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/cart/ProductCartInfo.java",
    "content": "package com.cheng.weixin.web.mobile.result.cart;\n\nimport org.apache.commons.lang3.builder.ReflectionToStringBuilder;\n\n/**\n * Desc: 购物车商品信息\n * Author: hp\n * Date: 2016/9/8\n */\npublic class ProductCartInfo {\n    private Integer count;\n    private String totalPrice;\n    private String freight;\n    private String freeFreightAmount;\n    private Boolean choose;\n\n    public Integer getCount() {\n        return count;\n    }\n\n    public void setCount(Integer count) {\n        this.count = count;\n    }\n\n    public String getTotalPrice() {\n        return totalPrice;\n    }\n\n    public void setTotalPrice(String totalPrice) {\n        this.totalPrice = totalPrice;\n    }\n\n    public String getFreight() {\n        return freight;\n    }\n\n    public void setFreight(String freight) {\n        this.freight = freight;\n    }\n\n    public String getFreeFreightAmount() {\n        return freeFreightAmount;\n    }\n\n    public void setFreeFreightAmount(String freeFreightAmount) {\n        this.freeFreightAmount = freeFreightAmount;\n    }\n\n    public Boolean getChoose() {\n        return choose;\n    }\n\n    public void setChoose(Boolean choose) {\n        this.choose = choose;\n    }\n\n    @Override\n    public String toString() {\n        return ReflectionToStringBuilder.toString(this);\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/cart/ProductInfo.java",
    "content": "package com.cheng.weixin.web.mobile.result.cart;\n\nimport org.apache.commons.lang3.builder.ReflectionToStringBuilder;\n\n/**\n * Desc: 商品信息\n * Author: hp\n * Date: 2016/8/26\n */\npublic class ProductInfo {\n    private String productId;\n    private String productImg;\n    private String name;\n    private String marketPrice;\n    private String salePrice;\n    private int nums;\n    private boolean choose;\n    private boolean stock;\n    private String desc;\n\n    public String getProductId() {\n        return productId;\n    }\n\n    public void setProductId(String productId) {\n        this.productId = productId;\n    }\n\n    public String getProductImg() {\n        return productImg;\n    }\n\n    public void setProductImg(String productImg) {\n        this.productImg = productImg;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getMarketPrice() {\n        return marketPrice;\n    }\n\n    public void setMarketPrice(String marketPrice) {\n        this.marketPrice = marketPrice;\n    }\n\n    public String getSalePrice() {\n        return salePrice;\n    }\n\n    public void setSalePrice(String salePrice) {\n        this.salePrice = salePrice;\n    }\n\n    public int getNums() {\n        return nums;\n    }\n\n    public void setNums(int nums) {\n        this.nums = nums;\n    }\n\n    public boolean isChoose() {\n        return choose;\n    }\n\n    public void setChoose(boolean choose) {\n        this.choose = choose;\n    }\n\n    public boolean isStock() {\n        return stock;\n    }\n\n    public void setStock(boolean stock) {\n        this.stock = stock;\n    }\n\n    public String getDesc() {\n        return desc;\n    }\n\n    public void setDesc(String desc) {\n        this.desc = desc;\n    }\n\n    @Override\n    public String toString() {\n        return ReflectionToStringBuilder.toString(this);\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/cart/ProductInfoComparator.java",
    "content": "package com.cheng.weixin.web.mobile.result.cart;\n\nimport java.util.Comparator;\n\n/**\n * Desc:\n * Author: 光灿\n * Date: 2016/11/13\n */\npublic class ProductInfoComparator implements Comparator<ProductInfo> {\n    @Override\n    public int compare(ProductInfo product1, ProductInfo product2) {\n        if (product1.isStock()==product2.isStock()) {\n            return 0;\n        }else if (product1.isStock()) {\n            return -1;\n        }else {\n            return 1;\n        }\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/cart/ShoppingCartInfo.java",
    "content": "package com.cheng.weixin.web.mobile.result.cart;\n\nimport org.apache.commons.lang3.builder.ReflectionToStringBuilder;\n\nimport java.util.List;\n\n/**\n * Desc: 购物车\n * Author: hp\n * Date: 2016/8/26\n */\npublic class ShoppingCartInfo {\n    private String consignee;\n    private String address;\n    private String mobile;\n    private String deliveryDate;\n    private String totalPrice;\n    private String freight;\n    private String freeFreightAmount;\n    private int hasNum;\n    private List<ProductInfo> products;\n    private Boolean isSince;\n    private String addrId;\n\n    public String getConsignee() {\n        return consignee;\n    }\n\n    public void setConsignee(String consignee) {\n        this.consignee = consignee;\n    }\n\n    public String getAddress() {\n        return address;\n    }\n\n    public void setAddress(String address) {\n        this.address = address;\n    }\n\n    public String getMobile() {\n        return mobile;\n    }\n\n    public void setMobile(String mobile) {\n        this.mobile = mobile;\n    }\n\n    public String getDeliveryDate() {\n        return deliveryDate;\n    }\n\n    public void setDeliveryDate(String deliveryDate) {\n        this.deliveryDate = deliveryDate;\n    }\n\n    public String getTotalPrice() {\n        return totalPrice;\n    }\n\n    public void setTotalPrice(String totalPrice) {\n        this.totalPrice = totalPrice;\n    }\n\n    public List<ProductInfo> getProducts() {\n        return products;\n    }\n\n    public void setProducts(List<ProductInfo> products) {\n        this.products = products;\n    }\n    public String getFreight() {\n        return freight;\n    }\n\n    public void setFreight(String freight) {\n        this.freight = freight;\n    }\n\n    public String getFreeFreightAmount() {\n        return freeFreightAmount;\n    }\n\n    public void setFreeFreightAmount(String freeFreightAmount) {\n        this.freeFreightAmount = freeFreightAmount;\n    }\n\n\n    public int getHasNum() {\n        return hasNum;\n    }\n\n    public void setHasNum(int hasNum) {\n        this.hasNum = hasNum;\n    }\n    public Boolean getSince() {\n        return isSince;\n    }\n\n    public void setSince(Boolean since) {\n        isSince = since;\n    }\n\n    public String getAddrId() {\n        return addrId;\n    }\n\n    public void setAddrId(String addrId) {\n        this.addrId = addrId;\n    }\n\n    @Override\n    public String toString() {\n        return ReflectionToStringBuilder.toString(this);\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/comment/ProductComment.java",
    "content": "package com.cheng.weixin.web.mobile.result.comment;\n\nimport org.apache.commons.lang3.builder.ReflectionToStringBuilder;\n\n/**\n * Desc: 评论\n * Author: hp\n * Date: 2016/10/8\n */\npublic class ProductComment {\n    private String username;\n    private String avatar;\n    private String level;\n    private String date;\n    private String content;\n    private String reply;\n\n\n    public ProductComment() {\n    }\n\n    public ProductComment(String username, String level, String date, String content, String reply) {\n        this.username = username;\n        this.level = level;\n        this.date = date;\n        this.content = content;\n        this.reply = reply;\n    }\n\n    public String getAvatar() {\n        return avatar;\n    }\n\n    public void setAvatar(String avatar) {\n        this.avatar = avatar;\n    }\n\n    public String getUsername() {\n        return username;\n    }\n\n    public void setUsername(String username) {\n        this.username = username;\n    }\n\n    public String getLevel() {\n        return level;\n    }\n\n    public void setLevel(String level) {\n        this.level = level;\n    }\n\n    public String getDate() {\n        return date;\n    }\n\n    public void setDate(String date) {\n        this.date = date;\n    }\n\n    public String getContent() {\n        return content;\n    }\n\n    public void setContent(String content) {\n        this.content = content;\n    }\n\n    public String getReply() {\n        return reply;\n    }\n\n    public void setReply(String reply) {\n        this.reply = reply;\n    }\n    @Override\n    public String toString() {\n        return ReflectionToStringBuilder.toString(this);\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/index/Index.java",
    "content": "package com.cheng.weixin.web.mobile.result.index;\n\nimport java.util.List;\n\n/**\n * Desc: 首页信息\n * Author: cheng\n * Date: 2016/6/28\n */\npublic class Index {\n    private List<IndexAd> ads;\n    private List<IndexNotice> notices;\n    private List<IndexProduct> products;\n    //private String totalPrice;\n\n    public List<IndexAd> getAds() {\n        return ads;\n    }\n\n    public void setAds(List<IndexAd> ads) {\n        this.ads = ads;\n    }\n\n    public List<IndexNotice> getNotices() {\n        return notices;\n    }\n\n    public void setNotices(List<IndexNotice> notices) {\n        this.notices = notices;\n    }\n\n\n    public List<IndexProduct> getProducts() {\n        return products;\n    }\n\n    public void setProducts(List<IndexProduct> products) {\n        this.products = products;\n    }\n\n    //public String getTotalPirce() {\n    //    return totalPrice;\n    //}\n    //\n    //public void setTotalPirce(BigDecimal totalPrice) {\n    //    this.totalPrice = StringFormat.format(totalPrice);\n    //}\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/index/IndexAd.java",
    "content": "package com.cheng.weixin.web.mobile.result.index;\n\n/**\n * Desc: 首页图片\n * Author: cheng\n * Date: 2016/6/29\n */\npublic class IndexAd {\n    private String name;\n    private String pictureUrl;\n    private String linkUrl;\n    private int width;\n    private int height;\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getPictureUrl() {\n        return pictureUrl;\n    }\n\n    public void setPictureUrl(String pictureUrl) {\n        this.pictureUrl = pictureUrl;\n    }\n\n    public String getLinkUrl() {\n        return linkUrl;\n    }\n\n    public void setLinkUrl(String linkUrl) {\n        this.linkUrl = linkUrl;\n    }\n\n    public int getWidth() {\n        return width;\n    }\n\n    public void setWidth(int width) {\n        this.width = width;\n    }\n\n    public int getHeight() {\n        return height;\n    }\n\n    public void setHeight(int height) {\n        this.height = height;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/index/IndexBuy.java",
    "content": "package com.cheng.weixin.web.mobile.result.index;\n\nimport com.cheng.weixin.common.utils.StringFormat;\n\nimport java.math.BigDecimal;\n\n/**\n * Desc: 购买信息\n * Author: 光灿\n * Date: 2016/7/1\n */\n@Deprecated\npublic class IndexBuy {\n    private Long count;\n    private String price;\n\n    public Long getCount() {\n        return count;\n    }\n\n    public void setCount(Long count) {\n        this.count = count;\n    }\n\n    public String getPrice() {\n        return price;\n    }\n\n    public void setPrice(BigDecimal price) {\n        this.price = StringFormat.format(price);\n    }\n}\n\n\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/index/IndexImage.java",
    "content": "package com.cheng.weixin.web.mobile.result.index;\n\n/**\n * Desc: 首页图片信息\n * Author: cheng\n * Date: 2016/6/28\n */\npublic class IndexImage {\n    private String id;\n    private String urlLink;\n    private String hrefLink;\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public String getUrlLink() {\n        return urlLink;\n    }\n\n    public void setUrlLink(String urlLink) {\n        this.urlLink = urlLink;\n    }\n\n    public String getHrefLink() {\n        return hrefLink;\n    }\n\n    public void setHrefLink(String hrefLink) {\n        this.hrefLink = hrefLink;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/index/IndexNotice.java",
    "content": "package com.cheng.weixin.web.mobile.result.index;\n\n/**\n * Desc: 通知\n * Author: cheng\n * Date: 2016/6/28\n */\npublic class IndexNotice {\n    private String id;\n    private String content;\n    private String linkUrl;\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public String getContent() {\n        return content;\n    }\n\n    public void setContent(String content) {\n        this.content = content;\n    }\n\n    public String getLinkUrl() {\n        return linkUrl;\n    }\n\n    public void setLinkUrl(String linkUrl) {\n        this.linkUrl = linkUrl;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/index/IndexProduct.java",
    "content": "package com.cheng.weixin.web.mobile.result.index;\n\nimport com.cheng.weixin.common.utils.StringFormat;\n\nimport java.math.BigDecimal;\n\n/**\n * Desc: 首页商品信息\n * Author: cheng\n * Date: 2016/6/28\n */\npublic class IndexProduct {\n    private String id;\n    private String name;\n    private String price;\n    private String picLink;\n    private int width;\n    private int height;\n    private String tag;\n    private String desc;\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getPrice() {\n        return price;\n    }\n\n    public void setPrice(BigDecimal price) {\n        this.price = StringFormat.format(price);\n    }\n\n    public String getPicLink() {\n        return picLink;\n    }\n\n    public void setPicLink(String picLink) {\n        this.picLink = picLink;\n    }\n\n    public void setPrice(String price) {\n        this.price = price;\n    }\n\n    public int getWidth() {\n        return width;\n    }\n\n    public void setWidth(int width) {\n        this.width = width;\n    }\n\n    public int getHeight() {\n        return height;\n    }\n\n    public void setHeight(int height) {\n        this.height = height;\n    }\n\n    public String getTag() {\n        return tag;\n    }\n\n    public void setTag(String tag) {\n        this.tag = tag;\n    }\n\n    public String getDesc() {\n        return desc;\n    }\n\n    public void setDesc(String desc) {\n        this.desc = desc;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/mall/Mall.java",
    "content": "package com.cheng.weixin.web.mobile.result.mall;\n\nimport java.util.List;\n\n/**\n * Desc: 商城商品\n * Author: hp\n * Date: 2016/9/9\n */\n@Deprecated\npublic class Mall {\n    private List<Products> products;\n    private String totalPrice;\n\n    public List<Products> getProducts() {\n        return products;\n    }\n\n    public void setProducts(List<Products> products) {\n        this.products = products;\n    }\n\n    public String getTotalPrice() {\n        return totalPrice;\n    }\n\n    public void setTotalPrice(String totalPrice) {\n        this.totalPrice = totalPrice;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/mall/MallBuy.java",
    "content": "package com.cheng.weixin.web.mobile.result.mall;\n\nimport com.cheng.weixin.common.utils.StringFormat;\n\nimport java.math.BigDecimal;\n\n/**\n * Desc: 购买信息\n * Author: 光灿\n * Date: 2016/7/1\n */\n@Deprecated\npublic class MallBuy {\n    private Long count;\n    private String totalPrice;\n\n    public Long getCount() {\n        return count;\n    }\n\n    public void setCount(Long count) {\n        this.count = count;\n    }\n\n    public String getTotalPrice() {\n        return totalPrice;\n    }\n\n    public void setTotalPrice(BigDecimal totalPrice) {\n        this.totalPrice = StringFormat.format(totalPrice);\n    }\n}\n\n\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/mall/ProductCategory.java",
    "content": "package com.cheng.weixin.web.mobile.result.mall;\n\nimport org.apache.commons.lang3.builder.ReflectionToStringBuilder;\n\n/**\n * Desc: 商品类别\n * Author: hp\n * Date: 2016/9/9\n */\npublic class ProductCategory {\n    private String id;\n    private String name;\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    @Override\n    public String toString() {\n        return ReflectionToStringBuilder.toString(this);\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/mall/Products.java",
    "content": "package com.cheng.weixin.web.mobile.result.mall;\n\nimport org.apache.commons.lang3.builder.ReflectionToStringBuilder;\n\n/**\n * Desc:\n * Author: 光灿\n * Date: 2016/10/30\n */\npublic class Products {\n    private String id;\n    private String name;\n    private String price;\n    private String picLink;\n    private int width;\n    private int height;\n    private String tag;\n    private String desc;\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getPrice() {\n        return price;\n    }\n\n    public void setPrice(String price) {\n        this.price = price;\n    }\n\n    public String getPicLink() {\n        return picLink;\n    }\n\n    public void setPicLink(String picLink) {\n        this.picLink = picLink;\n    }\n\n    public int getWidth() {\n        return width;\n    }\n\n    public void setWidth(int width) {\n        this.width = width;\n    }\n\n    public int getHeight() {\n        return height;\n    }\n\n    public void setHeight(int height) {\n        this.height = height;\n    }\n\n    public String getTag() {\n        return tag;\n    }\n\n    public void setTag(String tag) {\n        this.tag = tag;\n    }\n\n    public String getDesc() {\n        return desc;\n    }\n\n    public void setDesc(String desc) {\n        this.desc = desc;\n    }\n\n    @Override\n    public String toString() {\n        return ReflectionToStringBuilder.toString(this);\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/order/ArayacakTownAddr.java",
    "content": "package com.cheng.weixin.web.mobile.result.order;\n\n/**\n * Desc:\n * Author: hp\n * Date: 2016/11/2\n */\npublic class ArayacakTownAddr {\n    private String townId;\n    private String town;\n\n    public ArayacakTownAddr() {\n    }\n\n    public ArayacakTownAddr(String townId, String town) {\n        this.townId = townId;\n        this.town = town;\n    }\n\n    public String getTownId() {\n        return townId;\n    }\n\n    public void setTownId(String townId) {\n        this.townId = townId;\n    }\n\n    public String getTown() {\n        return town;\n    }\n\n    public void setTown(String town) {\n        this.town = town;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/order/ArayacakVillageAddr.java",
    "content": "package com.cheng.weixin.web.mobile.result.order;\n\n/**\n * Desc:\n * Author: hp\n * Date: 2016/11/2\n */\npublic class ArayacakVillageAddr {\n    private String addrId;\n    private String address;\n    private String distance;\n\n    public ArayacakVillageAddr(String addrId, String address, String distance) {\n        this.addrId = addrId;\n        this.address = address;\n        this.distance = distance;\n    }\n\n    public String getAddrId() {\n        return addrId;\n    }\n\n    public void setAddrId(String addrId) {\n        this.addrId = addrId;\n    }\n\n    public String getAddress() {\n        return address;\n    }\n\n    public void setAddress(String address) {\n        this.address = address;\n    }\n\n    public String getDistance() {\n        return distance;\n    }\n\n    public void setDistance(String distance) {\n        this.distance = distance;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/order/BuyInfo.java",
    "content": "package com.cheng.weixin.web.mobile.result.order;\n\n/**\n * Desc:\n * Author: 光灿\n * Date: 2016/11/18\n */\npublic class BuyInfo {\n    private String orderNum;\n    private String deliveryDate;\n    private String surplusAmount;\n    private Boolean isPay;\n    private Boolean isOffline;\n\n    private String payName; // 临时\n\n    public String getOrderNum() {\n        return orderNum;\n    }\n\n    public void setOrderNum(String orderNum) {\n        this.orderNum = orderNum;\n    }\n\n    public String getDeliveryDate() {\n        return deliveryDate;\n    }\n\n    public void setDeliveryDate(String deliveryDate) {\n        this.deliveryDate = deliveryDate;\n    }\n\n    public String getSurplusAmount() {\n        return surplusAmount;\n    }\n\n    public void setSurplusAmount(String surplusAmount) {\n        this.surplusAmount = surplusAmount;\n    }\n\n    public Boolean getPay() {\n        return isPay;\n    }\n\n    public void setPay(Boolean pay) {\n        isPay = pay;\n    }\n\n    public String getPayName() {\n        return payName;\n    }\n\n    public void setPayName(String payName) {\n        this.payName = payName;\n    }\n\n    public Boolean getOffline() {\n        return isOffline;\n    }\n\n    public void setOffline(Boolean offline) {\n        isOffline = offline;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/order/Detail.java",
    "content": "package com.cheng.weixin.web.mobile.result.order;\n\nimport org.apache.commons.lang3.builder.ReflectionToStringBuilder;\n\nimport java.util.List;\n\n/**\n * Desc: 订单详情\n * Author: hp\n * Date: 2016/9/28\n */\npublic class Detail {\n    private String id;\n    private String status;\n    private String oid;\n    private String addTime;\n    private String consignee;\n    private String address;\n    private String mobile;\n    private String payWay;\n\n    private String productTotalPrice;\n    private String freightPayable;\n    private String couponReducePrice;\n    private String balanceOffset;\n    private String totalPrice;\n    private String orderStatus;\n\n    private String commentId;\n\n    private List<ProductDetail> details;\n\n    public String getCommentId() {\n        return commentId;\n    }\n\n    public void setCommentId(String commentId) {\n        this.commentId = commentId;\n    }\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getOid() {\n        return oid;\n    }\n\n    public void setOid(String oid) {\n        this.oid = oid;\n    }\n\n    public String getAddTime() {\n        return addTime;\n    }\n\n    public void setAddTime(String addTime) {\n        this.addTime = addTime;\n    }\n\n    public String getConsignee() {\n        return consignee;\n    }\n\n    public void setConsignee(String consignee) {\n        this.consignee = consignee;\n    }\n\n    public String getAddress() {\n        return address;\n    }\n\n    public void setAddress(String address) {\n        this.address = address;\n    }\n\n    public String getMobile() {\n        return mobile;\n    }\n\n    public void setMobile(String mobile) {\n        this.mobile = mobile;\n    }\n\n    public String getPayWay() {\n        return payWay;\n    }\n\n    public void setPayWay(String payWay) {\n        this.payWay = payWay;\n    }\n\n    public String getProductTotalPrice() {\n        return productTotalPrice;\n    }\n\n    public void setProductTotalPrice(String productTotalPrice) {\n        this.productTotalPrice = productTotalPrice;\n    }\n\n    public String getFreightPayable() {\n        return freightPayable;\n    }\n\n    public void setFreightPayable(String freightPayable) {\n        this.freightPayable = freightPayable;\n    }\n\n    public String getCouponReducePrice() {\n        return couponReducePrice;\n    }\n\n    public void setCouponReducePrice(String couponReducePrice) {\n        this.couponReducePrice = couponReducePrice;\n    }\n\n    public String getBalanceOffset() {\n        return balanceOffset;\n    }\n\n    public void setBalanceOffset(String balanceOffset) {\n        this.balanceOffset = balanceOffset;\n    }\n\n    public String getTotalPrice() {\n        return totalPrice;\n    }\n\n    public void setTotalPrice(String totalPrice) {\n        this.totalPrice = totalPrice;\n    }\n\n    public String getOrderStatus() {\n        return orderStatus;\n    }\n\n    public void setOrderStatus(String orderStatus) {\n        this.orderStatus = orderStatus;\n    }\n\n    public List<ProductDetail> getDetails() {\n        return details;\n    }\n\n    public void setDetails(List<ProductDetail> details) {\n        this.details = details;\n    }\n\n    @Override\n    public String toString() {\n        return ReflectionToStringBuilder.toString(this);\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/order/OrderDeliveryTime.java",
    "content": "package com.cheng.weixin.web.mobile.result.order;\n\n/**\n * Desc:\n * Author: 光灿\n * Date: 2016/9/16\n */\npublic class OrderDeliveryTime {\n    private String value;\n    private String title;\n\n    public OrderDeliveryTime() {\n    }\n\n    public OrderDeliveryTime(String id, String name) {\n        this.value = id;\n        this.title = name;\n    }\n\n    public String getValue() {\n        return value;\n    }\n\n    public void setValue(String value) {\n        this.value = value;\n    }\n\n    public String getTitle() {\n        return title;\n    }\n\n    public void setTitle(String title) {\n        this.title = title;\n    }\n}\n\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/order/OrderList.java",
    "content": "package com.cheng.weixin.web.mobile.result.order;\n\nimport java.util.List;\n\n/**\n * Desc:\n * Author: hp\n * Date: 2016/9/21\n */\npublic class OrderList {\n    private String id;\n    private String date;\n    private String orderNum;\n    private String number;\n    private String totalPrice;\n    private String orderStatus;\n    private List<Status> statuses;\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public String getDate() {\n        return date;\n    }\n\n    public void setDate(String date) {\n        this.date = date;\n    }\n\n    public String getOrderNum() {\n        return orderNum;\n    }\n\n    public void setOrderNum(String orderNum) {\n        this.orderNum = orderNum;\n    }\n\n    public String getNumber() {\n        return number;\n    }\n\n    public void setNumber(String number) {\n        this.number = number;\n    }\n\n    public String getTotalPrice() {\n        return totalPrice;\n    }\n\n    public void setTotalPrice(String totalPrice) {\n        this.totalPrice = totalPrice;\n    }\n\n    public String getOrderStatus() {\n        return orderStatus;\n    }\n\n    public void setOrderStatus(String orderStatus) {\n        this.orderStatus = orderStatus;\n    }\n\n    public List<Status> getStatuses() {\n        return statuses;\n    }\n\n    public void setStatuses(List<Status> statuses) {\n        this.statuses = statuses;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/order/OrderPay.java",
    "content": "package com.cheng.weixin.web.mobile.result.order;\n\n/**\n * Desc:\n * Author: 光灿\n * Date: 2016/9/16\n */\npublic class OrderPay {\n    private String id;\n    private String name;\n    private String icon;\n\n    public OrderPay() {\n    }\n\n    public OrderPay(String id, String name, String icon) {\n        this.id = id;\n        this.name = name;\n        this.icon = icon;\n    }\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getIcon() {\n        return icon;\n    }\n\n    public void setIcon(String icon) {\n        this.icon = icon;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/order/ProductDetail.java",
    "content": "package com.cheng.weixin.web.mobile.result.order;\n\n/**\n * Desc:\n * Author: hp\n * Date: 2016/9/28\n */\npublic class ProductDetail {\n    private String name;\n    private int count;\n    private String price;\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public int getCount() {\n        return count;\n    }\n\n    public void setCount(int count) {\n        this.count = count;\n    }\n\n    public String getPrice() {\n        return price;\n    }\n\n    public void setPrice(String price) {\n        this.price = price;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/order/ProductList.java",
    "content": "package com.cheng.weixin.web.mobile.result.order;\n\n/**\n * Desc:\n * Author: hp\n * Date: 2016/11/4\n */\npublic class ProductList {\n    private String name;\n    private String imgUrl;\n    private String desc;\n    private String sellPrice;\n    private Integer count;\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getImgUrl() {\n        return imgUrl;\n    }\n\n    public void setImgUrl(String imgUrl) {\n        this.imgUrl = imgUrl;\n    }\n\n    public String getDesc() {\n        return desc;\n    }\n\n    public void setDesc(String desc) {\n        this.desc = desc;\n    }\n\n    public String getSellPrice() {\n        return sellPrice;\n    }\n\n    public void setSellPrice(String sellPrice) {\n        this.sellPrice = sellPrice;\n    }\n\n    public Integer getCount() {\n        return count;\n    }\n\n    public void setCount(Integer count) {\n        this.count = count;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/order/Status.java",
    "content": "package com.cheng.weixin.web.mobile.result.order;\n\n/**\n * Desc:\n * Author: 光灿\n * Date: 2016/11/16\n */\npublic class Status {\n    private String name;\n    private boolean active;\n\n    public Status() {\n    }\n\n    public Status(String name, boolean active) {\n        this.name = name;\n        this.active = active;\n    }\n\n    public boolean isActive() {\n        return active;\n    }\n\n    public void setActive(boolean active) {\n        this.active = active;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/order/SubmitOrderInfo.java",
    "content": "package com.cheng.weixin.web.mobile.result.order;\n\nimport java.util.List;\n\n/**\n * Desc:\n * Author: 光灿\n * Date: 2016/9/15\n */\npublic class SubmitOrderInfo {\n    private String consignee;\n    private String address;\n    private String mobile;\n    private List<OrderDeliveryTime> deliveryTimes;\n    private OrderPay recPay;\n    private List<OrderPay> pays;\n    private int availableCoupon;\n    private String availableBalance;\n    private List<String> productImgs;\n    private int totalProductNums;\n    private String totalProductPrice;\n    private String freight;\n    private String couponAmount;\n    private String totalPrice;\n    private Boolean since;\n    private String addrId;\n    private String ticketId;\n    private String amount;\n    //private String timeId;\n    //private String payId;\n    //private Boolean isBalance;\n    //private String remark;\n    //private OrderDeliveryTime deliveryTime;\n\n    public OrderPay getRecPay() {\n        return recPay;\n    }\n\n    public void setRecPay(OrderPay recPay) {\n        this.recPay = recPay;\n    }\n\n    public String getConsignee() {\n        return consignee;\n    }\n\n    public void setConsignee(String consignee) {\n        this.consignee = consignee;\n    }\n\n    public String getAddress() {\n        return address;\n    }\n\n    public void setAddress(String address) {\n        this.address = address;\n    }\n\n    public String getMobile() {\n        return mobile;\n    }\n\n    public void setMobile(String mobile) {\n        this.mobile = mobile;\n    }\n\n    public List<OrderDeliveryTime> getDeliveryTimes() {\n        return deliveryTimes;\n    }\n\n    public void setDeliveryTimes(List<OrderDeliveryTime> deliveryTimes) {\n        this.deliveryTimes = deliveryTimes;\n    }\n\n    public List<OrderPay> getPays() {\n        return pays;\n    }\n\n    public void setPays(List<OrderPay> pays) {\n        this.pays = pays;\n    }\n\n    public int getAvailableCoupon() {\n        return availableCoupon;\n    }\n\n    public void setAvailableCoupon(int availableCoupon) {\n        this.availableCoupon = availableCoupon;\n    }\n\n    public String getAvailableBalance() {\n        return availableBalance;\n    }\n\n    public void setAvailableBalance(String availableBalance) {\n        this.availableBalance = availableBalance;\n    }\n\n    public List<String> getProductImgs() {\n        return productImgs;\n    }\n\n    public void setProductImgs(List<String> productImgs) {\n        this.productImgs = productImgs;\n    }\n\n    public int getTotalProductNums() {\n        return totalProductNums;\n    }\n\n    public void setTotalProductNums(int totalProductNums) {\n        this.totalProductNums = totalProductNums;\n    }\n\n    public String getTotalProductPrice() {\n        return totalProductPrice;\n    }\n\n    public void setTotalProductPrice(String totalProductPrice) {\n        this.totalProductPrice = totalProductPrice;\n    }\n\n    public String getFreight() {\n        return freight;\n    }\n\n    public void setFreight(String freight) {\n        this.freight = freight;\n    }\n\n    public String getCouponAmount() {\n        return couponAmount;\n    }\n\n    public void setCouponAmount(String couponAmount) {\n        this.couponAmount = couponAmount;\n    }\n\n    public String getTotalPrice() {\n        return totalPrice;\n    }\n\n    public void setTotalPrice(String totalPrice) {\n        this.totalPrice = totalPrice;\n    }\n    public String getAddrId() {\n        return addrId;\n    }\n\n    public void setAddrId(String addrId) {\n        this.addrId = addrId;\n    }\n\n    public Boolean getSince() {\n        return since;\n    }\n\n    public void setSince(Boolean since) {\n        this.since = since;\n    }\n    /*public String getRemark() {\n        return remark;\n    }\n\n    public void setRemark(String remark) {\n        this.remark = remark;\n    }\n    public String getTimeId() {\n        return timeId;\n    }\n\n    public void setTimeId(String timeId) {\n        this.timeId = timeId;\n    }\n\n    public String getPayId() {\n        return payId;\n    }\n\n    public void setPayId(String payId) {\n        this.payId = payId;\n    }\n\n    public Boolean getBalance() {\n        return isBalance;\n    }\n\n    public void setBalance(Boolean balance) {\n        isBalance = balance;\n    }\n\n    public OrderDeliveryTime getDeliveryTime() {\n        return deliveryTime;\n    }\n\n    public void setDeliveryTime(OrderDeliveryTime deliveryTime) {\n        this.deliveryTime = deliveryTime;\n    }*/\n\n    public String getTicketId() {\n        return ticketId;\n    }\n\n    public void setTicketId(String ticketId) {\n        this.ticketId = ticketId;\n    }\n\n    public String getAmount() {\n        return amount;\n    }\n\n    public void setAmount(String amount) {\n        this.amount = amount;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/package-info.java",
    "content": "/**\n * Desc: 用于返回结果的封装\n * Author: cheng\n * Date: 2016/6/22\n */\npackage com.cheng.weixin.web.mobile.result;"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/product/ProductDetail.java",
    "content": "package com.cheng.weixin.web.mobile.result.product;\n\nimport com.cheng.weixin.web.mobile.result.comment.ProductComment;\nimport org.apache.commons.lang3.builder.ReflectionToStringBuilder;\n\nimport java.util.List;\n\n/**\n * Desc:\n * Author: hp\n * Date: 2016/10/8\n */\npublic class ProductDetail {\n\n    private String productId;\n    private String name;\n    private String desc;\n    private int sellNum; // 月销\n    private int good; // 好评\n    private String sellPrice;\n    private String marketPrice;\n    private int giveAway;\n    private String count;\n    private String totalPrice;\n    private boolean focus; // 是否收藏\n\n    private List<ProductPic> picList;\n\n    private List<ProductComment> comments;\n    public String getCount() {\n        return count;\n    }\n\n    public void setCount(String count) {\n        this.count = count;\n    }\n    public List<ProductComment> getComments() {\n        return comments;\n    }\n\n    public void setComments(List<ProductComment> comments) {\n        this.comments = comments;\n    }\n\n    public List<ProductPic> getPicList() {\n        return picList;\n    }\n\n    public void setPicList(List<ProductPic> picList) {\n        this.picList = picList;\n    }\n\n    public String getProductId() {\n        return productId;\n    }\n\n    public void setProductId(String productId) {\n        this.productId = productId;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getDesc() {\n        return desc;\n    }\n\n    public void setDesc(String desc) {\n        this.desc = desc;\n    }\n\n    public int getSellNum() {\n        return sellNum;\n    }\n\n    public void setSellNum(int sellNum) {\n        this.sellNum = sellNum;\n    }\n\n    public int getGood() {\n        return good;\n    }\n\n    public void setGood(int good) {\n        this.good = good;\n    }\n\n    public String getSellPrice() {\n        return sellPrice;\n    }\n\n    public void setSellPrice(String sellPrice) {\n        this.sellPrice = sellPrice;\n    }\n\n    public String getMarketPrice() {\n        return marketPrice;\n    }\n\n    public void setMarketPrice(String marketPrice) {\n        this.marketPrice = marketPrice;\n    }\n\n    public int getGiveAway() {\n        return giveAway;\n    }\n\n    public void setGiveAway(int giveAway) {\n        this.giveAway = giveAway;\n    }\n\n    public String getTotalPrice() {\n        return totalPrice;\n    }\n\n    public void setTotalPrice(String totalPrice) {\n        this.totalPrice = totalPrice;\n    }\n\n    public boolean isFocus() {\n        return focus;\n    }\n\n    public void setFocus(boolean focus) {\n        this.focus = focus;\n    }\n\n    @Override\n    public String toString() {\n        return ReflectionToStringBuilder.toString(this);\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/product/ProductPic.java",
    "content": "package com.cheng.weixin.web.mobile.result.product;\n\n/**\n * Desc: 商品详情图片\n * Author: hp\n * Date: 2016/10/8\n */\npublic class ProductPic {\n    private String pictureUrl;\n    private int width;\n    private int height;\n\n    public ProductPic() {\n    }\n\n    public ProductPic(String pictureUrl, int width, int height) {\n        this.pictureUrl = pictureUrl;\n        this.width = width;\n        this.height = height;\n    }\n\n    public String getPictureUrl() {\n        return pictureUrl;\n    }\n\n    public void setPictureUrl(String pictureUrl) {\n        this.pictureUrl = pictureUrl;\n    }\n\n    public int getWidth() {\n        return width;\n    }\n\n    public void setWidth(int width) {\n        this.width = width;\n    }\n\n    public int getHeight() {\n        return height;\n    }\n\n    public void setHeight(int height) {\n        this.height = height;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/user/DeliveryAddr.java",
    "content": "package com.cheng.weixin.web.mobile.result.user;\n\n/**\n * Desc:\n * Author: hp\n * Date: 2016/11/2\n */\npublic class DeliveryAddr {\n    private String addrId;\n    private String consignee;\n    private String mobile;\n    private String address;\n    private String sex;\n    private String tag;\n    private Boolean isDefault;\n\n    public String getAddrId() {\n        return addrId;\n    }\n\n    public void setAddrId(String addrId) {\n        this.addrId = addrId;\n    }\n\n    public String getConsignee() {\n        return consignee;\n    }\n\n    public void setConsignee(String consignee) {\n        this.consignee = consignee;\n    }\n\n    public String getMobile() {\n        return mobile;\n    }\n\n    public void setMobile(String mobile) {\n        this.mobile = mobile;\n    }\n\n    public String getAddress() {\n        return address;\n    }\n\n    public void setAddress(String address) {\n        this.address = address;\n    }\n\n    public Boolean getDefault() {\n        return isDefault;\n    }\n\n    public void setDefault(Boolean aDefault) {\n        isDefault = aDefault;\n    }\n\n    public String getSex() {\n        return sex;\n    }\n\n    public void setSex(String sex) {\n        this.sex = sex;\n    }\n\n    public String getTag() {\n        return tag;\n    }\n\n    public void setTag(String tag) {\n        this.tag = tag;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/result/user/UserDetail.java",
    "content": "package com.cheng.weixin.web.mobile.result.user;\n\nimport org.apache.commons.lang3.builder.ReflectionToStringBuilder;\n\n/**\n * Desc:\n * Author: hp\n * Date: 2016/9/30\n */\npublic class UserDetail {\n    private String id;\n    private String avatar;\n    private String nickname;\n    private String username;\n    private int accountLevel;\n    private int bonusPointRecord;\n    private int bonusPointUpgrade;\n    private String balance;\n    private String couponRecord;\n    private int currentMonthBonusPoint;\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public String getAvatar() {\n        return avatar;\n    }\n\n    public void setAvatar(String avatar) {\n        this.avatar = avatar;\n    }\n\n    public String getNickname() {\n        return nickname;\n    }\n\n    public void setNickname(String nickname) {\n        this.nickname = nickname;\n    }\n\n    public String getUsername() {\n        return username;\n    }\n\n    public void setUsername(String username) {\n        this.username = username;\n    }\n\n    public int getAccountLevel() {\n        return accountLevel;\n    }\n\n    public void setAccountLevel(int accountLevel) {\n        this.accountLevel = accountLevel;\n    }\n\n    public int getBonusPointRecord() {\n        return bonusPointRecord;\n    }\n\n    public void setBonusPointRecord(int bonusPointRecord) {\n        this.bonusPointRecord = bonusPointRecord;\n    }\n\n    public String getBalance() {\n        return balance;\n    }\n\n    public void setBalance(String balance) {\n        this.balance = balance;\n    }\n\n    public String getCouponRecord() {\n        return couponRecord;\n    }\n\n    public void setCouponRecord(String couponRecord) {\n        this.couponRecord = couponRecord;\n    }\n\n    public int getCurrentMonthBonusPoint() {\n        return currentMonthBonusPoint;\n    }\n\n    public void setCurrentMonthBonusPoint(int currentMonthBonusPoint) {\n        this.currentMonthBonusPoint = currentMonthBonusPoint;\n    }\n\n    public int getBonusPointUpgrade() {\n        return bonusPointUpgrade;\n    }\n\n    public void setBonusPointUpgrade(int bonusPointUpgrade) {\n        this.bonusPointUpgrade = bonusPointUpgrade;\n    }\n\n    @Override\n    public String toString() {\n        return ReflectionToStringBuilder.toString(this);\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/security/IgnoreSecurity.java",
    "content": "package com.cheng.weixin.web.mobile.security;\n\nimport java.lang.annotation.*;\n\n/**\n * Desc: 忽略安全性检查\n * Author: cheng\n * Date: 2016/6/21\n */\n@Documented\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface IgnoreSecurity {\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/security/LocalUser.java",
    "content": "package com.cheng.weixin.web.mobile.security;\n\n/**\n * Desc:\n * Author: 光灿\n * Date: 2016/11/20\n */\npublic class LocalUser {\n    private static ThreadLocal<User> userThreadLocal = new ThreadLocal<>();\n\n    public static User getUser() {\n        return userThreadLocal.get();\n    }\n\n    public static void setUser(User user) {\n        userThreadLocal.set(user);\n    }\n\n    public static void removeUser() {\n        userThreadLocal.remove();\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/security/SecurityAspect.java",
    "content": "package com.cheng.weixin.web.mobile.security;\n\n\nimport com.cheng.weixin.common.utils.ServletUtils;\nimport com.cheng.weixin.common.utils.StringUtils;\nimport com.cheng.weixin.web.mobile.exception.TokenException;\nimport com.cheng.weixin.web.mobile.exception.message.StatusCode;\nimport org.aspectj.lang.ProceedingJoinPoint;\nimport org.aspectj.lang.reflect.MethodSignature;\n\nimport java.lang.reflect.Method;\n\n/**\n * Desc: 用于检查 token 的切面\n * Author: cheng\n * Date: 2016/6/22\n */\npublic class SecurityAspect {\n\n    private static final String DEFAULT_TOKEN_NAME = \"X-Token\";\n\n    private TokenManager tokenManager;\n    private String tokenName;\n\n    public void setTokenManager(TokenManager tokenManager) {\n        this.tokenManager = tokenManager;\n    }\n\n    public void setTokenName(String tokenName) {\n        if (StringUtils.isEmpty(tokenName)) {\n            tokenName = DEFAULT_TOKEN_NAME;\n        }\n        this.tokenName = tokenName;\n    }\n\n    public Object execute(ProceedingJoinPoint pjp) throws Throwable {\n        // 从切点上获取目标方法\n        MethodSignature methodSignature = (MethodSignature) pjp.getSignature();\n        Method method = methodSignature.getMethod();\n        // 若目标方法忽略了安全性检查，则直接调用目标方法\n        if (method.isAnnotationPresent(IgnoreSecurity.class)) {\n            return pjp.proceed();\n        }\n        // 从 request header 中获取当前 token\n        //String token = ServletUtils.getRequest().getHeader(tokenName);\n        String token = ServletUtils.getRequest().getParameter(tokenName);\n        // 检查 token 有效性\n        if (!tokenManager.checkToken(token)) {\n            throw new TokenException(StatusCode.UNAUTHORIZED);\n        }\n        // 调用目标方法\n        return pjp.proceed();\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/security/TokenManager.java",
    "content": "package com.cheng.weixin.web.mobile.security;\n\n/**\n * Desc: 令牌管理器\n * Author: cheng\n * Date: 2016/6/22\n */\npublic interface TokenManager {\n\n    String createToken(String username);\n\n    boolean checkToken(String token);\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/security/User.java",
    "content": "package com.cheng.weixin.web.mobile.security;\n\nimport org.apache.commons.lang3.builder.ToStringBuilder;\n\n/**\n * Desc:\n * Author: 光灿\n * Date: 2016/11/20\n */\npublic class User {\n    private String userId;\n    private String username;\n    private String token;\n\n    public User() {\n    }\n\n    public User(String userId, String username, String token) {\n        this.userId = userId;\n        this.username = username;\n        this.token = token;\n    }\n\n    public String getUserId() {\n        return userId;\n    }\n\n    public void setUserId(String userId) {\n        this.userId = userId;\n    }\n\n    public String getUsername() {\n        return username;\n    }\n\n    public void setUsername(String username) {\n        this.username = username;\n    }\n\n    public String getToken() {\n        return token;\n    }\n\n    public void setToken(String token) {\n        this.token = token;\n    }\n\n    @Override\n    public String toString() {\n        return new ToStringBuilder(this)\n                .append(\"userId\", userId)\n                .append(\"username\", username)\n                .append(\"token\", token)\n                .toString();\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/security/impl/DefaultTokenManager.java",
    "content": "package com.cheng.weixin.web.mobile.security.impl;\n\nimport com.cheng.weixin.common.security.CodecUtil;\nimport com.cheng.weixin.common.utils.StringUtils;\nimport com.cheng.weixin.web.mobile.security.TokenManager;\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\n/**\n * Desc: 默认令牌管理器\n * Author: cheng\n * Date: 2016/6/21\n */\npublic class DefaultTokenManager implements TokenManager {\n\n    private static Map<String, String> tokenMap = new ConcurrentHashMap<>();\n\n    @Override\n    public String createToken(String username) {\n        String token = CodecUtil.createUUID();\n        tokenMap.put(token, username);\n        return token;\n    }\n\n    @Override\n    public boolean checkToken(String token) {\n        return !StringUtils.isEmpty(token) && tokenMap.containsKey(token);\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/security/impl/RedisTokenManager.java",
    "content": "package com.cheng.weixin.web.mobile.security.impl;\n\nimport com.cheng.weixin.common.security.CodecUtil;\nimport com.cheng.weixin.common.utils.StringUtils;\nimport com.cheng.weixin.rpc.redis.service.RpcRedisService;\nimport com.cheng.weixin.rpc.user.entity.Account;\nimport com.cheng.weixin.rpc.user.service.RpcUserService;\nimport com.cheng.weixin.web.mobile.security.LocalUser;\nimport com.cheng.weixin.web.mobile.security.TokenManager;\nimport com.cheng.weixin.web.mobile.security.User;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\n\n/**\n * Desc: 基于 Redis 的令牌管理器\n * Author: cheng\n * Date: 2016/6/21\n */\npublic class RedisTokenManager implements TokenManager {\n    private final Logger logger = LoggerFactory.getLogger(getClass());\n    @Autowired\n    private RpcRedisService redisService;\n    @Autowired\n    private RpcUserService userService;\n\n    private static final long DEFAULT_SECONDS = 0;\n\n    private long seconds = DEFAULT_SECONDS;\n\n    public void setSeconds(int seconds) {\n        this.seconds = seconds;\n    }\n\n    @Override\n    public String createToken(String username) {\n        String token = CodecUtil.createUUID();\n        if (seconds != 0) {\n            redisService.set(token, username, seconds);\n        } else {\n            redisService.set(token, username);\n        }\n        return token;\n    }\n\n    @Override\n    public boolean checkToken(String token) {\n        if (StringUtils.isBlank(token)) return false;\n        boolean result = redisService.exists(token);\n        if(result) {\n            if (seconds != 0) {\n                redisService.flushExpireTime(token, seconds);\n            }\n            String loginName = (String) redisService.get(token);\n            Account account = userService.getAccountByLoginName(loginName);\n            LocalUser.setUser(new User(account.getId(), account.getUsername(), token));\n            //logger.info(\"User已放入==============>\" + LocalUser.getUser());\n        }\n        return result;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/security/package-info.java",
    "content": "/**\n * Desc: token的验证  主要用于AOP\n * Author: cheng\n * Date: 2016/6/22\n */\npackage com.cheng.weixin.web.mobile.security;"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/service/SysCartService.java",
    "content": "package com.cheng.weixin.web.mobile.service;\n\nimport com.cheng.weixin.common.utils.StringFormat;\nimport com.cheng.weixin.rpc.cart.entity.CartInfo;\nimport com.cheng.weixin.rpc.cart.entity.ShoppingCart;\nimport com.cheng.weixin.rpc.cart.service.RpcCartService;\nimport com.cheng.weixin.rpc.item.entity.Product;\nimport com.cheng.weixin.rpc.item.service.RpcProductService;\nimport com.cheng.weixin.rpc.order.entity.ArayacakAddress;\nimport com.cheng.weixin.rpc.order.service.RpcOrderService;\nimport com.cheng.weixin.rpc.user.entity.DeliveryAddress;\nimport com.cheng.weixin.rpc.user.entity.Member;\nimport com.cheng.weixin.rpc.user.service.RpcUserService;\nimport com.cheng.weixin.web.mobile.exception.ProductException;\nimport com.cheng.weixin.web.mobile.exception.message.StatusCode;\nimport com.cheng.weixin.web.mobile.param.AddressDto;\nimport com.cheng.weixin.web.mobile.result.cart.ProductCartInfo;\nimport com.cheng.weixin.web.mobile.result.cart.ProductInfo;\nimport com.cheng.weixin.web.mobile.result.cart.ProductInfoComparator;\nimport com.cheng.weixin.web.mobile.result.cart.ShoppingCartInfo;\nimport com.cheng.weixin.web.mobile.security.LocalUser;\nimport org.joda.time.DateTime;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.math.BigDecimal;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * Desc: 购物车\n * Author: hp\n * Date: 2016/8/26\n */\n@Service(\"sysCartService\")\npublic class SysCartService {\n\n    private final Logger LOG = LoggerFactory.getLogger(getClass());\n    @Autowired\n    private RpcUserService userService;\n    @Autowired\n    private RpcCartService cartService;\n    @Autowired\n    private RpcProductService productService;\n    @Autowired\n    private RpcOrderService orderService;\n\n    public ShoppingCartInfo getShoppingCart(AddressDto address) {\n\n        ShoppingCart shoppingCart = cartService.getShoppingCart(LocalUser.getUser().getUserId());\n        List<CartInfo> cartInfos = shoppingCart.getCartInfos();\n\n        ShoppingCartInfo shoppingCartInfo = new ShoppingCartInfo();\n        // 配送地址\n        if (address.getId() != null && !\"\".equals(address.getId())) {\n            if (address.getSince()) {\n                ArayacakAddress arayacakAddress = orderService.getArayacakAddressById(address.getId());\n                Member member = userService.getMemberByAccountId(LocalUser.getUser().getUserId());\n                shoppingCartInfo.setMobile(member.getMobile());\n                shoppingCartInfo.setAddress(arayacakAddress.getAddress());\n                shoppingCartInfo.setSince(true);\n            }else {\n                DeliveryAddress addr = userService.getDeliveryAddress(address.getId(), LocalUser.getUser().getUserId());\n                if (addr != null) {\n                    shoppingCartInfo.setConsignee(addr.getConsignee());\n                    shoppingCartInfo.setMobile(addr.getMobile());\n                    shoppingCartInfo.setAddress(addr.getAddress());\n                    shoppingCartInfo.setSince(false);\n                }\n            }\n            shoppingCartInfo.setAddrId(address.getId());\n        }else {\n            DeliveryAddress addr = userService.getDefaultAddress(LocalUser.getUser().getUserId());\n            if (addr != null) {\n                shoppingCartInfo.setConsignee(addr.getConsignee());\n                shoppingCartInfo.setMobile(addr.getMobile());\n                shoppingCartInfo.setAddress(addr.getAddress());\n                shoppingCartInfo.setSince(false);\n                shoppingCartInfo.setAddrId(addr.getId());\n            }\n        }\n\n        if (null != cartInfos && !cartInfos.isEmpty()) {\n            List<ProductInfo> productInfos = new ArrayList<>();\n            BigDecimal totalPrice = new BigDecimal(0);\n            int hasNum = 0;\n            for (CartInfo cartInfo : cartInfos) {\n                ProductInfo productInfo = new ProductInfo();\n                Product product = productService.getDefaultPictureById(cartInfo.getProductId());\n                if (null != product) {\n                    productInfo.setProductId(product.getId());\n                    productInfo.setProductImg(product.getDefaultPicture().getPictureUrl());\n                    BigDecimal salePrice = product.getSalePrice();\n                    if (cartInfo.isChoose() && product.getUnitsInStock()>0) {\n                        totalPrice = totalPrice.add(salePrice.multiply(new BigDecimal(cartInfo.getQuantity())));\n                    }\n                    if (product.getUnitsInStock()>0) {\n                        hasNum++;\n                    }else {\n                        cartService.changeUnchooseStatus(LocalUser.getUser().getUserId(), product.getId());\n                    }\n                    productInfo.setSalePrice(StringFormat.format(salePrice));\n                    productInfo.setMarketPrice(StringFormat.format(product.getMarketPrice()));\n                    productInfo.setName(product.getName());\n                    productInfo.setNums(cartInfo.getQuantity());\n                    productInfo.setDesc(product.getUnitDesc());\n                    productInfo.setChoose(cartInfo.isChoose());\n                    productInfo.setStock(product.getUnitsInStock()>0);\n                    productInfos.add(productInfo);\n                }\n            }\n            Collections.sort(productInfos, new ProductInfoComparator());\n            shoppingCartInfo.setProducts(productInfos);\n            shoppingCartInfo.setDeliveryDate(new DateTime().plusDays(1).toString(\"MM月dd日\"));\n            shoppingCartInfo.setTotalPrice(StringFormat.format(totalPrice));\n            shoppingCartInfo.setFreight(\"2\");\n            shoppingCartInfo.setHasNum(hasNum);\n            if (totalPrice.compareTo(BigDecimal.valueOf(5.00)) == -1) { // TODO 后台定义\n                shoppingCartInfo.setFreight(\"2\");// TODO 后台定义\n            }else {\n                shoppingCartInfo.setFreight(\"0\");\n            }\n            shoppingCartInfo.setFreeFreightAmount(\"5\");// TODO 后台定义\n        }\n        return shoppingCartInfo;\n    }\n\n    public ProductCartInfo addProduct(String productId) {\n        Product product = productService.getById(productId);\n        // 获取该商品的数量\n        Long count = cartService.addProductCount(LocalUser.getUser().getUserId(), productId);\n        if (product.getUnitsInStock() < count) {\n            cartService.subProductCount(LocalUser.getUser().getUserId(), productId);\n            throw new ProductException(StatusCode.PRODUCT_STOCK_SHORTAGE);\n        }\n        return chooseShoppingCartPrice(LocalUser.getUser().getUserId(), count);\n    }\n\n    public ProductCartInfo subProduct(String id) {\n        // 获取该商品的数量\n        Long count = cartService.subProductCount(LocalUser.getUser().getUserId(), id);\n        return chooseShoppingCartPrice(LocalUser.getUser().getUserId(), count);\n    }\n\n    public ProductCartInfo deleteProduct(String id) {\n        cartService.deleteProduct(LocalUser.getUser().getUserId(), id);\n        return chooseShoppingCartPrice(LocalUser.getUser().getUserId(), null);\n    }\n\n    public ProductCartInfo changeStatus(String productId) {\n        boolean isChoose = cartService.changeStatus(LocalUser.getUser().getUserId(), productId);\n        ProductCartInfo productCart = chooseShoppingCartPrice(LocalUser.getUser().getUserId(), null);\n        productCart.setChoose(isChoose);\n        return productCart;\n    }\n\n    public ProductCartInfo chooseAllProduct() {\n        cartService.chooseAllProduct(LocalUser.getUser().getUserId());\n        return chooseShoppingCartPrice(LocalUser.getUser().getUserId(), null);\n    }\n\n    public ProductCartInfo unChooseAllProduct() {\n        cartService.unchooseAllProduct(LocalUser.getUser().getUserId());\n        return chooseShoppingCartPrice(LocalUser.getUser().getUserId(), null);\n    }\n\n    /**\n     * 购物车商品的总价格\n     * @return\n     */\n    public String getTotalPrice() {\n        Set<String> productIds =  cartService.getChooseProductIds(LocalUser.getUser().getUserId());\n        BigDecimal totalPrice = BigDecimal.ZERO;\n        for (String productId : productIds) {\n            Product product = productService.getById(productId);\n            if (product.getUnitsInStock() > 0) {\n                // 根据Feild获取values 在乘以 单价 = total\n                Long counts = cartService.getCounts(LocalUser.getUser().getUserId(), productId);\n                totalPrice = totalPrice.add(product.getSalePrice().multiply(new BigDecimal(counts)));\n            }\n        }\n        return StringFormat.format(totalPrice);\n    }\n\n    /**\n     * 购物车已选择的商品的总价格(不包含无货的)\n     * @param userId\n     * @param currentCount\n     * @return\n     */\n    private ProductCartInfo chooseShoppingCartPrice(String userId, Long currentCount) {\n        BigDecimal totalPrice = BigDecimal.ZERO;\n        Set<String> productIds = cartService.getChooseProductIds(userId);\n        for (String productId : productIds) {\n            Product product = productService.getById(productId);\n            if (product.getUnitsInStock() > 0) {\n                Long count = cartService.getCounts(userId, productId);\n                totalPrice = totalPrice.add(product.getSalePrice().multiply(new BigDecimal(count)));\n            }\n        }\n        ProductCartInfo productCart = new ProductCartInfo();\n        if (currentCount != null) {\n            productCart.setCount(Integer.parseInt(currentCount+\"\"));\n        }\n        productCart.setTotalPrice(StringFormat.format(totalPrice));\n        if (totalPrice.compareTo(BigDecimal.valueOf(5.00)) == -1) {\n            productCart.setFreight(\"2\");\n        }else {\n            productCart.setFreight(\"0\");\n        }\n        productCart.setFreeFreightAmount(\"5\");\n\n        return productCart;\n    }\n\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/service/SysCommentService.java",
    "content": "package com.cheng.weixin.web.mobile.service;\n\nimport com.cheng.weixin.common.model.Page;\nimport com.cheng.weixin.rpc.comment.entity.Comment;\nimport com.cheng.weixin.rpc.comment.service.RpcCommentService;\nimport com.cheng.weixin.web.mobile.result.comment.ProductComment;\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Desc: 评论\n * Author: hp\n * Date: 2016/11/1\n */\n@Service(\"sysCommentService\")\npublic class SysCommentService {\n    @Autowired\n    private RpcCommentService commentService;\n\n    public Page<ProductComment> getCommentByProductId(int pageNum, int pageSize, String productId) {\n        PageHelper.startPage(pageNum, pageSize);\n        List<Comment> comments = commentService.getByProductId(productId);\n        List<ProductComment> productComments = new ArrayList<>();\n        for (Comment comment : comments) {\n            ProductComment productComment = new ProductComment();\n            productComment.setDate(\"\");\n            productComment.setAvatar(\"\");\n            productComment.setUsername(\"\");\n            productComment.setContent(comment.getContent());\n            productComment.setReply(\"\");\n            productComment.setLevel(\"\");\n            productComments.add(productComment);\n        }\n\n        PageInfo<ProductComment> pageInfo = new PageInfo<>(productComments);\n        Page<ProductComment> commentPage = new Page<>();\n        BeanUtils.copyProperties(commentPage, pageInfo);\n        commentPage.setList(productComments);\n        return commentPage;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/service/SysIndexService.java",
    "content": "package com.cheng.weixin.web.mobile.service;\n\nimport com.cheng.weixin.rpc.cart.service.RpcCartService;\nimport com.cheng.weixin.rpc.item.entity.Product;\nimport com.cheng.weixin.rpc.item.service.RpcProductService;\nimport com.cheng.weixin.rpc.system.entity.Ad;\nimport com.cheng.weixin.rpc.system.entity.Notice;\nimport com.cheng.weixin.rpc.system.service.RpcSystemService;\nimport com.cheng.weixin.web.mobile.exception.ProductException;\nimport com.cheng.weixin.web.mobile.exception.message.StatusCode;\nimport com.cheng.weixin.web.mobile.result.index.Index;\nimport com.cheng.weixin.web.mobile.result.index.IndexAd;\nimport com.cheng.weixin.web.mobile.result.index.IndexNotice;\nimport com.cheng.weixin.web.mobile.result.index.IndexProduct;\nimport com.cheng.weixin.web.mobile.security.LocalUser;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Desc:\n * Author: cheng\n * Date: 2016/6/28\n */\n@Service(\"sysIndexService\")\npublic class SysIndexService {\n    private final Logger logger = LoggerFactory.getLogger(getClass());\n    @Autowired\n    private RpcCartService cartService;\n    @Autowired\n    private RpcProductService productService;\n    @Autowired\n    private RpcSystemService systemService;\n\n    public Index getIndexInfo() {\n        // 图片\n        List<IndexAd> indexads = new ArrayList<>();\n        List<Ad> ads = systemService.getIndexAds();\n        for (Ad ad : ads) {\n            IndexAd indexAd = new IndexAd();\n            indexAd.setName(ad.getName());\n            indexAd.setPictureUrl(ad.getPictureUrl());\n            indexAd.setLinkUrl(ad.getLinkUrl());\n            indexAd.setHeight(ad.getHeight());\n            indexAd.setWidth(ad.getWidth());\n            indexads.add(indexAd);\n        }\n        // 通告\n        List<IndexNotice> indexNotices = new ArrayList<>();\n        List<Notice> notices = systemService.getIndexNotices();\n        for (Notice notice : notices) {\n            IndexNotice indexNotice = new IndexNotice();\n            indexNotice.setId(notice.getId());\n            indexNotice.setContent(notice.getContent());\n            indexNotice.setLinkUrl(notice.getLinkUrl());\n            indexNotices.add(indexNotice);\n        }\n        // 商品\n        List<IndexProduct> indexProducts = new ArrayList<>();\n        List<Product> products = productService.getIndex();\n        for (Product product : products) {\n            IndexProduct indexProduct = new IndexProduct();\n            indexProduct.setId(product.getId());\n            indexProduct.setName(product.getName());\n            indexProduct.setPrice(product.getSalePrice());\n            indexProduct.setPicLink(product.getDefaultPicture().getPictureUrl());\n            indexProduct.setHeight(product.getDefaultPicture().getHeight());\n            indexProduct.setWidth(product.getDefaultPicture().getWidth());\n            indexProduct.setTag(product.getTag());\n            indexProduct.setDesc(product.getUnitDesc());\n            indexProducts.add(indexProduct);\n        }\n\n        Index index = new Index();\n        index.setAds(indexads);\n        index.setNotices(indexNotices);\n        index.setProducts(indexProducts);\n\n        return index;\n    }\n\n    /**\n     * 购买商品\n     * @param productId\n     * @return\n     */\n    public long addProduct(String productId) {\n        Product product = productService.getById(productId);\n        if (product.getUnitsInStock()<=0) {\n            throw new ProductException(StatusCode.PRODUCT_STOCK_SHORTAGE);\n        }\n        long count = cartService.addProductCount(LocalUser.getUser().getUserId(), productId);\n        if (product.getUnitsInStock() < count) {\n            cartService.subProductCount(LocalUser.getUser().getUserId(), productId);\n            throw new ProductException(StatusCode.PRODUCT_STOCK_SHORTAGE);\n        }\n        return count;\n    }\n    /**\n     * 减少商品\n     * @param productId\n     * @return\n     */\n    public long subProduct(String productId) {\n        long count = cartService.subProductCount(LocalUser.getUser().getUserId(), productId);\n        return count;\n    }\n\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/service/SysLoginService.java",
    "content": "package com.cheng.weixin.web.mobile.service;\n\nimport com.cheng.weixin.common.utils.ServletUtils;\nimport com.cheng.weixin.common.utils.SystemUtils;\nimport com.cheng.weixin.rabbitmq.enums.MsgType;\nimport com.cheng.weixin.rabbitmq.model.SmsModel;\nimport com.cheng.weixin.rpc.message.entity.SmsHistory;\nimport com.cheng.weixin.rpc.message.service.RpcSmsService;\nimport com.cheng.weixin.rpc.rabbitmq.service.RpcRabbitSmsService;\nimport com.cheng.weixin.rpc.user.entity.Account;\nimport com.cheng.weixin.rpc.user.service.RpcUserService;\nimport com.cheng.weixin.web.mobile.exception.BusinessException;\nimport com.cheng.weixin.web.mobile.exception.LoginException;\nimport com.cheng.weixin.web.mobile.exception.UserException;\nimport com.cheng.weixin.web.mobile.exception.message.StatusCode;\nimport com.cheng.weixin.web.mobile.param.LoginDto;\nimport com.cheng.weixin.web.mobile.param.RegDto;\nimport com.cheng.weixin.web.mobile.security.TokenManager;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\n/**\n * Desc: 登录\n * Author: cheng\n * Date: 2016/7/8\n */\n@Service(\"sysLoginService\")\npublic class SysLoginService {\n\n    @Autowired\n    private RpcRabbitSmsService rabbitService;\n    @Autowired\n    private RpcSmsService smsService;\n    @Autowired\n    private RpcUserService userService;\n    @Autowired\n    private TokenManager tokenManager;\n\n    /**\n     * 发送验证码\n     * @param phone 登陆账号\n     */\n    public void sendRegMsgCode(String phone) {\n\n        if (checkAccountIsExistByLoginName(phone)) {\n            throw new UserException(StatusCode.USER_EXIST);\n        }\n\n        String userIp = SystemUtils.getRemoteAddr(ServletUtils.getRequest());\n        int countByDay = smsService.getCountByDay(phone);\n        if (countByDay >= 4) {\n            throw new BusinessException(\"当前手机号\"+phone+\"发送次数太多\");\n        }\n        int countByIp = smsService.getCountByIp(userIp);\n        if (countByIp >= 4) {\n            throw new BusinessException(\"当前IP\"+userIp+\"发送次数太多\");\n        }\n\n        SmsModel smsModel = new SmsModel();\n        smsModel.setUserIp(userIp);\n        smsModel.setPhone(phone);\n        rabbitService.sendValidate(smsModel);\n    }\n\n    /**\n     * 验证验证码\n     * @param phone\n     * @param code\n     */\n    public boolean checkCode(String phone, String code) {\n        SmsHistory smsHistory = smsService.getInfoByPhoneAndType(phone, MsgType.VALIDATE);\n        if (smsHistory == null) {\n            throw new LoginException(StatusCode.PHONE_NOT_EXIST);\n        }\n        return code.equals(smsHistory.getValidate());\n    }\n\n    /**\n     * 保存注册信息\n     * @param regDto\n     * @return\n     */\n    public String saveAccess(RegDto regDto) {\n        if (!checkCode(regDto.getPhone(), regDto.getValidate())) {\n            throw new LoginException(StatusCode.USER_VALIDATE_ERROR);\n        }\n        String userIp = SystemUtils.getRemoteAddr(ServletUtils.getRequest());\n        userService.saveAccess(regDto.getPhone(), regDto.getPassword(), regDto.getNickname(), userIp);\n        return tokenManager.createToken(regDto.getPhone());\n\n    }\n    /**\n     * 用户登录\n     * @param loginDto\n     */\n    public String login(LoginDto loginDto) {\n        String loginIp = SystemUtils.getRemoteAddr(ServletUtils.getRequest());\n        String result = userService.validateLogin(loginDto.getUsername(), loginDto.getPassword(), loginIp);\n        if (\"PASSWDFAIL\".equals(result) || \"NOTUSER\".equals(result)) {\n            throw new LoginException(StatusCode.LOGIN_FAIL);\n        }\n        return tokenManager.createToken(loginDto.getUsername());\n    }\n\n    /**\n     * 检查该用户是否存在\n     * @param LoginName 登录名\n     */\n    private boolean checkAccountIsExistByLoginName(String LoginName) {\n        Account account = userService.getAccountByLoginName(LoginName);\n        return null != account;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/service/SysOrderService.java",
    "content": "package com.cheng.weixin.web.mobile.service;\n\nimport com.cheng.weixin.common.model.Page;\nimport com.cheng.weixin.common.utils.StringFormat;\nimport com.cheng.weixin.common.utils.SystemUtils;\nimport com.cheng.weixin.rabbitmq.enums.MsgType;\nimport com.cheng.weixin.rabbitmq.model.SmsModel;\nimport com.cheng.weixin.rpc.cart.model.ProductModel;\nimport com.cheng.weixin.rpc.cart.service.RpcCartService;\nimport com.cheng.weixin.rpc.item.entity.Product;\nimport com.cheng.weixin.rpc.item.service.RpcProductService;\nimport com.cheng.weixin.rpc.order.entity.*;\nimport com.cheng.weixin.rpc.order.enumType.OrderStatus;\nimport com.cheng.weixin.rpc.order.enumType.OrderType;\nimport com.cheng.weixin.rpc.order.enumType.PayWay;\nimport com.cheng.weixin.rpc.order.service.RpcOrderService;\nimport com.cheng.weixin.rpc.promotion.entity.CouponCode;\nimport com.cheng.weixin.rpc.promotion.enums.CouponType;\nimport com.cheng.weixin.rpc.promotion.service.RpcCouponService;\nimport com.cheng.weixin.rpc.rabbitmq.service.RpcRabbitSmsService;\nimport com.cheng.weixin.rpc.user.entity.*;\nimport com.cheng.weixin.rpc.user.enumType.TXType;\nimport com.cheng.weixin.rpc.user.service.RpcUserService;\nimport com.cheng.weixin.web.mobile.exception.BusinessException;\nimport com.cheng.weixin.web.mobile.exception.OrderException;\nimport com.cheng.weixin.web.mobile.exception.message.StatusCode;\nimport com.cheng.weixin.web.mobile.param.PaymentDto;\nimport com.cheng.weixin.web.mobile.result.order.*;\nimport com.cheng.weixin.web.mobile.security.LocalUser;\nimport com.github.pagehelper.PageInfo;\nimport org.apache.commons.lang3.RandomStringUtils;\nimport org.joda.time.DateTime;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.lang.reflect.InvocationTargetException;\nimport java.math.BigDecimal;\nimport java.util.*;\n\n/**\n * Desc:\n * Author: 光灿\n * Date: 2016/9/14\n */\n@Service(\"sysOrderService\")\npublic class SysOrderService {\n    protected final Logger logger = LoggerFactory.getLogger(getClass());\n    @Autowired\n    private RpcUserService userService;\n    @Autowired\n    private RpcOrderService orderService;\n    @Autowired\n    private RpcCartService cartService;\n    @Autowired\n    private RpcProductService productService;\n    @Autowired\n    private RpcCouponService couponService;\n    @Autowired\n    private RpcRabbitSmsService rabbitService;\n\n    public SubmitOrderInfo payment(PaymentDto payment) {\n\n        SubmitOrderInfo submitOrder = new SubmitOrderInfo();\n        if (payment!=null && payment.getAddrId() != null && !\"\".equals(payment.getAddrId())) {\n            if (payment.getSince()) {\n                ArayacakAddress arayacakAddress = orderService.getArayacakAddressById(payment.getAddrId());\n                Member member = userService.getMemberByAccountId(LocalUser.getUser().getUserId());\n                submitOrder.setMobile(member.getMobile());\n                submitOrder.setAddress(arayacakAddress.getAddress());\n                submitOrder.setSince(true);\n            }else {\n                DeliveryAddress addr = userService.getDeliveryAddress(payment.getAddrId(), LocalUser.getUser().getUserId());\n                submitOrder.setConsignee(addr.getConsignee());\n                submitOrder.setMobile(addr.getMobile());\n                submitOrder.setAddress(addr.getAddress());\n                submitOrder.setSince(false);\n            }\n            submitOrder.setAddrId(payment.getAddrId());\n        }else {\n            DeliveryAddress addr = userService.getDefaultAddress(LocalUser.getUser().getUserId());\n            submitOrder.setConsignee(addr.getConsignee());\n            submitOrder.setMobile(addr.getMobile());\n            submitOrder.setAddress(addr.getAddress());\n            submitOrder.setAddrId(addr.getId());\n            submitOrder.setSince(false);\n        }\n\n        // 配送时间\n        List<DeliveryTime> times = orderService.getAllDeliveryTimes();\n        List<OrderDeliveryTime> orderDeliveryTimes = new ArrayList<>();\n        for (DeliveryTime deliveryTime : times) {\n            orderDeliveryTimes.add(new OrderDeliveryTime(deliveryTime.getId(), deliveryTime.getName()));\n        }\n        submitOrder.setDeliveryTimes(orderDeliveryTimes);\n\n        // 支付方式\n        List<Pay> pays = orderService.getAllPay();\n        List<OrderPay> orderPays = new ArrayList<>();\n        for (Pay pay : pays) {\n            if (pay.getRecommend()) {\n                submitOrder.setRecPay(new OrderPay(pay.getId(), pay.getName(), pay.getIcon()));\n            }else {\n                orderPays.add(new OrderPay(pay.getId(), pay.getName(), pay.getIcon()));\n            }\n        }\n        submitOrder.setPays(orderPays);\n\n        // 余额\n        Account account = userService.getAccount(LocalUser.getUser().getUserId());\n        submitOrder.setAvailableBalance(StringFormat.format(account.getBalance()));\n\n        // 商品详情\n        int totalProductNums = 0;\n        BigDecimal totalProductPrice = BigDecimal.ZERO;\n        Set<String> productIds = cartService.getChooseProductIds(LocalUser.getUser().getUserId());\n        List<String> productImgs = new ArrayList<>(productIds.size());\n        for (String productId : productIds) {\n            Product product = productService.getDefaultPictureById(productId);\n            if (product.getUnitsInStock() > 0) {\n                Long productNums = cartService.getCounts(LocalUser.getUser().getUserId(), productId);\n                totalProductNums += productNums;\n                totalProductPrice = totalProductPrice.add(product.getSalePrice().multiply(BigDecimal.valueOf(productNums)));\n                productImgs.add(product.getDefaultPicture().getPictureUrl());\n            }\n        }\n        submitOrder.setTotalProductNums(totalProductNums);\n        submitOrder.setProductImgs(productImgs);\n        submitOrder.setTotalProductPrice(StringFormat.format(totalProductPrice));\n\n        // 优惠券\n        List<CouponCode> couponCodes = couponService.getCouponCodeByUser(LocalUser.getUser().getUserId());\n        int availableCoupon = 0;\n        for (CouponCode code : couponCodes) {\n            // 只有红包券才是满减券\n            if (CouponType.LUCKYMONEY.equals(code.getCoupon().getType())) {\n                if (totalProductPrice.compareTo(code.getCoupon().getEnoughMoney()) == 0\n                        || totalProductPrice.compareTo(code.getCoupon().getEnoughMoney()) == 1) {\n                    availableCoupon += 1;\n                }\n            }/* else {\n                // 是否包含该商品ID\n                if (code.getCoupon().getIncludeGroup()!=null && !\"\".equals(code.getCoupon().getIncludeGroup())) {\n                    List<String> includeIds = Arrays.asList(StringUtils.split(code.getCoupon().getIncludeGroup(), \",\"));\n                    for (String id : productIds) {\n                        if (includeIds.contains(id)) {\n                            availableCoupon += 1;\n                        }\n                    }\n                }\n                boolean notContain = true;\n                if (code.getCoupon().getExcludeGroup()!=null && !\"\".equals(code.getCoupon().getExcludeGroup())) {\n                    List<String> notIncludeIds = Arrays.asList(code.getCoupon().getExcludeGroup().split(\",\"));\n                    for (String id : productIds) {\n                        if (notIncludeIds.contains(id)) {\n                            notContain = false;\n                        }\n                    }\n                }\n                if (notContain) {\n                    availableCoupon += 1;\n                }\n            }*/\n        }\n        submitOrder.setAvailableCoupon(availableCoupon);\n\n        // 运费\n        BigDecimal freight = BigDecimal.valueOf(2.00);\n        if (totalProductPrice.compareTo(BigDecimal.valueOf(5))==0 || totalProductPrice.compareTo(BigDecimal.valueOf(5))==1) {\n            freight = BigDecimal.ZERO;\n        }\n        submitOrder.setFreight(StringFormat.format(freight));\n\n        // 优惠券\n        BigDecimal couponAmount = BigDecimal.ZERO;\n        if (payment != null && payment.getTicketId() !=null && !\"\".equals(payment.getTicketId())) {\n            CouponCode couponCode;\n            try {\n                couponCode = couponService.getCouponById(payment.getTicketId());\n            }catch (Exception e) {\n                logger.error(\"优惠券不正确\");\n                throw new OrderException(StatusCode.COUPON_EXCEPTION);\n            }\n            couponAmount = couponCode.getCoupon().getFaceValue();\n        }\n        submitOrder.setCouponAmount(StringFormat.format(couponAmount));\n\n        // 总得价格\n        submitOrder.setTotalPrice(StringFormat.format(totalProductPrice.add(freight).subtract(couponAmount)));\n        return submitOrder;\n    }\n\n    /** 购买商品列表 **/\n    public List<ProductList> getProductList() {\n        List<ProductModel> productModels = cartService.getChooseProductInfo(LocalUser.getUser().getUserId());\n        List<ProductList> productLists = new ArrayList<>();\n        for (ProductModel model : productModels) {\n            ProductList productList = new ProductList();\n            Product product = productService.getDefaultPictureById(model.getId());\n            productList.setName(product.getName());\n            productList.setImgUrl(product.getDefaultPicture().getPictureUrl());\n            productList.setCount(model.getCount());\n            productList.setDesc(product.getUnitDesc());\n            productList.setSellPrice(StringFormat.format(product.getSalePrice()));\n            productLists.add(productList);\n        }\n        return productLists;\n    }\n\n    // 各自在各自Service生成\n    public BuyInfo buy(PaymentDto payment, HttpServletRequest request) {\n        // 商品总金额\n        BigDecimal totalProductPrice = BigDecimal.ZERO;\n        List<ProductModel> productModels = cartService.getChooseProductInfo(LocalUser.getUser().getUserId());\n        for (int i=0; i<productModels.size(); i++) {\n            Product product = productService.getById(productModels.get(i).getId());\n            int counts = productModels.get(i).getCount();\n            totalProductPrice = totalProductPrice.add(product.getSalePrice().multiply(BigDecimal.valueOf(counts)));\n            productService.updateStockById(product.getId(), product.getUnitsInStock()-counts, false);\n        }\n\n        // 生成订单号\n        OrderInfo order = new OrderInfo();\n        String oid = RandomStringUtils.randomNumeric(8); //TODO\n        order.setOid(oid);\n        order.setAccountId(LocalUser.getUser().getUserId());\n\n        // 配送地址\n        if (payment!=null && payment.getAddrId() != null && !\"\".equals(payment.getAddrId())) {\n            if (payment.getSince()) {\n                ArayacakAddress arayacakAddress = orderService.getArayacakAddressById(payment.getAddrId());\n                Member member = userService.getMemberByAccountId(LocalUser.getUser().getUserId());\n                order.setMobile(member.getMobile());\n                order.setAddress(arayacakAddress.getAddress());\n                order.setSince(true);\n            }else {\n                DeliveryAddress addr = userService.getDeliveryAddress(payment.getAddrId(), LocalUser.getUser().getUserId());\n                order.setMobile(addr.getMobile());\n                order.setVillage(addr.getVillageId()); // TODO 改成名字\n                order.setAddress(addr.getAddress());\n                order.setPostCode(addr.getPostCode());\n                order.setTelephone(addr.getTelephone());\n                order.setEmail(addr.getEmail());\n                order.setSince(false);\n            }\n        }else {\n            DeliveryAddress addr = userService.getDefaultAddress(LocalUser.getUser().getUserId());\n            order.setConsignee(addr.getConsignee());\n            order.setMobile(addr.getMobile());\n            order.setVillage(addr.getVillageId());\n            order.setAddress(addr.getAddress());\n            order.setPostCode(addr.getPostCode());\n            order.setTelephone(addr.getTelephone());\n            order.setEmail(addr.getEmail());\n            order.setSince(false);\n        }\n\n        // 支付工具\n        String payId;\n        if (payment !=null && payment.getPayId()!=null && !\"\".equals(payment.getPayId())) {\n            payId = payment.getPayId();\n        }else {\n            Pay pay = orderService.getRecommendPay();\n            payId = pay.getId();\n        }\n        Pay pay = orderService.getPay(payId);\n        order.setPayWay(pay.getPayWay());\n        List<FlowStatus> statuses = null;\n        if (PayWay.ONLINE.equals(pay.getPayWay())) {\n            order.setOrderStatus(OrderStatus.WAIT_PAY);\n            statuses = orderService.getFlowStatusesByPayWay(PayWay.ONLINE);\n        } else if (PayWay.OFFLINE.equals(pay.getPayWay())) {\n            order.setOrderStatus(OrderStatus.ONGOING);\n            statuses = orderService.getFlowStatusesByPayWay(PayWay.OFFLINE);\n        }\n        order.setFlowStatus(statuses.get(0).getId());\n\n        // 送货时间\n        DeliveryTime time = orderService.getDeliveryTime(payment.getTimeId());\n        order.setDeliveryTime(time.getName());\n        order.setPay(pay.getName());\n        order.setOrderType(OrderType.NORMAL);\n\n        // 计算运费\n        order.setFreightPayable(BigDecimal.valueOf(2L)); // 应付运费 // TODO 应从库里取\n        if (totalProductPrice.compareTo(BigDecimal.valueOf(5L))==1\n                || totalProductPrice.compareTo(BigDecimal.valueOf(5L)) == 0) { // TODO 应从库里取\n            order.setFreightReduce(BigDecimal.valueOf(2L));\n        } else {\n            order.setFreightReduce(BigDecimal.ZERO);\n        }\n        order.setProductTotalPrice(totalProductPrice); // 商品总金额\n        order.setDiscount(BigDecimal.ZERO); // 优惠金额\n\n        // 券优惠\n        BigDecimal couponReducePrice = BigDecimal.ZERO;\n        if (payment.getTicketId()!=null && !\"\".equals(payment.getTicketId())) {\n            CouponCode couponCode;\n            try {\n                couponCode = couponService.getCouponById(payment.getTicketId());\n            }catch (Exception e) {\n                logger.error(\"优惠券不正确\");\n                throw new OrderException(StatusCode.COUPON_EXCEPTION);\n            }\n            couponReducePrice = couponCode.getCoupon().getFaceValue();\n            order.setCouponCode(couponCode.getCode());\n\n            // 优惠券记录\n            CouponRecord couponRecord = new CouponRecord();\n            couponRecord.setAccountId(LocalUser.getUser().getUserId());\n            couponRecord.setCouponCodeId(couponCode.getId());\n            couponRecord.setTxType(\"支出\");\n            couponRecord.setTxResult(\"消费一张优惠券金额为\"+ StringFormat.format(couponCode.getCoupon().getFaceValue()));\n            userService.addCouponRecord(couponRecord);\n            couponService.updateCouponUsedById(couponCode.getId());\n\n            // TODO 去删除该优惠券\n        }\n        order.setCouponReducePrice(couponReducePrice);\n        order.setBonusPointReducePrice(BigDecimal.ZERO); // 积分优惠 //TODO 积分等级优惠政策\n\n        // 应付金额 = 商品总金额 + 应付运费 - 运费优惠 - 优惠金额 - 券优惠 - 积分优惠\n        order.setAmountPayable(totalProductPrice.add(order.getFreightPayable()).subtract(order.getFreightReduce())\n                .subtract(order.getDiscount()).subtract(order.getCouponReducePrice()).subtract(order.getBonusPointReducePrice()));\n\n        // 积分金额 = 商品总金额 - 优惠金额 - 券优惠 - 积分优惠\n        BigDecimal pointAmount = totalProductPrice.subtract(order.getDiscount())\n                .subtract(order.getCouponReducePrice()).subtract(order.getBonusPointReducePrice());\n        int bonusPoints = pointAmount.multiply(BigDecimal.TEN).intValue(); // 1毛=1积分\n\n        // 账户更新\n        Account account = userService.getAccount(LocalUser.getUser().getUserId());\n\n        // 是否是用余额支付\n        if(payment.getBalance()) {\n            BigDecimal balance = null;\n            BigDecimal totalPrice = totalProductPrice.add(order.getFreightPayable()).subtract(order.getFreightReduce());\n            if (account.getBalance().compareTo(totalPrice) == 1 || account.getBalance().compareTo(totalPrice) == 0) {\n                balance = account.getBalance().subtract(totalPrice);\n                order.setBalanceOffset(totalPrice);\n                // 线上支付 如果全部用余额支付的则状态改为进行中，物流状态改为已付款\n                if (PayWay.ONLINE.equals(pay.getPayWay())) {\n                    order.setOrderStatus(OrderStatus.ONGOING);\n                    statuses = orderService.getFlowStatusesByPayWay(PayWay.ONLINE);\n                    order.setFlowStatus(order.getFlowStatus()+\"-\"+statuses.get(0).getNextStatusId());\n                }\n                //else if (PayWay.OFFLINE.equals(pay.getPayWay())) {}\n            }else if (account.getBalance().compareTo(totalPrice) == -1) {\n                order.setBalanceOffset(account.getBalance());\n                balance = BigDecimal.ZERO;\n            }\n            account.setBalance(balance);\n        }\n\n        // 积分信息更新\n        account.setBonusPointUsable(account.getBonusPointUsable()+bonusPoints);\n        if (account.getBonusPointUpgrade()-bonusPoints > 0) {\n            account.setBonusPointUpgrade(account.getBonusPointUpgrade()-bonusPoints);\n        }else {\n            AccountLevel level = userService.getAccountLevelById(account.getAccountLevelId());\n            AccountLevel accountLevel = userService.getAccountLevelByLevel(level.getLevel()+1); // 升一级\n            int residuePoint = Math.abs(account.getBonusPointUpgrade() - bonusPoints);\n            account.setBonusPointUpgrade(accountLevel.getNextLevelNeedPoint() - residuePoint);\n            account.setAccountLevelId(accountLevel.getId());\n        }\n        userService.updateAccount(account);\n\n        BigDecimal amountPaid = BigDecimal.ZERO;\n        if (payment.getBalance()) { // 是否是用余额支付\n            amountPaid = order.getBalanceOffset();\n        }\n        order.setAmountPaid(amountPaid);\n\n        // 余额没抵扣完的 走到等待用户支付页面\n        boolean isPay = false;\n        BigDecimal surplusAmount = order.getAmountPayable().subtract(order.getAmountPaid()); // 余额抵扣完还需支付的金额\n        if (surplusAmount.compareTo(BigDecimal.ZERO) == 1) {\n            if (PayWay.ONLINE.equals(pay.getPayWay())) {\n                isPay = true;\n            }\n        }\n\n        order.setRemarkCustomer(payment.getRemark());\n        order.setIp(SystemUtils.getRemoteAddr(request));\n        order.setPayTime(new Date());\n        order.setFreeAccountLevel(Boolean.FALSE);\n        OrderInfo info = orderService.addOrder(order);\n\n        // 该订单下的详细商品信息\n        for (ProductModel productModel : productModels) {\n            Product product = productService.getById(productModel.getId());\n            OrderProductDetail detail = new OrderProductDetail();\n            detail.setOrderInfoId(info.getId());\n            detail.setOid(info.getOid());\n            detail.setName(product.getName());\n            detail.setQuantity(productModel.getCount());\n            detail.setSubtotal(product.getSalePrice().multiply(BigDecimal.valueOf(productModel.getCount())));\n            detail.setMarketPrice(product.getMarketPrice());\n            detail.setSalePrice(product.getSalePrice());\n            detail.setDealPrice(product.getSalePrice());\n            detail.setDiscountRate(1D);\n            detail.setComment(false);\n            detail.setGift(false);\n            orderService.addOrderDetail(detail);\n        }\n        cartService.deletedChooseProduct(LocalUser.getUser().getUserId());\n\n        // 积分记录\n        BonusPointRecord bonusPoint = userService.getBonusPointRecord(LocalUser.getUser().getUserId());\n        BonusPointRecord bonusPointRecord = new BonusPointRecord();\n        bonusPointRecord.setAccountId(LocalUser.getUser().getUserId());\n        bonusPointRecord.setTxBonusPoints(bonusPoints);\n        bonusPointRecord.setFrozenBonusPoints(bonusPoints);\n        if (bonusPoint != null) {\n            bonusPointRecord.setBeforeBonusPoints(bonusPoint.getAfterBonusPoints());\n            bonusPointRecord.setAfterBonusPoints(bonusPoint.getAfterBonusPoints()+bonusPoints);\n        }else {\n            bonusPointRecord.setBeforeBonusPoints(0);\n            bonusPointRecord.setAfterBonusPoints(bonusPoints);\n        }\n        bonusPointRecord.setTxResult(\"下单获取\"+bonusPoints+\"积分\");\n        bonusPointRecord.setTxType(TXType.EARNING);\n        userService.addBonusPointRecord(bonusPointRecord);\n\n        // 现金记录\n        if (payment.getBalance()) {\n            CashRecord cash = userService.getNewCashRecord(LocalUser.getUser().getUserId());\n            if (cash == null) {\n                throw new BusinessException(\"请先充值\");\n            }\n\n            CashRecord cashRecord = new CashRecord();\n            cashRecord.setAccountId(LocalUser.getUser().getUserId());\n            cashRecord.setTxMoney(order.getBalanceOffset());\n            cashRecord.setBeforeMoney(cash.getAfterBonusPoints());\n            BigDecimal afterBonusPoints = cash.getAfterBonusPoints().subtract(order.getBalanceOffset());\n            if (afterBonusPoints.compareTo(BigDecimal.valueOf(-1L)) == -1) {\n                throw new BusinessException(\"余额不足\");\n            }\n            cashRecord.setAfterBonusPoints(afterBonusPoints);\n            cashRecord.setTxType(TXType.EXPENSE);\n            cashRecord.setTxResult(\"下单花费\"+StringFormat.format(order.getBalanceOffset())+\"元\");\n            userService.addCashRecord(cashRecord);\n\n            // 短信通知用户\n            SmsModel smsModel = new SmsModel(); // TODO 加上和优惠券的一起通知\n            smsModel.setUserIp(SystemUtils.getRemoteAddr(request));\n            smsModel.setPhone(account.getUsername());\n            smsModel.setContent(StringFormat.format(order.getBalanceOffset()));\n            smsModel.setDate(new Date());\n            smsModel.setType(MsgType.NOTICE_CASH_COMSUME);\n            rabbitService.sendCashNotify(smsModel);\n        }\n        BuyInfo buyInfo = new BuyInfo();\n        buyInfo.setOrderNum(oid);\n        buyInfo.setDeliveryDate(order.getDeliveryTime());\n        buyInfo.setSurplusAmount(StringFormat.format(surplusAmount));\n        buyInfo.setPay(isPay);\n        buyInfo.setPayName(pay.getName());\n        buyInfo.setOffline(PayWay.OFFLINE.equals(pay.getPayWay()));\n        return buyInfo;\n    }\n\n    public Page<OrderList> getOrders(int pageNum, int pageSize) throws InvocationTargetException, IllegalAccessException {\n        PageInfo<OrderInfo> orderInfos = orderService.getOrderInfos(LocalUser.getUser().getUserId(), pageNum, pageSize);\n        List<OrderList> orders = new ArrayList<>();\n        for (OrderInfo order : orderInfos.getList()) {\n            OrderList orderList = new OrderList();\n            orderList.setId(order.getId());\n            orderList.setDate(new DateTime(order.getCreateDate()).toString(\"yyyy-dd-MM HH:mm:ss\"));\n            orderList.setOrderNum(order.getOid());\n            orderList.setNumber(order.getOrderDetails().size()+\"\");\n            orderList.setTotalPrice(StringFormat.format(order.getAmountPayable()));\n\n            if (OrderStatus.WAIT_PAY.equals(order.getOrderStatus())) {\n                orderList.setOrderStatus(OrderStatus.WAIT_PAY.name());\n            }else if (OrderStatus.PAY_OUT_TIME.equals(order.getOrderStatus())) {\n                orderList.setOrderStatus(OrderStatus.INVALID.name());\n            }else if (OrderStatus.REFUNDED.equals(order.getOrderStatus())\n                    || OrderStatus.CANCELED.equals(order.getOrderStatus())\n                    || OrderStatus.UNFINISHED.equals(order.getOrderStatus())\n                    || OrderStatus.COMMENT.equals(order.getOrderStatus())) {\n                orderList.setOrderStatus(OrderStatus.COMMENT.name());\n            }else if (OrderStatus.ONGOING.equals(order.getOrderStatus())\n                    || OrderStatus.WAIT_REFUND.equals(order.getOrderStatus())){\n                orderList.setOrderStatus(OrderStatus.ONGOING.name());\n            }else {\n                orderList.setOrderStatus(OrderStatus.FINISHED.name());\n            }\n\n            // 进行中的订单才会有下面的流程\n            List<Status> statuses = new ArrayList<>();\n            if (OrderStatus.WAIT_PAY.equals(order.getOrderStatus())\n                    ||OrderStatus.ONGOING.equals(order.getOrderStatus())) {\n                List<FlowStatus> flowStatuses = orderService.getFlowStatusesByPayWay(order.getPayWay());\n                String[] activeStatuses = order.getFlowStatus().split(\"-\");\n                for (FlowStatus flowStatus : flowStatuses) {\n                    boolean flag = false;\n                    for (String statusId : activeStatuses) {\n                        if (statusId.equals(flowStatus.getId())) {\n                            statuses.add(new Status(flowStatus.getName(), true));\n                            flag = true;\n                        }\n                    }\n                    if (!flag)\n                        statuses.add(new Status(flowStatus.getName(), false));\n                }\n            }else {\n                String[] activeStatuses = order.getFlowStatus().split(\"-\");\n                for (String statusId : activeStatuses) {\n                    FlowStatus flowStatus = orderService.getFlowStatusesById(statusId);\n                    statuses.add(new Status(flowStatus.getName(), true));\n                }\n            }\n            orderList.setStatuses(statuses);\n            orders.add(orderList);\n        }\n        Page<OrderList> orderInfoPage = new Page<>();\n        BeanUtils.copyProperties(orderInfos, orderInfoPage);\n        orderInfoPage.setList(orders);\n        return orderInfoPage;\n    }\n\n    public Detail getOrderDetail() {\n        Detail detail = new Detail();\n        OrderInfo orderInfo = orderService.getOrderDetail(\"1700b55803cc44dfa08bac0028bee46f\");\n        detail.setId(orderInfo.getId());\n        String[] flowStatus = orderInfo.getFlowStatus().split(\"-\");\n        detail.setStatus(flowStatus[flowStatus.length-1]);\n        detail.setOid(orderInfo.getOid());\n        detail.setConsignee(orderInfo.getConsignee());\n        detail.setAddress(orderInfo.getAddress());\n\n        Pay pay = orderService.getPay(orderInfo.getPay());\n\n        detail.setPayWay(pay.getName());\n        detail.setProductTotalPrice(StringFormat.format(orderInfo.getProductTotalPrice()));\n        detail.setFreightPayable(StringFormat.format(orderInfo.getFreightPayable()));\n        detail.setCouponReducePrice(StringFormat.format(orderInfo.getCouponReducePrice()));\n        detail.setBalanceOffset(StringFormat.format(orderInfo.getBalanceOffset()));\n        detail.setTotalPrice(StringFormat.format(orderInfo.getAmountPayable()));\n        detail.setOrderStatus(orderInfo.getOrderStatus().name());\n        return detail;\n    }\n\n    public List<ArayacakTownAddr> getAllTownArayacakAddr(String countryId) {\n        List<ArayacakAddress> countyAddrs = orderService.getArayacakAddr(countryId, null);\n\n        Set<String> townIds = new HashSet<>();\n        for (ArayacakAddress addr : countyAddrs) {\n            townIds.add(addr.getTown());\n        }\n        List<ArayacakTownAddr> townAddrs = new ArrayList<>();\n        for (String townId: townIds) {\n            Town town = orderService.getTownById(townId);\n            townAddrs.add(new ArayacakTownAddr(townId, town.getName()));\n        }\n        return townAddrs;\n    }\n\n    public List<ArayacakVillageAddr> getAllVillageArayacakAddr(String townId) {\n        List<ArayacakAddress> villageAllAddrs = orderService.getArayacakAddr(null, townId);\n        List<ArayacakVillageAddr> villageAddrs = new ArrayList<>();\n        for (ArayacakAddress addr: villageAllAddrs) {\n            villageAddrs.add(new ArayacakVillageAddr(addr.getId(), addr.getAddress(), \"3.2\"));\n        }\n        return villageAddrs;\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/service/SysProductService.java",
    "content": "package com.cheng.weixin.web.mobile.service;\n\nimport com.cheng.weixin.common.utils.StringFormat;\nimport com.cheng.weixin.common.utils.StringUtils;\nimport com.cheng.weixin.rpc.cart.service.RpcCartService;\nimport com.cheng.weixin.rpc.comment.entity.Comment;\nimport com.cheng.weixin.rpc.comment.service.RpcCommentService;\nimport com.cheng.weixin.rpc.item.entity.Picture;\nimport com.cheng.weixin.rpc.item.entity.Product;\nimport com.cheng.weixin.rpc.item.service.RpcProductService;\nimport com.cheng.weixin.rpc.user.entity.Account;\nimport com.cheng.weixin.rpc.user.service.RpcUserService;\nimport com.cheng.weixin.web.mobile.exception.ProductException;\nimport com.cheng.weixin.web.mobile.exception.message.StatusCode;\nimport com.cheng.weixin.web.mobile.param.ProductDto;\nimport com.cheng.weixin.web.mobile.result.comment.ProductComment;\nimport com.cheng.weixin.web.mobile.result.product.ProductDetail;\nimport com.cheng.weixin.web.mobile.result.product.ProductPic;\nimport com.cheng.weixin.web.mobile.security.LocalUser;\nimport org.joda.time.DateTime;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.math.BigDecimal;\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Desc:\n * Author: hp\n * Date: 2016/10/8\n */\n@Service\npublic class SysProductService {\n\n    protected final Logger logger = LoggerFactory.getLogger(getClass());\n\n    @Autowired\n    private RpcProductService productService;\n    @Autowired\n    private RpcCommentService commentService;\n    @Autowired\n    private RpcUserService userService;\n    @Autowired\n    private RpcCartService cartService;\n    /**\n     * 详情页\n     * @param productId\n     * @return\n     */\n    public ProductDetail getDetail(String productId) {\n        Product product = productService.getById(productId);\n        List<Picture> pictures = productService.getShowPictureByProductId(productId);\n        boolean isFocus = false;\n        if (LocalUser.getUser()!=null) {\n            isFocus = userService.isProductFocus(LocalUser.getUser().getUserId(), productId);\n        }\n\n        ProductDetail detail = new ProductDetail();\n        detail.setProductId(product.getId());\n        detail.setName(product.getName());\n        detail.setDesc(product.getUnitDesc());\n        detail.setSellNum(99);\n        detail.setGood(100);\n        detail.setSellPrice(StringFormat.format(product.getSalePrice()));\n        detail.setMarketPrice(StringFormat.format(product.getMarketPrice()));\n        detail.setGiveAway(product.getGiveAway());\n        detail.setFocus(isFocus);\n        if (LocalUser.getUser()!=null && cartService.exists(LocalUser.getUser().getUserId(), productId)) {\n            Long count = cartService.getCounts(LocalUser.getUser().getUserId(), productId);\n            detail.setCount(count+\"\");\n            BigDecimal totalPrice = BigDecimal.valueOf(count).multiply(product.getSalePrice());\n            detail.setTotalPrice(StringFormat.format(totalPrice));\n        }else {\n            detail.setCount(\"1\");\n            detail.setTotalPrice(StringFormat.format(product.getSalePrice()));\n        }\n        List<ProductPic> pics = new ArrayList<>();\n        for (Picture picture : pictures) {\n            pics.add(new ProductPic(picture.getPictureUrl(), picture.getWidth(), picture.getHeight()));\n        }\n        detail.setPicList(pics);\n\n        List<Comment> commentes = commentService.getByProductId(productId);\n        List<ProductComment> productComments = new ArrayList<>();\n        for (Comment comment : commentes) {\n            Account account = userService.getAccountById(comment.getAccountId());\n            ProductComment productComment = new ProductComment();\n            productComment.setUsername(StringUtils.hidePhone(account.getUsername()));\n            productComment.setAvatar(account.getAvatar());\n            productComment.setLevel(\"1\");// TODO 等级\n            productComment.setDate(new DateTime(comment.getCreateDate()).toString(\"yyyy-dd-MM HH:mm:ss\"));\n            productComment.setContent(comment.getContent());\n            productComment.setReply(\"回复\");\n            productComments.add(productComment);\n        }\n        detail.setComments(productComments);\n        return detail;\n    }\n\n    public void buyProduct(String productId, Long count) {\n        Product product = productService.getById(productId);\n        if (product.getUnitsInStock() < count) {\n            throw new ProductException(StatusCode.PRODUCT_STOCK_SHORTAGE);\n        }\n        cartService.addProduct(LocalUser.getUser().getUserId(), productId, count);\n    }\n\n    public boolean focus(String productId) {\n        boolean isFocus = userService.isProductFocus(LocalUser.getUser().getUserId(), productId);\n        if (isFocus) {\n            userService.deleteProductFocus(LocalUser.getUser().getUserId(), productId);\n        }else {\n            userService.addProductFocus(LocalUser.getUser().getUserId(), productId);\n        }\n        return !isFocus;\n    }\n\n    public void chackStock(String productId) {\n        Product product = productService.getById(productId);\n        if (product.getUnitsInStock()<=0) {\n            throw new ProductException(StatusCode.PRODUCT_STOCK_SHORTAGE);\n        }\n    }\n\n    public void batchAdd(List<ProductDto> products) {\n        for (ProductDto productDto : products) {\n            buyProduct(productDto.getProductId(), productDto.getCount());\n        }\n    }\n\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/service/SysPromotionService.java",
    "content": "package com.cheng.weixin.web.mobile.service;\n\nimport com.cheng.weixin.common.utils.StringFormat;\nimport com.cheng.weixin.rpc.cart.service.RpcCartService;\nimport com.cheng.weixin.rpc.item.entity.Product;\nimport com.cheng.weixin.rpc.item.service.RpcProductService;\nimport com.cheng.weixin.rpc.promotion.entity.CouponCode;\nimport com.cheng.weixin.rpc.promotion.enums.CouponType;\nimport com.cheng.weixin.rpc.promotion.service.RpcCouponService;\nimport com.cheng.weixin.web.mobile.result.Promotion.CouponDto;\nimport com.cheng.weixin.web.mobile.security.LocalUser;\nimport org.joda.time.DateTime;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.math.BigDecimal;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * Desc:\n * Author: hp\n * Date: 2016/11/7\n */\n@Service(\"sysPromotion\")\npublic class SysPromotionService {\n    protected final Logger logger = LoggerFactory.getLogger(getClass());\n    @Autowired\n    private RpcCouponService couponService;\n    @Autowired\n    private RpcCartService cartService;\n    @Autowired\n    private RpcProductService productService;\n\n    public List<CouponDto> getCouponByUser() {\n        List<CouponCode> couponCodes = couponService.getCouponCodeByUser(\"1\");\n        List<CouponDto> coupons = new ArrayList<>();\n        for (CouponCode code : couponCodes) {\n            CouponDto coupon = new CouponDto();\n            coupon.setTitle(code.getCoupon().getName());\n            coupon.setFaceValue(StringFormat.format(code.getCoupon().getFaceValue()));\n            coupon.setEnoughMoney(StringFormat.format(code.getCoupon().getEnoughMoney()));\n            coupon.setBeginTime(new DateTime(code.getCoupon().getBeginTime()).toString(\"yyyy-MM-dd HH:MM:ss\"));\n            coupon.setEndTime(new DateTime(code.getCoupon().getEndTime()).toString(\"yyyy-MM-dd HH:MM:ss\"));\n            coupons.add(coupon);\n        }\n        return coupons;\n    }\n\n    public List<CouponDto> getUsableCouponAtOrderByUser() {\n        List<CouponCode> couponCodes = couponService.getCouponCodeByUser(LocalUser.getUser().getUserId());\n        BigDecimal productTotalPrice = BigDecimal.ZERO;\n        Set<String> productIds = cartService.getChooseProductIds(LocalUser.getUser().getUserId());\n        for (String productId : productIds) {\n            Product product = productService.getById(productId);\n            if (product.getUnitsInStock() > 0) {\n                Long count = cartService.getCounts(\"1\", productId);\n                productTotalPrice = productTotalPrice.add(product.getSalePrice().multiply(new BigDecimal(count)));\n            }\n        }\n\n        List<CouponDto> coupons = new ArrayList<>();\n        for (CouponCode code : couponCodes) {\n            boolean flag = false;\n            // 只有红包券才是满减券 || 暂时只有满减券\n            if (CouponType.LUCKYMONEY.equals(code.getCoupon().getType())) {\n                boolean productPrice = productTotalPrice.compareTo(code.getCoupon().getEnoughMoney()) == 0\n                        || productTotalPrice.compareTo(code.getCoupon().getEnoughMoney()) == 1;\n                flag = productPrice;\n            } /*else {\n                // 是否包含该商品ID\n                if (code.getCoupon().getIncludeGroup()!=null && !\"\".equals(code.getCoupon().getIncludeGroup())) {\n                    boolean contain = true;\n                    List<String> includeIds = Arrays.asList(StringUtils.split(code.getCoupon().getIncludeGroup(), \",\"));\n                    for (String id : productIds) {\n                        if (!includeIds.contains(id)) {\n                            contain = false;\n                            break;\n                        }\n                    }\n                    flag = contain;\n                }\n                if (code.getCoupon().getExcludeGroup()!=null && !\"\".equals(code.getCoupon().getExcludeGroup())) {\n                    boolean notContain = true;\n                    List<String> notIncludeIds = Arrays.asList(code.getCoupon().getExcludeGroup().split(\",\"));\n                    for (String id : productIds) {\n                        if (notIncludeIds.contains(id)) {\n                            notContain = false;\n                        }\n                    }\n                    flag = flag || notContain;\n                }\n            }*/\n\n            CouponDto coupon = new CouponDto();\n            coupon.setCouponId(code.getId());\n            coupon.setTitle(code.getCoupon().getName());\n            coupon.setFaceValue(StringFormat.format(code.getCoupon().getFaceValue()));\n            coupon.setEnoughMoney(StringFormat.format(code.getCoupon().getEnoughMoney()));\n            coupon.setBeginTime(new DateTime(code.getCoupon().getBeginTime()).toString(\"yyyy-MM-dd HH:MM:ss\"));\n            coupon.setEndTime(new DateTime(code.getCoupon().getEndTime()).toString(\"yyyy-MM-dd HH:MM:ss\"));\n            coupon.setUsable(flag);\n            coupons.add(coupon);\n        }\n        return coupons;\n    }\n\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/service/SysUserService.java",
    "content": "package com.cheng.weixin.web.mobile.service;\n\nimport com.cheng.weixin.common.utils.StringFormat;\nimport com.cheng.weixin.rpc.promotion.entity.CouponCode;\nimport com.cheng.weixin.rpc.promotion.service.RpcCouponService;\nimport com.cheng.weixin.rpc.user.entity.Account;\nimport com.cheng.weixin.rpc.user.entity.AccountLevel;\nimport com.cheng.weixin.rpc.user.entity.BonusPointRecord;\nimport com.cheng.weixin.rpc.user.entity.DeliveryAddress;\nimport com.cheng.weixin.rpc.user.service.RpcUserService;\nimport com.cheng.weixin.web.mobile.result.user.DeliveryAddr;\nimport com.cheng.weixin.web.mobile.result.user.UserDetail;\nimport com.cheng.weixin.web.mobile.security.LocalUser;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Desc: 用户\n * Author: hp\n * Date: 2016/9/30\n */\n@Service\npublic class SysUserService {\n    @Autowired\n    private RpcUserService userService;\n    @Autowired\n    private RpcCouponService couponService;\n\n    public UserDetail getUserDetail() {\n        UserDetail userDetail = new UserDetail();\n        Account account = userService.getAccount(LocalUser.getUser().getUserId());\n        userDetail.setId(account.getId());\n        userDetail.setNickname(account.getNickname());\n        AccountLevel accountLevel = userService.getAccountLevelById(account.getAccountLevelId());\n        userDetail.setAccountLevel(accountLevel.getLevel());\n        userDetail.setBalance(StringFormat.format(account.getBalance()));\n        userDetail.setBonusPointRecord(account.getBonusPointUsable());\n        userDetail.setAvatar(account.getAvatar());\n        userDetail.setUsername(account.getUsername());\n        userDetail.setBonusPointUpgrade(account.getBonusPointUpgrade());\n\n        List<CouponCode> couponCodes = couponService.getCouponCodeByUser(LocalUser.getUser().getUserId());\n        if (couponCodes != null && !couponCodes.isEmpty()) {\n            userDetail.setCouponRecord(couponCodes.size()+\"\");\n        }else {\n            userDetail.setCouponRecord(\"0\");\n        }\n        List<BonusPointRecord> bonusPointRecords = userService.getByUSerIdAndCurrentMonth(LocalUser.getUser().getUserId());\n        int currentMonthBonusPoint = 0;\n        for (BonusPointRecord bonusPointRecord : bonusPointRecords) {\n            currentMonthBonusPoint += bonusPointRecord.getTxBonusPoints();\n        }\n        userDetail.setCurrentMonthBonusPoint(currentMonthBonusPoint);\n        return userDetail;\n    }\n\n    public List<DeliveryAddr> getDeliveryAddrs() {\n        List<DeliveryAddress> addresses = userService.getAllDeliveryAddr(LocalUser.getUser().getUserId());\n\n        List<DeliveryAddr> addrs = new ArrayList<>();\n        for (DeliveryAddress address : addresses) {\n            DeliveryAddr addr = new DeliveryAddr();\n            addr.setAddrId(address.getId());\n            addr.setConsignee(address.getConsignee());\n            addr.setMobile(address.getMobile());\n            addr.setAddress(address.getAddress());\n            addr.setSex(address.getSex().getName());\n            addr.setTag(address.getTag());\n            addr.setDefault(address.getDefault());\n            addrs.add(addr);\n        }\n        return addrs;\n    }\n\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/java/com/cheng/weixin/web/mobile/service/sysMallService.java",
    "content": "package com.cheng.weixin.web.mobile.service;\n\nimport com.cheng.weixin.common.utils.StringFormat;\nimport com.cheng.weixin.rpc.cart.service.RpcCartService;\nimport com.cheng.weixin.rpc.item.entity.Picture;\nimport com.cheng.weixin.rpc.item.entity.Product;\nimport com.cheng.weixin.rpc.item.entity.ProductType;\nimport com.cheng.weixin.rpc.item.service.RpcProductService;\nimport com.cheng.weixin.web.mobile.exception.ProductException;\nimport com.cheng.weixin.web.mobile.exception.message.StatusCode;\nimport com.cheng.weixin.web.mobile.result.mall.ProductCategory;\nimport com.cheng.weixin.web.mobile.result.mall.Products;\nimport com.cheng.weixin.web.mobile.security.LocalUser;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Desc: 商城\n * Author: hp\n * Date: 2016/9/9\n */\n@Service\npublic class SysMallService {\n    @Autowired\n    private RpcProductService productService;\n    @Autowired\n    private RpcCartService cartService;\n\n    public List<ProductCategory> getProductCategory() {\n        List<ProductType> productTypes = productService.getProductType();\n\n        List<ProductCategory> categories = new ArrayList<>();\n        for (ProductType type : productTypes) {\n            ProductCategory category = new ProductCategory();\n            category.setId(type.getId());\n            category.setName(type.getName());\n            categories.add(category);\n        }\n        return categories;\n    }\n\n    // TODO 登陆后查看该商品已买了多少\n    public List<Products> getMallProduct(String cid) {\n        List<Product> products = productService.getByTypeId(cid);\n        //Mall mall = new Mall();\n        List<Products> mallProducts = new ArrayList<>();\n        for (Product product : products) {\n            Products mProduct = new Products();\n            mProduct.setId(product.getId());\n            mProduct.setName(product.getName());\n            mProduct.setPrice(StringFormat.format(product.getSalePrice()));\n            mProduct.setTag(product.getTag());\n            mProduct.setDesc(product.getUnitDesc());\n\n            Picture picture = productService.getDefaultPictureByProductId(product.getId());\n            mProduct.setPicLink(picture.getPictureUrl());\n            mProduct.setHeight(picture.getHeight());\n            mProduct.setWidth(picture.getWidth());\n            mallProducts.add(mProduct);\n        }\n        //mall.setProducts(mallProducts);\n        //mall.setTotalPrice(StringFormat.format(totalPrice(LocalUser.getUser().getUserId())));\n        return mallProducts;\n    }\n\n\n    /**\n     * 购买商品\n     * @param productId\n     * @return\n     */\n    public long addProduct(String productId) {\n        Product product = productService.getById(productId);\n        if (product.getUnitsInStock()<=0) {\n            throw new ProductException(StatusCode.PRODUCT_STOCK_SHORTAGE);\n        }\n        long count = cartService.addProductCount(LocalUser.getUser().getUserId(), productId);\n        // 金额\n        //BigDecimal totalPrice = totalPrice(\"1\");\n\n        //MallBuy buy = new MallBuy();\n        //buy.setCount(count);\n        //buy.setTotalPrice(totalPrice);\n        return count;\n    }\n    /**\n     * 减少商品\n     * @param productId\n     * @return\n     */\n    public long subProduct(String productId) {\n        long count = cartService.subProductCount(LocalUser.getUser().getUserId(), productId);\n        // 金额\n        //BigDecimal totalPrice = totalPrice(\"1\");\n        //MallBuy buy = new MallBuy();\n        //buy.setCount(count);\n        //buy.setTotalPrice(totalPrice);\n        return count;\n    }\n\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/main/resources/globalconf.properties",
    "content": "#\\u5FAE\\u4FE1\\u57FA\\u672C\\u914D\\u7F6E\nwxclient=weixin"
  },
  {
    "path": "weixin-web-mobile/src/main/resources/i18n/messages_en.properties",
    "content": "#LOGIN_FAIL=Account or password is wrong.\n#ACCOUNT_IS_NULL=Account cannot be empty.\n#PASSWORD_IS_NULL=Password cannot be empty.\n#USER_ID_IS_NULL=User ID cannot be empty.\n#USER_IS_NULL=User ID is wrong: %1$s.\n#ID_IS_NULL=ID cannot be empty.\nSTATUSCODE_200=OK\nSTATUSCODE_400=BAD REQUEST\nSTATUSCODE_401=UNAUTHORIZED\nSTATUSCODE_403=FORBIDDEN\nSTATUSCODE_404=NOT FOUND\nSTATUSCODE_408=REQUEST TIMEOUT\nSTATUSCODE_409=CONFLICT\nSTATUSCODE_410=GONE\nSTATUSCODE_423=LOCKED\nSTATUSCODE_500=INTERNAL SERVER ERROR\n\nSTATUSCODE_9100=user exception\nSTATUSCODE_9101=user not exist\nSTATUSCODE_9102=user exist\nSTATUSCODE_9103=validate error\nSTATUSCODE_9104=phone not exist\n\nSTATUSCODE_9500=product exception\nSTATUSCODE_9501=stock shortage\n\nSTATUSCODE_9600=order error\n\nSTATUSCODE_9700=coupon error\nSTATUSCODE_9701=coupon not exist\n"
  },
  {
    "path": "weixin-web-mobile/src/main/resources/i18n/messages_zh.properties",
    "content": "#\\u56FD\\u9645\\u5316\\u4FE1\\u606F\nSTATUSCODE_200=\\u8BF7\\u6C42\\u6210\\u529F\nSTATUSCODE_303=\\u767B\\u5F55\\u5931\\u8D25\nSTATUSCODE_400=\\u8BF7\\u6C42\\u53C2\\u6570\\u51FA\\u9519\nSTATUSCODE_401=\\u6CA1\\u6709\\u767B\\u5F55\nSTATUSCODE_403=\\u6CA1\\u6709\\u6743\\u9650\nSTATUSCODE_404=\\u627E\\u4E0D\\u5230\\u9875\\u9762\nSTATUSCODE_408=\\u8BF7\\u6C42\\u8D85\\u65F6\nSTATUSCODE_409=\\u53D1\\u751F\\u51B2\\u7A81\nSTATUSCODE_410=\\u5DF2\\u88AB\\u5220\\u9664\nSTATUSCODE_423=\\u5DF2\\u88AB\\u9501\\u5B9A\nSTATUSCODE_500=\\u670D\\u52A1\\u5668\\u51FA\\u9519\n\nSTATUSCODE_9100=\\u7528\\u6237\\u5F02\\u5E38\nSTATUSCODE_9101=\\u7528\\u6237\\u4E0D\\u5B58\\u5728\nSTATUSCODE_9102=\\u7528\\u6237\\u5B58\\u5728\nSTATUSCODE_9103=\\u9A8C\\u8BC1\\u7801\\u9519\\u8BEF\nSTATUSCODE_9104=\\u624B\\u673A\\u53F7\\u4E0D\\u5B58\\u5728\n\nSTATUSCODE_9500=\\u5546\\u54C1\\u64CD\\u4F5C\\u5F02\\u5E38\nSTATUSCODE_9501=\\u5E93\\u5B58\\u4E0D\\u8DB3\n\nSTATUSCODE_9600=\\u8BA2\\u5355\\u5F02\\u5E38\n\nSTATUSCODE_9700=\\u4F18\\u60E0\\u5238\\u5F02\\u5E38\nSTATUSCODE_9701=\\u4F18\\u60E0\\u5238\\u4E0D\\u6B63\\u786E"
  },
  {
    "path": "weixin-web-mobile/src/main/resources/log4j.properties",
    "content": "#log4j.rootLogger=DEBUG,CONSOLE\nlog4j.rootLogger=DEBUG,FILE\nlog4j.appender.Threshold=ERROR\n\n#log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender\n#log4j.appender.CONSOLE.Encoding=UTF-8\n#log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout\n#log4j.appender.CONSOLE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [web-mobile] %p [%t] %c-<%L> %m%n\n\nlog4j.appender.FILE=org.apache.log4j.RollingFileAppender\nlog4j.appender.FILE.Encoding=UTF-8\nlog4j.appender.FILE.File=logs/web-mobile.log\nlog4j.appender.FILE.MaxFileSize=4000KB\nlog4j.appender.FILE.MaxBackupIndex=10\nlog4j.appender.FILE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [web-mobile] %p [%t] %c-<%L> %m%n\n\n\nlog4j.logger.com.alibaba.dubbo.remoting.transport.DecodeHandler=ERROR\nlog4j.logger.com.alibaba.dubbo.remoting.exchange.support.header.HeartBeatTask=ERROR\nlog4j.logger.com.alibaba.dubbo.remoting.exchange.support.header.HeartbeatHandler=ERROR\nlog4j.logger.org.apache.zookeeper.ClientCnxn=ERROR"
  },
  {
    "path": "weixin-web-mobile/src/main/resources/rebel.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<application xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://www.zeroturnaround.com\" xsi:schemaLocation=\"http://www.zeroturnaround.com http://www.zeroturnaround.com/alderaan/rebel-2_0.xsd\">\n\n\t<classpath>\n\t\t<dir name=\"D:/Works/idea/Weixin0.1/weixin-msg/target/classes\">\n\t\t</dir>\n\t</classpath>\n\n\t<web>\n\t\t<link target=\"/\">\n\t\t\t<dir name=\"D:/Works/idea/Weixin0.1/weixin-msg/src/main/webapp\">\n\t\t\t</dir>\n\t\t</link>\n\t</web>\n\n</application>\n"
  },
  {
    "path": "weixin-web-mobile/src/main/resources/spring/applicationContext.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\t\t\t xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t\t xmlns:context=\"http://www.springframework.org/schema/context\"\n\t\t\t xmlns:aop=\"http://www.springframework.org/schema/aop\"\n\t\t\t xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n       http://www.springframework.org/schema/beans/spring-beans.xsd\n       http://www.springframework.org/schema/context\n       http://www.springframework.org/schema/context/spring-context.xsd\n       http://www.springframework.org/schema/aop\n        http://www.springframework.org/schema/aop/spring-aop.xsd\">\n\n\t<!-- 打开Spring的Annotation支持 -->\n\t<context:annotation-config />\n\n\t<!-- 扫描注入  -->\n\t<context:component-scan base-package=\"com.cheng.weixin.web.mobile\" use-default-filters=\"false\">\n\t\t<context:include-filter type=\"annotation\" expression=\"org.springframework.stereotype.Service\"/>\n\t</context:component-scan>\n\n\t<context:property-placeholder ignore-unresolvable=\"true\" location=\"classpath:globalconf.properties,classpath:system.properties\"/>\n\n\t<!-- Token 认证管理器 交由redis管理token -->\n\t<bean id=\"tokenManager\" class=\"com.cheng.weixin.web.mobile.security.impl.RedisTokenManager\">\n\t\t<property name=\"seconds\" value=\"3600\"/>\n\t</bean>\n\n\t<import resource=\"classpath:spring/spring-dubbo-consumer.xml\"/>\n</beans>"
  },
  {
    "path": "weixin-web-mobile/src/main/resources/spring/spring-dubbo-consumer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd\n          http://code.alibabatech.com/schema/dubbo\n          http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n  <dubbo:application name=\"weixin-web-mobile\"/>\n  <dubbo:registry id=\"zk1\" address=\"${weixin.dubbo.reistry.address}\" protocol=\"${weixin.dubbo.reistry.protocol}\"/>\n  <dubbo:consumer registry=\"zk1\"/>\n\n  <dubbo:reference id=\"redisService\" interface=\"com.cheng.weixin.rpc.redis.service.RpcRedisService\"\n                   check=\"false\" timeout=\"5000\" version=\"1.0\"/>\n  <dubbo:reference id=\"productService\" interface=\"com.cheng.weixin.rpc.item.service.RpcProductService\"\n                   check=\"false\" timeout=\"5000\" version=\"1.0\"/>\n  <dubbo:reference id=\"cartService\" interface=\"com.cheng.weixin.rpc.cart.service.RpcCartService\"\n                   check=\"false\" timeout=\"5000\" version=\"1.0\"/>\n  <dubbo:reference id=\"systemService\" interface=\"com.cheng.weixin.rpc.system.service.RpcSystemService\"\n                   check=\"false\" timeout=\"5000\" version=\"1.0\"/>\n  <dubbo:reference id=\"smsService\" interface=\"com.cheng.weixin.rpc.message.service.RpcSmsService\"\n                   check=\"false\" timeout=\"5000\" version=\"1.0\"/>\n  <dubbo:reference id=\"rabbitLogService\" interface=\"com.cheng.weixin.rpc.rabbitmq.service.RpcRabbitLogService\"\n                   check=\"false\" timeout=\"5000\" version=\"1.0\"/>\n  <dubbo:reference id=\"rabbitSmsService\" interface=\"com.cheng.weixin.rpc.rabbitmq.service.RpcRabbitSmsService\"\n                   check=\"false\" timeout=\"5000\" version=\"1.0\"/>\n  <dubbo:reference id=\"userService\" interface=\"com.cheng.weixin.rpc.user.service.RpcUserService\"\n                   check=\"false\" timeout=\"5000\" version=\"1.0\"/>\n  <dubbo:reference id=\"orderService\" interface=\"com.cheng.weixin.rpc.order.service.RpcOrderService\"\n                   check=\"false\" timeout=\"5000\" version=\"1.0\"/>\n  <dubbo:reference id=\"commentService\" interface=\"com.cheng.weixin.rpc.comment.service.RpcCommentService\"\n                   check=\"false\" timeout=\"5000\" version=\"1.0\"/>\n  <dubbo:reference id=\"promotionService\" interface=\"com.cheng.weixin.rpc.promotion.service.RpcCouponService\"\n                   check=\"false\" timeout=\"5000\" version=\"1.0\"/>\n</beans>\n"
  },
  {
    "path": "weixin-web-mobile/src/main/resources/spring/spring-mvc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xmlns:context=\"http://www.springframework.org/schema/context\"\n       xmlns:mvc=\"http://www.springframework.org/schema/mvc\"\n       xmlns:aop=\"http://www.springframework.org/schema/aop\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n        http://www.springframework.org/schema/beans/spring-beans.xsd\n        http://www.springframework.org/schema/context\n        http://www.springframework.org/schema/context/spring-context.xsd\n        http://www.springframework.org/schema/mvc\n        http://www.springframework.org/schema/mvc/spring-mvc.xsd\n        http://www.springframework.org/schema/aop\n        http://www.springframework.org/schema/aop/spring-aop.xsd\">\n\n  <!--<mvc:annotation-driven />-->\n\n  <!-- 对静态资源文件的访问， 将无法mapping到Controller的path交给default servlet handler处理 -->\n  <mvc:default-servlet-handler />\n\t<!-- 支持注解 -->\n\t<mvc:resources mapping=\"/resources/**\" location=\"/static/\" cache-period=\"31536000\"/>\n\n\t<!-- 扫描controller（controller层注入） -->\n\t<context:component-scan base-package=\"com.cheng.weixin.web.mobile\" use-default-filters=\"false\">\n      <context:include-filter type=\"annotation\" expression=\"org.springframework.stereotype.Controller\"/>\n      <context:include-filter type=\"annotation\" expression=\"org.springframework.web.bind.annotation.ControllerAdvice\"/>\n\t</context:component-scan>\n\n  <!-- JSON 日期格式转换 -->\n  <bean id=\"objectMapper\" class=\"com.cheng.weixin.web.mobile.json.CustomObjectMapper\" init-method=\"init\">\n    <property name=\"camelCaseToLowerCaseWithUnderscores\" value=\"false\"/>\n    <property name=\"dateFormatPattern\" value=\"yyyy-MM-dd HH:mm:ss\"/>\n  </bean>\n  <!-- JSONP 的支持 -->\n  <mvc:annotation-driven>\n    <mvc:message-converters register-defaults=\"false\">\n      <bean class=\"org.springframework.http.converter.StringHttpMessageConverter\">\n        <constructor-arg index=\"0\" value=\"UTF-8\"/>\n      </bean>\n      <bean class=\"com.cheng.weixin.web.mobile.json.JsonpHttpMessageConverter\">\n        <property name=\"objectMapper\" ref=\"objectMapper\"/>\n        <property name=\"supportedMediaTypes\">\n          <list>\n            <value>application/json;charset=UTF-8</value>\n            <value>application/javascript;charset=UTF-8</value>\n            <value>text/html;charset=UTF-8</value>\n          </list>\n        </property>\n        <property name=\"callbackName\" value=\"callback\"/>\n      </bean>\n    </mvc:message-converters>\n  </mvc:annotation-driven>\n\n  <!-- 对模型视图添加前后缀 -->\n\t<bean id=\"viewResolver\" class=\"org.springframework.web.servlet.view.InternalResourceViewResolver\">\n    <property name=\"order\" value=\"2\"/>\n\t  <property name=\"viewClass\" value=\"org.springframework.web.servlet.view.JstlView\"/>\n\t  <property name=\"prefix\" value=\"/WEB-INF/views/\"/>\n\t  <property name=\"suffix\" value=\".jsp\"/>\n\t</bean>\n\n  <mvc:interceptors>\n    <!-- 日志拦截管理器 -->\n    <mvc:interceptor>\n      <mvc:mapping path=\"/**\" />\n      <mvc:exclude-mapping path=\"/v1/login\"/>\n      <mvc:exclude-mapping path=\"/static/**\"/>\n      <bean class=\"com.cheng.weixin.web.mobile.interceptor.LogInterceptor\" />\n    </mvc:interceptor>\n    <!-- 恶意请求拦截器 -->\n    <!--<mvc:interceptor>\n      <mvc:mapping path=\"/**\" />\n      <mvc:exclude-mapping path=\"/static/**\"/>\n      <bean class=\"com.cheng.weixin.web.mobile.interceptor.MaliciousRequestInterceptor\">\n        <property name=\"appKeyName\" value=\"appKey\"/>\n        <property name=\"tokenName\" value=\"token\"/>\n        <property name=\"timestampName\" value=\"timestamp\"/>\n        <property name=\"signName\" value=\"sign\"/>\n        <property name=\"paramName\" value=\"param\"/>\n        <property name=\"minRequestIntervalTime\" value=\"300000\"/>\n      </bean>\n    </mvc:interceptor>-->\n  </mvc:interceptors>\n\n\n  <!-- Token 认证管理器 交由redis管理token -->\n  <bean id=\"tokenManager\" class=\"com.cheng.weixin.web.mobile.security.impl.RedisTokenManager\">\n    <property name=\"seconds\" value=\"3600\"/>\n  </bean>\n  <!-- Token 认证拦截器 -->\n  <bean id=\"securityAspect\" class=\"com.cheng.weixin.web.mobile.security.SecurityAspect\">\n    <property name=\"tokenManager\" ref=\"tokenManager\"/>\n    <property name=\"tokenName\" value=\"token\"/>\n  </bean>\n  <!-- Token 拦截器 -->\n  <aop:config>\n    <aop:aspect ref=\"securityAspect\">\n      <aop:around method=\"execute\" pointcut=\"@annotation(org.springframework.web.bind.annotation.RequestMapping)\"/>\n    </aop:aspect>\n  </aop:config>\n\n</beans>\n\n"
  },
  {
    "path": "weixin-web-mobile/src/main/webapp/WEB-INF/views/index.jsp",
    "content": "<html>\n<body>\n<h2 style=\"color: red\">Test=====</h2>\n</body>\n</html>\n"
  },
  {
    "path": "weixin-web-mobile/src/main/webapp/WEB-INF/web.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<web-app xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \n\txmlns=\"http://java.sun.com/xml/ns/javaee\" \n\txsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee \n\t\thttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\" version=\"3.0\">\n  <description>weixin</description>\n  <context-param>\n    <param-name>contextConfigLocation</param-name>\n    <param-value>classpath:/spring/applicationContext.xml</param-value>\n  </context-param>\n  <filter>\n    <filter-name>SpringEncodingFilter</filter-name>\n    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>\n    <init-param>\n      <param-name>encoding</param-name>\n      <param-value>UTF-8</param-value>\n    </init-param>\n    <init-param>\n      <param-name>forceEncoding</param-name>\n      <param-value>true</param-value>\n    </init-param>\n  </filter>\n  <filter-mapping>\n    <filter-name>SpringEncodingFilter</filter-name>\n    <url-pattern>/*</url-pattern>\n  </filter-mapping>\n  <listener>\n    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>\n  </listener>\n  <servlet>\n    <servlet-name>dispatcher</servlet-name>\n    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>\n    <init-param>\n      <param-name>contextConfigLocation</param-name>\n      <param-value>classpath:/spring/spring-mvc.xml</param-value>\n    </init-param>\n    <load-on-startup>1</load-on-startup>\n  </servlet>\n  <servlet-mapping>\n    <servlet-name>dispatcher</servlet-name>\n    <url-pattern>/</url-pattern>\n  </servlet-mapping>\n  \n  <welcome-file-list>\n    <welcome-file>index.jsp</welcome-file>\n  </welcome-file-list>\n</web-app>"
  },
  {
    "path": "weixin-web-mobile/src/main/webapp/index.jsp",
    "content": "<html>\n<body>\n<h2>Hello World!</h2>\n\n<script>\n\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "weixin-web-mobile/src/test/java/com/cheng/dubbo/consumer/test/ConsumerTest.java",
    "content": "package com.cheng.dubbo.consumer.test;\n\nimport com.alibaba.fastjson.JSON;\nimport com.cheng.weixin.common.constant.Constant;\nimport com.cheng.weixin.common.utils.JSONUtils;\nimport com.cheng.weixin.rabbitmq.model.SmsModel;\nimport com.cheng.weixin.rpc.cart.entity.CartInfo;\nimport com.cheng.weixin.rpc.cart.entity.ShoppingCart;\nimport com.cheng.weixin.rpc.cart.service.RpcCartService;\nimport com.cheng.weixin.rpc.comment.entity.Comment;\nimport com.cheng.weixin.rpc.comment.service.RpcCommentService;\nimport com.cheng.weixin.rpc.item.entity.Picture;\nimport com.cheng.weixin.rpc.item.entity.Product;\nimport com.cheng.weixin.rpc.item.service.RpcProductService;\nimport com.cheng.weixin.rpc.message.service.RpcSmsService;\nimport com.cheng.weixin.rpc.order.entity.DeliveryTime;\nimport com.cheng.weixin.rpc.order.service.RpcOrderService;\nimport com.cheng.weixin.rpc.rabbitmq.service.RpcRabbitSmsService;\nimport com.cheng.weixin.rpc.redis.service.RpcRedisService;\nimport com.cheng.weixin.rpc.system.entity.Ad;\nimport com.cheng.weixin.rpc.system.entity.Notice;\nimport com.cheng.weixin.rpc.system.service.RpcSystemService;\nimport com.cheng.weixin.rpc.user.service.RpcUserService;\nimport com.cheng.weixin.web.mobile.result.cart.ShoppingCartInfo;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.test.context.ContextConfiguration;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\n\nimport java.io.Serializable;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\n\n/**\n * Desc: 消费者\n * Author: Cheng\n * Date: 2016/2/19 0019\n */\n@RunWith(SpringJUnit4ClassRunner.class)\n@ContextConfiguration(locations = { \"classpath*:spring-dubbo-consumer.xml\",\n        \"classpath*:applicationContext.xml\"})\npublic class ConsumerTest {\n    @Autowired\n    private RpcRedisService redisService;\n    @Autowired\n    private RpcCartService cartService;\n    @Autowired\n    private RpcProductService productService;\n    @Autowired\n    private RpcSystemService systemService;\n    @Autowired\n    private RpcUserService userService;\n    @Autowired\n    private RpcSmsService smsService;\n    @Autowired\n    private RpcRabbitSmsService rabbitSmsService;\n    @Autowired\n    private RpcCommentService commentService;\n    @Autowired\n    private RpcOrderService orderService;\n\n    @Test\n    public void testRedis() {\n        System.out.println(redisService.set(\"122\",\"18600536683\"));\n        //String data = (String) redisService.get(\"122\");\n        boolean result = redisService.exists(\"122\");\n        System.out.println(\"=======> \"+result);\n    }\n\n    @Test\n    public void testRedis2() {\n        Set<String> allProductIds = redisService.getFields(\"CART_1\");\n        Set<String> productIds = new HashSet<>();\n        for (String productId : allProductIds) {\n            if (productId.startsWith(Constant.CHOOSE)) {\n                productIds.add(productId.replace(Constant.CHOOSE, \"\"));\n            }\n        }\n    }\n    @Test\n    public void testRedis3() {\n        Map<Serializable, Object> allProduct = redisService.getEntries(\"CART_1\");\n        Set<Serializable> fields = allProduct.keySet();\n        for (Serializable itemName : fields) {\n            String value = allProduct.get(itemName).toString();\n            System.out.println(\"===> \" + itemName + \" : \" + value);\n        }\n    }\n\n    @Test\n    public void testAddCart() {\n        long count = cartService.addProductCount(\"1\",\"1\");\n        System.out.println(\"=========> \"+count);\n\n        Set<String> productIds = cartService.getChooseProductIds(\"1\");\n        for (String productId : productIds) {\n            System.out.println(\"=======> \"+productId);\n        }\n    }\n\n    @Test\n    public void testGetCart() {\n        ShoppingCart cartInfo = cartService.getShoppingCart(\"1\");\n        System.out.println(\"=========> \"+JSON.toJSONString(cartInfo));\n    }\n\n    @Test\n    public void testProduct() {\n        Product product = productService.getById(\"1\");\n        System.out.println(\"============> \"+ product);\n    }\n\n    @Test\n    public void testSys() {\n        List<Ad> ads = systemService.getIndexAds();\n        for (Ad ad : ads) {\n            System.out.println(\"=========> \"+ad);\n        }\n        List<Notice> notices = systemService.getIndexNotices();\n        for (Notice notice : notices) {\n            System.out.println(\"=========> \"+notice);\n        }\n    }\n\n    @Test\n    public void testSaveAccess() {\n        userService.saveAccess(\"18600536683\",\"123456\",\"Cheng\",\"127.0.0.1\");\n    }\n\n    @Test\n    public void testLogin() {\n        String data = userService.validateLogin(\"18600536683\", \"123456\", \"127.0.0.1\");\n        System.out.println(\"=====> \"+ data);\n    }\n\n    @Test\n    public void testSms() {\n        int countByDay = smsService.getCountByDay(\"18600536683\");\n        System.out.println(\"=========>\" + countByDay);\n    }\n\n    @Test\n    public void testRabbitSms() {\n        SmsModel smsModel = new SmsModel();\n        smsModel.setUserIp(\"127.0.0.2\");\n        smsModel.setPhone(\"18600536683\");\n        rabbitSmsService.sendValidate(smsModel);\n    }\n\n    @Test\n    public void testComment() {\n        List<Comment> comments = commentService.getByProductId(\"1\");\n        System.out.println(\"=========>\" + comments);\n    }\n\n    /*@Test\n    public void testOrder() {\n        List<DeliveryTime> times = orderService.getAllDeliveryTime();\n        System.out.println(\"=========>\" + times);\n    }*/\n    @Test\n    public void testShowPic() {\n        List<Picture> pictures = productService.getShowPictureByProductId(\"1\");\n        System.out.println(\"=========>\" + pictures);\n    }\n\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/test/java/com/cheng/dubbo/consumer/test/ServiceTest.java",
    "content": "package com.cheng.dubbo.consumer.test;\n\nimport com.alibaba.fastjson.JSON;\nimport com.cheng.weixin.web.mobile.result.cart.ProductCartInfo;\nimport com.cheng.weixin.web.mobile.result.index.Index;\nimport com.cheng.weixin.web.mobile.service.*;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.test.context.ContextConfiguration;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\n\nimport java.lang.reflect.InvocationTargetException;\n\n/**\n * Desc:\n * Author: hp\n * Date: 2016/10/10\n */\n@RunWith(SpringJUnit4ClassRunner.class)\n@ContextConfiguration(locations = { \"classpath*:spring-dubbo-consumer.xml\",\n        \"classpath*:applicationContext.xml\"})\npublic class ServiceTest {\n    @Autowired\n    private SysIndexService indexService;\n    @Autowired\n    private SysOrderService orderService;\n    @Autowired\n    private SysProductService productService;\n    @Autowired\n    private SysUserService userService;\n    @Autowired\n    private SysMallService mallService;\n    @Autowired\n    private SysCartService cartService;\n\n    // ===========================ORDER============================== //\n    @Test\n    public void test01() {\n        Index index = indexService.getIndexInfo();\n        System.out.println(JSON.toJSONString(index));\n    }\n\n    //@Test\n    //public void test02() {\n    //    SubmitOrderInfo info = orderService.payment();\n    //    System.out.println(JSON.toJSONString(info));\n    //}\n    //@Test\n    //public void test03() {\n    //    orderService.submitOrder();\n    //}\n    @Test\n    public void test04() throws InvocationTargetException, IllegalAccessException {\n        System.out.println(orderService.getOrders(1, 10));\n    }\n    @Test\n    public void test05() {\n        System.out.println(orderService.getOrderDetail());\n    }\n\n    // ===========================PRODUCT============================== //\n    @Test\n    public void test06() {\n        System.out.println(productService.getDetail(\"1\"));\n    }\n    @Test\n    public void test07() {\n        productService.buyProduct(\"1\", 2L);\n    }\n    @Test\n    public void test08() {\n        System.out.println(productService.focus(\"1\"));\n    }\n\n    // ==========================USER=============================== //\n    @Test\n    public void test09() {\n        System.out.println(userService.getUserDetail());\n    }\n\n    @Test\n    public void test091() {\n        System.out.println(userService.getDeliveryAddrs());\n    }\n\n    // ==========================MALL=============================== //\n    @Test\n    public void test10() {\n        System.out.println(mallService.getProductCategory());\n    }\n    @Test\n    public void test11() {\n        System.out.println(mallService.getMallProduct(\"1\"));\n    }\n\n    // ==========================CART=============================== //\n   /* @Test\n    public void test12() {\n        System.out.println(cartService.getShoppingCart());\n    }*/\n    @Test\n    public void test13() {\n        System.out.println(cartService.addProduct(\"1\"));\n    }\n    @Test\n    public void test14() {\n        System.out.println(cartService.subProduct(\"1\"));\n    }\n    @Test\n    public void test15() {\n        System.out.println(cartService.deleteProduct(\"1\"));\n    }\n    @Test\n    public void test16() {\n        cartService.changeStatus(\"1\");\n    }\n\n    @Test\n    public void test17() {\n        cartService.chooseAllProduct();\n    }\n\n    @Test\n    public void test18() {\n        cartService.unChooseAllProduct();\n    }\n    @Test\n    public void test19() {\n        ProductCartInfo productCartInfo = cartService.changeStatus(\"1\");\n        System.out.println(productCartInfo);\n    }\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/test/java/com/cheng/dubbo/consumer/test/TestAll.java",
    "content": "package com.cheng.dubbo.consumer.test;\n\nimport com.cheng.weixin.common.security.Digests;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport org.junit.Test;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.UnsupportedEncodingException;\nimport java.math.BigDecimal;\nimport java.util.List;\n\n/**\n * Desc:\n * Author: cheng\n * Date: 2016/6/24\n */\npublic class TestAll {\n\n    @org.junit.Test\n    public void test01() {\n        int[] ids = {1,2,3};\n        for (int i=0; i<ids.length;i++) {\n            System.out.println(ids[i]);\n        }\n        for (int i=0; i<ids.length;i++) {\n            System.out.println(ids[i]);\n        }\n    }\n\n    @Test\n    public void test02() {\n        System.out.println(System.currentTimeMillis());\n    }\n\n    @Test\n    public void test03() throws UnsupportedEncodingException {\n        long time = System.currentTimeMillis();\n        System.out.println(time);\n        String param = \"wxclient\"+time+\"122\";\n        //String param = \"wxclient\" + time;\n\n        System.out.println(Digests.md5(param));\n    }\n\n    @Test\n    public void test04() throws UnsupportedEncodingException {\n        String param = \"1228358c427e15ec4244c86111dceee696a\";\n        System.out.println(Digests.md5(param));\n    }\n\n    @Test\n    public void test05() {\n        String usrHome = System.getProperty(\"user.home\");\n\n        File file = new File(usrHome+\"\\\\test\");\n        file.mkdir();\n\n        System.out.println(usrHome);\n    }\n\n    @Test\n    public void test06() throws IOException {\n        //CustomObjectMapper mapper = new CustomObjectMapper();\n        ObjectMapper mapper = new ObjectMapper();\n\n        String str = \"[{\\\"productId\\\":1,\\\"count\\\":10},{\\\"productId\\\":2,\\\"count\\\":5}]\";\n\n        List<Object> myObjects = mapper.readValue(str, mapper.getTypeFactory().constructCollectionType(List.class, Object.class));\n\n        System.out.println(myObjects);\n\n    }\n\n\n    public static void main(String[] args) {\n        BigDecimal afterBonusPoints = BigDecimal.valueOf(403.3);\n        System.out.println(afterBonusPoints.compareTo(BigDecimal.valueOf(-1L)));\n        if (afterBonusPoints.compareTo(BigDecimal.valueOf(-1L)) == -1) {\n            System.out.println(\"=======\");\n        }\n    }\n\n}\n"
  },
  {
    "path": "weixin-web-mobile/src/test/java/com/cheng/dubbo/consumer/test/TestDemo.java",
    "content": "package com.cheng.dubbo.consumer.test;\n\nimport java.util.Date;\n\n/**\n * Desc:\n * Author: 光灿\n * Date: 2017/1/29\n */\npublic class TestDemo {\n\n    public static void main(String[] args) {\n        System.out.println(System.currentTimeMillis());\n        Date date = new Date(1485619200000L);\n        System.out.println(date);\n    }\n}\n\n\n"
  },
  {
    "path": "weixin-web-mobile/src/test/resources/applicationContext.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd\n    http://www.springframework.org/schema/context\n    http://www.springframework.org/schema/context/spring-context-3.2.xsd\">\n\n\t<!-- 打开Spring的Annotation支持 -->\n\t<context:annotation-config />\n\n\t<!-- 扫描注入  -->\n\t<context:component-scan base-package=\"com.cheng.dubbo.consumer.test\"/>\n\t<context:component-scan base-package=\"com.cheng.weixin.web.mobile.service\"/>\n</beans>"
  },
  {
    "path": "weixin-web-mobile/src/test/resources/log4j.properties",
    "content": "log4j.rootLogger=DEBUG,CONSOLE\nlog4j.appender.Threshold=ERROR\n\nlog4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender\nlog4j.appender.CONSOLE.Encoding=UTF-8\nlog4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout\nlog4j.appender.CONSOLE.layout.ConversionPattern=[CONSUMER] %p [%t] %c-<%L> %m%n\n\n#log4j.logger.org.apache.zookeeper.ClientCnxn=ERROR"
  },
  {
    "path": "weixin-web-mobile/src/test/resources/spring-dubbo-consumer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd\n          http://code.alibabatech.com/schema/dubbo\n          http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n  <dubbo:application name=\"cheng-dubbo-consumer\"/>\n  <dubbo:registry id=\"zk1\" address=\"120.27.53.171:2181\" protocol=\"zookeeper\"/> <!-- 注意要关闭防火墙 -->\n  <dubbo:consumer registry=\"zk1\"/>\n\n  <dubbo:reference id=\"redisService\" interface=\"com.cheng.weixin.rpc.redis.service.RpcRedisService\" timeout=\"5000\" version=\"1.0\"/>\n  <dubbo:reference id=\"cartService\" interface=\"com.cheng.weixin.rpc.cart.service.RpcCartService\" timeout=\"5000\" version=\"1.0\"/>\n  <dubbo:reference id=\"productService\" interface=\"com.cheng.weixin.rpc.item.service.RpcProductService\" timeout=\"5000\" version=\"1.0\"/>\n  <dubbo:reference id=\"systemService\" interface=\"com.cheng.weixin.rpc.system.service.RpcSystemService\" timeout=\"5000\" version=\"1.0\"/>\n  <dubbo:reference id=\"smsService\" interface=\"com.cheng.weixin.rpc.message.service.RpcSmsService\" timeout=\"5000\" version=\"1.0\"/>\n  <dubbo:reference id=\"rabbitSmsService\" interface=\"com.cheng.weixin.rpc.rabbitmq.service.RpcRabbitSmsService\" timeout=\"5000\" version=\"1.0\"/>\n  <dubbo:reference id=\"userService\" interface=\"com.cheng.weixin.rpc.user.service.RpcUserService\" timeout=\"5000\" version=\"1.0\"/>\n  <dubbo:reference id=\"commentService\" interface=\"com.cheng.weixin.rpc.comment.service.RpcCommentService\" timeout=\"5000\" version=\"1.0\"/>\n  <dubbo:reference id=\"orderService\" interface=\"com.cheng.weixin.rpc.order.service.RpcOrderService\" timeout=\"5000\" version=\"1.0\"/>\n</beans>\n"
  }
]